GEMDOS.TXT

From Atari Wiki
Jump to navigation Jump to search


   ***-------------- FUNCTIONS GEMDOS BY NUMBER ---------------***

   $00      Pterm0    Terminate process
   $01      Cconin    Read a character from standard input
   $02      Cconout   Write a character to standard output
   $03      Cauxin    Read a character from AUX: standard input
   $04      Cauxout   Write a character to AUX: standard output
   $05      Cprnout   Write a character to PRN: standard output
   $06      Crawio    Raw input/output on standard input/output
   $07      Crawcin   Raw input on standard input
   $08      Cnecin    Read a character from standard input without echo
   $09      Cconws    Write a string to standard output
   $0A      Cconrs    Read a formatted string from standard input
   $0B      Cconis    Test standard input status
   $0E      Dsetdrv   Set default disk drive
   $10      Cconos    Test standard output status
   $11      Cprnos    Test PRN: standard output status
   $12      Cauxis    Test AUX: standard input status
   $13      Cauxos    Test AUX: standard output status
   $19      Dgetdrv   Get default disk drive
   $1A      Fsetdta   Set Disk Transfer Address (DTA) address
   $20      Super     Enter/Exit/Inquire Supervisor mode
   $2A      Tgetdate  Inquire date
   $2B      Tsetdate  Set date
   $2C      Tgettime  Inquire time
   $2D      Tsettime  Set time
   $2F      Fgetdta   Inquire Disk Transfer Address (DTA) address
   $30      Sversion  Inquire GEMDOS version number
   $31      Ptermres  Terminate resident program
   $36      Dfree     Inquire free space on a disk
   $39      Dcreate   Create a subdirectory
   $3A      Ddelete   Delete a subdirectory
   $3B      Dsetpath  Set current directory
   $3C      Fcreate   Create a file
   $3D      Fopen     Open a file
   $3E      Fclose    Close a file
   $3F      Fread     Read from a file
   $40      Fwrite    Write to a file
   $41      Fdelete   Delete a file
   $42      Fseek     Set file position
   $43      Fattrib   Inquire/Set file attributes
   $45      Fdup      Duplicate file handle id
   $46      Fforce    Force file handle
   $47      Dgetpath  Inquire current directory
   $48      Malloc    Allocate memory
   $49      Mfree     Free memory
   $4A      Mshrink   Shrink allocated memory block
   $4B      Pexec     Load/Execute a program
   $4C      Pterm     Terminate a program
   $4E      Fsfirst   Search for the first occurrence of a file
   $4F      Fsnext    Search for the next occurrence
   $56      Frename   Rename a file
   $57      Fdatime   Set/Inquire file creation date and time


   ***-------------- GEMDOS FUNCTIONS BY NAME ----------------------***

   $03      Cauxin    Read a character from AUX: standard input
   $12      Cauxis    Test AUX: standard input status
   $13      Cauxos    Test AUX: standard output status
   $04      Cauxout   Write a character to AUX: standard output
   $01      Cconin    Read a character from standard input
   $0B      Cconis    Test standard input status
   $10      Cconos    Test standard output status
   $02      Cconout   Write a character to standard output
   $0A      Cconrs    Read a formatted string from standard input
   $09      Cconws    Write a string to standard output
   $08      Cnecin    Read a character from standard input without echo
   $11      Cprnos    Test PRN: standard output status
   $05      Cprnout   Write a character to PRN: standard output
   $07      Crawcin   Raw input on standard input
   $06      Crawio    Raw input/output on standard input/output
   $39      Dcreate   Create a subdirectory
   $3A      Ddelete   Delete a subdirectory
   $36      Dfree     Inquire free space on a disk
   $19      Dgetdrv   Get default disk drive
   $47      Dgetpath  Inquire current directory
   $0E      Dsetdrv   Set default disk drive
   $3B      Dsetpath  Set current directory
   $43      Fattrib   Inquire/Set file attributes
   $3E      Fclose    Close a file
   $3C      Fcreate   Create a file
   $57      Fdatime   Set/Inquire file creation date and time
   $41      Fdelete   Delete a file
   $45      Fdup      Duplicate file handle id
   $46      Fforce    Force file handle
   $2F      Fgetdta   Inquire Disk Transfer Address (DTA) address
   $3D      Fopen     Open a file
   $3F      Fread     Read from a file
   $56      Frename   Rename a file
   $42      Fseek     Set file position
   $1A      Fsetdta   Set Disk Transfer Address (DTA) address
   $4E      Fsfirst   Search for the first occurrence of a file
   $4F      Fnext     Search for the next occurrence
   $40      Fwrite    Write to a file
   $48      Malloc    Allocate memory
   $49      Mfree     Free memory
   $4A      Mshrink   Shrink allocated memory block
   $4B      Pexec     Load/Execute a program
   $4C      Pterm     Terminate a program
   $00      Pterm0    Terminate a program (return code 0)
   $31      Ptermres  Terminate a resident program
   $20      Super     Enter/Exit/Inquire Supervisor mode
   $30      Sversion  Inquire GEMDOS version number
   $2A      Tgetdate  Inquire date
   $2C      Tgettime  Inquire time
   $2B      Tsetdate  Set date
   $2D      Tsettime  Set time

   *------------------------------------------------------------------*
   $00      Pterm0    Terminate a program

        void Pterm0()

   Terminate a process, closing all files it has opened and releasing
   the memory it has allocated. Returns $0000 as the exit code to the
   parent program.
   *------------------------------------------------------------------*
   $01  Cconin    Read a character from standard input

        LONG Cconin()
     
   Read a character from standard input (identifier 0). If the standard
   input is the console, the long word returned in D0 contains the ASCII
   code and the keyboard code of the pressed key (scan code):

          ________________________________________________
         | 31..24      | 23.. 16   |  15..8   |   7..0    |
         |-------------|-----------|----------|-----------|
         |             |  scan code|   $00    | character |
         | $00 or bits | or $00    |          | ASCII     |
         | of shift    | or $00    |          |           |
         |_____________|___________|__________|___________|

   Function keys (F1 to F10, HELP, UNDO, etc...) return ASCII code $00
   with the appropriate keyboard code (see the intelligent keyboard
   manual for the key codes). The ST BIOS places the state of special
   keys in bits 24 to 31 (see the ST BIOS programmer's guide for more
   details).

   ERRORS
        Does not return any indication of end of file.
        Does not recognize 'Control_C'
        Impossible to know if the input is a character device or a file.
        There should be a way to type the 256 possible codes from the
        keyboard.
   *------------------------------------------------------------------*
   $02 Cconout   Write a character to the standard output
        void  Cconout(c)
        WORD c
   Write the character 'c' to the standard output (identifier 0).
   The eight most significant bits of 'c' are reserved and must be zero.
   Tabs are not interpreted.
   *------------------------------------------------------------------*
   $03 Cauxin    Read a character from AUX: standard input

        WORD Cauxin()

   Read a character from identifier 1 (the AUX: serial port, usually).

   NOTE
        Output flow control of the RS232 does not work with this
        function. Programs should use the BIOS character device call
        to avoid losing received characters.
   *------------------------------------------------------------------*
   $04 Cauxout   Write a character to the AUX: standard output
        void Cauxout(c)
        WORD c

   *------------------------------------------------------------------*
   $05 Cprnout   Write a character to the PRN: standard output
        void Cprnout(c)
        WORD c

   Write 'c' to identifier 2 (the PRN: printer port, usually). The high
   bits of 'c' are reserved and must be zero. Tabs are not interpreted.

   *------------------------------------------------------------------*
   $06 Crawio    Raw input/output on standard input/output
        LONG Crawio(w)
        WORD w;

   NOTES
        By its very design this function cannot write '$ff' to the
        standard output.
        $00 cannot be differentiated from an end of file.
   *------------------------------------------------------------------*
   $07 Crawcin   Raw input on standard input
        LONG Crawcin()

   NOTE     No end of file indication.
   *------------------------------------------------------------------*
   $08 Cnecin    Read a character from standard input without echo
        LONG Cnecin()

   Read a character from standard input. If the input device is 'CON:',
   no echo is made. Control characters are interpreted.
   *------------------------------------------------------------------*
   $09 Cconws    Write a string to standard output
        void Cconws(string)
        char *string;
   Write a string starting from 'string' and ending with 0, to the
   standard output.
   *------------------------------------------------------------------*
   $0A Cconrs    Read a formatted string from standard input
        void Cconrs(buf)
        char *buf
   Read a string from standard input. The usual control characters are
   interpreted:

                   ____________________________________________
                  | Character   |    Function                |
                  |-------------|-----------------------------|
                  | <return>, ^J | End of line                |
                  |   ^H, <rub>  | Erase last character        |
                  |   ^U, ^X     | Erase entire line          |
                  |      ^R      | Recopy line                |
                  |      ^C      | End program                |
                  |______________|_____________________________|

   The first character of 'buf' contains the maximum number of bytes to
   read (buffer size minus two). On output, the second byte contains
   the number of characters read. The string is located between 'buf+2'
   and 'buf+2+buf[1]'. It is not guaranteed that the string ends with 0.

   NOTE     Crashes on end of files.
   *------------------------------------------------------------------*
   $0B Cconis    Test standard input status
        WORD Cconis()
   Returns $FFFF if a character is available on standard input, $0000
   otherwise.
   *------------------------------------------------------------------*
   $0E Dsetdrv   Set default disk drive
        LONG Dsetdrv(drv)
        WORD drv;
   Set disk 'drv' as the default. Drives are numbered 0 to 15 (A: to P:).
   Returns in D0.L the bitmap of active drives:
           (bit 0 = A, bit 1 = B, etc..).

   An 'active drive' is a drive from which a directory has been made.

   NOTE GEMDOS only supports 16 drives (bits 0 to 15). Future systems will
   support 32 .
   *------------------------------------------------------------------*
   $10 Cconos    Test standard output status
        WORD Cconos()

   Returns $FFFF if the console is ready to receive a character,
   $0000 if the console is NOT ready.
   *------------------------------------------------------------------*
   $11 Cprnos    Test PRN: standard output status
        WORD Cprnos()
   Returns $FFFF if 'PRN:' is ready to receive a character, $0000
   otherwise.
   *------------------------------------------------------------------*
   $12 Cauxis    Test AUX: standard input status
        WORD Cauxis()
   Returns $FFFF if a character is available on 'AUX:' input (identifier 1),
   $0000 otherwise.
   *------------------------------------------------------------------*
   $13 Cauxos    Test AUX: standard output status
        WORD Cauxos()
   Returns $FFFF if 'AUX:' (identifier 1) is ready to receive a
   character, $0000 otherwise.
   *------------------------------------------------------------------*
   $19 Dgetdrv   Get default disk drive
        WORD Dgetdrv()
   Returns the number of the current drive, ranging from 0 to 15.
   *------------------------------------------------------------------*
   $1A Fsetdta   Set Disk Transfer Address (DTA) address
        void Fsetdta(adr)
        char adr;
   Sets the DTA address to 'adr'. The data storage buffer on a file (DTA)
   is only used by the functions Fsfirst() and Fsnext().
   *------------------------------------------------------------------*
   $20 Super     Enter/Exit/Inquire Supervisor mode
        LONG Super(stack)
        WORD *stack;
        'stack' is equal to -1L ($FFFFFFFF):
   the function returns $0000 if the processor is in User mode, $0001 if
   it is in Supervisor mode.

   'stack' is different from -1L:
        if the processor is in User mode, the function returns
        to Supervisor mode. If 'stack' is NUL ($00000000), the
        supervisor stack will be the same as the user stack before
        the call. Otherwise the supervisor stack will be placed at 'stack'.

        if the processor was in Supervisor mode, it returns
        to User mode after the function call. 'stack' must be the value
        of the user stack that was returned by the first function call.

   ATTENTION
        The original Supervisor stack must be replaced before the end
        of the program, otherwise the system will crash on program exit.

   *------------------------------------------------------------------*
   $2A Tgetdate  Inquire date
        WORD Tgetdate()

   Returns the date in DOS format:

        15 __________________9_8_________5_4_________0 
        |  Years since 1980 |   month   |   day     |
        |      0.....119     |  1...12   |  1...31   |
        |____________________|___________|___________|

   RETURN
        bits 0 to 4 contain the day from 1 to 31.
        bits 5 to 8 contain the month from 1 to 12.
        bits 9 to  15 contain the year (from 1980 onward)
        ranging from 0 to 119.
   *------------------------------------------------------------------*
   $2B Tsetdate  Set date
        WORD Tsetdate(date)
        WORD date;
   Set 'date' as the current date in the format described in
   Tgetdate().

   RETURN   0 if the date is valid.
            ERROR if the date format is incorrect.

   NOTE
        GEMDOS is not picky about the date; for instance, February 31 does
        not bother it.
        GEMDOS does NOT notify BIOS that the date has changed.
   *------------------------------------------------------------------*
   $2C Tgettime  Inquire time
        WORD Tgettime()

   Returns the current time in DOS format:

              15__________11_10________5_4__________0
             |    hour      |   minute  |   second   |
             |   0...23     |   0...59  |   0...28   |
             |______________|___________|____________|

   RETURN    Bits :
        0 to 4    contain the seconds divided by 2 (0 to 28)
        5 to 10   contain the minutes  (0 to 59)
        11 to 15  contain the hours   (0 to 23)
   *------------------------------------------------------------------*
   $2D Tsettime  Set time
        WORD Tsettime(time)
        WORD time;
   Set 'time' as the current time in the format described in
   Tgettime().

   RETURN   0 if the provided time format is valid;
            ERROR if the time format is invalid.

   NOTE
        GEMDOS does not notify BIOS that the time has changed.
   *------------------------------------------------------------------*
   $2F Fgetdta   Inquire Disk Transfer Address (DTA) address
        LONG Fgetdta()
   Returns the current address of the data storage buffer on a file
   (DTA), used by the functions Fsfirst() and Fsnext().
   *------------------------------------------------------------------*
   $30 Sversion  Inquire GEMDOS version number
        WORD Sversion()

   Returns the GEMDOS version number in reverse format. The most
   significant byte contains the low part of the number, the least
   significant byte, the high part.

   NOTE
        The GEMDOS version on the 5/29/85 diskette and the first
        ROM version on 11/20/85 have $1300 as the number.

        The GEMDOS and TOS version numbers are NOT the same. (see
        the ST BIOS reference manual for the TOS version number).
     
   *------------------------------------------------------------------*
   $31 Ptermres  Terminate a resident program
        void Permres( rest,retcode)
        LONG rest;
        WORD retcode;

   Ends the current program, preserving some of its memory.
   'rest' is the number of bytes belonging to the program that
   should be kept, including and starting at the base page.
   'retcode' is the exit code returned to the parent program.

   The memory that the program has allocated (in addition to its TPA
   zone) is NOT freed.
   It is impossible to recall the program terminated by Ptermres().

   NOTE 
        Open files are closed when the process ends.
   *------------------------------------------------------------------*
  $36 Dfree     Requests free space on a disk
        void Dfree(buf,nbdisq)
        LONG *buf;
        WORD nbdisq;

   Requests information about the disk 'nbdisq' and places it in
   four long words starting at 'buf':
             __________________________________________________
            |  buf + 0  | number of free blocks on the disk    |
            |-----------|--------------------------------------|
            |  buf + 4  | total number of blocks on the disk   |
            |-----------|--------------------------------------|
            |  buf + 8  | size of a sector in bytes            |
            |-----------|--------------------------------------|
            |  buf + 12 | number of sectors per block          |
            |___________|______________________________________|

   NOTE   Incredibly slow on a hard disk (5 to 10 seconds).
   *------------------------------------------------------------------*
   $39 Dcreate   Creation of a subdirectory on disk C
        WORD Dcreate(path)
        char *path;

   'Path' points to a 0-terminated string specifying the path
   of the new directory.
   RETURN
        0 if successful;
        ERROR or the appropriate error number in case of failure.
   *------------------------------------------------------------------*
   $3A Ddelete   Deletes a subdirectory
        WORD Ddelete(path)
        char *path;
   Deletes a directory that must be empty (it can, however,
   contain the special files "." and ".."). 'Path' points to
   a 0-terminated string specifying the path of the directory to
   delete.

   RETURN   0 if successful;
            ERROR or the appropriate error number in case of failure.
   *------------------------------------------------------------------*
   $3B Dsetpath  Sets the current directory
        WORD Dsetpath(path)
        char *path;
   Sets 'path', (a 0-terminated string), as the current directory.
   If the path starts with a drive letter followed by a colon, the current directory is set to the specified drive.

   The system maintains a current directory for each drive.

   RETURN   0 if successful;
            ERROR or the appropriate error number in case of failure.
   *------------------------------------------------------------------*
   $3C Fcreate   Creation of a file
        WORD Fcreate(filename,attribs)
        char *filename;
        WORD attribs;
   Creates a file 'filename' and returns its non-standard,
   write-only identifier. The attribute word is stored in the
   directory; the attribute bits are:
         _________________________________________________________
        |  mask  |       description                             |
        |--------|-----------------------------------------------|
        | $01    | file created read-only                        |
        | $02    | file transparent to directory                 |
        | $04    | system file                                   |
        | $08    | file containing a volume name on 11 bits      |
        |________|_______________________________________________|

   RETURN
        A positive number, the identifier or :
        ERROR or the appropriate error number.

   NOTES
        If the read-only bit is set, a write-only identifier 
        is returned, and moreover, this identifier does not 
        allow writing.

        Theoretically, only one volume number is allowed on a
        root directory. GEMDOS does not enforce this, which
        can cause some confusion.
   *------------------------------------------------------------------*
   $3D Fopen     Opening a file
        WORD Fopen(filename,mode)
        char *filename;
        WORD mode;
   Opens the file 'filename' in mode 'mode' and returns its non-
   standard identifier. The opening mode can be:
                      ____________________________
                     | mode  |     description    |
                     |-------|---------------------|
                     | 0     | read-only           |
                     | 1     | write-only          |
                     | 2     | read and write      |
                     |_______|_____________________|

   RETURN
        A positive number, the identifier
        A negative error number.
   *------------------------------------------------------------------*
   $3E Fclose    Closing a file
        WORD Fclose(fileid)
        WORD fileid;
   Closes the file with the identifier 'fileid'.

   RETURN   0 if successful;
            ERROR or an appropriate error number in case of failure.
   *------------------------------------------------------------------*
   $3F Fread     Reading from a file
        LONG Fread(fileid,nbre,buffer)
        WORD fileid;
        LONG nbre;
        char *buffer;

   Reads 'nbre' bytes from the file with identifier 'fileid', and
   places them in memory starting from the address 'buffer'.

   RETURN
        The number of bytes actually read, or:
        0 if end of file code,
        A negative error number.
   *------------------------------------------------------------------*
   $40 Fwrite    Writing to a file
        LONG Fwrite(fileid,nbre,buffer)
        WORD fileid;
        LONG nbre;
        char *buffer;

   Writes 'nbre' bytes from memory starting from the address 'buffer',
   into the file with identifier 'fileid'.

   RETURN   The number of bytes actually written if successful.
            A negative error number otherwise.
   *------------------------------------------------------------------*
   $41 Fdelete   Deleting a file
        WORD Fdelete(filename)
        char *filename;
   Deletes the file named 'filename'.

   RETURN   0 if successful
            A negative error number otherwise.
   *------------------------------------------------------------------*
   $42 Fseek     Positioning the file pointer
        LONG Fseek(offset,fileid,mode)
        LONG offset;
        WORD fileid;
        WORD mode;
   Positions the pointer in the file defined by the identifier
   'fileid'. 'Offset' is a signed number; a positive value
   moves the pointer towards the end of the file, a negative value
   towards the beginning. The positioning mode can be:
              _____________________________________________
             | mode   |  Move offset bytes...              |
             |--------|------------------------------------|
             |    0   | from the beginning of the file     |
             |    1   | from the current position          |
             |    2   | from the end of the file           |
             |________|____________________________________|

   RETURN   The current position in the file.
            A negative error number if error.
   *------------------------------------------------------------------*
   $43 Fattrib   Set or request file attributes
        WORD Fattrib(filename,flag,attribs)
        char *filename;
        WORD flag;
        WORD attribs;
   'Filename' points to a 0-terminated path. If 'flag' is
   1, the file attributes 'attribs' are set (no return value).
   If 'flag' is 0, they are returned.

        The attribute bits are:
         _________________________________________________________
        | mask   |               description                      |
        |--------|------------------------------------------------|
        | $01    | read-only file                                 |
        | $02    | file transparent to directory                  |
        | $04    | 'system' file                                  |
        | $08    | file containing a volume name (11 bytes)       |
        | $10    | file subdirectory                              |
        | $20    | file written and then closed                   |
        |________|________________________________________________|

   NOTE   The archive bit, $20, does not seem to work as
   expected.
   *------------------------------------------------------------------*
   $45 Fdup      Duplicates a file identifier
        WORD Fdup(fileid)
        WORD fileid;
   The identifier 'fileid' must be a standard identifier (0 to
   5). Fdup() returns a non-standard identifier (6 or higher) that points to the same file.

   RETURN   An identifier or :
   EIHNDL   'fileid' is not a standard identifier
            ENHNDL    No more non-standard identifiers
   *------------------------------------------------------------------*
   $46 Fforce    Force a file identifier
        Fforce(stdh,nonstdh)
        WORD stdh;
        WORD nonstdh;

   Forces the standard identifier 'stdh' to point to the same file
   or device as the non-standard identifier 'nonstdh'.

   RETURN   0 if OK
            EIHNDL    invalid identifier.
   *------------------------------------------------------------------*
   $47 Dgetpath  Requests the current directory
        void Dgetpath(buf,driveno)
        char *buf;
        WORD driveno;
   The current directory for the drive 'driveno' is copied into
   'buf'. The drive number starts at 1 for drive A:, 2
   for drive B:, etc..., 0 specifying the default disk.

    NOTE
   The maximum size of a path is not limited by the system.
   It is up to the application to provide enough space for the
   buffer. 128 bytes seem sufficient for 8 or 9 subdirectories.
   *------------------------------------------------------------------*
   $48 Malloc    Memory allocation request
        LONG Malloc(size)
        LONG size;
   If 'size' is -1L ($FFFFFFFF) the function returns the size of the
   largest free block in the system. Otherwise if 'size' is
   different from -1L, the function tries to allocate 'size' bytes for
   the current program. The function returns a pointer to the
   beginning of the allocated block if all went well, or NULL if there
   was no block large enough to satisfy the request.

     NOTE
   A program can have, at any given moment, no more than 20 blocks 
   allocated by 'Malloc()'. Exceeding this limit can disrupt GEMDOS. 
   (However, it is possible to make as many 'Malloc()' calls as 
   one wishes as long as they are followed by the call of the 
   'Mfree()' function, 20 being the maximum number of 
   fragments a program can generate).
   *------------------------------------------------------------------*
   $49 Mfree     Memory Release
        WORD Mfree(adbloc)
        LONG adbloc;
   Releases the memory block starting at 'adbloc'. The block must be one
   of those allocated by Malloc().

   RETURN
        0 if the release was successful.
        ERROR or the appropriate error number otherwise.
   *------------------------------------------------------------------*
   $4A Mshrink   Shrinks the size of an allocated block
        WORD Mshrink(0,bloc,newsize)
        WORD) 0;
        LONG bloc;
        LONG newsize;
   Shrinks the size of an allocated memory block. 'Bloc' points to the
   base page of a program or to a memory block allocated by
   Malloc(), 'newsize' is the new size of the block.
   The first argument of the block must be a null word.

   RETURN
        0        if the size adjustment was successful.
        EIMBA    if the memory block address was invalid.
        EGSBF    if the new requested size was incorrect.

   NOTE
        A block can only be shrunk; the new size of the block
        must necessarily be smaller than the previous one.

   N.B.: The 'C' Alcyon compiler adds, during compilation,
   the first call parameter '0'. Therefore, it should not be included
   in the function call if using this compiler.

   Function call with 'C' Alcyon: Mshrink(bloc,newsize);
   *------------------------------------------------------------------*
   $4B Pexec     Load/Execute a program
        WORD Pexec(mode,ptr1,ptr2,ptr3)
        WORD mode;
        char *ptr1;
        char *ptr2;
        char *ptr3;

   This function allows different uses depending on the 'mode' flag:

        ___________________________________________________________
       |     mode     |     ptr1     |    ptr2     |      ptr3     |
       |--------------|--------------|-------------|---------------|
       | 0: load and  | file to      | command set | environment   |
       |     execute  | execute      |             | string        |
       |--------------|--------------|-------------|---------------|
       | 3: load      | file to      | command set | environment   |
       |   without    | load         |             | string        |
       |   launching  |              |             |               |
       |--------------|--------------|-------------|---------------|
       | 4: execute   | address of   | (unused)    | (unused)      |
       |    only      | the base page|             |               |
       |--------------|--------------|-------------|---------------|
       | 5: create a  | (unused)     | command set | environment   |
       |  base page   |              |             | string        |
       |______________|______________|_____________|_______________|

   The name of the file to load or execute, 'ptr1', and the command set
   string, 'ptr2', are paths, terminated by 0. The environment
   string 'ptr3', is either NULL (0L), or a pointer to a structure of string in the form:
                  "string1\0"
                  "string2\0"
                  etc...
                  "string3\0"
                  "\0"

   The environment string can be any number of
   strings ended by a 0, followed by a null string (a simple 0).
   The program inherits a copy of the parent's environment string if 'ptr3' is 'NULL'.

   Mode 0 (load and execute) will load the specified file,
   compose its base page, and execute it. The value returned by
   Pexec() will be the exit code of the child process (see Pterm0()
   and Pterm()).

   Mode 3 (load without executing) will load the specified file,
   compose the base page, and return a pointer to this
   base page. The program is not executed.

   Mode 4 (execute only) receives a pointer to a base page.
   The program starts its execution at the beginning of the text area,
   as specified in the base page.

   Mode 5 (creation of a base page) will allocate the largest
   free memory block and create most of its base page.
   Some entries such as the size of the initialized/uninitialized data areas and their
   base address ARE NOT installed. The calling program is responsible for them.

   A child program inherits the standard file descriptors
   from its parent. It actually employs a call to Fdup() and
   Fforce() on identifiers 0 to 5.

   Since system resources are allocated during the creation of
   the base page, the spawned process MUST terminate by
   releasing them. This is particularly important when
   using overlays. (see 'the Pexec cookbook' for more
   details on Pexec()).
   *------------------------------------------------------------------*
   $4C Pterm     Ends a program
        void Pterm(retcode)
        WORD retcode;
   Ends the current program, closes all open files, and
   frees allocated memory. Returns 'retcode' to the parent process.
   *------------------------------------------------------------------*
   $4E Fsfirst   Searches for the first occurrence of a file
        WORD Fsfirst(fspec,attribs)
        char *fspec;
        WORD attribs;
   Searches for the first occurrence of the file 'fspec'. The file
   specifier can contain special characters ('?' or
   '*') in the file name but not in the path specification. 'Attribs' controls the type of file that will be returned
   by Fsfirst(). Its format has been described in the documentation on
   'Fattrib()'.

   If 'attribs' is zero, only normal files will be
   searched (no volume name, hidden file, subdirectory, or
   system file will be returned). If 'attribs' is set to
   hidden files or system files, then those will
   be taken into account for the search. If 'attribs' is set
   to find a volume name, then only volume names will be searched.

   When a file is found, a 44-byte structure is
   written at the location pointed to by the DTA.
            _________________________________________________
           | offset |  size    |   contents                  |
           |--------|----------|-----------------------------|
           | 0 to 20|          | (reserved)                  |
           |   21   |  byte    | attribute bits              |
           |   22   |  word    | creation time               |
           |   24   |  word    | creation date               |
           |   26   |  long    | file size                   |
           |   30   | 14 bytes | file name and extension     |
           |________|__________|_____________________________|

   The file name and its extension end with a 0, and do not
   contain spaces.
   RETURN   0 if the file was found
            EFILNF     if the file was not found, or the
            appropriate error number.
   *------------------------------------------------------------------*
   $4F Fsnext    Searches for subsequent occurrences
        WORD Fsnext()
   Searches for subsequent occurrences of a file. The first
   occurrence must be searched for by Fsfirst(). Bytes 0 to
   20 must remain unchanged since the call of Fsfirst() or
   the last call of Fsnext().

   RETURN   0 if the file was found
        ENMFIL     if there are no more files found, or the
        appropriate error number.
   *------------------------------------------------------------------*
   $56 Frename   Renames a file
        WORD Frename(0,oldname,newname)
        WORD) 0;
        char *oldname;
        char *newname;
   Renames a file 'oldname' to 'newname'. The new name must not
   already exist but can be in a different directory.

   The first parameter must be 0 (word).

   RETURN   0         if OK
            EACCDN    if the new name already exists
            EPTHNF    if the old name was not found
            ENSAME    if the disk identifier (A,B,..) is not
                      the same for both names.
   *------------------------------------------------------------------*
   $57 Fdatime   Sets or requests the creation time of a file
         void Fdatime(fileid,pttemp,flag)
        WORD fileid;
        LONG pttemp;
        WORD flag;
   The file is recognized by its identifier 'fileid'. 'Pttemp'
   points to two words containing the time and date in DOS
   format (the time is in the first word, the date in the second).

   If 'flag' is 1, the date and time are set in the file
   from 'pttemp'.

   If 'flag' is 0, the date and time are read and placed
   in 'pttemp'.
   *------------------------------------------------------------------*

Back to ASM_Tutorial