[comp.sys.ibm.pc] MS-DOS function/data structure list

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)
-----------------------------------------------------------