ralf@B.GP.CS.CMU.EDU (Ralf Brown) (12/06/87)
Remove headers and trailers and sandwich between parts 1 and 3.
This part continues INT 21/AH=25
*-*-*-------cut-----------cut--------------cut--------------*-*-*
AL = interrupt number
DS:DX = new vector to be used for specified interrupt
-----------------------------------------------------------
INT 21 - Create PSP
AH = 26h
DX = Segment number to set up PSP at
Current PSP is copied to specified segment
-----------------------------------------------------------
INT 21 - RANDOM BLOCK READ
AH = 27h
DS:DX = address of FCB
CX = number of records to be read
Return: AL =
0 = successful read
1 = end of file
2 = data transfer area too small
3 = partial record, EOF
-----------------------------------------------------------
INT 21 - RANDOM BLOCK WRITE
AH = 28h
DS:DX = address of FCB
CX = number of records to be written
if zero, truncate file to current random file position
Return: AL =
0 = successful write
1 = disk full
2 = data transfer area too small
-----------------------------------------------------------
INT 21 - Parse Filename
AH = 29h
DS:SI = pointer to string to parse
ES:DI = pointer to memory to fill with unopened FCB
AL = bit mask to control parsing
0 = 0: parsing stops if file separator found
1: leading separator ignored
1 = 0: drive number in FCB set to default drive if not present
in string
1: drive number in FCB not changed
2 = 0: filename in FCB set to 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 blanks if no extension in string
1: extension left unchanged
Return: AL = 00: no wildcards in name or extension
01: wildcards appeared
DS:SI = pointer to first byte after parsed string
ES:DI = unopened FCB
-----------------------------------------------------------
INT 21 - GET CURRENT DATE
AH = 2Ah
Return: DL = day
DH = month
CX = year
AL = day of the week (0=Sunday, 1=Monday, etc.)
-----------------------------------------------------------
INT 21 - Set CURRENT DATE
AH = 2Bh
DL = day
DH = month
CX = year
Return: AL = 0 if no error
AL = 0FFh if bad value sent to routine
(DOS 3.3 also sets CMOS clock)
(DESQview also accepts CX = 4445h and DX = 5351h, i.e. 'DESQ' as valid)
-----------------------------------------------------------
INT 21 - GET CURRENT TIME
AH = 2Ch
Return: CH = hours
CL = minutes
DH = seconds
DL = hundredths of seconds
Note: time is updated approximately every 5/100 second
-----------------------------------------------------------
INT 21 - Set CURRENT TIME
AH = 2Dh
CH = hours
CL = minutes
DH = seconds
DL = hundredths of seconds
Return: AL = 0 if no error
AL = 0ffH if bad value sent to routine
(DOS 3.3 also sets CMOS clock)
-----------------------------------------------------------
INT 21 - Set Verify Flag
AH = 2Eh
DL = 0
AL = 1 if VERIFY on
AL = 0 if VERIFY off
-----------------------------------------------------------
INT 21 - Get Disk Transfer Area Address
AH = 2Fh
Return: ES:BX = address of DTA
-----------------------------------------------------------
INT 21 - Get DOS Version
AH = 30h
Return: AL = Major Version number
AH = Minor Version number
BH = OEM number
BL:CX = 24-bit user number
-----------------------------------------------------------
INT 21 - TERMINATE BUT STAY RESIDENT
AH = 31h
AL = exit code
DX = program size, in paragraphs
-----------------------------------------------------------
INT 21 - Internal - GET DRIVE PARAMETER BLOCK
AH = 32h
DL = drive number
0 = default, 1 = A, etc.
Return: AL = 0FFh if invalid drive number, else
DS:BX = address of drive parameter block.
STRUCTURE OF DOS DRIVE PARAMETER BLOCK:
DPBLOCK STRUCT ;OFFSET
DISK_OFFSET DB ? ; 0. drive number (0 = A, etc.)
UNIT_OFFSET DB ? ; 1. unit number within device driver
SECTOR_SIZE DW ? ; 2. number of bytes per sector
MAX_CLUSTER DB ? ; 4. largest sector number in cluster
; add one for number of sectors/cluster
LOG2_SECTORS DB ? ; 5. log base two of the cluster size
RESERVED DW ? ; 6. number of reserved (boot) sectors
FAT_COUNT DB ? ; 8. number of copies of the FAT
ROOT_COUNT DW ? ; 9. number of root directory entries
DATA_START DW ? ; 11. first data sector on medium
MAX_NUMBER DW ? ; 13. largest possible cluster number
; subtract one for number of data clusters
FAT_SECTORS DB ? ; 15. number of sectors in one FAT copy
ROOT_START DW ? ; 16. first sector of root directory
DEVICE_ADDR DD ? ; 18. address of device driver for this drive
DESCRIPTOR DB ? ; 22. media descriptor byte for medium
VALID_BYTE DB ? ; 23. 0FFh indicates block must be rebuilt
NEXT_BLOCK DD ? ; 24. address of next device block in list
; FROM THIS POINT ON, DOS 3 DIFFERS FROM 2:
IF DOS2
DIR_START DW ? ; 28. starting cluster of current directory
; zero indicates the root directory
PATH_NAME DB 64 DUP (?)
; 30. ASCIIZ current directory path string
ELSE DOS3
; on my XT, this was always:
DW 0
DW 0FFFFh
ENDIF
DPBLOCK ENDS
-----------------------------------------------------------
INT 21 - Get or Set CONTROL-BREAK
AH = 33h
AL = subfunction
00h Get
01h Put
DL = 0 for OFF or 1 for ON
02h internal, called by PRINT.COM (DOS 3.1)
Return: DL = current BREAK setting if AL = 00h
0 BREAK=OFF
1 BREAK=ON
AL = FFh if error
-----------------------------------------------------------
INT 21 - Internal - Return CritSectFlag Pointer
AH = 34h
Return: ES:BX points to DOS "Critical Section Flag"
Notes:
When byte pointed to is zero, DOS is supposed to be
safe to interrupt. NOT RELIABLE according to Chris Dunford.
Examination of DOS 2.10 code in this area indicates that the
byte immediately FOLLOWING this "Critical Section Flag" must
be 00 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, and for COMPAQ DOS 3.0,
the byte 01AAh before it must be zero.
-----------------------------------------------------------
INT 21 - Get Interrupt Vector
AH = 35h
AL = interrupt number
Return: ES:BX = value of interrupt vector
-----------------------------------------------------------
INT 21 - DISK SPACE
AH = 36h
DL = drive code (0 = default, 1 = A, 2 = B, etc.)
Return: AX = number of sectors per cluster
or 0FFFFh if invalid drive
BX = number of available clusters
CX = bytes per sector
DX = total clusters
Note: multiply AX x CX x BX for free space on disk
multiply AX x CX x DX for total disk space
-----------------------------------------------------------
INT 21 - Internal - switchar/availdev
AH = 37h
AL = subfunction
0 Read switch character (returns current character in DL)
1 Set switch character (specify new character in DL)
2 (DOS 2.x only) Read device availability (as set by function AL=3)
3 (DOS 2.x only) Set device availability, where:
DL = 0 means /DEV/ must preceed device names
DL <> 0 means /DEV/ need not preceed device names
Return: DL = Switch character (if AL=0 or 1)
Device availability flag (if AL=2 or 3)
AL=0FFh means the value in AL was not in the range 0-3.
-----------------------------------------------------------
INT 21 - Get Country-Dependent Information
AH = 38h
DOS 2.x
AL = 0 get current-country info
DS:DX = segment:offset of buffer for returned info
Return: BX = country code
buffer at DS:DX filled as follows:
bytes 0-1 = date format 0 = USA mm dd yy
1 = Europe dd mm yy
2 = Japan yy mm dd
byte 2 = currency symbol
byte 3 = 00h
byte 4 = thousands separator char
byte 5 = 00h
byte 6 = decimal separator char
byte 7 = 00h
bytes 8-1Fh reserved
DOS 3.x
AL = 0 for current country
AL = 01h thru 0FEh for specific country with code <255
AL = 0FFh for specific country with code >= 255
BX = 16-bit country code
DS:DX = segment:offset of buffer for returned info
DX = 0FFFFh if setting country code, rather than getting info
Return: (if DX <> 0FFFFh)
BX = country code
DS:DX filled in:
bytes 0-1 = date format (see above)
bytes 2-6 = currency symbol string, ASCIZ
byte 7 = thousands seaprator char
byte 8 = 00h
byte 9 = decimal separator char
byte 0Ah = 00h
byte 0Bh = date separator char
byte 0Ch = 00h
byte 0Dh = time separator char
byte 0Eh = 00h
byte 0Fh = currency format
bit 1 = number of spaces between value and curr sym
bit 0 = 0 if currency symbol precedes value
1 if currency symbol follows value
byte 10h = number of digits after decimal in currency
byte 11h = time format
bit 0 = 0 if 12-hour clock
1 if 24-hour clock
bytes 12h-15h = address of case map routine (FAR CALL)
byte 16h = data-list separator char
byte 17h = 00h
bytes 18h-21h reserved
If error:
CF set
AX = error code
-----------------------------------------------------------
INT 21 - CREATE A SUBDIRECTORY (MKDIR)
AH = 39h
DS:DX = address of ASCIIZ pathname
Return: CF = 1 if error
AX = Error Code
-----------------------------------------------------------
INT 21 - REMOVE A DIRECTORY ENTRY (RMDIR)
AH = 3Ah
DS:DX = address of ASCIIZ pathname
Return: CF = 1 if error
AX = Error Code
-----------------------------------------------------------
INT 21 - CHANGE THE CURRENT DIRECTORY (CHDIR)
AH = 3Bh
DS:DX = address of ASCIIZ directory name
Return: CF = 1 if error
AX = Error Code
-----------------------------------------------------------
INT 21 - CREATE A FILE WITH HANDLE (CREAT)
AH = 3Ch
CX = attributes for file
DS:DX = address of ASCIZ filename
Return: CF = 1 if error
AX = Error Code
CF = 0 successful
AX = file handle
-----------------------------------------------------------
INT 21 - OPEN DISK FILE WITH HANDLE
AH = 3Dh
AL = access code
0 = Read Only
1 = Write Only
2 = Read/Write
AL bits 7-3 = file-sharing modes (DOS 3.x)
bit 7 = inheritance flag, set for no inheritance
bits 4-6 = sharing mode
000 compatibility mode
001 exclusive (deny all)
010 write access denied (deny write)
011 read access denied (deny read)
100 full access permitted (deny none)
bit 3 = reserved, should be zero
DS:DX = address of ASCIZ filename
DX = OFFSET ADDRESS OF ASCIIZ
Return: CF = 1 if error
AX = Error Code
CF = 0 successful
AX = file handle
-----------------------------------------------------------
INT 21 - CLOSE A FILE WITH HANDLE
AH = 3Eh
BX = file handle
Return: CF = 1 if error
AX = Error Code
-----------------------------------------------------------
INT 21 - READ FROM FILE WITH HANDLE
AH = 3Fh
BX = file handle
CX = number of bytes to read
DS:DX = address of buffer
Return: CF = 1 if error
AX = Error Code
CF = 0 successful
AX = number of bytes read
-----------------------------------------------------------
INT 21 - WRITE TO FILE WITH HANDLE
AH = 40h
BX = file handle
CX = number of bytes to write
DS:DX = pointer to buffer
Return: CF = 1 if error
AX = Error Code
CF = 0 successful
AX = number of bytes written
-----------------------------------------------------------
INT 21 - DELETE A FILE (UNLINK)
AH = 41h
DS:DX = pointer to ASCIIZ name of file to delete
Return: CF = 1 if error
AX = Error Code
-----------------------------------------------------------
INT 21 - MOVE FILE READ/WRITE POINTER (LSEEK)
AH = 42h
AL = method value
0 = offset from beginning of file
1 = offset from present location
2 = offset from end of file
BX = file handle
CX:DX = offset in bytes
Return: CF = 1 if error
AX = Error Code
CF = 0 successful
DX:AX = new offset
-----------------------------------------------------------
INT 21 - GET/PUT FILE ATTRIBUTES (CHMOD)
AH = 43h
AL =
0 = get file attributes
1 = put file attributes
CX = file attribute bits
0 = read only
1 = hidden file
2 = system file
3 = volume label
4 = subdirectory
5 = written since backup
DX = pointer to ASCIIZ file name
Return: CF = 1 if error
AX = Error Code if any
CX = file attributes on get
-----------------------------------------------------------
INT 21 - IOCTL
AH = 44h
AL =
0 = Get device information (DX)
1 = Set device information (DL, DH = 0)
DX BITS =
0 = console input device
1 = console output device
2 = null device
3 = clock device
5 = binary mode
6 = EOF
7 = device is character device if set
if not, EOF = 0 if channel has been written
bits 0-5 are block device number
12 = network device
14 = can process control strings (AL=2-5, can only be read)
15 reserved
2 = Read CX bytes to DS:DX from BX control chan
3 = Write CX bytes from DS:DX from BX control chan
4 = as 2 but for drive BL
5 = as 3 but for drive BL
AX = number of bytes transfered
6 = Get input status
7 = Get output status
AX = FFH for ready or 00h for not ready
8 = Is block device BL changeable? (DOS 3)
AX = 0 = yes
9 = Is logical device BL local? (DOS 3)
DX (attribute word) bit 12 (1000h) = 0 = yes
10 = Is handle BX local? (DOS 3)
DX (attribute word) bit 15 (8000h) = 0 = yes
11 = Change sharing retry count to DX (def 3), (DOS 3.x)
delay CX (def 1)
12 = General IOCTL (DOS 3.3 [3.2?])
BX = file handle (or BL = drive number w/0 = default)
Return: CF = 1 if error
AX = Error Code
-----------------------------------------------------------
INT 21 - Create Duplicate Handle (DUP)
AH = 45h
BX = file handle to duplicate
Return: CF = 1 if error
AX = Error Code
CF = 0 successful
AX = new file handle
-----------------------------------------------------------
INT 21 - Force Duplicate Handle (FORCDUP) (DUP2)
AH = 46h
BX = Existing file handle
CX = new file handle
Return: CF = 1 if error
AX = Error Code
-----------------------------------------------------------
INT 21 - Get Current Directory
AH = 47h
DL = drive (0=default, 1=A, etc.)
DS:SI points to 64-byte buffer area
Return: CF = 1 if error
AX = Error Code
-----------------------------------------------------------
INT 21 - Allocate Memory
AH = 48h
BX = number of 16-byte paragraphs desired
Return: CF = 1 if error
AX = Error Code
BX = Maximum available
CF = 0 successful
AX = segment of allocated memory block
-----------------------------------------------------------
INT 21 - Free Memory
AH = 49h
ES = Segment address of area to be freed
Return: CF = 1 if error
AX = Error Code
-----------------------------------------------------------
INT 21 - Adjust Block Size (SETBLOCK)
AH = 4Ah
ES = Segment address of block to change
BX = New size in paragraphs
Return: CF = 1 if error
AX = Error Code
BX = Maximum size possible for the block
-----------------------------------------------------------
INT 21 - Load or Execute (EXEC)
AH = 4Bh
AL = subfunction
0 = load and execute program
2 = load (Internal) but do not execute
3 = load overlay; do not create PSP
DS:DX = filename
ES:BX = parameter block
AL =
0 => word segment environment pointer
dword command line pointer
dword FCB 1
dword FCB 2
3 => word segment load address
word segment relocation factor
Return: CF = 1 if error
AX = Error Code
struct exec {
unsigned exec_magic; /* 0x4d, 0x5a signature */
unsigned exec_isr; /* image size remainder (mod 512) */
unsigned exec_size; /* file size in pages (512) */
unsigned exec_nrel; /* number of relocation items */
unsigned exec_hsize; /* header size in paragraphs */
unsigned exec_min; /* minimum extra paragraphs */
unsigned exec_max; /* maximum extra paragraphs */
unsigned exec_ss; /* stack segment */
unsigned exec_sp; /* stack offset */
unsigned exec_cksum; /* word checksum of entire file */
unsigned exec_pc; /* initial pc */
unsigned exec_cs; /* code segment */
unsigned exec_orel; /* offset of relocation table */
unsigned exec_ovno; /* overlay number */
};
-----------------------------------------------------------
INT 21 - Quit With Exit Code (EXIT)
AH = 4Ch
AL = exit code
Return: never returns
-----------------------------------------------------------
INT 21 - GET EXIT CODE OF SUBPROGRAM (WAIT)
AH = 4Dh
Return: AL = exit code of subprogram (functions 31h or 4Ch)
AH = circumstance which caused termination
0 = Terminate/abort
1 = Control-C
2 = Hard error
3 = Terminate and stay resident
-----------------------------------------------------------
INT 21 - Find First ASCIIZ (FIND FIRST)
AH = 4Eh
CX = search attributes
DS:DX = pointer to ASCIIZ filename
Return: CF = 1 if error
AX = Error Code if any
(DTA) = data block
-----------------------------------------------------------
INT 21 - Find Next ASCIIZ (FIND NEXT)
AH = 4Fh
Return: CF = 1 if error
AX = Error Code
(DTA) = data block
-----------------------------------------------------------
INT 21 - Internal - Set PSP Segment
AH = 50h
BX = Segment address of new PSP
Note: under DOS 2.xx, this function cannot be invoked inside an INT 28h
handler
-----------------------------------------------------------
INT 21 - Internal - Get PSP Segment
AH = 51h
Return: BX = Current PSP Segment
struct psp {
char psp_int20[2]; /* 00h: exit */
unsigned psp_msize; /* 02h: memory size in paragraphs */
char psp_res0[1]; /* 04h: XXX (0) */
char psp_dos[5]; /* 05h: far call to dos */
int (*psp_term)(); /* 0ah: terminate address */
unsigned psp_tseg; /* 0ch: terminate segment */
int (*psp_break)(); /* 0eh: break address */
unsigned psp_bseg; /* 10h: break segment */
int (*psp_error)(); /* 12h: error address */
unsigned psp_eseg; /* 14h: error segment */
unsigned psp_ppsp; /* 16h: parent psp segment */
char psp_ofile[20]; /* 18h: open files, 0xff = unused */
unsigned psp_envp; /* 2ch: environment segment */
char psp_res2[4]; /* 2eh: XXX */
int psp_nfiles; /* 32h: max open files */
char *psp_aofile; /* 34h: ofile address */
unsigned psp_aoseg; /* 36h: ofile segment */
char psp_res3[24]; /* 38h: XXX */
char psp_int21[3]; /* 50h: int 21, far return */
char psp_res4[2]; /* 53h: XXX */
char psp_xfcb1[7]; /* 55h: FCB #1 extension */
char psp_fcb1[9]; /* 5ch: FCB #1 */
char psp_xfcb2[7]; /* 65h: FCB #2 extension */
char psp_fcb2[20]; /* 6ch: FCB #2 */
char psp_dma[128]; /* 80h: Command Tail */
};
Note: under DOS 2.xx, this function cannot be invoked inside an INT 28h
handler
-----------------------------------------------------------
INT 21 - Internal - Get Disk List
AH = 52h
Return: ES:BX points to DOS list of lists
List of Lists:
Bytes Value
-2&-1 Segment of first memory control block
0-3 Pointer to first DOS disk block (see func 36h)
4-7 Partially Unknown. Pointer to a device driver. Maybe first
resident driver?
8-B Pointer to CLOCK$ device driver, whether installable or
resident
C-F 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
10-11 Maximum bytes/block of any block device (0200h)
12-15 Unknown. Pointer to current directory block????
16-19 Partially Undefined: Pointer to array of drive info:
51h bytes per drive, starting with A: ...
00-3F Current path as ASCIIZ, starting with 'x:\'
40-43 Unknown. I see zeros always
44 Unknown. Flags? I see 40h, except for
entry after last valid entry = 00h
45-48 Pointer to DOS Disk Block for this drive
49-4A Unknown. Current track or block? -1 if never
accessed.
4B-4E Unknown. I see -1 always
4F-52 Unknown. I see 2 always
1A-1D Unknown. Pointer to data area, maybe including cluster
allocation table?
1E-1F Unknown. I see zero always
20 Number of block devices.
21 Value of LASTDRIVE command in CONFIG.SYS (default 5)
22 Beginning (not a pointer. The real beginning!) of NUL device
driver. This is the first device on DOS's linked list
of device drivers.
-----------------------------------------------------------
INT 21 - Internal - Translate BPB
AH = 53h
DS:SI points to BPB (Bios Parameter Block)
ES:BP points to area for DOS Disk Block
Translates BPB (Bios Parameter Block, see below)
into a DOS Disk Block (see function call 32h).
BPB
Bytes Value
0-1 Bytes/sector. Get from DDB bytes 2-3.
2 Sectors/cluster. Get from: (DDB byte 4) + 1
3-4 Reserved sectors. Get from: DDB bytes 6-7
5 Number of FATs. Get from: DDB byte 8
6-7 Number of root dir entries. Get from: DDB bytes 9-A
8-9 Total # of sectors. Get from:
((DDB bytes D-E) - 1) * (sectors per cluster (BPB byte 2))
+ (DDB Bytes B-C)
A Media descriptor byte. Get from: DDB byte 16
B-C Number of sectors/FAT. Get from: DDB byte F
-----------------------------------------------------------
INT 21 - Get Verify Flag
AH = 54h
Return: AL = 0 if flag OFF
AL = 1 if flag ON
-----------------------------------------------------------
INT 21 - Internal - Create PSP
AH = 55h
DX = Segment number to set up PSP at
Note: Like FN 26h but creates "child" PSP rather than copying existing one.
-----------------------------------------------------------
INT 21 - RENAME A FILE
AH = 56h
DS:DX = pointer to ASCIZ old name
ES:DI = pointer to ASCIZ new name
Return: CF = 1 if error
AX = Error Code
-----------------------------------------------------------
INT 21 - Get/Put Date/Time
AH = 57h
AL = function code
0 = get date and time
1 = set date and time
CX = time to be set
DX = date to be set
BX = file handle
Return: CF = 1 if error
AX = Error Code
CX = time of last write (if AL = 0)
DX = date of last write (if AL = 0)
-----------------------------------------------------------
INT 21 - Get/Set allocation strategy (DOS 3.x)
AH = 58h
AL = function code
0 = get allocation strategy
1 = set allocation strategy
BL = strategy code
0 first fit (use first memory block large enough)
1 best fit (use smallest memory block large enough)
2 last fit (use high part of last usable memory block)
Return: CF = 1 error
AX = Error Code
CF = 0 successful
AX = strategy code
Note: 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 >= 2, not just equal to 2.
-----------------------------------------------------------
INT 21 - GET EXTENDED ERROR CODE (DOS 3.X)
AH = 59h
BX = version code (0000 for DOS 3.0)
Return: AX = extended error code
BH = class of error
BL = suggested action code
CH = locus (where error occurred)
Error codes:
01 function number invalid
02 file not found
03 path not found
04 too many open files
05 access denied
06 invalid handle
07 memory control block destroyed
08 insufficient memory
09 memory block address invalid
0A environment invalid
0B format invalid
0C access code invalid
0D data invalid
0F invalid drive
10 attempted to remove current directory
11 not same device
12 no more files
13 disk write-protected
14 unknown unit
15 drive not ready
16 unknown command
17 data error (CRC)
18 bad request structure length
19 seek error
1A unknwon media type
1B sector not found
1C printer out of paper
1D write fault
1E read fault
1F general failure
20 sharing violation
21 lock violation
22 disk change invalid
23 FCB unavailable
24-31 reserved
32 Network request not supported (DOS 3.1 + MS Networks)
33 Remote computer not listening
34 Duplicate name on network
35 Network name not found
36 Network busy
37 Network device no longer exists
38 Network BIOS command limit exceeded
39 Network adapter hardware error
3A Incorrect response from network
3B Unexpected network error
3C Incompatible remote adapter
3D Print queue full
3E Queue not full
3F Not enough space to print file
40 Network name was deleted
41 Network: Access denied
42 Network device type incorrect
43 Network name not found
44 Network name limit exceeded
45 Network BIOS session limit exceeded
46 Temporarily paused
47 Network request not accepted
48 Print/disk redirection paused (DOS 3.1 + MS Networks)
49-4F reserved
50 file exists
51 reserved
52 cannot make directory
53 fail on INT 24h
Error Classes:
01 out of resource
02 temporary situation
03 authorization (denied access)
04 internal
05 hardware failure
06 system failure
07 application program error
08 not found
09 bad format
0A locked
0B media error
0C already exists
0D unknown
Suggested Action:
01 retry
02 delayed retry
03 prompt user
04 abort after cleanup
05 immediate abort
06 ignore
07 retry after user intervention
Error Locus:
01 unknown or not appropriate
02 block device
03 network related
04 serial device
05 memory related
-----------------------------------------------------------
INT 21 - CREATE TMEPORARY FILE (DOS 3.x)
AH = 5Ah
DS:DX = pointer to ASCIZ directory path name
CX = file attribute
Return: CF = 1 if error
AX = Error Code if any
DS:DX = path name
Note: The file created is not truly "temporary". It MUST be removed
by the user.
-----------------------------------------------------------
INT 21 - CREATE NEW FILE (DOS 3.x)
AH = 5Bh
DS:DX = pointer to ASCIZ directory path name
CX = file attribute
Return: CF = 1 if error
AX = Error Code if any
DS:DX = path name
Note: Unlike function 3Ch, function 5Bh will fail if the file already
exists.
-----------------------------------------------------------
INT 21 - LOCK/UNLOCK FILE ACCESS (DOS 3.x)
AH = 5Ch
AL = 0 if lock
1 if unlock
BX = file handle
CX:DX = starting offset of region to lock
SI:DI = size of region to lock
Return: CF = 1 if error
AX = Error Code
-----------------------------------------------------------
INT 21 - Internal - Get address of critical error flag
AX = 5D06h
Return: DS:SI = pointer to critical error flag
CX = ???
DX = ???
Note: this call also does a lot of other work in addition to returning
the pointer
-----------------------------------------------------------
INT 21 - Internal - Unknown
AH = 5Dh
AL = subfunction
07h: ???
08h: (used by COMMAND.COM)
09h: (used by COMMAND.COM)
-----------------------------------------------------------
INT 21 - Get Machine Name (DOS 3.1 + Microsoft Networks)
AX = 5E00h
DS:DX -> buffer for ASCIIZ name
Return: CF = 1 if error
AX = Error Code
CH = 0 if name not defined
CL = NETBIOS name number
DS:DX -> pointer to identifier if CH <> 0
-----------------------------------------------------------
INT 21 - Set Printer Setup (DOS 3.1 + Microsoft Networks)
AX = 5E02h
BX = Redirection list index
CX = length of setup string <= 64
DS:SI -> string buffer
Return: CF = 1 if error
AX = Error Code
-----------------------------------------------------------
INT 21 - Get Printer Setup (DOS 3.1 + Microsoft Networks)
AX = 5E03h
BX = Redirection list index
ES:DI -> string buffer
Return: CF = 1 if error
AX = Error Code
CX = length of setup string <= 64
-----------------------------------------------------------
INT 21 - Get Redirection List Entry (DOS 3.1 + Microsoft Networks)
AX = 5F02h
BX = Redirection list index
DS:SI -> 16 char local device name buffer
ES:DI -> 128 char network name buffer
Return: CF = 1 if error
AX = Error Code
BH = Device status flag (BIT 0 = 0 if valid)
BL = device type (03 if printer, 04 if drive)
CX = stored parameter value
Note: DX and BP are destroyed by this call!
-----------------------------------------------------------
INT 21 - Redirect Device (DOS 3.1 + Microsoft Networks)
AX = 5F03h
BL = device type
03 = printer device
04 = file device
CX = stored parameter value
DS:SI -> source device name
ES:DI -> destination ASCIIZ network path + ASCIIZ password
Return: CF = 1 if error
AX = Error Code
-----------------------------------------------------------
INT 21 - Cancel Redirection (DOS 3.1 + Microsoft Networks)
AX = 5F04h
DS:SI -> device name or network path
Return: CF = 1 if error
AX = Error Code
-----------------------------------------------------------
INT 21 - Internal - Resolve path string to fully qualified path string
AH = 60h
DI:SI = relative path strings
ES:DI = buffer for fully qualified name
Return: buffer filled with qualified name
may return error code, unknown.
-----------------------------------------------------------
INT 21 - Internal - Unused (DOS 3.x)
AH = 61h
Return: AL = 0
-----------------------------------------------------------
INT 21 - GET PSP ADDRESS (DOS 3.x)
AH = 62h
Return: BX = segment address of PSP
-----------------------------------------------------------
INT 21 - GET LEAD BYTE TABLE (DOS 2.25 only)
AH = 63h
AL = subfunction
0 = get system lead byte table
1 = set/clear interim console flag
DL = 1/0 to set/clear interim console flag
2 = get interim console flag
Return: DS:SI -> lead byte table (AL = 0)
DL = interim console flag (AL = 2)
-----------------------------------------------------------
INT 21 - Internal - unknown (DOS 3.3)
AH = 64h
-----------------------------------------------------------
INT 21 - GET EXTENDED COUNTRY INFORMATION (DOS 3.3)
AH = 65h
AL = info ID (1 - 6)
BX = code page (-1=global code page)
DX = country ID (-1=current country)
ES:DI = pointer to country information buffer
CX = size of buffer
Return: AX = error code if carry set, otherwise
CX = size of country information returned
ES:DI = pointer to country information:
1 BYTE info ID
if info ID <> 1
1 DWORD pointer to information
if info ID == 1
1 WORD size
1 WORD country ID
1 WORD code page
34 BYTE see function 38h
-----------------------------------------------------------
INT 21 - GET/SET GLOBAL CODE PAGE TABLE (DOS 3.3)
AH = 66h
AL = 00h get global code page
Return: AX = error code if carry flag set
BX = active code page
DX = system code page
= 01h set global page
BX = active code page
DX = system code page (active page at boot time)
Return: AX = error code if carry flag set
-----------------------------------------------------------
INT 21 - SET HANDLE COUNT (DOS 3.3)
AH = 67h
BX = desired number of handles (max 255)
Return: Carry clear if ok
Carry set if error (and error code in AX)
-----------------------------------------------------------
INT 21 - COMMIT FILE - WRITE ALL BUFFERED DATA TO DISK (DOS 3.3)
AH = 68h
BX = file handle
Return: carry flag set on error (and error code in AX)
-----------------------------------------------------------
INT 21 - DoubleDos -
AX = E400h
Return: AL <> 0 if DoubleDos is active
-----------------------------------------------------------
INT 21 - DoubleDos - Turn off Task Switching
AH = EAh
Return: task switching turned off
-----------------------------------------------------------
INT 21 - DoubleDos - Turn on Task Switching
AH = EBh
Return: task switching turned on
-----------------------------------------------------------
INT 21 - DoubleDos - Get Virtual Screen Address
AH = ECh
Return: ES = segment of virtual screen
Note: Screen address can change if task-switching is on!!
-----------------------------------------------------------
INT 21 - DoubleDos - Give away time to other tasks
AH = EEh
AL = number of 55ms time slices to give away
Return: returns after giving away time slices
-----------------------------------------------------------
INT 21 - CED installable commands
AH = 0FFh
AL = 0 add installable command
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
AL = 1 remove installable command
DS:SI pointer to CR-terminated command name
AL = 2 reserved, may be used to test for CED installation
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
-----------------------------------------------------------
INT 22 - TERMINATE ADDRESS
FAR (DWORD) address of routine to be executed when program
"returns to DOS". Should NEVER be called directly.
-----------------------------------------------------------
INT 23 - CONTROL "C" EXIT ADDRESS
Automatically called from keyboard scanner when CTRL-C or
CTRL-BREAK is detected. Normally aborts program and returns
to DOS, but may be changed.
-----------------------------------------------------------
INT 24 - FATAL ERROR ABORT ADDRESS
Automatically called upon detection of unrecoverable
disk error. Normally prints "Abort, Retry, or Ignore?" message
and takes the reply, but may be changed if desired.
Provides the following values in registers on entry to interrupt handler:
AH: bit 7 = 0 disk I/O error
= 1 other error -- if block device, bad FAT
-- if char device, code in DI
bit 6 unused
bit 5 = 1 if Ignore allowed, 0 if not (DOS 3.2?)
bit 4 = 1 if Retry allowed, 0 if not (DOS 3.2?)
bit 3 = 1 if Fail allowed, 0 if not (DOS 3.2+)
bit 2 \ disk area of error 00 = DOS area 01 = FAT
bit 1 / 10 = root dir 11 = data area
bit 0 = 1 if write, 0 if read
AL = drive number if AH bit 7 = 1, otherwise undefined
BP:SI = address of device header for which error occurred
block device if high bit of BP:SI+4 = 1
low byte of DI:
00h write-protect error
01h unknown unit
02h drive not ready
03h unknown command
04h data error (bad CRC)
05h bad request structure length
06h seek error
07h unknown media type
08h sector not found
09h printer out of paper
0Ah write fault
0Bh read fault
0Ch general failure
0Fh invalid disk change (DOS 3.x)
Handler must return
AL = 00 ignore error
= 01 retry operation
= 02 terminate program through INT 22h
= 03 fail system call in progress (DOS 3.2+)
-----------------------------------------------------------
INT 25 - ABSOLUTE DISK READ
AL = Drive number (0=A, 1=B, etc)
DS:BX = Disk Transfer Address (buffer)
CX = Number of sectors to read
DX = First relative sector to read
Return: CF = 1 if error
AL = error code issued to INT 24h in low half of DI
AH = 80h if attachment failed to respond
40h if seek operation failed
20h if controller failed
10h if data error (bad CRC)
08h if DMA failure
04h if requested sector not found
03h if write-protected disk
02h if bad address mark
01h if bad command
Note: ORIGINAL FLAGS ON STACK!
-----------------------------------------------------------
INT 26 - ABSOLUTE DISK WRITE
AL = Drive number (0=A, 1=B, etc)
DS:BX = Disk Transfer Address (buffer)
CX = Number of sectors to write
DX = First relative sector to write
Return: CF = 1 if error
AL = error code issued to INT 24h in low half of DI
AH = same error codes as for INT 25h
Note: ORIGINAL FLAGS ON STACK!
-----------------------------------------------------------
INT 27 - TERMINATE BUT STAY RESIDENT
CS = current program segment
DX = last program byte + 1
-----------------------------------------------------------
INT 28 - Internal - Keyboard Busy Loop
This interrupt is called from inside the "get input from keyboard"
routine in DOS, if and only if it is safe to use INT 21 to access
the disk at that time. It is used primarily by the PRINT.COM
routines and TSR programs, but any number of other routines could
be chained to it by saving the original vector, and calling it
with a FAR call (or just JMPing to it) at the end of the new
routine.
The INT 28h handler may invoke any INT 21h function except functions
00h through 0Ch (and 50h/51h under DOS 2.xx).
Until some program installs its own routine, this interrupt vector
simply points to an IRET opcode.
-----------------------------------------------------------
INT 29 - Internal - Fast Putchar
This interrupt is called from the DOS output routines if output
is going to a device rather than a file, and the device driver's
attribute word has bit 3 (04h) set to "1".
-----------------------------------------------------------
INT 2A - Network Installation Check (Microsoft Networks)
AH = 00h
Return: AH <> 0 if installed
-----------------------------------------------------------
INT 2A - Check Direct I/O (Microsoft Networks)
AX = 0300h
DS:SI -> ASCIIZ disk device name
Return: CF == 0 if allowed
-----------------------------------------------------------
INT 2A - Execute NETBIOS (Microsoft Networks)
AH = 04h
AL = 0 for error retry, 1 for no retry
ES:BX -> NCB
Return: AX = 0 for no error
AH = 1, AL = error code
-----------------------------------------------------------
INT 2A - Get Network Resource Information (Microsoft Networks)
AX = 0500h
Return: AX = reserved
BX = number of network names
CX = number of commands
DX = number of sessions
-----------------------------------------------------------
INT 2A - Unknown
AH = 82h
Return: ???
Note: Called by the INT 21h function dispatcher in DOS 3.10
-----------------------------------------------------------
INT 2B - Internal routine for MSDOS (IRET)
-----------------------------------------------------------
INT 2C - Internal routine for MSDOS (IRET)
-----------------------------------------------------------
INT 2D - Internal routine for MSDOS (IRET)
-----------------------------------------------------------
INT 2E - Internal - Execute Command
ES:SI -> counted CR-terminated command string
The top-level command.com executes the command; all registers
are destroyed as in exec.
-----------------------------------------------------------
INT 2F - Multiplexor - PRINT Installation Check
AX = 0100h
Return: AL =
FFh installed
01h not installed, not OK to install
00h not installed, OK to install
-----------------------------------------------------------
INT 2F - Multiplexor - PRINT Submit file
AX = 0101h
DS:DX -> packet of one byte level and DWORD file pointer
Return: CF = 1 if error
AX = Error Code
-----------------------------------------------------------
INT 2F - Multiplexor - PRINT Remove file
AX = 0102h
DS:DX -> file name (wildcards allowed)
Return: CF = 1 if error
AX = Error Code
-----------------------------------------------------------
INT 2F - Multiplexor - PRINT Remove all files
AX = 0103h
Return: CF = 1 if error
AX = Error Code
-----------------------------------------------------------
INT 2F - Multiplexor - PRINT Hold queue/Get status
AX = 0104h
Return: CF = 1 if error
AX = Error Code
01h function invalid
02h file not found
03h path not found
04h too many open files
05h access denied
08h queue full
09h spooler busy
0Ch name too long
0Fh drive invalid
DX = Error count
DS:SI -> print queue (null-string terminated
list of 64-byte ASCIZ file names)
-----------------------------------------------------------
INT 2F - Multiplexor - PRINT Restart queue
AX = 0105h
Return: Flag CF = 1 if error
AX = Error Code if any
-----------------------------------------------------------
INT 2F - Multiplexor - ASSIGN Installation Check
AX = 0600h
Return: AH <> 0 if installed
-----------------------------------------------------------
INT 2F - Multiplexor - ASSIGN
AX = 0601h XXX
-----------------------------------------------------------
INT 2F - Multiplexor - MSDOS Internal
AH = 10h XXX
-----------------------------------------------------------
INT 2F - Multiplexor - MSDOS Internal
AH = 11h XXX
-----------------------------------------------------------
INT 2F - Multiplexor - MSDOS Internal
AH = 12h XXX
-----------------------------------------------------------
INT 2F - Multiplexor - APPEND Installation Check
AX = B700h
Return: AH <> 0 if installed
-----------------------------------------------------------
INT 2F - Multiplexor - APPEND
AX = B701h XXX
-----------------------------------------------------------
INT 2F - Multiplexor - Network Program Installation Check
AX = B800h
Return: AH <> 0 if installed
-----------------------------------------------------------
INT 2F - Multiplexor - Get Current Post Address
AX = B803h
Return: ES:BX = post address
-----------------------------------------------------------
INT 2F - Multiplexor - Set New Post Address
AX = B804h
ES:BX = new post address
-----------------------------------------------------------
INT 30 -> (NOT A VECTOR!) FAR jump instruction for CP/M-style calls
INT 31
-----------------------------------------------------------
INT 32 -> not used
-----------------------------------------------------------
INT 33 -> USED BY MICROSOFT MOUSE
-----------------------------------------------------------
INT 40 -> Relocated (by fixed disk) Floppy Handler (original INT 13h)
-----------------------------------------------------------
INT 41 -> Fixed Disk Params
dw cylinders
db heads
dw 0
dw write pre-comp
db 0
db 0 "control byte"
db 0, 0, 0
dw landing zone
db sectors/track
db 0
-----------------------------------------------------------
INT 42 -> Relocated (by EGA) Video Handler (original INT 10h)
-----------------------------------------------------------
INT 43 -> EGA Initialization Params
-----------------------------------------------------------
INT 44 -> EGA/PCjr fonts
-----------------------------------------------------------
INT 45 -> reserved
-----------------------------------------------------------
INT 46 -> Secondary Fixed Disk Params (see INT 41h)
-----------------------------------------------------------
INT 47 -> reserved
-----------------------------------------------------------
INT 48 -> PCjr Cordless Keyboard Translation
-----------------------------------------------------------
INT 49 -> PCjr Non-keyboard Scan Code Translation Table
-----------------------------------------------------------
INT 4A -> AT User Alarm
-----------------------------------------------------------
INT 4B -> reserved
-----------------------------------------------------------
INT 4C -> reserved
-----------------------------------------------------------
INT 4D -> reserved
-----------------------------------------------------------
INT 4E -> reserved
-----------------------------------------------------------
INT 4F -> reserved
-----------------------------------------------------------
INT 50-57 -> IRQ0-IRQ7 relocated by DESQview
-----------------------------------------------------------
INT 58 -> reserved
-----------------------------------------------------------
INT 59 -> reserved
-----------------------------------------------------------
INT 5A -> reserved
-----------------------------------------------------------
INT 5B -> reserved
-----------------------------------------------------------
INT 5C - NETBIOS interface
ES:BX -> Network Control Block
-----------------------------------------------------------
INT 5D -> reserved
-----------------------------------------------------------
INT 5E -> reserved
-----------------------------------------------------------
INT 5F -> reserved
-----------------------------------------------------------
INT 60-67 -> reserved for user interrupts
-----------------------------------------------------------
INT 67 - LIM EMS - Get Manager Status
AH = 40h
Return: AH = status
00h successful
80h internal error
81h hardware malfunction
84h undefined function requested by application
Note: this call can be used only after establishing that the EMS driver
is in fact present
-----------------------------------------------------------
INT 67 - LIM EMS - Get Page Frame Segment
AH = 41h
Return: AH = 00h function successful
BX = segment of page frame
AH = error code (see AH=40h above)
-----------------------------------------------------------
INT 67 - LIM EMS - Get Number of Pages
AH = 42h
Return: AH = 00h function successful
BX = number of unallocated pages
DX = total number of pages
AH = error code (see AH=40h above)
-----------------------------------------------------------
INT 67 - LIM EMS - Get Handle and Allocate Memory
AH = 43h
BX = number of logical pages to allocate
Return: AH = status
00h function successful
DX = handle
80h internal error
81h hardware malfunction
84h undefined function requested
85h no more handles available
87h more pages requested than physically exist
88h more pages requested than currently available
89h zero pages requested
-----------------------------------------------------------
INT 67 - LIM EMS - Map Memory
AH = 44h
AL = physical page number (0-3)
BX = logical page number
DX = handle
Return: AH = status
00h function successful
80h internal error
81h hardware malfunction
83h invalid handle
84h undefined function requested
8Ah invalid logical page number
8Bh illegal physical-page number
-----------------------------------------------------------
INT 67 - LIM EMS - Release Handle and Memory
AH = 45h
DX = EMM handle
Return: AH = status
00h successful
80h internal error
81h hardware malfunction
83h invalid handle
84h undefined function requested
86h error in save or restore of mapping context
-----------------------------------------------------------
INT 67 - LIM EMS - Get EMM Version
AH = 46h
Return: AH = status
00h successful
AL = EMM version number
80h internal error
81h hardware malfunction
84h undefined function requested
-----------------------------------------------------------
INT 67 - LIM EMS - Save Mapping Context
AH = 47h
DX = handle
Return: AH = status
00h successful
80h internal error
81h hardware malfunction
83h invalid handle
84h undefined function requested
8Ch page-mapping hardware state save area is full
8Dh save of mapping context failed
-----------------------------------------------------------
INT 67 - LIM EMS - Restore Maping Context
AH = 48h
DX = handle
Return: AH = status
00h successful
80h internal error
81h hardware malfunction
83h invalid handle
84h undefined function requested
8Eh restore of mapping context failed
-----------------------------------------------------------
INT 67 - LIM EMS - reserved
AH = 49h
Note: defined in EMS 3.0, but undocumented in EMS 3.2
-----------------------------------------------------------
INT 67 - LIM EMS - reserved
AH = 4Ah
Note: defined in EMS 3.0, but undocumented in EMS 3.2
-----------------------------------------------------------
INT 67 - LIM EMS - Get Number of EMM Handles
AH = 4Bh
Return: AH = status
00h successful
BX = number of EMM handles
80h internal error
81h hardware malfunction
83h invalid handle
84h undefined function requested
-----------------------------------------------------------
INT 67 - LIM EMS - Get Pages Owned by Handle
AH = 4Ch
DX = EMM handle
Return: AH = status
00h successful
BX = number of logical pages
80h internal error
81h hardware malfunction
83h invalid handle
84h undefined function requested
-----------------------------------------------------------
INT 67 - LIM EMS - Get Pages for All Handles
AH = 4Dh
ES:DI = pointer to array to receive information
Return: AH = status
00h successful
BX = number of active EMM handles
array filled with 2-word entries, consisting of a handle
and the number of pages allocated to that handle
80h internal error
81h hardware malfunction
84h undefined function requested
-----------------------------------------------------------
INT 67 - LIM EMS - Get or Set Page Map
AH = 4Eh
AL = 00h if getting mapping registers
01h if setting mapping registers
02h if getting and setting mapping registers at once
03h if getting size of page-mapping array
DS:SI = pointer to array holding information (AL=01/02)
ES:DI = pointer to array to receive information (AL=00/02)
Return: AH = status
00h successful
AL = bytes in page-mapping array (subfunction 03h only)
array pointed to by ES:DI receives mapping info (AL=00/02)
80h internal error
81h hardware malfunction
84h undefined function requested
8Fh undefined subfunction parameter
A3h contents of source array corrupted (EMS 4.0?)
Note: this function was designed to be used by multitasking operating systems
and should not ordinarily be used by appplication software.
-----------------------------------------------------------
INT 67 - LIM EMS 4.0 - Get/Set Partial Page Map
AH = 4Fh
AL = subfunction
00h get partial page map
DS:SI = pointer to structure containing list of segments whose
mapping contexts are to be saved
ES:DI = pointer to array to receive page map
01h set partial page map
DS:SI = pointer to structure containing saved partial page map
02h get size of partial page map
BX = number of mappable segments in the partial map to be saved
Return: AH = status
00h successful
80h internal error
81h hardware malfunction
84h undefined function requested
8Bh one of specified segments is not mappable
8Fh undefined subfunction parameter
A3h contents of partial page map corrupted or count of mappable
segments exceeds total number of mappable segments in system
AL = size of partial page map for subfunction 02h
-----------------------------------------------------------
INT 67 - LIM EMS 4.0 - Map/Unmap Multiple Handle Pages
AH = 50h
AL = subfunction
00h
01h
DX = handle
CX = number of entries in array
DS:SI = pointer to mapping array
Return: AH = status
00h successful
80h internal error
81h hardware malfunction
83h invalid handle
84h undefined function requested
8Ah one or more logical pages are invalid
8Bh one or more physical pages are invalid
8Fh invalid subfunction
-----------------------------------------------------------
INT 67 - LIM EMS 4.0 - Reallocate Pages
AH = 51h
DX = handle
BX = number of pages to be allocated to handle
Return: BX = actual number of pages allocated to handle
AH = status
00h successful
80h internal error
81h hardware malfunction
83h invalid handle
84h undefined function requested
87h more pages requested than present in system
88h more pages requested than currently available
-----------------------------------------------------------
INT 67 - LIM EMS 4.0 - Get/Set Handle Attributes
AH = 52h
AL = subfunction
00h get handle attributes
01h set handle attributes
BL = new attribute (see returned AL)
02h get attribute capability
DX = handle
Return: AL = attribute (for subfunction 00h)
00h handle is volatile
01h handle is nonvolatile
AL = attribute capability (for subfunction 02h)
00h only volatile handles supported
01h both volatile and non-volatile supported
AH = status
00h successful
80h internal error
81h hardware malfunction
83h invalid handle
84h undefined function requested
8Fh undefined subfunction
90h undefined attribute type
91h feature not supported
-----------------------------------------------------------
INT 67 - LIM EMS 4.0 - Get/Set Handle Name
*-*-*---------cut-----------cut----------------cut--------------*-*-*
Append part 3 here.
--
{harvard,uunet,ucbvax}!b.gp.cs.cmu.edu!ralf -=-=- AT&T: (412)268-3053 (school)
ARPA: RALF@B.GP.CS.CMU.EDU |"Tolerance means excusing the mistakes others make.
FIDO: Ralf Brown at 129/31 | Tact means not noticing them." --Arthur Schnitzler
BITnet: RALF%B.GP.CS.CMU.EDU@CMUCCVMA -=-=- DISCLAIMER? I claimed something?