/*
    SPHINX Programming (C) 1994.
    NAME:  DOS.H--
    DESCRIPTION:  This file defines several DOS related procedures and
                  functions.
    LAST MODIFIED:  21 Apr 1994
    PROCEDURES DEFINED IN THIS FILE:
        : void ABORT()
        : void ALLOCBESTFIT()
        : void ALLOCFIRSTFIT()
        : void ALLOCLASTFIT()
        : word ALLOCSTRATEGY()
        : byte DOSGETDATE()
        : void DOSGETTIME()
        : byte DOSsetdate(byte day,byte month,year)
        : byte DOSsettime(byte hour,byte minute,byte second)
        : void DOSWRITESTR(stringoffset)
        : void ENVSTR(environ_string)
        : void EXIT(byte returnvalue)
        : byte GETBOOTDRIVE()
        : byte GETCH()
        : byte GETCHE()
        : word GETDTA()
        : void setDTA(DTAsegment,DTAoffset)
        : word spawn(filename,commandline,environment)
*/


// default offset address of Disk Transfer Area:

?define  DTA_ADDRESS  0x80


// Procedure Definitions:


: void ABORT ()
{
?DOSrequired 0x0100
$INT 0x20
}


: void ENVSTR ()  /* AX = offset of string of environment variable name */
                  /* DS must equal the segment address of the PSP, in other
                     words, the same value it had when the program started
                     executing, this should be the same as CS. 
                  */
/*
    attempts to retrive an environmental variable 
*/
{BX = AX;
ES = DSWORD[0x2C];
DI = 0;
TOP: SI = BX;
$ CMP ESBYTE[DI],0
$ JE FINISHED
CX = 100;
$ REPZ
$ CMPSB
SI--;
$ CMP DSBYTE[SI],0
$ JNE HERE
$ CMP ESBYTE[DI-1],'='
$ JE PREFINISHED
HERE: DI++;
$ CMP ESBYTE[DI],0
$ JNE HERE
DI++;
$ JMP TOP
PREFINISHED:
// DI++;
FINISHED:
}
/*  RETURNS:   AX,BX,CX,SI = undefined
               ES:DI = environment string
*/



: word spawn (word filenameaddress,commandlineaddress,environmentaddress)
{$ PUSH CS
AX = 0x6C;
$ PUSH AX
$ PUSH CS
AX = 0x5C;
$ PUSH AX
$ PUSH DS
$ PUSH commandlineaddress
$ PUSH environmentaddress
ES = SS;
BX = SP;
DX = filenameaddress;
AX = 0x4B00;
$ INT 0x21
?DOSrequired 0x0300
IF( NOTCARRYFLAG )
    $ XOR AX,AX
SP += 14;
}
/*  RETURNS:  BX,DX,ES = undefined
              If successful:
                  AX = 0
              If unsuccessful:
                  AX = error code 
*/


: void ALLOCBESTFIT ()
{
?DOSrequired 0x300
AX = 0x5801;
BX = 1;
$ INT 0x21
}


: void ALLOCFIRSTFIT ()
{
?DOSrequired 0x300
AX = 0x5801;
BX = 0;
$ INT 0x21
}


: void ALLOCLASTFIT ()
{
?DOSrequired 0x300
AX = 0x5801;
BX = 2;
$ INT 0x21
}


: word ALLOCSTRATEGY ()
{
?DOSrequired 0x300
AX = 0x5800;
$ INT 0x21
IF( CARRYFLAG )
    AX = -1;
}


: void EXIT ()  /* AL = value to return */
{
AH = 0x4C;
$ INT 0x21
}


: word GETDTA ()
/*
GET DISK TRANSFER AREA ADDRESS
Returns:  ES:BX -> address DTA
          AH = 2Fh
*/
{
?DOSrequired 0x200
AH = 0x2F;
$INT 0x21
}


: word setDTA (word DTAsegment, DTAoffset)
/*
SET DISK TRANSFER AREA ADDRESS
Returns:  DX = DTAoffset
          AH = 1Ah
*/
{
?DOSrequired 0x100  // I think...
DX = DTAoffset; 
$PUSH DS
DS = DTAsegment;
AH = 0x1A;
$INT 0x21
$POP DS
}


: void DOSWRITESTR ()  /*  AX = address of string to write */
/*
Prints a string to the screen using a DOS interrupt.
Returns:  DX = address of string to write
          AH = 0x9
*/
{
?DOSrequired 0x100
DX = AX;
AH = 0x9;
$INT 0x21
}


: void DOSGETTIME ()
/*
Gets the current system time from DOS.
Returns:  CH = hours
          CL = minutes
          DH = seconds
          DL = hundredths of seconds (updated approx every 5/100 second)
          AH = 0x2C
*/
{
?DOSrequired 0x100
AH = 0x2C;
$INT 0x21
}


: byte DOSsettime (byte hour,minute,second)
/*
Sets the DOS system time.
Returns:  AL = 0 if no error, else 0xFF if bad time value given
          CH = hours
          CL = minutes
          DH = seconds
          DL = 0
          AH = 0x2D
*/
{
?DOSrequired 0x100
CH = hour;
CL = minute;
DH = second;
DL = 0;  // hundredths of seconds
AH = 0x2D;
$INT 0x21
}


: byte GETBOOTDRIVE ()
/*
Gets the drive letter of the boot drive.
Returns:  AL = boot drive (1=A:,2=B:,...)
          AH = 0x33;
          DL = AL
*/
{
?DOSrequired 0x400
AX = 0x3305;
$INT 0x21
AL = DL;
}



: byte DOSGETDATE ()
/*
Gets the current system date from DOS.
Returns:  DL = day
          DH = month
          CX = year
          AL = day of the week (0=Sunday, 1=Monday, ...)
          AH = 0x2A
*/
{
?DOSrequired 0x100
AH = 0x2A;
$INT 0x21
}


: byte DOSsetdate (byte day,month; word year)
/*
Sets the DOS system date.
Returns:  AL = 0 if no error, else 0xFF if bad date value given
          DL = day
          DH = month
          CX = year
          CH = hours
          AH = 0x2B
*/
{
?DOSrequired 0x100
DL = day;
DH = month;
CX = year;
AH = 0x2B;
$INT 0x21
}


: byte GETCH ()
/*
Reads a key from the keyboard via DOS interrupt.  The key is not echoed to
the screen.
Returns:  AL = key code read
          AH = 0x8;
*/
{
?DOSrequired 0x100
AH = 0x8;
$INT 0x21
}

: byte GETCHE ()
/*
Reads a key from the keyboard via DOS interrupt.  The key is echoed to the
screen.
Returns:  AL = key code read
          AH = 0x8;
*/
{
?DOSrequired 0x100
AH = 0x1;
$INT 0x21
}


/* end of DOS.H-- */