[comp.sys.ibm.pc] Interrupt List 88.9, file INTERRUP.LST 03/07

ralf@b.gp.cs.cmu.edu (Ralf Brown) (12/18/88)

		  rather than called directly
	ACh (DV2.2) clear ??? flag
	ADh (DV2.2) set ??? flag
	AEh ???
	AFh set selected field marker character
	    BYTE character to display at left edge of selected fields
	BCh disable use of cursor pad for navigating menus, maybe other???
	BDh enable use of cursor pad for navigating menus, maybe other???
	BEh disable ???
	BFh enable ???
	C0h make current window topmost in system
	C1h force current process into foreground
	C2h make current window topmost in process
	C3h position mouse pointer relative to origin of current field
	    BYTE rows below upper left corner of field
	    BYTE columns to right of upper left corner of field
	C4h position mouse pointer relative to origin of given field
	    BYTE field number
	    BYTE rows below upper left corner of field
	    BYTE columns to right of upper left corner of field
	C5h hide current window
	C6h show windows for this process
	C7h hide all windows for this process
	C8h suspend process and hide all its windows
	C9h force current process into background
	CAh make current window bottom-most in process
	CBh ???
	CCh close window
	CEh reorder windows
	    DWORD pointer to null-terminated list of words
		  each word is segment of object handle for a window

MODES 14h to 1Fh "USER STREAMS"
	normally NOPs, but may be defined by SETESC message to invoke FAR
	routines, one for each mode number
	  on entry to handler,
		DS:SI = first byte of actual stream (not header)
		CX = #bytes in stream
		ES:DI = window's handle
---------------------------------------------
INT 15 - TopView - SEND MESSAGE - "SIZEOF" - GET OBJECT SIZE
	AH = 12h
	BH = 08h
	BL = object
	    00h handle in DWORD on top of stack
		timer: elapsed time since timer started
		pointer: number of messages queued to pointer object
		panel: number of panels in panel file
	    01h total chars in current task's default window
	    02h number of messages in task's mailbox (task's handle on stack)
	    03h number of messages in current task's mailbox
	    04h number of input buffers queued in task's kbd (handle on stack)
	    05h number of input buffers queued for current task's default kbd
	    06h number of objects queued in OBJECTQ (task's handle on stack)
	    07h number of objects queued in current task's OBJECTQ
Return: DWORD on stack is result
---------------------------------------------
INT 15 - TopView - SEND MESSAGE - "LEN" - GET OBJECT LENGTH
	AH = 12h
	BH = 09h
	BL = object
	    00h handle in DWORD on top of stack
		window: chars/line
		timer: timer remaining before timer expires
	    01h number of chars/line in current task's default window
Return: DWORD on top of stack is length
---------------------------------------------
INT 15 - TopView - SEND MESSAGE - "ADDTO" - SET OBJECT BITS
	AH = 12h
	BH = 0Ah
	BL = object
	    00h handle is DWORD on top of stack
		window: write characters and attributes
		timer: start timer for specified interval
		pointer: set control flags
	    01h write characters and attributes to task's default window
	    02h send message/status by value to mailbox (task's handle on stack)
	    03h send message/status by value to current task's default mailbox
	    04h set control flags on KEYBOARD object (handle on top of stack)
	    05h set control flags on task's default KEYBOARD object
	STACK: (if mailbox) DWORD status
			    DWORD length of message
			    DWORD address
	       (if timer)   DWORD duration in 1/100 seconds
	       (if window)  DWORD count of characters
			    DWORD address of characters
			    DWORD count of attributes
			    DWORD address of attributes
	       (otherwise)  DWORD bits to set
For keyboard objects, the bits have the following significance:
	bit 15 reserved, can't be set
	bit 14 unused
	bit 13 reserved, can't be set
	bit 12-5 unused
	bit 4  filter all keys (used with handler established by SETESC)
	bit 3  program continues executing while input in progress
	bit 2  insert mode active
	bit 1  keyboard is active
	bit 0  keyboard is in field mode
For pointer objects, the bits have the following significance:
	bit 15 reserved, can't be set
	bit 14-8 unused
	bit 7  mouse pointer is hidden while in window
	bit 6  get messages even if window not topmost
	bit 5  get messages even if window not foreground
	bit 4  mouse button must be held 1/2 second before it "clicks"
	bit 3  pointer position is relative to screen origin, not window origin
	bit 2  send message on button release as well as button press
	bit 1  unused???
	bit 0  send message only on button activity, not movement
	       DV-specific, and INT 15h/AX=DE0Fh must have been called first
---------------------------------------------
INT 15 - TopView - SEND MESSAGE - "SUBFROM" - RESET OBJECT BITS
	AH = 12h
	BH = 0Bh
	BL = object
	    00h handle is DWORD on top of stack
		window: write attributes only
		mailbox: send message by reference
		pointer: reset control flags
	    01h write attributes only to task's default window
	    02h send msg/status by reference to mailbox (task's handle on stack)
	    03h send msg/status by reference to current task's mailbox
	    04h clear control flags on KEYBOARD object (handle on top of stack)
	    05h clear control flags on task's default KEYBOARD object
	    06h remove specific object from OBJECTQ (task's handle on stack)
	    07h remove specific object from task's default OBJECTQ
	STACK: (if mailbox) DWORD status
			    DWORD length
			    DWORD address
	       (if window)  DWORD number of attributes to write
			    DWORD address of attributes
	       (if objectq) DWORD handle of object to remove
	       (otherwise)  DWORD indicates which bits to clear
---------------------------------------------
INT 15 - TopView - SEND MESSAGE - "OPEN" - OPEN OBJECT
	AH = 12h
	BH = 0Ch
	BL = object
	    00h handle is DWORD on top of stack
		window: fill with given character
		keyboard: attach to a window
		timer: open
		pointer: start taking input for window
		panel: associate with a panel file
	    01h fill task's default window with given character
	    02h open given task's mailbox for input (task's handle on stack)
	    03h open current task's mailbox
	    04h attach a KEYBOARD to a window (handle on top of stack)
	    05h attach task's default KEYBOARD to a window
	    06h open a task's OBJECTQ (task's handle on top of stack)
	    07h open current task's OBJECTQ
	 STACK: (if window)   DWORD character to fill with
		(if keyboard) DWORD handle of window to attach to
		(if pointer)  DWORD handle of window to attach to
		(if panel)    DWORD length of filename
			      DWORD address of filename
		(otherwise)   nothing
Notes: special action taken if first byte of panel file name is 1Bh
       if first two bytes of panel file "name" are C0hC3h, then the "name" IS
       the panel file
       result code of open may be retrieved with STATUS message
---------------------------------------------
INT 15 - TopView - SEND MESSAGE - "CLOSE" - CLOSE OBJECT
	AH = 12h
	BH = 0Dh
	BL = object
	    00h handle is DWORD on top of stack
		timer: close
		keyboard: detach from window
		pointer: stop taking input
		panel: close
	    02h close given task's mailbox (task's handle on top of stack)
	    03h close task's default mailbox
	    04h close KEYBOARD object (handle on top of stack)
	    05h close task's default KEYBOARD
	    06h close givent task's OBJECTQ (task's handle on top of stack)
	    07h close current task's OBJECTQ
---------------------------------------------
INT 15 - TopView - SEND MESSAGE - "ERASE" - ERASE OBJECT
	AH = 12h
	BH = 0Eh
	BL = object
	    00h handle is DWORD on top of stack
		window: clear
		keyboard: discard input
		timer: cancel current interval
		pointer: discard all pending messages
	    01h clear task's default window
	    02h discard all queued messages in mailbox (handle on top of stack)
	    03h discard all queued messages in current task's default mailbox
	    04h discard all input queued to KEYBOARD (handle on top of stack)
	    05h discard all input queued to task's default KEYBOARD
	    06h remove all objects from OBJECTQ (task's handle on top of stack)
	    07h remove all objects from current task's OBJECTQ
---------------------------------------------
INT 15 - TopView - SEND MESSAGE - "STATUS" - GET OBJECT STATUS
	AH = 12h
	BH = 0Fh
	BL = object
	    00h handle is DWORD on top of stack
		timer: is it running?
		pointer: return status of last message
		panel: verify success of last OPEN or APPLY
	    02h return status of last msg READ from mailbox (handle on stack)
	    03h return status of last msg READ from task's default mailbox
	    04h get status of last msg from task's KEYBOARD (task handle on stk)
	    05h get status of last msg from task's default KEYBOARD
	    06h return whether OBJECTQ is open or not (handle on top of stack)
	    07h return whether task's default OBJECTQ is open or not
Return: DWORD on top of stack is status
Note: if object is a panel object, the status indicates the error code:
	14h ???
	15h ???
	16h invalid panel format
	17h panel file already open
	95h ???
	98h null panel file name
---------------------------------------------
INT 15 - TopView - SEND MESSAGE - "EOF" - GET OBJECT EOF STATUS
	AH = 12h
	BH = 10h
	BL = object
	    00h handle is DWORD on top of stack
	    01h returns TRUE if logical cursor past end of task's def window
	    02h return ??? for task's mailbox (task's handle on top of stack)
	    03h return ??? for current task's mailbox
Return: DWORD on top of stack is status
---------------------------------------------
INT 15 - TopView - SEND MESSAGE - "AT" - POSITION OBJECT CURSOR
	AH = 12h
	BH = 11h
	BL = object
	    00h window's handle is DWORD on top of stack
	    01h position logical cursor on task's default window
	STACK: DWORD column
	       DWORD row
---------------------------------------------
INT 15 - TopView - SEND MESSAGE - "SETNAME" - ASSIGN NAME TO MAILBOX
	AH = 12h
	BH = 11h
	BL = mailbox to name
	    00h DWORD on top of stack is mailbox handle
	    02h use given task's mailbox (task's handle on top of stack)
	    03h use current task's default mailbox
	STACK: DWORD length of name
	       DWORD address of name
---------------------------------------------
INT 15 - TopView - SEND MESSAGE - "SETSCALE" - SET POINTER SCALE FACTOR
	AH = 12h
	BX = 1100h
	STACK: DWORD object handle for pointer object
	       DWORD number of colums to scale pointer position to
	       DWORD number of rows to scale pointer position to
---------------------------------------------
INT 15 - TopView - SEND MESSAGE - "READN" - GET NEXT N OBJECT BYTES
	AH = 12h
	BH = 12h
	BL = object
	    00h handle is DWORD on top of stack
	    01h read next N chars/attributes on task's default window
	STACK: DWORD count
Return: STACK: DWORD width of screen line
	       DWORD address
	       DWORD count actually read
---------------------------------------------
INT 15 - TopView - SEND MESSAGE - "GETSCALE" - GET POINTER SCALE FACTOR
	AH = 12h
	BX = 1200h
	STACK: DWORD object handle for pointer
Return: STACK: DWORD pointer pos scaled as if window were this many colums wide
	       DWORD pointer pos scaled as if window were this many rows high
---------------------------------------------
INT 15 - TopView - SEND MESSAGE - "REDRAW" - REDRAW WINDOW
	AH = 12h
	BH = 13h
	BL = window object
	    00h DWORD on top of stack is handle for window to redraw
	    01h redraw task's default window
---------------------------------------------
INT 15 - TopView - SEND MESSAGE - "SETICON" - SPECIFY POINTER ICON
	AH = 12h
	BX = 1300h
	STACK: DWORD object handle for pointer
	       DWORD character to use for pointer
---------------------------------------------
INT 15 - TopView - SEND MESSAGE - "SETESC" - SET ESCAPE ROUTINE ADDRESS
	AH = 12h
	BH = 14h
	BL = message modifier
	    00h handle is DWORD on top of stack
	    01h define user stream
	    04h intercept keystrokes from KEYBOARD to a window (handle on stack)
	    05h intercept keystrokes from task's default KEYBOARD to a window
	STACK: (if window)   DWORD user stream number (14h-1Fh)
			     DWORD address of FAR user stream handler
	       (if keyboard) DWORD address of FAR filter function

The keyboard filter function is called when the keyboard is in field mode.  On
entry,
	AL = character
	AH = 0 or extended ASCII code if AL = 0
	BX = field number
	CH = cursor column
	CL = cursor row
	DL = field type modifier (sixth item in field table entry)
	DH = ??? (seventh item in field table entry)
	ES:SI = window's handle
(also, in DV 2.00, DS:DI points to the field table entry.  This may change in
 other versions)
The filter function should return
	AH = 0 use keystroke
	     1 ignore keystroke
	     >1 beep and ignore keystroke
---------------------------------------------
INT 15 - TopView - SEND MESSAGE - "LOCK" - REQUEST EXCLUSIVE ACCESS TO RESOURCE
	AH = 12h
	BH = 14h
	BL = object
	    00h mailbox handle is DWORD on top of stack
	    02h use given task's mailbox (task's handle on top of stack)
	    03h use current task's default mailbox
Note: release exclusive access by sending CLOSE message to mailbox
      access may be requested multiple times, and requires multiple CLOSEs
---------------------------------------------
INT 15 - DESQview 2.2 - SEND MESSAGE - SET ???
	AH = 12h
	BH = 15h
	BL = object
	    00h DWORD on top of stack
		mailbox, keyboard, or pointer only
	    02h mailbox for task whose handle is on top of stack
	    03h mailbox for current task
	    04h keyboard for task whose handle is on top of stack
	    05h keyboard for current task
	STACK: DWORD ???
Return: nothing
Note: this call is only available if the API level has been set to at least 2.2
---------------------------------------------
INT 15 - DESQview 2.2 - SEND MESSAGE - GET ???
	AH = 12h 
	BH = 16h
	BL = object
	    00h DWORD on top of stack
		mailbox, keyboard, or pointer only
	    02h mailbox for task whose handle is on top of stack
	    03h mailbox for current task
	    04h keyboard for task whose handle is on top of stack
	    05h keyboard for current task
Return: STACK: DWORD ???
Note: this call is only available if the API level has been set to at least 2.2
---------------------------------------------
INT 15 - PRINT.COM - ??? (AT,XT286,PS50+)
	AH = 20h
	AL = subfunction
	    00h ???
	    01h ???
	    10h setup of SYSREQ routine (OS hook)
	    11h completion of SYSREQ function (OS hook)
Note: AL = 0,1 set or reset some flags which affect what PRINT does when it
      tries to access the disk
---------------------------------------------
INT 15 - SYSTEM - POWER-ON SELF-TEST ERROR LOG (PS50+)
	AH = 21h
	AL = subfunction
	    00h read POST log
	    01h write POST log
		BH = device ID
		BL = error code
Return: CF set on error
	AH = status (00h OK, 01h list full, 80h invalid cmd, 86h unsupported)
	if function 00h:
	   BX = number of error codes stored
	   ES:DI -> error log
Note: the log is a series of words, the first byte of which identifies the
      error code and the second the device.
---------------------------------------------
INT 15 - READ/MODIFY PROFILES (CONVERTIBLE)
	AH = 40h
	AL = subfunction
	    0: get system profile in CX and BX
	    1: set system profile from CX and BX
	    2: get internal modem profile in BX
	    3: set internal modem profile from BX
---------------------------------------------
INT 15 - SYSTEM - WAIT ON EXTERNAL EVENT (CONVERTIBLE)
	AH = 41h
	AL = condition type
	    bits 0-2: condition to wait for
		     0 any external event
		     1 compare and return if equal
		     2 compare and return if not equal
		     3 test and return if not zero
		     4 test and return if zero
	    bit 3:    reserved
	    bit 4:    1=port address, 0=user byte
	    bits 5-7: reserved
	BH = condition compare or mask value
	BL = timeout value times 55 milliseconds
	    0 means no timeout
	DX = I/O port address if AL bit 4 set
	ES:DI -> user byte if AL bit 4 clear
---------------------------------------------
INT 15 - SYSTEM - REQUEST POWER OFF (CONVERTIBLE)
	AH = 42h
	AL = 0 to use system profile
	     1 to force suspend regardless of system profile
---------------------------------------------
INT 15 - SYSTEM - READ SYSTEM STATUS (CONVERTIBLE)
	AH = 43h
Return: AL = status bits
	    bit 0: LCD detached
	    bit 1: reserved
	    bit 2: RS232/parallel adapter powered on
	    bit 3: internal modem powered on
	    bit 4: power activated by alarm
	    bit 5: standby power lost
	    bit 6: external power in use
	    bit 7: power low
---------------------------------------------
INT 15 - SYSTEM - (DE)ACTIVATE INTERNAL MODEM POWER (CONVERTIBLE)
	AH = 44h
	AL = 0 to power off
	     1 to power on
---------------------------------------------
INT 15 - OS HOOK - KEYBOARD INTERCEPT (AT model 3x9,XT2,XT286,CONV,PS)
	AH = 4Fh
	AL = scan code
	CF set
Return: CF set
	   AL = scan code
	CF clear
	   scan code should not be used
Note: Called by INT 9 handler to translate scan codes
---------------------------------------------
INT 15 - OS HOOK - DEVICE OPEN (AT,XT2,XT286,PS)
	AH = 80h
	BX = device ID
	CX = process type
Return: CF set on error
	AH = status
---------------------------------------------
INT 15 - OS HOOK - DEVICE CLOSE (AT,XT2,XT286,PS)
	AH = 81h
	BX = device ID
	CX = process type
Return: CF set on error
	AH = status
---------------------------------------------
INT 15 - OS HOOK - DEVICE PROGRAM TERMINATE (AT,XT2,XT286,PS)
	AH = 82h
	BX = device ID
Return: CF set on error
	AH = status
Note: closes all devices opened with function 80h
---------------------------------------------
INT 15 - SYSTEM - EVENT WAIT (AT,XT286,CONV,PS)
	AH = 83h
	AL = subservice
	    0 = set interval
	    1 = cancel
	ES:BX -> event flag (bit 7 set when interval expires)
	CX:DX = number of microseconds to wait (only accurate to 977 us)
Return: CF set if function already busy
---------------------------------------------
INT 15 - SYSTEM - READ JOYSTICK (AT,XT2,XT286,PS)
	AH = 84h
	DX = subservice
	    0 get switch settings
	      Return: AL = switch settings (bits 7-4)
	    1 read joystick inputs
	      Return: AX = A(x) value
		      BX = A(y) value
		      CX = B(x) value
		      DX = B(y) value
---------------------------------------------
INT 15 - OS HOOK - SYSTEM REQUEST KEY PRESSED (AT,XT2,XT286,CONV,PS)
	AH = 85h
	AL = 0 press
	   = 1 release
Return: CF set on error
	AH = status
Note: called by keyboard decode routine
---------------------------------------------
INT 15 - SYSTEM - WAIT (AT,XT2,XT286,CONV,PS)
	AH = 86h
	CX,DX = number of microseconds to wait (only accurate to 977 us)
Return: CF clear: after wait elapses
	CF set: immediately due to error
---------------------------------------------
INT 15 - EXTENDED MEMORY - BLOCK MOVE (AT,XT286,PS)
	AH = 87h
	CX = number of words to move
	ES:SI -> global descriptor table
	    00h-0Fh zero
	    10h-11h source segment length in bytes (2*CX-1 or greater)
	    12h-14h 24-bit linear source address
	    15h     access rights byte (93h)
	    16h-17h zero
	    18h-19h destination segment length in bytes (2*CX-1 or greater)
	    1Ah-1Ch 24-bit linear destination address
	    1Dh     access rights byte (93h)
	    1Eh-2Fh zero   
Return: CF set on error
	AH = status
	    00h source copied into destination
	    01h parity error
	    02h interrupt error
	    03h address line 20 gating failed
---------------------------------------------
INT 15 - EXTENDED MEMORY - GET MEMORY SIZE (AT,XT286,PS)
	AH = 88h
Return: AX = memory size in K
---------------------------------------------
INT 15 - SYSTEM - SWITCH TO VIRTUAL MODE (AT,XT286,PS50+)
	AH = 89h
	BL = interrupt number of IRQ0 (IRQ1-7 use next 7 interrupts)
	BH = interrupt number of IRQ8 (IRQ9-F use next 7 interrupts)
	DS:SI -> GDT for protected mode
	       offset 0h  null descriptor
		      8h  GDT descriptor
		     10h  IDT descriptor
		     18h  DS
		     20h  ES
		     28h  SS
		     30h  CS
		     38h  uninitialized, used to build descriptor for BIOS CS
	CX = offset into protected-mode CS to jump to
Return: CF set on error
	   AH = 0FFh  error enabling address line 20
---------------------------------------------
INT 15 - OS HOOK - DEVICE BUSY LOOP (AT,XT2,XT286,CONV,PS)
	AH = 90h
	AL = type code
	    00h: disk
	    01h: diskette
	    02h: keyboard
	    03h: PS/2 pointing device
	    80h: network
	    FCh: disk reset
	    FDh: diskette motor start
	    FEh: printer
	ES:BX -> request block for type codes 80h through BFh
Return: CF set if wait time satisfied
	CF clear if driver must perform wait
Note: type codes are allocated as follows:
	00-7F non-reentrant devices; OS must arbitrate access
	80-BF reentrant devices; ES:BX points to a unique control block
	C0-FF wait-only calls, no complementary INT 15/AH=91h call
---------------------------------------------
INT 15 - OS HOOK - SET FLAG AND COMPLETE INTERRUPT (AT,XT2,XT286,CONV,PS)
	AH = 91h
	AL = type code, see AH=90h above
	ES:BX -> request block for type codes 80h through BFh
Return: AH = 0
---------------------------------------------
INT 15 - SYSTEM - GET CONFIGURATION (XT after 1/10/86,AT mdl 3x9,CONV,XT286,PS)
	AH = C0h
Return: CF set if BIOS doesn't support call
	ES:BX -> ROM table
	     byte_count  dw   ?   ; number of bytes following
	     model	 db   ?   ; PC=ff, XT=fe or fb, PCjr = fd, etc, etc
	     submodel	 db   ?   ; distingushes between AT and XT/286, etc.
	     BIOS_rev	 db   ?   ; 0 for first release, 1 for 2nd, etc.
	     featbyte	 db   ?   ; 80h = DMA channel 3 used by hd BIOS
				  ; 40h = 2nd 8259 installed
				  ; 20h = Real-Time Clock installed
				  ; 10h = INT 15h/AH=4Fh called upon INT 9h
				  ;  8h = wait for external event supported
				  ;  4h = extended BIOS area allocated at 640K
				  ;  2h = bus is Micro Channel instead of PC
				  ;  1h   reserved
	     res1	 dw   0
	     res2	 dw   0
Note: the 1/10/86 XT BIOS returns an incorrect value for featbyte.
---------------------------------------------
INT 15 - SYSTEM - RETURN EXTENDED-BIOS DATA-AREA SEGMENT ADDRESS (PS)
	AH = C1h
Return: CF set on error
	ES = segment of data area
---------------------------------------------
INT 15 - POINTING DEVICE BIOS INTERFACE (PS,DESQview 2.x)
	AH = C2h
	AL = subfunction
	    00h enable/disable
	       BH = 00h disable
		    01h enable
	    01h reset
	       Return: BH = device ID
	    02h set sampling rate
	       BH = 00h 10/second
		    01h 20/second
		    02h 40/second
		    03h 60/second
		    04h 80/second
		    05h 100/second
		    06h 200/second
	    03h set resolution
	       BH = 00h one count per mm
		    01h two counts per mm
		    02h four counts per mm
		    03h eight counts per mm
	    04h get type
	       Return: BH = device ID
	    05h initialize
	       BH = data package size (1 - 8 bytes)
	    06h get/set scaling factor
	       BH = 00h return device status
		       Return: BL = status
				   bit 0: right button pressed
				   bit 1: reserved
				   bit 2: left button pressed
				   bit 3: reserved
				   bit 4: 0 if 1:1 scaling, 1 if 2:1 scaling
				   bit 5: device enabled
				   bit 6: 0 if stream mode, 1 if remote mode
				   bit 7: reserved
			       CL = resolution (see function 03h)
			       DL = sample rate, reports per second
		    01h set scaling at 1:1
		    02h set scaling at 2:1
	    07h set device handler address
	       ES:BX = user device handler
Return: CF set on error
	AH = status
	    00h successful
	    01h invalid function
	    02h invalid input
	    03h interface error
	    04h need to resend
	    05h no device handler installed
--------------------------------------------
INT 15 - ENABLE/DISABLE WATCHDOG TIMEOUT (PS50+)
	AH = C3h
	AL = 00h disable
	     01h enable
		BX = timer counter
Return: CF set on error
Note: the watchdog timer generates an NMI
---------------------------------------------
INT 15 - PROGRAMMABLE OPTION SELECT (PS50+)
	AH = C4h
	AL = 00h return base POS register address
	     01h enable slot
		 BL = slot number
	     02h enable adapter
Return: CF set on error
	DX = base POS register address (if function 00h)
---------------------------------------------
INT 15 - DESQview - GET PROGRAM NAME
	AX = DE00h
Return: AX = offset into DESQVIEW.DVO of current program's record:
	       BYTE  length of name
	     N BYTES name
	     2 BYTES keys to invoke program (second = 00h if only one key used)
	       WORD  ??? (I see 0 always)
	       BYTE  end flag: 00h for all but last entry, which is FFh
---------------------------------------------
INT 15 - DESQview - UPDATE "OPEN WINDOW" MENU
	AX = DE01h
Return: nothing
Note: reads DESQVIEW.DVO, disables Open menu if file not in current directory
---------------------------------------------
INT 15 - DESQview - UNIMPLEMENTED IN DV 2.x
	AX = DE02h
Return: nothing (NOP in DV 2.x)
---------------------------------------------
INT 15 - DESQview - UNIMPLEMENTED IN DV 2.x
	AX = DE03h
Return: nothing (NOP in DV 2.x)
---------------------------------------------
INT 15 - DESQview - GET AVAILABLE COMMON MEMORY
	AX = DE04h
Return: BX = bytes of common memory available
	CX = largest block available
	DX = total common memory in bytes
---------------------------------------------
INT 15 - DESQview - GET AVAILABLE CONVENTIONAL MEMORY
	AX = DE05h
Return: BX = K of memory available
	CX = largest block available
	DX = total conventional memory in K
---------------------------------------------
INT 15 - DESQview - GET AVAILABLE EXPANDED MEMORY
	AX = DE06h
Return: BX = K of expanded memory available
	CX = largest block available
	DX = total expanded memory in K
---------------------------------------------
INT 15 - DESQview - "APPNUM" - GET CURRENT PROGRAM'S NUMBER
	AX = DE07h
Return: AX = number of program as it appears on the "Switch Windows" menu
---------------------------------------------
INT 15 - DESQview - GET ???
	AX = DE08h
Return: AX = 0	if ??? is not set to the current task
	     1	if ??? is set to the current task
---------------------------------------------
INT 15 - DESQview - UNIMPLEMENTED IN DV 2.x
	AX = DE09h
Return: nothing (NOP in DV 2.x)
---------------------------------------------
INT 15 - DESQview 2.x - "DBGPOKE" - DISPLAY CHARACTER ON STATUS LINE
	AX = DE0Ah
	BL = character
Return: character displayed, next call will display in next position (which
	wraps back to the start of the line if off the right edge of screen)
Notes:	displays character on bottom line of *physical* screen, regardless
	of current size of window (even entirely hidden)
	does not know about graphics display modes, just pokes the characters
	into display memory
---------------------------------------------
INT 15 - DESQview 2.x - "APILEVEL" - DEFINE MINIMUM API LEVEL REQUIRED
	AX = DE0Bh
	BL = API level major version number
	BH = API level minor version number
Return: AX = maximum API level???
Note:	if the requested API level is greater than the version of DESQview, a
	"You need a newer version" error window is popped up
---------------------------------------------
INT 15 - DESQview 2.x - "GETMEM" - ALLOCATE "SYSTEM" MEMORY
	AX = DE0Ch
	BX = number of bytes
Return: ES:DI -> allocated block
---------------------------------------------
INT 15 - DESQview 2.x - "PUTMEM" - DEALLOCATE "SYSTEM" MEMORY
	AX = DE0Dh
	ES:DI -> previously allocated block
Return: nothing
---------------------------------------------
INT 15 - DESQview 2.x - FIND MAILBOX BY NAME
	AX = DE0Eh
	ES:DI -> name to find
	CX = length of name
Return: BX = 0 not found
	     1 found
		DS:SI = object handle
---------------------------------------------
INT 15 - DESQview 2.x - ENABLE DESQview EXTENSIONS
	AX = DE0Fh
Return: AX and BX destroyed (seems to be bug, weren't saved&restored)
Notes: sends a manager stream with opcodes AEh, BDh, and BFh to task's window
      enables an additional mouse mode
---------------------------------------------
INT 15 - DESQview 2.x - "PUSHKEY" - PUT KEY INTO KEYBOARD INPUT STREAM
	AX = DE10h
	BH = scan code
	BL = character
Return: BX = ??? (sometimes, but not always, same as BX passed in)
Note: a later read will get the keystroke as if it had been typed by the user
---------------------------------------------
INT 15 - DESQview 2.x - ENABLE/DISABLE AUTOMATIC JUSTIFICATION OF WINDOW
	AX = DE11h
	BL = 0	      viewport will not move automatically
	     nonzero  viewport will move to keep cursor visible
Return: nothing
---------------------------------------------
INT 15 - DESQview 2.01+ - SET ???
	AX = DE12h
	BX = 0	      clear ??? flag
	     nonzero  set ??? flag
Return: nothing
---------------------------------------------
INT 15 - DESQview 2.2 - GET INVOCATION COUNT
	AX = DE13h
Return: BX = number of calls to DESQview still pending completion
---------------------------------------------
INT 15 - DESQview 2.2 - GET OBJECT TYPE
	AX = DE14h
	ES:DI -> object
Return: BL = 00h not an object
	     08h window or task
	     09h mailbox
	     0Ah keyboard
	     0Bh timer
	     0Ch objectq
	     0Fh pointer
	     10h panel
---------------------------------------------
INT 15 - DESQview 2.2 - SET ???
	AX = DE15h
	BL = 0 ???
	     1 ???
Return: nothing
---------------------------------------------
INT 15 - DESQview 2.2 - GET ???
	AX = DE16h
Return: BL = 0 ???
	     1 ???
Note: returns value set with function DE15h
---------------------------------------------
INT 15 - DESQview 2.2 - reserved
	AX = DE17h
Return: pops up "Programming error" window
Note: AX = 1117h is NOT identical to this call
---------------------------------------------
INT 15 - DESQview 2.2 - ???
	AX = DE18h
Note: calls video driver (NOP for Hercules driver)
---------------------------------------------
INT 16 - KEYBOARD - READ CHAR FROM BUFFER, WAIT IF EMPTY
	AH = 00h
Return: AH = scan code
	AL = character
---------------------------------------------
INT 16 - KEYBOARD - CHECK BUFFER, DO NOT CLEAR
	AH = 01h
Return: ZF = 0 character in buffer
	    AH = scan code
	    AL = character
	ZF = 1 no character in buffer
---------------------------------------------
INT 16 - KEYBOARD - GET SHIFT STATUS
	AH = 02h
	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 (Jr,AT model 339,XT286,PS)
	AH = 03h
	AL = subfunction
	    0 reset typematic (PCjr)
	    1 increase initial delay (PCjr)
	    2 increase continuing delay (PCjr)
	    3 increase both delays (PCjr)
	    4 turn off typematic (PCjr)
	    5 Set typematic rate (AT or PS/2)
	BH = 00 - 03 for delays of 250ms, 500ms, 750ms, or 1s
	BL = 00 - 1F for typematic rates of 30cps down to 2cps
---------------------------------------------
INT 16 - KEYBOARD - KEYCLICK (Jr,CONV)
	AH = 04h
	AL =
	    0 click off
	    1 click on
---------------------------------------------
INT 16 - KEYBOARD - WRITE TO KEYBOARD BUFFER (AT model 339,XT2,XT286,PS)
	AH = 05h
	CH = scan code
	CL = character
Return: AL = 1 if buffer full
---------------------------------------------
INT 16 - KEYBOARD - GET ENHANCED KEYSTROKE (AT model 339,XT2,XT286,PS)
	AH = 10h
Return: AH = scan code
	AL = character
---------------------------------------------
INT 16 - KEYBOARD - CHECK ENHANCED KEYSTROKE (AT model 339,XT2,XT286,PS)
	AH = 11h
Return: ZF = 0 if keystroke available
	    AH = scan code \ meaningless if ZF = 1
	    AL = character /
	ZF = 1 if kbd buffer empty
---------------------------------------------
INT 16 - KEYBOARD - GET ENHANCED SHIFT FLAGS (AT model 339,XT2,XT286,PS)
	AH = 12h
Return: AL (same as for AH=02h)
	   bit 7: Ins ON
	   bit 6: CapsLock ON
	   bit 5: NumLock ON
	   bit 4: ScrollLock ON
	   bit 3: Either ALT key down
	   bit 2: Either CTRL key down
	   bit 1: Left shift key down
	   bit 0: Right shift key down
	AH
	   bit 7: SysReq key down
	   bit 6: CapsLock key down
	   bit 5: NumLock key down
	   bit 4: ScrollLock key down
	   bit 3: Right Alt key down
	   bit 2: Right Ctrl key down
	   bit 1: Left Alt key down
	   bit 0: Right Alt key down
---------------------------------------------
INT 16 - Compaq 386 - SET CPU SPEED
	AH = F0h
	AL = speed
	    00h equivalent to 6 MHz 80286 (COMMON)
	    01h equivalent to 8 MHz 80286 (FAST)
	    02h full 16 MHz (HIGH)
	    03h toggles between 8 MHz-equivalent and speed set by system board
		switch (AUTO or HIGH)
	    08h full 16 MHz except 8 MHz-equivalent during floppy disk access
	    09h specify speed directly
		CX = speed value, 1 (slowest) to 50 (full), 3 ~= 8088
---------------------------------------------
INT 16 - Compaq 386 - READ CURRENT CPU SPEED
	AH = F1h
Return:	AL = speed code (see function F0h above)
	     if AL = 09h, CX = speed code
---------------------------------------------
INT 16 - Compaq 386 - DETERMINE ATTACHED KEYBOARD TYPE
	AH = F2h
Return: AL = type
	    00h if 11-bit AT keyboard is in use
	    01h if 9-bit PC keyboard is in use 
---------------------------------------------
INT 17 - PRINTER - OUTPUT CHARACTER
	AH = 00h
	AL = character
	DX = printer port (0-3)
Return: AH = status bits
	    0 = time out
	    1 = unused
	    2 = unused
	    3 = I/O error
	    4 = selected
	    5 = out of paper
	    6 = acknowledge
	    7 = not busy
---------------------------------------------
INT 17 - PRINTER - INITIALIZE
	AH = 01h
	DX = printer port (0-3)
Return: AH = status (see AH = 00h above)
---------------------------------------------
INT 17 - PRINTER - GET STATUS
	AH = 02h
	DX = printer port (0-3)
Return: AH = status (see AH = 00h above)
---------------------------------------------
INT 18 - TRANSFER TO ROM BASIC
   causes transfer to ROM-based BASIC (IBM-PC)
   often reboots a compatible; often has no effect at all
---------------------------------------------
INT 19 - DISK BOOT
   causes reboot of disk system (no memory test performed)
---------------------------------------------
INT 1A - CLOCK - GET TIME OF DAY
	AH = 00h
Return: CX:DX = clock count
	AL = 0 if clock was read or written (via AH=0,1)
	       within the current 24-hour period
	       Otherwise, AL > 0
---------------------------------------------
INT 1A - CLOCK - SET TIME OF DAY
	AH = 01h
	CX:DX = clock count
Return: time of day set
---------------------------------------------
INT 1A - CLOCK - READ REAL TIME CLOCK (AT,XT286,CONV,PS)
	AH = 02h
Return: CH = hours in BCD
	CL = minutes in BCD
	DH = seconds in BCD
---------------------------------------------
INT 1A - CLOCK - SET REAL TIME CLOCK (AT,XT286,CONV,PS)
	AH = 03h
	CH = hours in BCD
	CL = minutes in BCD
	DH = seconds in BCD
	DL = 1, if daylight savings; 0 if standard time
Return: CMOS clock set
---------------------------------------------
INT 1A - CLOCK - READ DATE FROM REAL TIME CLOCK (AT,XT286,CONV,PS)
	AH = 04h
Return: DL = day in BCD
	DH = month in BCD
	CL = year in BCD
	CH = century (19h or 20h)
---------------------------------------------
INT 1A - CLOCK - SET DATE IN REAL TIME CLOCK (AT,XT286,CONV,PS)
	AH = 05h
	DL = day in BCD
	DH = month in BCD
	CL = year in BCD
	CH = century (19h or 20h)
Return: CMOS clock set
---------------------------------------------
INT 1A - CLOCK - SET ALARM (AT,XT286,CONV,PS)
	AH = 06h
	CH = hours in BCD
	CL = minutes in BCD
	DH = seconds in BCD
Return: CF set if alarm already set or clock inoperable
	INT 4Ah will be called when alarm goes off, every 24 hours until reset
---------------------------------------------
INT 1A - CLOCK - RESET ALARM (AT,XT286,CONV,PS)
	AH = 07h
Return: alarm disabled
---------------------------------------------
INT 1A - CLOCK - SET RTC ACTIVATED POWER ON MODE (CONVERTIBLE)
	AH = 08h
	CH = hours in BCD
	CL = minutes in BCD
	DH = seconds in BCD
---------------------------------------------
INT 1A - CLOCK - READ RTC ALARM TIME AND STATUS (CONV,PS30)
	AH = 09h
Return: CH = hours in BCD
	CL = minutes in BCD
	DH = seconds in BCD
	DL = alarm status
	    0  alarm not enabled
	    1  alarm enabled but will not power up system
	    2  alarm will power up system
---------------------------------------------
INT 1A - CLOCK - READ SYSTEM-TIMER DAY COUNTER (XT2,PS)
	AH = 0Ah
Return: CF set on error
	CX = count of days since Jan 1,1980
---------------------------------------------
INT 1A - CLOCK - SET SYSTEM-TIMER DAY COUNTER (XT2,PS)
	AH = 0Bh
	CX = count of days since Jan 1,1980
Return: CF set on error
---------------------------------------------
INT 1A - PCjr - SET UP SOUND MULTIPLEXOR
	AH = 80h
	AL = 0 source is 8253 channel 2
	     1 source is cassette input
	     2 source is I/O channel "Audio IN"
	     3 source is sound generator chip
---------------------------------------------
INT 1A - AT&T 6300 - READ TIME AND DATE
	AH = FEh
Return: BX = day count (1 = Jan 1, 1984)
	CH = hour
	CL = minute
	DH = second
	DL = hundredths
---------------------------------------------
INT 1B - CTRL-BREAK KEY
   This interrupt is called when the keyboard scanner of the IBM
   machines detects CTRL and BREAK pressed at the same time. It
   normally points to a short routine in DOS which sets the
   Ctrl-C flag, thus invoking INT 23h the next time DOS checks
   for Ctrl-C.
---------------------------------------------
INT 1C - CLOCK TICK
   This interrupt is called (in the IBM) at the end of each time-update
   operation by the time-of-day routines.  It normally points to an IRET.
---------------------------------------------
INT 1D -> 6845 VIDEO INIT TABLES
	table for modes 0 and 1   \
	table for modes 2 and 3    \ each table is 16 bytes long and
	table for modes 4,5, and 6 / contains values for 6845 registers
	table for mode 7	  /
	4 words -- size of video RAM for modes 0/1, 2/3, 4/5, and 6/7
	8 bytes -- number of columns in each mode
	8 bytes -- video controller mode byte for each mode
---------------------------------------------
INT 1E -> DISKETTE PARAMS (BASE TABLE)
	(Default at F000:EFC7 in PC and most compatibles)
	DB	step rate & head unload times
	DB	head load time & DMA
	DB	motor off time in clock ticks (36 or 37 typical)
	DB	sector size in bytes (0->128, 1->256, 2->512, 3->1024)
	DB	last sector number (8 or 9 typical)
	DB	inter-sector gap size on read/write (42 typical)
	DB	data transfer length (255 typical)
	DB	inter-sector gap size on format (80 typical)
	DB	sector fill on format (F6h typical)
	DB	head-settle time ms (typical 25, 1.10->0, 2.10->15, 3.10->1)
	DB	motor start-up time (1/8 secs) (typical 4, 2.10->2)
---------------------------------------------
INT 1F -> GRAPHICS SET 2
       (NOT a vector!) pointer to bitmaps for high 128 chars
---------------------------------------------
INT 20 - Minix - SEND/RECEIVE MESSAGE
	AX = process ID of other process
	BX -> message
	CX = 1 send
	     2 receive
	     3 send&receive
Note: the message contains the system call number (numbered as in V7 Unix(tm))
      and the call parameters
---------------------------------------------
INT 20 - DOS - PROGRAM TERMINATION
returns to DOS--identical to INT 21/AH=00h
---------------------------------------------
INT 21 - DOS - PROGRAM TERMINATION
	AH = 00h
Return: never
---------------------------------------------
INT 21 - DOS - KEYBOARD INPUT
	AH = 01h
Return: AL = character read
Note: ^C/^Break are checked, and INT 23h executed if read
      character is echoed to standard output
---------------------------------------------
INT 21 - DOS - DISPLAY OUTPUT
	AH = 02h
	DL = character to send to standard output
Note: ^C/^Break are checked, and INT 23h executed if pressed
---------------------------------------------
INT 21 - DOS - AUX INPUT
	AH = 03h
Return: AL = character read
---------------------------------------------
INT 21 - DOS - AUX OUTPUT
	AH = 04h
	DL = character to send
---------------------------------------------
INT 21 - DOS - PRINTER OUTPUT
	AH = 05h
	DL = character to print
---------------------------------------------
INT 21 - DOS - DIRECT CONSOLE I/O CHARACTER OUTPUT
	AH = 06h
	DL = character <> FFh
---------------------------------------------
INT 21 - DOS - DIRECT CONSOLE I/O CHARACTER INPUT
	AH = 06h
	DL = 0FFh
Return: ZF set	 = no character
	ZF clear = character recieved
		  AL = character
Notes: Character is echoed to STDOUT if received.
       ^C/^Break are NOT checked
---------------------------------------------
INT 21 - DOS - DIRECT STDIN INPUT, NO ECHO
	AH = 07h
Note: same as function 06h for input but char not echoed
---------------------------------------------
INT 21 - DOS - KEYBOARD INPUT, NO ECHO
	AH = 08h
Return: AL = character
Note: same as function 07h, but ^C/^Break are checked
---------------------------------------------
INT 21 - DOS - PRINT STRING
	AH = 09h
	DS:DX = address of string terminated by "$"
Note: ^C/^Break checked, and INT 23h called if pressed
---------------------------------------------
INT 21 - DOS - BUFFERED KEYBOARD INPUT
	AH = 0Ah
	DS:DX = address of buffer
Note: first byte of buffer must contain maximum length
      on entry, second byte contains actual length of previous line which may
	be recalled with the DOS line-editing commands
      on return the second byte contains actual length, third and
	subsequent bytes contain the input line
---------------------------------------------
INT 21 - DOS - CHECK STANDARD INPUT STATUS
	AH = 0Bh
Return: AL = FFh if character available
	     00h if no character
Note: ^C/^Break checked, and INT 23h called if pressed
---------------------------------------------
INT 21 - DOS - CLEAR KEYBOARD BUFFER
	AH = 0Ch
	AL must be 1, 6, 7, 8, or 0Ah.
Notes: Flushes all typeahead input, then executes function specified by AL
       (effectively moving it to AH and repeating the INT 21 call).
       If AL contains a value not in the list above, the keyboard buffer is
       flushed and no other action is taken.
---------------------------------------------
INT 21 - DOS - DISK RESET
	AH = 0Dh
Note: Flushes all disk buffers.
---------------------------------------------
INT 21 - DOS - SELECT DISK
	AH = 0Eh
	DL = new default drive number (0 = A, 1 = B, etc.)
Return: AL = number of logical drives
---------------------------------------------
INT 21 - DOS - OPEN DISK FILE
	AH = 0Fh
	DS:DX = address of FCB
Return: AL = 00h file found
	     FFh file not found
Note: (DOS 3.x) file opened in compatibility mode
---------------------------------------------
INT 21 - DOS - CLOSE DISK FILE
	AH = 10h
	DS:DX = address of FCB
Return: AL = 00h directory update successful
	     FFh file not found in directory
---------------------------------------------
INT 21 - DOS - SEARCH FIRST USING FCB
	AH = 11h
	DS:DX = address of FCB
Return: AL = status
	    00h file found
	    FFh file not found
Note: If file found, FCB is created at DTA address and set up to
      OPEN or DELETE it.
---------------------------------------------
INT 21 - DOS - SEARCH NEXT USING FCB
	AH = 12h
	DS:DX = address of FCB
Return: AL = status
	    00h file found
	    FFh file not found
Note: If file found, FCB is created at DTA address and set up to
      OPEN or DELETE it.
---------------------------------------------
INT 21 - DOS - DELETE FILE via FCB
	AH = 13h
	DS:DX = address of FCB with filename field filled with template for
		deletion ('?' wildcard allowed)
Return: AL = status
	    00h file found
	    FFh file not found
---------------------------------------------
INT 21 - DOS - SEQUENTIAL DISK FILE READ
	AH = 14h
	DS:DX = address of FCB
Return: AL = status
	    0 successful read
	    1 end of file
	    2 data transfer area too small
	    3 partial record, EOF
---------------------------------------------
INT 21 - DOS - SEQUENTIAL DISK RECORD WRITE
	AH = 15h
	DS:DX = address of FCB
Return: AL = status
	    0 successful write
	    1 disk full
	    2 data transfer area too small
---------------------------------------------
INT 21 - DOS - CREATE A DISK FILE
	AH = 16h
	DS:DX = address of FCB
Return: AL = status
	    00h successful creation
	    FFh directory full
Note: if file already exists, it is truncated to zero length
---------------------------------------------
INT 21 - DOS - RENAME FILE via FCB
	AH = 17h
	DS:DX = address of FCB
	FCB contains new name starting at byte 17h.
Return: AL = status
	    00h file found
	    FFh file not found
---------------------------------------------
INT 21 - DOS internal - UNUSED
	AH = 18h
Return: AL = 0
---------------------------------------------
INT 21 - DOS - GET DEFAULT DISK NUMBER
	AH = 19h
Return: AL = current drive number (letter - 'A')
---------------------------------------------
INT 21 - DOS - SET DISK TRANSFER AREA ADDRESS
	AH = 1Ah
	DS:DX = address of buffer
---------------------------------------------
INT 21 - DOS - ALLOCATION TABLE INFORMATION
	AH = 1Bh
Return: DS:BX points to FAT ID byte for default drive
	DX = number of allocation units on disk
	AL = number of sectors per allocation unit (cluster)
	CX = number of bytes per sector
---------------------------------------------
INT 21 - DOS - ALLOCATION TABLE INFORMATION FOR SPECIFIC DEVICE
	AH = 1Ch
	DL = Drive Number to check
Return: DS:BX points to FAT ID byte
	DX = number of allocation units on disk
	AL = number of sectors per allocation unit (cluster)
	CX = number of bytes per sector
---------------------------------------------
INT 21 - DOS internal - UNUSED
	AH = 1Dh
Return: AL = 0
---------------------------------------------
INT 21 - DOS internal - UNUSED
	AH = 1Eh
Return: AL = 0
---------------------------------------------
INT 21 - DOS internal - GET DEFAULT DRIVE PARAMETER BLOCK
	AH = 1Fh
Return: AL = 00h No Error
	     FFh Error
	DS:BX -> drive parameter block
Note: for DOS 2.x and 3.x, this just invokes function 32h with DL = 0
---------------------------------------------
INT 21 - DOS internal - UNUSED
	AH = 20h
Return: AL = 0
---------------------------------------------
INT 21 - DOS - RANDOM DISK RECORD READ
	AH = 21h
	DS:DX = address of FCB
Return: AL = status
	    0 successful read
	    1 end of file
	    2 data transfer area too small
	    3 partial record, EOF
---------------------------------------------
INT 21 - DOS - RANDOM DISK RECORD WRITE
	AH = 22h
	DS:DX = address of FCB
Return: AL = status (see AH = 21h above)
---------------------------------------------
INT 21 - DOS - GET FILE SIZE
	AH = 23h
	DS:DX = address of unopened FCB with filename and record size fields
		initialized
Return: AL = status
	    00h file found
	    FFh file not found
Note: FCB's random-record field set to number of records (rounded up)
---------------------------------------------
INT 21 - DOS - SET RANDOM RECORD FIELD
	AH = 24h
	DS:DX = address of FCB
Return: Random Record Field of FCB is set to be same as Current Block
	and Current Record.
Note: FCB must be OPEN already
---------------------------------------------
INT 21 - DOS - SET INTERRUPT VECTOR
	AH = 25h
	AL = interrupt number
	DS:DX = new vector to be used for specified interrupt
---------------------------------------------
INT 21 - DOS - CREATE PSP
	AH = 26h
	DX = Segment number to set up PSP at
Return: Current PSP is copied to specified segment
Note:	new PSP is updated with memory size information; INTs 22h, 23h, 24h
	taken from interrupt vector table
---------------------------------------------
INT 21 - DOS - RANDOM BLOCK READ
	AH = 27h
	DS:DX = address of FCB
	CX = number of records to be read
Return: AL = status
	    0 successful read
	    1 end of file
	    2 data transfer area too small
	    3 partial record, EOF
---------------------------------------------
INT 21 - DOS - RANDOM BLOCK WRITE
	AH = 28h
	DS:DX = address of FCB
	CX = number of records to be written
	     if zero, truncate file to current random file position
Return: AL = status
	    0 successful write
	    1 disk full
	    2 data transfer area too small
---------------------------------------------
INT 21 - DOS - PARSE FILENAME
	AH = 29h
	DS:SI -> string to parse
	ES:DI -> buffer to fill with unopened FCB
	AL = bit mask to control parsing
	    0 = 0: parsing stops if file separator found
		1: leading separator ignored
	    1 = 0: drive number in FCB set to default drive if not present
		   in string
		1: drive number in FCB not changed
	    2 = 0: filename in FCB set to blanks if no filename in string
		1: filename in FCB not changed if string does not contain
		   a filename
	    3 = 0: extension in FCB set to blanks if no extension in string
		1: extension left unchanged
Return: AL = 00h: no wildcards in name or extension
	     01h: wildcards appeared
	     FFh: drive specifier invalid
	DS:SI -> first byte after parsed string
	ES:DI buffer filled with unopened FCB
---------------------------------------------
INT 21 - DOS - GET CURRENT DATE
	AH = 2Ah
Return: DL = day
	DH = month
	CX = year
	AL = day of the week (0=Sunday, 1=Monday, etc.)
---------------------------------------------
INT 21 - DOS - SET CURRENT DATE
	AH = 2Bh
	DL = day
	DH = month
	CX = year
Return: AL = 00h if no error
	   = FFh if bad value sent to routine
Note: DOS 3.3 also sets CMOS clock
---------------------------------------------
INT 21 - DESQview - INSTALLATION CHECK
	AH = 2Bh
	AL = subfunction (DV v2.00+)
	    01h get version
		Return: BX = version (BH = major, BL = minor)
		Note: early copies of v2.00 return 0002h
	    02h get shadow buffer info, and start shadowing
		Return: BH = rows in shadow buffer
			BL = columns in shadow buffer
			DX = segment of shadow buffer
	    04h get shadow buffer info
		Return: BH = rows in shadow buffer
			BL = columns in shadow buffer
			DX = segment of shadow buffer
	    05h stop shadowing
	CX = 4445h ('DE')
	DX = 5351h ('SQ')
Return: AL = FFh if DESQview not installed
Note:	in DESQview v1.x, there were no subfunctions; this call only identified

--