ddl@husc6.UUCP (Dan Lanciani) (07/24/87)
This list is based on other postings, manuals, and some research. I beleive it to be one of the more complete and useful (at least to me since I use it...). Dan Lanciani ddl@harvard.* ----------------------------------------------------------- INT 0 - DIVIDE ERROR Automatically called at end of DIV or IDIV operation that results in error. Normally set by DOS to display an error message and abort the program. ----------------------------------------------------------- INT 1 - SINGLE-STEP Generated at end of each machine instruction if TF bit in FLAGS is set. This is what makes the T command of DEBUG work for single-stepping. Is not generated after MOV to segment register or POP of segment register. ----------------------------------------------------------- INT 2 - NMI (Non Maskable Interrupt) Generated by NMI signal in hardware. Used in IBM for memory parity error trapping. ----------------------------------------------------------- INT 3 - 1-BYTE INTERRUPT Generated by opcode 0CCh. Similar to 8080's RST instruction. Generally used to set breakpoints for DEBUG. ----------------------------------------------------------- INT 4 - OVERFLOW Generated by INTO instruction if OF flag is set. If flag is not set, INTO is effectively a NOP. Used to trap any arithmetic errors when program is ready to handle them rather than immediately when they occur. ----------------------------------------------------------- INT 5 - Print-Screen Key Automatically called by keyboard scan when print- screen key is pressed. Normally executes routine to print the screen, but may call any routine that can safely be executed from inside the keyboard scanner. Status and result byte at address 0050:0000. ----------------------------------------------------------- INT 6 - XXX (IRET) ----------------------------------------------------------- INT 7 - XXX (IRET) ----------------------------------------------------------- INT 8 thru 0F - Vectored Hardware Lines In IBM, these 8 interrupts are generated in response to IRQ 0 through IRQ 7 (if enabled via port 21). [Tandy 1000] IRQ0 - timer interrupt IRQ1 - keyboard interrupt IRQ2 - EGA vertical retrace [fixed disk] IRQ3 - serial port 2 (com2:) IRQ4 - serial port 1 (com1:) IRQ5 - fixed disk [60hz ram refresh] IRQ6 - diskette interrupt IRQ7 - PPI interrupt (lpt1:, lpt2:) ----------------------------------------------------------- INT 10 - VIDEO - SET VIDEO MODE AH = 0 AL = 0 = 40x25 B&W 1 = 40x25 COLOR 2 = 80x25 BW 3 = 80x25 COLOR 4 = 320x200 GRAPHICS, 4 COLOR 5 = 320x200 GRAPHICS, 4 GREY 6 = 640x200 GRAPHICS, B&W 7 = MONOCHROME GRAPHICS MODE 8 = 160x200 GRAPHICS, 16 COLOR 9 = 320x200 GRAPHICS, 16 COLOR A = 640x200 GRAPHICS, 4 COLOR Note: Modes 8-10 are only available on the PCjr (and Tandy 1000). ----------------------------------------------------------- INT 10 - VIDEO - SET CURSOR CHARACTERISTICS AH = 1 CH = bits 5-6 = blink attribute (00=normal, 01=invis., 11=fast) bits 0-4 = start line for cursor in char. cell CL = bits 0-4 = end line for cursor in char. cell ----------------------------------------------------------- INT 10 - VIDEO - SET CURSOR POSITION AH = 2 DH,DL = ROW,COLUMN - 0,0 = UPPER LEFT BH = PAGE NO. - 0 = GRAPHICS ----------------------------------------------------------- INT 10 - VIDEO - READ CURSOR POSITION AH = 3 BH = PAGE NO. - 0 = GRAPHICS Return: DH,DL = ROW,COLUMN CH,CL = CURSOR MODE,CURRENT SET ----------------------------------------------------------- INT 10 - VIDEO - READ LIGHT PEN POSITION AH = 4 Return: AH = 0: light pen switch not activated AH = 1: light pen values in registers DH = row of current position DL = column of current position CH = raster line (0-199) BX = pixel column (0-319 or 0-639) ----------------------------------------------------------- INT 10 - VIDEO - SELECT DISPLAY PAGE AH = 5 AL = 0 - 7: NEW PAGE VALUE FOR MODES 0 & 1 0 - 3: NEW PAGE VALUE FOR MODES 2 & 3 80H: READ CRT/CPU PAGE REGISTERS 81H: SET CPU PAGE REGISTER TO VALUE IN BL 82H: SET CRT PAGE REGISTER TO VALUE IN BH 83H: SET BOTH DISPLAY REGISTERS Return: BH = CRT PAGE REGISTER BL = CPU PAGE REGISTER ----------------------------------------------------------- INT 10 - VIDEO - SCROLL PAGE UP AH = 6 AL = NO. OF LINES BLANKED AT BOTTOM OF PAGE 0 = BLANK WINDOW BH = ATTRIBUTES TO BE USED ON BLANK LINE WINDOW: CH,CL = UPPER LEFT CORNER DH,DL = LOWER RIGHT CORNER ----------------------------------------------------------- INT 10 - VIDEO - SCROLL PAGE DOWN AH = 7 AL = NO. OF LINES BLANKED AT TOP OF PAGE 0 = BLANK WINDOW BH = ATTRIBUTES TO BE USED ON BLANK LINE WINDOW: CH,CL = UPPER LEFT CORNER DH,DL = LOWER RIGHT CORNER ----------------------------------------------------------- INT 10 - VIDEO - READ ATTRIBUTES/CHARACTER AT CURSOR POSITION AH = 8 BH = DISPLAY PAGE Return: AL = CHAR AH = ATTRIBUTE OF CHAR - ALPHA MODE ----------------------------------------------------------- INT 10 - VIDEO - WRITE ATTRIBUTES/CHARACTERS AT CURSOR POS AH = 9 AL = CHARACTER BH = DISPLAY PAGE - ALPHA MODE BL = ATTRIBUTES OF CHAR CX = NO. OF CHAR TO WRITE ----------------------------------------------------------- INT 10 - VIDEO - WRITE CHARACTERS ONLY AT CURSOR POS AH = 0AH AL = CHARACTER BH = DISPLAY PAGE - ALPHA MODE BL = COLOR OF CHARACTER (GRAPHICS MODE) CX = NO. OF CHAR TO WRITE ----------------------------------------------------------- INT 10 - SET COLOR PALETTE AH = 0BH BH = PALETTE COLOR ID BL = COLOR TO BE USED W/COLOR ID ----------------------------------------------------------- INT 10 - WRITE DOT ON SCREEN AH = 0CH AL = COLOR OF DOT DX = ROW (0000 - 00C7) CX = COLUMN (0000 - 027F) NOTE: VIDEO MODES 6 & 7 ONLY ----------------------------------------------------------- INT 10 - READ DOT ON SCREEN AH = 0DH CX = COLUMN (0000 - 027F) DX = ROW (0000 - 00C7) Return: AL = COLOR READ ----------------------------------------------------------- INT 10 - WRITE CHARACTER - ADVANCE CURSOR (TTY WRITE) AH = 0EH AL = CHARACTER BL = FOREGROUND COLOR (VIDEO MODES 6 & 7 ONLY) ----------------------------------------------------------- INT 10 - GET CURRENT VIDEO MODE AH = 0FH Return: AH = # OF COLUMNS ON SCREEN AL = CURRENT VIDEO MODE BH = CURRENT ACTIVE DISPLAY PAGE ----------------------------------------------------------- INT 10 - SET PALETTE REGISTERS (PCjr AND TANDY 1000) AH = 10H AL = 0: SET PALETTE REGISTER BL = PALETTE REGISTER TO SET BH = COLOR VALUE TO STORE AL = 1: SET BORDER COLOR REGISTER BH = COLOR VALUE TO STORE AL = 2: SET ALL PALETTE REGISTERS ES:DX = POINTER TO 17-BYTE LIST BYTES 0-15 = VALUES FOR PALETTE REGS. 0-15 BYTE 16 = VALUE FOR BORDER REGISTER ----------------------------------------------------------- INT 10 - WRITE STRING, DON'T MOVE CURSOR (PC/AT ONLY) AH = 13H AL = 0 BL = ATTRIBUTE BH = DISPLAY PAGE NUMBER DX = STARTING CURSOR POSITION CX = LENGTH OF STRING ES:BP = POINTER TO START OF STRING ----------------------------------------------------------- INT 10 - WRITE STRING, MOVE CURSOR AFTER STRING (PC/AT ONLY) AH = 13H AL = 1 BL = ATTRIBUTE BH = DISPLAY PAGE NUMBER DX = STARTING CURSOR POSITION CX = LENGTH OF STRING ES:BP = POINTER TO START OF STRING ----------------------------------------------------------- INT 10 - WRITE STRING OF ALTERNATING CHARACTERS, ATTRIBUTES; DON'T MOVE CURSOR (PC/AT ONLY) AH = 13H AL = 2 BH = DISPLAY PAGE NUMBER DX = STARTING CURSOR POSITION CX = LENGTH OF STRING ES:BP = POINTER TO START OF STRING ----------------------------------------------------------- INT 10 - WRITE STRING OF ALTERNATING CHARACTERS, ATTRIBUTES; MOVE CURSOR (PC/AT ONLY) AH = 13H AL = 3 BH = DISPLAY PAGE NUMBER DX = STARTING CURSOR POSITION CX = LENGTH OF STRING ES:BP = POINTER TO START OF STRING ----------------------------------------------------------- INT 10 - GET VIDEO RAM ADDRESS AH = 70H Return: AX = SEGMENT ADDRESS OF THE FOLLOWING [BX] = OFFSET ADDRESS OF GREEN PLANE [CX] = SEGMENT ADDRESS OF GREEN PLANE [DX] = SEGMENT ADDRESS OF RED/BLUE PLANE (RED OFFSET = 0, BLUE OFFSET = 4000) ----------------------------------------------------------- INT 10 - GET INCRAM ADDRESSES AH = 71H Return: AX = SEGMENT ADDRESS OF THE FOLLOWING [BX] = SEGMENT ADDRESS OF INCRAM [CX] = OFFSET ADDRESS OF INCRAM ----------------------------------------------------------- INT 10 - SCROLL SCREEN RIGHT AH = 72H AL = NO. OF COLUMNS BLANKED AT LEFT OF PAGE 0 = BLANK WINDOW BH = ATTRIBUTES TO BE USED ON BLANK COLUMNS WINDOW: CH,CL = UPPER LEFT CORNER DH,DL = LOWER RIGHT CORNER ---------------------------------------------------------- INT 10 - SCROLL SCREEN LEFT AH = 73H AL = NO. OF COLUMNS BLANKED AT RIGHT OF PAGE 0 = BLANK WINDOW BH = ATTRIBUTES TO BE USED ON BLANK COLUMNS WINDOW: CH,CL = UPPER LEFT CORNER DH,DL = LOWER RIGHT CORNER ----------------------------------------------------------- INT 11 - EQUIPMENT DETERMINATION Return: AX = "equipment flag" bits 0 diskette installed 1 8087 present 2,3 always = 11 4,5 initial video mode 01 = 40x25 COLOR 10 = 80x25 COLOR 11 = 80X25 IBM monochrome 6,7 number of diskette drives (only if bit 0 = 1) 00 = 1, 01 = 2 8 0 = dma present, 1= no dma on system 9,10,11 number of RS232 cards 12 game I/O attached 13 serial printer installed (IBM-PCjr) 14,15 number of printers ----------------------------------------------------------- INT 12 - MEMORY SIZE Return: AX = NO. OF CONTIGUOUS 1K BLOCKS ----------------------------------------------------------- INT 13 - RESET DISK SYSTEM AH = 0 ----------------------------------------------------------- INT 13 - STATUS OF DISK SYSTEM AH = 1 Return: AL = STATUS 01H = BAD COMMAND 02H = ADDRESS MARK NOT FOUND 03H = WRITE ATTEMPTED ON WRITE-PROTECTED DISK 04H = SECTOR NOT FOUND 06H = DISKETTE REMOVED 08H = DMA OVERRUN 09H = DMA ACROSS 64K BOUNDARY 10H = BAD CRC 20H = CONTROLLER FAILURE 40H = SEEK FAILED 80H = TIME OUT ----------------------------------------------------------- INT 13 - READ SECTORS INTO MEMORY AH = 2 AL = NO. OF SECTORS CH = TRACK NO. CL = SECTOR NO. DH = HEAD NO. DL = DRIVE NO. ES:BX = ADDRESS OF BUFFER Return: CF = SUCCESS/FAILURE SIGNAL AH = STATUS (SEE ABOVE) AL = NUMBER OF SECTORS READ ----------------------------------------------------------- INT 13 - WRITES SECTORS FROM MEMORY AH = 3 AL = NO. OF SECTORS CH = TRACK NO. CL = SECTOR NO. DH = HEAD NO. DL = DRIVE NO. ES:BX = ADDRESS OF BUFFER Return: CF = SUCCESS/FAILURE SIGNAL AH = STATUS (SEE ABOVE) AL = NUMBER OF SECTORS WRITTEN ----------------------------------------------------------- INT 13 - VERIFIES SECTORS AH = 4 AL = NO. OF SECTORS CH = TRACK NO. CL = SECTOR NO. DH = HEAD NO. DL = DRIVE NO. Return: CF = SUCCESS/FAILURE SIGNAL AH = STATUS (SEE ABOVE) AL = NUMBER OF SECTORS VERIFIED ----------------------------------------------------------- INT 13 - FORMAT DISKETTE TRACK AH = 5 AL = NUMBER OF SECTORS CH = TRACK NUMBER CL = SECTOR NUMBER DH = HEAD NUMBER DL = DRIVE NUMBER ES:BX = POINTER TO 4-BYTE ADDRESS FIELD BYTE 1 = TRACK BYTE 2 = HEAD BYTE 3 = SECTOR BYTE 4 = BYTES/SECTOR Return: CF = SUCCESS/FAILURE SIGNAL AH = STATUS CODE (SEE ABOVE) ----------------------------------------------------------- INT 13 - GET CURRENT DRIVE PARAMETERS (PC/AT ONLY) AH = 8 DL = DRIVE NUMBER Return: CF = SUCCESS/FAILURE FLAG AH = STATUS CODE (SEE ABOVE) DL = NUMBER OF DRIVES (?) DH = MAX. NUMBER OF SIDES CL = MAX. NUMBER OF SECTORS CH = MAX. NUMBER OF TRACKS ----------------------------------------------------------- INT 13 - INITIALIZE TWO FIXED DISK BASE TABLES (PC/AT ONLY) AH = 9 Return: CF = SUCCESS/FAILURE FLAG AH = STATUS CODE (SEE ABOVE) INTERRUPT 41 POINTS TO TABLE FOR DRIVE 0 INTERRUPT 46 POINTS TO TABLE FOR DRIVE 1 ----------------------------------------------------------- INT 13 - READ LONG (PC/AT ONLY) AH = 0AH DL = DRIVE ID DH = HEAD NUMBER CH = CYLINDER NUMBER CL = SECTOR NUMBER ES:BX = POINTER TO BUFFER Return: CF = SUCCESS/FAILURE FLAG AH = STATUS CODE (SEE ABOVE) ----------------------------------------------------------- INT 13 - WRITE LONG (PC/AT ONLY) AH = 0BH DL = DRIVE ID DH = HEAD NUMBER CH = SECTOR NUMBER ES:BX = POINTER TO BUFFER Return: CF = SUCCESS/FAILURE FLAG AH = STATUS CODE (SEE ABOVE) ----------------------------------------------------------- INT 13 - SEEK TO CYLINDER (PC/AT ONLY) AH = 0CH DL = DRIVE ID DH = HEAD NUMBER CH = SECTOR NUMBER Return: CF = SUCCESS/FAILURE FLAG AH = STATUS CODE (SEE ABOVE) ----------------------------------------------------------- INT 13 - ATLERNATE DISK RESET (PC/AT ONLY) AH = 0DH DL = DRIVE ID Return: CF = SUCCESS/FAIL FLAG AH = STATUS CODE (SEE ABOVE) ----------------------------------------------------------- INT 13 - TEST FOR DRIVE READY (PC/AT ONLY) AH = 10H DL = DRIVE ID Return: CF = SUCCESS/FAIL FLAG AH = STATUS CODE (SEE ABOVE) ----------------------------------------------------------- INT 13 - RECALIBRATE DRIVE (PC/AT ONLY) AH = 11H DL = DRIVE ID Return: CF = SUCCESS/FAIL FLAG AH = STATUS CODE (SEE ABOVE) ----------------------------------------------------------- INT 13 - CONTROLLER DIAGNOSTICS (PC/AT ONLY) AH = 14H Return: CF = SUCCESS/FAIL FLAG AH = STATUS CODE (SEE ABOVE) ----------------------------------------------------------- INT 13 - GET DISK TYPE (PC/AT ONLY) AH = 15H DL = DRIVE ID Return: AH = DISK TYPE 0 = DISK NOT THERE 1 = DISKETTE, NO CHANGE DETECTION PRESENT 2 = DISKETTE, CHANGE DETECTION PRESENT 3 = FIXED DISK CX,DX = NUMBER OF 512-BYTE SECTORS WHEN AH = 3 ----------------------------------------------------------- INT 13 - CHANGE OF DISK STATUS (PC/AT ONLY) AH = 16H Return: DL = DRIVE THAT HAD DISK CHANGE AH = DISK CHANGE STATUS 00 = NO DISK CHANGE 01 = DISK CHANGED (6?) ----------------------------------------------------------- INT 13 - SET DISK TYPE (PC/AT ONLY) AH = 17H AL = DISK TYPE 00 = NO DISK 01 = REGULAR DISK IN REGULAR DRIVE 02 = REGULAR DISK IN HIGH-CAP. DRIVE 03 = HIGH-CAP. DISK IN HIGH-CAP. DRIVE DL = DRIVE ID ----------------------------------------------------------- INT 14 - SERIAL I/O - INITIALIZE USART AH = 0 AL = INITIALIZING PARAMETERS 7 - 6 - 5 4 - 3 2 1 - 0 -BAUD RATE- PARITY STOP WORD BITS LENGTH 000 110 BD 00 NONE 0-1 10 - 7 001 150 BD 01 ODD 1-2 11 - 8 010 300 BD 11 EVEN 011 600 BD 100 1200 BD 101 2400 BD 110 4800 BD 111 9600 BD (4800 ON PCjr) DX = PORT NUMBER ----------------------------------------------------------- INT 14 - SERIAL I/O - TRANSMIT CHARACTER AH = 1 AL = CHARACTER DX = PORT NUMBER Return: AH = RS-232 STATUS CODE BITS 0 = DATA READY 1 = OVERRUN ERROR 2 = PARITY ERROR 3 = FRAMING ERROR 4 = BREAK DETECTED 5 = TRANSMISSION BUFFER REG. EMPTY 6 = TRANSMISSION SHIFT REG. EMPTY 7 = TIME OUT AL = MODEM STATUS BITS 0 = DELTA CLEAR-TO-SEND 1 = DELTA DATA-SET-READY 2 = TRAILING EDGE RING DETECTED 3 = CHANGE, RECEIVE LINE SIGNAL DETECTED 4 = CLEAR-TO-SEND 5 = DATA-SET-READY 6 = RING DETECTED 7 = RECEIVE LINE SIGNAL DETECTED ----------------------------------------------------------- INT 14 - SERIAL I/O - RECEIVE CHARACTER AH = 2 Return: AL = CHARACTER RECEIVED AH = RS-232 STATUS CODE (SEE ABOVE) ----------------------------------------------------------- INT 14 - SERIAL I/O - GET USART STATUS AH = 3 Return: AH = RS-232 STATUS CODE (SEE ABOVE) AL = MODEM STATUS CODE (SEE ABOVE) ----------------------------------------------------------- INT 15 - TURN ON CASSETTE MOTOR AH = 0 ----------------------------------------------------------- INT 15 - TURN OFF CASSETTE MOTOR AH = 1 ----------------------------------------------------------- INT 15 - READ DATA BLOCKS FROM CASSETTE AH = 2 CX = COUNT OF BYTES ES:BX = POINTER TO DATA AREA Return: CF = ERROR SIGNAL DX = COUNT OF BYTES READ ES:BX = POINTER PAST LAST BYTE READ ----------------------------------------------------------- INT 15 - WRITE DATA BLOCKS TO CASSETTE AH = 3 CX = COUNT OF BYTES TO WRITE ES:BX = POINTER TO DATA AREA Return: ES:BX = POINTER PAST LAST BYTE WRITTEN ----------------------------------------------------------- INT 15 - DEVICE OPEN (PC/AT ONLY) AH = 80 Return: BX = DEVICE ID CX = PROCESS TYPE ----------------------------------------------------------- INT 15 - DEVICE CLOSE (PC/AT ONLY) AH = 81 Return: BX = DEVICE ID CX = PROCESS TYPE ----------------------------------------------------------- INT 15 - DEVICE PROGRAM TERMINATE (PC/AT ONLY) AH = 82 Return: BX = DEVICE ID ----------------------------------------------------------- INT 15 - EVENT WAIT (PC/AT ONLY) AH = 83 AL = SUBSERVICE 0 = SET INTERVAL 1 = CANCEL ES:BX = POINTER TO CALLER'S MEMORY CX,DX = NUMBER OF MICROSECONDS TO WAIT ----------------------------------------------------------- INT 15 - READ JOYSTICK SWITCH SETTINGS (PC/AT ONLY) AH = 84 DX = 0 Return: AL = SWITCH SETTINGS ----------------------------------------------------------- INT 15 - READ JOYSTICK INPUTS (PC/AT ONLY) AH = 84 DX = 1 Return: AX = A(x) VALUE BX = A(y) VALUE CX = B(x) VALUE DX = B(y) VALUE ----------------------------------------------------------- INT 15 - SYSTEM REQUEST KEY PRESS (PC/AT ONLY) AH = 85 Return: AL = 00 PRESS AL = 01 BREAK ----------------------------------------------------------- INT 15 - WAIT (PC/AT ONLY) AH = 86 Return: CX,DX = NUMBER OF MICROSECONDS TO WAIT ----------------------------------------------------------- INT 15 - EXTENDED MEMORY - BLOCK MOVE (PC/AT ONLY) AH = 87 CX = NUMBER OF WORDS TO MOVE ES:SI = POINTER TO TABLE ----------------------------------------------------------- INT 15 - EXTENDED MEMORY - GET MEMORY SIZE (PC/AT ONLY) AH = 88 Return: AX = MEMORY SIZE ----------------------------------------------------------- INT 15 - SWITCH TO VIRTUAL MODE (PC/AT ONLY) AH = 89 ----------------------------------------------------------- INT 15 - DEVICE BUSY LOOP (PC/AT ONLY) AH = 90 AL = TYPE CODE ----------------------------------------------------------- INT 15 - SET FLAG AND COMPLETE INTERRUPT AH = 91 AL = TYPE CODE ----------------------------------------------------------- INT 16 - KEYBOARD I/O - READ CHAR FROM BUFFER - WAIT IF EMPTY AH = 0 Return: AH = SCAN CODE AL = CHARACTER ----------------------------------------------------------- INT 16 - KEYBOARD I/O - CHECK BUFFER - DO NOT CLEAR AH = 1 Return: FLAG ZF = 0 = CHAR IN BUFFER AH = SCAN CODE AL = CHARACTER FLAG ZF = 1 = NO CHAR IN BUFFER ----------------------------------------------------------- INT 16 - KEYBOARD I/O - GET SHIFT STATUS AH = 2 AL = SHIFT STATUS BITS 0 = RIGHT SHIFT KEY DEPRESSED 1 = LEFT SHIFT KEY DEPRESSED 2 = CTRL DEPRESSED 3 = ALT DEPRESSED 4 = SCROLL LOCK ACTIVE 5 = NUM LOCK ACTIVE 6 = CAPS LOCK ACTIVE 7 = INSERT STATE ACTIVE ----------------------------------------------------------- INT 16 - KEYBOARD - SET DELAYS (PCjr ONLY) AH = 3 AL = 0: RESET TYPEMATIC AL = 1: INCREASE INITIAL DELAY AL = 2: INCREASE CONTINUING DELAY AL = 3: INCREASE BOTH DELAYS AL = 4: TURN OFF TYPEMATIC ----------------------------------------------------------- INT 16 - KEYBOARD - KEYCLICK (PCjr ONLY) AH = 4 AL = 0: CLICK OFF AL = 1: CLICK ON ----------------------------------------------------------- INT 17 - CHARACTER TO PRINTER AH = 0 AL = CHAR 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 - INITIALIZE PRINTER AH = 1 Return: AH = STATUS (SEE ABOVE) ----------------------------------------------------------- INT 17 - STATUS OF PRINTER AH = 2 Return: AH = STATUS (SEE ABOVE) ----------------------------------------------------------- INT 18 - TRANSFER TO ROM BASIC CAUSES TRANSFER TO ROM-BASED BASIC (IBM-PC) OFTEN REBOOTS A COMPATABLE ----------------------------------------------------------- INT 19 - DISK BOOT CAUSES REBOOT OF DISK SYSTEM (NO MEMORY TEST PERFORMED). ----------------------------------------------------------- INT 1A - GET TIME OF DAY AH = 0 Return: CX = high (most signif.) portion of clock count DX = low (least signif.) portion of clock count AL = 0 if clock was read or written (via AH=0,1) withing the current 24-hour period Otherwise, AL > 0 ----------------------------------------------------------- INT 1A - SET TIME OF DAY AH = 1 CX = high (most signif.) portion of clock count DX = low (least signif.) portion of clock count ----------------------------------------------------------- INT 1A - READ REAL TIME CLOCK (PC/AT ONLY) AH = 2 Return: CH = HOURS CL = MINUTES DH = SECONDS ----------------------------------------------------------- INT 1A - SET REAL TIME CLOCK (PC/AT ONLY) AH = 3 Return: CH = HOURS CL = MINUTES DH = SECONDS DL = 1, IF DAYLIGHT SAVINGS; 0 IF STANDARD TIME ----------------------------------------------------------- INT 1A - READ DATE FROM REAL TIME CLOCK (PC/AT ONLY) AH = 4 Return: DL = DAY DH = MONTH CL = YEAR CH = CENTURY (19 OR 20) ----------------------------------------------------------- INT 1A - SET DATE IN REAL TIME CLOCK (PC/AT ONLY) AH = 5 DL = DAY DH = MONTH CL = YEAR CH = CENTURY (19 OR 20) ----------------------------------------------------------- INT 1A - SET ALARM (PC/AT ONLY) AH = 6 CH = HOURS CL = MINUTES DH = SECONDS Return: INT. 4A = ADDRESS OF ALARM ROUTINE ----------------------------------------------------------- INT 1A - RESET ALARM (PC/AT ONLY) AH = 7 ----------------------------------------------------------- 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 simple IRET so that it does nothing, but many programs change it to return a CTRL-C scan code and thus invoke INT 23. ----------------------------------------------------------- INT 1C - CLOCK TICK This interrupt is called (in the IBM) at the end of each time-update operation by the real-time clock routines. It normally points to an IRET unless PRINT.COM has been installed. ----------------------------------------------------------- INT 1D -> 4 6845 Video Init tables ----------------------------------------------------------- INT 1E -> Diskette Params (BASE TABLE) Default at f000:efc7 db step rate & head unload times db head load time & DMA db motor off time db sector size (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 (f6 typical) db head-settle time ms (typical 25, 2.10->15) db motor start-up time (1/8 secs) (typical 4, 2.10->2) ----------------------------------------------------------- INT 1F -> Graphics Set 2 ----------------------------------------------------------- INT 20 - PROGRAM TERMINATION RETURNS TO DOS ----------------------------------------------------------- INT 21 - PROGRAM TERMINATION AH = 00H Same action as INT 20; returns to DOS. ----------------------------------------------------------- INT 21 - KEYBOARD INPUT AH = 01H Return: AL = CHARACTER READ ----------------------------------------------------------- INT 21 - DISPLAY OUTPUT AH = 02H DL = CHAR ----------------------------------------------------------- INT 21 - AUX Input AH = 03H Return: AL = CHARACTER READ ----------------------------------------------------------- INT 21 - AUX Output AH = 04H DL = CHAR ----------------------------------------------------------- INT 21 - PRINTER OUTPUT AH = 05H DL = CHAR ----------------------------------------------------------- INT 21 - DIRECT CONSOLE I/O - CHARACTER OUTPUT AH = 06H DL = CHAR ----------------------------------------------------------- INT 21 - DIRECT CONSOLE I/O - CHARACTER INPUT AH = 06H DL = 0FFH Return: FLAG ZF = SET = NO CHARACTER CLEAR = CHARACTER RECIEVED AL = CHARACTER Character is echoed to STDOUT if received. ----------------------------------------------------------- INT 21 - Direct STDIN Input, no echo Reg AH = 07H Same as Function 6 for input but char not echoed. ----------------------------------------------------------- INT 21 - KEYBOARD INPUT - NO ECHO AH = 08H Return: AL = CHAR ----------------------------------------------------------- INT 21 - PRINT STRING AH = 09H DS:DX = ADDRESS OF STRING TERMINATED WITH "$" ----------------------------------------------------------- INT 21 - BUFFERED KEYBOARD INPUT AH = 0AH DS:DX = ADDRESS OF BUFFER FIRST BYTE OF BUFFER MUST HAVE MAX LENGTH ON RETURN SECOND BYTE HAS ACTUAL LENGTH ----------------------------------------------------------- INT 21 - CHECK STANDARD INPUT STATUS AH = 0BH Return: AL = FFH IF CHAR TYPED 00H IF NOT TYPED ----------------------------------------------------------- INT 21 - Clear Keyboard Buffer AH = 0CH AL must be 1, 6, 7, 8, or 0aH. Flushes all typeahead input, then executes function specified by AL (by moving it to AH and repeating the INT 21 call). ----------------------------------------------------------- INT 21 - Disk Reset Reg AH = 0DH Flushes all disk buffers. ----------------------------------------------------------- INT 21 - SELECT DISK AH = 0EH DL = new default drive number (0 = A, 1 = B, etc.) Return: AL = number of logical drives ----------------------------------------------------------- INT 21 - OPEN DISK FILE AH = 0FH DS = SEGMENT ADDRESS OF FCB DX = OFFSET ADDRESS OF FCB Return: AL = 00 = FILE FOUND FF = FILE NOT FOUND ----------------------------------------------------------- INT 21 - CLOSE DISK FILE AH = 10H DS = SEGMENT ADDRESS OF FCB DX = OFFSET ADDRESS OF FCB ----------------------------------------------------------- INT 21 - Search First using FCB AH = 11H DS = SEGMENT ADDRESS OF FCB DX = OFFSET ADDRESS OF FCB Return: AL = 00 = FILE FOUND FF = FILE NOT FOUND If file found, FCB is created at DTA address and set up to OPEN or DELETE it. ----------------------------------------------------------- INT 21 - Search Next using FCB AH = 12H DS = SEGMENT ADDRESS OF FCB DX = OFFSET ADDRESS OF FCB Return: AL = 00 = FILE FOUND FF = FILE NOT FOUND If file found, FCB is created at DTA address and set up to OPEN or DELETE it. ----------------------------------------------------------- INT 21 - Delete File via FCB AH = 13H DS = SEGMENT ADDRESS OF FCB DX = OFFSET ADDRESS OF FCB Return: AL = 00 = FILE FOUND FF = FILE NOT FOUND ----------------------------------------------------------- INT 21 - SEQUENTIAL DISK FILE READ AH = 14H DS = SEGMENT ADDRESS OF FCB DX = OFFSET ADDRESS OF FCB Return: AL = 0 = SUCCESSFUL READ 1 = END OF FILE 2 = DATA TRANSFER AREA TOO SMALL 3 = PARTIAL RECORD, EOF ----------------------------------------------------------- INT 21 - SEQUENTIAL DISK RECORD WRITE AH = 15H DS = SEGMENT ADDRESS OF FCB DX = OFFSET ADDRESS OF FCB Return: AL = 0 = SUCCESSFUL WRITE 1 = DISKETTE FULL 2 = DATA TRANSFER AREA TOO SMALL ----------------------------------------------------------- INT 21 - CREATE A DISK FILE AH = 16H DS = SEGMENT ADDRESS OF FCB DX = OFFSET ADDRESS OF FCB Return: AL = 00 = SUCCESSFUL CREATION FF = NO ROOM IN DIRECTORY ----------------------------------------------------------- INT 21 - Rename File via FCB AH = 17H DS = SEGMENT ADDRESS OF FCB DX = OFFSET ADDRESS OF FCB FCB contains new name starting at byte 17H. Return: AL = 00 = FILE FOUND FF = FILE NOT FOUND ----------------------------------------------------------- INT 21 - Internal - does nothing AH = 18H XXX Return: AL = 0 ----------------------------------------------------------- INT 21 - Default Disk Number AH = 19H Return: AL = current drive number (letter - 'A') ----------------------------------------------------------- INT 21 - SET DISK TRANSFER AREA ADDRESS AH = 1AH DS = SEGMENT ADDRESS OF BUFFER DX = OFFSET ADDRESS OF BUFFER ----------------------------------------------------------- INT 21 - Default Drive Disk Size AH = 1BH Return: DS:BX points to FAT ID byte DX = number of allocation units on disk AL = number of sectors per AU CX = number of bytes per sector ----------------------------------------------------------- INT 21 - Specific Drive's Disk Size 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 AU CX = number of bytes per sector ----------------------------------------------------------- INT 21 - Internal - does nothing AH = 1DH XXX Return: AL = 0 ----------------------------------------------------------- INT 21 - Internal - does nothing AH = 1EH XXX Return: AL = 0 ----------------------------------------------------------- INT 21 - Internal - GET DEFAULT DRIVE PARAMETER BLOCK AH = 1FH Return: AL = 00 = No Error FF = Error (DS:BX) = ADDRESS OF DRIVE PARAMETER BLOCK. (THIS JUST INVOKES FUNCTION 32H WITH DL = 0) ----------------------------------------------------------- INT 21 - Internal - does nothing AH = 20H XXX Return: AL = 0 ----------------------------------------------------------- INT 21 - RANDOM DISK RECORD READ AH = 21H DS = SEGMENT ADDRESS OF FCB DX = OFFSET ADDRESS OF FCB Return: AL = 0 = SUCCESSFUL READ 1 = END OF FILE 2 = DATA TRANSFER AREA TOO SMALL 3 = PARTIAL RECORD, EOF ----------------------------------------------------------- INT 21 - Random Disk Write AH = 22H Same setup as Random Read, but writes to disk ----------------------------------------------------------- INT 21 - FILE SIZE AH = 23H DS = SEGMENT ADDRESS OF FCB DX = OFFSET ADDRESS OF FCB Return: AL = 00 = FILE FOUND FF = FILE NOT FOUND FCB SET TO NO. OF RECORDS ----------------------------------------------------------- INT 21 - Set Random Record Field AH = 24H DS = SEGMENT ADDRESS OF FCB DX = OFFSET ADDRESS OF FCB FCB must be OPEN already Return: Random Record Field of FCB is set to be same as Current Block and Current Record. ----------------------------------------------------------- INT 21 - Set Interrupt Vector AH = 25H AL = INT number DS:DX = new vector to be used for specified INT ----------------------------------------------------------- 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 = SEGMENT ADDRESS OF FCB DX = OFFSET ADDRESS OF FCB CX = NO. 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 = SEGMENT ADDRESS OF FCB DX = OFFSET ADDRESS OF FCB CX = NO. OF RECORDS TO BE WRITTEN Return: AL = 0 = SUCCESSFUL WRITE 1 = DISKETTE 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 SEPERATOR FOUND 1: LEADING SEPERATOR IGNORED 1 = 0: DRIVE NUMNER IN FCB SET TO DEFAULT IF STRING CONTAINS NO DRIVE NUMBER 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 IN NAME OR EXTENSION 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 ----------------------------------------------------------- INT 21 - GET CURRENT TIME AH = 2CH Return: CH = HOURS CL = MINUTES DH = SEC DL = SEC/100 NOTE: TIME IS UPDATED EVERY 5/100 SECOND ----------------------------------------------------------- INT 21 - Set CURRENT TIME AH = 2DH CH = HOURS CL = MINUTES DH = SEC DL = SEC/100 Return: AL = 0 if no error AL = 0ffH if bad value sent to routine ----------------------------------------------------------- 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 = SEGMENT address of DTA BX = OFFSET 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 SECTOR OF DATA ON MEDIUM MAX_NUMBER DW ? ; 13. LARGEST POSSIBLE CLUSTER NUMBER ; SUBTRACT ONE FOR NUMBER OF 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. CORRESPONDING DEVICE DRIVER ADDRESS 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 = 0 for Get or 1 for Put DL = 0 for OFF or 1 for ON Return: DL = 0 if BREAK=OFF or 1 if BREAK=ON AL = FFH IF ERROR ----------------------------------------------------------- INT 21 - Internal - Return CritSectFlag Pointer AH = 34H Return: ES:BX points to DOS "Critical Section Flag" 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. This suggests that checking the WORD pointed to, rather than the BYTE, might increase reliability of the test greatly. ----------------------------------------------------------- INT 21 - Get Interrupt Vector AH = 35H AL = INT number Return: ES = Segment address of INT vector BX = Offset address of INT vector ----------------------------------------------------------- INT 21 - DISK SPACE AH = 36H DL = DRIVE NUMBER (1-4) Return: AX = ? (SIDES) BX = ? (BLOCKS FREE) CX = ? (BLOCK SIZE) DX = ? (TOTAL BLOCKS) NOTE: MULT AX x CX x BX for FREE SPACE ON DISK MULT AX x CX x DX for TOTAL DISK SPACE ----------------------------------------------------------- INT 21 - Internal - switchar/availdev AH = 37H AL = 0 Read switch character (returns current character in DL) 1 Set switch character (specify new character in DL) 2 Read device availability (as set by function AL=3) 3 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. Functions 2 & 3 appear not to be implemented for dos 3.x ----------------------------------------------------------- INT 21 - Get Country-Dependent Information AH = 38H Complex and differs between Dos 2.x and Dos 3.x See Peter Norton "Programmer's Guide to the IBM PC", p. 305 ----------------------------------------------------------- INT 21 - CREATE A SUBDIRECTORY (MKDIR) AH = 39H DS = SEGMENT address of ASCIIZ pathname DX = OFFSET address of ASCIIZ pathname Return: Flag CF = 1 if error AX = Error Code if any ----------------------------------------------------------- INT 21 - REMOVE A DIRECTORY ENTRY (RMDIR) AH = 3AH DS = SEGMENT address of ASCIIZ pathname DX = OFFSET address of ASCIIZ pathname Return: Flag CF = 1 if error AX = Error Code if any ----------------------------------------------------------- INT 21 - CHANGE THE CURRENT DIRECTORY (CHDIR) AH = 3BH DS = SEGMENT address of ASCIIZ DX = OFFSET address of ASCIIZ Return: Flag CF = 1 if error AX = Error Code if any ----------------------------------------------------------- INT 21 - CREATE A FILE WITH HANDLE (CREAT) AH = 3CH CX = ATTRIBUTES FOR FILE DS = SEGMENT ADDRESS OF ASCIIZ DX = OFFSET ADDRESS OF ASCIIZ Return: Flag CF = 1 if error AX = File Handle or Error Code ----------------------------------------------------------- INT 21 - OPEN DISK FILE WITH HANDLE AH = 3DH AL = ACCESS CODE 0 = Read Only 1 = Write Only 2 = Read/Write Options (3.x): 80H = no inheritance 10H = deny read/write 20H = deny write 30H = deny read 40H = deny none DS = SEGMENT ADDRESS OF ASCIIZ DX = OFFSET ADDRESS OF ASCIIZ Return: Flag CF = 1 if error AX = File Handle or Error Code ----------------------------------------------------------- INT 21 - CLOSE A FILE WITH HANDLE AH = 3EH BX = FILE HANDLE Return: Flag CF = 1 if error AX = Error Code if any ----------------------------------------------------------- INT 21 - READ FROM FILE WITH HANDLE AH = 3FH BX = FILE HANDLE CX = NO. OF BYTES TO READ DS = SEGMENT ADDRESS OF BUFFER DX = OFFSET ADDRESS OF BUFFER Return: Flag CF = 1 if error AX = Bytes Read or Error Code ----------------------------------------------------------- INT 21 - WRITE TO FILE WITH HANDLE AH = 40H BX = FILE HANDLE CX = NO. OF BYTES TO Write DS = SEGMENT ADDRESS OF BUFFER DX = OFFSET ADDRESS OF BUFFER Return: Flag CF = 1 if error AX = Bytes Read or Error Code ----------------------------------------------------------- INT 21 - DELETE A FILE (UNLINK) AH = 41H DS = SEGMENT OF ASCIIZ TO DELETE DX = OFFSET OF ASCIIZ TO DELETE Return: Flag CF = 1 if error AX = Error Code if any ----------------------------------------------------------- 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 = BYTES OFFSET HIGH DX = BYTES OFFSET LOW Return: Flag CF = 1 if error AX = Offset low word or Error Code DX = Offset high word ----------------------------------------------------------- INT 21 - GET/PUT FILE ATTRIBUTES (CHMOD) AH = 43H AL = 0 = GET FILE ATTRIBUTES 1 = PUT FILE ATTRIBUTES CX = FILE ATTRIBUTES BITS ON PUT 0 = READ ONLY 1 = HIDDEN FILE 2 = SYSTEM FILE 3 = VOLUME LABEL 4 = SUBDIRECTORY 5 = WRITTEN SINCE BACKUP DX = POINTER TO FILE ASCIIZ FILE NAME Return: Flag 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 = is device 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) 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? AX = 0 = yes 9 = Is logical device BL local? DX (attribute word) bit 12 (1000H) = 0 = yes 10= Is handle BX local? DX (attribute word) bit 15 (8000H) = 0 = yes 11= Change sharing retry count to DX (def 3), delay CX (def 1) BX = file handle (or BL = drive number w/0 = default) Return: Flag CF = 1 if error AX = Error Code if any ----------------------------------------------------------- INT 21 - Create Duplicate Handle (DUP) AH = 45H BX = file handle to duplicate Return: Flag CF = 1 if error AX = File handle or Error Code ----------------------------------------------------------- INT 21 - Force Duplicate Handle (FORCDUP) (DUP2) AH = 46H BX = Existing file handle CX = new file handle Return: Flag CF = 1 if error AX = File handle or 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: Flag CF = 1 if error AX = Error Code if any ----------------------------------------------------------- INT 21 - Allocate Memory AH = 48H BX = number of 16-byte paragraphs desired Return: Flag CF = 1 if error AX = Segment of allocated memory or Error Code BX = Maximum available on error ----------------------------------------------------------- INT 21 - Free Memory AH = 49H ES = Segment address of area to be freed Return: Flag CF = 1 if error AX = Error Code if any ----------------------------------------------------------- INT 21 - Adjust Block Size (SETBLOCK) AH = 4AH ES = Segment address of block to change BX = New size in paragraphs Return: Flag CF = 1 if error AX = Error Code if any BX = Maximum available on error ----------------------------------------------------------- INT 21 - Load or Execute (EXEC) AH = 4BH AL = 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: Flag CF = 1 if error AX = Error Code if any 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 ----------------------------------------------------------- INT 21 - GET EXIT CODE OF SUBPROGRAM (WAIT) AH = 4DH Return: AL = exit code of subprogram (FNs 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 (WITH ATTRIBUTES) Return: Flag CF = 1 if error AX = Error Code if any (DTA) = data block ----------------------------------------------------------- INT 21 - Find Next ASCIIZ (FIND NEXT) AH = 4FH Return: Flag CF = 1 if error AX = Error Code if any (DTA) = data block ----------------------------------------------------------- INT 21 - Internal - Set PSP Segment AH = 50H BX = Segment address of new PSP ----------------------------------------------------------- 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 */ }; ----------------------------------------------------------- INT 21 - Internal - Get Disk List AH = 52H Return: ES:BX points to DOS list of lists List of Lists: Bytes Value 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 Partially Unknown. Pointer to a device driver. Maybe first resident character device driver? C-F Pointer to actual CON: device driver, whether installable or resident 10-11 Unknown. 0200H. A byte/blocksize value??? 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 Unknown. May be number of block devices. 21 Unknown. May be number of resident devices or ??? (5 always) 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 Like FN 26H but creates "child" PSP rather than copying existing one. ----------------------------------------------------------- INT 21 - RENAME A FILE AH = 56H DS = SEGMENT OF ASCIIZ OLD NAME DX = OFFSET OF ASCIIZ OLD NAME ES = SEGMENT OF ASCIIZ NEW NAME DI = OFFSET OF ASCIIZ NEW NAME Return: Flag CF = 1 if error AX = Error Code if any ----------------------------------------------------------- INT 21 - Get/Put Date/Time AH = 57H AL = FUNCTION CODE 0 = GET DATE AND TIME 1 = SET DATE AND TIME BX = FILE HANDLE CX = TIME TO BE SET (IF AL = 1) DX = DATE TO BE SET (IF AL = 1) Return: Flag CF = 1 if error AX = Error Code if any CX = TIME OF LAST WRITE (IF AL = 0) DX = DATE OF LAST WRITE (IF AL = 0) ----------------------------------------------------------- INT 21 - Get/Set allocation strategy AH = 58H AL = FUNCTION CODE 0 = GET ALLOCATION STRATEGY 1 = SET ALLOCATION STRATEGY BX = STRATEGY CODE (IF AL = 1) 0 = first fit 1 = best fit 2 = last fit Return: Flag CF = 1 if error AX = Strategy code or Error Code ----------------------------------------------------------- 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) ----------------------------------------------------------- INT 21 - CREATE TMEPORARY FILE (DOS 3.x) AH = 5AH DS:DX = POINTER TO DIRECTORY PATH NAME CX = FILE ATTRIBUTE Return: Flag 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 DIRECTORY PATH NAME CX = FILE ATTRIBUTE Return: Flag CF = 1 if error AX = Error Code if any DS:DX = PATH NAME NOTE: UNLIKE FUNCTION 3CH, FUNCTION 5BH WILL FAIL IF THE 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 = OFFSET TO LOCK SI:DI = AMOUNT TO LOCK Return: Flag CF = 1 if error AX = Error Code if any ----------------------------------------------------------- INT 21 - Internal - Unknown AH = 5DH XXX ----------------------------------------------------------- INT 21 - Get Machine Name (DOS 3.1 + Microsoft Networks) AX = 5E00H DS:DX -> buffer for ASCIIZ name Return: Flag CF = 1 if error AX = Error Code if any CH = 0 if name not defined CL = NETBIOS name number ----------------------------------------------------------- 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: Flag CF = 1 if error AX = Error Code if any ----------------------------------------------------------- INT 21 - Get Printer Setup (DOS 3.1 + Microsoft Networks) AX = 5E03H BX = Redirection list index ES:DI -> string buffer Return: Flag CF = 1 if error AX = Error Code if any CX = length of setup string <= 64 ----------------------------------------------------------- INT 21 - Get Redirection List Entry (DOS 3.1 + Microsoft Networks) AX = 5F02H BX = Redirection list index DS:DI -> 128 char local device name buffer ES:DI -> 128 char network name buffer Return: Flag CF = 1 if error AX = Error Code if any BX = Device status flag (BIT 0 = 0 if valid) BL = device type CX = stored param value DX, BP destroyed ----------------------------------------------------------- INT 21 - Redirect Device (DOS 3.1 + Microsoft Networks) AX = 5F03H BL = device type 03 = printer device 04 = file device CX = stored param value DS:SI -> source device name ES:DI -> destination ASCIIZ network path + ASCIIZ password Return: Flag CF = 1 if error AX = Error Code if any ----------------------------------------------------------- INT 21 - Cancel Redirection (DOS 3.1 + Microsoft Networks) AX = 5F04H DS:SI -> device name or network path Return: Flag CF = 1 if error AX = Error Code if any ----------------------------------------------------------- INT 21 - Internal - Unknown AH = 60H XXX ----------------------------------------------------------- INT 21 - Internal - Unknown AH = 61H XXX ----------------------------------------------------------- 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 2 = get interim console flag DL = 1/0 to set/clear interim console flag Return: DS:SI -> lead byte table (AL = 0) DL = interim console flag (AL = 2) ----------------------------------------------------------- INT 22 - TERMINATE ADDRESS FAR (DWORD) address of routine to be executed when program "returns to DOS". Should NOT ever be called. ----------------------------------------------------------- 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. ----------------------------------------------------------- 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: Flag CF = 1 if error AX = Error Code if any 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: Flag CF = 1 if error AX = Error Code if any 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, 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. Until PRINT.COM 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 = # network names CX = # commands DX = # sessions ----------------------------------------------------------- INT 2B - Internal routine for MSDOS (IRET) XXX ----------------------------------------------------------- INT 2C - Internal routine for MSDOS (IRET) XXX ----------------------------------------------------------- INT 2D - Internal routine for MSDOS (IRET) XXX ----------------------------------------------------------- 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: AH = FFH if installed 01H if not installed, not OK to install 00H if 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: Flag CF = 1 if error AX = Error Code if any ----------------------------------------------------------- INT 2F - Multiplexor - PRINT Remove file AX = 0102H DS:DX -> file name (wildcards allowed) Return: Flag CF = 1 if error AX = Error Code if any ----------------------------------------------------------- INT 2F - Multiplexor - PRINT Remove all files AX = 0103H Return: Flag CF = 1 if error AX = Error Code if any ----------------------------------------------------------- INT 2F - Multiplexor - PRINT Hold queue/Get status AX = 0104H Return: Flag CF = 1 if error AX = Error Code if any DX = Error count DS:SI -> print queue (null-string terminated list of 64-byte 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 - Netowrk 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 33 - USED BY MICROSOFT MOUSE ----------------------------------------------------------- INT 40 - Relocated (by fixed disk) Floppy Handler ----------------------------------------------------------- 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 ----------------------------------------------------------- INT 43 -> EGA Initialization Params ----------------------------------------------------------- INT 44 -> EGA/PCjr fonts ----------------------------------------------------------- INT 46 -> Secondary Fixed Disk Params ----------------------------------------------------------- INT 48 - PCjr Cordless Keyboard Translation ----------------------------------------------------------- INT 49 -> PCjr Non-keyboard Scan Code Translation Table ----------------------------------------------------------- INT 4A - AT User Alarm ----------------------------------------------------------- INT 70 thru 77 - AT Vectored Hardware Lines IRQ8 - real-time clock IRQ9 - LAN adapter 1 (to IRQ2) IRQ10 - reserved IRQ11 - reserved IRQ12 - reserved IRQ13 - 80287 error (to NMI) IRQ14 - fixed disk IRQ15 - reserved ----------------------------------------------------------- INT 86 - Relocated (by NETBIOS) INT 18 ----------------------------------------------------------- INT 5C - NETBIOS interface ES:BX -> Network Control Block ----------------------------------------------------------- INT F8 - INTERVAL TIMER (10 MSEC) ----------------------------------------------------------- INT FA - USART READY (RS-232C) ----------------------------------------------------------- INT FB - USART Rx READY (keyboard) -----------------------------------------------------------