2777 lines
130 KiB
Text
2777 lines
130 KiB
Text
CHAPTER 4
|
|
|
|
Programming Technical Reference - IBM
|
|
Copyright 1988, Dave Williams
|
|
|
|
|
|
DOS INTERRUPTS AND FUNCTION CALLS
|
|
CONTENTS
|
|
|
|
DOS Registers ........................................................... 4-
|
|
Interrupts .............................................................. 4-
|
|
20h Program Terminate ........................................... 4-
|
|
21h Function Request ............................................ 4-
|
|
Function Calls .............................................. 4-
|
|
Listing of Function Calls ................................... 4-
|
|
00h Program Terminate ................................... 4-
|
|
01h Keyboard Input ...................................... 4-
|
|
02h Display Output ...................................... 4-
|
|
03h Auxiliary Input ..................................... 4-
|
|
04h Auxiliary Output .................................... 4-
|
|
05h Printer Output ...................................... 4-
|
|
06h Direct Console I/O .................................. 4-
|
|
07h Direct Console Input Without Echo ................... 4-
|
|
08h Console Input Without Echo ...........................4-
|
|
09h Print String .........................................4-
|
|
0Ah Buffered Keyboard Input ..............................4-
|
|
0Bh Check Standard Input Status ..........................4-
|
|
0Ch Clear Keyboard Buffer and Invoke a Kbd Function ..... 4-
|
|
0Dh Disk Reset .......................................... 4-
|
|
0Eh Select Disk ......................................... 4-
|
|
0Fh Open File ........................................... 4-
|
|
10h Close File .......................................... 4-
|
|
11h Search for First Entry .............................. 4-
|
|
12h Search for Next Entry ............................... 4-
|
|
13h Delete File ......................................... 4-
|
|
14h Sequential Read ..................................... 4-
|
|
15h Sequential Write .................................... 4-
|
|
16h Create File ......................................... 4-
|
|
17h Rename File ......................................... 4-
|
|
18h ** Unknown .......................................... 4-
|
|
19h Current Disk ........................................ 4-
|
|
1Ah Set Disk Transfer Address ........................... 4-
|
|
1Bh Allocation Table Information ........................ 4-
|
|
1Ch Allocation Table Information for Specific Device .... 4-
|
|
1Dh ** Unknown .......................................... 4-
|
|
1Eh ** Unknown .......................................... 4-
|
|
1Fh ** Read DOS Disk Block (default drive) .............. 4-
|
|
20h ** Unknown .......................................... 4-
|
|
21h Random Read ......................................... 4-
|
|
22h Random Write ........................................ 4-
|
|
23h File Size ........................................... 4-
|
|
24h Set Relative Record Field ........................... 4-
|
|
25h Set Interrupt Vector ................................ 4-
|
|
26h Create New Program Segment .......................... 4-
|
|
27h Random Block Read ................................... 4-
|
|
28h Random Block Write .................................. 4-
|
|
29h Parse Filename ...................................... 4-
|
|
2Ah Get Date ............................................ 4-
|
|
2Bh Get Date ............................................ 4-
|
|
2Ch Get Time ............................................ 4-
|
|
2Dh Set Time ............................................ 4-
|
|
2Eh Set/Reset Verify Switch ............................. 4-
|
|
2Fh Get Disk Transfer Address (DTA) ..................... 4-
|
|
30h Get DOS Version Number .............................. 4-
|
|
31h Terminate Process and Stay Resident ................. 4-
|
|
32h ** Read DOS Disk Block .............................. 4-
|
|
33h Ctrl-Break Check .................................... 4-
|
|
34h ** Return INDOS Flag ................................ 4-
|
|
35h Get Vector .......................................... 4-
|
|
36h Get Disk Free Space ................................. 4-
|
|
37h ** Get/Set Switch Character (SWITCHAR) .............. 4-
|
|
38h Return Country Dependent Information ................ 4-
|
|
39h Create Subdirectory (MKDIR) ......................... 4-
|
|
3Ah Remove Subdirectory (RMDIR) ......................... 4-
|
|
3Bh Change Durrent Directory (CHDIR) .................... 4-
|
|
3Ch Create a File (CREAT) ............................... 4-
|
|
3Dh Open a File ......................................... 4-
|
|
3Eh Close a File Handle ................................. 4-
|
|
3Fh Read From a File or Device .......................... 4-
|
|
40h Write to a File or Device ........................... 4-
|
|
41h Delete a File from a Specified Directory (UNLINK) ... 4-
|
|
42h Move File Read/Write Pointer (LSEEK) ................ 4-
|
|
43h Change File Mode (CHMOD) ............................ 4-
|
|
44h I/O Control for Devices (IOCTL) ..................... 4-
|
|
45h Duplicate a File Handle (DUP) ....................... 4-
|
|
46h Force a Duplicate of a Handle (FORCDUP) ............. 4-
|
|
47h Get Current Directory ............................... 4-
|
|
48h Allocate Memory ..................................... 4-
|
|
49h Free Allocated Memory ............................... 4-
|
|
4Ah Modify Allocated Memory Blocks (SETBLOCK) ........... 4-
|
|
4Bh Load or Execute a Program (EXEC) .................... 4-
|
|
4Ch Terminate a Process (EXIT) .......................... 4-
|
|
4Dh Get Return Code of a Subprocess (WAIT) .............. 4-
|
|
4Eh Find First Matching File (FIND FIRST) ............... 4-
|
|
4Fh Find Next Matching File (FIND NEXT) ................. 4-
|
|
50h ** Set PSP .......................................... 4-
|
|
51h ** Get PSP .......................................... 4-
|
|
52h ** IN-VARS .......................................... 4-
|
|
53h ** Translate BPB .................................... 4-
|
|
54h Get Verify Setting .................................. 4-
|
|
55h ** Create Child PSP ................................. 4-
|
|
56h Rename a File ....................................... 4-
|
|
57h Get or Set Timestamp of a File ...................... 4-
|
|
58h ** Get/Set Allocation Strategy (DOS 3.x) ............ 4-
|
|
59h Get Extended Error Code ............................. 4-
|
|
5Ah Create Unique Filename .............................. 4-
|
|
5Bh Create a New File ................................... 4-
|
|
5Ch Lock/Unlock File Access ............................. 4-
|
|
5Dh ** Network - Partial ................................ 4-
|
|
5Eh ** Network Printer .................................. 4-
|
|
5Fh ** Network Redirection .............................. 4-
|
|
60h ** Parse Pathname ................................... 4-
|
|
61h ** Unknown .......................................... 4-
|
|
62h Get Program Segment Prefix (PSP) Address ............ 4-
|
|
63h ** Get Lead Byte Table (DOS 2.25) ................... 4-
|
|
64h ** Unknown .......................................... 4-
|
|
65h ** Get Extended Country Information (DOS 3.3) ....... 4-
|
|
66h ** Get/Set Global Code Page Table (DOS 3.3) ......... 4-
|
|
67h ** Set Handle Count (DOS 3.3) ....................... 4-
|
|
68h ** Commit File (DOS 3.3) ............................ 4-
|
|
Calling the DOS Services .................................... 4-
|
|
22h Terminate Address ........................................... 4-
|
|
23h Ctrl-Break Exit Address ..................................... 4-
|
|
24h Critical Error Handler Vector ............................... 4-
|
|
25h Absolute Disk Read .......................................... 4-
|
|
26h Absolute Disk Write ......................................... 4-
|
|
27h Terminate and Stay Resident ................................. 4-
|
|
28h ** DOS Idle Interrupt ....................................... 4-
|
|
29h ** Quick Screen Output ...................................... 4-
|
|
2Ah Microsoft Networks Session Layer Interrupt .................. 4-
|
|
2Bh ** Unknown .................................................. 4-
|
|
2Ch ** Unknown .................................................. 4-
|
|
2Dh ** Unknown .................................................. 4-
|
|
2Eh ** Alternate EXEC ........................................... 4-
|
|
2Fh Multiplex Interrupt ......................................... 4-
|
|
|
|
|
|
|
|
|
|
DOS REGISTERS
|
|
|
|
DOS uses the following registers, pointers, and flags when it executes
|
|
interrupts and function calls:
|
|
|
|
GENERAL REGISTERS register definition
|
|
AX accumulator (16 bit)
|
|
AH accumulator high-order byte (8 bit)
|
|
AL accumulator low order byte (8 bit)
|
|
BX base (16 bit)
|
|
BH base high-order byte (8 bit)
|
|
BL base low-order byte (8 bit)
|
|
CX count (16 bit)
|
|
CH count high order byte (8 bit)
|
|
CL count low order byte (8 bit)
|
|
DX data (16 bit)
|
|
DH date high order byte (8 bit)
|
|
DL data low order byte (8 bit)
|
|
|
|
FLAGS AF, CF, DF, IF, OF, PF, SF, TF, ZF
|
|
|
|
POINTERS register definition
|
|
SP stack pointer (16 bit)
|
|
BP base pointer (16 bit)
|
|
IP instruction pointer (16 bit)
|
|
|
|
SEGMENT REGISTERS register definition
|
|
CS code segment (16 bit)
|
|
DS data segment (16 bit)
|
|
SS stack segment (16 bit)
|
|
ES extra segment (16 bit)
|
|
|
|
INDEX REGISTERS register definition
|
|
DI destination index (16 bit)
|
|
SI stack index (16 bit)
|
|
|
|
|
|
INTERRUPTS
|
|
|
|
Microsoft recommends that a program wishing to examine or set the contents of
|
|
any interrupt vector use the DOS function calls 35h and 25h provided for those
|
|
purposes and avoid referencing the interrupt vector locations directly.
|
|
DOS reserves interrupt numbers 20h to 3Fh for its own use. This means absolute
|
|
memory locations 80h to 0FFh are reserved by DOS. The defined interrupts are as
|
|
follows with all values in hexadecimal.
|
|
|
|
|
|
Interrupt 21h FUNCTION CALL REQUEST
|
|
(0:0084h)
|
|
DOS provides a wide variety of function calls for character device I/O, file
|
|
management, memory management, date and time functions,execution of other
|
|
programs, and more. They are grouped as follows:
|
|
|
|
call description
|
|
00h program terminate
|
|
01h-0Ch character device I/O, CP/M compatibility format
|
|
0Dh-24h file management, CP/M compatibility format
|
|
25h-26h nondevice functions, CP/M compatibility format
|
|
27h-29h file management, CP/M compatibility format
|
|
2Ah-2Eh nondevice functions, CP/M compatibility format
|
|
2Fh-38h extended functions
|
|
39h-3Bh directory group
|
|
3Ch-46h extended file management
|
|
47h directory group
|
|
48h-4Bh extended memory management
|
|
54h-57h extended functions
|
|
5Eh-5Fh networking
|
|
60h-62h extended functions
|
|
63h-66h enhanced foreign language support
|
|
|
|
|
|
List of DOS services: * = undocumented
|
|
00h terminate program
|
|
01h get keyboard input
|
|
02h display character to STDIO
|
|
03h get character from STDAUX
|
|
04h output character to STDAUX
|
|
05h output character to STDPRN
|
|
06h direct console I/O - keyboard to screen
|
|
07h get char from std I/O without echo
|
|
08h get char from std I/O without echo, checks for ^C
|
|
09h display a string to STDOUT
|
|
0Ah buffered keyboard input
|
|
0Bh check STDIN status
|
|
0Ch clear keyboard buffer and invoke keyboard function
|
|
0Dh flush all disk buffers
|
|
0Eh select disk
|
|
0Fh open file with File Control Block
|
|
10h close file opened with File Control Block
|
|
11h search for first matching file entry
|
|
12h search for next matching file entry
|
|
13h delete file specified by File Control Block
|
|
14h sequential read from file specified by File Control Block
|
|
15h sequential write to file specified by File Control Block
|
|
16h find or create firectory entry for file
|
|
17h rename file specified by file control block
|
|
18h* unknown
|
|
19h return current disk drive
|
|
1Ah set disk transfer area (DTA)
|
|
1Bh get current disk drive FAT
|
|
1Ch get disk FAT for any drive
|
|
1Dh* unknown
|
|
1Eh* unknown
|
|
1Fh* read DOS disk block, default drive
|
|
20h* unknown
|
|
21h random read from file specified by FCB
|
|
22h random write to file specified by FCB
|
|
23h return number of records in file specified by FCB
|
|
24h set relative file record size field for file specified by FCB
|
|
25h set interrupt vector
|
|
26h create new Program Segment Prefix (PSP)
|
|
27h random file block read from file specified by FCB
|
|
28h random file block write to file specified by FCB
|
|
29h parse the command line for file name
|
|
2Ah get the system date
|
|
2Bh set the system date
|
|
2Ch get the system time
|
|
2Dh set the system time
|
|
2Eh set/clear disk write VERIFY
|
|
2Fh get the Disk Transfer Address (DTA)
|
|
30h get DOS version number
|
|
31h TSR, files opened remain open
|
|
32h* read DOS Disk Block
|
|
33h get or set Ctrl-Break
|
|
34h* INDOS Critical Section Flag
|
|
35h get segment and offset address for an interrupt
|
|
36h get free disk space
|
|
37h* get/set option marking character (SWITCHAR)
|
|
38h return country-dependent information
|
|
39h create subdirectory
|
|
3Ah remove subdirectory
|
|
3Bh change current directory
|
|
3Ch create and return file handle
|
|
3Dh open file and return file handle
|
|
3Eh close file referenced by file handle
|
|
3Fh read from file referenced by file handle
|
|
40h write to file referenced by file handle
|
|
41h delete file
|
|
42h move file pointer (move read-write pointer for file)
|
|
43h set/return file attributes
|
|
44h device IOCTL (I/O control) info
|
|
45h duplicate file handle
|
|
46h force a diuplicate file handle
|
|
47h get current directory
|
|
48h allocate memory
|
|
49h release allocated memory
|
|
4Ah modify allocated memory
|
|
4Bh load or execute a program
|
|
4Ch terminate prog and return to DOS
|
|
4Dh get return code of subprocess created by 4Bh
|
|
4Eh find first matching file
|
|
4Fh fine next matching file
|
|
50h* set new current Program Segment Prefix (PSP)
|
|
51h* puts current PSP into BX
|
|
52h* pointer to the DOS list of lists
|
|
53h* translates BPB (Bios Parameter Block, see below)
|
|
54h get disk verification status (VERIFY)
|
|
55h* create PSP: similar to function 26h
|
|
56h rename a file
|
|
57h get/set file date and time
|
|
58h get/set allocation strategy (DOS 3.x)
|
|
59h get extended error information
|
|
5Ah create a unique filename
|
|
5Bh create a DOS file
|
|
5Ch lock/unlock file contents
|
|
5Dh* network
|
|
5Eh* network printer
|
|
5Fh* network redirection
|
|
60h* parse pathname
|
|
61h* unknown
|
|
62h get program segment prefix (PSP)
|
|
63h* get lead byte table (DOS 2.25)
|
|
64h* unknown
|
|
65h* get extended country information (DOS 3.3)
|
|
66h* get/set global code page table (DOS 3.3)
|
|
67h* set handle count (DOS 3.3)
|
|
68h* commit file (DOS 3.3)
|
|
|
|
|
|
CALLING THE DOS SERVICES
|
|
|
|
The DOS services are invoked by placing the number of the desired function in
|
|
register AH, subfunction in AL, setting the other registers to any specific
|
|
requirements of the function, and invoking int 21h.
|
|
|
|
On return, the requested service will be performed if possible. Most codes
|
|
will return an error; some return more information. Details are contained in
|
|
the listings for the individual functions. Extended error return may be
|
|
obtained by calling function 59h (see 59h).
|
|
|
|
Register settings listed are the ones used by DOS. Some functions will return
|
|
with garbage values in unused registers. Do not test for values in unspecified
|
|
registers; your program may exhibit odd behavior.
|
|
|
|
DS:DX pointers are the data segment register (DS) indexed to the DH and DL
|
|
registers (DX). DX always contains the offset address, DS contains the segment
|
|
address.
|
|
|
|
The File Control Block services (FCB services) were part of DOS 1.0. Since
|
|
the release of DOS 2.0, Microsoft has recommended that these services not be
|
|
used. A set of considerably more enhanced services (handle services) were
|
|
introduced with DOS 2.0. The handle services provide support for wildcards and
|
|
subdirectories, and enhanced error detection via function 59h.
|
|
|
|
The data for the following calls was compiled from various Intel, Microsoft,
|
|
IBM, and other publications. There are many subtle differences between MSDOS
|
|
and PCDOS and between the individual versions. Differences between the
|
|
versions are noted as they occur.
|
|
|
|
There are various ways of calling the DOS functions. For all methods, the
|
|
function number is loaded into register AH, subfunctions and/or parameters are
|
|
loaded into AL or other registers, and call int 21 by one of the following
|
|
methods:
|
|
A) call interrupt 21h directly
|
|
B) perform a long call to offset 50h in the program's PSP.
|
|
1) This method will not work under DOS 1.x
|
|
C) place the function number in CL and perform an intrasegment call to
|
|
location 05h in the current code segment. This location contains a long
|
|
call to the DOS function dispatcher.
|
|
1) IBM recommends this method be used only when using existing programs
|
|
written for different calling conventions. This method should be avoided
|
|
unless you some specific use for it
|
|
2) AX is always destroyed by this method
|
|
3) This method is valid only for functions 00h-24h.
|
|
|
|
INT 21H DOS services
|
|
Function (hex)
|
|
|
|
* Indicates Functions not documented in the IBM DOS Technical Reference.
|
|
Note some functions have been documented in other Microsoft or licensed OEM
|
|
documentation.
|
|
|
|
|
|
00h Terminate Program
|
|
Ends program, updates, FAT, flushes buffers, restores registers
|
|
entry AH 00h
|
|
CS segment address of PSP
|
|
return none
|
|
note 1) Program must place the segment address of the PSP control block in CS
|
|
before calling this function.
|
|
2) The terminate, ctrl-break,and critical error exit addresses (0Ah, 0Eh,
|
|
12h) are restored to the values they had on entry to the terminating
|
|
program, from the values saved in the program segment prefix at
|
|
locations PSP:000Ah, PSP:000Eh, and PSP:0012h.
|
|
3) All file buffers are flushed and the handles opened by the process are
|
|
closed.
|
|
4) Any files that have changed in length and are not closed are not
|
|
recorded properly in the directory.
|
|
5) Control transfers to the terminate address.
|
|
6) This call performs exactly the same function as int 20h.
|
|
7) All memory used by the program is returned to DOS.
|
|
|
|
|
|
01h Get Keyboard Input
|
|
Waits for char at STDIN (if nescessary), echoes to STDOUT
|
|
entry AH 01h
|
|
return AL char from STDIN (8 bits)
|
|
note 1) Checks char for Ctrl-C, if char is Ctrl-C, executes int 23h.
|
|
2) For function call 06h, extended ASCII codes require two function calls.
|
|
The first call returns 00h as an indicator that the next call will be an
|
|
extended ASCII code.
|
|
3) Input and output are redirectable. If redirected, there is no way to
|
|
detect EOF.
|
|
|
|
|
|
02h Display Output
|
|
Outputs char in DL to STDOUT
|
|
entry AH 02h
|
|
DL 8 bit data (usually ASCII character)
|
|
return none
|
|
note 1) If char is 08 (backspace) the cursor is moved 1 char to the left
|
|
(nondestructive backspace).
|
|
2) If Ctrl-C is detected after input, int 23h is executed.
|
|
3) Input and output are redirectable. If redirected, there is no way to
|
|
detect disk full.
|
|
|
|
|
|
03h Auxiliary Input
|
|
Get (or wait until) character from STDAUX
|
|
entry AH 03h
|
|
return AL char from auxiliary device
|
|
note 1) AUX, COM1, COM2 is unbuffered and not interrupt driven
|
|
2) This function call does not return status or error codes. For greater
|
|
control it is recommended that you use ROM BIOS routine (int 14h) or
|
|
write an AUX device driver and use IOCTL.
|
|
3) At startup, PC-DOS initializes the first auxiliary port (COM1) to 2400
|
|
baud, no parity, one stop bit, and an 8-bit word. MSDOS may differ.
|
|
4) If Ctrl-C is has been entered from STDIN, int 23h is executed.
|
|
|
|
|
|
04h Auxiliary Output
|
|
Write character to STDAUX
|
|
entry AH 04h
|
|
DL char to send to AUX
|
|
return none
|
|
note 1) This function call does not return status or error codes. For greater
|
|
control it is recommended that you use ROM BIOS routine (int 14h) or
|
|
write an AUX device driver and use IOCTL.
|
|
2) If Ctrl-C is has been entered from STDIN, int 23h is executed.
|
|
3) Default is COM1 unless redirected by DOS.
|
|
4) If the device is busy, this function will wait until it is ready.
|
|
|
|
|
|
05h Printer Output
|
|
Write character to STDPRN
|
|
entry AL 05h
|
|
DL character to send
|
|
return none
|
|
note 1) If Ctrl-C is has been entered from STDIN, int 23h is executed.
|
|
2) Default is PRN or LPT1 unless redirected with the MODE command.
|
|
3) If the printer is busy, this function will wait until it is ready.
|
|
|
|
|
|
06h Direct Console I/O
|
|
Get character from STDIN; echo character to STDOUT
|
|
entry AH 06h
|
|
DL 0FFh for console input, or 00h-0FEh for console output
|
|
return ZF zero flag set (1) = no character
|
|
zero flag clear (0) = character recieved
|
|
AL character
|
|
note 1) Extended ASCII codes require two function calls. The first call returns
|
|
00h to indicate the next call will return an extended code.
|
|
2) If DL is not 0FFh, DL is assumed to have a valid character that is
|
|
output to STDOUT.
|
|
3) This function does not check for Ctrl-C or Ctrl-PrtSc.
|
|
4) Does not echo input to screen
|
|
5) If I/O is redirected, EOF or disk full cannot be detected.
|
|
|
|
|
|
07h Direct Console Input Without Echo (does not check BREAK)
|
|
Get or wait for char at STDIN, returns char in AL
|
|
entry AH 07h
|
|
return AL character from standard input device
|
|
note 1) Extended ASCII codes require two function calls. The first call returns
|
|
00h to indicate the next call will return an extended code.
|
|
2) No checking for Ctrl-C or Ctrl-PrtSc is done.
|
|
3) Input is redirectable.
|
|
|
|
|
|
08h Console Input Without Echo (checks BREAK)
|
|
Get or Wait for char at STDIN, return char in AL
|
|
entry AH 08h
|
|
return AL char from standard input device
|
|
note 1) Char is checked for ctrl-C. If ctrl-C is detected, executes int 23h.
|
|
2) For function call 08h, extended ASCII characters require two function
|
|
calls. The first call returns 00h to signify an extended ASCII code.
|
|
The next call returns the actual code.
|
|
3) Input is redirectable. If redirected, there is no way to check EOF.
|
|
|
|
|
|
09h Print String
|
|
Outputs Characters in the Print String to the STDOUT
|
|
entry AH 09h
|
|
DS:DX pointer to the Character String to be displayed
|
|
return none
|
|
note 1) The character string in memory must be terminated by a $ (24h)
|
|
The $ is not displayed.
|
|
2) Output to STDOUT is the same as function call 02h.
|
|
|
|
|
|
0Ah Buffered Keyboard Input
|
|
Reads characters from STDIN and places them in the buffer beginning
|
|
at the third byte.
|
|
entry AH 0Ah
|
|
DS:DX pointer to an input buffer
|
|
return none
|
|
note 1) Min buffer size = 1, max = 255
|
|
2) Char is checked for ctrl-C. If ctrl-C is detected, executes int 23h.
|
|
3) Format of buffer DX:
|
|
byte contents
|
|
1 Maximum number of chars the buffer will take, including CR.
|
|
Reading STDIN and filling the buffer continues until a carriage
|
|
return (<Enter> or 0Dh) is read. If the buffer fills to one less
|
|
than the maximum number the buffer can hold, each additional
|
|
number read is ignored and ASCII 7 (BEL) is output to the
|
|
display until a carriage return is read. (you must set this
|
|
value)
|
|
2 Actual number of characters received, excluding the carriage
|
|
return, which is always the last character. (the function sets
|
|
this value)
|
|
3-n Characters received are placed into the buffer starting here.
|
|
Buffer must be at least as long as the number in byte 1.
|
|
4) Input is redirectable. If redirected, there is no way to check EOF.
|
|
5) The string may be edited with the standard DOS editing commands as it
|
|
is being entered.
|
|
6) Extended ASCII characters are stored as 2 bytes, the first byte being
|
|
zero.
|
|
|
|
|
|
0Bh Check Standard Input (STDIN) status
|
|
Checks for character availible at STDIN
|
|
entry AH 0Bh
|
|
return AL 0FFh if a character is availible from STDIN
|
|
00h if no character is availible from STDIN
|
|
note 1) Checks for Ctrl-C. If Ctrl-C is detected, int 23h is executed
|
|
2) Input can be redirected.
|
|
3) Checks for character only, it is not read into the application
|
|
|
|
|
|
0Ch Clear Keyboard Buffer & Invoke a Keyboard Function (FCB)
|
|
Dumps buffer, executes function in AL (01h,06h,07h,08h,0Ah only)
|
|
entry AH 0Ch
|
|
AL function number (must be 01h, 06h, 07h, 08h, or 0Ah)
|
|
return AL 00h buffer was flushed, no other processing performed
|
|
other any other value has no meaning
|
|
note 1) Forces system to wait until a character is typed.
|
|
2) Flushes all typeahead input, then executes function specified by AL (by
|
|
moving it to AH and repeating the int 21 call).
|
|
3) If AL contains a value not in the list above, the keyboard buffer is
|
|
flushed and no other action is taken.
|
|
|
|
|
|
0Dh Disk Reset
|
|
Flushes all currently open file buffers to disk
|
|
entry AH 0Dh
|
|
return none
|
|
note 1) Does not close files. Does not update directory entries; files changed
|
|
in size but not closed are not properly recorded in the directory
|
|
2) Sets DTA address to DS:0080h
|
|
3) Should be used before a disk change, Ctrl-C handlers, and to flush
|
|
the buffers to disk.
|
|
|
|
|
|
0Eh Select Disk
|
|
Sets the drive specified in DL (if valid) as the default drive
|
|
entry AL 0Eh
|
|
DL new default drive number (0=A:,1=B:,2=C:,etc.)
|
|
return AL total number of logical drives (not nescessarily physical)
|
|
note 1) For DOS 1.x and 2.x, the minimum value for AL is 2.
|
|
2) For DOS 3.x, the minimum value for AL is 5.
|
|
3) The drive number returned is not nescessarily a valid drive.
|
|
4) For DOS 1.x: 16 logical drives are availible. A-P.
|
|
For DOS 2.x: 63 logical drives are availible. (Letters are only used for
|
|
the first 26 drives. If more than 26 logical drives are
|
|
used, further drive letters will be other ASCII characters
|
|
ie {,], etc.
|
|
For DOS 3.x: 26 logical drives are availible. A-Z.
|
|
|
|
|
|
0Fh Open Disk File (FCB)
|
|
Searches current directory for specified filename and opens it
|
|
entry AH 0Fh
|
|
DS:DX pointer to an unopened FCB
|
|
return AL 00h if file found
|
|
0FFh if file not not found
|
|
note 1) If the drive code was 0 (default drive) it is changed to the actual
|
|
drive used (1=A:,2=B:,3=C:, etc). This allows changing the default drive
|
|
without interfering with subsequent operations on this file.
|
|
2) The current block field (FCB bytes C-D, offset 0Ch) is set to zero.
|
|
3) The size of the record to be worked with (FCB bytes E-F, offset 0Eh) is
|
|
set to the system default of 80h. The size of the file (offset 10h) and
|
|
the date (offset 14h) are set from information obtained in the root
|
|
directory. You can change the default value for the record size (FCB
|
|
bytes E-F) or set the random record size and/or current record field.
|
|
Perform these actions after the open but before any disk operations.
|
|
4) The file is opened in compatibility mode.
|
|
5) Microsoft recommends handle function call 3Dh be used instead.
|
|
6) This call is also used by the APPEND command in DOS 3.2+
|
|
7) Before performing a sequential disk operation on the file, you must
|
|
set the Current Record field (offset 20h). Before performing a random
|
|
disk operation on the file, you must set the Relative Record field
|
|
(offset 21h). If the default record size of 128 bytes is incorrect, set
|
|
it to the correct value.
|
|
|
|
|
|
10h Close File (FCB)
|
|
Closes a File After a File Write
|
|
entry AH 10h
|
|
DS:DX pointer to an opened FCB
|
|
return AL 00h if the file is found and closed
|
|
0FFh if the file is not found in the current directory
|
|
note 1) This function call must be done on open files that are no longer needed,
|
|
and after file writes to insure all directory information is updated.
|
|
2) If the file is not found in its correct position in the current
|
|
directory, it is assumed that the diskette was changed and AL returns
|
|
0FFh. This error return is reportedly not completely reliable with DOS
|
|
version 2.x.
|
|
3) If found, the directory is updated to reflect the status in the FCB, the
|
|
buffers to that file are flushed, and AL returns 00h.
|
|
|
|
|
|
11h Search For First Matching Entry (FCB)
|
|
Searches current disk & directory for first matching filename
|
|
entry AH 11h
|
|
DS:DX pointer to address of FCB
|
|
return AL 00h successful match
|
|
0FFh no matching filename found
|
|
note 1) The FCB may contain the wildcard character ? under Dos 2.x, and ? or *
|
|
under 3.x.
|
|
2) The original FCB at DS:DX contains information to continue the search
|
|
with function 12h, and should not be modified.
|
|
3) If a matching filename is found, AL returns 00h and the locations at the
|
|
Disk Transfer Address are set as follows:
|
|
a) If the FCB provided for searching was an extended FCB, then the first
|
|
byte at the disk transfer address is set to 0FFh followed by 5 bytes
|
|
of zeroes, then the attribute byte from the search FCB, then the
|
|
drive number used (1=A, 2=B, etc) then the 32 bytes of the directory
|
|
entry. Thus, the disk transfer address contains a valid unopened FCB
|
|
with the same search attributes as the search FCB.
|
|
b) If the FCB provided for searching was a standard FCB, then the first
|
|
byte is set to the drive number used (1=A,2=b,etc), and the next 32
|
|
bytes contain the matching directory entry. Thus, the disk transfer
|
|
address contains a valid unopened normal FCB.
|
|
4) If an extended FCB is used, the following search pattern is used:
|
|
a) If the FCB attribute byte is zero, only normal file entries are
|
|
found. Entries for volume label, subdirectories, hidden or system
|
|
files, are not returned.
|
|
b) If the attribute byte is set for hidden or system files, or
|
|
subdirectory entries, it is to be considered as an inclusive search.
|
|
All normal file entries plus all entries matching the specified
|
|
attributes are returned. To look at all directory entries except the
|
|
volume label, the attribute byte may be set to hidden + system +
|
|
directory (all 3 bits on).
|
|
c) If the attribute field is set for the volume label, it is considered
|
|
an exclusive search, and ONLY the volume label entry is returned.
|
|
5) This call is also used by the APPEND command in DOS 3.2+
|
|
|
|
|
|
12h Search For Next Entry Using FCB (FCB)
|
|
Search for next matching filename
|
|
entry AH 12h
|
|
DS:DX pointer to the unopened FCB specified from the previous Search
|
|
First (11h) or Search Next (12h)
|
|
return AL 00h if matching filename found
|
|
0FFh if matching filename was not found
|
|
note 1) After a matching filename has been found using function call 11h,
|
|
function 12h may be called to find the next match to an ambiguous
|
|
request. For DOS 2.x, ?'s are allowed in the filename. For DOS 3.x,
|
|
global (*) filename characters are allowed.
|
|
2) The DTA contains info from the previous Search First or Search Next.
|
|
3) All of the FCB except for the name/extension field is used to keep
|
|
information nescessary for continuing the search, so no disk operations
|
|
may be performed with this FCB between a previous function 11h or 12h
|
|
call and this one.
|
|
4) If the file is found, an FCB is created at the DTA address and set up to
|
|
open or delete it.
|
|
|
|
|
|
13h Delete File Via FCB (FCB)
|
|
Deletes file specified in FCB from current directory
|
|
entry AH 13h
|
|
DS:DX pointer to address of FCB
|
|
return AL 00h file deleted
|
|
0FFh if file not found or was read-only
|
|
note 1) All matching current directory entries are deleted. The global filename
|
|
character "?" is allowed in the filename.
|
|
2) Will not delete files with read-only attribute set
|
|
3) Close open files before deleting them.
|
|
4) Requires Network Access Rights
|
|
|
|
|
|
14h Sequential Disk File Read (FCB)
|
|
Reads record sequentially from disk via FCB
|
|
entry AH 14h
|
|
DS:DX pointer to an opened FCB
|
|
return AL 00h successful read
|
|
01h end of file (no data read)
|
|
02h Data Transfer Area too small for record size specified
|
|
or segment overflow
|
|
03h partial record read, EOF found
|
|
note 1) The record size is set to the value at offset 0Eh in the FCB.
|
|
2) The record pointed to by the Current Block (offset 0Ch) and the Current
|
|
Record (offset 20h) fields is loaded at the DTA, then the Current Block
|
|
and Current Record fields are incremented.
|
|
3) The record is read into memory at the current DTA address as specified
|
|
by the most recent call to function 1Ah. If the size of the record and
|
|
location of the DTA are such that a segment overflow or wraparound would
|
|
occur, the error return is set to AL=02h
|
|
4) If a partial record is read at the end of the file, it is passed to the
|
|
requested size with zeroes and the error return is set to AL=03h.
|
|
|
|
|
|
15h Sequential Disk Write (FCB)
|
|
Writes record specified by FCB sequentially to disk
|
|
entry AH 15h
|
|
DS:DX pointer to address of FCB
|
|
return AL 00h successful write
|
|
01h diskette full, write canceled
|
|
02h disk transfer area (DTA) too small or segment wrap
|
|
note 1) The data to write is obtained from the disk transfer area
|
|
2) The record size is set to the value at offset 0Eh in the FCB.
|
|
3) This service cannot write to files set as read-only
|
|
4) The record pointed to by the Current Block (offset 0Ch) and the Current
|
|
Record (offset 20h) fields is loaded at the DTA, then the Current Block
|
|
and Current Record fields are incremented.
|
|
5) If the record size is less than a sector, the data in the DTA is written
|
|
to a buffer; the buffer is written to disk when it contains a full
|
|
sector of data, the file is closed, or a Reset Disk (function 0Dh) is
|
|
issued.
|
|
6) The record is written to disk at the current DTA address as specified
|
|
by the most recent call to function 1Ah. If the size of the record and
|
|
location of the DTA are such that a segment overflow or wraparound would
|
|
occur, the error return is set to AL=02h
|
|
|
|
|
|
16h Create A Disk File (FCB)
|
|
Search and open or create directory entry for file
|
|
entry AH 16h
|
|
DS:DX pointer to an FCB
|
|
return AL 00h successful creation
|
|
0FFh no room in directory
|
|
note 1) If a matching directory entry is found, the file is truncated to zero
|
|
bytes.
|
|
2) If there is no matching filename, a filename is created.
|
|
3) This function calls function 0Fh (Open File) after creating or
|
|
truncating a file.
|
|
4) A hidden file can be created by using an extended FCB with the attribute
|
|
byte (offset FCB-1) set to 2.
|
|
|
|
|
|
17h Rename File Specified by File Control Block (FCB) (FCB)
|
|
Renames file in current directory
|
|
entry AH 17h
|
|
DS:DX pointer to an FCB (see note 4)
|
|
return AL 00h successfully renamed
|
|
0FFh file not found or filename already exists
|
|
note 1) This service cannot rename read-only files
|
|
2) The "?" wildcard may be used.
|
|
3) If the "?" wildcard is used in the second filename, the corresponding
|
|
letters in the filename of the directory entry are not changed.
|
|
4) The FCB must have a drive number, filename, and extension in the usual
|
|
position, and a second filename starting 6 bytes after the first, at
|
|
offset 11h.
|
|
5) The two filenames cannot have the same name.
|
|
6) FCB contains new name starting at byte 17h.
|
|
|
|
|
|
18h Internal to DOS
|
|
* Unknown
|
|
entry AH 18h
|
|
return AL 0
|
|
|
|
|
|
19h Get Current Disk Drive
|
|
Return designation of current default disk drive
|
|
entry AH 19h
|
|
return AL current default drive (0=A, 1=B,etc.)
|
|
note Some other DOS functions use 0 for default, 1=A, 2=B, etc.
|
|
|
|
|
|
1Ah Set Disk Transfer Area Address (DTA)
|
|
Sets DTA address to the address specified in DS:DX
|
|
entry AH 1Ah
|
|
DS:DX pointer to buffer
|
|
return none
|
|
note 1) The default DTA is 128 bytes at offset 80h in the PSP. DOS uses the
|
|
DTA for all file I/O.
|
|
2) Registers are unchanged.
|
|
3) No error codes are returned.
|
|
2) Disk transfers cannot wrap around from the end of the segment to the
|
|
beginning or overflow into another segment.
|
|
|
|
|
|
1Bh Get Current Drive File Allocation Table Information
|
|
Returns information from the FAT on the current drive
|
|
entry AH 1Bh
|
|
exit AL number of sectors per allocation unit (cluster)
|
|
DS:BX address of the current drive's media descriptor byte
|
|
CX number of bytes per sector
|
|
DX number of allocation units (clusters) for default drive
|
|
note 1) Save DS before calling this function.
|
|
2) This call returned a pointer to the FAT in DOS 1.x. Beginning with
|
|
DOS 2.00, it returns a pointer only to the table's ID byte.
|
|
3) IBM recommends programmers avoid this call and use int 25h instead.
|
|
|
|
|
|
1Ch Get File Allocation Table Information for Specific Device
|
|
Returns information on specified drive
|
|
entry AH 1Ch
|
|
DL drive number (1=A, 2=B, 3=C, etc)
|
|
return AL number of sectors per allocation unit (cluster)
|
|
DS:BX address of media descriptor byte for drive in DL
|
|
CX sector size in bytes
|
|
DX number of allocation units (clusters)
|
|
note 1) DL = 0 for default.
|
|
2) Save DS before calling this function.
|
|
3) Format of media-descriptor byte:
|
|
bits: 0 0 (clear) not double sided
|
|
1 (set) double sided
|
|
1 0 (clear) not 8 sector
|
|
1 (set) 8 sector
|
|
2 0 (clear) nonremovable device
|
|
1 (set) removable device
|
|
3-7 always set (1)
|
|
4) This call returned a pointer to the FAT in DOS 1.x. Beginning with
|
|
DOS 2.00, it returns a pointer only to the table's ID byte.
|
|
5) IBM recommends programmers avoid this call and use int 25h instead.
|
|
|
|
|
|
1Dh Not Documented by Microsoft
|
|
* Unknown
|
|
entry AH 1Dh
|
|
return AL 0
|
|
|
|
|
|
1Eh Not Documented by Microsoft
|
|
* Unknown
|
|
entry AH 1Eh
|
|
return AL 0
|
|
note Apparently does nothing
|
|
|
|
|
|
1Fh Get Default Drive Parameter Block
|
|
* Same as function call 32h (below), except that the table is accessed from
|
|
the default drive
|
|
entry AH 1Fh
|
|
other registers unknown
|
|
return AL 00h no error
|
|
0FFh error
|
|
DS:BX points to DOS Disk Parameter Block for default drive.
|
|
note 1) Unknown vector returned in ES:BX.
|
|
2) For DOS 2.x and 3.x, this just invokes function 32h (undocumented,
|
|
Read DOS Disk Block) with DL=0
|
|
|
|
|
|
20h Unknown
|
|
* Internal - does nothing?
|
|
entry AH 20h
|
|
return AL 0
|
|
|
|
|
|
21h Random Read from File Specified by File Control Block (FCB)
|
|
Reads one record as specified in the FCB into the current DTA.
|
|
entry AH 21h
|
|
DS:DX address of the opened FCB
|
|
return AL 00h successful read operation
|
|
01h end of file (EOF), no data read
|
|
02h DTA too small for the record size specified
|
|
03h end of file (EOF), partial data read
|
|
note 1) The current block and current record fields are set to agree with the
|
|
random record field. Then the record addressed by these fields is read
|
|
into memory at the current Disk Transfer Address.
|
|
2) The current file pointers are NOT incremented this function.
|
|
3) If the DTA is larger than the file, the file is padded to the requested
|
|
length with zeroes.
|
|
|
|
|
|
22h Random Write to File Specified by FCB (FCB)
|
|
Writes one record as specified in the FCB to the current DTA
|
|
entry AH 22h
|
|
DS:DX address of the opened FCB
|
|
return AL 00h successful write operation
|
|
01h disk full; no data written (write was canceled)
|
|
02h DTA too small for the record size specified (write was
|
|
canceled)
|
|
note 1) This service cannot write to read-only files.
|
|
2) The record pointed to by the Current Block (offset 0Ch) and the Current
|
|
Record (offset 20h) fields is loaded at the DTA, then the Current Block
|
|
and Current Record fields are incremented.
|
|
3) If the record size is less than a sector, the data in the DTA is written
|
|
to a buffer; the buffer is written to disk when it contains a full
|
|
sector of data, the file is closed, or a Reset Disk (function 0Dh) is
|
|
issued.
|
|
4) The current file pointers are NOT incremented this function.
|
|
5) The record is written to disk at the current DTA address as specified
|
|
by the most recent call to function 1Ah. If the size of the record and
|
|
location of the DTA are such that a segment overflow or wraparound would
|
|
occur, the error return is set to AL=02h
|
|
|
|
|
|
23h Get File Size (FCB)
|
|
Searches current subdirectory for matching file, returns size in FCB
|
|
entry AH 23h
|
|
DS:DX address of an unopened FCB
|
|
return AL 00h file found
|
|
0FFh file not found
|
|
note 1) Record size field (offset 0Eh) must be set before invoking this function
|
|
2) The disk directory is searched for the matching entry. If a matching
|
|
entry is found, the random record field is set to the number of records
|
|
in the file. If the value of the Record Size field is not an even
|
|
divisor of the file size, the value set in the relative record field is
|
|
rounded up. This gives a returned value larger than the actual file size
|
|
3) This call is used by the APPEND command in DOS 3.2+
|
|
|
|
|
|
24h Set Relative Record Field (FCB)
|
|
Set random record field specified by an FCB
|
|
entry AH 24h
|
|
DS:DX address of an opened FCB
|
|
return Random Record Field of FCB is set to be same as Current Block
|
|
and Current Record.
|
|
note 1) You must invoke this function before performing random file access.
|
|
2) The relative record field of FCB (offset 21h) is set to be same as the
|
|
Current Block (offset 0Ch) and Current Record (offset 20h).
|
|
3) No error codes are returned.
|
|
4) The FCB must already be opened.
|
|
|
|
|
|
25h Set Interrupt Vector
|
|
Sets the address of the code DOS is to perform each time the specified
|
|
interrupt is invoked.
|
|
entry AH 25h
|
|
AL int number to reassign the handler to
|
|
DS:DX address of new interrupt vector
|
|
return none
|
|
note 1) Registers are unchanged.
|
|
2) No error codes are returned.
|
|
3) The interrupt vector table for the interrupt number specified in AL
|
|
is set to the address contained in DS:DX. Use function 35h (Get Vector)
|
|
to get the contents of the interrupt vector and save it for later use.
|
|
4) When you use function 25 to set an interrupt vector, DOS 3.2 doesn't
|
|
point the actual interrupt vector to what you requested. Instead, it
|
|
sets the interrupt vector to point to a routine inside DOS, which does
|
|
this:
|
|
1. Save old stack pointer
|
|
2. Switch to new stack pointer allocated from DOS's stack pool
|
|
3. Call your routine
|
|
4. Restore old stack pointer
|
|
The purpose for this was to avoid possible stack overflows when there
|
|
are a large number of active interrupts. IBM was concerned (this was an
|
|
IBM change, not Microsoft) that on a Token Ring network there would be
|
|
a lot of interrupts going on, and applications that hadn't allocated
|
|
very much stack space would get clobbered.
|
|
|
|
|
|
26h Create New Program Segment Prefix (PSP)
|
|
This service copies the current program-segment prefix to a new memory
|
|
location for the creation of a new program or overlay. Once the new PSP is
|
|
in place, a DOS program can read a DOS COM or overlay file into the memory
|
|
location immediately following the new PSP and pass control to it.
|
|
entry AH 26h
|
|
DX segment number for the new PSP
|
|
return none
|
|
note 1) Microsoft recommends you use the newer DOS service 4Bh (EXEC) instead.
|
|
2) The entire 100h area at location 0 in the current PSP is copied into
|
|
location 0 of the new PSP. The memory size information at location 6
|
|
in the new segment is updated and the current termination, ctrl-break,
|
|
and critical error addresses from interrupt vector table entries for
|
|
ints 22h, 23h, and 24 are saved in the new program segment starting at
|
|
0Ah. They are restored from this area when the program terminates.
|
|
3) Current PSP is copied to specified segment
|
|
|
|
|
|
27h Random Block Read From File Specified by FCB (FCB)
|
|
Similar to 21h (Random Read) except allows multiple files to be read.
|
|
entry AH 27h
|
|
CX number of records to be read
|
|
DS:DX address of an opened FCB
|
|
return AL 00h successful read
|
|
01h end of file, no data read
|
|
02h DTA too small for record size specified (read canceled)
|
|
03h end of file
|
|
CX actual number of records read (includes partial if AL=03h)
|
|
note 1) The record size is specified in the FCB. The service updates the Current
|
|
Block (offset 0Ch) and Current Record (offset 20h) fields to the next
|
|
record not read.
|
|
2) If CX contained 0 on entry, this is a NOP.
|
|
3) If the DTA is larger than the file, the file is padded to the requested
|
|
length with zeroes.
|
|
4) This function assumes that the FCB record size field (0Eh) is correctly
|
|
set. If not set by the user, the default is 128 bytes.
|
|
5) The record is written to disk at the current DTA address as specified
|
|
by the most recent call to function 1Ah. If the size of the record and
|
|
location of the DTA are such that a segment overflow or wraparound would
|
|
occur, the error return is set to AL=02h
|
|
|
|
|
|
28h Random Block Write to File Specified in FCB (FCB)
|
|
Similar to 27h (Random Write) except allows multiple files to be read.
|
|
entry AH 28h
|
|
CX number of records to write
|
|
DS:DX address of an opened FCB
|
|
return AL 00h successful write
|
|
01h disk full, no data written
|
|
02h DTA too small for record size specified (write canceled)
|
|
CX number of records written
|
|
note 1) The record size is specified in the FCB.
|
|
2) This service allocates disk clusters as required.
|
|
3) This function assumes that the FCB Record Size field (offset 0Eh) is
|
|
correctly set. If not set by the user, the default is 128 bytes.
|
|
4) The record size is specified in the FCB. The service updates the Current
|
|
Block (offset 0Ch) and Current Record (offset 20h) fields to the next
|
|
record not read.
|
|
5) The record is written to disk at the current DTA address as specified
|
|
by the most recent call to function 1Ah. If the size of the record and
|
|
location of the DTA are such that a segment overflow or wraparound would
|
|
occur, the error return is set to AL=02h
|
|
6) If called with CX=0, no records are written, but the FCB's File Size
|
|
entry (offset 1Ch) is set to the size specified by the FCB's Relative
|
|
Record field (offset 21h).
|
|
|
|
|
|
29h Parse the Command Line for Filename (FCB)
|
|
Parses a text string into the fields of a File Control Block
|
|
entry AH 29h
|
|
DS:SI pointer to string to parse
|
|
ES:DI pointer to memory buffer to fill with unopened FCB
|
|
AL bit mask to control parsing
|
|
bit 0 = 0: parsing stops if file seperator found
|
|
1: causes service to scan past leading chars such as
|
|
blanks. Otherwise assumes the filename begins in
|
|
the first byte
|
|
1 = 0: drive number in FCB set to default (0) if string
|
|
contains no drive number
|
|
1: drive number in FCB not changed
|
|
2 = 0: filename in FCB set to 8 blanks if no filename in
|
|
string
|
|
1: filename in FCB not changed if string does not
|
|
contain a filename
|
|
3 = 0: extension in FCB set to 3 blanks if no extension in
|
|
string
|
|
1: extension left unchanged
|
|
4-7 must be zero
|
|
return AL 00h no wildcards in name or extension
|
|
01h wildcards appeared in name or extension
|
|
0FFh invalid drive specifier
|
|
DS:SI pointer to the first character after the parsed string
|
|
ES:DI pointer to the unopened FCB
|
|
note 1) If the * wildcard characters are found in the command line, this service
|
|
will replace all subsequent chars in the FCB with question marks.
|
|
2) This service uses the characters as filename separators
|
|
DOS 1 : ; . , + / [ ] = " TAB SPACE
|
|
DOS 2,3 : ; . , + = TAB SPACE
|
|
3) This service uses the characters
|
|
: ; . , + < > | / \ [ ] = " TAB SPACE
|
|
or any control characters as valid filename separators
|
|
4) A filename cannot contain a filename terminator. If one is encountered,
|
|
all processing stops. The handle functions will allow use of some of
|
|
these characters.
|
|
5) If no valid filename was found on the command line, ES:DI +1 points
|
|
to a blank (ASCII 32).
|
|
6) This function cannot be used with filespecs which include a path
|
|
7) Parsing is in the form D:FILENAME.EXT. If one is found, a corresponding
|
|
unopened FCB is built at ES:DI
|
|
|
|
|
|
2Ah Get Date
|
|
Returns day of the week, year, month, and date
|
|
entry AH 2Ah
|
|
return CX year (1980-2099)
|
|
DH month (1-12)
|
|
DL day (1-31)
|
|
AL weekday 00h Sunday
|
|
01h Monday
|
|
02h Tuesday
|
|
03h Wednesday
|
|
04h Thursday
|
|
05h Friday
|
|
06h Saturday
|
|
note 1) Date is adjusted automatically if clock rolls over to the next day,
|
|
and takes leap years and number of days in each month into account.
|
|
2) Although DOS cannot set an invalid date, it can read one, such as
|
|
1/32/80, etc.
|
|
3) DesQview also accepts CX = 4445h and DX = 5351h, i.e. 'DESQ' as valid
|
|
4) DOS will accept CH=0 (midnight) as a valid time, but if a file's time
|
|
is set to exactly midnight the time will not be displayed by the DIR
|
|
command.
|
|
|
|
|
|
2Bh Set Date
|
|
set current system date
|
|
entry AH 2Bh
|
|
CX year (1980-2099)
|
|
DH month (1-12)
|
|
DL day (1-31)
|
|
return AL 00h no error (valid date)
|
|
0FFh invalid date specified
|
|
note 1) On entry, CX:DX must have a valid date in the same format as returned
|
|
by function call 2Ah
|
|
2) DOS 3.3 also sets CMOS clock
|
|
|
|
|
|
2Ch Get Time
|
|
Get current system time from CLOCK$ driver
|
|
entry AH 2Ch
|
|
return CH hours (0-23)
|
|
CL minutes (0-59)
|
|
DH seconds (0-59)
|
|
DL hundredths of a second (0-99)
|
|
note 1) Time is updated every 5/100 second.
|
|
2) The date and time are in binary format
|
|
|
|
|
|
2Dh Set Time
|
|
Sets current system time
|
|
entry AH 2Dh
|
|
CH hours (0-23)
|
|
CL minutes (0-59)
|
|
DH seconds (0-59)
|
|
DL hundredths of seconds (0-99)
|
|
return AL 00h if no error
|
|
0FFh if bad value sent to routine
|
|
note 1) DOS 3.3 also sets CMOS clock
|
|
2) CX and DX must contain a valid time in binary
|
|
|
|
|
|
2Eh Set/Reset Verify Switch
|
|
Set verify flag
|
|
entry AH 2Eh
|
|
AL 00 to turn verify off (default)
|
|
01 to turn verify on
|
|
return none
|
|
note 1) This is the call invoked by the DOS VERIFY command
|
|
2) Setting of the verify switch can be obtained by calling call 54h
|
|
3) This call is not supported on network drives
|
|
4) DOS checks this flag each time it accesses a disk
|
|
|
|
|
|
2Fh Get Disk Transfer Address (DTA)
|
|
Returns current disk transfer address used by all DOS read/write operations
|
|
entry AH 2Fh
|
|
return ES:BX address of DTA
|
|
note 1) The DTA is set by function call 1Ah
|
|
2) Default DTA address is a 128 byte buffer at offset 80h in that program's
|
|
Program Segment Prefix
|
|
|
|
|
|
30h Get DOS Version Number
|
|
Return DOS version and/or user number
|
|
entry AH 30h
|
|
return AH minor version number (i.e., DOS 2.10 returns AX = 0A02h)
|
|
AL major version number
|
|
BH OEM ID number
|
|
00h IBM
|
|
16h DEC
|
|
BL:CX 24-bit user serial number
|
|
note 1) If AL returns a major version number of zero, the DOS version is
|
|
below 1.28 for MSDOS and below 2.00 for PCDOS.
|
|
2) IBM PC-DOS always returns 0000h in BX and CX.
|
|
|
|
|
|
31h Terminate Process and Stay Resident
|
|
KEEP, or TSR
|
|
entry AH 31h
|
|
AL exit code
|
|
DX program memory requirement in 16 byte paragraphs
|
|
return AX return code (retrieveable by function 4Dh)
|
|
note 1) Files opened by the application are not closed when this call is made
|
|
2) Memory can be used more efficiently if the block containing the copy of
|
|
the DOS environment is deallocated before terminating. This can be done
|
|
by loading ES with the segment contained in 2Ch of the PSP and issuing
|
|
function call 49h (Free Allocated Memory).
|
|
3) Unlike int 27h, more than 64k may be made resident with this call
|
|
|
|
|
|
32h Read DOS Disk Block
|
|
* Retrieve the pointer to the drive parameter block for a drive
|
|
entry AH 32h
|
|
DL drive (0=default, 1=A:, etc.).
|
|
return AL 00h if drive is valid
|
|
0FFh if drive is not valid
|
|
DS:BX points to DOS Drive Parameter Table. Format of block:
|
|
Bytes Type Value
|
|
00h byte Drive: 0=A:, 1=B:, etc.
|
|
01h byte Unit within drive (0, 1, 2, etc.)
|
|
02h-03h word Bytes per sector
|
|
04h byte Sectors per cluster - 1
|
|
05h byte Cluster to sector shift (i.e., how far to shift-
|
|
left the bytes/sector to get bytes/cluster)
|
|
06h-07h word Number of reserved (boot) sectors
|
|
08h byte Number of FATs
|
|
09h-0Ah word Number of root directory entries
|
|
0Bh-0Ch word Sector # of 1st data. Should be same as # of
|
|
sectors/track.
|
|
0Dh-0Eh word # of clusters + 1 (=last cluster #)
|
|
0Fh byte Sectors for FAT
|
|
10h-11h word First sector of root directory
|
|
12h-15h dword Address of device driver header for this drive
|
|
16h byte Media Descriptor Byte for this drive
|
|
17h byte Zero if disk has been accessed
|
|
18h-1Bh dword address of next DOS Disk Block (0FFFFh means
|
|
last in chain)
|
|
22h byte Current Working Directory (2.0 only) (64 bytes)
|
|
note 1) Use [BX+0D] to find no. of clusters (>1000H, 16-bit FAT; if not, 12-bit
|
|
(exact dividing line is probably a little below 1000h to allow for
|
|
bad sectors, EOF markers, etc.)
|
|
2) Short article by C.Petzold, PC Magazine Vol.5,no.8, and the article
|
|
"Finding Disk Parameters" in the May 1986 issue of PC Tech Journal.
|
|
3) This call is mostly supported in OS/2 1.0's DOS Compatibility Box. The
|
|
dword at 12h will not return the address of the next device driver when
|
|
in the Compatibility Box.
|
|
|
|
|
|
33h Control-Break Check
|
|
Get or set control-break checking at CON
|
|
entry AH 33h
|
|
AL 00h to test for break checking
|
|
01h to set break checking
|
|
DL 00h to disable break checking
|
|
01h to enable break checking
|
|
02h internal, called by PRINT.COM (DOS 3.1)
|
|
return DL 00h if break=off
|
|
01h if break=on
|
|
AL 0FFh error
|
|
|
|
|
|
34h Return INDOS Flag
|
|
* Returns ES:BX pointing to Critical Section Flag, byte indicating whether
|
|
it is safe to interrupt DOS.
|
|
entry AH 34h
|
|
return ES:BX points to DOS "critical section flag"
|
|
note 1) If byte is 0, it is safe to interrupt DOS. This was mentioned in some
|
|
documentation by Microsoft on a TSR standard, and PC Magazine reports
|
|
it functions reliably under DOS versions 2.0 through 3.3. Chris
|
|
Dunford (of CED fame) and a number of anonymous messages on the BBSs
|
|
indicate it may not be totally reliable.
|
|
2) The byte at ES:BX+1 is used by the Print program for this same purpose,
|
|
so it's probably safer to check the WORD at ES:BX.
|
|
3) Reportedly, examination of DOS 2.10 code in this area indicates that the
|
|
byte immediately following this "critical section flag" must be 00h to
|
|
permit the PRINT.COM interrupt to be called. For DOS 3.0 and 3.1 (except
|
|
Compaq DOS 3.0), the byte before the "critical section flag" must be
|
|
zero; for Compaq DOS 3.0, the byte 01AAh before it must be zero.
|
|
4) In DOS 3.10 this reportedly changed to word value, with preceding byte.
|
|
5) This call is supported in OS/2 1.0's DOS Compatibility Box
|
|
6) Gordon Letwin of Microsoft discussed this call on ARPAnet in 1984. He
|
|
stated:
|
|
a) this is not supported under any version of the DOS
|
|
b) it usually works under DOS 2, but there may be circumstances
|
|
when it doesn't (general disclaimer, don't know of a specific
|
|
circumstance)
|
|
c) it will usually not work under DOS 3 and DOS 3.1; the DOS is
|
|
considerably restructured and this flag takes on additional
|
|
meanings and uses
|
|
d) it will fail catastrophically under DOS 4.0 and forward.
|
|
Obviously this information is incorrect since the call works fine
|
|
through DOS 3.3. Microsoft glasnost?
|
|
|
|
|
|
35h Get Vector
|
|
Get interrupt vector
|
|
entry AH 35h
|
|
AL interrupt number (hexadecimal)
|
|
return ES:BX address of interrupt vector
|
|
note Use function call 25h to set the interrupt vectors
|
|
|
|
|
|
36h Get Disk Free Space
|
|
get information on specified drive
|
|
entry AH 36h
|
|
DL drive number (0=default, 1=A:, 2=B:, etc)
|
|
return AX number of sectors per cluster
|
|
0FFFFh means drive specified in DL is invalid
|
|
BX number of availible clusters
|
|
CX bytes per sector
|
|
DX clusters per drive
|
|
note 1) Mult AX * CX * BX for free space on disk
|
|
2) Mult AX * CX * DX for total disk space
|
|
3) Function 36h returns an incorrect value after an ASSIGN command. Prior
|
|
to ASSIGN, the DX register contains 0943h on return, which is the free
|
|
space in clusters on the HC diskette. After ASSIGN, even with no
|
|
parameters, 0901h is returned in the DX register; this is an incorrect
|
|
value. Similar results occur with DD diskettes on a PC-XT or a PC-AT.
|
|
This occurs only when the disk is not the default drive. Results are as
|
|
expected when the drive is the default drive. Therefore, the
|
|
circumvention is to make the desired drive the default drive prior to
|
|
issuing this function call.
|
|
4) Int 21h, function call 36h returns an incorrect value after an ASSIGN
|
|
command. Prior to ASSIGN, the DX register contains 0943h on return,
|
|
which is the free space in clusters on the HC diskette. After ASSIGN,
|
|
even with no parameters, 0901h is returned in the DX register; this is
|
|
an incorrect value. Similar results occur with DD diskettes on a PC-XT
|
|
or a PC-AT. This occurs only when the disk is not the default drive.
|
|
Results are as expected when the drive is the default drive. Therefore,
|
|
the circumvention is to make the desired drive the default drive prior
|
|
to issuing this function call.
|
|
5) This function supercedes functions 1Bh and 1Ch.
|
|
|
|
|
|
37h SWITCHAR / AVAILDEV
|
|
* Get/set option marking character (is usually "/"), and device type
|
|
entry AH 37h
|
|
AL 00h read switch character (returns current character in DL)
|
|
01h set character in DL as new switch character
|
|
(DOS 2.x) 02h read device availability (as set by function AL=3) into
|
|
DL. A 0 means devices that devices must be accessed in
|
|
file I/O calls by /dev/device. A non-zero value means
|
|
that devices are accessible at every level of the
|
|
directory tree (e.g., PRN is the printer and not a file
|
|
PRN).
|
|
AL=2 to return flag in DL, AL=3 to set from DL (0 = set,
|
|
1 = not set).
|
|
(DOS 2.x) 03h get device availability, where:
|
|
DL 00h means /dev/ must precede device names
|
|
01h means /dev/ need not precede device names
|
|
return DL switch character (if AL=0 or 1)
|
|
device availability flag (if AL=2 or 3)
|
|
AL 0FFh the value in AL was not in the range 0-3.
|
|
note 1) Functions 2 & 3 appear not to be implemented for DOS 3.x.
|
|
2) It is documented on page 4.324 of the MS-DOS (version 2) Programmer's
|
|
Utility Pack (Microsoft - published by Zenith).
|
|
3) Works on all versions of IBM PC-DOS from 2.0 through 3.3.1.
|
|
4) The SWITCHAR is the character used for "switches" in DOS command
|
|
arguments (defaults to '/', as in "DIR/P"). '-' is popular to make a
|
|
system look more like UNIX; if the SWITCHAR is anything other than '/',
|
|
then '/' may be used instead of '\' for pathnames
|
|
5) Ignored by XCOPY, PKARC, LIST
|
|
6) SWITCHAR may not be set to any character used in a filename
|
|
7) In DOS 3.x you can still read the "AVAILDEV" byte with subfunction 02h
|
|
but it always returns 0FFh even if you try to change it to 0 with
|
|
subfunction 03h.
|
|
8) AVAILDEV=0 means that devices must be referenced in an imaginary
|
|
subdirectory "\dev" (similar to UNIX's /dev/*); a filename "PRN.DAT"
|
|
can be created on disk and manipulated like any other. If AVAILDEV != 0
|
|
then device names are recognized anywhere (this is the default):
|
|
"PRN.DAT" is synonymous with "PRN:".
|
|
9) These functions reportedly are not supported in the same fashion in
|
|
various implementations of DOS.
|
|
|
|
|
|
38h Return Country Dependent Information (PCDOS 2.0, 2.1, MSDOS 2.00 only)
|
|
get country-dependent information
|
|
entry AH 38h
|
|
AL function code (must be 0 in DOS 2.x)
|
|
DS:DX pointer to 32 byte memory area
|
|
return AX error code if CF set
|
|
DS:DX country data if CF not set
|
|
word date/time format
|
|
0 = USA standard H:M:S M/D/Y
|
|
1 = European standard H:M:S D/M/Y
|
|
2 = Japanese standard H:M:S D:M:Y
|
|
byte ASCIIZ string currency symbol followed by byte of zeroes
|
|
byte ASCIIZ string thousands separator followed by byte of
|
|
zeroes
|
|
byte ASCIIZ string decimal separator followed by byte of
|
|
zeroes
|
|
24 bytes reserved
|
|
|
|
|
|
38h Get Country Dependent Information (PCDOS 3.x+, MSDOS 2.01+)
|
|
get country-dependent information
|
|
entry AH 38h
|
|
AL function code
|
|
00h to get current country information
|
|
code country code to get information for, for countries
|
|
with codes less than 255
|
|
0FFh to get country information for countries with a code
|
|
greater than 255
|
|
BX 16 bit country code if AL=0FFh
|
|
DS:DX pointer to the memory buffer where the data will be returned
|
|
return CF 0 (clear) function completed
|
|
1 (set) error
|
|
AX error code if CF set
|
|
2 invalid country code (no table for it)
|
|
BX country code (usually international telephone code)
|
|
DS:DX country data if CF not set
|
|
word date/time format
|
|
0 = USA standard H:M:S M/D/Y
|
|
1 = European standard H:M:S D/M/Y
|
|
2 = Japanese standard H:M:S D:M:Y
|
|
5 bytes currency symbol null terminated
|
|
2 bytes thousands separator null terminated
|
|
2 bytes decimal separator null terminated
|
|
2 bytes date separator null terminated
|
|
2 bytes time separator null terminated
|
|
byte bit field currency format
|
|
bit 0 = 0 if currency symbol precedes the value
|
|
1 if currency symbol is after the value
|
|
bit 1 = 0 no spaces between value and currency symbol
|
|
1 one space between value and currency symbol
|
|
bits 2-7 not defined by Microsoft
|
|
byte number of significant decimal digits in currency
|
|
(number of places to right of decimal point)
|
|
byte time format
|
|
bit 0 = 0 12 hour clock
|
|
bit 0 = 1 24 hour clock
|
|
2 words case map call address
|
|
entry AL ASCII code of character to be converted to
|
|
uppercase
|
|
return AL ASCII code of the uppercase input character
|
|
2 bytes data list separator null terminated
|
|
5 words reserved
|
|
note 1) When an alternate keyboard handler is invoked, the keyboard routine is
|
|
loaded into user memory starting at the lowest portion of availible
|
|
user memory. The BIOS interrupt vector that services the keyboard is
|
|
redirected to the memory area where the new routine resides. Each new
|
|
routine takes up about 1.6K of memory and has lookup tables that return
|
|
values unique to each language. (KEYBxx in the DOS book)
|
|
Once the keyboard interrupt vector is changed by the DOS keyboard
|
|
routine, the new routine services all calls unless the system is
|
|
returned to the US format by the ctrl-alt-F1 keystroke combination. This
|
|
does not change the interrupt vector back to the BIOS location; it
|
|
merely passes the table lookup to the ROM locations.
|
|
2) Ctrl-Alt-F1 will only change systems with US ROMS to the US layout.
|
|
Some systems are delivered with non-US keyboard handler routines in ROM
|
|
3) Case mapping call: the segment/offset of a FAR procedure that performs
|
|
country-specific lower-to-upper case mapping on ASCII characters 80h to
|
|
0FFh. It is called with the character to be mapped in AL. If there is
|
|
an uppercase code for the letter, it is returned in AL, if there is no
|
|
code or the function was called with a value of less than 80h AL is
|
|
returned unchanged.
|
|
|
|
|
|
38h Set Country Dependent Information
|
|
set country-dependent information
|
|
entry AH 38h
|
|
AL code country code to set information for, for countries
|
|
with codes less than 255
|
|
0FFh to set country information for countries with a code
|
|
greater than 255
|
|
BX 16 bit country code if AL=0FFh
|
|
DX 0FFFFh
|
|
return CF clear successful
|
|
set if error
|
|
AX error code if CF flag set
|
|
|
|
|
|
39h Create Subdirectory (MKDIR)
|
|
Makes a subdirectory along the indicated path
|
|
entry AH 39h
|
|
DS:DX address of ASCIIZ pathname string
|
|
return flag CF 0 successful
|
|
1 error
|
|
AX error code if any (3, 5)
|
|
note 1) The ASCIIZ string may contain drive and subdirectory.
|
|
2) Drive may be any valid drive (not nescessarily current drive)
|
|
3) The pathname cannot exceed 64 characters
|
|
|
|
|
|
3Ah Remove Subdirectory (RMDIR)
|
|
remove a directory entry
|
|
entry AH 3Ah
|
|
DS:DX address of ASCIIZ pathname string
|
|
return CF clear successful
|
|
set AX error code if any (3, 5, 16)
|
|
note 1) The ASCIIZ string may contain drive and subdirectory.
|
|
2) Drive may be any valid drive (not nescessarily current drive)
|
|
3) The pathname cannot exceed 64 characters
|
|
|
|
|
|
3Bh Change Current Directory
|
|
(CHDIR)
|
|
entry AH 3Bh
|
|
DS:DX address of ASCIIZ string
|
|
return flag CF 0 successful
|
|
1 error
|
|
AX error code if any (3)
|
|
note 1) The pathname cannot exceed 64 characters
|
|
2) The ASCIIZ string may contain drive and subdirectory.
|
|
3) Drive may be any valid drive (not nescessarily current drive)
|
|
|
|
|
|
3Ch Create A File (CREAT)
|
|
create a file with handle
|
|
entry AH 3Ch
|
|
CX attributes for file
|
|
00h normal
|
|
01h read only
|
|
02h hidden
|
|
03h system
|
|
DS:DX address of ASCIIZ filename string
|
|
return flag CF 0 successful creation
|
|
1 error
|
|
AX 16 bit file handle
|
|
or error code (3, 4, 5)
|
|
note 1) The ASCIIZ string may contain drive and subdirectory.
|
|
2) Drive may be any valid drive (not nescessarily current drive)
|
|
3) If the volume label or subdirectory bits are set in CX, they are ignored
|
|
4) The file is opened in read/write mode
|
|
5) If the file does not exist, it is created. If one of the same name
|
|
exists, it is truncated to a length of 0.
|
|
|
|
|
|
3Dh Open A File
|
|
Open disk file with handle
|
|
entry AH 3Dh
|
|
AL access code byte
|
|
(DOS 2.x) bits 0-2 file attribute
|
|
000 read only
|
|
001 write only
|
|
010 read/write
|
|
bits 3-7 should be set to zero
|
|
(DOS 3.x) bits 0-2 file attribute
|
|
000 read only
|
|
001 write only
|
|
010 read/write
|
|
bit 3 reserved
|
|
0 should be set to zero
|
|
bits 4-6 sharing mode (network)
|
|
000 compatibility mode (the way FCBs open files)
|
|
001 read/write access denied (exclusive)
|
|
010 write access denied
|
|
011 read access denied
|
|
100 full access permitted
|
|
bit 7 inheritance flag
|
|
0 file inherited by child process
|
|
1 file private to child process
|
|
DS:DX address of ASCIIZ pathname string
|
|
return flag CF set on error
|
|
AX error code
|
|
1 error
|
|
AX 16 bit file handle
|
|
or error code (1, 2, 4, 5, 0Ch)
|
|
note 1) Opens any normal, system, or hidden file
|
|
2) Files that end in a colon are not opened
|
|
3) The rear/write pointer is set at the first byte of the file and the
|
|
record size of the file is 1 byte (the read/write pointer can be changed
|
|
through function call 42h). The returned file handle must be used for
|
|
all subsequent input and output to the file.
|
|
4) If the file handle was inherited from a parent process or was
|
|
duplicated by DUP or FORCEDUP, all sharing and access restrictions are
|
|
also inherited.
|
|
5) A file sharing error (error 1) causes an int 24h to execute with an
|
|
error code of 2
|
|
|
|
|
|
3Eh Close A File Handle
|
|
Close a file and release handle for reuse
|
|
entry AH 3Eh
|
|
BX file handle
|
|
return flag CF 0 successful close
|
|
1 error
|
|
AX error code if error (6)
|
|
note 1) When executed, the file is closed, the directory is updated, and all
|
|
buffers for that file are flushed. If the file was changed, the time
|
|
and date stamps are changed to current
|
|
2) If called with the handle 00000, it will close STDIN (normally the
|
|
keyboard).
|
|
|
|
|
|
3Fh Read From A File Or Device
|
|
Read from file with handle
|
|
entry AH 3Fh
|
|
BX file handle
|
|
CX number of bytes to read
|
|
DS:DX address of buffer
|
|
return flag CF 0 successful read
|
|
1 error
|
|
AX 0 pointer was already at end of file
|
|
or number of bytes read
|
|
or error code (5, 6)
|
|
note 1) This function attempts to transfer the number of bytes specified in CX
|
|
to a buffer location. It is not guaranteed that all bytes will be read.
|
|
If AX < CX a partial record was read.
|
|
2) If performed from STDIN (file handle 0000), the input can be redirected
|
|
3) If used to read the keyboard, it will only read to the first CR
|
|
4) The file pointer is incremented to the last byte read.
|
|
|
|
|
|
40h Write To A File Or Device
|
|
Write to file with handle
|
|
entry AH 40h
|
|
BX file handle
|
|
CX number of bytes to write
|
|
DS:DX address of buffer
|
|
return flag CF 0 successful write
|
|
1 error
|
|
AX number of bytes written
|
|
or error code (5, 6)
|
|
note 1) This call attempts to transfer the number of bytes indicated in CX
|
|
from a buffer to a file. If CX and AX do not match after the write,
|
|
an error has taken place; however no error code will be returned for
|
|
this problem. This is usually caused by a full disk.
|
|
2) If the write is performed to STDOUT (handle 0001), it may be redirected
|
|
3) To truncate the file at the current position of the file pointer, set
|
|
the number of bytes in CX to zero before calling int 21h. The pointer
|
|
can be moved to any desired position with function 42h.
|
|
4) This function will not write to a file or device marked read-only.
|
|
|
|
|
|
41h Delete A File From A Specified Subdirectory
|
|
(UNLINK)
|
|
entry AH 41h
|
|
DS:DX pointer to ASCIIZ filespec to delete
|
|
return CF 0 successful
|
|
1 error
|
|
AX error code if any (2, 5)
|
|
note 1) This function will not work on a file marked read-only
|
|
2) Wildcards are not accepted
|
|
|
|
|
|
42h Move a File Read/Write Pointer
|
|
(LSEEK)
|
|
entry AH 42h
|
|
AL method code
|
|
00h offset from beginning of file
|
|
01h offset from present location
|
|
02h offset from end of file
|
|
BX file handle
|
|
CX most significant half of offset
|
|
DX least significant half of offset
|
|
return AX low offset of new file pointer
|
|
DX high offset of new file pointer
|
|
CF 0 successful move
|
|
1 error
|
|
AX error code (1, 6)
|
|
note 1) If pointer is at end of file, reflects file size in bytes.
|
|
2) The value in DX:AX is the absolute 32 bit byte offset from the beginning
|
|
of the file
|
|
|
|
|
|
43h Get/Set file attributes
|
|
(CHMOD)
|
|
entry AH 43h
|
|
AL 00h get file attributes
|
|
01h set file attributes
|
|
CX file attributes to set
|
|
bit 0 read only
|
|
1 hidden file
|
|
2 system file
|
|
3 volume label
|
|
4 subdirectory
|
|
5 written since backup
|
|
DS:DX pointer to full ASCIIZ file name
|
|
return CF set if error
|
|
AX error code (1, 2, 3, 5)
|
|
CX file attributes on get
|
|
attributes:
|
|
01h read only
|
|
02h hidden
|
|
04h system
|
|
0FFh archive
|
|
|
|
|
|
44h I/O Control for Devices (IOCTL)
|
|
Get or set device information
|
|
entry AH 44h
|
|
AL 00h get device information (from DX)
|
|
BX file or device handle
|
|
return DX device info
|
|
If bit 7 set: (character device)
|
|
bit 0: console input device
|
|
1: console output device
|
|
2: NUL device
|
|
3: CLOCK$ device
|
|
4: device is special
|
|
5: binary (raw) mode
|
|
6: Not EOF
|
|
12: network device (DOS 3.x)
|
|
14: can process IOCTL control
|
|
strings (func 2-5)
|
|
If bit 7 clear: (file)
|
|
bits 0-5 are block device number
|
|
6: file has not been written
|
|
12: Network device (DOS 3.x)
|
|
15: file is remote (DOS 3.x)
|
|
01h set device information (DH must be zero for this call)
|
|
DX bits:
|
|
0 1 console input device
|
|
1 1 console output device
|
|
2 1 null device
|
|
3 1 clock device
|
|
4 1 reserved
|
|
5 0 binary mode - don't check for control chars
|
|
1 cooked mode - check for control chars
|
|
6 0 EOF - End Of File on input
|
|
7 device is character device if set, if not, EOF
|
|
is 0 if channel has been written, bits 0-5 are
|
|
block device number
|
|
12 network device
|
|
14 1 can process control strings (AL 2-5, can only be
|
|
read, cannot be set)
|
|
15 n reserved
|
|
02h read CX bytes to device in DS:DX from BX control chan
|
|
03h Write Device Control String
|
|
BX device handle
|
|
CX number of bytes to write
|
|
DS:DX pointer to buffer
|
|
return AX number of bytes written
|
|
04h read from block device (drive number in BL)
|
|
BL drive number (0=default)
|
|
CX number of bytes to read
|
|
DS:DX pointer to buffer
|
|
return AX number of bytes read
|
|
|
|
05h write to block device (drive number in BL)
|
|
AX number of bytes transfered
|
|
06h get input handle status
|
|
07h get output handle status
|
|
AX 0FFh for ready
|
|
00h for not ready
|
|
08h removable media bit (DOS 3.x)
|
|
return AX 00h device is removable
|
|
01h device is nonremovable
|
|
0Fh invalid drive specification
|
|
09h test local or network device in BL (DOS 3.x)
|
|
BL drive number (0=default)
|
|
return DX attribute word, bit 12 set if device is
|
|
remote
|
|
0Ah is handle in BX local or remote? (DOS 3.x)
|
|
BX file handle
|
|
return DX (attribute word) bit 15 set if file is remote
|
|
0Bh change sharing retry count to DX (default=3), (DOS 3.x)
|
|
CX delay (default 1)
|
|
DX retry count (default 3)
|
|
0Ch general IOCTL (DOS 3.3 [3.2?]) allows a device driver to
|
|
prepare, select, refresh, and query Code Pages
|
|
0Dh Block Device Request (DOS 3.3+)
|
|
BL drive number (0=default)
|
|
CH major subfunction
|
|
CL minor subfunction
|
|
40h set device parameters
|
|
41h write logical device track
|
|
42h format and verify logical device track
|
|
60h get device parameters
|
|
61h read logical device track
|
|
62h verify logical device track
|
|
DS:DX pointer to parameter block
|
|
0Eh GET LOGICAL DEVICE (DOS 3.3+)
|
|
BL drive number (0=default)
|
|
return AL=0 block device has only one logical drive
|
|
assigned 1..n the last letter used to reference
|
|
the device (1=A:,etc)
|
|
0Fh Set Logical Device (DOS 3.3+)
|
|
BL drive number: 0=default, 1=A:, 2=B:, etc.
|
|
BX file handle
|
|
CX number of bytes to read or write
|
|
DS:DX data or buffer
|
|
DX data
|
|
return AX number of bytes transferred
|
|
or error code (call function 59h for extended error codes)
|
|
or status
|
|
00h not ready
|
|
0FFh ready
|
|
CF set if error
|
|
|
|
|
|
45h Duplicate a File Handle (DUP)
|
|
Create duplicate handle
|
|
entry AH 45h
|
|
BX file handle to duplicate
|
|
return CF clear AX duplicate handle
|
|
set AX error code (4, 6)
|
|
note 1) If you move the pointed of one handle, the pointer of the other will
|
|
also be moved.
|
|
2) The handle in BX must be open
|
|
|
|
|
|
46h Force Duplicate of a Handle (FORCEDUP or CDUP)
|
|
forces handle in CX to refer to the same file at the same position as BX
|
|
entry AH 46h
|
|
BX existing file handle
|
|
CX new file handle
|
|
return CF clear both handles now refer to existing file
|
|
set error
|
|
AX error code (4, 6)
|
|
note 1) If CX was an open file, it is closed first
|
|
2) If you move the read/write pointer of either file, both will move
|
|
3) The handle in BX must be open
|
|
|
|
|
|
47h Get Current Directory
|
|
places full pathname of current directory/drive into a buffer
|
|
entry AH 47h
|
|
DL drive (0=default, 1=A:, etc.)
|
|
DS:SI points to 64-byte buffer area
|
|
return CF clear DS:DI pointer to ASCIIZ pathname of current directory
|
|
set AX error code (0Fh)
|
|
note String does not begin with a drive identifier or a backslash
|
|
|
|
|
|
48h Allocate Memory
|
|
allocates requested number of 16-byte paragraphs of memory
|
|
entry AH 48h
|
|
BX number of 16-byte paragraphs desired
|
|
return CF clear AX segment address of allocated space
|
|
BX maximum number paragraphs available
|
|
set AX error code (7, 8)
|
|
note BX indicates maximum memory availible only if allocation fails
|
|
|
|
|
|
49h Free Allocated Memory
|
|
frees specified memory blocks
|
|
entry AH 49h
|
|
ES segment address of area to be freed
|
|
return CF clear successful
|
|
set AX error code (7, 9)
|
|
note 1) This call is only valid when freeing memory obtained by function 48h.
|
|
2) A program should not try to release memory not belonging to it.
|
|
|
|
|
|
4Ah Modify Allocated Memory Blocks (SETBLOCK)
|
|
expand or shrink memory for a program
|
|
entry AH 4AH
|
|
BX new size in 16 byte paragraphs
|
|
ES segment address of block to change
|
|
return CF clear nothing
|
|
set AX error code (7, 8, 9)
|
|
or BX max number paragraphs available
|
|
note 1) Max number paragraphs availible is returned only if the call fails
|
|
2) Memory can be expanded only if there is memory availible
|
|
|
|
|
|
4Bh Load or Execute a Program
|
|
(EXEC)
|
|
entry AH 4Bh
|
|
AL 00h load and execute program. A PSP is built for the program
|
|
the ctrl-break and terminate addresses are set to the
|
|
new PSP.
|
|
*01h load but don't execute (note 1)
|
|
*02h load (internal) but do not execute
|
|
03h load overlay (do not create PSP, do not begin execution)
|
|
DS:DX points to the ASCIIZ string with the drive, path, and filename
|
|
to be loaded
|
|
ES:BX points to a parameter block for the load
|
|
(AL=00h) word segment address of environment string to be
|
|
passed
|
|
dword pointer to the command line to be placed at
|
|
PSP+80h
|
|
dword pointer to default FCB to be passed at PSP+5Ch
|
|
dword pointer to default FCB to be passed at PSP+5Ch
|
|
(AL=03h) word segment address where file will be loaded
|
|
word relocation factor to be applied to the image
|
|
return CF clear successful
|
|
set error
|
|
AX error code (1, 2, 8, 0Ah, 0Bh)
|
|
note 1) If you make this call with AL=1 the program will be loaded as if you
|
|
made the call with AL=0 except that the program will not be executed.
|
|
Additionally, with AL=1 the stack segment and pointer along with the
|
|
program's CS:IP entry point are returned to the program which made the
|
|
4B01h call. These values are put in the four words at ES:BX+0eh. On
|
|
entry to the call ES:BX points to the environment address, the command
|
|
line and the two default FCBs. This form of EXEC is used by DEBUG.COM.
|
|
2) Application programs may invoke a secondary copy of the command
|
|
processor (normally COMMAND.COM) by using the EXEC function. Your
|
|
program may pass a DOS command as a parameter that the secondary
|
|
command processor will execute as though it had been entered from the
|
|
standard input device.
|
|
The procedure is:
|
|
A. Assure that adequate free memory (17k for 2.x and 3.0, 23k for 3.1
|
|
up) exists to contain the second copy of the command processor and
|
|
the command it is to execute. This is accomplished by executing
|
|
function call 4Ah to shrink memory allocated to that of your current
|
|
requirements. Next, execute function call 48h with BX=0FFFFh. This
|
|
returns the amount of memory availible.
|
|
B. Build a parameter string for the secondary command processor in the
|
|
form:
|
|
1 byte length of parameter string
|
|
xx bytes parameter string
|
|
1 byte 0Dh (carriage return)
|
|
For example, the assembly language statement below would build the
|
|
string to cause execution of the command FOO.EXE:
|
|
DB 19, "/C C:FOO" , 13
|
|
C. Use the EXEC function call (4Bh), function value 0 to cause execution
|
|
of the secondary copy of the command processor. (The drive,
|
|
directory, and name of the command processor can be gotten from the
|
|
COMSPEC variable in the DOS environment passed to you at PSP+2Ch.)
|
|
D. Remember to set offset 2 of the EXEC control block to point to the
|
|
string built above.
|
|
3) All open files of a process are duplicated in the newly created
|
|
process after an EXEC, except for files originally opened with the
|
|
inheritance bit set to 1.
|
|
4) The environment is a copy of the original command processor's
|
|
environment. Changes to the EXECed environment are not passed back to
|
|
the original. The environment is followed by a copy of the DS:DX
|
|
filename passed to the child process. A zero value will cause the
|
|
child process to inherit the environment of the calling process. The
|
|
segment address of the environment is placed at offset 2Ch of the
|
|
PSP of the program being invoked.
|
|
5) This function uses the same resident part of COMMAND.COM, but makes a
|
|
duplicate of the transient part.
|
|
6) How EXEC knows where to return to: Basically the vector for int 22h
|
|
holds the terminate address for the current process. When a process
|
|
gets started, the previous contents of int 22h get tucked away in the
|
|
PSP for that process, then int 22h gets modified. So if Process A
|
|
EXECs process B, while Process B is running, the vector for int 22h
|
|
holds the address to return to in Process A, while the save location in
|
|
Process B's PSP holds the address that process A will return to when
|
|
*it* terminates. When Process B terminates by one of the usual legal
|
|
means, the contents of int 22h are (surmising) shoved onto the stack,
|
|
the old terminate vector contents are copied back to int 22h vector from
|
|
Process B's PSP, then a RETF or equivalent is executed to return control
|
|
to process A.
|
|
|
|
|
|
4Ch Terminate a Process (EXIT)
|
|
Quit with exit code
|
|
entry AH 4Ch
|
|
AL exit code in AL when called, if any, is passed to next process
|
|
return none
|
|
note 1) Control passes to DOS or calling program
|
|
2) return code from AL can be retrieved by ERRORLEVEL or function 4Dh
|
|
3) all files opened by this process are closed, buffers are flushed, and
|
|
the disk directory is updated
|
|
4) Restores Terminate vector from PSP:000Ah
|
|
Ctrl-C vector from PSP:000Eh
|
|
Critical Error vector from PSP:0012h
|
|
|
|
|
|
4Dh Get Return Code of a Subprocess (WAIT)
|
|
gets return code from functions 31h and 4Dh (ERRORLEVEL)
|
|
entry AH 4Dh
|
|
return AL exit code of subprogram (functions 31h or 4Ch)
|
|
AH circumstance which caused termination
|
|
00h normal termination
|
|
01h control-break
|
|
02h critical device error
|
|
03h terminate and stay resident (function 31h)
|
|
note The exit code is only returned once
|
|
|
|
|
|
4Eh Find First Matching File (FIND FIRST)
|
|
Find first ASCIIZ
|
|
entry AH 4Eh
|
|
CX search attributes
|
|
DS:DX pointer to ASCIIZ filename (with attributes)
|
|
return CF set AX error code (2, 12h)
|
|
clear data block written at current DTA
|
|
format of block is:
|
|
documented by Micro- |00h 1 byte attribute byte of search
|
|
soft as "reserved for |01h 1 byte drive used in search
|
|
DOS' use on subsquent |02h 11 bytes the search name used
|
|
Find Next calls" |0Ch 2 bytes word value of last entry
|
|
function 4Fh |0Fh 4 bytes dword pointer to this DTA
|
|
|13h 2 bytes word directory start
|
|
15h 1 byte file attribute
|
|
16h 2 bytes file time
|
|
18h 2 bytes file date
|
|
1Ah 2 bytes low word of file size
|
|
1Ch 2 bytes high word of file size
|
|
1Eh 13 bytes name and extension of file found, plus
|
|
1 byte of 0s. All blanks are removed
|
|
from the name and extension, and if an
|
|
extension is present it is preceded by a
|
|
period.
|
|
note 1) Will not find volume label
|
|
2) This function does not support network operations
|
|
3) Wildcards are allowed in the filespec
|
|
4) If the attribute is zero, only ordinary files are found. If the volume
|
|
label bit is set, only volume labels will be found. Any other attribute
|
|
will return that attribute and all normal files together.
|
|
5) To look for everything except the volume label, set the hidden, system,
|
|
and subdirectory bits all to 1
|
|
|
|
|
|
4Fh Find Next Matching File (FIND NEXT)
|
|
Find next ASCIIZ
|
|
entry AH 4Fh
|
|
return CF clear data block written at current DTA
|
|
set AX error code (2, 12h)
|
|
note 1) If file found, DTA is formatted as in call 4Eh
|
|
2) Volume label searches using 4Eh/4Fh reportedly aren't 100% reliable
|
|
under DOS 2.x. The calls sometime report there's a volume label and
|
|
point to a garbage DTA, and if the volume label is the only item they
|
|
often won't find it
|
|
3) This function does not support network operations
|
|
4) Use of this call assumes that the original filespec contained wildcards
|
|
|
|
|
|
50h Set PSP
|
|
* Set new Program Segment Prefix; current process ID
|
|
entry AH 50h
|
|
BX segment address of new PSP
|
|
return none - swaps PSP's regarded as current by DOS
|
|
note 1) By putting the PSP segment value into BX and issuing call 50h DOS stores
|
|
that value into a variable and uses that value whenever a file call is
|
|
made.
|
|
2) Note that in the PSP (or PDB) is a table of 20 (decimal) open file
|
|
handles. The table starts at offset 18h into the PSP. If there is an
|
|
0FFh in a byte then that handle is not in use. A number in one of the
|
|
bytes is an index into an internal FB table for that handle. For
|
|
instance the byte at offset 18h is for handle 0, at offset 19h handle
|
|
1, etc. up to 13h. If the high bit is set then the file associated by
|
|
the handle is not shared by child processes EXEC'd with call 4Bh.
|
|
3) Function 50h is dangerous in background operations prior to DOS 3.x as
|
|
it uses the wrong stack for saving registers. (same as functions
|
|
0..0Ch in DOS 2.x)
|
|
4) Under DOS 2.x, this function cannot be invoked inside an int 28h handler
|
|
without setting the Critical Error flag
|
|
5) Open File information, etc. is stored in the PSP DOS views as current.
|
|
If a program (eg. a resident program) creates a need for a second PSP,
|
|
then the second PSP should be set as current to make sure DOS closes
|
|
that as opposed to the first when the second application finishes.
|
|
6) See PC Mag Vol.5, No 9, p.314 for discussion.
|
|
|
|
|
|
51h Get Program Segment Prefix
|
|
* Returns the PSP address of currently executing program
|
|
entry AH 51h
|
|
return BX address of currently executing program
|
|
note 1) Used in DOS 2.x, 3.x uses 62h
|
|
2) Function 51h is dangerous in background operations prior to DOS 3.x as
|
|
it uses the wrong stack for saving registers. (same as functions
|
|
0..0Ch in DOS 2.x)
|
|
3) 50h and 51h might be used if you have more than one process in a PC.
|
|
For instance if you have a resident program that needs to open a file
|
|
you could first call 51h to save the current id and then call 50h to set
|
|
the ID to your PSP.
|
|
4) Under DOS 2.x, this function cannot be invoked inside an int 28h handler
|
|
|
|
|
|
52h IN-VARS
|
|
* returns a pointer to a set of DOS data variables MCB chain, pointer to
|
|
first device driver and a pointer to disk parameter blocks (first one)
|
|
entry AH 52h
|
|
return ES:BX pointer to the DOS list of lists, for disk information. Does not
|
|
access the disk, so information in tables might be incorrect if
|
|
disk has been changed. Returns a pointer to the following array
|
|
of longword pointers:
|
|
Bytes Value
|
|
-2h,-1h segment of first memory control block
|
|
0h-3h pointer to first DOS disk block (see function 36h)
|
|
4h-7h partially unknown. Pointer to a device driver. Maybe
|
|
first resident driver?
|
|
8h-0Bh pointer to CLOCK$ device driver, whether installable or
|
|
resident
|
|
0Ch-0Fh pointer to actual CON: device driver, whether
|
|
installable or resident
|
|
(DOS 2.x)
|
|
10 Number of logical drives in system
|
|
11-12 Maximum bytes/block of any block device
|
|
13-16 unknown
|
|
17 Beginning (not a pointer. The real beginning!) of NUL
|
|
device driver. This is the first device on DOS's linked
|
|
list of device drivers.
|
|
(DOS 3.x)
|
|
10h-11h maximum bytes/block of any block device (0200h)
|
|
12h-15h unknown. Pointer to current directory block?
|
|
16h-19h partially undefined: Pointer to array of drive info:
|
|
51h bytes per drive, starting with A: ...
|
|
00h-3Fh current path as ASCIIZ, starting with 'x:\'
|
|
40h-43h unknown zeros always
|
|
44h unknown flags? Usually 40h, except for
|
|
entry after last valid entry = 00h
|
|
45h-48h pointer to DOS disk block for this drive
|
|
49h-4Ah unknown. Current track or block?
|
|
-1 if never accessed
|
|
4Bh-4Eh unknown -1 always
|
|
4Fh-52h unknown 2 always
|
|
1Ah-1Dh unknown. Pointer to data area, maybe including cluster
|
|
allocation table?
|
|
1Eh-1Fh unknown. Zero always
|
|
20h Number of block devices
|
|
21h value of LASTDRIVE command in CONFIG.SYS (default 5)
|
|
22h Beginning (not a pointer. The real beginning!) of NUL
|
|
device driver. This is the first device on DOS's linked
|
|
list of device drivers.
|
|
note This call is not supported in OS/2 1.0's DOS Compatibility Box
|
|
|
|
|
|
53h Translate BPB
|
|
* Translates BPB (BIOS Parameter Block, see below) into a DOS Disk Block (see
|
|
function call 32h).
|
|
entry AH 53h
|
|
DS:SI pointer to BPB
|
|
ES:BP pointer to area for DOS Disk Block.
|
|
Layout of Disk Block:
|
|
bytes value
|
|
00h-01h bytes per sector, get from DDB bytes 02h-03h.
|
|
02h sectors per cluster, get from (DDB byte 4) + 1
|
|
03h-04h reserved sectors, get from DDB bytes 06h-07h
|
|
05h number of FATs, get from DDB byte 08h
|
|
06h-07h number of root dir entries, get from DDB bytes 09h-0Ah
|
|
08h-09h total number of sectors, get from:
|
|
((DDB bytes 0Dh-0Eh) - 1) * (sectors per cluster (BPB
|
|
byte 2)) + (DDB bytes 0Bh-0Ch)
|
|
0Ah media descriptor byte, get from DDB byte 16h
|
|
0Bh-0Ch number of sectors per FAT, get from DDB byte 0Fh
|
|
return unknown
|
|
|
|
|
|
54h Get Verify Setting
|
|
Get verify flag status
|
|
entry AH 54h
|
|
return AL 00h if flag off
|
|
01h if flag on
|
|
note Flag can be set with function 2Eh
|
|
|
|
|
|
55h Create "Child" PSP
|
|
* Create PSP: similar to function 26h (which creates a new Program Segment
|
|
Prefix at segment in DX) except creates a "child" PSP rather than copying
|
|
the existing one.
|
|
entry AH 55h
|
|
DX segment number at which to create new PSP.
|
|
return unknown
|
|
note 1) This call is similar to call 26h which creates a PSP except that unlike
|
|
call 26h the segment address of the parent process is obtained from the
|
|
current process ID rather than from the CS value on the stack (from the
|
|
INT 21h call). DX has the new PSP value and SI contains the value to be
|
|
placed into PSP:2 (top of memory).
|
|
2) Function 55 is merely a substitute for function 26h. It will copy the
|
|
current PSP to the segment address DX with the addition that SI is
|
|
assumed to hold the new memory top segment. This means that function
|
|
26h sets SI to the segment found in the current PSP and then calls
|
|
function 55h.
|
|
|
|
|
|
56h Rename a File
|
|
if the first file exists, it is renamed to the name in ES:DI
|
|
entry AH 56h
|
|
DS:DX pointer to ASCIIZ old pathname
|
|
ES:DI pointer to ASCIIZ new pathname
|
|
return CF clear successful rename
|
|
set AX error code (2, 3, 5, 11h)
|
|
note 1) Works with files in same drive only
|
|
2) Global characters not allowed in filename
|
|
3) The name of a file is its full pathname. The file's full pathname can
|
|
be changed, while leaving the actual FILENAME.EXT unchanged. Changing
|
|
the pathname allows the file to be "moved" from subdirectory to
|
|
subdirectory on a logical drive without actually copying the file.
|
|
4) DOS 3.x allows renaming of directories
|
|
|
|
|
|
|
|
57h Get/Set a File's Date and Time
|
|
read or modify time and date stamp on a file's directory entry
|
|
entry AH 57h
|
|
AL function code
|
|
00h get date and time
|
|
01h set date and time
|
|
CX time to be set
|
|
DX date to be set
|
|
BX file handle
|
|
return CF clear CX time of last write (if AL = 0)
|
|
DX date of last write (if AL = 0)
|
|
set AX error code (1, 6)
|
|
note Date/time formats are:
|
|
CX bits 0Bh-0Fh hours (0-23) DX bits 09h-0Fh year (relative to 1980)
|
|
05h-0Ah minutes (0-59) 05h-08h month (0-12)
|
|
00h-04h #2 sec. incr. (0-29) 00h-04h day of the month (0-31)
|
|
|
|
|
|
58h Get/Set Allocation Strategy
|
|
DOS 3.x
|
|
entry AH 58h
|
|
AL 0 set current strategy
|
|
1 set new current strategy
|
|
BX new strategy if AH=1
|
|
0 first fit - chooses the lowest block in memory which
|
|
will fit (this is the default). (use first memory block
|
|
large enough)
|
|
1 best fit - chooses the smallest block which will fill
|
|
the request.
|
|
2 last fit - chooses the highest block which will fit.
|
|
return CF clear (0) successful
|
|
set (1) error (1)
|
|
AX error code
|
|
AX strategy code (CF=0)
|
|
note 1) Documented in Zenith DOS version 3.1, some in Advanced MSDOS
|
|
2) The set subfunction accepts any value in BL; 2 or greater means last
|
|
fit. The get subfunction returns the last value set, so programs should
|
|
check whether the value is greater than or equal to 2.
|
|
|
|
|
|
59h Get Extended Error Code (DOS 3.x)
|
|
returns additional error information when requested
|
|
The Get Extended Error function call (59h) is intended to provide a common
|
|
set of error codes and to supply more extensive information about the error
|
|
to the application. The information returned from function call 59h, in
|
|
addition to the error code, is the error class, the locus, and the
|
|
recommended action. The error class provides information about the error
|
|
type (hardware, internal, system, etc.). The locus provides information
|
|
about the area involved in the failure (serial device, block device,
|
|
network, or memory). The recommended action provides a default action for
|
|
programs that do not understand the specific error code.
|
|
Newly written programs should use the extended error support both from
|
|
interrupt 24h hard error handlers and after any int 21h function calls. FCB
|
|
function calls report an error by returning 0FFh in AL. Handle function
|
|
calls report an error by setting the carry flag and returning the error
|
|
code in AX. Int 21h handle function calls for DOS 2.x continue to return
|
|
error codes 0-18. Int 24h handle function calls continue to return error
|
|
codes 0-12. But the application can obtain any of the error codes used in
|
|
the extended error codes table by issuing function call 59h. Handle
|
|
function calls for DOS 3.x can return any of the error codes. However, it
|
|
is recommended that the function call be followed by function call 59h to
|
|
obtain the error class, the locus, and the recommended action.
|
|
The Get Extended Error function (59h) can always be called, regardless of
|
|
whether the previous DOS call was old style (error code in AL) or new style
|
|
(carry bit). It can also be used inside an int 24h handler.
|
|
You can either check AL or the carry bit to see if there was no error,
|
|
and call function 59h only if there was an error, or take the simple
|
|
approach of always calling 59h and letting it tell you if there was an
|
|
error or not. When you call function 59h it will return with AX=0 if the
|
|
previous DOS call was successful.
|
|
entry AH 59h
|
|
BX version code (0000 for DOS 3.0 and 3.1)
|
|
return AX extended error code:
|
|
01h Invalid function number
|
|
02h File not found
|
|
03h Path not found
|
|
04h Too many open files, no file handles left
|
|
05h Access denied
|
|
06h Invalid handle
|
|
07h Memory control blocks destroyed
|
|
08h Insufficient memory
|
|
09h Invalid memory block address
|
|
0Ah Invalid environment
|
|
0Bh Invalid format
|
|
0Ch Invalid access code
|
|
0Dh Invalid data
|
|
0Eh Reserved
|
|
0Fh Invalid drive was specified
|
|
10h Attempt to remove the current directory
|
|
11h Not same device
|
|
12h No more files
|
|
13h Attempt to write on write-protected diskette
|
|
14h Unknown unit
|
|
15h Drive not ready
|
|
16h Unknown command
|
|
17h Bad CRC check
|
|
18h Bad request structure length
|
|
19h Seek error
|
|
1Ah Unknown media type
|
|
1Bh Sector not found
|
|
1Ch Printer out of paper
|
|
1Dh Write fault
|
|
1Eh Read fault
|
|
1Fh General Failure
|
|
20h Sharing violation
|
|
21h Lock violation
|
|
22h Invalid disk change
|
|
23h FCB unavailible
|
|
24h Sharing buffer overflow
|
|
25h Reserved
|
|
26h "
|
|
27h "
|
|
28h "
|
|
29h "
|
|
2Ah "
|
|
2Bh "
|
|
2Ch "
|
|
2Dh "
|
|
2Eh "
|
|
2Fh "
|
|
30h "
|
|
31h Reserved
|
|
32h Network: request not supported (DOS 3.1 + MS Networks)
|
|
33h Remote computer not listening
|
|
34h Duplicate name on network
|
|
35h Network: name not found
|
|
36h Network: busy
|
|
37h Network: device no longer exists
|
|
38h NETBIOS command limit exceeded
|
|
39h Network: adapter hardware error
|
|
3Ah Incorrect response from network
|
|
3Bh Unexpected network error
|
|
3Ch Incompatible remote adapter
|
|
3Dh Print queue full
|
|
3Eh Not enough space for print file
|
|
3Fh Print file was deleted
|
|
40h Network: name was deleted
|
|
41h Network: Access denied
|
|
42h Network: device type incorrect
|
|
43h Network: name not found
|
|
44h Network: name limit exceeded
|
|
45h NETBIOS session limit exceeded
|
|
46h Temporarily paused
|
|
47h Network: request not accepted
|
|
48h Print or disk redirection paused (DOS 3.1 + MS Networks)
|
|
49h Reserved
|
|
4Ah "
|
|
4Bh "
|
|
4Ch "
|
|
4Dh "
|
|
4Eh "
|
|
4Fh Reserved
|
|
50h File exists
|
|
51h Reserved
|
|
52h Cannot make directory entry
|
|
53h Fail on interrupt 24h
|
|
54h Too many redirections
|
|
55h Duplicate redirection
|
|
56h Invalid password
|
|
57h Invalid parameter
|
|
58h Network: device fault
|
|
BH class of error:
|
|
01h Out of resource
|
|
02h Temporary situation
|
|
03h Authorization (denied access)
|
|
04h Internal
|
|
05h Hardware failure
|
|
06h System failure
|
|
07h Application program error
|
|
08h Not found
|
|
09h Bad format
|
|
0Ah Locked
|
|
0Bh Media error (wrong volume ID, disk failure)
|
|
0Ch Already exists
|
|
0Dh Unknown
|
|
BL suggested action code:
|
|
01h Retry
|
|
02h Delayed retry
|
|
03h Prompt user
|
|
04h Abort after cleanup
|
|
05h Immediate abort
|
|
06h Ignore
|
|
07h Retry after user intervention
|
|
CH locus (where error occurred):
|
|
01h Unknown or not appropriate
|
|
02h Block device
|
|
03h Network related
|
|
04h Serial device
|
|
05h Memory related
|
|
note 1) Not all DOS functions use the carry flag to indicate an error. Carry
|
|
should be tested only on those functions which are documented to use it.
|
|
2) None of the DOS functions which existed before 2.0 use the carry
|
|
indicator. Many of them use register AL as an error indication instead,
|
|
usually by putting 0FFh in AL on an error. Most, but not all, the "new"
|
|
(2.x, 3.x) functions do use carry, and most, but not all, of the "old"
|
|
(1.x) functions use AL.
|
|
3) On return, CL, DI, DS, DX, ES, BP, and SI are destroyed - save before
|
|
calling this function if required.
|
|
4) DOS 2.x Error Codes: If you are using function calls 38h-57h with DOS
|
|
2.x, to check if an error has occurred, check for the following error
|
|
codes in the AX register:
|
|
call error code call error code call error code
|
|
38h 2 41h 2,3,5 4Ah 7,8,9
|
|
39h 3,5 42h 1,6 4Bh 1,2,3,5,8,10,11
|
|
3Ah 3,5,15 43h 1,2,3,5 4Eh 2,3,18
|
|
3Bh 3 44h 1,3,5,6 4Fh 18
|
|
3Ch 3,4,5 45h 4,6 56h 2,3,5,17
|
|
3Dh 2,3,4,5,12 46h 4,6 57h 1,6
|
|
3Eh 6 47h 15
|
|
3Fh 5,6 48h 7,8
|
|
40h 5,6 49h 7,9
|
|
5) note that extended error codes 13h through 1Fh correspond to error
|
|
codes 00h through 0Ch returned by int 24h
|
|
|
|
|
|
5Ah Create Temporary File
|
|
Create unique filename (for temporary use) (DOS 3.x)
|
|
entry AH 5Ah
|
|
DS:DX pointer to ASCIIZ directory pathname ending with a backslash (\)
|
|
CX file attribute
|
|
return CF clear DS:DX new ASCIIZ path name
|
|
AX handle
|
|
set AX error code (3 or 5)
|
|
note 1) The file created is not truly "temporary". It must be removed by the
|
|
user.
|
|
2) If the filename created already exists in the current directory, this
|
|
function will call itself again with another unique filename until
|
|
a unique filename is found
|
|
|
|
|
|
5Bh Create a New File
|
|
(DOS 3.x)
|
|
entry AH 5Bh
|
|
DS:DX pointer to directory ASCIIZ path name
|
|
CX file attribute
|
|
return CF clear AX file handle
|
|
DS:DX new ASCIIZ path name
|
|
set AX error code (3, 4, 5, 50h)
|
|
note 1) Unlike function 3Ch, function 5Bh will fail if the file already exists.
|
|
2) The new file is opened in read/write mode
|
|
|
|
|
|
5Ch Lock/Unlock File Access
|
|
(DOS 3.x)
|
|
entry AH 5Ch
|
|
AL 00h to lock file
|
|
01h to unlock file
|
|
BX file handle
|
|
CX:DX starting offset of region to lock
|
|
SI:DI size of region to lock
|
|
return CF clear successful
|
|
set AX error code (1, 6, 21h)
|
|
note 1) Close all files before exiting or undefined results may occur
|
|
2) Programs spawned with EXEC inherit all the parent's file handles but
|
|
not the file locks
|
|
|
|
|
|
5Dh Set Extended Error Information
|
|
* DOS Internal - partial (DOS 3.x)
|
|
entry AH 5dh
|
|
AL subfunction
|
|
06h get address of critical error flag
|
|
return DS:SI pointer to critical error flag
|
|
08h (unknown - used by command.com)
|
|
09h (unknown - used by command.com)
|
|
0Ah set error info (Error, Class, Action, and Locus)
|
|
DS:DX address of 11-word error information
|
|
words 0 to 7: values of AX,BX,CX,DX,SI,DI,DS,
|
|
ES that function 59h will return
|
|
words 8 to 10: zero (reserved)
|
|
return: CX unknown
|
|
DX unknown
|
|
DS:SI (for 06h) pointer to critical error flag
|
|
note 1) This call seems to have many different functions
|
|
2) Function 0Ah; DOS 3.1+
|
|
3) Function 06h; setting CritErr flag allows use of functions 50h/51h from
|
|
int 28h under DOS 2.x by forcing use of correct stack
|
|
|
|
|
|
5Eh Network Printer (Partially documented by Microsoft)
|
|
DOS 3.1+ with Networks software
|
|
entry AH 5Eh
|
|
AL 00 Get Machine Name
|
|
DS:DX pointer to buffer for ASCIIZ name
|
|
return CH 0 if name not defined
|
|
CL NETBIOS name number if CH <> 0
|
|
DS:DX pointer to identifier if CH <> 0
|
|
note the ASCIIZ name is a 15 byte string padded
|
|
to length with zeroes
|
|
01 Set Machine Name
|
|
DS:DX pointer to ASCIIZ name
|
|
CH unknown
|
|
CL name number
|
|
02 Set Printer Control String
|
|
BX redirection list index
|
|
CX length of setup string (max 64 bytes)
|
|
DS:SI pointer to string buffer
|
|
03 Get Printer Control String
|
|
BX redirection list index
|
|
ES:DI pointer to string buffer
|
|
return CX length of setup string (max 64 bytes)
|
|
return CF clear successful
|
|
set error
|
|
AX error code (1 for all listed subfunctions)
|
|
note 1) Used in IBM's & Microsoft's Network programs
|
|
2) Partial documentation in Fall 1985 Byte
|
|
3) These services require that the network software be installed
|
|
4) Partial documentation in Advanced MS-DOS
|
|
5) SHARE must be loaded or results can be unpredictable on 00h, or fail
|
|
with 02h or 03h
|
|
|
|
|
|
5Fh Network Redirection
|
|
(DOS 3.1 + Microsoft Networks)
|
|
entry AH 5Fh
|
|
AL *00h Unknown
|
|
*01h Unknown
|
|
02h Get Redirection List Entry
|
|
BX redirection list index
|
|
DS:SI pointer to 16 byte buffer for local device name
|
|
ES:DI pointer to 128 byte buffer for network name
|
|
return BH device status flag (bit 0 = 0 if valid)
|
|
(bit 0 = 1 if invalid)
|
|
BL device type
|
|
03 printer device
|
|
04 drive device
|
|
CX stored parameter value
|
|
DS:SI pointer to 16 byte local device name
|
|
ES:DI pointer to 128 byte network name
|
|
note DX and BP are destroyed by this call!
|
|
03h Redirect Device
|
|
BL device type
|
|
03 printer device
|
|
04 file device
|
|
CX stored parameter value
|
|
DS:SI pointer to source device name
|
|
ES:DI pointer to destination ASCIIZ network path +
|
|
ASCIIZ password
|
|
04h Cancel Redirection
|
|
DS:SI pointer to ASCIIZ device name or network path
|
|
return CF clear successful
|
|
set if error
|
|
AX error code
|
|
return as above
|
|
note 1) Used in IBM's Network program
|
|
2) Partial documentation in Fall 1985 Byte
|
|
3) These services require that the network software be installed
|
|
4) Partial documentation in Advanced MS-DOS
|
|
5) SHARE must be loaded or the call will fail
|
|
6) The network device name requires a password
|
|
|
|
|
|
60h Parse pathname (DOS 3.x)
|
|
* Translate - perform name processing on a string (internal to DOS)
|
|
entry AH 60h
|
|
DS:SI pointer to source string (null terminated)
|
|
ES:DI pointer to destination string buffer.
|
|
return ES:DI buffer filled with qualified name
|
|
CF 0 no error
|
|
1 error
|
|
AX error code
|
|
note 1) Documented in Zenith 3.05 Tech Ref
|
|
2) All name processing is performed on the input string: string
|
|
substitution is performed on the components, current drive/directories
|
|
are prepended, . and .. are removed.
|
|
3) Example: If current drive/directory is c:\test, myfile.x is translated
|
|
to c:\test\myfile.x; ..\source\sample.asm is tranlated to c:\source\
|
|
sample.asm
|
|
4) It is the caller's responsibility to make sure DS:SI does not point to
|
|
a null string. If it does, SI is incremented, a null byte is stored at
|
|
ES:DI, and the routine returns.
|
|
|
|
|
|
61h No Information Availible (DOS 3.x)
|
|
* internal to DOS - parameters not known
|
|
entry AH 61h
|
|
return AL 0
|
|
note Supposedly documented in Zenith DOS 3.05 Tech Ref
|
|
|
|
|
|
62h Get Program Segment Prefix (PSP)
|
|
Get PSP address (DOS 3.x)
|
|
entry AH 62h
|
|
return BX segment address of PSP
|
|
|
|
|
|
63h Get Lead Byte Table (MS-DOS 2.25 only)
|
|
added in MS-DOS version 2.25 for additional foreign character set support.
|
|
entry AH 63h
|
|
AL subfunction
|
|
00h get system lead byte table address
|
|
01h set/clear interim console flag
|
|
DL 0 to clear interim console flag
|
|
1 to set interim console flag
|
|
02h get interim console flag
|
|
return DS:SI pointer to lead byte table (AL = 00h)
|
|
DL interim console flag (AL = 02h)
|
|
note Function 63h destroys all registers on return.
|
|
|
|
|
|
64h Internal
|
|
unknown (DOS 3.3+)
|
|
entry AH 64h
|
|
|
|
|
|
65h Get Extended Country Information (DOS 3.3+)
|
|
returns information about the selected country formats, code pages, and
|
|
conversion tables
|
|
entry AH 65h
|
|
AL info ID (1 - 6)
|
|
BX code page (-1 = global code page)
|
|
CX size of buffer
|
|
DX country ID (-1 = current country)
|
|
ES:DI pointer to country information buffer
|
|
return AX error code if carry set, otherwise
|
|
CX size of country information returned
|
|
CF set on error
|
|
ES:DI pointer to country information:
|
|
1 byte info ID
|
|
if info ID <> 1
|
|
dword pointer to information
|
|
if info ID = 1
|
|
word size
|
|
word country ID
|
|
word code page
|
|
34 bytes (see function 38h)
|
|
|
|
|
|
66h Get/Set Global Code Page Table (DOS 3.3+)
|
|
query/reset code page defaults
|
|
entry AH 66h
|
|
AL 00h Get Global Code Page
|
|
01h Set Global Page
|
|
BX active code page
|
|
DX system code page (active page at boot time)
|
|
return CF clear successful
|
|
set AX error code
|
|
if 00h BX active code page
|
|
DX system code page (active page at boot time)
|
|
note BX = active code page: 437 = US, 860 = Portugal, 863 = Canada (French)
|
|
865 = Norway/Denmark
|
|
|
|
|
|
67h Set Handle Count (DOS 3.3+)
|
|
supports more than 20 open files per process
|
|
entry AH 67h
|
|
BX desired number of handles (max 255)
|
|
return CF clear if OK
|
|
CF set if error
|
|
AX error code
|
|
|
|
|
|
68h Commit File (DOS 3.3+)
|
|
Write all buffered data to disk
|
|
entry AH 68h
|
|
BX file handle
|
|
return CF set AX error code
|
|
clear successful
|
|
note Faster and more secure method of closing a file in a network than
|
|
current close commands
|
|
|
|
|
|
69h Disk Serial Number DOS 4.0 (US)
|
|
Places and reads "Volume Serial Number" on disks formatted with 4.0+
|
|
entry unknown
|
|
return unknown
|
|
note A call for DOS function 69h (AL=0, possibly a subfunction) uses DS:DX
|
|
as a pointer to a table. On return, the table is filled in as follows:
|
|
word unknown (zeroes on my system)
|
|
dword disk serial number (binary)
|
|
char[11] volume label or "NO NAME " if none
|
|
char[8] FAT type
|
|
The FAT type field returns "FAT16 " on hard disk formatted with DOS
|
|
3.3 and "FAT12 " on a 360K floppy.
|
|
|
|
|
|
6Ah unknown (DOS 4.0?)
|
|
|
|
|
|
6Bh unknown (DOS 4.0?)
|
|
|
|
|
|
6Ch Extended Open/Create DOS 4.0 (US)
|
|
Combines functions available with Open, Create, Create New, and Commit
|
|
entry AH 6Ch
|
|
AL 00h reserved [which means there might be other subfunctions?]
|
|
BX mode format 0WF0 0000 ISSS 0AAA
|
|
AAA is access code (read, write, read/write)
|
|
SSS is sharing mode
|
|
I 0 pass handle to child
|
|
1 no inherit [interesting!]
|
|
F 0 use int 24h for errors
|
|
1 disable int 24h for all
|
|
I/O on this handle; use own
|
|
error routine
|
|
W 0 no commit
|
|
1 auto commit on all writes
|
|
CX create attribute
|
|
DL action if file exists/does not exists
|
|
bits 7-4 action if file does not exist
|
|
0000 fail
|
|
0001 create
|
|
bits 3-0 action if file exists
|
|
0000 fail
|
|
0001 open
|
|
0010 replace/open
|
|
DH 0
|
|
DS:SI pointer to ASCIIZ file name
|
|
return CF set on error
|
|
AX error code
|
|
clear
|
|
AX file handle
|
|
CX action taken
|
|
01h file opened
|
|
02h created/opened
|
|
03h replaced/opened
|
|
|
|
|
|
89h DOS_Sleep
|
|
* not documented by Microsoft
|
|
entry AH 89h
|
|
return unknown
|
|
note 1) Function included in Microsoft C 4.0 startup code MSDOS.INC
|
|
2) Debugging shows that the first instruction on entry to DOS compares AH
|
|
with 64h (at least in DOS 3.2) and aborts the call if AH > 64.
|
|
3) Possibly used in European MSDOS 4.0?
|
|
|
|
|
|
Aftermarket Application Installed Function Calls:
|
|
|
|
|
|
0B6h, 0B8h, 0BBh, 0BCh, B0Eh, 0BFh, 0C0h, 0C1h, 0C2h, 0C3h, 0C4h, 0C5h, 0C6h,
|
|
0C7h, 0C8h, 0C9h, 0CAh, 0CBh, 0CCh, 0CDh, 0CEh, 0CFh, 0D0h, 0D1h, 0D2h, 0D3h,
|
|
0D4h, 0D5h, 0D6h, 0D7h, 0DAh, 0DBh
|
|
Used by Novell NetWare
|
|
|
|
|
|
0DCh Novell NetWare
|
|
Get Station Number
|
|
entry AH 0DCh
|
|
return AL station number
|
|
00h if NetWare not loaded or this machine is a non-
|
|
dedicated server
|
|
|
|
|
|
0DDh Novell NetWare
|
|
|
|
|
|
0DEh Novell NetWare
|
|
Set Broadcast Mode
|
|
|
|
0DFh Novell NetWare
|
|
|
|
|
|
0E0h Novell NetWare
|
|
|
|
|
|
0E1h Novell NetWare
|
|
Broadcast Messages
|
|
entry AH E1h
|
|
AL 00h send broadcast message
|
|
01h get broadcase message
|
|
02h-09h unknown
|
|
|
|
0E2h Novell NetWare
|
|
|
|
|
|
0E3h Novell NetWare
|
|
Connection Control
|
|
entry AH E3h
|
|
AL 00h-14h unknown
|
|
15h get object connection numbers
|
|
16h get connection information
|
|
32h-47h unknown
|
|
|
|
|
|
E4h DoubleDOS
|
|
check status
|
|
entry AX 00h
|
|
return AL <> 0 if DoubleDOS is active
|
|
|
|
0E4h Novell NetWare
|
|
|
|
|
|
0E5h, 0E6h, 0E7h, 0E8h, 0E9h
|
|
Novell NetWare
|
|
|
|
|
|
0EAh DoubleDOS
|
|
turn off task switching
|
|
entry AX EAh
|
|
return task switching turned off
|
|
|
|
|
|
0EAh Novell NetWare
|
|
|
|
|
|
0EBh DoubleDOS
|
|
turn on task switching
|
|
entry AH EBh
|
|
return Task switching turned on
|
|
|
|
|
|
0EBh Novell NetWare
|
|
|
|
|
|
0ECh DoubleDOS
|
|
get virtual screen address
|
|
entry AH ECh
|
|
return ES segment of virtual screen
|
|
note Screen address can change if task switching is on!
|
|
|
|
|
|
0ECh Novell NetWare
|
|
|
|
|
|
0EDh Novell NetWare
|
|
|
|
|
|
0EEh DoubleDOS
|
|
give away time to other tasks
|
|
entry AH EEh
|
|
AL number of 55ms time slices to give away
|
|
return Returns after giving away time slices
|
|
|
|
|
|
0EEh Novell NetWare
|
|
Get Node Address
|
|
entry AH EEh
|
|
return CX:BX:AX = six-byte address
|
|
|
|
|
|
0EFh, 0F0h, 0F1h, 0F2h, 0F3h Reportedly used by Novell NetWare.
|
|
No parameters known
|
|
|
|
|
|
0FFh CED (CJ Dunford's DOS macro and command-line editor)
|
|
CED installable commands
|
|
entry AH 0FFh
|
|
AL 00h add installable command
|
|
01h remove installable command
|
|
02h reserved, may be used to test for CED installation
|
|
BL mode bit 0 = 1 callable from DOS prompt
|
|
bit 1 = 1 callable from application
|
|
DS:SI pointer to cr-terminated command name
|
|
ES:DI pointer to far routine entry point
|
|
return CF set on error
|
|
AX 01h invalid function
|
|
02h command not found (subfunction 1 only)
|
|
08h insufficient memory (subfunction 0 only)
|
|
0Eh bad data (subfunction 0 only)
|
|
AH 0FFh if CED not installed
|
|
|