/*
    ####             #    #     # #
    #   #            #    #       #          The FreeWare C library for 
    #   #  ##   ###  #  # #     # ###             RISC OS machines
    #   # #  # #     # #  #     # #  #   ___________________________________
    #   # ####  ###  ##   #     # #  #                                      
    #   # #        # # #  #     # #  #    Please refer to the accompanying
    ####   ### ####  #  # ##### # ###    documentation for conditions of use
    ________________________________________________________________________

    File:    KernelSWIs.h
    Author:  Copyright  1993, 1994 Jason Howat
                         1995       Sergio Monesi, Julian Smith
    Version: 1.03 (02 Sep 1995)
    Purpose: General low level SWI veneers.
    Mods:    07 Jun 1995 Sergio Monesi: Added Desk_OS_SWINumberTo/FromString
             13 Jul 1995 Sergio Monesi: Added Desk_OS_GSTrans
             02 Sep 1995 JH Added Desk_osbyte_WRITEVDUDRIVERBANK and 
                            Desk_osbyte_WRITEDISPLAYHARDWAREBANK.
             13 Sep 1995 JS Added Desk_OS_ReadVarVal_GetLength and
                            Desk_OS_ReadVarVal_ReadIntoBuffer,
                            Desk_OS_ReadVarVal_AutoAlloc.
             18 Jun 1996 JS Added Desk_OS_Byte_ReadCMOS,
                            Desk_OS_Byte_WriteCMOS and 
                            Desk_OS_Byte_WriteCMOSMask.
*/

#ifndef __Desk_KernelSWIs_h
#define __Desk_KernelSWIs_h

#ifdef __cplusplus
	extern "C" {
#endif


#ifndef __Desk_Core_h
#include "Desk.Core.h"
#endif


/* Desk_OS_Byte and Desk_OS_Word -----------------------------------------------------
 *
 */
typedef enum
{
  Desk_osbyte_DISPLAYOSVERSION = 0,
  Desk_osbyte_SPECIFYINPUT = 2,
  Desk_osbyte_SPECIFYOUTPUT,
  Desk_osbyte_CURSORKEYSTATUS,
  Desk_osbyte_WRITEPRINTERDRIVERTYPE,
  Desk_osbyte_WRITEPRINTERIGNORECHAR,
  Desk_osbyte_WRITERS423RXRATE,
  Desk_osbyte_WRITERS423TXRATE,
  Desk_osbyte_WRITEDURATION1STFLASHCOLOUR,
  Desk_osbyte_WRITEDURATION2NDFLASHCOLOUR,
  Desk_osbyte_WRITEKEYREPEATDELAY,
  Desk_osbyte_WRITEKEYREPEATRATE,
  Desk_osbyte_DISABLEEVENT,
  Desk_osbyte_ENABLEEVENT,
  Desk_osbyte_FLUSHBUFFER,
  Desk_osbyte_RESETFUNCTIONKEYS = 18,
  Desk_osbyte_WAITFORVSYNC,
  Desk_osbyte_RESETFONTDEFINITIONS,
  Desk_osbyte_FLUSHSELECTEDBUFFER,
  Desk_osbyte_RESETGROUPOFFONTDEFINITIONS = 25,
  Desk_osbyte_RW_COUNTRYNUMBER = 70,
  Desk_osbyte_RW_ALPHABET = 71,
  Desk_osbyte_RW_KEYBOARD = 71,
  Desk_osbyte_SELECTPOINTER = 106,
  Desk_osbyte_ACTIVATEMOUSE = 106,
  Desk_osbyte_WRITEVDUDRIVERBANK = 112,
  Desk_osbyte_WRITEDISPLAYHARDWAREBANK,
  Desk_osbyte_WRITESHADOWSTATE,
  Desk_osbyte_READVDUSTATUS = 117,
  Desk_osbyte_REFLECTKEYBOARDSTATUSINLEDS,
  Desk_osbyte_KEYBOARDSCAN = 121,
  Desk_osbyte_KEYBOARDSCANNOSHIFT,
  Desk_osbyte_CLEARESCAPECONDITION = 124,
  Desk_osbyte_SETESCAPECONDITION,
  Desk_osbyte_ACKNOWLEDGEESCAPECONDITION,
  Desk_osbyte_CHECKFOREOF,
  Desk_osbyte_GETBUFFERORMOUSESTATUS,
  Desk_osbyte_SCANFORKEY = 129,
  Desk_osbyte_READOSIDENTIFIER = 129,
  Desk_osbyte_READTEXTCURSORPOSITION = 134,
  Desk_osbyte_READCHARACTERATTEXTCURSOR = 135,
  Desk_osbyte_READSCREENMODE = 135,
  Desk_osbyte_INSERTCHARACTERCODEINTOBUFFER = 138,
  Desk_osbyte_WRITEFSOPTIONS,
  Desk_osbyte_ISSUEMODULESERVICECALL = 143,
  Desk_osbyte_SETTVCHARACTERISTICS,
  Desk_osbyte_GETCHARACTERFROMBUFFER,
  Desk_osbyte_EXAMINEBUFFERSTATUS = 152,
  Desk_osbyte_INSERTCHARACTERINTOBUFFER,
  Desk_osbyte_RW_ASYNCCOMMSSTATE = 156,
  Desk_osbyte_READVDUVARIABLE = 160,
  Desk_osbyte_READCMOSRAM,
  Desk_osbyte_WRITECMOSRAM,
  Desk_osbyte_RW_GENERALGRAPHICSINFO,
  Desk_osbyte_READOUTPUTCURSORPOSITION = 165,
  Desk_osbyte_RW_50HZCOUNTER = 176,
  Desk_osbyte_READINPUTSOURCE,
  Desk_osbyte_RW_RS423INPUTINTERPTRETATION = 181,
  Desk_osbyte_RW_NOIGNORESTATE,
  Desk_osbyte_RW_RS423BUSYFLAG = 191,
  Desk_osbyte_READRS423CONTROLBYTE,
  Desk_osbyte_RW_FLASHCOUNTER,
  Desk_osbyte_READDURATION2NDFLASHCOLOUR,
  Desk_osbyte_READDURATION1STFLASHCOLOUR,
  Desk_osbyte_RW_KEYREPEATDELAY,
  Desk_osbyte_RW_KEYREPEATRATE,
  Desk_osbyte_RW_EXECFILEHANDLE,
  Desk_osbyte_RW_SPOOLFILEHANDLE,
  Desk_osbyte_RW_BREAKESCAPEEFFECT,
  Desk_osbyte_RW_KEYBOARDDISABLEFLAG,
  Desk_osbyte_RW_KEYBOARDSTATUSBYTE,
  Desk_osbyte_RW_RS423INPUTBUFFERMINSPACE,
  Desk_osbyte_RW_RS423IGNOREFLAG,
  Desk_osbyte_RW_BELLCHANNEL = 211,
  Desk_osbyte_RW_BELLVOLUME,
  Desk_osbyte_RW_BELLFREQUENCY,
  Desk_osbyte_RW_BELLDURATION,
  Desk_osbyte_RW_FUNCTIONKEYSTRINGLENGTH = 216,
  Desk_osbyte_RW_PAGEDMODELINECOUNT,
  Desk_osbyte_RW_BYTESINVDUQUEUE,
  Desk_osbyte_RW_TABKEYCODE,
  Desk_osbyte_RW_ESCAPECHARACTER,
  Desk_osbyte_RW_INTERPRETATIONOFBUFFERCODES_C0_CF,
  Desk_osbyte_RW_INTERPRETATIONOFBUFFERCODES_D0_DF,
  Desk_osbyte_RW_INTERPRETATIONOFBUFFERCODES_E0_EF,
  Desk_osbyte_RW_INTERPRETATIONOFBUFFERCODES_F0_FF,
  Desk_osbyte_RW_FUNCTIONKEYINTERPRETATION,
  Desk_osbyte_RW_SHIFTFUNCTIONKEYINTERPRETATION,
  Desk_osbyte_RW_CTRLFUNCTIONKEYINTERPRETATION,
  Desk_osbyte_RW_CTRLSHIFTFUNCTIONKEYINTERPRETATION,
  Desk_osbyte_RW_ESCAPEKEYSTATUS,
  Desk_osbyte_RW_ESCAPEEFFECTS,
  Desk_osbyte_RW_CHARACTERDESTINATIONSTATUS = 236,
  Desk_osbyte_RW_CURSORKEYSTATUS,
  Desk_osbyte_RW_NUMERICKEYPADINTERPRETATION,
  Desk_osbyte_READCOUNTRYFLAG = 240,
  Desk_osbyte_READRS423BAUDRATES = 242,
  Desk_osbyte_READTIMERSWITCHSTATE,
  Desk_osbyte_READPRINTERDRIVERTYPE = 245,
  Desk_osbyte_RW_PRINTERIGNORECHARACTER,
  Desk_osbyte_RW_BREAKKEYACTIONS,
  Desk_osbyte_READVDUDRIVERSCREENBANK = 250,
  Desk_osbyte_READDISPLAYSCREENBANK,
  Desk_osbyte_READLASTBREAKTYPE = 253,
  Desk_osbyte_RW_EFFECTOFSHIFTCTRLONNUMERICKEYPAD,
  Desk_osbyte_RW_BOOTOPTION
} Desk_osbyte_number;

void	Desk_OS_Byte(Desk_osbyte_number reason, int r1in, int r2in,
                                        int *r1out, int *r2out);


typedef enum
{
  Desk_osword_READLINE = 0,
  Desk_osword_READSYSCLOCK,
  Desk_osword_WRITESYSCLOCK,
  Desk_osword_READINTERVALTIMER,
  Desk_osword_WRITEINTERVALTIMER,
  Desk_osword_READPIXELCOLOUR = 9,
  Desk_osword_READCHARACTERDEFN,
  Desk_osword_READPALETTE,
  Desk_osword_WRITEPALETTE,
  Desk_osword_READGFXCURSORS,
  Desk_osword_READCMOSCLOCK,
  Desk_osword_WRITECMOSCLOCK,
  Desk_osword_DEFINEPOINTERANDMOUSE = 21,
  Desk_osword_WRITESCREENBASE
} Desk_osword_number;

void	Desk_OS_Word(Desk_osword_number reason, void *Desk_param_block);



extern Desk_bool Desk_OS_ReadVarVal(const char *varname, char *buf, int bufsize);
/*  Read an OS Variable value.
 *  Fills buf with the variable's value. Returns Desk_bool_TRUE if it succeeds
 *  (see PRM 1-309).
 */


extern int	Desk_OS_ReadVarVal_GetLength( const char *varname);
/*
Purpose:	Finding the length of the value of a system variable.
Inputs:		'varname'	Name of system variable.
Returns:	Length of the system variable's value, excluding terminating
		'\0', or raises an Error2 if the variable doesn't exist. 

Notes:		Doesn't work with RISC OS 2 - system variables are 256
		chrs max.
 */


extern int	Desk_OS_ReadVarVal_GetLength_Raw( const char *varname);
/*
Returns r2 value from OS_ReadVarVal. See PRM 1-309
 */


extern int	Desk_OS_ReadVarVal_ReadIntoBuffer( char *buffer, const char *varname, int bufflen);
/*
Purpose:	Reads the value of a system variable into the supplied
		buffer.
Inputs:		'buffer'	Pointer to buffer.
		'varname'	Name of system variable.
		'bufflen'	Length of buffer.
Returns:	Length of string put into buffer.

Eg to read a variable:

{
int	l = Desk_OS_ReadVarVal_GetLength( varname);
if (l>=0)	{
	char	*buffer = Desk_DeskMem_Malloc( 1+l);
	Desk_OS_ReadVarVal_ReadIntoBuffer( buffer, varname, 1+l);
	...
	}
}
 */


extern char	*Desk_OS_ReadVarVal_AutoAlloc( const char *varname);
/*
Purpose:	Allocates a suitably-sized buffer with DeskMem and reads
		a system variable's value into the buffer.
Inputs:		varname	- name of the system variable.
Returns:	pointer to a buffer containg the variable's value. This buffer
		is allocated using Desk_DeskMem_Malloc.
		Raises an Error2 if the variable doesn't exist.
 */

typedef enum
{
  Desk_modevar_MODEFLAGS = 0,
  Desk_modevar_RIGHTCOLUMN,
  Desk_modevar_BOTTOMROW,
  Desk_modevar_NCOLOUR,
  Desk_modevar_XEIGFACTOR,
  Desk_modevar_YEIGFACTOR,
  Desk_modevar_LINELENGTH,
  Desk_modevar_SCREENSIZE,
  Desk_modevar_YSHIFTFACTOR,
  Desk_modevar_LOG2BPP,
  Desk_modevar_LOG2BPC,
  Desk_modevar_XWINDOWLIMIT,
  Desk_modevar_YWINDOWLIMIT
} Desk_mode_variable;

extern void	Desk_OS_ReadModeVariable(int mode, Desk_mode_variable variable,
                                     int *value);


void	Desk_OS_SWINumberToString( int number, char *buffer, int size);
/*
Purpose:  Converts a SWI number to the corresponding string.
            (SWI veneer for SWI Desk_OS_NumberToString)
Inputs:   number - the SWI number
          buffer - the buffer where the string will be stored
          size - the size of the buffer
Outputs:  -
Returns:  NULL if no errors, otherwise a pointer to the error
Errors:   -
SeeAlso:  Desk_OS_SWINumberFromString; SWI
*/


void	Desk_OS_SWINumberFromString( const char *string, int *number);
/*
Purpose:  Converts a string to a SWI number.
          (SWI veneer for SWI Desk_OS_NumberFromString)
Inputs:   string - the string to convert
Outputs:  number - the resulting SWI number
Returns:  NULL if no errors, otherwise a pointer to the error
Errors:   -
SeeAlso:  Desk_OS_SWINumberToString; SWI
*/



void	Desk_OS_GSTrans(const char *string, char *buffer, int size, char **end);
/*
Purpose:  Convert a string using GS operations.
          (SWI veneer for SWI Desk_OS_GSTrans)
Inputs:   string - the string to convert
          buffer - the buffer where the converted string will be stored
          size - the size of the buffer
Outputs:  end - pointer to the character after terminator
Returns:  NULL if no errors, otherwise a pointer to the error
*/



void	Desk_OS_CLI(const char *cmd);
/*
Purpose:  Executes a *-command
          (SWI veneer for SWI Desk_OS_CLI)
Inputs:   cmd - the command string
Returns:  NULL if no errors, otherwise a pointer to the error
*/


int	Desk_OS_Byte_ReadCMOS( int location);

void	Desk_OS_Byte_WriteCMOS( int location, int value);

void	Desk_OS_Byte_WriteCMOSMask( int location, int mask, int value);
/*
Writes 'value' to just those bits that are set in 'mask'.
 */



#ifdef __cplusplus
}
#endif


#endif

