ralf@b.gp.cs.cmu.edu (Ralf Brown) (09/18/88)
AL = subfunction 0 reset typematic (PCjr) 1 increase initial delay (PCjr) 2 increase continuing delay (PCjr) 3 increase both delays (PCjr) 4 turn off typematic (PCjr) 5 Set typematic rate (AT or PS/2) BH = 00 - 03 for delays of 250ms, 500ms, 750ms, or 1s BL = 00 - 1F for typematic rates of 30cps down to 2cps ------------------------------------------------------ INT 16 - KEYBOARD - KEYCLICK (Jr,CONV) AH = 04h AL = 0 click off 1 click on ------------------------------------------------------ INT 16 - KEYBOARD - WRITE TO KEYBOARD BUFFER (AT model 339,XT2,XT286,PS) AH = 05h CH = scan code CL = character Return: AL = 1 if buffer full ------------------------------------------------------ INT 16 - KEYBOARD - GET ENHANCED KEYSTROKE (AT model 339,XT2,XT286,PS) AH = 10h Return: AH = scan code AL = character ------------------------------------------------------ INT 16 - KEYBOARD - CHECK ENHANCED KEYSTROKE (AT model 339,XT2,XT286,PS) AH = 11h Return: ZF = 0 if keystroke available AH = scan code \ meaningless if ZF = 1 AL = character / ZF = 1 if kbd buffer empty ------------------------------------------------------ INT 16 - KEYBOARD - GET ENHANCED SHIFT FLAGS (AT model 339,XT2,XT286,PS) AH = 12h Return: AL (same as for AH=02h) bit 7: Ins ON bit 6: CapsLock ON bit 5: NumLock ON bit 4: ScrollLock ON bit 3: Either ALT key down bit 2: Either CTRL key down bit 1: Left shift key down bit 0: Right shift key down AH bit 7: SysReq key down bit 6: CapsLock key down bit 5: NumLock key down bit 4: ScrollLock key down bit 3: Right Alt key down bit 2: Right Ctrl key down bit 1: Left Alt key down bit 0: Right Alt key down ------------------------------------------------------ INT 17 - PRINTER - OUTPUT CHARACTER AH = 00h AL = character DX = printer port (0-3) Return: AH = status bits 0 = time out 1 = unused 2 = unused 3 = I/O error 4 = selected 5 = out of paper 6 = acknowledge 7 = not busy ------------------------------------------------------ INT 17 - PRINTER - INITIALIZE AH = 01h DX = printer port (0-3) Return: AH = status (see AH = 00h above) ------------------------------------------------------ INT 17 - PRINTER - GET STATUS AH = 02h DX = printer port (0-3) Return: AH = status (see AH = 00h above) ------------------------------------------------------ INT 18 - TRANSFER TO ROM BASIC causes transfer to ROM-based BASIC (IBM-PC) often reboots a compatible; often has no effect at all ------------------------------------------------------ INT 19 - DISK BOOT causes reboot of disk system (no memory test performed) ------------------------------------------------------ INT 1A - CLOCK - GET TIME OF DAY AH = 00h Return: CX:DX = clock count AL = 0 if clock was read or written (via AH=0,1) within the current 24-hour period Otherwise, AL > 0 ------------------------------------------------------ INT 1A - CLOCK - SET TIME OF DAY AH = 01h CX:DX = clock count Return: time of day set ------------------------------------------------------ INT 1A - CLOCK - READ REAL TIME CLOCK (AT,XT286,CONV,PS) AH = 02h Return: CH = hours in BCD CL = minutes in BCD DH = seconds in BCD ------------------------------------------------------ INT 1A - CLOCK - SET REAL TIME CLOCK (AT,XT286,CONV,PS) AH = 03h CH = hours in BCD CL = minutes in BCD DH = seconds in BCD DL = 1, if daylight savings; 0 if standard time Return: CMOS clock set ------------------------------------------------------ INT 1A - CLOCK - READ DATE FROM REAL TIME CLOCK (AT,XT286,CONV,PS) AH = 04h Return: DL = day in BCD DH = month in BCD CL = year in BCD CH = century (19h or 20h) ------------------------------------------------------ INT 1A - CLOCK - SET DATE IN REAL TIME CLOCK (AT,XT286,CONV,PS) AH = 05h DL = day in BCD DH = month in BCD CL = year in BCD CH = century (19h or 20h) Return: CMOS clock set ------------------------------------------------------ INT 1A - CLOCK - SET ALARM (AT,XT286,CONV,PS) AH = 06h CH = hours in BCD CL = minutes in BCD DH = seconds in BCD Return: CF set if alarm already set or clock inoperable INT 4Ah will be called when alarm goes off, every 24 hours until reset ------------------------------------------------------ INT 1A - CLOCK - RESET ALARM (AT,XT286,CONV,PS) AH = 07h Return: alarm disabled ------------------------------------------------------ INT 1A - CLOCK - SET RTC ACTIVATED POWER ON MODE (CONVERTIBLE) AH = 08h CH = hours in BCD CL = minutes in BCD DH = seconds in BCD ------------------------------------------------------ INT 1A - CLOCK - READ RTC ALARM TIME AND STATUS (CONV,PS30) AH = 09h Return: CH = hours in BCD CL = minutes in BCD DH = seconds in BCD DL = alarm status 0 alarm not enabled 1 alarm enabled but will not power up system 2 alarm will power up system ------------------------------------------------------ INT 1A - CLOCK - READ SYSTEM-TIMER DAY COUNTER (XT2,PS) AH = 0Ah Return: CF set on error CX = count of days since Jan 1,1980 ------------------------------------------------------ INT 1A - CLOCK - SET SYSTEM-TIMER DAY COUNTER (XT2,PS) AH = 0Bh CX = count of days since Jan 1,1980 Return: CF set on error ------------------------------------------------------ INT 1A - SET UP SOUND MULTIPLEXOR (PCjr ONLY) AH = 80h AL = 0 source is 8253 channel 2 1 source is cassette input 2 source is I/O channel "Audio IN" 3 source is sound generator chip ------------------------------------------------------ INT 1B - CTRL-BREAK KEY This interrupt is called when the keyboard scanner of the IBM machines detects CTRL and BREAK pressed at the same time. It normally points to a short routine in DOS which sets the Ctrl-C flag, thus invoking INT 23h the next time DOS checks for Ctrl-C. ------------------------------------------------------ INT 1C - CLOCK TICK This interrupt is called (in the IBM) at the end of each time-update operation by the time-of-day routines. It normally points to an IRET. ------------------------------------------------------ INT 1D -> 6845 VIDEO INIT TABLES table for modes 0 and 1 \ table for modes 2 and 3 \ each table is 16 bytes long and table for modes 4,5, and 6 / contains values for 6845 registers table for mode 7 / 4 words -- size of video RAM for modes 0/1, 2/3, 4/5, and 6/7 8 bytes -- number of columns in each mode 8 bytes -- video controller mode byte for each mode ------------------------------------------------------ INT 1E -> DISKETTE PARAMS (BASE TABLE) (Default at F000:EFC7 in PC and most compatibles) DB step rate & head unload times DB head load time & DMA DB motor off time in clock ticks (36 or 37 typical) DB sector size in bytes (0->128, 1->256, 2->512, 3->1024) DB last sector number (8 or 9 typical) DB inter-sector gap size on read/write (42 typical) DB data transfer length (255 typical) DB inter-sector gap size on format (80 typical) DB sector fill on format (F6h typical) DB head-settle time ms (typical 25, 1.10->0, 2.10->15, 3.10->1) DB motor start-up time (1/8 secs) (typical 4, 2.10->2) ------------------------------------------------------ INT 1F -> GRAPHICS SET 2 (NOT a vector!) pointer to bitmaps for high 128 chars ------------------------------------------------------ INT 20 - Minix - SEND/RECEIVE MESSAGE AX = process ID of other process BX = pointer to message CX = 1 send 2 receive 3 send&receive Note: the message contains the system call number (numbered as in V7 Unix(tm)) and the call parameters ------------------------------------------------------ INT 20 - DOS - PROGRAM TERMINATION returns to DOS--identical to INT 21/AH=00h ------------------------------------------------------ INT 21 - DOS - PROGRAM TERMINATION AH = 00h Return: never ------------------------------------------------------ INT 21 - DOS - KEYBOARD INPUT AH = 01h Return: AL = character read Note: ^C/^Break are checked, and INT 23h executed if read character is echoed to standard output ------------------------------------------------------ INT 21 - DOS - DISPLAY OUTPUT AH = 02h DL = character to send to standard output Note: ^C/^Break are checked, and INT 23h executed if pressed ------------------------------------------------------ INT 21 - DOS - AUX INPUT AH = 03h Return: AL = character read ------------------------------------------------------ INT 21 - DOS - AUX OUTPUT AH = 04h DL = character to send ------------------------------------------------------ INT 21 - DOS - PRINTER OUTPUT AH = 05h DL = character to print ------------------------------------------------------ INT 21 - DOS - DIRECT CONSOLE I/O CHARACTER OUTPUT AH = 06h DL = character <> FFh ------------------------------------------------------ INT 21 - DOS - DIRECT CONSOLE I/O CHARACTER INPUT AH = 06h DL = 0FFh Return: ZF set = no character ZF clear = character recieved AL = character Notes: Character is echoed to STDOUT if received. ^C/^Break are NOT checked ------------------------------------------------------ INT 21 - DOS - DIRECT STDIN INPUT, NO ECHO AH = 07h Note: same as function 06h for input but char not echoed ------------------------------------------------------ INT 21 - DOS - KEYBOARD INPUT, NO ECHO AH = 08h Return: AL = character Note: same as function 07h, but ^C/^Break are checked ------------------------------------------------------ INT 21 - DOS - PRINT STRING AH = 09h DS:DX = address of string terminated by "$" Note: ^C/^Break checked, and INT 23h called if pressed ------------------------------------------------------ INT 21 - DOS - BUFFERED KEYBOARD INPUT AH = 0Ah DS:DX = address of buffer Note: first byte of buffer must contain maximum length on entry, second byte contains actual length of previous line which may be recalled with the DOS line-editing commands on return the second byte contains actual length, third and subsequent bytes contain the input line ------------------------------------------------------ INT 21 - DOS - CHECK STANDARD INPUT STATUS AH = 0Bh Return: AL = FFh if character available 00h if no character Note: ^C/^Break checked, and INT 23h called if pressed ------------------------------------------------------ INT 21 - DOS - CLEAR KEYBOARD BUFFER AH = 0Ch AL must be 1, 6, 7, 8, or 0Ah. Notes: Flushes all typeahead input, then executes function specified by AL (effectively moving it to AH and repeating the INT 21 call). If AL contains a value not in the list above, the keyboard buffer is flushed and no other action is taken. ------------------------------------------------------ INT 21 - DOS - DISK RESET AH = 0Dh Note: Flushes all disk buffers. ------------------------------------------------------ INT 21 - DOS - SELECT DISK AH = 0Eh DL = new default drive number (0 = A, 1 = B, etc.) Return: AL = number of logical drives ------------------------------------------------------ INT 21 - DOS - OPEN DISK FILE AH = 0Fh DS:DX = address of FCB Return: AL = 00h file found FFh file not found Note: (DOS 3.x) file opened in compatibility mode ------------------------------------------------------ INT 21 - DOS - CLOSE DISK FILE AH = 10h DS:DX = address of FCB Return: AL = 00h directory update successful FFh file not found in directory ------------------------------------------------------ INT 21 - DOS - SEARCH FIRST USING FCB AH = 11h DS:DX = address of FCB Return: AL = status 00h file found FFh file not found Note: If file found, FCB is created at DTA address and set up to OPEN or DELETE it. ------------------------------------------------------ INT 21 - DOS - SEARCH NEXT USING FCB AH = 12h DS:DX = address of FCB Return: AL = status 00h file found FFh file not found Note: If file found, FCB is created at DTA address and set up to OPEN or DELETE it. ------------------------------------------------------ INT 21 - DOS - DELETE FILE via FCB AH = 13h DS:DX = address of FCB with filename field filled with template for deletion ('?' wildcard allowed) Return: AL = status 00h file found FFh file not found ------------------------------------------------------ INT 21 - DOS - SEQUENTIAL DISK FILE READ AH = 14h DS:DX = address of FCB Return: AL = status 0 successful read 1 end of file 2 data transfer area too small 3 partial record, EOF ------------------------------------------------------ INT 21 - DOS - SEQUENTIAL DISK RECORD WRITE AH = 15h DS:DX = address of FCB Return: AL = status 0 successful write 1 disk full 2 data transfer area too small ------------------------------------------------------ INT 21 - DOS - CREATE A DISK FILE AH = 16h DS:DX = address of FCB Return: AL = status 00h successful creation FFh directory full Note: if file already exists, it is truncated to zero length ------------------------------------------------------ INT 21 - DOS - RENAME FILE via FCB AH = 17h DS:DX = address of FCB FCB contains new name starting at byte 17h. Return: AL = status 00h file found FFh file not found ------------------------------------------------------ INT 21 - DOS Internal - UNUSED AH = 18h Return: AL = 0 ------------------------------------------------------ INT 21 - DOS - GET DEFAULT DISK NUMBER AH = 19h Return: AL = current drive number (letter - 'A') ------------------------------------------------------ INT 21 - DOS - SET DISK TRANSFER AREA ADDRESS AH = 1Ah DS:DX = address of buffer ------------------------------------------------------ INT 21 - DOS - ALLOCATION TABLE INFORMATION AH = 1Bh Return: DS:BX points to FAT ID byte for default drive DX = number of allocation units on disk AL = number of sectors per allocation unit (cluster) CX = number of bytes per sector ------------------------------------------------------ INT 21 - DOS - ALLOCATION TABLE INFORMATION FOR SPECIFIC DEVICE AH = 1Ch DL = Drive Number to check Return: DS:BX points to FAT ID byte DX = number of allocation units on disk AL = number of sectors per allocation unit (cluster) CX = number of bytes per sector ------------------------------------------------------ INT 21 - DOS Internal - UNUSED AH = 1Dh Return: AL = 0 ------------------------------------------------------ INT 21 - DOS Internal - UNUSED AH = 1Eh Return: AL = 0 ------------------------------------------------------ INT 21 - DOS Internal - GET DEFAULT DRIVE PARAMETER BLOCK AH = 1Fh Return: AL = 00h No Error FFh Error DS:BX -> drive parameter block Note: for DOS 2.x and 3.x, this just invokes function 32h with DL = 0 ------------------------------------------------------ INT 21 - DOS Internal - UNUSED AH = 20h Return: AL = 0 ------------------------------------------------------ INT 21 - DOS - RANDOM DISK RECORD READ AH = 21h DS:DX = address of FCB Return: AL = status 0 successful read 1 end of file 2 data transfer area too small 3 partial record, EOF ------------------------------------------------------ INT 21 - DOS - RANDOM DISK RECORD WRITE AH = 22h DS:DX = address of FCB Return: AL = status (see AH = 21h above) ------------------------------------------------------ INT 21 - DOS - GET FILE SIZE AH = 23h DS:DX = address of unopened FCB with filename and record size fields initialized Return: AL = status 00h file found FFh file not found Note: FCB's random-record field set to number of records (rounded up) ------------------------------------------------------ INT 21 - DOS - SET RANDOM RECORD FIELD AH = 24h DS:DX = address of FCB Return: Random Record Field of FCB is set to be same as Current Block and Current Record. Note: FCB must be OPEN already ------------------------------------------------------ INT 21 - DOS - SET INTERRUPT VECTOR AH = 25h AL = interrupt number DS:DX = new vector to be used for specified interrupt ------------------------------------------------------ INT 21 - DOS - CREATE PSP AH = 26h DX = Segment number to set up PSP at Return: Current PSP is copied to specified segment Note: new PSP is updated with memory size information; INTs 22h, 23h, 24h taken from interrupt vector table ------------------------------------------------------ INT 21 - DOS - RANDOM BLOCK READ AH = 27h DS:DX = address of FCB CX = number of records to be read Return: AL = status 0 successful read 1 end of file 2 data transfer area too small 3 partial record, EOF ------------------------------------------------------ INT 21 - DOS - 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 = status 0 successful write 1 disk full 2 data transfer area too small ------------------------------------------------------ INT 21 - DOS - PARSE FILENAME AH = 29h DS:SI -> string to parse ES:DI -> buffer 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 = 00h: no wildcards in name or extension 01h: wildcards appeared FFh: drive specifier invalid DS:SI -> first byte after parsed string ES:DI buffer filled with unopened FCB ------------------------------------------------------ INT 21 - DOS - GET CURRENT DATE AH = 2Ah Return: DL = day DH = month CX = year AL = day of the week (0=Sunday, 1=Monday, etc.) ------------------------------------------------------ INT 21 - DOS - SET CURRENT DATE AH = 2Bh DL = day DH = month CX = year Return: AL = 00h if no error = FFh if bad value sent to routine Note: DOS 3.3 also sets CMOS clock ------------------------------------------------------ INT 21 - DESQview - INSTALLATION CHECK AH = 2Bh AL = subfunction (DV v2.00+) 01h get version Return: BX = version (BH = major, BL = minor) Note: early copies of v2.00 return 0002h 02h get shadow buffer info, and start shadowing Return: BH = rows in shadow buffer BL = columns in shadow buffer DX = segment of shadow buffer 04h get shadow buffer info Return: BH = rows in shadow buffer BL = columns in shadow buffer DX = segment of shadow buffer 05h stop shadowing CX = 4445h ('DE') DX = 5351h ('SQ') Return: AL = FFh if DESQview not installed Note: in DESQview v1.x, there were no subfunctions; this call only identified whether or not DESQview was loaded ------------------------------------------------------ INT 21 - DOS - 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 - DOS - SET CURRENT TIME AH = 2Dh CH = hours CL = minutes DH = seconds DL = hundredths of seconds Return: AL = 00h if no error = FFh if bad value sent to routine Note: DOS 3.3 also sets CMOS clock ------------------------------------------------------ INT 21 - DOS - SET VERIFY FLAG AH = 2Eh DL = 0 AL = 1 VERIFY on 0 VERIFY off ------------------------------------------------------ INT 21 - DOS 2+ - GET DISK TRANSFER AREA ADDRESS AH = 2Fh Return: ES:BX = address of DTA ------------------------------------------------------ INT 21 - DOS 2+ - GET DOS VERSION AH = 30h Return: AL = Major Version number (0 for DOS 1.x) AH = Minor Version number BH = OEM number 00h IBM 16h DEC BL:CX = 24-bit user number ------------------------------------------------------ INT 21 - DOS 2+ - TERMINATE BUT STAY RESIDENT AH = 31h AL = exit code DX = program size, in paragraphs ------------------------------------------------------ INT 21 - DOS 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 FFh indicates block must be rebuilt (DOS 3.x) 00h indicates block accessed NEXT_BLOCK DD ? ; 24 address of next device block in list FFFFh indicates last block ; from this point on, DOS 3 differs from DOS 2: IF DOS2 DIR_START DW ? ; 28 starting cluster of current directory ; zero indicates the root directory PATH_NAME DB 64 DUP (?) ; 30 ASCIZ current directory path string ELSE DOS3 ; on my XT, this was always: DW 0 ; probably unused, values left from before DW 0FFFFh ; block was built ENDIF DPBLOCK ENDS ------------------------------------------------------ INT 21 - DOS 2+ - EXTENDED CONTROL-BREAK CHECKING AH = 33h AL = subfunction 00h get state 01h set state 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 - DOS 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.x (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 - DOS 2+ - GET INTERRUPT VECTOR AH = 35h AL = interrupt number Return: ES:BX = value of interrupt vector ------------------------------------------------------ INT 21 - DOS 2+ - GET 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 - DOS 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 - DOS 2+ - 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 2 = set if currency symbol replaces decimal pt 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, AL = char) byte 16h = data-list separator char byte 17h = 00h bytes 18h-21h reserved If error: CF set AX = error code ------------------------------------------------------ INT 21 - DOS 2+ - CREATE A SUBDIRECTORY (MKDIR) AH = 39h DS:DX = address of ASCIZ pathname Return: CF = 1 if error AX = Error Code ------------------------------------------------------ INT 21 - DOS 2+ - REMOVE A DIRECTORY ENTRY (RMDIR) AH = 3Ah DS:DX = address of ASCIZ pathname Return: CF = 1 if error AX = Error Code ------------------------------------------------------ INT 21 - DOS 2+ - CHANGE THE CURRENT DIRECTORY (CHDIR) AH = 3Bh DS:DX = address of ASCIZ directory name Return: CF = 1 if error AX = Error Code ------------------------------------------------------ INT 21 - DOS 2+ - 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 - DOS 2+ - 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 Return: CF = 1 if error AX = Error Code CF = 0 successful AX = file handle ------------------------------------------------------ INT 21 - DOS 2+ - CLOSE A FILE WITH HANDLE AH = 3Eh BX = file handle Return: CF = 1 if error AX = Error Code ------------------------------------------------------ INT 21 - DOS 2+ - 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 - DOS 2+ - WRITE TO FILE WITH HANDLE AH = 40h BX = file handle CX = number of bytes to write DS:DX -> buffer Return: CF = 1 if error AX = Error Code CF = 0 successful AX = number of bytes written Note: if CX is zero, no data is written, and the file is truncated or extended to the current position ------------------------------------------------------ INT 21 - DOS 2+ - DELETE A FILE (UNLINK) AH = 41h DS:DX -> ASCIZ name of file to delete Return: CF = 1 if error AX = Error Code ------------------------------------------------------ INT 21 - DOS 2+ - 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 - DOS 2+ - 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 DS:DX -> ASCIZ file name Return: CF = 1 if error AX = Error Code if any CX = file attributes on get ------------------------------------------------------ INT 21 - DOS 2+ - IOCTL - GET DEVICE INFORMATION AX = 4400h BX = file or device handle Return: CF set on error AX = error code CF clear if successful 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) ------------------------------------------------------ INT 21 - DOS 2+ - IOCTL - SET DEVICE INFORMATION AX = 4401h BX = device handle DH = 0 DL = device information to set (bits 0-7 from function 0) Return: CF set on error AX = error code ------------------------------------------------------ INT 21 - DOS 2+ - IOCTL - READ DEVICE CONTROL STRING AX = 4402h BX = device handle CX = number of bytes to read DS:DX -> buffer Return: CF set on error AX = error code CF clear if successful AX = number of bytes read ------------------------------------------------------ INT 21 - DOS 2+ - IOCTL - WRITE DEVICE CONTROL STRING AX = 4403h BX = device handle CX = number of bytes to write DS:DX -> buffer Return: CF set on error AX = error code CF clear if successful AX = number of bytes written ------------------------------------------------------ INT 21 - DOS 2+ - IOCTL - READ BLOCK DEVICE CONTROL STRING AX = 4404h BL = drive number (0=default) CX = number of bytes to read DS:DX -> buffer Return: CF set on error AX = error code CF clear if successful AX = number of bytes read ------------------------------------------------------ INT 21 - DOS 2+ - IOCTL - WRITE BLOCK DEVICE CONTROL STRING AX = 4405h BL = drive number (0=default) CX = number of bytes to write DS:DX -> buffer Return: CF set on error AX = error code CF clear if successful AX = number of bytes written ------------------------------------------------------ INT 21 - DOS 2+ - IOCTL - GET OUTPUT STATUS AX = 4406h BX = file or device handle Return: AL = FFh device ready 00h device not ready ------------------------------------------------------ INT 21 - DOS 2+ - IOCTL - GET OUTPUT STATUS AX = 4407h BX = file or device handle Return: AL = FFh device ready 00h device not ready Note: for DOS 2.x, files are always ready for output ------------------------------------------------------ INT 21 - DOS 3.x - IOCTL - BLOCK DEVICE CHANGEABLE AX = 4408h BL = drive number (0=default) Return: AX = 00h removable 01h fixed 0Fh invalid drive ------------------------------------------------------ INT 21 - DOS 3.x - IOCTL - BLOCK DEVICE LOCAL AX = 4409h BL = drive number (0=default) Return: DX = attribute word, bit 12 set if device is remote ------------------------------------------------------ INT 21 - DOS 3.x - IOCTL - HANDLE LOCAL AX = 440Ah BX = file handle Return: DX = attribute word, bit 15 set if file is remote ------------------------------------------------------ INT 21 - DOS 3.x - IOCTL - SET SHARING RETRY COUNT AX = 440Bh CX = delay (default 1) DX = retry count (default 3) Return: CF set on error AX = error code ------------------------------------------------------ INT 21 - DOS 3.3 - IOCTL - GENERIC AX = 440Ch BX = device handle CH = major subfunction CL = minor subfunction DS:DX -> parameter block Return: CF = 1 if error AX = Error Code ------------------------------------------------------ INT 21 - DOS 3.3 - IOCTL - BLOCK DEVICE REQUEST AX = 440Dh BL = drive number (0=default) CH = major subfunction 08h 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 -> parameter block Return: CF set on error AX = error code ------------------------------------------------------ INT 21 - DOS 3.3 - IOCTL - GET LOGICAL DEVICE AX = 440Eh BL = drive number (0=default) Return: CF set on error AX = error code CF clear if successful AL = 0 block device has only one logical drive assigned 1..n the last letter used to reference the device (1=A:,etc) ------------------------------------------------------ INT 21 - DOS 3.3 - IOCTL - SET LOGICAL DEVICE AX = 440Fh BL = drive number (0=default) the drive is forced to appear as drive BL (???) Return: CF set on error AX = error code ------------------------------------------------------ INT 21 - DOS 2+ - 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 - DOS 2+ - 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 - DOS 2+ - 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 Note: the returned path does not include the initial backslash ------------------------------------------------------ INT 21 - DOS 2+ - 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 - DOS 2+ - FREE MEMORY AH = 49h ES = Segment address of area to be freed Return: CF = 1 if error AX = Error Code ------------------------------------------------------ INT 21 - DOS 2+ - ADJUST MEMORY 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 - DOS 2+ - LOAD OR EXECUTE (EXEC) AH = 4Bh AL = subfunction 0 = load and execute program 1 = load but do not execute (internal, DOS 3.x & DESQview only) 2 = load but do not execute (internal, DOS 2.x only) 3 = load overlay; do not create PSP DS:DX = filename ES:BX = parameter block AL = 0: WORD segment of environment (0 = use current) DWORD -> command line DWORD -> FCB 1 DWORD -> FCB 2 1: WORD segment of environment (0 = use current) DWORD -> command line DWORD -> FCB 1 DWORD -> FCB 2 DWORD will hold SS:SP on return DWORD will hold program entry point (CS:IP) on return 2: WORD segment of environment (0 = use current) DWORD -> command line DWORD -> FCB 1 DWORD -> FCB 2 3: WORD segment load address WORD segment relocation factor Return: CF = 1 if error AX = Error Code CF = 0 if function 1, process ID set to new program's PSP; get with function 62h if function 2, new program's initial stack and entry point returned in registers struct exec { /* structure of .EXE file header */ 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 - DOS 2+ - QUIT WITH EXIT CODE (EXIT) AH = 4Ch AL = exit code Return: never returns ------------------------------------------------------ INT 21 - DOS 2+ - 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 - DOS 2+ - FIND FIRST ASCIZ (FIND FIRST) AH = 4Eh CX = search attributes DS:DX -> ASCIZ filename Return: CF = 1 if error AX = Error Code if any [DTA] = data block undocumented fields PC-DOS 3.10 byte 00h: drive letter bytes 01h-0Bh: search template byte 0Ch: search attributes DOS 2.x (and DOS 3.x except 3.1???) byte 00h: search attributes byte 01h: drive letter bytes 02h-0Ch: search template bytes 0Dh-0Eh: entry count within directory bytes 0Fh-12h: reserved bytes 13h-14h: cluster number of parent directory byte 15h: attribute of file found bytes 16h-17h: file time bytes 18h-19h: file date bytes 1Ah-1Dh: file size bytes 1Eh-3Ah: ASCIZ filename+extension ------------------------------------------------------ INT 21 - DOS 2+ - FIND NEXT ASCIZ (FIND NEXT) AH = 4Fh [DTA] = data block from last AH = 4Eh/4Fh call Return: CF = 1 if error AX = Error Code [DTA] = data block, see AH = 4Eh above ------------------------------------------------------ INT 21 - DOS 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 without setting the Critical Error flag ------------------------------------------------------ INT 21 - DOS Internal - GET PSP SEGMENT AH = 51h Return: BX = Current PSP Segment struct psp { char psp_int20[2]; /* 00h: program exit point */ unsigned psp_msize; /* 02h: memory size in paragraphs */ char psp_res0[1]; /* 04h: unused (0) */ char psp_dos[5]; /* 05h: CP/M entry point (far call to DOS) */ int (*psp_term)(); /* 0Ah: terminate address (old INT 22h) */ unsigned psp_tseg; /* 0Ch: terminate segment */ int (*psp_break)(); /* 0Eh: break address (old INT 23h) */ unsigned psp_bseg; /* 10h: break segment */ int (*psp_error)(); /* 12h: error address (old INT 24h) */ unsigned psp_eseg; /* 14h: error segment */ unsigned psp_ppsp; /* 16h: parent PSP segment */ char psp_ofile[20]; /* 18h: DOS 2+ open files, FFh = unused */ unsigned psp_envp; /* 2Ch: DOS 2+ environment segment */ char far *psp_oldstack; /* 2Eh: far ptr to process's SS:SP */ int psp_nfiles; /* 32h: DOS 3.x max open files */ char *psp_aofile; /* 34h: DOS 3.x openfile table address */ unsigned psp_aoseg; /* 36h: DOS 3.x openfile table segment */ char psp_res3[24]; /* 38h: unused by DOS versions <= 3.3 */ char psp_int21[3]; /* 50h: DOS function dispatcher (FAR routine)*/ char psp_res4[2]; /* 53h: unused */ char psp_xfcb1[7]; /* 55h: FCB #1 extension */ char psp_fcb1[16]; /* 5Ch: FCB #1 */ char psp_fcb2[20]; /* 6Ch: FCB #2 */ char psp_dma[128]; /* 80h: Command Tail / default DTA buffer */ }; Note: under DOS 2.xx, this function cannot be invoked inside an INT 28h handler without setting the Critical Error flag ------------------------------------------------------ INT 21 - DOS Internal - GET LIST OF LISTS AH = 52h Return: ES:BX points to DOS list of lists List of Lists: Bytes Value -2&-1 Segment of first memory control block 00h-03h Pointer to first DOS disk block (see function 36h) 04h-07h Pointer to list of DOS file tables DWORD pointer to next file table WORD number of files in this table 35h bytes per file 00h-01h number of file handles referring to this file 02h-06h ??? 07h-0Ah Pointer to device driver header if character device Pointer to DOS Device Control Block if block device (see func 32h for format) 0Bh-1Fh ??? 20h-2Ah filename in FCB format (no path, no period, blank-padded) 2Bh-2Ch PSP segment of file's owner 2Dh-30h ??? I see 0 always 31h-32h ??? 33h-34h ??? 08h-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 10h Number of logical drives in system 11h-12h Maximum bytes/block of any block device 13h-16h ??? 17h 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 12h-15h Pointer to first disk buffer 16h-19h Pointer to array of drive info: 51h bytes per drive, starting with A: ... 00-3F Current path as ASCIZ, starting with 'x:\' 40-43 ??? I see zeros always 44 ??? Flags? I see 40h, except entry after last valid entry = 00h 45-48 Pointer to DOS Disk Block for this drive 49-4A ??? Current track or block? -1 if never accessed. 4B-4E ??? I see -1 always 4F-50 ??? I see 2 always 1Ah-1Dh Pointer to FCB table (if CONFIG.SYS contains FCBS=) 1Eh-1Fh Size of FCB table 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. ------------------------------------------------------ INT 21 - DOS 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 09h-0Ah 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 16h B-C Number of sectors/FAT. Get from DDB byte 0Fh ------------------------------------------------------ INT 21 - DOS 2+ - GET VERIFY FLAG AH = 54h Return: AL = 0 if flag OFF AL = 1 if flag ON ------------------------------------------------------ INT 21 - DOS Internal - CREATE PSP AH = 55h DX = segment number at which to set up PSP Note: Like func 26h but creates "child" PSP rather than copying existing one. ------------------------------------------------------ INT 21 - DOS 2+ - RENAME A FILE AH = 56h DS:DX -> ASCIZ old name ES:DI -> ASCIZ new name Return: CF = 1 if error AX = Error Code Note: allows move between directories on same logical volume (DOS 3.x) allows renaming of directories ------------------------------------------------------ INT 21 - DOS 2+ - GET/SET FILE'S DATE/TIME AH = 57h AL = function code 0 = get date and time Return: CX = time of last write DX = date of last write 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 ------------------------------------------------------ INT 21 - DOS 3.x - GET/SET MEMORY ALLOCATION STRATEGY 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 - DOS 3.x - GET EXTENDED ERROR CODE AH = 59h BX = version code (0000 for DOS 3.x) Return: AX = extended error code BH = class of error BL = suggested action code CH = locus (where error occurred) CL, DX, SI, DI, BP, DS, and ES destroyed Error codes: 01h function number invalid 02h file not found 03h path not found 04h too many open files 05h access denied 06h invalid handle 07h memory control block destroyed 08h insufficient memory 09h memory block address invalid 0Ah environment invalid 0Bh format invalid 0Ch access code invalid 0Dh data invalid 0Fh invalid drive 10h attempted to remove current directory 11h not same device 12h no more files 13h disk write-protected 14h unknown unit 15h drive not ready 16h unknown command 17h data error (CRC) 18h bad request structure length 19h seek error 1Ah unknwon 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 disk change invalid 23h FCB unavailable 24h sharing buffer overflow 25h-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 Network BIOS 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 Queue not full 3Fh Not enough space to print file 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 Network BIOS session limit exceeded 46h Temporarily paused 47h Network request not accepted 48h Print/disk redirection paused (DOS 3.1 + MS Networks) 49h-4Fh reserved 50h file exists 51h reserved 52h cannot make directory 53h fail on INT 24h 54h (DOS 3.3) too many redirections 55h (DOS 3.3) duplicate redirection 56h (DOS 3.3) invalid password 57h (DOS 3.3) invalid parameter 58h (DOS 3.3) network data fault Error Classes: 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 0Ch already exists 0Dh unknown Suggested Action: 01h retry 02h delayed retry 03h prompt user 04h abort after cleanup 05h immediate abort 06h ignore 07h retry after user intervention Error Locus: 01h unknown or not appropriate 02h block device 03h network related 04h serial device 05h memory related ------------------------------------------------------ INT 21 - DOS 3.x - CREATE UNIQUE FILE AH = 5Ah DS:DX -> ASCIZ directory path name ending with a '\' 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 - DOS 3.x - CREATE NEW FILE AH = 5Bh DS:DX -> 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 - DOS 3.x - LOCK/UNLOCK FILE ACCESS 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 - DOS 3.x Internal - GET ADDRESS OF CRITICAL ERROR FLAG AX = 5D06h Return: DS:SI -> critical error flag CX = ??? DX = ??? Notes: this call also does a lot of other work in addition to returning the pointer setting CritErr flag allows use of functions 50h/51h from INT 28h under DOS 2.x by forcing use of correct stack ------------------------------------------------------ INT 21 - DOS 3.x Internal - ??? AH = 5Dh AL = subfunction 07h: ??? 08h: (used by COMMAND.COM) 09h: (used by COMMAND.COM) ------------------------------------------------------ INT 21 - DOS 3.1+ internal - SET EXTENDED ERROR INFORMATION AX = 5D0Ah DS:DX = address of 11-word error information words 0 to 7: values of AX,BX,CX,DX,SI,DI,DS,ES that func 59h will return words 8 to 10: zero (reserved) ------------------------------------------------------ INT 21 - DOS 3.1 + Microsoft Networks - GET MACHINE NAME AX = 5E00h DS:DX -> buffer for ASCIZ 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 - DOS 3.1 + Microsoft Networks - SET MACHINE NAME AX = 5E01h DS:DX -> ASCIZ name CL = name number CH = ??? ------------------------------------------------------ INT 21 - DOS 3.1 + Microsoft Networks - SET PRINTER SETUP 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 - DOS 3.1 + Microsoft Networks - GET PRINTER SETUP 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 - DOS 3.1 + Microsoft Networks - GET REDIRECTION LIST ENTRY 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 - DOS 3.1 + Microsoft Networks - REDIRECT DEVICE AX = 5F03h BL = device type 03 = printer device 04 = file device CX = stored parameter value DS:SI -> source device name ES:DI -> destination ASCIZ network path + ASCIZ password Return: CF = 1 if error AX = Error Code ------------------------------------------------------ INT 21 - DOS 3.1 + Microsoft Networks - CANCEL REDIRECTION AX = 5F04h DS:SI -> device name or network path Return: CF = 1 if error AX = Error Code ------------------------------------------------------ INT 21 - DOS 3.x Internal - RESOLVE PATH STRING TO FULLY QUALIFIED PATH STRING AH = 60h DS:SI = relative path string ES:DI = buffer for fully qualified name Return: buffer filled with qualified name; may return error code, unknown. ------------------------------------------------------ INT 21 - DOS 3.x Internal - UNUSED AH = 61h Return: AL = 0 ------------------------------------------------------ INT 21 - DOS 3.x - GET PSP ADDRESS AH = 62h Return: BX = segment address of PSP ------------------------------------------------------ INT 21 - DOS 2.25 only - GET LEAD BYTE TABLE 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 - DOS 3.3 Internal - ??? AH = 64h ------------------------------------------------------ INT 21 - DOS 3.3 - GET EXTENDED COUNTRY INFORMATION AH = 65h AL = info ID (1 - 6) BX = code page (-1=global code page) DX = country ID (-1=current country) ES:DI -> country information buffer CX = size of buffer Return: AX = error code if carry set, otherwise CX = size of country information returned ES:DI -> 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 - DOS 3.3 - GET/SET GLOBAL CODE PAGE TABLE 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 437 US 850 ??? 860 Portugal 863 Canada (French) 865 Norway/Denmark DX = system code page (active page at boot time) Return: AX = error code if carry flag set ------------------------------------------------------ INT 21 - DOS 3.3 - SET HANDLE COUNT AH = 67h BX = desired number of handles (max 255) Return: Carry set if error (and error code in AX) ------------------------------------------------------ INT 21 - DOS 3.3 - COMMIT FILE, WRITE ALL BUFFERED DATA TO DISK AH = 68h BX = file handle Return: carry flag set on error (and error code in AX) ------------------------------------------------------ INT 21 - DOS 4.0 - EXTENDED OPEN/CREATE AX = 6C00h BL = open mode as in AL for normal open -- {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?