Outils pour utilisateurs

Outils du site


back2root:ibm-pc-ms-dos:interrupts:old:ms_interrupt_list-11-15

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentesRévision précédente
back2root:ibm-pc-ms-dos:interrupts:old:ms_interrupt_list-11-15 [2023/01/05 04:01] – supprimée - modification externe (Unknown date) 127.0.0.1back2root:ibm-pc-ms-dos:interrupts:old:ms_interrupt_list-11-15 [2023/01/05 04:01] (Version actuelle) – créée - modification externe 127.0.0.1
Ligne 1: Ligne 1:
 +====== MSDOS - Interrupt List 11h-20h ======
  
 +===== INT 11 =====
 +
 +==== INT 11 - CPU-generated (80486+) - ALIGNMENT CHECK ====
 +
 +Bit AC in the EFLAGS register enables this interrupt on a memory reference on a mis-aligned address when in privilege mode 3.
 +
 +==== INT 11 - BIOS - GET EQUIPMENT LIST ====
 +<code>
 +Return: AX = BIOS equipment list word
 +     bits
 +     0   floppy disk(s) installed (see bits 6-7)
 +     1   80x87 coprocessor installed
 +     2,3   number of 16K banks of RAM on motherboard (PC only)
 +   number of 64K banks of RAM on motherboard (XT only)
 +     2   pointing device installed (PS)
 +     3   unused (PS)
 +     4-5   initial video mode
 +   00 EGA, VGA, or PGA
 +   01 40x25 color
 +   10 80x25 color
 +   11 80x25 monochrome
 +     6-7   number of floppies installed less 1 (if bit 0 set)
 +     8   DMA support installed (PCjr, some Tandy 1000s, 1400LT)
 +     9-11  number of serial ports installed
 +     12   game port installed
 +     13   serial printer attached (PCjr)
 +   internal modem installed (PC/Convertible)
 +     14-15 number of parallel ports installed
 +</code>
 +
 +---Compaq and many other 386/486 machines--
 + EAX bit 23: page tables set so that Weitek coprocessor addressable in
 + real mode
 +     bit 24: Weitek math coprocessor present
 +---Compaq Systempro
 + EAX bit 25: internal DMA parallel port available
 + 26: IRQ for internal DMA parallel port (if bit 25 set)
 +     0 = IRQ5
 +     1 = IRQ7
 +      27,28: parallel port DMA channel
 +     00 DMA channel 0
 +     01 DMA channel 0 ???
 +     10 reserved
 +     11 DMA channel 3
 +SeeAlso: INT 12
 +
 +==== INT 11 - BNU FOSSIL - INSTALLATION CHECK ====
 +
 + AH = BCh
 + DX = 1954h
 +Return: AX = 1954h
 + ES:DX -> entry point of driver (instead of INT 14)
 +
 +==== INT 11 - WD7000 SDLP interface - EXECUTE GENERIC SCSI COMMAND ====
 +
 + AH = FFh
 + SI = 6A6Ah
 + AL = SCSI Addressing
 +     bits 2-0 SCSI Target LUN (logical unit number)
 +     bits 5-3 SCSI Target ID
 +     bit 7    write flag, set for write operations, clear otherwise
 + CX = bytes of data to be transmitted (max FFF0h)
 + DH = 00h
 + DL = length of SCSI Command Descriptor Block
 + DS:DI -> SCSI Command Descriptor Block
 + ES:BX -> data buffer
 +Return: CF set on error
 +     AL = error code
 + CF clear if successful
 +Note: because of busmaster operations with WD7000FASST avoid accessing
 +   video memory directly; check 386 memory manager for VDS support.
 +   The WD7000XTAT works with programmed IO and does not have this
 +   limitation.
 +SeeAlso: INT 21/AX=4402"ASPI"
 +
 +==== INT 11 - BACK&FORTH (before v1.62) API ====
 +
 + AX = FFFEh
 + CX = FFFEh
 + BX = function
 +     00h installation check
 + Return: AX = 0001h BNFHIGH and BNFLOW both loaded
 +    = 0003h only BNFHIGH loaded
 +    else neither loaded
 +     01h ???
 + Return: DX:AX -> ???
 +     02h ???
 +     03h ???
 +     04h ???
 +     05h ??? switches current PSP segment and stack if BNFLOW has not
 +     yet announced itself installed
 +     06h ???
 + Return: AX = ???
 +SeeAlso: INT 12/AX=FFFEh
 +
 +===== INT 12 =====
 +
 +==== INT 12 - BIOS - GET MEMORY SIZE ====
 +
 +Return: AX = kilobytes of contiguous memory starting at absolute address 00000h
 +Note: this call returns the contents of the word at 0040h:0013h; in PC and
 +   XT, this value is set from the switches on the motherboard
 +SeeAlso: INT 11,INT 2F/AX=4A06h
 +
 +==== INT 12 - KEYBUI v2.0+ - INSTALLATION CHECK ====
 +
 + CX = 1806h
 +Return: AX = kilobytes of contiguous memory starting at absolute address 00000h
 + CX = 1960h if installed
 +Note: KEYBUI is a resident keyboard driver by Johan Zwiekhorst which allows
 +   accented characters and box drawing on standard QWERTY keyboards; it
 +   also provides break-to-DOS and screen blanking capabilities
 +
 +==== INT 12 - PARKER v2.0+ - INSTALLATION CHECK ====
 +
 + CX = 1807h
 +Return: AX = kilobytes of contiguous memory starting at absolute address 00000h
 + CX = 1961h if installed
 +Note: PARKER is an optionally-resident hard disk parking program by Johan
 +   Zwiekhorst
 +
 +==== INT 12 - Back&Forth v1.62+ - API ====
 +
 + AX = FFFEh
 + CX = FFFEh
 + BX = function
 +     00h installation check
 + Return: AX = 0001h installed
 +      else  not loaded
 +     02h build program ID list
 + ES:DI -> buffer of at least 100 bytes, to be filled with words
 + Return: AX = number of programs defined
 + ES:DI buffer filled with AX words
 +     03h switch to specified task (task need not be open yet)
 + DX = two-letter program ID
 + Return: AX = 0000h if task undefined
 +     04h ???
 +     05h ???
 +     06h get version (undoc)
 + Return: AX = version * 100 (v1.71 = 00ABh)
 +     07h ???
 +     08h get open tasks (undoc)
 + ES:DI -> task info buffer (see below)
 + Return: AX = number of open tasks (max 20)
 +     09h ???
 +Note: Back & Forth is a task switcher by Progressive Solutions, Inc.
 +SeeAlso: INT 11/AX=FFFEh
 +
 +Format of task info buffer:
 +Offset Size Description
 + 00h 21 BYTEs ASCIZ task name
 + 15h BYTE hotkey shift state (as for INT 16/AH=02h)
 + 16h WORD hotkey scan code
 + 18h WORD program ID
 +
 +===== INT 13 =====
 +
 +==== INT 13 - DISK - RESET DISK SYSTEM ====
 +
 + AH = 00h
 + DL = drive (if bit 7 is set both hard disks and floppy disks reset)
 +Return: AH = status (see AH=01h)
 + CF clear if successful (returned AH=00h)
 + CF set on error
 +Note: forces controller to recalibrate drive heads (seek to track 0)
 +SeeAlso: AH=0Dh,AH=11h,INT 21/AH=0Dh,INT 4E"TI Professional"
 +
 +==== INT 13 - DISK - GET STATUS OF LAST OPERATION ====
 +
 + AH = 01h
 + DL = drive (bit 7 set for hard disk)
 +Return: CF clear if successful (returned status 00h)
 + CF set on error
 + AH = status of previous operation
 +     00h successful completion
 +     01h invalid function in AH or invalid parameter
 +     02h address mark not found
 +     03h disk write-protected (floppy)
 +     04h sector not found
 +     05h reset failed (hard disk)
 +     06h disk changed (floppy)
 +     07h drive parameter activity failed (hard disk)
 +     08h DMA overrun
 +     09h attempted DMA across 64K boundary
 +     0Ah bad sector detected (hard disk)
 +     0Bh bad track detected (hard disk)
 +     0Ch unsupported track or invalid media
 +     0Dh invalid number of sectors on format (hard disk)
 +     0Eh control data address mark detected (hard disk)
 +     0Fh DMA arbitration level out of range (hard disk)
 +     10h uncorrectable CRC or ECC error on read
 +     11h data ECC corrected (hard disk)
 +     20h controller failure
 +     40h seek failed
 +     80h timeout (not ready)
 +     AAh drive not ready (hard disk)
 +     BBh undefined error (hard disk)
 +     CCh write fault (hard disk)
 +     E0h status register error (hard disk)
 +     FFh sense operation failed (hard disk)
 +Note: some BIOSes return the status in AL; the PS/2 Model 30/286 returns the
 +   status in both AH and AL
 +
 +==== INT 13 - DISK - READ SECTOR(S) INTO MEMORY ====
 +
 + AH = 02h
 + AL = number of sectors to read (must be nonzero)
 + CH = low eight bits of cylinder number
 + CL = sector number (bits 0-5)
 +      high two bits of cylinder (bits 6-7, hard disk only)
 + DH = head number
 + DL = drive number (bit 7 set for hard disk)
 + ES:BX -> data buffer
 +Return: CF set on error
 +     if AH = 11h (corrected ECC error), AL = burst length
 + CF clear if successful
 + AH = status (see AH=01h)
 + AL = number of sectors transferred
 +Notes: errors on a floppy may be due to the motor failing to spin up quickly
 +   enough; the read should be retried at least three times, resetting
 +   the disk with AH=00h between attempts
 + AWARD AT BIOS extended to handle more than 1024 cylinders by placing
 +   bits 10 and 11 of the cylinder number into bits 6 and 7 of DH
 +SeeAlso: AH=03h,AH=0Ah
 +
 +==== INT 13 - DISK - WRITE DISK SECTOR(S) ====
 +
 + AH = 03h
 + AL = number of sectors to write (must be nonzero)
 + CH = low eight bits of cylinder number
 + CL = sector number (bits 0-5)
 +      high two bits of cylinder (bits 6-7, hard disk only)
 + DH = head number
 + DL = drive number (bit 7 set for hard disk)
 + ES:BX -> data buffer
 +Return: CF set on error
 + CF clear if successful
 + AH = status (see AH=01h)
 + AL = number of sectors transferred
 +Notes: errors on a floppy may be due to the motor failing to spin up quickly
 +   enough; the write should be retried at least three times, resetting
 +   the disk with AH=00h between attempts
 + AWARD AT BIOS extended to handle more than 1024 cylinders by placing
 +   bits 10 and 11 of the cylinder number into bits 6 and 7 of DH
 +SeeAlso: AH=02h,AH=0Bh
 +
 +==== INT 13 - DISK - VERIFY DISK SECTOR(S) ====
 +
 + AH = 04h
 + AL = number of sectors to verify (must be nonzero)
 + CH = low eight bits of cylinder number
 + CL = sector number (bits 0-5)
 +      high two bits of cylinder (bits 6-7, hard disk only)
 + DH = head number
 + DL = drive number (bit 7 set for hard disk)
 + ES:BX -> data buffer (PC,XT,AT with BIOS prior to 11/15/85)
 +Return: CF set on error
 + CF clear if successful
 + AH = status (see AH=01h)
 + AL = number of sectors verified
 +Notes: errors on a floppy may be due to the motor failing to spin up quickly
 +   enough; the write should be retried at least three times, resetting
 +   the disk with AH=00h between attempts
 + this function does not compare the disk with memory, it merely
 +   checks whether the sector's stored CRC matches the data's actual CRC
 + AWARD AT BIOS extended to handle more than 1024 cylinders by placing
 +   bits 10 and 11 of the cylinder number into bits 6 and 7 of DH
 +SeeAlso: AH=02h
 +
 +==== INT 13 - FLOPPY - FORMAT TRACK ====
 +
 + AH = 05h
 + AL = number of sectors to format
 + CH = track number
 + DH = head number
 + DL = drive number
 + ES:BX -> address field buffer (see below)
 +Return: CF set on error
 + CF clear if successful
 + AH = status (see AH=01h)
 +Notes: on AT or higher, call AH=17h first
 + the number of sectors per track is read from the diskette parameter
 +   table pointed at by INT 1E
 +SeeAlso: AH=05h"FIXED",AH=17h,AH=18h,INT 1E
 +
 +Format of address field buffer entry (one per sector in track):
 +Offset Size Description
 + 00h BYTE track number
 + 01h BYTE head number (0-based)
 + 02h BYTE sector number
 + 03h BYTE sector size (00h=128 bytes, 01h=256 bytes, 02h=512, 03h=1024)
 +
 +==== INT 13 - FIXED DISK - FORMAT TRACK ====
 +
 + AH = 05h
 + AL = interleave value (XT-type controllers only)
 + ES:BX = 512-byte format buffer
 + the first 2*(sectors/track) bytes contain F,N for each sector
 +    F = 00h for good sector, 80h for bad sector
 +    N = sector number
 + CH = cylinder number (bits 8,9 in high bits of CL)
 + CL = high bits of cylinder number (bits 7,6)
 + DH = head
 + DL = drive
 +Return: AH = status code (see AH=01h)
 +Notes: AWARD AT BIOS extended to handle more than 1024 cylinders by placing
 +   bits 10 and 11 of the cylinder number into bits 6 and 7 of DH
 + for XT-type controllers on an AT or higher, AH=0Fh should be called
 +   first
 +SeeAlso: AH=05h"FLOPPY",AH=06h,AH=07h,AH=0Fh,AH=18h,AH=1Ah
 +
 +==== INT 13 - FIXED DISK - FORMAT TRACK AND SET BAD SECTOR FLAGS (XT,PORT) ====
 +
 + AH = 06h
 + AL = interleave value
 + CH = cylinder number (bits 8,9 in high bits of CL)
 + CL = sector number
 + DH = head
 + DL = drive
 +Return: AH = status code (see AH=01h)
 +Note: AWARD AT BIOS extended to handle more than 1024 cylinders by placing
 +   bits 10 and 11 of the cylinder number into bits 6 and 7 of DH
 +
 +==== INT 13 - FIXED DISK - FORMAT DRIVE STARTING AT GIVEN TRACK (XT,PORT) ====
 +
 + AH = 07h
 + AL = interleave value (XT only)
 + ES:BX = 512-byte format buffer (see AH=05h)
 + CH = cylinder number (bits 8,9 in high bits of CL)
 + CL = sector number
 + DH = head
 + DL = drive
 +Return: AH = status code (see AH=01h)
 +Note: AWARD AT BIOS extended to handle more than 1024 cylinders by placing
 +   bits 10 and 11 of the cylinder number into bits 6 and 7 of DH
 +SeeAlso: AH=1Ah
 +
 +==== INT 13 - DISK - GET DRIVE PARAMETERS (PC,XT286,CONV,PS,ESDI,SCSI) ====
 +
 + AH = 08h
 + DL = drive (bit 7 set for hard disk)
 +Return: CF set on error
 +     AH = status (07h) (see AH=01h)
 + CF clear if successful
 +     AH = 00h
 +     BL = drive type (AT/PS2 floppies only)
 +     01h 360K
 + 02h 1.2M
 + 03h 720K
 + 04h 1.44M
 + 06h ??? (checked by 386MAX v6.01)
 +     CH = low eight bits of maximum cylinder number
 +     CL = maximum sector number (bits 5-0)
 + high two bits of maximum cylinder number (bits 7-6)
 +     DH = maximum head number
 +     DL = number of drives
 +     ES:DI -> drive parameter table (floppies only)
 +Notes: may return successful even though specified drive is greater than the
 +   number of attached drives of that type (floppy/hard); check DL to
 +   ensure validity
 + for systems predating the IBM AT, this call is only valid for hard
 +   disks, as it is implemented by the hard disk BIOS rather than the
 +   ROM BIOS
 + Toshiba laptops with HardRAM return DL=02h when called with DL=80h,
 +   but fail on DL=81h.  The BIOS data at 40h:75h correctly reports 01h.
 +SeeAlso: AH=15h,INT 1E,INT 41
 +
 +==== INT 13 - HARD DISK - INITIALIZE CONTROLLER WITH DRIVE PARAMETERS (AT,PS) ====
 +
 + AH = 09h
 + DL = drive (80h for first, 81h for second)
 +Return: CF clear if successful
 + CF set on error
 + AH = status (see AH=01h)
 +Notes: on the PC and XT, this function uses the parameter table pointed at by
 +   INT 41
 + on the AT and later, this function uses the parameter table pointed at
 +   by INT 41 if DL=80h, and the parameter table pointed at by INT 46 if
 +   DL=81h
 +SeeAlso: INT 41,INT 46
 +
 +==== INT 13 - HARD DISK - READ LONG SECTOR(S) (AT and later) ====
 +
 + AH = 0Ah
 + AL = number of sectors
 + CH = low eight bits of cylinder number
 + CL = sector number (bits 5-0)
 +      high two bits of cylinder number (bits 7-6)
 + DH = head number
 + DL = drive number (80h = first, 81h = second)
 + ES:BX -> data buffer
 +Return: CF clear if successful
 + CF set on error
 + AH = status (see AH=01h)
 + AL = number of sectors transferred
 +Notes: this function reads in four to seven bytes of error-correcting code
 +   along with each sector's worth of information
 + data errors are not automatically corrected, and the read is aborted
 +   after the first sector with an ECC error
 + used for diagnostics only on PS/2 systems
 +SeeAlso: AH=02h,AH=0Bh
 +
 +==== INT 13 - HARD DISK - WRITE LONG SECTOR(S) (AT and later) ====
 +
 + AH = 0Bh
 + AL = number of sectors
 + CH = low eight bits of cylinder number
 + CL = sector number (bits 5-0)
 +      high two bits of cylinder number (bits 7-6)
 + DH = head number
 + DL = drive number (80h = first, 81h = second)
 + ES:BX -> data buffer
 +Return: CF clear if successful
 + CF set on error
 + AH = status (see AH=01h)
 + AL = number of sectors transferred
 +Notes: each sector's worth of data must be followed by four to seven bytes of
 +   error-correction information
 + used for diagnostics only on PS/2 systems
 +SeeAlso: AH=03h,AH=0Ah
 +
 +==== INT 13 - HARD DISK - SEEK TO CYLINDER ====
 +
 + AH = 0Ch
 + CH = low eight bits of cylinder number
 + CL = sector number (bits 5-0)
 +      high two bits of cylinder number (bits 7-6)
 + DH = head number
 + DL = drive number (80h = first, 81h = second hard disk)
 +Return: CF set on error
 + CF clear if successful
 + AH = status (see AH=01h)
 +SeeAlso: AH=00h,AH=02h,AH=0Ah
 +
 +==== INT 13 - HARD DISK - RESET HARD DISKS ====
 +
 + AH = 0Dh
 + DL = drive number (80h = first, 81h = second hard disk)
 +Return: CF set on error
 + CF clear if successful
 + AH = status (see AH=01h)
 +Notes: reinitializes the hard disk controller, resets the specified drive's
 +   parameters, and recalibrates the drive's heads (seek to track 0)
 + not for PS/2 ESDI drives
 +SeeAlso: AH=00h,INT 21/AH=0Dh
 +
 +==== INT 13 - HARD DISK - READ SECTOR BUFFER (XT only) ====
 +
 + AH = 0Eh
 + DL = drive number (80h = first, 81h = second hard disk)
 + ES:BX -> buffer
 +Return: CF set on error
 + CF clear if successful
 + AH = status code (see AH=01h)
 +Notes: transfers controller's sector buffer.  No data is read from the drive
 + used for diagnostics only on PS/2 systems
 +SeeAlso: AH=0Ah
 +
 +==== INT 13 - HARD DISK - WRITE SECTOR BUFFER (XT only) ====
 +
 + AH = 0Fh
 + DL = drive number (80h = first, 81h = second hard disk)
 + ES:BX -> buffer
 +Return: CF set on error
 + CF clear if successful
 + AH = status code (see AH=01h)
 +Notes: does not write data to the drive
 + should be called before formatting to initialize an XT-type
 +   controller's sector buffer
 + used for diagnostics only on PS/2 systems
 +SeeAlso: AH=0Bh
 +
 +==== INT 13 - HARD DISK - CHECK IF DRIVE READY ====
 +
 + AH = 10h
 + DL = drive number (80h = first, 81h = second hard disk)
 +Return: CF set on error
 + CF clear if successful
 + AH = status (see AH=01h)
 +
 +==== INT 13 - HARD DISK - RECALIBRATE DRIVE ====
 +
 + AH = 11h
 + DL = drive number (80h = first, 81h = second hard disk)
 +Return: CF set on error
 + CF clear if successful
 + AH = status (see AH=01h)
 +Note: causes hard disk controller to seek the specified drive to cylinder 0
 +SeeAlso: AH=00h,AH=0Ch,AH=19h"FIXED DISK"
 +
 +==== INT 13 - HARD DISK - CONTROLLER RAM DIAGNOSTIC (XT,PS) ====
 +
 + AH = 12h
 + DL = drive number (80h = first, 81h = second hard disk)
 +Return: CF set on error
 + CF clear if successful
 + AH = status code (see AH=01h)
 +SeeAlso: AH=13h,AH=14h
 +
 +==== INT 13 - Future Domain SCSI CONTROLLER - STOP SCSI DISK ====
 +
 + AH = 12h
 + DL = hard drive ID
 +Return: CF set on error
 + AH = status code (see AH=01h)
 +Notes: available at least on the TMC-870 8-bit SCSI controller BIOS v6.0A
 + if the given drive is a SCSI device, the SCSI Stop Unit command is sent
 +   and either "Disk prepared for shipping" or "Disk Stop command failed"
 +   is displayed
 +
 +==== INT 13 - HARD DISK - DRIVE DIAGNOSTIC (XT,PS) ====
 +
 + AH = 13h
 + DL = drive number (80h = first, 81h = second hard disk)
 +Return: CF set on error
 + CF clear if successful
 + AH = status code (see AH=01h)
 +SeeAlso: AH=12h,AH=14h
 +
 +==== INT 13 - HARD DISK - CONTROLLER INTERNAL DIAGNOSTIC ====
 +
 + AH = 14h
 +Return: CF set on error
 + CF clear if successful
 + AH = status code (see AH=01h)
 +SeeAlso: AH=12h,AH=13h
 +
 +==== INT 13 - DISK - GET DISK TYPE (XT 1/10/86 or later,XT286,AT,PS) ====
 +
 + AH = 15h
 + DL = drive number (bit 7 set for hard disk)
 +Return: CF clear if successful
 +     AH = type code
 + 00h no such drive
 + 01h floppy without change-line support
 + 02h floppy with change-line support
 + 03h hard disk
 +     CX:DX = number of 512-byte sectors
 + CF set on error
 +     AH = status (see AH=01h)
 +SeeAlso: AH=08h,AH=16h,AH=17h,AH=19h"SCSI"
 +
 +==== INT 13 - FLOPPY DISK - DETECT DISK CHANGE (XT 1/10/86 or later,XT286,AT,PS) ====
 +
 + AH = 16h
 + DL = drive number
 +Return: CF clear if change line inactive
 +     AH = 00h (disk not changed)
 + CF set if change line active
 +     AH = 06h change line active or not supported
 +        = 80h drive not ready or not present
 +Note: call AH=15h first to determine whether the drive supports a change
 +   line
 +SeeAlso: AH=15h
 +
 +==== INT 13 - FLOPPY DISK - SET DISK TYPE FOR FORMAT (AT,PS) ====
 +
 + AH = 17h
 + AL = format type
 +     01h = 320/360K disk in 360K drive
 +     02h = 320/360K disk in 1.2M drive
 +     03h = 1.2M disk in 1.2M drive
 +     04h = 720K disk in 720K drive
 + DL = drive number
 +Return: CF set on error
 + CF clear if successful
 + AH = status (see AH=01h)
 +Note: this function does not handle 1.44M drives; use AH=18h instead
 +SeeAlso: AH=15h,AH=18h
 +
 +==== INT 13 - DISK - SET MEDIA TYPE FOR FORMAT (AT model 3x9,XT2,XT286,PS) ====
 +
 + AH = 18h
 + DL = drive number
 + CH = lower 8 bits of highest cylinder number (number of cylinders - 1)
 + CL = sectors per track (bits 0-5)
 +      top 2 bits of highest cylinder number (bits 6,7)
 +Return: AH = status
 +     00h requested combination supported
 +     01h function not available
 +     0Ch not supported or drive type unknown
 +     80h there is no disk in the drive
 + ES:DI -> 11-byte parameter table
 +SeeAlso: AH=05h,AH=07h,AH=17h
 +
 +==== INT 13 - Future Domain SCSI BIOS - GET SCSI CONTROLLER INFORMATION ====
 +
 + AH = 18h
 + DL = hard drive ID
 +Return: CF set on error
 +     AH = status code (see AH=01h)
 + CF clear if successful
 +     AX = 4321h (magic number???)
 +     BH = number of SCSI drives connected
 +     BL = SCSI device number for specified drive
 +     CX = 040Ah (magic number???)
 +Note: also sets an internal flag (non-resettable) which prevents some
 +   controller messages from being displayed, allows writes to
 +   removable devices, and enables the INT 13 interface for more than
 +   one drive (i.e. DL >= 81h)
 +SeeAlso: AH=1Bh"SCSI"
 +
 +==== INT 13 - FIXED DISK - PARK HEADS (XT286,PS) ====
 +
 + AH = 19h
 + DL = drive
 +Return: CF set on error
 + AH = status (see AH=01h)
 +SeeAlso: AH=11h
 +
 +==== INT 13 - Future Domain SCSI CONTROLLER - REINITIALIZE DRIVE ====
 +
 + AH = 19h
 + DL = hard drive ID
 +Return: CF set on error
 +     AH = status code (see AH=01h)
 + CF clear if successful
 +     AH = disk type (03h = fixed disk)
 +     CX:DX = number of 512-byte sectors
 +Notes: sends SCSI Read Capacity command to get number of logical blocks and
 +   adjusts the result for 512-byte sectors
 + displays either "Error in Read Capacity Command" or "nnn Bytes per
 +   sector" (nnn=256 or 512, the only sizes supported in the translation
 +   code)
 + should probably be called when a removable device has its media changed
 + returns the same values as AH=15h
 +SeeAlso: AH=15h,AH=1Ah
 +
 +==== INT 13 - ESDI FIXED DISK - FORMAT UNIT (PS) ====
 +
 + AH = 1Ah
 + AL = defect table count
 + CL = format modifiers
 +     bit 4: generate periodic interrupt
 +     bit 3: perform surface analysis
 +     bit 2: update secondary defect map
 +     bit 1: ignore secondary defect map
 +     bit 0: ignore primary defect map
 + DL = drive
 + ES:BX -> defect table
 +Return: CF set on error
 + AH = status (see AH=01h)
 +Note: if periodic interrupt selected, INT 15/AH=0Fh is called after each
 +   cylinder is formatted
 +SeeAlso: AH=07h,INT 15/AH=0Fh
 +
 +==== INT 13 - Future Domain SCSI CONTROLLER - GET SCSI PARTIAL MEDIUM CAPACITY ====
 +
 + AH = 1Ah
 + CH = track (bits 8,9 in high bits of CL)
 + CL = sector (01h to number of sectors/track for drive)
 + DH = head
 + DL = hard drive ID
 +Return: CF set on error
 + AH = status code (see AH=01h)
 + CX:DX = logical block number of last quickly-accessible block after
 + given block
 +Note: sends SCSI Read Capacity command with the PMI bit set to obtain the
 +   logical block address of the last block after which a substantial
 +   delay in data transfer will be encountered (usually the last block
 +   on the current cylinder).  No translation to 512 byte sectors is
 +   performed on the result if data is stored on the disk in other than
 +   512 byte sectors.
 +SeeAlso: AH=15h,AH=19h"SCSI"
 +
 +==== INT 13 - ESDI FIXED DISK - GET MANUFACTURING HEADER ====
 +
 + AH = 1Bh
 + AL = number of record
 + DL = drive
 + ES:BX -> buffer for manufacturing header (defect list)
 +Return: CF set on error
 +     AH = status
 +Note: manufacturing header format (Defect Map Record format) can be found
 +   in IBM 70MB, 115MB Fixed Disk Drives Technical Reference
 +
 +==== INT 13 - Future Domain SCSI CONTROLLER - GET POINTER TO SCSI DISK INFO BLOCK ====
 +
 + AH = 1Bh
 + DL = hard drive ID
 +Return: CF set on error
 +     AH = status code (see AH=01h)
 + CF clear if successful
 +     ES:BX -> SCSI disk information block
 +Note: also sets a non-resettable flag which prevents some controller messages
 +   from being displayed
 +SeeAlso: AH=18h"SCSI",AH=1Ch"SCSI"
 +
 +Format of SCSI disk information block:
 +Offset Size Description
 + 00h BYTE drive physical information
 + bit 0: ???
 + bit 1: device uses parity
 + bit 2: 256 bytes per sector instead of 512
 + bit 3: don't have capacity yet???
 + bit 4: disk is removable
 + bit 5: logical unit number is not present
 + 01h WORD translated number of cylinders
 + 03h BYTE translated number of heads
 + 04h BYTE translated number of sectors per track (17, 34, or 63)
 + 05h BYTE drive address
 + bits 0-2: logical unit number
 + bits 3-5: device number
 + 06h BYTE 01h at initialization
 + 07h BYTE sense code byte 00h, or extended sense code byte 0Ch
 + 08h BYTE 00h
 + 09h BYTE 00h or extended sense code byte 02h (sense key)
 + 0Ah BYTE 00h
 + 0Bh 10 BYTEs copy of Command Descriptor Block (CDB)
 + 15h DWORD translated number of sectors on device
 +
 +==== INT 13 - Future Domain SCSI CONTROLLER - GET POINTER TO FREE CONTROLLER RAM ====
 +
 + AH = 1Ch
 + DL = hard drive ID (any valid SCSI hard disk)
 +Return: CF set on error
 +     AH = status code (see AH=01h)
 + CF clear if successful
 +     ES:BX -> first byte of free RAM on controller
 +Notes: the Future Domain TMC-870 contains 1024 bytes of RAM at offsets 1800h
 +   to 1BFFh on-bard the controller for storing drive information and
 +   controller status; ES:BX points to the first byte available for other
 +   uses
 + ES contains the segment at which the controller resides; the
 +   controller's two memory-mapped I/O ports are at offsets 1C00h, 1E00h
 +SeeAlso: AH=1Bh"SCSI"
 +
 +==== INT 13 - ESDI FIXED DISK - GET DEVICE CONFIGURATION ====
 +
 + AX = 1C0Ah
 + DL = drive
 + ES:BX -> buffer for device configuration (drive physical parameter)
 +Return: CF set on error
 +     AH = status
 +Note: device configuration format can be found in IBM ESDI Fixed Disk Drive
 +   Adapter/A Technical Reference
 +
 +==== INT 13 - ESDI FIXED DISK - GET ADAPTER CONFIGURATION ====
 +
 + AX = 1C0Bh
 + ES:BX -> buffer for adapter configuration
 +Return: CF set on error
 +     AH = status
 +SeeAlso: AX=1C0Ch
 +
 +==== INT 13 - ESDI FIXED DISK - GET POS INFORMATION ====
 +
 + AX = 1C0Ch
 + ES:BX -> POS information
 +Return: CF set on error
 +     AH = status
 +SeeAlso: AX=1C0Bh
 +
 +==== INT 13 - ESDI FIXED DISK - TRANSLATE RBA TO ABA ====
 +
 + AX = 1C0Eh
 + CH = low 8 bits of cylinder number
 + CL = sector number, high two bits of cylinder number in bits 6 and 7
 + DH = head number
 + DL = drive number
 + ES:BX -> ABA number
 +Return: CF set on error
 +     AH = status
 +Note: ABA (absolute block address) format can be found in IBM ESDI Adapter
 +   Technical Reference by using its Device Configuration Status Block
 +
 +==== INT 13 - IBMCACHE.SYS - CACHE STATUS ====
 +
 + AH = 1Dh
 + AL = subfunction
 +     01h get status record
 + DL = drive???
 + Return: ES:BX -> status record
 + CF set on error
 +     AH = error code
 +     02h set cache status
 + ES:BX -> status record
 + DL = drive???
 + Return: CF set on error
 +
 +Format of status record:
 +Offset Size Description
 + 00h DWORD total number of read requests
 + 04h DWORD total number of hits
 + 08h DWORD number of physical disk reads
 + 0Ch DWORD total number of sectors requested by physical disk reads
 + 10h  6 bytes ???
 + 16h DWORD pointer to start of error list
 + 1Ah DWORD pointer to end of error list
 + 1Eh WORD ???
 + 20h BYTE using extended memory if nonzero
 + 21h BYTE ???
 + 22h  4 BYTEs ASCII version number
 + 26h WORD cache size in K
 + 28h WORD sectors per page
 +
 +Format of error list:
 +Offset Size Description
 + 00h DWORD relative block address of bad page
 + 04h BYTE drive
 + 05h BYTE sector bit-map
 + 06h WORD next error
 +
 +==== INT 13 - DISK - ??? (Western Digital "Super BIOS") ====
 +
 + AH = 20h
 + ???
 +Return: ???
 +Note: seems to return some kind of status
 +
 +==== INT 13 - QCACHE - DISMOUNT ====
 +
 + AX = 20FFh
 +Return: ???
 +
 +==== INT 13 - QCACHE - FLUSH CACHE ====
 +
 + AH = 21h
 +Return: ???
 +SeeAlso: AH=25h,AH=2Eh
 +
 +==== INT 13 - QCACHE - ENABLE/DISABLE CACHE ====
 +
 + AH = 22h
 + AL = 00h disable cache
 +      01h enable cache
 +
 +==== INT 13 - QCACHE - SET SECTORS ====
 +
 + AH = 24h
 + BX = number of sectors
 +Return: ???
 +
 +==== INT 13 - QCACHE - SET FLUSH INTERVAL ====
 +
 + AH = 25h
 + BC = interval
 +Return: ???
 +SeeAlso: AH=21h,AH=2Eh
 +
 +==== INT 13 - QCACHE - INSTALLATION CHECK ====
 +
 + AH = 27h
 + BX = 0000h
 +Return: BX nonzero if installed
 +
 +==== INT 13 - QCACHE - SET BUFFER SIZE ====
 +
 + AH = 2Ah
 + AL = buffer size
 +Return: ???
 +
 +==== INT 13 - QCACHE - SET BUFFERED WRITES ====
 +
 + AH = 2Ch
 + AL = state
 +     00h disable
 +     01h enable
 +Return: ???
 +SeeAlso: AH=2Dh
 +
 +==== INT 13 - QCACHE - SET BUFFERED READ ====
 +
 + AH = 2Dh
 + AL = state
 +     00h disable
 +     01h enable
 +Return: ???
 +SeeAlso: AH=2Ch
 +
 +==== INT 13 - QCACHE - SET FLUSH COUNT ====
 +
 + AH = 2Eh
 + BX = flush count
 +Return: ???
 +SeeAlso: AH=21h,AH=25h
 +
 +==== INT 13 - QCACHE - GET INFO ====
 +
 + AH = 30h
 + AL = what to get
 +     00h system info
 +     01h drive info
 + DS:DX -> buffer for info
 +Return: ???
 +
 +==== INT 13 - Priam EDVR.SYS DISK PARTITIONING SOFTWARE??? ====
 +
 + AH = 70h
 + ???
 +Return: ???
 +Note: Priam's EDISK.EXE (FDISK replacement) and EFMT.EXE (low-level
 +   formatting program) make this call, presumably to EDVR.SYS (the
 +   partitioning driver)
 +SeeAlso: AH=ADh
 +
 +==== INT 13 - ??? ====
 +
 + AH = 75h
 + ???
 +Return: AH = ???
 + ???
 +Note: intercepted by PC-Cache (v5.1 only)
 +
 +==== INT 13 - ??? ====
 +
 + AH = 76h
 + ???
 +Return: AH = ???
 + ???
 +Note: intercepted by PC-Cache (v5.1 only)
 +
 +==== INT 13 - FAST! - API ====
 +
 + AH = 80h
 + CX = 6572h
 + DX = 1970h
 + ES:BX -> data structure (see below)
 + AL = function
 +     01h ???
 +     04h ???
 +     05h ???
 +     06h installation check
 + Return: AX = 1965h if installed
 +     07h ???
 +     09h ???
 +     0Ah ???
 +     0Bh ???
 +     0Ch set ??? flag
 +     0Dh clear ??? flag
 +Return: AH = 00h if successful (except function 06h)
 +
 +Format of data structure:
 +Offset Size Description
 + 00h DWORD pointer to 19-byte signature string 
 + 13h 07h 06h 08h 11h 18h 0Fh 0Eh 02h 18h 13h 08h 0Bh 08h 01h 00h
 +   04h 08h 15h  (v4.04)
 + 04h ??? ???
 +
 +==== INT 13 - Super PC Kwik/PC-Cache 5.x - ??? ====
 +
 + AH = 81h
 + SI = 4358h
 + ???
 +Return: ???
 +Note: PC Tools PC-Cache 5.x and Qualitas Qcache 4.00 are OEM versions of
 +   Super PC Kwik, and thus support this call
 + returns immediately in PC-Cache v5.x
 +
 +==== INT 13 - Super PC Kwik/PC-Cache 5.x - ??? ====
 +
 + AH = 82h
 + SI = 4358h
 + ???
 +Return: AL = ???
 +Note: PC Tools PC-Cache 5.x and Qualitas Qcache 4.00 are OEM versions of
 +   Super PC Kwik, and thus support this call
 +SeeAlso: AH=84h
 +
 +==== INT 13 - Super PC Kwik/PC-Cache 5.x - ??? ====
 +
 + AH = 83h
 + SI = 4358h
 + AL = ???
 + ES:BX -> ???
 + ???
 +Return: ???
 +Note: PC Tools PC-Cache 5.x and Qualitas Qcache 4.00 are OEM versions of
 +   Super PC Kwik, and thus support this call
 +SeeAlso: AH=85h
 +
 +==== INT 13 - Super PC Kwik/PC-Cache 5.x - ??? ====
 +
 + AH = 84h
 + SI = 4358h
 + AL = ???
 + ???
 +Return: AL = ???
 +Note: PC Tools PC-Cache 5.x and Qualitas Qcache 4.00 are OEM versions of
 +   Super PC Kwik, and thus support this call
 +SeeAlso: AH=82h
 +
 +==== INT 13 - Super PC Kwik/PC-Cache 5.x - ??? ====
 +
 + AH = 85h
 + SI = 4358h
 + AL = ???
 + DL = ???
 + ???
 +Return: ???
 +Note: PC Tools PC-Cache 5.x and Qualitas Qcache 4.00 are OEM versions of
 +   Super PC Kwik, and thus support this call
 +SeeAlso: AH=83h
 +
 +==== INT 13 - Qualitas Qcache v4.00 - ??? ====
 +
 + AH = 86h
 + SI = 4358h
 + ???
 +Return: ???
 +----------1387--SI4358-----------------------
 +INT 13 - Qualitas Qcache v4.00 - ???
 + AH = 87h
 + SI = 4358h
 + ???
 +Return: ???
 +----------1388--SI4358-----------------------
 +INT 13 - Qualitas Qcache v4.00 - ???
 + AH = 88h
 + SI = 4358h
 + ???
 +Return: ???
 +----------138EED-----------------------------
 +INT 13 - HyperDisk v4.01+ - ???
 + AX = 8EEDh
 + ???
 +Return: ???
 +Note: HyperDisk is a shareware disk cache by HyperWare (Roger Cross)
 +SeeAlso: AX=8EEEh,AX=8EEFh,AH=EEh,INT 2F/AH=DFh
 +----------138EEE-----------------------------
 +INT 13 - HyperDisk v4.01+ - ???
 + AX = 8EEEh
 +Return: CF set
 + AX = CS of HyperDisk resident code
 + ???
 +Note: identical to AX=8EEFh in HYPERDKX v4.21-4.30
 +SeeAlso: AX=8EEDh,AX=8EEFh,AH=EEh
 +----------138EEF-----------------------------
 +INT 13 - HyperDisk v4.01+ - ???
 + AX = 8EEFh
 +Return: CF set
 + AX = CS of HyperDisk resident code
 + ???
 +Note: identical to AX=8EEEh in HYPERDKX v4.21-4.30
 +SeeAlso: AX=8EEDh,AX=8EEEh,AH=EEh
 +----------13A0--SI4358-----------------------
 +INT 13 - Super PC Kwik - GET RESIDENT CODE SEGMENT
 + AH = A0h
 + SI = 4358h
 +Return: AX = segment of resident code
 +Note: PC Tools PC-Cache 5.x and Qualitas Qcache 4.00 are OEM versions of
 +   Super PC Kwik, and thus support this call
 +SeeAlso: INT 16/AX=FFA5h/CX=1111h
 +----------13A1--SI4358-----------------------
 +INT 13 - Super PC Kwik - FLUSH CACHE
 + AH = A1h
 + SI = 4358h
 +Note: PC Tools PC-Cache 5.x and Qualitas Qcache 4.00 are OEM versions of
 +   Super PC Kwik, and thus support this call
 +SeeAlso: INT 16/AX=FFA5h/CX=FFFFh
 +----------13A2--SI4358-----------------------
 +INT 13 - Super PC Kwik - ???
 + AH = A2h
 + SI = 4358h
 + ???
 +Return: ???
 +Note: PC Tools PC-Cache 5.x and Qualitas Qcache 4.00 are OEM versions of
 +   Super PC Kwik, and thus support this call
 +----------13A5-------------------------------
 +INT 13 - Super PC Kwik - ???
 + AH = A5h
 + SI = ???
 +Return: AX = ???
 + SI = ???
 +Notes: called when a program terminates but stays resident (see INT 21/AH=31h)
 + this call is not supported by Qualitas Qcache 4.00
 +----------13AA--SI4358-----------------------
 +INT 13 - Qualitas Qcache v4.00 - ???
 + AH = AAh
 + SI = 4358h
 + ???
 +Return: ???
 +----------13AB--SI4358-----------------------
 +INT 13 - Qualitas Qcache v4.00 - ???
 + AH = ABh
 + SI = 4358h
 + ???
 +Return: ???
 +----------13AC--SI4358-----------------------
 +INT 13 - Qualitas Qcache v4.00 - ???
 + AH = ACh
 + SI = 4358h
 + ???
 +Return: ???
 +----------13AD-------------------------------
 +INT 13 - Priam HARD DISK CONTROLLER???
 + AH = ADh
 + ???
 +Return: ???
 +Note: this call is made from Priam's EFMT.EXE (low-level formatter), probably
 +   to check the ROM type on the controller for their hard disk kits
 +SeeAlso: AH=70h
 +----------13AD--SI4358-----------------------
 +INT 13 - Qualitas Qcache v4.00 - ???
 + AH = ADh
 + SI = 4358h
 + ???
 +Return: ???
 +----------13B0--SI4358-----------------------
 +INT 13 - Super PC Kwik - ???
 + AH = B0h
 + SI = 4358h
 + ???
 +Return: ???
 +Note: PC Tools PC-Cache 5.x is an OEM version of Super PC Kwik, and thus
 +   supports this call; Qualitas Qcache does not support it
 +----------13EE-------------------------------
 +INT 13 - SWBIOS - SET 1024 CYLINDER FLAG
 + AH = EEh
 + DL = drive number (80h, 81h)
 +Return: CF clear
 +    AH = 00h
 +Notes: the following INT 13 call will interpret the cylinder number as 1024
 +   less than the desired cylinder
 + flag cleared by all INT 13 calls except AH=EEh
 + SWBIOS is a TSR by Ontrack Computer Systems; Disk Manager also supports
 +   these calls
 + also supported by HyperDisk v4.01+ and PC-Cache v5.5+, in order to allow
 +   caching of drives using SWBIOS to access more than 1024 cylinders
 +SeeAlso: AH=F9h,AH=FEh,INT 16/AX=FFA5h/CX=1111h,INT 2F/AH=DFh
 +----------13F9-------------------------------
 +INT 13 - SWBIOS - INSTALLATION CHECK
 + AH = F9h
 + DL = drive number (80h,81h)
 +Return: CF clear 
 +     DX = configuration word
 + bit 15 set if other SWBIOS extensions available
 + CF set on error
 +Note: SWBIOS is a TSR by Ontrack Computer Systems; Disk Manager also supports
 +   these calls
 +SeeAlso: AH=EEh
 +----------13FE-------------------------------
 +INT 13 - SWBIOS - GET EXTENDED CYLINDER COUNT
 + AH = FEh
 + DL = drive number (80h, 81h)
 +Return: CF clear
 + DX = number of cylinders beyond 1024 on drive
 +Notes: standard INT 13/AH=08h will return a cylinder count truncated to 1024
 + BIOS without this extension would return count modulo 1024
 + SWBIOS is a TSR by Ontrack Computer Systems; Disk Manager also supports
 +   these calls
 +SeeAlso: AH=EEh
 +
 +===== INT 14 =====
 +
 +==== INT 14 - SERIAL I/O- Digiboard DigiCHANNEL PC/X* Extender INT 14 (XAPCM232.SYS) ====
 +
 +Note: the installation check for this driver is to determine whether the
 +   "~DOSXAM~" character device exists
 +----------1400-------------------------------
 +INT 14 - SERIAL - INITIALIZE PORT
 + AH = 00h
 + AL = port parameters
 +     bits 7-5 data rate (110,150,300,600,1200,2400,4800,9600 bps)
 +     bits 4-3 parity (00 or 10 = none, 01 = odd, 11 = even)
 +     bit 2    stop bits (set = 2, clear = 1)
 +     bits 1-0 data bits (00 = 5, 01 = 6, 10 = 7, 11 = 8)
 + DX = port number (00h-03h) (04h-43h for Digiboard XAPCM232.SYS)
 +Return: AH = line status (see AH=03h)
 +     FFh if error on Digiboard XAPCM232.SYS
 + AL = modem status (see AH=03h)
 +Notes: default handler is at F000h:E739h in IBM PC and 100% compatible BIOSes
 + since the PCjr supports a maximum of 4800 bps, attempting to set 9600
 +   bps will result in 4800 bps
 +SeeAlso: AH=04h"SERIAL",AH=04h"MultiDOS",AH=05h"SERIAL",AH=81h"COMM-DRV"
 +SeeAlso: AH=82h"COURIERS",AH=8Ch
 +----------1400-------------------------------
 +INT 14 - FOSSIL (Fido/Opus/Seadog Standard Interface Level) - INITIALIZE
 + AH = 00h
 + AL = initializing parameters
 +     7 - 6 - 5    4 - 3     2   1 - 0
 +     -BAUD RATE-    PARITY   STOP   WORD
 +     BITS  LENGTH
 +     000 19200 bd   00 none  0: 1  00: 5
 +     001 38400 bd   01 odd   1: 2  01: 6
 +     010   300 bd   11 even   10: 7
 +     011   600 bd   11: 8
 +     100 1200 bd
 +     101 2400 bd
 +     110 4800 bd
 +     111 9600 bd (4800 on PCjr)
 + DX = port number (0-3 or FFh if only performing non-I/O setup)
 +Return: AH = RS-232 status code bits
 +     0: RDA - input data is available in buffer
 +     1: OVRN - data has been lost
 +     5: THRE - room is available in output buffer
 +     6: TSRE - output buffer empty
 + AL = modem status bits
 +     3: always 1
 +     7: DCD - carrier detect
 +SeeAlso: AH=05h"FOSSIL",AH=81h"COMM-DRV",AH=82h"COURIERS"
 +----------1400-------------------------------
 +INT 14 - MBBIOS - INITIALIZE PORT
 + AH = 00h
 + AL = port parameters
 +     bits 7-5 data rate
 +     (normally 110,150,300,600,1200,2400,4800,9600 bps;
 + 9600,14400,19200,28800,38400,57600,115200,330400 bps
 + if the high-speed option is set)
 +     bits 4-3 parity (00 or 10 = none, 01 = odd, 11 = even)
 +     bit 2    stop bits (set = 2, clear = 1)
 +     bits 1-0 data bits (00 = 5, 01 = 6, 10 = 7, 11 = 8)
 + DX = port number
 +Return: AH = line status (see AH=03h)
 + AL = modem status (see AH=03h)
 +Note: MBBIOS was written by H. Roy Engehausen
 +SeeAlso: AH=04h"MBBIOS",AH=05h"MBBIOS"
 +----------1401-------------------------------
 +INT 14 - SERIAL - WRITE CHARACTER TO PORT
 + AH = 01h
 + AL = character to write
 + DX = port number (00h-03h) (04h-43h for Digiboard XAPCM232.SYS)
 +Return: AH bit 7 clear if successful
 + AH bit 7 set on error
 + AH bits 6-0 = port status (see AH=03h)
 +SeeAlso: AH=02h,AH=0Bh"FOSSIL",AH=89h
 +----------1402-------------------------------
 +INT 14 - SERIAL - READ CHARACTER FROM PORT
 + AH = 02h
 + DX = port number (00h-03h (04h-43h for Digiboard XAPCM232.SYS))
 +Return: AH = line status (see AH=03h)
 + AL = received character if AH bit 7 clear
 +Note: will timeout if DSR is not asserted, even if function 03h returns
 +   data ready
 +SeeAlso: AH=01h,AH=02h"FOSSIL",AH=84h,AH=FCh
 +----------1402-------------------------------
 +INT 14 - FOSSIL - RECEIVE CHARACTER WITH WAIT
 + AH = 02h
 + DX = port number (0-3)
 +Return: AL = character received
 + AH = 00h
 +SeeAlso: AH=01h,AH=02h"SERIAL"
 +----------1403-------------------------------
 +INT 14 - SERIAL - GET PORT STATUS
 + AH = 03h
 + DX = port number (00h-03h) (04h-43h for Digiboard XAPCM232.SYS)
 +Return: AH = line status
 +     bit 7: timeout
 + 6: transmit shift register empty
 + 5: transmit holding register empty
 + 4: break detected
 + 3: framing error
 + 2: parity error
 + 1: overrun error
 + 0: receive data ready
 + AL = modem status
 +     bit 7: carrier detect
 + 6: ring indicator
 + 5: data set ready
 + 4: clear to send
 + 3: delta carrier detect
 + 2: trailing edge of ring indicator
 + 1: delta data set ready
 + 0: delta clear to send
 +SeeAlso: AH=00h,AH=07h"MultiDOS",AH=81h"COURIERS",AX=FD02h
 +----------1404-------------------------------
 +INT 14 - SERIAL I/O - EXTENDED INITIALIZE (CONVERTIBLE,PS)
 + AH = 04h
 + AL = break status
 +     00h if break
 +     01h if no break
 + BH = parity
 +     00h no parity
 +     01h odd parity
 +     02h even parity
 +     03h stick parity odd
 +     04h stick parity even
 + BL = number of stop bits
 +     00h one stop bit
 +     01h two stop bits (1.5 if 5 bit word length)
 + CH = word length
 +     00h 5 bits
 +     01h 6 bits
 +     02h 7 bits
 +     03h 8 bits
 + CL = bps rate
 +     00h 110
 +     01h 150
 +     02h 300
 +     03h 600
 +     04h 1200
 +     05h 2400
 +     06h 4800
 +     07h 9600
 +     08h 19200
 + DX = port number
 +Return: AX = port status code (see AH=00h)
 +SeeAlso: AH=00h,AH=1Eh
 +----------1404-------------------------------
 +INT 14 - FOSSIL - INITIALIZE DRIVER
 + AH = 04h
 + DX = port number
 + optionally BX=4F50h
 +    ES:CX -> byte to be set upon ^C
 +Return: AX = 1954h (if successful)
 + BL = maximum function number supported (excluding 7Eh and above)
 + BH = revision of FOSSIL supported
 + DTR is raised
 +Note: the word at offset 6 in the interrupt handler contains 1954h, and the
 +   following byte contains the maximum function number supported
 +SeeAlso: AH=05h"FOSSIL",AH=1Ch
 +----------1404-------------------------------
 +INT 14 - MultiDOS Plus IODRV - INITIALIZE PORT
 + AH = 04h
 +Return: port initialized; if Hayes-compatible modem, a connection has been
 +   established
 +Note: the port number is stored at offset BEh in the Task Control Block
 +   (see INT 15/AH=13h"MultiDOS")
 +SeeAlso: AH=00h,AH=05h"MultiDOS",AH=20h"MultiDOS",INT 15/AH=13h"MultiDOS"
 +----------1404-------------------------------
 +INT 14 - Digiboard DigiCHANNEL PC/X* - CHANGE BAUD RATE
 + AH = 04h
 + AL = initializing parameters
 +     bits 7-5 unused
 +     bits 4,3: parity (00 none, 01 odd, 11 even)
 +     bit 2: stop bits (0 = one, 1 = two)
 +     bits 1,0: data bits (00 = five, 01 = six, 10 = seven, 11 = eight)
 + BX = baud rate
 + DX = port number (00h-03h) (04h-43h for XAPCM232.SYS)
 +Return: AH = status
 +     00h successful
 +     FFh error
 +SeeAlso: AH=05h"Digiboard"
 +----------1404-------------------------------
 +INT 14 - MBBIOS - INQUIRY
 + AH = 04h
 +Return: AH = AAh
 + AL = 55h
 +SeeAlso: AH=00h"MBBIOS",AH=09h"MBBIOS"
 +----------1405-------------------------------
 +INT 14 - SERIAL I/O - EXTENDED COMMUNICATION PORT CONTROL (CONVERTIBLE,PS)
 + AH = 05h
 + AL = 00h read modem control register
 +       Return: BL = modem control register (see below)
 +       AH = status
 + AL = 01h write modem control register
 +       BL = modem control register
 +   bit 0: data terminal ready
 +   bit 1: request to send
 +   bit 2: OUT1
 +   bit 3: OUT2
 +   bit 4: LOOP
 +   bits 5-7 reserved
 +       Return: AX = status
 + DX = port number
 +SeeAlso: AH=00h,AH=1Fh
 +----------1405-------------------------------
 +INT 14 - FOSSIL - DEINITIALIZE DRIVER
 + AH = 05h
 + DX = port number
 +Return: none
 + DTR is not affected
 +SeeAlso: AH=00h,AH=04h"FOSSIL",AH=1Dh,AH=8Dh
 +----------1405-------------------------------
 +INT 14 - MultiDOS Plus IODRV - READ CHARACTER FROM PORT
 + AH = 05h
 + AL = timeout in seconds (00h = never)
 +Return: AL = status
 +     00h successful
 + AH = character read
 +     01h read error
 +     02h timed out
 +     other modem status (CTS, DSR) changed
 +Note: the port number is stored at offset BEh in the Task Control Block
 +SeeAlso: AH=02h,AH=04h"MultiDOS",AH=06h"MultiDOS",AH=22h"MultiDOS"
 +SeeAlso: INT 15/AH=13h"MultiDOS"
 +----------1405-------------------------------
 +INT 14 - Digiboard DigiCHANNEL PC/X* - CHANGE PROTOCOL
 + AH = 05h
 + AL = protocol
 +     bits 7-4 unused
 +     bit 3: RTS/CTS
 +     bit 2: DSR
 +     bits 1,0: XON/XOFF
 + BH = new XOFF character (00h = current)
 + BL = new XON character (00h = current)
 + DX = port number (00h-03h) (04h-43h for XAPCM232.SYS)
 +Return: AH = status
 +     00h successful
 +     FFh error
 +SeeAlso: AH=04h"Digiboard"
 +----------1405-------------------------------
 +INT 14 - MBBIOS - DROP DTR AND RTS
 + AH = 05h
 + DX = port number
 +Return: none
 +SeeAlso: AH=00h"MBBIOS",AH=06h"MBBIOS",AH=06h"FOSSIL"
 +----------1406-------------------------------
 +INT 14 - FOSSIL - RAISE/LOWER DTR
 + AH = 06h
 + DX = port
 + AL = DTR state to be set
 +     00h = lower
 +     01h = raise
 +SeeAlso: AH=05h"MBBIOS",AH=1Ah
 +----------1406-------------------------------
 +INT 14 - MultiDOS Plus IODRV - WRITE CHARACTER TO PORT
 + AH = 06h
 + AL = character
 +Return: AL = status
 +     00h successful
 +Notes: the port number is stored at offset BEh in the Task Control Block
 + if output queue is full, the calling task is blocked until the
 +   character can be stored
 +SeeAlso: AH=01h,AH=04h"MultiDOS",AH=05h"MultiDOS",AH=21h"MultiDOS"
 +SeeAlso: INT 15/AH=13h"MultiDOS"
 +----------1406-------------------------------
 +INT 14 - MBBIOS - RAISE DTR AND RTS
 + AH = 06h
 + DX = port number
 +Return: none
 +SeeAlso: AH=05h"MBBIOS",AH=07h"MBBIOS"
 +----------1407-------------------------------
 +INT 14 - FOSSIL - RETURN TIMER TICK PARAMETERS
 + AH = 07h
 +Return: AL = timer tick interrupt number
 + AH = ticks per second on interrupt number in AL
 + DX = approximate number of milliseconds per tick
 +SeeAlso: AH=16h
 +----------1407-------------------------------
 +INT 14 - MultiDOS Plus IODRV - GET PORT STATUS
 + AH = 07h
 +Return: CL = modem status (see AH=03h)
 + CH = character at head of input queue (if any)
 + DX = number of characters in input queue
 +Note: the port number is stored at offset BEh in the Task Control Block
 +SeeAlso: AH=03h,AH=05h"MultiDOS",AH=08h"MultiDOS",AH=09h"MultiDOS"
 +SeeAlso: AH=23h"MultiDOS",INT 15/AH=13h"MultiDOS"
 +----------1407-------------------------------
 +INT 14 - MBBIOS - SEND BREAK
 + AH = 07h
 + DX = port number
 +Return: none
 +SeeAlso: AH=06h"MBBIOS"
 +----------1408-------------------------------
 +INT 14 - FOSSIL - FLUSH OUTPUT BUFFER WAITING TILL ALL OUTPUT IS DONE
 + AH = 08h
 + DX = port number
 +SeeAlso: AH=09h"FOSSIL"
 +----------1408-------------------------------
 +INT 14 - MultiDOS Plus 4.0 IODRV - GET AND RESET PORT LINE STATUS
 + AH = 08h
 +Return: AL = line status (see AH=03h)
 + AH destroyed
 +Notes: the port number is stored at offset BEh in the Task Control Block
 + on every line status change, the line status is ORed with the line
 +   status accumulator; this function returns the accumulator and clears
 +   it
 +SeeAlso: AH=03h,AH=04h"MultiDOS",AH=07h"MultiDOS",INT 15/AH=13h"MultiDOS"
 +----------1408-------------------------------
 +INT 14 - Digiboard DigiCHANNEL PC/X* - ALTERNATE STATUS CHECK
 + AH = 08h
 + DX = port number (00h-03h) (04h-43h for XAPCM232.SYS)
 +Return: AH = RS232 status bits (see AH=03h)
 + ZF set if no characters queued
 + ZF clear if character available
 +     AL = next character
 +SeeAlso: AH=03h,AH=09h"Digiboard"
 +----------1408-------------------------------
 +INT 14 - MBBIOS - NON-DESTRUCTIVE READ
 + AH = 08h
 + DX = port number
 +Return: AL = character
 + AH = status (see AH=02h)
 +SeeAlso: AH=0Bh"MBBIOS",AH=0Ch"FOSSIL"
 +----------1409-------------------------------
 +INT 14 - FOSSIL - PURGE OUTPUT BUFFER THROWING AWAY ALL PENDING OUTPUT
 + AH = 09h
 + DX = port number
 +SeeAlso: AH=08h"FOSSIL",AH=0Ah"FOSSIL",AH=88h
 +----------1409-------------------------------
 +INT 14 - MultiDOS Plus IODRV - RESET PORT STATUS
 + AH = 09h
 +Return: modem status byte cleared
 +Note: the port number is stored at offset BEh in the Task Control Block
 +SeeAlso: AH=04h"MultiDOS",AH=07h"MultiDOS",INT 15/AH=13h"MultiDOS"
 +----------1409-------------------------------
 +INT 14 - Digiboard DigiCHANNEL PC/X* - CLEAR BUFFERS
 + AH = 09h
 + DX = port number (00h-03h) (04h-43h for XAPCM232.SYS)
 +Return: AH = status
 +     00h successful
 +     FFh error
 +SeeAlso: AH=08h"Digiboard",AH=0Ah"Digiboard",AH=10h"Digiboard"
 +----------1409-------------------------------
 +INT 14 - MBBIOS - GET/SET OPTIONS
 + AH = 09h
 + AL = option byte
 + 00000001b - Transmit Buffering Enabled
 + 00000101b - Hardware Handshaking Enabled
 + 00100000b - High Speed Option Enabled
 + DX = port number???
 +Return: AL = old option byte
 +SeeAlso: AH=04h"MBBIOS",AH=10h"FOSSIL"
 +----------140A-------------------------------
 +INT 14 - FOSSIL - PURGE INPUT BUFFER THROWING AWAY ALL PENDING INPUT
 + AH = 0Ah
 + DX = port number
 +SeeAlso: AH=09h"FOSSIL",AH=85h
 +----------140A-------------------------------
 +INT 14 - Digiboard DigiCHANNEL PC/X* - INPUT QUEUE CHECK
 + AH = 0Ah
 + DX = port number (00h-03h) (04h-43h for XAPCM232.SYS)
 +Return: AX = number of characters available in buffer
 +SeeAlso: AH=09h"Digiboard",AH=0Dh"Digiboard"
 +----------140A-------------------------------
 +INT 14 - MBBIOS - WRITE BUFFER
 + AH = 0Ah
 + CX = count
 + ES:DI -> buffer
 +Return: AX = status (see AH=03h)
 + DI = is updated
 + CX = unsent character count
 +SeeAlso: AH=0Bh"MBBIOS",AH=19h"FOSSIL"
 +----------140B-------------------------------
 +INT 14 - FOSSIL - TRANSMIT NO WAIT
 + AH = 0Bh
 + AL = character
 + DX = port number
 +Return: AX = 0000h character not accepted
 +    = 0001h character accepted
 +SeeAlso: AH=01h
 +----------140B-------------------------------
 +INT 14 - MBBIOS - READ BUFFER
 + AH = 0Bh
 + CX = size of buffer
 + ES:DI -> buffer
 +Return: AH = LSR
 + AL = MSR
 + CX = count of characters
 + DI = is updated
 +SeeAlso: AH=08h"MBBIOS",AH=0Ah"MBBIOS",AH=18h"FOSSIL"
 +----------140C-------------------------------
 +INT 14 - FOSSIL - NON-DESTRUCTIVE READ AHEAD
 + AH = 0Ch
 + DX = port number
 +Return: AX = FFFFh character not available
 + AX = 00xxh character xx available
 +SeeAlso: AH=08h"MBBIOS",AH=20h"FOSSIL"
 +----------140D-------------------------------
 +INT 14 - FOSSIL - KEYBOARD READ WITHOUT WAIT
 + AH = 0Dh
 +Return: AX = FFFFh character not available
 +    = xxyyh standard IBM-style scan code
 +SeeAlso: AH=0Eh
 +----------140D-------------------------------
 +INT 14 - Digiboard DigiCHANNEL PC/X* - GET POINTER TO CH_KEY_RDY FLAG
 + AH = 0Dh
 + DX = port number (00h-03h) (04h-43h for XAPCM232.SYS)
 +Return: ES:BX -> CH_KEY_RDY flag
 +SeeAlso: AH=0Ah"Digiboard"
 +
 +Values for CH_KEY_RDY flag:
 + 00h receive buffer empty
 + FFh characters available
 +----------140E-------------------------------
 +INT 14 - FOSSIL - KEYBOARD READ WITH WAIT
 + AH = 0Eh
 +Return: AX = xxyyh standard IBM-style scan code
 +SeeAlso: AH=0Dh"FOSSIL"
 +----------140E-------------------------------
 +INT 14 - Digiboard DigiCHANNEL PC/X* - WRITE STRING
 + AH = 0EH
 + CX = number of characters to write
 + ES:BX -> string
 + DX = port number (00h-03h) (04h-43h for XAPCM232.SYS)
 +Return: AX = number of characters actually written
 + ZF clear if successful
 + ZF set on error
 +SeeAlso: AH=0Fh"Digiboard"
 +----------140F-------------------------------
 +INT 14 - FOSSIL - ENABLE/DISABLE FLOW CONTROL
 + AH = 0Fh
 + AL = bit mask describing flow control requested
 +     0: xon/xoff on transmit (watch for xoff while sending)
 +     1: CTS/RTS (CTS on transmit/RTS on receive)
 +     2: reserved
 +     3: xon/xoff on receive (send xoff when buffer near full)
 +     4-7: all 1
 + DX = port number
 +SeeAlso: AH=09h"MBBIOS",AH=10h"FOSSIL"
 +----------140F-------------------------------
 +INT 14 - Digiboard DigiCHANNEL PC/X* - READ STRING
 + AH = 0Fh
 + CX = number of characters to read
 + ES:BX -> buffer
 + DX = port number (00h-03h) (04h-43h for XAPCM232.SYS)
 +Return: AX = number of characters read
 + ZF clear if successful
 + ZF set on error (line status or wrong number of characters)
 +SeeAlso: AH=0Eh"Digiboard"
 +----------1410-------------------------------
 +INT 14 - FOSSIL - EXTENDED ^C/^K CHECKING AND TRANSMIT ON/OFF
 + AH = 10h
 + AL = bit mask
 +     0: enable/disable ^C/^K checking
 +     1: enable/disable the transmitter
 + DX = port number
 +SeeAlso: AH=0Fh"FOSSIL"
 +----------1410-------------------------------
 +INT 14 - Digiboard DigiCHANNEL PC/X* - CLEAR RECEIVE BUFFER
 + AH = 10h
 + DX = port number (00h-03h) (04h-43h for XAPCM232.SYS)
 +Return: AH = status
 +     00h successful
 +     FFh error
 +SeeAlso: AH=09h"Digiboard",AH=11h"Digiboard"
 +----------1411-------------------------------
 +INT 14 - FOSSIL - SET CURRENT CURSOR LOCATION
 + AH = 11h
 + DH = row
 + DL = column
 +Note: this is the same as INT 10/AH=02h
 +SeeAlso: AH=12h"FOSSIL"
 +----------1411-------------------------------
 +INT 14 - Digiboard DigiCHANNEL PC/X* - CLEAR TRANSMIT BUFFER
 + AH = 11h
 + DX = port number (00h-03h) (04h-43h for XAPCM232.SYS)
 +Return: AH = status
 +     00h successful
 +     FFh error
 +SeeAlso: AH=09h"Digiboard",AH=10h"Digiboard"
 +----------1412-------------------------------
 +INT 14 - FOSSIL - READ CURRENT CURSOR LOCATION
 + AH = 12h
 +Return: DH = row
 + DL = column
 +Note: this is the same as INT 10/AH=03h
 +SeeAlso: AH=11h"FOSSIL"
 +----------1412-------------------------------
 +INT 14 - Digiboard DigiCHANNEL PC/X* - GET TRANSMIT BUFFER FREE SPACE
 + AH = 12h
 + DX = port number (00h-03h) (04h-43h for XAPCM232.SYS)
 +Return: AX = number of bytes free
 +SeeAlso: AH=0Ah"Digiboard"
 +----------1413-------------------------------
 +INT 14 - FOSSIL - SINGLE CHARACTER ANSI WRITE TO SCREEN
 + AH = 13h
 + AL = character
 +Note: should not be called if it is unsafe to call DOS
 +SeeAlso: AH=15h
 +----------1414-------------------------------
 +INT 14 - FOSSIL - ENABLE OR DISABLE WATCHDOG PROCESSING
 + AH = 14h
 + AL = 01h enable watchdog
 +      00h disable watchdog
 + DX = port number
 +----------1415-------------------------------
 +INT 14 - FOSSIL - WRITE CHARACTER TO SCREEN USING BIOS SUPPORT ROUTINES
 + AH = 15h
 + AL = character
 +SeeAlso: AH=13h
 +----------1416-------------------------------
 +INT 14 - FOSSIL - INSERT/DELETE FUNCTION FROM TIMER TICK CHAIN
 + AH = 16h
 + AL = function
 +     00h = delete
 +     01h = add
 + ES:DX -> routine to call
 +Return: AX = status
 +     0000h successful
 +     0001h unsuccessful
 +SeeAlso: AH=07h"FOSSIL"
 +----------1416-------------------------------
 +INT 14 - Digiboard DigiCHANNEL PC/X* - CCB COMMAND
 + AH = 16h
 + AL = CCB command number (see below)
 + BL = byte 2
 + BH = byte 3
 + CL = byte 1 (for all channel functions except 4Eh and 4Fh)
 + DX = port number (00h-03h) (04h-43h for XAPCM232.SYS)
 +Return: AH = status
 +     00h successful
 +     FFh error
 +SeeAlso: AH=18h"Digiboard"
 +
 +Values for CCB command number:
 + 40h Set Receive Mid Water Mark
 + 41h Set Receive High Water Mark
 + 42h Flush Receive Buffer
 + 43h Flush Transmit Buffer
 + 44h Transmit Pause
 + 45h Transmit Resume
 + 46h Set Interrupt to Host Mask
 + 47h Set Baud, Data, Stop and Parity
 + 48h Send Break
 + 49h Set Modem Lines
 + 4Ah Set Break Count
 + 4Bh Set Handshake
 + 4Ch Set Xon/Xoff Characters
 + 4Dh Set Transmit Mid Water Mark
 + 4Eh IRQ Polling Timer to Host
 + 4Fh Buffer Set All
 + 50h Port On
 + 51h Port Off
 + 52h Receive Pause
 + 53h Special Character Interrupt
 + 54h RS-422 Enable
 +----------1417-------------------------------
 +INT 14 - FOSSIL - REBOOT SYSTEM
 + AH = 17h
 + AL = method
 +     00h = cold boot
 +     01h = warm boot
 +SeeAlso: INT 19
 +----------1418-------------------------------
 +INT 14 - FOSSIL - READ BLOCK
 + AH = 18h
 + CX = maximum number of characters to transfer
 + DX = port number
 + ES:DI -> user buffer
 +Return: AX = number of characters transferred
 +SeeAlso: AH=19h"FOSSIL",AH=83h"COURIERS",AX=FF02h,INT 6B/AX=0100h
 +----------1418-------------------------------
 +INT 14 - Digiboard DigiCHANNEL PC/X* - SEND BIOS COMMAND
 + AH = 18h
 + ES:BX -> 16-byte command string
 + DX = port number (00h-03h) (04h-43h for XAPCM232.SYS)
 +Return: AH = status
 +     00h successful
 +     80h timeout
 + AL = mailbox status
 +     00h no errors
 +     8Xh BIOS error
 + ES:BX buffer filled in with mailbox string
 + ZF clear if no errors
 + ZF set if either status byte contains an error code
 +SeeAlso: AH=16h"Digiboard"
 +----------1419-------------------------------
 +INT 14 - FOSSIL - WRITE BLOCK
 + AH = 19h
 + CX = maximum number of characters to transfer
 + DX = port number
 + ES:DI -> user buffer
 +Return: AX = number of characters transferred
 +SeeAlso: AH=18h"FOSSIL",AH=86h,INT 6B/AX=0000h
 +----------1419-------------------------------
 +INT 14 - Digiboard DigiCHANNEL PC/X* - SPECIAL CHARACTER INTERRUPT
 + AH = 19h
 + BL = flag
 +     00h disable special character interrupt
 +     FFh enable interrupt
 + DX = port number (00h-03h) (04h-43h for XAPCM232.SYS)
 +Return: AH = status
 +     00h successful
 +     FFh failed
 +SeeAlso: AH=1Ah"Digiboard"
 +----------141A-------------------------------
 +INT 14 - FOSSIL - BREAK BEGIN OR END
 + AH = 1Ah
 + AL = 00h stop sending 'break'
 +      01h start sending 'break'
 + DX = port number
 +SeeAlso: AH=06h"FOSSIL",AH=8Ah,AH=FAh
 +----------141A-------------------------------
 +INT 14 - Digiboard DigiCHANNEL PC/X - SPECIAL CHARACTER FLAG/COUNTER
 + AH = 1Ah
 + BX = subfunction
 +     00h return pointer to special character flag byte
 +     01h return pointer to special character counter word
 + DX = port number (00h-03h) (04h-43h for XAPCM232.SYS)
 +Return: ES:BX -> special character flag or counter
 +Notes: flag is FFh if one or more special characters are in the receive
 +   buffer; it is 00h and the counter is invalid if no special characters
 +   are in the receive buffer
 + counter (if valid) contains the number of characters in the receive
 +   buffer up to and including the last-received special character
 +----------141B-------------------------------
 +INT 14 - FOSSIL - RETURN INFORMATION ABOUT THE DRIVER
 + AH = 1Bh
 + DX = port number
 + CX = size of user buffer
 + ES:DI -> user buffer for driver info (see below)
 +Return: AX = number of characters transferred
 + CX = 3058h ("0X") (X00 FOSSIL only)
 + DX = 2030h (" 0") (X00 FOSSIL only)
 +
 +Format of driver info:
 +Offset Size Description
 + 00h WORD size of structure in bytes
 + 02h BYTE FOSSIL spec driver conforms to
 + 03h BYTE revision level of this specific driver
 + 04h DWORD pointer to ASCIZ identification string
 + 08h WORD size of the input buffer
 + 0Ah WORD number of bytes left in buffer
 + 0Ch WORD size of the output buffer
 + 0Eh WORD number of bytes left in buffer
 + 10h BYTE width of screen
 + 11h BYTE length of screen
 + 12h BYTE actual baud rate, computer to modem
 +----------141C-------------------------------
 +INT 14 - X00 FOSSIL - ACTIVATE PORT
 + AH = 1Ch
 + DX = port number
 +Return: AX = 1954h if successful
 + BL = maximum function number supported (not including 7Eh and above)
 + BH = revision of FOSSIL specification supported
 +Note: this is a duplicate of AH=04h, so that AH=04h may be made compatible
 +   with the PS/2 BIOS in a future release
 +SeeAlso: AH=04h"FOSSIL",AH=1Dh
 +----------141D-------------------------------
 +INT 14 - X00 FOSSIL - DEACTIVATE PORT
 + AH = 1Dh
 + DX = port number
 +Return: none
 +Notes: this is a duplicate of AH=05h, so that AH=05h may be made compatible
 +   with the PS/2 BIOS in a future release
 + ignored if the port was never activated with AH=04h or AH=1Ch
 +SeeAlso: AH=05h"FOSSIL",AH=1Ch
 +----------141E-------------------------------
 +INT 14 - X00 FOSSIL - EXTENDED LINE CONTROL INITIALIZATION
 + AH = 1Eh
 + AL = break status
 +     00h if break
 +     01h if no break
 + BH = parity
 +     00h no parity
 +     01h odd parity
 +     02h even parity
 +     03h stick parity odd
 +     04h stick parity even
 + BL = number of stop bits
 +     00h one stop bit
 +     01h two stop bits (1.5 if 5 bit word length)
 + CH = word length
 +     00h 5 bits
 +     01h 6 bits
 +     02h 7 bits
 +     03h 8 bits
 + CL = bps rate
 +     00h 110
 +     01h 150
 +     02h 300
 +     03h 600
 +     04h 1200
 +     05h 2400
 +     06h 4800
 +     07h 9600
 +     08h 19200
 + DX = port number
 +Return: AX = port status code (see AH=00h)
 +Notes: this function is intended to exactly emulate the PS/2 BIOS AH=04h call
 + if the port was locked at X00 load time, the appropriate parameters are
 +   ignored
 +SeeAlso: AH=00h,AH=04h"SERIAL I/O"
 +----------141F-------------------------------
 +INT 14 - X00 FOSSIL - EXTENDED SERIAL PORT STATUS/CONTROL
 + AH = 1Fh
 + AL = 00h read modem control register
 +       Return: BL = modem control register (see below)
 +       AH = status
 + AL = 01h write modem control register
 +       BL = modem control register
 +   bit 0: data terminal ready
 +   bit 1: request to send
 +   bit 2: OUT1
 +   bit 3: OUT2 (interrupts) enabled
 +   bit 4: LOOP
 +   bits 5-7 reserved
 +       Return: AX = status
 + DX = port number
 +SeeAlso: AH=00h,AH=05h"SERIAL I/O"
 +Notes: this function is intended to exactly emulate the PS/2 BIOS AH=05h call
 + X00 forces BL bit 3 set (interrupts cannot be disabled)
 +----------1420-------------------------------
 +INT 14 - X00 FOSSIL - DESTRUCTIVE READ WITH NO WAIT
 + AH = 20h
 + DX = port number
 +Return: AH = 00h if character was available
 +     AL = next character (removed from receive buffer)
 + AX = FFFFh if no character available
 +SeeAlso: AH=0Ch,AH=21h"X00"
 +----------1420-------------------------------
 +INT 14 - Alloy MW386 - ATTACH LOGICAL COMMUNICATIONS PORT TO PHYSICAL PORT
 + AH = 20h
 + AL = logical port (01h COM1, 02h COM2)
 + DX = physical port number
 +Return: AX = status
 +     0000h successful
 +     FFFFh failed
 +SeeAlso: AH=21h"Alloy",AH=22h"Alloy",AH=23h"Alloy",INT 17/AH=8Bh"Alloy"
 +----------1420-------------------------------
 +INT 14 - MultiDOS Plus - INITIALIZE PORT
 + AH = 20h
 + AL = port parameters (see AH=00h"SERIAL")
 + DX = port number (0-3)
 +Return: AH = status
 +     00h successful
 +     41h no such port
 +     64h monitor mode already active
 +SeeAlso: AH=00h"SERIAL",AH=04h"MultiDOS",AH=21h"MultiDOS",AH=23h"MultiDOS"
 +----------1421-------------------------------
 +INT 14 - X00 FOSSIL - STUFF RECEIVE BUFFER
 + AH = 21h
 + AL = character
 + DX = port number
 +Notes: the given character is inserted at the end of the receive buffer as if
 +   it had just arrived from the serial port; all normal receive
 +   processing (XON/XOFF, ^C/^K) is performed on the character
 + fully re-entrant
 +SeeAlso: AH=20h"X00"
 +----------1421-------------------------------
 +INT 14 - Alloy MW386 v1.x only - RELEASE PHYSICAL COMMUNICATIONS PORT
 + AH = 21h
 + DX = physical port number
 +Return: AX = status
 +     0000h successful
 +     FFFFh failed
 +SeeAlso: AH=20h"Alloy",AH=22h"Alloy"
 +----------1421-------------------------------
 +INT 14 - MultiDOS Plus - TRANSMIT CHARACTER
 + AH = 21h
 + AL = character to send
 + DX = port number
 +Return: AH = status
 +     00h successful
 +     39h no DSR or CTS
 +     3Ch no DSR
 +     3Bh no CTS
 +     41h no such port
 +     42h monitor mode not active
 +     97h timed out
 +Note: monitor mode must have been turned on with AH=24h before calling
 +SeeAlso: AH=20h"MultiDOS",AH=22h"MultiDOS",AH=24h"MultiDOS"
 +----------1422-------------------------------
 +INT 14 - Alloy MW386 v2+ - RELEASE LOGICAL COMMUNICATIONS PORT
 + AH = 22h
 + AL = logical port (01h COM1, 02h COM2)
 +Return: AX = status (0000h successful)
 +SeeAlso: AH=20h"Alloy",AH=21h"Alloy"
 +----------1422-------------------------------
 +INT 14 - MultiDOS Plus - RECEIVE CHARACTER
 + AH = 22h
 + DX = port number
 +Return: AH = status (see also AH=21h"MultiDOS")
 +     00h successful
 + AL = character
 +     3Dh framing and parity error
 +     3Eh overrun error
 +     3Fh framing error
 +     40h parity error
 +     96h ring buffer overflow
 +Note: if no character is available, this function waits until a character
 +   arrives or an implementation-dependent timeout elapses
 +SeeAlso: AH=20h"MultiDOS",AH=21h"MultiDOS",AH=27h
 +----------1423-------------------------------
 +INT 14 - Alloy MW386 v2+ - GET PORT NUMBER FROM LOGICAL PORT ID
 + AH = 23h
 + AL = logical port (01h COM1, 02h COM2)
 + DH = user ID
 + DL = process ID (DH,DL both FFh for current task)
 +Return: AL = MW386 port mode
 +     bit 0: port is shared (spooler only)
 + 1: port is spooled instead of direct (spooler only)
 + 2: port is assigned as logical COM device, not in spooler
 + 3: port is free
 + CX = MW386 port number
 + DH = owner's user ID
 + DL = owner's task ID
 +SeeAlso: AH=20h"Alloy",INT 17/AH=8Bh"Alloy"
 +----------1423-------------------------------
 +INT 14 - MultiDOS Plus - GET PORT STATUS
 + AH = 23h
 + DX = port number
 +Return: AH = line status (see AH=03h)
 + AL = modem status (see AH=03h)
 +SeeAlso: AH=03h,AH=07h"MultiDOS",AH=20h"MultiDOS"
 +----------1424-------------------------------
 +INT 14 - Alloy MW386 v2+ - CHANGE PHYSICAL PORT PARAMETERS
 + AH = 24h
 + CX = physical I/O port number
 + DS:DX -> configuration table (see below)
 +Return: AH = 00h
 +Note: invalid port numbers are merely ignored
 +SeeAlso: INT 17/AH=96h
 +
 +Format of configuration table:
 +Offset Size Description
 + 00h BYTE baud rate
 + 00h 38400
 + 01h 19200
 + 02h  9600
 + 03h  7200
 + 04h  4800
 + 05h  3600
 + 06h  2400
 + 07h  2000
 + 08h  1200
 + 09h   600
 + 0Ah   300
 + 0Bh   150
 + 0Ch   134.5
 + 01h BYTE data bits (00h=5, 01h=6, 02h=7, 03h=8)
 + 02h BYTE parity (00h none, 01h odd, 02h even)
 + 03h BYTE stop bits (00h=1, 01h=2)
 + 04h BYTE receive flow control
 + 00h none, 01h XON/XOFF, 02h DTR/DSR, 03h XPC, 04h RTS/CTS
 + 05h BYTE transmit flow control (as for receive)
 +----------1424-------------------------------
 +INT 14 - MultiDOS Plus - SET MONITOR MODE
 + AH = 24h
 + AL = port status storage
 +     00h single status for entire receive buffer
 +     01h separate status kept for each byte in receive buffer
 + DX = port number
 +Return: AH = status
 +     00h successful
 +     3Ah invalid status storage specified
 +     41h no such port
 +     64h monitor mode already active
 +Note: in monitor mode, MultiDOS redirects all BIOS video output to a serial
 +   port
 +SeeAlso: AH=20h"MultiDOS",AH=25h
 +----------1425-------------------------------
 +INT 14 - MultiDOS Plus - CLEAR BUFFERS
 + AH = 25h
 + AL = function
 +     00h only clear buffers
 +     01h clear buffers and deactivate
 + DX = port number
 +Return: AH = status
 +     00h successful
 +     3Ah invalid function
 +     41h no such port
 +     42h monitor mode not active
 +SeeAlso: AH=20h"MultiDOS",AH=24h"MultiDOS"
 +----------1427-------------------------------
 +INT 14 - MultiDOS Plus - GET BUFFER CHARACTER COUNT
 + AH = 27h
 + DX = port number
 +Return: AH = status
 +     00h successful
 +     41h no such port
 +     42h monitor mode not active
 + AL = number of characters in receive buffer
 +----------147E-------------------------------
 +INT 14 - FOSSIL - INSTALL AN EXTERNAL APPLICATION FUNCTION
 + AH = 7Eh
 + AL = code assigned to external application (80h-BFh)
 +     80h reserved for communications FOSSIL
 +     81h video FOSSIL
 +     82h reserved for keyboard FOSSIL
 +     83h reserved for system FOSSIL
 + ES:DX -> entry point
 +Return: AX = 1954h
 + BL = code assigned to application (same as input AL)
 + DH = 00h failed
 +      01h successful
 +SeeAlso: AH=7Fh,AH=80h"FOSSIL",AX=8100h,AH=82h"FOSSIL",AH=83h"FOSSIL"
 +----------147F-------------------------------
 +INT 14 - FOSSIL - REMOVE AN EXTERNAL APPLICATION FUNCTION
 + AH = 7Fh
 + AL = code assigned to external application
 + ES:DX -> entry point
 +Return: AX = 1954h
 + BL = code assigned to application (same as input AL)
 + DH = 00h failed
 +      01h successful
 +SeeAlso: AH=7Eh
 +----------1480-------------------------------
 +INT 14 - COMMUNICATIONS FOSSIL
 + AH = 80h
 +SeeAlso: AH=7Eh
 +----------1480-------------------------------
 +INT 14 - COURIERS.COM - INSTALLATION CHECK
 + AH = 80h
 +Return: AH = E8h if loaded
 +Note: COURIERS is a TSR utility by PC Magazine
 +----------1481-------------------------------
 +INT 14 - COURIERS.COM - CHECK IF PORT BUSY
 + AH = 81h
 + AL = port number (1-4)
 +Return: AH = 00h port available
 +      01h port exists but already in use
 +      02h port nonexistent
 +Note: COURIERS is a TSR utility by PC Magazine
 +SeeAlso: AH=83h,AH=8Dh
 +----------1481-------------------------------
 +INT 14 - Egberto Willies COMM-DRV - EXTENDED INITIALIZATION
 + AH = 81h
 + BX:DI -> port control block
 +Return: ???
 +SeeAlso: AH=00h
 +
 +Format of port control block:
 +Offset Type Description
 + 00h WORD port IO address
 + 02h WORD port IRQ
 + 04h WORD baud rate
 + 06h WORD parity
 + 08h WORD data bits
 + 0Ah WORD stop bits
 + 0Ch WORD break status
 +     0000h off
 + 0Eh WORD flow control protocol
 + 10h BYTE input block
 + 11h BYTE output block
 + 12h WORD low threshold
 + 14h WORD high threshold
 + 16h WORD segment of buffer
 + 18h WORD offset of buffer
 + 1Ah WORD input buffer length
 + 1Ch WORD output buffer length
 + 1Eh BYTE auxiliary address
 + 1Fh BYTE spare
 + 20h  4 WORDs spares
 +----------148100-----------------------------
 +INT 14 - VIDEO FOSSIL - RETURN VFOSSIL INFORMATION
 + AX = 8100h
 + ES:DI -> buffer for VFOSSIL information (see below)
 +Return: AX = 1954h if installed
 +SeeAlso: AH=7Eh,AX=8101h
 +
 +Format of VFOSSIL information:
 +Offset Size Description
 + 00h WORD size of information in bytes, including this field
 + 02h WORD VFOSSIL major version
 + 04h WORD VFOSSIL revision level
 + 06h WORD highest VFOSSIL application function supported
 +----------148101-----------------------------
 +INT 14 - VIDEO FOSSIL - OPEN VFOSSIL
 + AX = 8101h
 + ES:DI -> buffer for application function table (see below)
 + CX = length of buffer in bytes
 +Return: AX = 1954h if installed
 +     BH = highest VFOSSIL application function supported
 +Note: the number of initialized pointers in the application function table
 +   will never exceed CX/4; if the buffer is large enough, BH+1 pointers
 +   will be initialized
 +SeeAlso: AX=8102h
 +
 +Format of application function table:
 +Offset Size Description
 + 00h DWORD -> function to query current video mode (VioGetMode)
 + 04h DWORD -> function to set video mode (VioSetMode)
 + 08h DWORD -> function to query hardware config (VioGetConfig)
 + 0Ch DWORD -> function to write data in TTY mode (VioWrtTTY)
 + 10h DWORD -> function to get current ANSI state (VioGetANSI)
 + 14h DWORD -> function to set new ANSI state (VioSetANSI)
 + 18h DWORD -> function to get curr cursor position (VioGetCurPos)
 + 1Ch DWORD -> function to set cursor position (VioSetCurPos)
 + 20h DWORD -> function to get cursor shape (VioGetCurType)
 + 24h DWORD -> function to set cursor shape (VioSetCurType)
 + 28h DWORD -> function to scroll screen up (VioScrollUp)
 + 2Ch DWORD -> function to scroll screen down (VioScrollDn)
 + 30h DWORD -> function to read cell string from screen (VioReadCellStr)
 + 34h DWORD -> function to read char string from screen (VioReadCharStr)
 + 38h DWORD -> function to write a cell string (VioWrtCellStr)
 + 3Ch DWORD -> function to write char string, leaving attr (VioWrtCharStr)
 + 40h DWORD -> function to write char string,const attr (VioWrtCharStrAttr)
 + 44h DWORD -> function to replicate an attribute (VioWrtNAttr)
 + 48h DWORD -> function to replicate a cell (VioWrtNCell)
 + 4Ch DWORD -> function to replicate a character (VioWrtNChar)
 +
 +Format of video mode data structure:
 +Offset Size Description
 + 00h WORD length of structure including this field
 + 02h BYTE mode characteristics
 + bit 0: clear if MDA, set otherwise
 + bit 1: graphics mode
 + bit 2: color disabled (black-and-white)
 + 03h BYTE number of colors supported (1=2 colors, 4=16 colors, etc)
 + 04h WORD number of text columns
 + 06h WORD number of text rows
 + 08h WORD reserved
 + 0Ah WORD reserved
 + 0Ch DWORD reserved
 +
 +Format of video configuration data:
 +Offset Size Description
 + 00h WORD structure length including this field
 + 02h WORD adapter type
 + 00h monochrome/printer
 + 01h CGA
 + 02h EGA
 + 03h VGA
 + 07h 8514/A
 + 04h WORD display type
 + 00h monochrome
 + 01h color
 + 02h enhanced color
 + 09h 8514
 + 06h DWORD adapter memory size
 +
 +Format of cursor type record:
 +Offset Size Description
 + 00h WORD cursor start line
 + 02h WORD cursor end line
 + 04h WORD cursor width (always 01h)
 + 06h WORD cursor attribute (FFFFh = hidden)
 +
 +Call VioGetMode with:
 + STACK: WORD VIO handle (must be 00h)
 + DWORD pointer to video mode data structure (see above)
 +Return: AX = error code (00h, 74h, 17Eh, 1B4h)
 +     0000h successful
 +     0074h internal VIO failure
 +     0163h unsupported mode
 +     0166h invalid row value
 +     0167h invalid column value
 +     017Eh buffer too small
 +     01A5h invalid VIO parameter
 +     01B4h invalid VIO handle
 +
 +Call VioSetMode with:
 + STACK: WORD VIO handle (must be 00h)
 + DWORD pointer to video mode data structure (see above)
 +Return: AX = error code (00h, 74h, 163h, 17Eh, 1A5h, 1B4h) (see above)
 +
 +Call VioGetConfig with:
 + STACK: WORD VIO handle (must be 00h)
 + DWORD pointer to video configuration data buffer (see above)
 +Return: AX = error code (00h, 74h, 17Eh, 1B4h) (see above)
 +
 +Call VioWrtTTY with:
 + STACK: WORD VIO handle (must be 00h)
 + WORD length of string
 + DWORD pointer to character string to be written to screen
 +Return: AX = error code (00h, 74h, 1B4h) (see above)
 +Notes: write wraps at end of line and terminates if it reaches end of screen
 + in ANSI mode, ANSI control sequences are interpreted, and this func is
 +   not required to be reentrant; in non-ANSI mode, the function is
 +   reentrant and may be called from within an MSDOS function call
 +
 +Call VioGetANSI with:
 + STACK: WORD VIO handle (must be 00h)
 + DWORD pointer to WORD which will be set to 00h if ANSI is off
 + or 01h if ANSI is on
 +Return: AX = error code (00h, 74h, 1B4h) (see above)
 +
 +Call VioSetANSI with:
 + STACK: WORD VIO handle (must be 00h)
 + DWORD pointer to WORD indicating new state of ANSI
 + 00h off
 + 01h on
 +Return: AX = error code (00h, 74h, 1A4h, 1B4h) (see above)
 +
 +Call VioGetCurPos with:
 + STACK: WORD VIO handle (must be 00h)
 + DWORD pointer to WORD to hold current cursor column (0-based)
 + DWORD pointer to WORD to hold current cursor row (0-based)
 +Return: AX = error code (00h, 74h, 1B4h) (see above)
 +
 +Call VioSetCurPos with:
 + STACK: WORD VIO handle (must be 00h)
 + WORD cursor column
 + WORD cursor row
 +Return: AX = error code (00h, 74h, 166h, 167h, 1B4h) (see above)
 +Note: if either coordinate is invalid, the cursor is not moved
 +
 +Call VioGetCurType with:
 + STACK: WORD VIO handle (must be 00h)
 + DWORD pointer to cursor type record (see above)
 +Return: AX = error code (00h, 74h, 1B4h) (see above)
 +
 +Call VioSetCurType with:
 + STACK: WORD VIO handle (must be 00h)
 + DWORD pointer to cursor type record (see above)
 +Return: AX = error code (00h, 74h, 1A4h, 1B4h) (see above)
 +
 +Call VioScrollUp with:
 + STACK: WORD VIO handle (must be 00h)
 + DWORD pointer to char/attr cell for filling emptied rows
 + WORD number or rows to scroll (FFFFh = clear area)
 + WORD right column of scroll area
 + WORD bottom row of scroll area
 + WORD left column of scroll area
 + WORD top row of scroll area
 +Return: AX = error code (00h, 74h, 166h, 167h, 1B4h) (see above)
 +
 +Call VioScrollDn with:
 + STACK: WORD VIO handle (must be 00h)
 + DWORD pointer to char/attr cell for filling emptied rows
 + WORD number or rows to scroll (FFFFh = clear area)
 + WORD right column of scroll area
 + WORD bottom row of scroll area
 + WORD left column of scroll area
 + WORD top row of scroll area
 +Return: AX = error code (00h, 74h, 166h, 167h, 1B4h) (see above)
 +
 +Call VioReadCellStr with:
 + STACK: WORD VIO handle (must be 00h)
 + WORD column at which to start reading
 + WORD row at which to start reading
 + DWORD pointer to WORD containing length of buffer in bytes
 + on return, WORD contains number of bytes actually read
 + DWORD pointer to buffer for cell string
 +Return: AX = error code (00h, 74h, 166h ,167h, 1B4h) (see above)
 +
 +Call VioReadCharStr with:
 + STACK: WORD VIO handle (must be 00h)
 + WORD column at which to start reading
 + WORD row at which to start reading
 + DWORD pointer to WORD containing length of buffer in bytes
 + on return, WORD contains number of bytes actually read
 + DWORD pointer to buffer for character string
 +Return: AX = error code (00h, 74h, 166h ,167h, 1B4h) (see above)
 +
 +Call VioWrtCellStr with:
 + STACK: WORD VIO handle (must be 00h)
 + WORD column at which to start writing
 + WORD row at which to start writing
 + WORD length of cell string in bytes
 + DWORD pointer to cell string to write
 +Return: AX = error code (00h, 74h, 166h, 167h, 1B4h) (see above)
 +Note: write wraps at end of line and terminates if it reaches end of screen
 +
 +Call VioWrtCharStr with:
 + STACK: WORD VIO handle (must be 00h)
 + WORD column at which to start writing
 + WORD row at which to start writing
 + WORD length of character string
 + DWORD pointer to character string to write
 +Return: AX = error code (00h, 74h, 166h, 167h, 1B4h) (see above)
 +Note: write wraps at end of line and terminates if it reaches end of screen
 +
 +Call VioWrtCharStrAttr with:
 + STACK: WORD VIO handle (must be 00h)
 + DWORD pointer to attribute to be applied to each character
 + WORD column at which to start writing
 + WORD row at which to start writing
 + WORD length of character string
 + DWORD pointer to character string to write
 +Return: AX = error code (00h, 74h, 166h, 167h, 1B4h) (see above)
 +Note: write wraps at end of line and terminates if it reaches end of screen
 +
 +Call VioWrtNAttr with:
 + STACK: WORD VIO handle (must be 00h)
 + WORD column at which to start writing
 + WORD row at which to start writing
 + WORD number of times to write attribute
 + DWORD pointer to display attribute to replicate
 +Return: AX = error code (00h, 74h, 166h, 167h, 1B4h) (see above)
 +Note: write wraps at end of line and terminates if it reaches end of screen
 +
 +Call VioWrtNCell with:
 + STACK: WORD VIO handle (must be 00h)
 + WORD column at which to start writing
 + WORD row at which to start writing
 + WORD number of times to write cell
 + DWORD pointer to cell to replicate
 +Return: AX = error code (00h, 74h, 166h, 167h, 1B4h) (see above)
 +Note: write wraps at end of line and terminates if it reaches end of screen
 +
 +Call VioWrtNChar with:
 + STACK: WORD VIO handle (must be 00h)
 + WORD column at which to start writing
 + WORD row at which to start writing
 + WORD number of times to write character
 + DWORD pointer to character to replicate
 +Return: AX = error code (00h, 74h, 166h, 167h, 1B4h) (see above)
 +Note: write wraps at end of line and terminates if it reaches end of screen
 +----------148102-----------------------------
 +INT 14 - VIDEO FOSSIL - CLOSE VFOSSIL
 + AX = 8102h
 +Return: AX = 1954h
 +Note: terminates all operations; after this call, the video FOSSIL may either
 +   be removed from memory or reinitialized
 +SeeAlso: AX=8101h,AX=8103h
 +----------148103-----------------------------
 +INT 14 - VIDEO FOSSIL - UNINSTALL
 + AX = 8103h
 +Return: AX = 1954h
 +Note: this is an extension to the VFOSSIL spec by Bob Hartman's VFOS_IBM
 +----------1482-------------------------------
 +INT 14 - KEYBOARD FOSSIL
 + AH = 82h
 +SeeAlso: AH=7Eh
 +----------1482-------------------------------
 +INT 14 - COURIERS.COM - CONFIGURE PORT
 + AH = 82h
 + AL = port number (1-4)
 + BX = speed (bps)
 + CX = bit flags
 +     bit 0: enable input flow control
 +     bit 1: enable output flow control
 +     bit 2: use X.PC protocol (not yet implemented)
 +SeeAlso: AH=00h,AH=8Ch,INT 7A"X.PC"
 +----------1483-------------------------------
 +INT 14 - SYSTEM FOSSIL
 + AH = 83h
 +SeeAlso: AH=7Eh
 +----------1483-------------------------------
 +INT 14 - COURIERS.COM - START INPUT
 + AH = 83h
 + ES:BX -> circular input buffer
 + CX = length of buffer 
 + (should be at least 128 bytes if input flow control enabled)
 +SeeAlso: AH=18h,AH=87h,AH=8Dh,AH=A5h"BAPI"
 +----------1484-------------------------------
 +INT 14 - COURIERS.COM - READ CHARACTER
 + AH = 84h
 +Return: ZF set if no characters available
 + ZF clear
 +    AL = character
 +    AH = modem status bits
 + bit 7: set on input buffer overflow
 +SeeAlso: AH=02h,AH=86h,AH=89h
 +----------1485-------------------------------
 +INT 14 - COURIERS.COM - FLUSH PENDING INPUT
 + AH = 85h
 +SeeAlso: AH=0Ah,AH=88h
 +----------1486-------------------------------
 +INT 14 - COURIERS.COM - START OUTPUT
 + AH = 86h
 + ES:BX -> output buffer
 + CX = length of output buffer
 +SeeAlso: AH=19h,AH=83h"COURIERS",AH=A4h"BAPI"
 +----------1487-------------------------------
 +INT 14 - COURIERS.COM - OUTPUT STATUS
 + AH = 87h
 +Return: AX = number of unsent characters
 +----------1488-------------------------------
 +INT 14 - COURIERS.COM - ABORT OUTPUT
 + AH = 88h
 +SeeAlso: AH=09h,AH=85h
 +----------1489-------------------------------
 +INT 14 - COURIERS.COM - SEND SINGLE CHARACTER
 + AH = 89h
 + CL = character to send
 +SeeAlso: AH=01h,AH=84h
 +----------148A-------------------------------
 +INT 14 - COURIERS.COM - SEND BREAK
 + AH = 8Ah
 +SeeAlso: AH=89h,AH=FAh
 +----------148C-------------------------------
 +INT 14 - COURIERS.COM - SET SPEED
 + AH = 8Ch
 + BX = speed in bps
 +SeeAlso: AH=00h,AH=82h"COURIERS"
 +----------148D-------------------------------
 +INT 14 - COURIERS.COM - DECONFIGURE PORT
 + AH = 8Dh
 +SeeAlso: AH=82h"COURIERS"
 +----------14A0-------------------------------
 +INT 14 - 3com BAPI SERIAL I/O - CONNECT TO PORT
 + AH = A0h
 + ???
 +Return: ???
 +SeeAlso: AH=A1h"BAPI"
 +----------14A0--CXFFFF-----------------------
 +INT 14 - Interconnections Inc. TES - INSTALLATION CHECK/STATUS REPORT
 + AH = A0h
 + CX = FFFFh
 +Return: CF clear if successful
 +     AX = 5445h ('TE')
 +     CX <> FFFFh
 +     DX = port number
 + CF set on error
 +Note: TES is a network serial port emulation program
 +SeeAlso: AH=A1h"TES"
 +----------14A1-------------------------------
 +INT 14 - 3com BAPI SERIAL I/O - DISCONNECT FROM PORT
 + AH = A1h
 + ???
 +Return: ???
 +SeeAlso: AH=A0h"BAPI"
 +----------14A1-------------------------------
 +INT 14 - Interconnections Inc. TES - GET LIST OF SESSIONS WITH STATUS
 + AH = A1h
 +Return: CX = number of active sessions
 + ES:SI -> status array (see below)
 +SeeAlso: AH=A2h"TES",AH=A3h"TES"
 +
 +Format of status array entry:
 +Offset Size Description
 + 00h BYTE status
 + 01h WORD offset of name
 +----------14A2-------------------------------
 +INT 14 - Interconnections Inc. TES - GET LIST OF SERVER NAMES
 + AH = A2h
 +Return: CX = number of servers
 + ES:SI -> array of offsets from ES for server names
 +SeeAlso: AH=A1h"TES"
 +----------14A3-------------------------------
 +INT 14 - Interconnections Inc. TES - START A NEW SESSION
 + AH = A3h
 + ES:SI -> ???
 +Return: CF clear if successful
 +     AX = 5445h ('TE')
 +     CX <> FFFFh
 +     DX = port number
 + CF set on error
 +SeeAlso: AH=A1h"TES",AH=A4h"TES",AH=A6h"TES"
 +----------14A4-------------------------------
 +INT 14 - 3com BAPI SERIAL I/O - WRITE BLOCK
 + AH = A4h
 + CX = length
 + DH = session number (00h)
 + ES:BX -> buffer
 +Return: CX = number of bytes sent
 +SeeAlso: AH=19h,AH=86h,AH=A5h"BAPI"
 +----------14A4-------------------------------
 +INT 14 - Interconnections Inc. TES - HOLD CURRENTLY ACTIVE SESSION
 + AH = A4h
 + ???
 +Return: ???
 +SeeAlso: AH=A3h"TES",AH=A5h"TES"
 +----------14A5-------------------------------
 +INT 14 - 3com BAPI SERIAL I/O - READ BLOCK
 + AH = A5h
 + CX = length
 + DH = session number (00h)
 + ES:BX -> buffer
 +Return: CX = number of bytes read
 +SeeAlso: AH=18h,AH=83h"COURIERS",AH=A4h"BAPI",AX=FF02h
 +----------14A5-------------------------------
 +INT 14 - Interconnections Inc. TES - RESUME A SESSION
 + AH = A5h
 + AL = session number
 +Return: ???
 +SeeAlso: AH=A4h"TES",AH=A6h"TES"
 +----------14A6-------------------------------
 +INT 14 - 3com BAPI SERIAL I/O - SEND SHORT BREAK
 + AH = A6h
 + DH = session number (00h)
 +SeeAlso: AH=1Ah,AH=8Ah,AH=FAh
 +----------14A6-------------------------------
 +INT 14 - Interconnections Inc. TES - DROP A SESSION
 + AH = A6h
 + AL = session number
 +Return: AH = status
 +     00h successful
 +     else error
 +SeeAlso: AH=A3h"TES",AH=A5h"TES"
 +----------14A7-------------------------------
 +INT 14 - 3com BAPI SERIAL I/O - READ STATUS
 + AH = A7h
 + ???
 +Return: ???
 +----------14A7-------------------------------
 +INT 14 - Interconnections Inc. TES - SWITCH TO NEXT ACTIVE SESSION
 + AH = A7h
 + ???
 +Return: ???
 +SeeAlso: AH=A3h"TES",AH=A5h"TES"
 +----------14A8-------------------------------
 +INT 14 - Interconnections Inc. TES - SEND STRING TO COMMAND INTERPRETER
 + AH = A8h
 + AL = 00h no visible response
 + ES:SI -> ASCIZ command
 +Return: ???
 +----------14AF00BXAAAA-----------------------
 +INT 14 - 3com BAPI SERIAL I/O - INSTALLATION CHECK
 + AX = AF00h
 + BX = AAAAh
 +Return: AX = AF01h if installed
 +----------14B0-------------------------------
 +INT 14 - 3com BAPI SERIAL I/O - ENABLE/DISABLE "ENTER COMMAND MODE" CHARACTER
 + AH = B0h
 + AL = 00h disable
 +    = 01h enable
 +----------14B1-------------------------------
 +INT 14 - 3com BAPI SERIAL I/O - ENTER COMMAND MODE
 + AH = B1h
 +----------14F0F0-----------------------------
 +INT 14 - ASAP v1.0 - ???
 + AX = F0F0h
 + DX = ???
 + ???
 +Return: ???
 +Note: ASAP (Automatic Screen Access Program) is a shareware screen reader by
 +   MicroTalk
 +SeeAlso: AX=F0F1h
 +----------14F0F1DX0000-----------------------
 +INT 14 - ASAP v1.0 - INSTALLATION CHECK
 + AX = F0F1h
 + DX = 0000h
 +Return: DX = segment of resident code
 +    = 0000h if not installed
 +Note: ASAP (Automatic Screen Access Program) is a shareware screen reader by
 +   MicroTalk
 +SeeAlso: AX=F0F0h,INT 10/AH=38h
 +----------14F4FF-----------------------------
 +INT 14 - IBM/Yale EBIOS SERIAL I/O - INSTALLATION CHECK
 + AX = F4FFh
 + DX = port (00h-03h)
 +Return: CF clear if present
 +     AX = 0000h
 + CF set if not present
 +     AX <> 0000h
 +----------14F9-------------------------------
 +INT 14 - IBM/Yale EBIOS SERIAL I/O - REGAIN CONTROL
 + AH = F9h
 + DX = port (00h-03h)
 +----------14FA-------------------------------
 +INT 14 - IBM/Yale EBIOS SERIAL I/O - SEND BREAK
 + AH = FAh
 + DX = port (00h-03h)
 +SeeAlso: AH=1Ah,AH=8Ah
 +----------14FB-------------------------------
 +INT 14 - IBM/Yale EBIOS SERIAL I/O - SET OUTGOING MODEM SIGNALS
 + AH = FBh
 + AL = modem control register
 +     bit 0: data terminal ready
 + 1: request to send
 + 2: OUT1
 + 3: OUT2
 + 4: loopback
 +     bits 5-7 unused
 + DX = port (00h-03h)
 +----------14FC-------------------------------
 +INT 14 - IBM/Yale EBIOS SERIAL I/O - READ CHARACTER, NO WAIT
 + AH = FCh
 + DX = port (00h-03h)
 +Return: AH = RS232 status bits (see AH=00h)
 + AL = character
 +SeeAlso: AH=02h,AH=0Ch,AX=FF02h
 +----------14FD02-----------------------------
 +INT 14 - IBM/Yale EBIOS SERIAL I/O - READ STATUS
 + AX = FD02h
 +Return: CX = number of characters available
 +----------14FF02-----------------------------
 +INT 14 - IBM/Yale EBIOS SERIAL I/O - BUFFERED READ
 + AX = FF02h
 + CX = length
 + DX = port (00h-03h)
 + ES:BX -> buffer
 +Return: CX = number of characters read
 +SeeAlso: AH=18h,AH=83h"COURIERS",AH=A5h"BAPI",AH=FCh
 +---------------------------------------------
 +===== INT 15 =====
 +
 +==== Microsoft TSR Specification ====
 +
 +No additional information available at this time.
 +
 +==== 00h - CASSETTE - TURN ON TAPE DRIVE'S MOTOR (PC and PCjr only) ====
 +
 + AH = 00h
 +Return: CF set on error
 +     AH = 86h no cassette present
 + CF clear if successful
 +SeeAlso: AH=01h"CASSETTE"
 +
 +==== 00h - Amstrad PC1512 - GET AND RESET MOUSE COUNTS ====
 +
 + AH = 00h
 +Return: CX = signed X count
 + DX = signed Y count
 +----------1500-------------------------------
 +INT 15 - VMiX v2+ - INSTALLATION CHECK???
 + AH = 00h
 +Return: DX = 0798h???
 +----------1500-------------------------------
 +INT 15 - MultiDOS Plus - GIVE UP TIME SLICE
 + AH = 00h
 +Note: if issued by the highest-priority task while MultiDOS is using
 +   priority-based rather than round-robin scheduling, control will be
 +   returned to the caller immediately
 +SeeAlso: AH=03h"MultiDOS",AX=1000h
 +----------1501-------------------------------
 +INT 15 - CASSETTE - TURN OFF TAPE DRIVE'S MOTOR (PC and PCjr only)
 + AH = 01h
 +Return: CF set on error
 +     AH = 86h no cassette present
 + CF clear if successful
 +SeeAlso: AH=00h"CASSETTE"
 +----------1501-------------------------------
 +INT 15 - Amstrad PC1512 - WRITE DATA TO NON-VOLATILE RAM
 + AH = 01h
 + AL = NVRAM location (00h to 3Fh)
 + BL = NVRAM data value
 +Return: AH = return code
 +     00h OK
 +     01h address bad
 +     02h write error
 +SeeAlso: AH=02h"Amstrad"
 +
 +Format of NVRAM:
 +Offset Size Description
 + 00h BYTE time of day: seconds
 + 01h BYTE alarm time: seconds
 + 02h BYTE time of day: minutes
 + 03h BYTE alarm time: minutes
 + 04h BYTE time of day: hours
 + 05h BYTE alarm time: hours
 + 06h BYTE day of week, 1 = Sunday
 + 07h BYTE day of month
 + 08h BYTE month
 + 09h BYTE year mod 100
 + 0Ah BYTE RTC status register A
 + bit 7: set if date/time being updated
 +     6-4: time base speed, default 010 = 32768 Hz
 +     3-0: interrupt rate selection, default 0110 = 1024 Hz
 + 0Bh BYTE RTC status register B
 + bit 7: clear if normal update, set if abort update
 +     6: periodic interrupt enable
 +     5: alarm interrupt enable
 +     4: update end interrupt enable
 +     3: square wave enable
 +     2: date mode (clear = BCD, set = binary)
 +     1: 24-hour format
 +     0: daylight saving time enable
 + 0Ch BYTE RTC status register C (read-only)
 + bit 7: IRQF flag
 +     6: PF flag
 +     5: AF flag
 +     4: UF flag
 + 0Dh BYTE RTC status register D
 + bit 7: battery good
 + 0Eh  6 BYTEs time and date machine last used
 + 14h BYTE user RAM checksum
 + 15h WORD Enter key scancode/ASCII code
 + 17h WORD Forward delete key scancode/ASCII code
 + 19h WORD Joystick fire button 1 scancode/ASCII code
 + 1Bh WORD Joystick fire button 2 scancode/ASCII code
 + 1Dh WORD mouse button 1 scancode/ASCII code
 + 1Fh WORD mouse button 2 scancode/ASCII code
 + 21h BYTE mouse X scaling factor
 + 22h BYTE mouse Y scaling factor
 + 23h BYTE initial VDU mode and drive count
 + 24h BYTE initial VDU character attribute
 + 25h BYTE size of RAM disk in 2K blocks
 + 26h BYTE initial system UART setup byte
 + 27h BYTE initial external UART setup byte
 + 28h 24 BYTEs available for user application
 +Note: bytes 00h-0Dh are the same on the IBM AT as they are used/updated by
 +   the clock chip
 +----------1501-------------------------------
 +INT 15 - VMiX - I/O CHANNEL OBJECT MANAGER
 + AH = 01h
 + STACK: WORD  object ID of requestor
 +        DWORD pointer to name of requested method
 +        WORD  arg1
 +        WORD  arg2
 +        WORD  arg3
 +        WORD  arg4
 +Return: DX:AX??? -> IRP structure or 0000h:0000h 
 +----------1501-------------------------------
 +INT 15 - MultiDOS Plus - REQUEST RESOURCE SEMAPHORE
 + AH = 01h
 + AL = semaphore number (00h-3Fh)
 +Return: AH = status
 +     00h successful
 +     02h invalid semaphore number
 +Notes: if the semaphore is not owned, ownership is assigned to the calling
 +   task and the call returns immediately
 + if the semaphore is already owned by another task, the calling task
 +   is placed on a queue for the semaphore and suspended until it can
 +   become owner of the semaphore
 + semaphore 0 is used internally by MultiDOS to synchronize DOS access
 +SeeAlso: AH=02h"MultiDOS",AH=10h"MultiDOS",AH=1Bh"MultiDOS"
 +----------1502-------------------------------
 +INT 15 - CASSETTE - READ DATA
 + AH = 02h
 + CX = number of bytes to read
 + ES:BX -> buffer
 +Return: CF clear if successful
 +     DX = number of bytes read
 +     ES:BX -> byte following last byte read
 + CF set on error
 + AH = status
 +     00h successful
 +     01h CRC error
 +     02h bad tape signals
 +     04h no data
 +     80h invalid command
 +     86h no cassette present
 +SeeAlso: AH=00h"CASSETTE",AH=03h"CASSETTE"
 +----------1502-------------------------------
 +INT 15 - Amstrad PC1512 - READ DATA FROM NON-VOLATILE RAM
 + AH = 02h
 + AL = NVRAM location (00h to 3Fh)
 +Return: AH = return code
 +     00h OK
 +     01h address bad
 +     02h checksum error
 + AL = NVRAM data value
 +SeeAlso: AH=01h"Amstrad"
 +----------1502-------------------------------
 +INT 15 - VMiX - MEMORY OBJECT MANAGER
 + AH = 02h
 + STACK: WORD object ID of requestor
 + DWORD pointer to name of requested method
 + WORD arg1
 + WORD arg2
 + WORD arg3
 + WORD arg4
 + WORD arg5
 +Return: DX:AX??? = pointer to memory block
 +----------1502-------------------------------
 +INT 15 - MultiDOS Plus - RELEASE RESOURCE SEMAPHORE
 + AH = 02h
 + AL = semaphore number (00h-3Fh)
 +Return: AH = status
 +     00h successful
 +     01h not semaphore owner
 +     02h invalid semaphore number
 +Notes: if any tasks are waiting for the semaphore, the first task on the wait
 +   queue will become the new owner and be reawakened
 + do not use within an interrupt handler
 +SeeAlso: AH=01h"MultiDOS",AH=10h"MultiDOS",AH=1Ch"MultiDOS"
 +----------1503-------------------------------
 +INT 15 - CASSETTE - WRITE DATA (PC and PCjr only)
 + AH = 03h
 + CX = number of bytes to write
 + ES:BX -> data buffer
 +Return: CF clear if successful
 +     ES:BX -> byte following last byte written
 + CF set on error
 + AH = status (see AH=02h"CASSETTE")
 + CX = 0000h
 +SeeAlso: AH=00h"CASSETTE",AH=02h"CASSETTE"
 +----------1503-------------------------------
 +INT 15 - Amstrad PC1512 - WRITE VDU COLOR PLANE WRITE REGISTER
 + AH = 03h
 + AL = value (I,R,G,B bits)
 +SeeAlso: AH=04h"Amstrad"
 +----------1503-------------------------------
 +INT 15 - VMiX - PROMPTED CONSOLE INPUT
 + AH = 03h
 + STACK: DWORD pointer to ASCII prompt
 + WORD field outline character
 + WORD length of input field
 + DWORD address of pointer to input buffer
 + WORD number of characters input
 +Return: AX = length of input (input buffer is padded with blanks)
 +----------1503-------------------------------
 +INT 15 - MultiDOS Plus - SUSPEND TASK FOR INTERVAL
 + AH = 03h
 + DX = number of time slices to remain suspended
 +Return: after specified interval has elapsed
 +Note: when priority-based scheduling is in use, high-priority tasks should
 +   use this function to yield the processor
 +SeeAlso: AH=00h"MultiDOS",AH=0Ah"MultiDOS"
 +----------1504-------------------------------
 +INT 15 - SYSTEM - BUILD ABIOS SYSTEM PARAMETER TABLE (PS)
 + AH = 04h
 + ES:DI -> results buffer length 20h for System Parameter Table
 + DS = segment containing ABIOS RAM extensions (zero if none)
 +Return: AH = 00h success: results at ES:DI
 + CF set on failure
 +SeeAlso: AH=05h"ABIOS",C1h
 +
 +Format of ABIOS System Parameter Table:
 +Offset Size Description
 + 00h DWORD FAR address of ABIOS Common Start Routine
 + 04h DWORD FAR address of ABIOS Interrupt Routine
 + 08h DWORD FAR address of ABIOS Time-out Routine
 + 0Ch WORD number of bytes of stack required by this ABIOS implementation
 + 0Eh 16 BYTEs reserved
 + 1Eh WORD number of entries in initialization table
 +----------1504-------------------------------
 +INT 15 - Amstrad PC1512 - WRITE VDU COLOR PLANE READ REGISTER
 + AH = 04h
 + AL = value (RDSEL1 and RDSEL0)
 +SeeAlso: AH=03h"Amstrad",05h"Amstrad"
 +----------1504-------------------------------
 +INT 15 - VMiX - VPRINTF
 + AH = 04h
 + STACK: DWORD control string
 + DWORD array of arguments
 +----------1504-------------------------------
 +INT 15 - MultiDOS Plus - SEND MESSAGE TO ANOTHER TASK
 + AH = 04h
 + AL = mailbox number (00h-3Fh)
 + CX = message length in bytes
 + DS:SI -> message
 +Return: AH = status
 +     00h successful
 +     01h out of message memory
 +     02h invalid mailbox number
 +Note: the message is copied into a system buffer; the caller may immediately
 +   reuse its buffer
 +SeeAlso: AH=05h"MultiDOS"
 +----------1505-------------------------------
 +INT 15 - SYSTEM - BUILD ABIOS INITIALIZATION TABLE (PS)
 + AH = 05h
 + ES:DI -> results buffer length (18h * Number_of_Entries)
 + DS = segment containing ABIOS RAM extensions (zero if none)
 +Return: AH = 00h success: results at ES:DI
 + CF set on failure
 +SeeAlso: AH=04h"ABIOS",C1h
 +
 +Format of one entry of ABIOS Initialization Table:
 +Offset Size Description
 + 00h WORD device ID
 + 02h WORD number of Logical IDs
 + 04h WORD Device Block length (zero for ABIOS patch or extension)
 + 06h DWORD -> init routine for Device Block and Function Transfer Table
 + 0Ah WORD request block length
 + 0Ch WORD Function Transfer Table length (zero for a patch)
 + 0Eh WORD Data Pointers length (in Common Data Area)
 + 10h BYTE secondary device ID (hardware level this ABIOS ver supports)
 + 11h BYTE revision (device driver revision level this ABIOS supports)
 + 12h  6 BYTEs reserved
 +----------1505-------------------------------
 +INT 15 - Amstrad PC1512 - WRITE VDU GRAPHICS BORDER REGISTER
 + AH = 05h
 + AL = value (I,R,G,B bits)
 +SeeAlso: AH=04h"Amstrad"
 +----------1505-------------------------------
 +INT 15 - VMiX - GET PROCESS ID OF CURRENT PROCESS
 + AH = 05h
 +Return: AX = process ID
 +SeeAlso: AH=06h"VMiX",AH=0Bh"VMiX"
 +----------1505-------------------------------
 +INT 15 - MultiDOS Plus - CHECK MAILBOX
 + AH = 05h
 + AL = mailbox number (00h-3Fh)
 +Return: AH = status
 +     00h successful
 + DX = length of first message in queue, 0000h if no message
 +     02h invalid mailbox number
 +SeeAlso: AH=04h"MultiDOS",AH=06h"MultiDOS"
 +----------1506-------------------------------
 +INT 15 - Amstrad PC1512 - GET ROS VERSION NUMBER
 + AH = 06h
 +Return: BX = version number
 +----------1506-------------------------------
 +INT 15 - VMiX - GET POINTER TO PROCESS CONTROL BLOCK
 + AH = 06h
 + STACK: WORD process ID
 +Return: DX:AX??? -> process control block
 +SeeAlso: AH=07h"VMiX",AH=08h"VMiX"
 +----------1506-------------------------------
 +INT 15 - MultiDOS Plus - READ MAILBOX
 + AH = 06h
 + AL = mailbox number (00h-3Fh)
 + CX = size of buffer in bytes
 + ES:DI -> buffer for message
 +Return: AH = status
 +     00h successful
 + CX = number of bytes copied
 + DX = actual length of message
 +     02h invalid mailbox number
 +Note: if the caller's buffer is not large enough, the message is truncated
 +   and the remainder is lost
 +SeeAlso: AH=04h"MultiDOS",AH=05h"MultiDOS"
 +----------1507-------------------------------
 +INT 15 - VMiX - GET POINTER TO OBJECT CONTROL BLOCK
 + AH = 07h
 + STACK: WORD object type
 +Return: DX:AX??? -> object control block
 +SeeAlso: AH=06h"VMiX",AH=08h"VMiX"
 +----------1507-------------------------------
 +INT 15 - MultiDOS Plus - SPAWN INTERNAL TASK (CREATE NEW THREAD)
 + AH = 07h
 + BX:CX = entry point of new task
 + DX = stack size in paragraphs
 +Return: AH = status
 +     00h successful
 +     01h no free task control blocks
 +     02h no free memory for task's stack
 +Note: execution returns immediately to calling task
 +SeeAlso: AH=08h"MultiDOS",AH=09h"MultiDOS",AH=13h"MultiDOS"
 +----------1508-------------------------------
 +INT 15 - VMiX - GET CHANNEL CONTROL BLOCK
 + AH = 08h
 + STACK: WORD channel ID
 +Return: DX:AX??? -> channel control block
 +SeeAlso: AH=06h"VMiX",AH=07h"VMiX"
 +----------1508-------------------------------
 +INT 15 - MultiDOS Plus - TERMINATE INTERNAL TASK (KILL THREAD)
 + AH = 08h
 +Return: calling task terminated, so execution never returns to caller
 +Notes: an internal task must be terminated with this function rather than a
 +   DOS termination function
 + task's stack space is returned to parent task's memory pool
 +SeeAlso: AH=07h"MultiDOS"
 +----------1509-------------------------------
 +INT 15 - VMiX - GET ID OF QUEUED ELEMENT
 + AH = 09h
 + STACK: WORD queue ID (0 = process queue, 1 = object, 3 = type)
 + WORD subqueue ID
 +Return: AX = ID
 +SeeAlso: AH=0Ah"VMiX"
 +----------1509-------------------------------
 +INT 15 - MultiDOS Plus - CHANGE TASK'S PRIORITY
 + AH = 09h
 + AL = new priority
 +Note: the priority has different meanings depending on whether priority-
 +   based or round-robin scheduling is used
 +SeeAlso: AH=07h"MultiDOS"
 +----------150A-------------------------------
 +INT 15 - VMiX - GET ID OF NEXT QUEUED ELEMENT
 + AH = 0Ah
 + STACK: WORD queue ID (0 = process queue, 1 = object, 3 = type)
 + WORD ID of current element in queue chain
 +Return: AX = ID of next element
 +SeeAlso: AH=09h"VMiX",AH=0Fh"VMiX"
 +----------150A-------------------------------
 +INT 15 - MultiDOS Plus - CHANGE TIME SLICE INTERVAL
 + AH = 0Ah
 + AL = new interval
 +     00h = 55.0 ms (default)
 +     80h = 27.5 ms
 +     40h = 13.75 ms
 +     20h = 6.88 ms
 +     10h = 3.44 ms
 +     08h = 1.72 ms
 +SeeAlso: AH=03h"MultiDOS"
 +----------150B-------------------------------
 +INT 15 - VMiX - GET TOTAL NUMBER OF ACTIVE PROCESSES
 + AH = 0Bh
 +Return: AX = number of active processes
 +SeeAlso: AH=05h"VMiX",AH=0Eh"VMiX"
 +----------150B-------------------------------
 +INT 15 - MultiDOS Plus - FORCE DISPLAY OUTPUT TO PHYSICAL SCREEN MEMORY
 + AH = 0Bh
 +Notes: sets calling task's screen pointer to actual screen memory; the pointer
 +   may be restored with AH=0Ch
 + caller's video mode must be same as foreground task's video mode
 + any text written while in the background will be saved to the
 +   foreground task's virtual screen when it switches to the background
 + useful if a background task wants to display a message on the
 +   foreground screen
 +SeeAlso: AH=0Ch"MultiDOS"
 +
 +==== 0Ch - VMiX - GET POINTER TO PROCESS TSS STACK ====
 +
 + AH = 0Ch
 + STACK: WORD process ID
 +Return: DX:AX??? -> TSS stack store
 +
 +==== 0Ch - MultiDOS Plus - RESTORE OLD VIDEO DISPLAY MEMORY ====
 +
 + AH = 0Ch
 +Note: restores task's screen pointer saved by AH=0Bh; must not be called
 +   unless AH=0Bh has been called first
 +SeeAlso: AH=0Bh"MultiDOS"
 +
 +==== 0Dh - VMiX - START A CHILD PROCESS JOB SHELL ====
 +
 + AH = 0Dh
 + STACK: DWORD ASCIZ string starting with requested I/O channel and
 + followed by standard VMiX shell command string
 +Return: AX = status
 +SeeAlso: AH=0Eh"VMIX"
 +----------150D-------------------------------
 +INT 15 - MultiDOS Plus - DISABLE MULTITASKING
 + AH = 0Dh
 +Note: calling task receives all time slices until AH=0Eh is called; this
 +   allows time-critical events or nonreentrant code to be processed
 +SeeAlso: AH=0Eh"MultiDOS",AH=10h"MultiDOS",AX=101Bh,AH=20h"MultiDOS"
 +----------150E-------------------------------
 +INT 15 - VMiX - TERMINATE PROCESS
 + AH = 0Eh
 + STACK: WORD process ID
 +Return: AX = status
 +SeeAlso: AH=0Bh"VMiX",AH=0Dh"VMIX"
 +----------150E-------------------------------
 +INT 15 - MultiDOS Plus - ENABLE MULTITASKING
 + AH = 0Eh
 +SeeAlso: AH=0Dh"MultiDOS",AX=101Ch,AH=20h"MultiDOS"
 +----------150F-------------------------------
 +INT 15 - SYSTEM - FORMAT UNIT PERIODIC INTERRUPT (PS ESDI drives only)
 + AH = 0Fh
 + AL = phase code
 +     00h reserved
 +     01h surface analysis
 +     02h formatting
 +Return: CF clear if formatting should continue, set if it should terminate
 +Note: called during ESDI drive formatting after each cylinder is completed
 +SeeAlso: INT 13/AH=1Ah
 +----------150F-------------------------------
 +INT 15 - VMiX - GET KEY FIELD OF QUEUED ELEMENT
 + AH = 0Fh
 + STACK: WORD queue ID (0 = process queue, 1 = object q, 3 = type q)
 + WORD ID of element in queue chain
 +Return: AX = key
 +SeeAlso: AH=0Ah"VMiX"
 +----------150F-------------------------------
 +INT 15 - MultiDOS Plus - EXECUTE A MULTIDOS PLUS COMMAND
 + AH = 0Fh
 + DS:BX -> ASCIZ command
 +Return: after command has been processed
 +Notes: specified string is executed as if it had been typed at the MultiDOS
 +   command prompt
 + the task is placed on a queue which MultiDOS examines periodically and
 +   is suspended until MultiDOS has processed the command
 + all lowercase characters up to the first blank are converted to upper
 +   case within the given buffer
 +----------1510-------------------------------
 +INT 15 - VMiX - EXECUTE FUNCTION IN PROTECTED MODE
 + AH = 10h
 + STACK: DWORD pointer to function
 +       N WORDs function args
 +Return: ???
 +----------1510-------------------------------
 +INT 15 - MultiDOS Plus - TEST RESOURCE SEMAPHORE
 + AH = 10h
 + AL = semaphore number (00h-3Fh)
 +Return: AH = status
 +     00h semaphore not in use
 +     01h semaphore owned by another task
 +     02h invalid semaphore number
 +     03h semaphore owned by caller
 +SeeAlso: AH=02h"MultiDOS",AH=0Dh"MultiDOS",AH=1Dh"MultiDOS"
 +----------151000-----------------------------
 +INT 15 - TopView - "PAUSE" - GIVE UP CPU TIME
 + AX = 1000h
 +Return: after other processes run
 +Note: under DESQview, if the process issuing this call has hooked INT 08h,
 +   the current time-slice is set to expire at the next clock tick rather
 +   than immediately
 +SeeAlso: AH=00h"MultiDOS",AX=5305h,INT 21/AH=EEh"DoubleDOS",INT 2F/AX=1680h
 +SeeAlso: INT 60/DI=0106h,INT 62/AH=01h,INT 7A/BX=000Ah,INT 7F/AH=E8h
 +----------151001-----------------------------
 +INT 15 - TopView - "GETMEM" - ALLOCATE "SYSTEM" MEMORY
 + AX = 1001h
 + BX = number of bytes to allocate
 +Return: ES:DI -> block of memory or 0000h:0000h (DV v2.26+)
 +Note: use SETERROR (AX=DE15h) to avoid a user prompt if there is insufficient
 +   common memory
 +SeeAlso: AX=1002h,AX=DE0Ch,AX=DE15h
 +----------151002-----------------------------
 +INT 15 - TopView - "PUTMEM" - DEALLOCATE "SYSTEM" MEMORY
 + AX = 1002h
 + ES:DI -> previously allocated block
 +Return: block freed
 +SeeAlso: AX=1001h,AX=DE0Dh
 +----------151003-----------------------------
 +INT 15 - TopView - "PRINTC" - DISPLAY CHARACTER/ATTRIBUTE ON SCREEN
 + AX = 1003h
 + BH = attribute
 + BL = character
 + DX = segment of object handle for window
 +Note: BX=0 does not display anything, it only positions the hardware cursor
 +----------1510-------------------------------
 +INT 15 - TopView - UNIMPLEMENTED IN DV 2.x
 + AH = 10h
 + AL = 04h thru 12h
 +Return: pops up "Programming error" window in DV 2.x
 +----------151013-----------------------------
 +INT 15 - TopView - "GETBIT" - DEFINE A 2ND-LEVEL INTERRUPT HANDLER
 + AX = 1013h
 + ES:DI -> FAR service routine
 +Return: BX = bit mask indicating which bit was allocated
 +      0000h if no more bits available
 +SeeAlso: AX=1014h,AX=1015h
 +Note: only a few TopView/DESQview API calls are allowed during a hardware
 +   interrupt; if other calls need to be made, the interrupt handler
 +   must schedule a 2nd-level interrupt with "SETBIT" (AX=1015h)
 +----------151014-----------------------------
 +INT 15 - TopView - "FREEBIT" - UNDEFINE A 2ND-LEVEL INTERRUPT HANDLER
 + AX = 1014h
 + BX = bit mask from INT 15/AX=1013h
 +SeeAlso: AX=1013h,AX=1015h
 +----------151015-----------------------------
 +INT 15 - TopView - "SETBIT" - SCHEDULE ONE OR MORE 2ND-LEVEL INTERRUPTS
 + AX = 1015h
 + BX = bit mask for interrupts to post
 +Return: indicated routines will be called: (DV 2.0x) at next task switch
 +    (DV 2.2x) immediately
 +SeeAlso: AX=1013h,AX=1014h
 +Notes: this is one of the few TopView calls which are allowed from a hardware
 +   interrupt handler
 + the handler will be called with ES containing the segment of the handle
 +   of the next task to be executed; on return, ES must be the segment of
 +   a task handle
 +----------151016-----------------------------
 +INT 15 - TopView - "ISOBJ" - VERIFY OBJECT HANDLE
 + AX = 1016h
 + ES:DI = possible object handle
 +Return: BX = FFFFh if ES:DI is a valid object handle
 +      0000h if ES:DI is not
 +SeeAlso: AX=DE14h,AX=DE2Bh
 +----------151017-----------------------------
 +INT 15 - TopView - UNIMPLEMENTED IN DV 2.x
 + AX = 1017h
 +Return: pops up "Programming error" window in DV 2.x
 +----------151018-----------------------------
 +INT 15 - TopView - "LOCATE" - FIND WINDOW AT A GIVEN SCREEN LOCATION
 + AX = 1018h
 + BH = column
 + BL = row
 + ES = segment of object handle for window below which to search
 +      0000h = start search with topmost window
 +Return: ES = segment of object handle for window which is visible at the
 +        indicated position, or covered by indicated window
 +    = 0000h no window
 +SeeAlso: AX=1023h,AX=1024h
 +----------151019-----------------------------
 +INT 15 - TopView - "SOUND" - MAKE TONE
 + AX = 1019h
 + BX = frequency in Hertz (0000h = silence)
 + CX = duration in clock ticks (18.2 ticks/sec)
 +Return: immediately, tone continues to completion
 +Notes: if another tone is already playing, the new tone does not start until
 +   completion of the previous one.  Up to 32 tones may be queued before
 +   the process is blocked until a note completes.
 + in DV 2.00, the lowest tone allowed is 20 Hz
 + if CX = 0, the current note is cancelled; if BX = 0 as well, all queued
 +   notes are also cancelled
 +SeeAlso: INT 16/AH=73h
 +----------15101A-----------------------------
 +INT 15 - TopView - "OSTACK" - SWITCH TO TASK'S INTERNAL STACK
 + AX = 101Ah
 +Return: stack switched
 +Notes: this call may not be nested; a second call must be preceded by a call
 +   to "USTACK" (AX=1025h)
 + while TopView requires many API calls to be executed while on the
 +   task's internal stack, DESQview allows those calls to be executed
 +   regardless of the current stack
 +SeeAlso: AX=1025h
 +----------15101B-----------------------------
 +INT 15 - TopView - "BEGINC" - BEGIN CRITICAL REGION
 + AX = 101Bh
 +Return: task-switching temporarily disabled
 +Notes: will not task-switch until "ENDC" (AX = 101Ch) called unless task
 +   voluntarily releases the CPU (upon regaining the CPU, task-switching
 +   will again be disabled)
 + suspends the caller until DOS is free
 +SeeAlso: AH=0Dh"MultiDOS",AX=101Ch,AX=DE13h,AX=DE1Ch,INT 2F/AX=1681h
 +SeeAlso: INT 60/DI=0602h
 +----------15101C-----------------------------
 +INT 15 - TopView - "ENDC" - END CRITICAL REGION
 + AX = 101Ch
 +Return: task-switching enabled
 +Note: this API call may be made from within a hardware interrupt handler
 +SeeAlso: AX=101Bh,AX=DE13h,AX=DE1Bh,INT 2F/AX=1682h,INT 60/DI=0603h
 +----------15101D-----------------------------
 +INT 15 - TopView - "STOP" - STOP TASK
 + AX = 101Dh
 + ES = segment of object handle for task to be stopped
 +      (== handle of main window for that task)
 +Return: indicated task will not get any CPU time until restarted with AX=101Eh
 +Note: once a task has been stopped, additional "STOP"s are ignored
 +BUG: in DV 2.00, this function is ignored unless the indicated task is the
 +   current task
 +SeeAlso: AX=101Eh,AX=102Bh,AH=12h"VMiX"
 +----------15101E-----------------------------
 +INT 15 - TopView - "START" - START TASK
 + AX = 101Eh
 + ES = segment of object handle for task to be started
 +      (== handle of main window for that task)
 +Return: indicated task is started up again
 +Note: once a task has been started, additional "START"s are ignored
 +SeeAlso: AX=101Dh,AX=102Bh
 +----------15101F-----------------------------
 +INT 15 - TopView - "DISPEROR" - POP-UP ERROR WINDOW
 + AX = 101Fh
 + BX = bit fields
 +      bits 0-12: number of characters to display
 +      bits 13,14: which mouse button may be pressed to remove window
 + 00 = either
 + 01 = left
 + 10 = right
 + 11 = either
 +      bit 15: beep if 1
 + ES:DI -> text of message
 + CH = width of error window (0 = default)
 + CL = height of error window (0 = default)
 + DX = segment of object handle
 +Return: BX = status: 1 = left button, 2 = right, 27 = ESC pressed
 +Note: window remains on-screen until ESC or indicated mouse button is pressed
 +----------151020-----------------------------
 +INT 15 - TopView - UNIMPLEMENTED IN DV v2.00+
 + AX = 1020h
 +Return: pops up "Programming error" window in DV v2.00+
 +----------151021-----------------------------
 +INT 15 - TopView - "PGMINT" - INTERRUPT ANOTHER TASK
 + AX = 1021h
 + BX = segment of object handle for task to interrupt (not self)
 + DX:CX -> FAR routine to jump to next time task is run
 +Return: nothing
 +Notes: the FAR routine is entered with the current ES, DS, SI, DI, and BP
 +   values, using the task's internal stack (see AX=101Ah); only SS:SP
 +   needs to be preserved
 + multiple PGMINTs to a single task are processed last-in first-out
 + if the other task is in a DOS or DV API call, the interruption will
 +   occur on return from that call
 +----------151022BX0000-----------------------
 +INT 15 - TopView - "GETVER" - GET VERSION
 + AX = 1022h
 + BX = 0000h
 +Return: BX nonzero, TopView or compatible loaded
 + (BL = major version, BH = minor version)
 +Notes: TaskView returns BX = 0001h, DESQview v2.00+ returns BX = 0A01h
 +----------151023-----------------------------
 +INT 15 - TopView - "POSWIN" - POSITION WINDOW
 + AX = 1023h
 + BX = segment of object handle for parent window within which to
 +      position the window (0 = full screen)
 + ES = segment of object handle for window to be positioned
 + DL = bit flags
 +      bits 0,1: horizontal position
 + 00 = current
 + 01 = center
 + 10 = left
 + 11 = right
 +      bits 2,3: vertical position
 + 00 = current
 + 01 = center
 + 10 = top
 + 11 = bottom
 +      bit 4: don't redraw screen if set
 +      bits 5-7 not used
 + CH = number of columns to offset from position specified by DL
 + CL = number of rows to offset from position specified by DL
 +Return: nothing
 +----------151024-----------------------------
 +INT 15 - TopView - "GETBUF" - GET VIRTUAL SCREEN INFO
 + AX = 1024h
 + BX = segment of object handle for window
 +       (0 = use default)
 +Return: ES:DI -> virtual screen
 + CX = size of virtual screen in bytes
 + DL = 00h text screen
 +      01h graphics screen
 +SeeAlso: INT 10/AH=FEh,INT 21/AH=2Bh/CX=4445h
 +----------151025-----------------------------
 +INT 15 - TopView - "USTACK" - SWITCH BACK TO USER'S STACK
 + AX = 1025h
 +Return: stack switched back
 +Notes: call only after having switched to internal stack with AX=101Ah
 + while TopView requires many API calls to be executed while on the
 +   task's private stack, DESQview allows those calls to be executed
 +   regardless of the current stack
 +SeeAlso: AX=101Ah
 +----------1510-------------------------------
 +INT 15 - DESQview (TopView???) - UNIMPLEMENTED IN DV 2.x
 + AH = 10h
 + AL = 26h thru 2Ah
 +Return: pops up "Programming error" window in DV 2.x
 +----------15102B-----------------------------
 +INT 15 - DESQview v2.00+ (TopView???) - "POSTTASK" - AWAKEN TASK
 + AX = 102Bh
 + BX = segment of object handle for task
 +Return: nothing
 +Note: forces a task which is waiting on its objectq to continue by placing
 +   the handle for the task on the objectq
 +SeeAlso: AX=101Dh,AX=101Eh
 +----------15102C-----------------------------
 +INT 15 - DESQview v2.00+ (TopView???) - START NEW APPLICATION IN NEW PROCESS
 + AX = 102Ch
 + ES:DI -> contents of .PIF/.DVP file (see below)
 + BX = size of .PIF/.DVP info
 +Return: BX = segment of object handle for new task
 +      0000h on error
 +
 +Format of .PIF/.DVP file:
 +Offset Size Description
 + 00h BYTE reserved (0)
 + 01h BYTE checksum of bytes 02h through 170h
 + 02h 30 BYTEs blank-padded program title
 + 20h WORD maximum memory to allocate to partition in K
 + 22h WORD minimum memory required in K
 + 24h 64 BYTEs ASCIZ program pathname
 + 64h BYTE default drive letter ('A',...)
 + 65h 64 BYTEs ASCIZ default directory name
 + A5h 64 BYTEs ASCIZ program parameters
 + E5h BYTE initial screen mode (0-7) (see also offset 189h)
 + E6h BYTE number of text pages used
 + E7h BYTE number of first interrupt to save
 + E8h BYTE number of last interrupt to save
 + E9h BYTE rows in virtual screen buffer
 + EAh BYTE columns in virtual screen buffer
 + EBh BYTE initial window position, row
 + ECh BYTE initial window position, column
 + EDh WORD system memory in K
 + EFh 64 BYTEs ASCIZ shared program name
 +12Fh 64 BYTEs ASCIZ shared program data file
 +16Fh BYTE flags1
 + bit 7: writes text directly to screen
 + bit 6: runs in foreground only
 + bit 5: uses math coprocessor
 + bit 4: accesses system keyboard buffer directly
 + bits 3-1: reserved (0)
 + bit 0: swappable
 +170h BYTE flags2
 + bit 6: uses command-line parameters in field at A5h
 + bit 5: swaps interrupt vectors
 +---information unique to .DVP files---
 +171h  2 BYTEs keys to use on open menu
 +173h WORD size of script buffer in bytes
 +175h WORD automatically give up CPU after this many tests for keyboard
 + input in one clock tick (default 0 = never)
 +177h BYTE nonzero = "uses own colors"
 +178h BYTE nonzero if application swappable
 +179h  3 BYTEs reserved (0) according to Quarterdeck documentation
 + in actual .DVP files, frequently 01h
 +17Ch BYTE nonzero to automatically close on exit
 +17Dh BYTE nonzero if copy-protect floppy is required
 +---information unique to DESQview 2.0+---
 +17Eh BYTE .DVP version number
 + 00h DESQview v1.2+
 + 01h DESQview v2.0+
 + 02h DESQview v2.2+
 +17Fh BYTE reserved (0)
 +180h BYTE initial number of rows in physical window
 +181h BYTE initial number of columns in physical window
 +182h WORD maximum expanded memory to allow, in K
 +184h BYTE flags3
 + bit 7: automatically assign window position
 + bit 5: maximum memory value has been specified
 + bit 4: disallow "Close" command
 + bit 3: foreground-only when doing graphics
 + bit 2: don't virtualize
 + bit 1: ??? set by DV 2.31 when "Runs in Background" = "D"
 +185h BYTE keyboard conflict level (0-4 for DV<2.26, 00h-0Fh for DV2.26+)
 +186h BYTE number of graphics pages used
 +187h WORD extra system memory size
 +189h BYTE initial screen mode (FFh = default) (overrides offset E5h)
 +---information unique to DESQview 2.2+---
 +18Ah BYTE serial port usage
 + FFh uses all serial ports
 + 00h no serial ports
 + 01h only COM1
 + 02h only COM2
 +18Bh BYTE flags4
 + bit 7: automatically close application on exit if .COM or .EXE
 + specified
 + bit 6: swappable if not using serial ports
 + bit 5: start program with window hidden (v2.26+)
 + bit 4: start program in background (v2.26+)
 + bit 3: virtualize text
 + bit 2: virtualize graphics
 + bit 1: share CPU when foreground
 + bit 0: share EGA when foreground and zoomed
 +18Ch BYTE protection level for 386 machines
 +18Dh 19 BYTEs reserved (0) for regular DESQview
 +---information unique to DESQview/X 1.0---
 +18Dh BYTE flags5
 + bit 0: unused (0)
 + bit 1: don't display DOS window
 + bit 2: don't wait for windows to open
 + bits 3-7: unused (0)
 +18Eh BYTE X keyboard behavior (0-3)
 +18Fh BYTE 01h = uses scalable fonts
 +190h 10 BYTEs unused (0)
 +19Ah WORD??? sum of all record size fields in records starting at 1A0h
 +19Ch  4 BYTEs   signature "XDVP"
 +1A0h  N BYTEs   variable length records
 + Offset Size Description
 + 00h BYTE length of following record, 00h if end of file
 + 01h BYTE always 0??? (or length may be WORD)
 + 02h BYTE record type
 + 01h Script filename, up to 64 characters
 + 05h Starting... values: ASCII copy of fields
 +     as typed into DVPMAN, separated by commas:
 +     starting row, starting column, starting
 + height, starting width
 + 03h  N BYTEs ASCII data
 +----------15102D-----------------------------
 +INT 15 - DESQview v2.00+ - "KMOUSE" - KEYBOARD MOUSE CONTROL
 + AX = 102Dh
 + BL = subfunction
 +      00h determine whether using keyboard mouse
 + Return: BL = 00h using real mouse
 +      01h using keyboard mouse
 +      01h turn keyboard mouse on
 +      02h turn keyboard mouse off
 +----------15102E-----------------------------
 +INT 15 - DESQview v2.40 - ALLOCATE ??? MEMORY
 + AX = 102Eh
 + BX = number of bytes
 +Return: AX = status
 +     0000h successful
 + ES = segment of allocated memory
 +     0001h failed
 +----------1511-------------------------------
 +INT 15 - TopView commands
 + AH = 11h
 + AL = various (except 17h)
 +Note: in DESQview 2.x, these function calls are identical to AH=DEh, so
 +   see those below
 +SeeAlso: AH=DEh
 +----------1511-------------------------------
 +INT 15 - VMiX - EXECUTE SHELL SYSTEM COMMANDS
 + AH = 11h
 + STACK: DWORD pointer to ASCIZ string containing a VMiX shell
 + request (max len = 127)
 +Return: AX = status
 +----------1511-------------------------------
 +INT 15 - MultiDOS Plus - TURN OFF AltZ TOGGLE
 + AH = 11h
 +Note: disables the Alt-Z MultiDOS command/program-selection hotkey
 +SeeAlso: AH=12h"MultiDOS"
 +----------151117BX0000-----------------------
 +INT 15 - DESQview v2.20+ - "ASSERTMAP" - GET/SET MAPPING CONTEXT
 + AX = 1117h
 + BX = 0000h get current mapping context without setting
 +      nonzero set new mapping context
 +Return: BX = mapping context in effect before call
 + interrupts enabled
 +Notes: this function differs from AX = DE17h for DESQview v2.20 through 2.25
 + mapping contexts determine conventional-memory addressability; setting
 +   a mapping context ensures that the associated program and data areas
 +   are in memory for access.  Usable by drivers, TSRs and shared
 +   programs.
 + caller need not be running under DESQview, but must ensure that the
 +   stack in use will not be mapped out by the call
 +SeeAlso: AX=DE17h,INT 2F/AX=1685h
 +----------1511DE-----------------------------
 +INT 15 - DESQview - QEXT.SYS - INSTALLATION CHECK
 + AX = 11DEh
 +Return: CF clear if installed
 +     AX = segment at which QEXT.SYS is located
 +Note: a private entry point may be found by searching the beginning of the
 +   returned segment for the signature string
 +   "QUARTERDECK EXTENDED MEMORY MANAGER 286"; the word immediately
 +   prior to the signature contains the QEXT version number in BCD,
 +   and the word prior to that contains the offset within the QEXT
 +   code segment of the private entry point
 +SeeAlso: INT 67/AH=3Fh
 +
 +Call private entry point with:
 + AH = 00h ???
 + AH = nonzero ???
 +----------1512-------------------------------
 +INT 15 - VMiX - PUT PROCESS TO SLEEP
 + AH = 12h
 + STACK: WORD process ID
 +Return: AX = status
 +SeeAlso: AH=03h"MultiDOS",AX=101Dh,AH=13h"VMiX"
 +----------1512-------------------------------
 +INT 15 - MultiDOS Plus - TURN ON AltZ TOGGLE
 + AH = 12h
 +Note: enables the Alt-Z MultiDOS command/program-selection hotkey
 +SeeAlso: AH=11h"MultiDOS"
 +----------1512--BH00-------------------------
 +INT 15 - TopView - SEND MESSAGE - "HANDLE" - RETURN OBJECT HANDLE
 + AH = 12h
 + BH = 00h
 + BL = which handle to return
 +     00h handle in DWORD on top of stack
 +     01h current task's window handle
 +     02h given task's mailbox handle (task's handle on stack)
 +     03h current task's mailbox handle
 +     04h given task's keyboard handle (task's handle on stack)
 +     05h current task's keyboard object handle
 +     06h given task's OBJECTQ handle (task's handle on stack)
 +     07h current task's OBJECTQ handle
 +     08h   \
 +       thru > return 0000:0000 under DV < 2.26
 +     10h   /
 +     0Ch (2.26+) task owning object with handle in DWORD on top of stack
 +     0Dh (2.26+) task handle of owner (parent) of current task
 +Return: DWORD on top of stack is object handle
 +Note: BL=0Ch,0Dh returns 00000000h if the object is not open (keyboard,
 +   mailbox, panel, pointer, and timer objects) or is an orphan (task,
 +   window)
 +----------1512--BH01-------------------------
 +INT 15 - TopView - SEND MESSAGE - "NEW" - CREATE NEW OBJECT
 + AH = 12h
 + BH = 01h
 + BL = object type to create
 +     00h (DV 2.0x only) handle is DWORD on top of stack
 +     01h (DV 2.0x only) use task's window handle
 +     02h (DV 2.0x only) given task's mailbox (task's handle on stack)
 +     03h (DV 2.0x only) current task's mailbox
 +     04h (DV 2.0x only) given task's keyboard (task's handle on stack)
 +     05h (DV 2.0x only) current task's keyboard object
 +     08h WINDOW class
 +     09h MAILBOX class
 +     0Ah KEYBOARD class
 +     0Bh TIMER object (counts down 32-bit time in 10ms increments)
 +     0Fh POINTER object
 +     10h PANEL object
 + STACK: (if window object or WINDOW class)
 +        DWORD address to jump to (no new task if high word == 0)
 +        DWORD (reserved) 0 = non-task window, FFFFh = task window
 +        DWORD bytes for task's private stack (FFFFh == default of 0100h)
 +        DWORD bytes system memory for input buffer for READ/READN
 + (0 == none, -1 == default--same as logical window size)
 +        DWORD window size, columns
 +        DWORD window size, rows
 +        DWORD length of window title
 +        DWORD address of window title
 +Return: DWORD on top of stack is new object handle
 +Notes: if a new task is created, it is started with
 +   AX = BX = SI = DI = BP = 0
 +   DX:CX = handle of parent task
 +   DS = ES = SS = segment of private stack (and new task's handle)
 + new windows are orphans, inherit the colors/hidden status of the
 +   creating task's window, and are placed in the upper left hand corner
 +   of the screen but not automatically redrawn
 + new keyboards are closed, and have all object bits cleared except for
 +   the hardware cursor bit
 +SeeAlso: AH=12h/BH=02h
 +----------1512--BH02-------------------------
 +INT 15 - TopView - SEND MESSAGE - "FREE" - FREE AN OBJECT
 + AH = 12h
 + BH = 02h
 + BL = object
 +     00h handle in DWORD on top of stack
 + window: close window and free
 + timer: free timer
 + panel: free panel object
 + pointer: free pointer
 +     01h task's window handle - kills task, never returns
 +     02h given task's mailbox (task's handle on top of stack)
 +     03h current task's mailbox
 +     04h given task's keyboard (task's handle on top of stack)
 +     05h current task's keyboard object
 +Notes: when a window is freed, its keyboard and pointer objects are freed;
 +   task windows also free any mailbox, objectq, and panel objects held
 +   by the task and any child tasks
 + if the keyboard being freed is the default keyboard for a task, this
 +   call is equivalent to CLOSE
 + panel and pointer objects are automatically closed if open
 +SeeAlso: AH=12h/BH=01h,AH=12h/BH=0Dh
 +----------1512--BH03-------------------------
 +INT 15 - TopView - SEND MESSAGE - "ADDR" - GET HANDLE OF MESSAGE SENDER
 + AH = 12h
 + BH = 03h
 + BL = object
 +     00h mailbox handle in DWORD on top of stack
 +     02h sender of last msg read from mailbox (task's handle on stack)
 +     03h sender of last msg read from current task's mailbox
 +Return: DWORD on stack is task handle of message sender
 +SeeAlso: AH=12h/BH=00h
 +----------1512--BH03-------------------------
 +INT 15 - DESQview v2.26+ - "CONNECT" - CONNECT TWO WINDOWS
 + AH = 12h
 + BH = 03h
 + BL = window to be connected
 +     00h handle of window to be attached in DWORD on top of stack
 +     01h attach current task's main window
 + STACK: DWORD handle of window to attach to or 00000000h to detach
 +Return: ???
 +Notes: when two windows are connected, both will move if the user moves either
 + multiple windows may be attached to a single window, but each window
 +   may only be attached to one window at a time
 +----------1512--BX0300-----------------------
 +INT 15 - TopView - SEND MESSAGE - "DIR" - GET PANEL FILE DIRECTORY
 + AH = 12h
 + BX = 0300h
 + STACK: DWORD handle of panel object
 +Return: STACK: DWORD length of directory (always multiple of 14 bytes)
 +        DWORD address of directory
 +Note: a null string is returned if the object is not open
 +
 +Format of panel file:
 +Offset Size Description
 + 00h  2 BYTEs C0h C3h
 + 02h BYTE number of panels in file
 + 03h for each panel in file:
 +     8 BYTEs  blank-padded panel name
 +       DWORD  panel offset in file
 +       WORD   panel length
 + data for panels (each consists of one or more window/query/manager
 + streams)
 +     first byte of each panel must be 1Bh, fifth byte must be E5h
 +----------1512--BH04-------------------------
 +INT 15 - TopView - SEND MESSAGE - "READ" - READ NEXT LOGICAL LINE OF WINDOW
 + AH = 12h
 + BH = 04h
 + BL = window to read from
 +     00h handle is DWORD on top of stack
 +     01h use calling task's default window
 +     0Ch (DV 2.26+) default window of task owning handle on top of stack
 +     0Dh (DV 2.26+) default window of parent task of current task
 +Return: STACK: DWORD number of bytes read
 + DWORD address of buffer
 +Notes: reading starts at the current logical cursor position; the cursor is
 +   updated to point at the character following the last one read
 + any translucent blanks (FFh) which are visible on screen are changed
 +   to the character which is seen through them
 + the string produced by the read is placed in an input buffer which may
 +   be reused by the next READ or READN of a window
 + window stream opcodes D8h and D9h determine whether the read returns
 +   characters or attributes
 +SeeAlso: AH=12h/BH=05h"WINDOW",AH=12h/BH=12h
 +----------1512--BH04-------------------------
 +INT 15 - TopView - SEND MESSAGE - "READ" - GET NEXT RECORD FROM OBJECT
 + AH = 12h
 + BH = 04h
 + BL = object
 +     00h handle is DWORD on top of stack
 + mailbox: wait for and get next message
 + keyboard: wait for and get pointer to next input buffer
 + pointer: wait for and get next message
 +     02h get next message from mailbox (task's handle on top of stack)
 +     03h get next message from current task's mailbox
 +     04h get the next input from keyboard (handle on top of stack)
 +     05h get the next input from task's default keyboard
 +     06h wait for input from any object in OBJECTQ (handle on stack)
 +     07h wait for input from any object in task's default OBJECTQ
 +Return: STACK: (if objectq) DWORD handle of object with input
 +        (otherwise)  DWORD number of bytes
 +     DWORD address
 +Notes: for a keyboard in keystroke mode, the input buffer is a single byte
 +   containing the character code as returned by the BIOS; the BIOS scan
 +   code is available via the STATUS call if the character is zero
 + for a keyboard in field mode, the input buffer format is determined
 +   by the field table header for the window the keyboard is attached to
 + keyboard input buffers and mailbox message buffers may be invalidated
 +   by the next READ, ERASE, CLOSE, or FREE message to the same object
 +SeeAlso: AH=12h/BH=05h"OBJECT"
 +
 +Format of pointer message:
 +Offset Size Description
 + 00h WORD row
 + 02h WORD column
 + 04h BYTE status
 + bit 6: set when press/release mode active and button released
 + bits 7-2: number of clicks-1 if multiple-click mode active
 + bits 1,0: button pressed (00=none,01=button1,10=button2)
 + 05h BYTE field number or zero (APILEVEL >= 2.00 only)
 +----------1512--BX0400-----------------------
 +INT 15 - TopView - SEND MESSAGE - "READ" - WAIT FOR TIMER TO EXPIRE
 + AH = 12h
 + BX = 0400h
 + STACK: DWORD timer's handle
 +Return: after timer expires
 + STACK: DWORD time in 1/100 sec after midnight when timer expired
 +----------1512--BX0400-----------------------
 +INT 15 - TopView - SEND MESSAGE - "APPLY" - WRITE PANEL TO WINDOW
 + AH = 12h
 + BX = 0400h
 + STACK: DWORD handle of panel object
 +        DWORD window's handle (or 0 for current task's window)
 +        DWORD length of panel name
 +        DWORD pointer to panel name
 +Return: STACK: DWORD handle of keyboard or 0
 +        DWORD handle of window which was used
 +Notes: status of APPLY may be checked with STATUS message
 + panel MUST have the following format
 +   first byte must be 1Bh (i.e. must start with a stream)
 +   first opcode in stream must be E5h
 +     single byte arg of opcode is interpreted thus:
 +       bits 7,6 11 means create new window
 + 10 means create new field table for existing window
 + 01 means use existing window and field table
 +       bit 5 if set, panel contains a field table 
 + (creates a new keyboard and puts it in field mode)
 +       bit 4 if set, panel contains input fields
 +       bit 3 if set, panel contains select fields but no input fields
 + if the panel contains input or select fields, a keyboard handle is
 +   returned; either the window's current open keyboard or a
 +   newly-created keyboard object.  The caller should read that keyboard
 +   to obtain input from the panel.
 +----------1512--BH05------------------------
 +INT 15 - TopView - SEND MESSAGE - "WRITE" - WRITE TO OBJECT
 + AH = 12h
 + BH = 05h
 + BL = object
 +     00h handle is DWORD on top of stack
 + timer: start timer to end at a specified time
 + keyboard: add input buffer to queue
 + pointer: move pointer icon to specified position
 +     02h send message by value/status=0 to mbox (task's handle on stack)
 +     03h send message by value/status=0 to current task's mailbox
 +     04h add input buffer to KEYBOARD queue (handle on top of stack)
 +     05h add input buffer to task's default KEYBOARD queue
 +     06h add an object to OBJECTQ (handle on top of stack)
 +     07h add an object to task's default OBJECTQ
 + STACK: (if mailbox)  DWORD length
 +      DWORD address
 +        (if keyboard) DWORD status (scan code in keystroke mode)
 +      DWORD length (should be 1 in keystroke mode)
 +      DWORD address
 +        (if objectq)  DWORD handle of object to add
 +        (if timer)    DWORD 1/100ths seconds since midnight (actually
 +    only accurate to 1/18 sec)
 +        (if pointer)  DWORD column relative to origin of window
 +      DWORD row relative to origin of window
 +Notes: under DV 2.2+, failed mailbox writes may return CF set (see AX=DE15h)
 + the data and status written to a keyboard object must match the format
 +   returned by the keyboard object in the current mode
 + the pointer position is scaled according to the current scaling factors
 +SeeAlso: AH=12h/BH=04h
 +----------1512--BH05-------------------------
 +INT 15 - TopView - SEND MESSAGE - "WRITE" - WRITE STRING TO WINDOW
 + AH = 12h
 + BH = 05h
 + BL = window to write to
 +     00h DWORD on top of stack is window handle
 +     01h write string to task's default window
 +     0Ch (DV 2.26+) default window of task owning handle on top of stack
 +     0Dh (DV 2.26+) default window of parent of current task
 + STACK: DWORD object handle if handle passed on stack
 +        DWORD total length of string (high word == 0)
 +        DWORD address of string to display
 +Return: indicated actions performed
 + a. non-control characters are displayed (opcodes DEh and DFh control
 +    whether the attributes are left or changed to the current attrib)
 + b. CR/LF/BS/Tab cause the usual cursor movement
 + c. ESC starts a data structure with additional commands if following
 +    byte is less than 20h; otherwise, it is written to the window
 + STACK: DWORD handle of new window if window stream opcode E6h
 + else nothing
 +
 +Data Structure:
 + MAGIC  DB  1Bh
 + MODE   DB  ?   ; 00h, 01h, 10h, 14h-1Fh legal
 + LENGTH DW  ?   ; length of remainder in bytes
 + var-length fields follow, each an OPCODE followed by
 +      zero or more args
 +
 +MODE 00h (set or display values) "WINDOW STREAM"
 +    Opcodes:args
 + 00h  display 20h blanks with the default attribute
 + 01h-1Fh display OPCODE blanks with the default attribute
 + 20h  display char with default attribute 20h times
 +      BYTE char to repeat
 + 21h-3Fh display char with default attribute OPCODE-20h times
 +      BYTE char to repeat
 + 40h  display 20h blanks with specified attribute
 +      BYTE attribute of blanks
 + 41h-5Fh display OPCODE-40h blanks with specified attribute
 +      BYTE attribute of blanks
 + 60h  display next 20h characters
 +      20h BYTEs characters to display
 + 61h-7Fh display next OPCODE-60h characters
 +      N BYTEs characters to display
 + 80h-87h display N blanks with default attribute
 +      BYTE low 8 bits of 11-bit count (high 3 in low 3 bits of OPCODE)
 +       [000h means 800h]
 + 88h-8Fh display N copies of the character
 +      BYTE low 8 bits of 11-bit count (high 3 in low 3 bits of OPCODE)
 +       [000h means 800h]
 +      BYTE character to repeat
 + 90h-97h display N blanks with specified attribute
 +      BYTE low 8 bits of 11-bit length (high 3 in low 3 bits of OPCODE)
 +       [000h means 800h]
 +      BYTE attribute
 + 98h-9FH display string at logical cursor pos
 +      BYTE low 8 bits of 11-bit length (high 3 in low 3 bits of OPCODE)
 +       [000h means 800h]
 +      N BYTEs string to display
 + A0h  set logical cursor row
 +      BYTE row number (0 is top)
 + A1h  set logical cursor column
 +      BYTE column number (0 is leftmost)
 + A2h  set top edge of scrolling region
 +      BYTE row
 + A3h  set left edge of scrolling region
 +      BYTE column
 + A4h  set row of physical window position
 +      BYTE line
 + A5h  set column of physical window position
 +      BYTE column
 + A6h  set height of physical window
 +      BYTE #rows
 + A7h  set width of physical window
 +      BYTE #columns
 + A8h  set viewport row
 +      BYTE row
 + A9h  set viewport column
 +      BYTE column
 + AAh  set virtual screen height [contents of window unpredictable after]
 +      BYTE rows
 + ABh  set virtual screen width [contents of window unpredictable after]
 +      BYTE columns
 + ACh-AEh unused
 + AFh  set compatible/preferred video modes
 +      BYTE compatibility/preference mask
 + bit 7 compatible with monochrome
 + bit 6 compatible with color text, EGA/VGA graphics
 + bit 5 compatible with medium-resolution CGA graphics
 + bit 4 compatible with high-resolution CGA graphics
 + bit 3 prefer monochrome
 + bit 2 prefer color text, EGA/VGA graphics
 + bit 1 prefer medium-resolution CGA graphics
 + bit 0 prefer high-resolution CGA graphics
 + B0h  move logical cursor down
 +      BYTE #rows (signed, negative values move up)
 + [if #rows=0 and hardware cursor owner, update hw crsr]
 + B1h  move logical cursor right
 +      BYTE #cols (signed, negative values move left)
 + [if #cols=0 and hardware cursor owner, update hw crsr]
 + B2h  shift top edge of scrolling region
 +      BYTE #rows (signed)
 + B3h  shift left edge of scrolling region
 +      BYTE #cols (signed)
 + B4h  shift physical window down
 +      BYTE #lines (signed)
 + B5h  shift physical window right
 +      BYTE #columns (signed)
 + B6h  expand physical window vertically
 +      BYTE #lines (signed)
 + B7h  expand physical window horizontally
 +      BYTE #columns (signed)
 + B8h  adjust viewport row
 +      BYTE #rows (signed)
 + B9h  adjust viewport column
 +      BYTE #columns (signed)
 + BAh  adjust virtual screen height [contents of window unpredict after]
 +      BYTE #rows to increase (signed)
 + BBh  adjust virtual screen width [contents of window unpredictbl after]
 +      BYTE #cols to increase (signed)
 + BCh-BFh reserved (currently unused)
 + C0h  set logical cursor position
 +      BYTE row number (0 is top border)
 +      BYTE column number (0 is left border)
 + C1h  set top left corner of scrolling region
 +      BYTE row
 +      BYTE column
 + C2h  set physical window pos
 +      BYTE upper left row (no top border if 0)
 +      BYTE upper left column (no left border if 0)
 + C3h  set current window size
 +      BYTE #rows
 +      BYTE #cols
 + C4h  set upper left corner of viewport (portion of virtual screen
 +      displayed in window)
 +      BYTE row
 +      BYTE column
 + C5h  set size of virtual screen [contents unpredictable afterwards]
 +      BYTE #rows
 +      BYTE #cols
 + C6h  unused
 + C7h  unused
 + C8h  set logical cursor relative to current position
 +      BYTE number of rows to move down (signed)
 +      BYTE number of columns to move right (signed)
 +   [if #rows=#cols=0 and hardware cursor owner, update hw cursr]
 + C9h  shift top left corner of scrolling region
 +      BYTE #rows (signed)
 +      BYTE #cols (signed)
 + CAh  set window pos relative to current position
 +      BYTE number of rows to shift down (signed)
 +      BYTE number of columns to shift right (signed)
 + CBh  set window size relative to current size
 +      BYTE number of rows to expand (signed)
 +      BYTE number of cols to expand (signed)
 + CCh  shift viewport relative to current position
 +      BYTE rows to shift (signed)
 +      BYTE cols to shift (signed)
 + CDh  resize virtual screen
 +      BYTE #rows to expand (signed)
 +      BYTE #cols to expand (signed)
 + CEh  scroll text when using E8h-EBh/F8h-FBh opcodes (default)
 + CFh  scroll attributes when using  E8h-EBh/F8h-FBh opcodes
 + D0h  allow window frame to extend beyond screen
 + D1h  always display a complete frame, even if window extends beyond 
 +      edge of screen
 + D2h  allow DV to change logical colors on video mode switch (default)
 + D3h  application changes logical attributes
 + D4h  window is visible [must redraw to actually make visible]
 + D5h  window is hidden [must redraw to actually remove]
 + D6h  window has frame (default)
 + D7h  window unframed [must redraw to actually remove frame]
 + D8h  READ/READN will read characters from window (default)
 + D9h  READ/READN will read attributes from window
 + DAh  use logical attributes, which may be remapped
 + attributes
 +    1 normal text
 +    2 highlighted normal text
 +    3 help text
 +    4 highlighted help text
 +    5 error message
 +    6 highlighted error message
 +    7 emphasized text
 +    8 marked text
 +    9-16 are reverse video versions of 1-8
 + DBh  use physical attributes for characters
 + DCh  enable special actions for control characters (default)
 + DDh  disable special control char handling, all chars displayable by
 +      BIOS TTY call
 + DEh  write both character and attribute (default)
 + DFh  write character only, leave attribute untouched
 + E0h  repeat following commands through E1h opcode
 +      BYTE number of times to repeat (00h means 256 times)
 + E1h  end of commands to repeat, start repeating them
 + E2h  set current output color
 +      BYTE color
 + E3h  clear virtual screen from scroll origin to end using current color
 + E4h  redraw window
 + E5h  select menu style
 +      BYTE style (normally 18h)
 + bits 5,4 = 01 use two-letter menu entries for remainder of
 +   this stream
 + E5h  (panel file only)
 +      BYTE modifier
 + bits 7,6 = 11 panel stream creates new window
 + = 10 panel defines new field table for existing window
 + = 01 panel stream uses existing window & field table
 + bit 5 = 1 stream contains a field table (create kyboard object)
 + bit 4 = 1 stream defines input fields (create keyboard object)
 + bit 3 = 1 stream defines select fields but not input fields
 + bit 2 = 1 stream defines exclusive input window (DV 2.2)
 + bit 1 reserved
 + bit 0 reserved
 + E6h  create new window and perform rest of manipulations in new window
 +      BYTE number of rows
 +      BYTE number of columns
 +      Return: DWORD object handle of new window returned on stack at end
 + E7h  no operation
 + E8h  scroll area up (top left corner defined by opcode C1h)
 +      BYTE height
 +      BYTE width
 + E9h  scroll area down (top left corner defined by opcode C1h)
 +      BYTE height
 +      BYTE width
 + EAh  scroll area left (top left corner defined by opcode C1h)
 +      BYTE height
 +      BYTE width
 + EBh  scroll area right (top left corner defined by opcode C1h)
 +      BYTE height
 +      BYTE width
 + ECh  set logical attributes for window contents
 +      BYTE video modes command applies to
 + bit 7 monochrome
 + bit 6 color text, EGA/VGA graphics
 + bit 5 medium-resolution CGA graphics
 + bit 4 high-resolution CGA graphics
 +      BYTE which attributes to set
 + bit 7  if set, copy single following byte to indicated attribs
 + bits 4-6  # of first attribute to change - 1
 + bits 0-3  # of consecutive attributes to change
 +      N BYTEs new attributes
 + EDh  set logical attributes for window frame
 +      BYTE video modes command applies to (see opcode ECh)
 +      BYTE which attributes to set
 + bit 7  if set, copy single following byte to indicated attrs
 + bits 4-6  # of first attribute to change - 1
 + bits 0-3  # of consecutive attributes to change
 +      N BYTEs new attributes
 +   attributes
 +        1 = top left corner
 +        2 = top right corner
 +        3 = bottom left corner
 +        4 = bottom right corner
 +        5 = top edge
 +        6 = bottom edge
 +        7 = left edge
 +        8 = right edge
 + EEh  set characters for window frame
 +      BYTE video modes command applies to (see opcode ECh)
 +      BYTE which characters to set
 + bit 7  if set, copy single following byte to indicated chars
 + bits 4-6  # of first char to change - 1
 + bits 0-3  # of consecutive chars to change
 +      N BYTEs new chars (same relative position as attributes above)
 + EFh  set window name
 +      BYTE length of name (should be in range 0 to logical screen width)
 +      N BYTEs name
 + F0h  clear input field to blanks
 +      BYTE field number
 + F1h  fill input field with character
 +      BYTE field number
 +      BYTE char
 + F2h  set color of input field
 +      BYTE field number (1-N)
 +      BYTE attribute
 + F3h  set initial contents of input field
 +      BYTE field number (1-N)
 +      N BYTEs enough chars to exactly fill field as defined by op FFh
 + F4h  position cursor to start of specific input field
 +      BYTE field number (1-N)
 + F5h  change field table entry
 +      BYTE field number
 +      7-8 BYTEs field table entry (see opcode FFh below)
 + F6h  set field type
 +      BYTE field number
 +      BYTE type
 + 00h inactive
 + 40h output field
 + 80h input field
 + C0h deselected field
 + C2h selected field
 + F7h  "broadcast write" write data to fields with program output bit
 + set in field table entry, in field number order
 +      N BYTEs (total length of all program output fields)
 + F8h  scroll field up a line
 +      BYTE field number
 + F9h  scroll field down a line
 +      BYTE field number
 + FAh  scroll field left
 +      BYTE field number
 + FBh  scroll field right
 +      BYTE field number
 + FCh  set field table header
 +      BYTE number of fields (must be <= existing number of fields)
 +      BYTE screen behavior bits
 + bit 7  reserved
 + bit 6  set if menu items may be selected via keyboard
 + bit 5  set if left mouse button may terminate entry
 + bit 4  set if right mouse button may terminate entry
 + bit 3  if set, select fields return contents or blanks rather
 + than 'Y' or 'N'
 + bit 2  if set, modified bits reset on return to application
 + bits 0,1 = 00 no data returned on read of keyboard
 +    01 data returned as array of chars containing
 + all fields packed together, with no field
 + numbers
 +    10 data returned as numbered variable-length
 + records for all fields
 +    11 data returned as numbered variable-length
 + records for the fields which were modified
 +      BYTE current input field (updated by DESQview)
 +      BYTE current select field (updated by DESQview)
 +      BYTE attribute for select fields when they are pointed at
 +      BYTE attribute for select fields which have been selected
 + FDh  reset modified bit for all fields
 + FEh  reset selected and modified bits for all fields
 + FFh  set up input fields
 +      6 BYTEs table header (see opcode FCh above)
 +      the field table entries, one for each field
 + BYTE start row    \
 + BYTE start column  \ if menu selection and start is to
 + BYTE end row     / right or below end, select from kbd only
 + BYTE end column   /
 + BYTE field type
 +     bits 7,6 = 00 inactive (non-entry) field
 +        01 echos keystrokes input to make menu selection
 +        10 fill-in field
 +        11 select field
 +     bit 5  field can be filled by broadcast write (F7h opcode)
 +     bit 4  reserved
 +     bit 3  reserved
 +     bit 2  reserved
 +     bit 1  set if field selected
 +     bit 0  set if field modified
 + BYTE modifier
 +       if type is fill-in, then bit flags to determine behavior
 +   bit 7 if set, automatically enter CR when field full
 +   bit 6 move to next field when current field is full
 +   bit 5 if set, enter text from right end (for numbers)
 +   bit 4 if set, force input to uppercase
 +   bit 3 if set, clear old contents on first keystroke
 +   bit 2 if set, input returned when cursor moves out
 + of modified field (API level 2.02+)
 +   bit 1 reserved
 +   bit 0 reserved
 +       if select field, first key to press to activate
 +   00h if have to point-&-click or is an extended-ASCII
 +       keystroke (only if two-key menus enabled)
 + BYTE (select field only) normal color of field
 + BYTE second key for select field.  This byte is present iff
 +       two-letter menu entries selected with opcode E5h, and
 +       in that case is present regardless of field type
 +      Note: DESQview uses and updates the actual copy of the information
 +        which is contained in the stream.  Thus this info must remain
 +        intact until after the data entry is complete.
 +
 +MODE 01h "QUERY STREAM" (valid only for those opcodes listed here)
 + A0h return logical cursor row in next byte
 + A1h return logical cursor column in next byte
 + A2h return top row of scrolling region in next byte
 + A3h return left column of scrolling region in next byte
 + A4h return row of physical window origin in next byte
 + A5h return column of physical window origin in next byte
 + A6h return height of physcial window in next byte
 + A7h return width of physical window in next byte
 + A8h return row of viewport origin in next byte
 + A9h return column of viewport origin in next byte
 + AAh return height of virtual screen in next byte
 + ABh return width of virtual screen in next byte
 + AFh return current video mode in next byte
 + C0h return current logical cursor position in next two bytes
 + C1h return top left corner of scrolling region in next two bytes
 + C2h return current window position in next two bytes
 + C3h return current window size in next two bytes
 + C4h return current viewport origin in next two bytes
 + C5h return current virtual screen size in next two bytes
 + D0h \ overwritten with D0h if frames may fall off screen edge
 + D1h /        D1h if frames always displayed entirely
 + D2h \ overwritten with D2h if DESQview controls color palette
 + D3h /        D3h if application changes color palette
 + D4h \ overwritten with D4h if window visible
 + D5h /        D5h if window hidden
 + D6h \ overwritten with D6h if window has frame
 + D7h /        D7h if window unframed
 + D8h \ overwritten with D8h if reading characters from window
 + D9h /        D9h if reading attributes from window
 + DAh \ overwritten with DAh if using logical attributes
 + DBh /        DBh if using physical attributes
 + DCh \ overwritten with DCh if TTY control char interpretation on
 + DDh /        DDh if TTY control char interpretation off
 + DEh \ overwritten with DEh if writing both characters and attributes
 + DFh /        DFh if leaving attributes untouched
 + E2h return current color in next byte
 + ECh get logical attributes for window contents
 +     BYTE execute call if currently in specified video mode
 + bit 7 monochrome
 + bit 6 color text, EGA/VGA graphics
 + bit 5 medium-resolution CGA graphics
 + bit 4 high-resolution CGA graphics
 +     BYTE which attributes to get
 + bit 7 unused???
 + bits 4-6 first attribute to get - 1
 + bits 0-3 # consecutive attributes
 +     N BYTEs buffer to hold attributes
 + EDh get logical attributes for window frame
 +     BYTE execute call if currently in video mode (see opcode ECh)
 +     BYTE which attributes to get
 + bit 7 unused???
 + bits 4-6 first attribute to get - 1
 + bits 0-3 # consecutive attributes
 +     N BYTEs buffer to hold attributes
 + EEh get characters for window frame
 +     BYTE execute call if currently in video mode (see opcode ECh)
 +     BYTE which attributes to get
 + bit 7 unused???
 + bits 4-6 first char to get - 1
 + bits 0-3 # consecutive chars
 +     N BYTEs buffer to hold chars
 + EFh return first N characters of current window name
 +     BYTE    max length of returned name
 +     N BYTEs buffer to hold window name
 + F3h return contents of specified field
 +     BYTE field number
 +     N BYTEs buffer to hold field contents (size exactly equal to field
 +     size)
 + F5h get field table entry
 +     BYTE field number
 +     7-8 BYTEs buffer to hold field table entry
 +        Notes: DV < 2.26 always returns 7 bytes
 +       DV 2.26+ w/ APILEVEL < 2.26 returns 8 bytes iff field
 + table is using 8-byte entries and eighth byte after
 + F5h is E7h (NOP); otherwise, 7 bytes are returned
 +       DV 2.26+ w/ APILEVEL > 2.26 returns 7 or 8 bytes
 + depending on the field table entry size
 + F6h get type of a field
 +     BYTE field number
 +     BYTE type
 + FCh get field table header
 +     6 BYTEs buffer to store header
 +
 +MODE 10h "MANAGER STREAM" (valid only for opcodes listed here)
 + 00h allow window to be moved horizontally
 + 01h allow window to be moved vertically
 + 02h allow window to change width
 + 03h allow window to change height
 + 04h allow window to be scrolled horizontally
 + 05h allow window to be scrolled vertically
 + 06h allow "Close Window" menu selection for application
 + 07h allow "Hide Window" menu selection for application
 + 08h allow application to be suspended ("Rearrange/Freeze")
 + 0Eh allow "Scissors" menu
 + 10h allow DESQview main menu to be popped up
 + 11h allow "Switch Windows" menu
 + 12h allow "Open Window" menu
 + 13h allow "Quit" menu selection
 + 20h-33h opposite of 00h-13h, disallow specified action
 + 40h notify if horizontal position of window changes
 + 41h notify if vertical position of window changes
 + 42h notify if width of window changes
 + 43h notify if height of window changes
 + 44h notify if window scrolled horizontally
 + 45h notify if window scrolled vertically
 + 46h notify if window is closed--program has to clean up and exit itself
 + 47h notify if window is hidden
 + 48h notify if "?" on main menu selected
 + 49h notify if pointer message sent to window
 + 4Ah notify if window is placed in foreground
 + 4Bh notify if window is placed in background
 + 4Ch notify if video mode changes
 + 4Dh notify if "Scissors" menu "Cut" option selected
 + 4Eh notify if "Scissors" menu "Copy" option selected
 + 4Fh notify if "Scissors" menu "Paste" option selected
 + 50h notify if DESQview main menu about to pop up
 + 51h notify if DESQview main menu popped down
 + 60h-71h opposite of 40h-51h: don't notify on specified event
 + 84h attach window to parent task's window (both move together)
 + 85h detach window from parent task's window (may move independently)
 + 86h disable background operation for application
 + 87h enable running in background
 + 88h set minimum size of physical window
 +     BYTE rows
 +     BYTE columns
 + 89h set maximum size of physical window
 +     BYTE rows
 +     BYTE cols
 + 8Ah set primary asynchronous notification routine
 +     DWORD address of routine, 0000h:0000h means none (see also below)
 + 8Bh set async notification parameter
 +     DWORD 32-bit value passed to 8Ah async routine in DS:SI
 + ACh (DV2.2+) perform regular select field attribute processing
 + ADh (DV2.2+) protect attributes in selected field from being lost
 + AEh make window default notify window for owning app (API level 2.00+)
 + AFh set selected field marker character
 +     BYTE character to display at left edge of selected fields
 + BCh set standard field processing mode 
 + BDh set alternate field processing mode (enables cursor pad for menus)
 + BEh disables changing reverse logical attributes with ECh opcode
 + BFh enables changing reverse logical attributes with ECh opcode
 + 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 orphan current window (also hides it)
 + Note: must be last in stream; all subsequent commands ignored
 + C6h show all 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 cancel current window manager operation, remove DV menu, give 
 +     control to topmost application
 + CCh orphan window and give it to the system for use as paste data
 + CEh reorder windows
 +     DWORD pointer to null-terminated list of words
 +   each word is segment of object handle for a window
 + FFh no operation
 +
 +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
 +
 +Asynchronous notification routine defined by manager stream 8Ah called with:
 + ES:DI = handle of window
 + DS:SI is 32-bit value set by 8Bh manager stream opcode
 +    mailbox contains message indicating event
 +       Opcode
 +        40h  horizontal movement
 +    DWORD object handle of window
 +    BYTE new row
 +    BYTE new col
 +        41h  vertical movement
 +    DWORD object handle of window
 +    BYTE new row
 +    BYTE new col
 +        42h  horizontal size change
 +    DWORD object handle of window
 +    BYTE new rows
 +    BYTE new cols
 +        43h  vertical size change
 +    DWORD object handle of window
 +    BYTE new rows
 +    BYTE new cols
 +        44h  scrolled horizontally
 +    DWORD object handle of window
 +    BYTE mouse row within window
 +    BYTE mouse column within window
 +    BYTE field mouse is on, 0 if none
 +    BYTE amount moved: >0 right, <0 left, 0 done
 +        45h  scrolled vertically
 +    DWORD object hande of window
 +    BYTE mouse row within window
 +    BYTE mouse column within window
 +    BYTE field mouse is on, 0 if none
 +    BYTE amount moved: >0 down, <0 up, 0 done
 +        46h  window close request
 +    DWORD object handle of window
 +    BYTE mouse pointer row
 +    BYTE mouse pointer column
 +    BYTE field mouse is on, 0 if none
 +        47h  application's windows hidden
 +        48h  Help for Program selected
 +    DWORD object handle of window
 +    BYTE mouse pointer row
 +    BYTE mouse pointer column
 +    BYTE field mouse is on, 0 if none
 +        49h  pointer message sent to window
 +    DWORD pointer handle which received message
 +        4Ah  switched to window from another ("raise")
 +        4Bh  switched away from the window ("lower")
 +        4Ch  video mode changed
 +    BYTE new BIOS video mode
 +        4Dh  Scissors/cUt selected
 +    DWORD object handle of window
 +    BYTE row of upper left corner
 +    BYTE column of upper left corner
 +    BYTE field number ul corner is in, 0=none
 +    DWORD handle of orphaned window created with
 + copy of data from specified region
 +    BYTE height of region
 +    BYTE width of region
 +        4Eh  Scissors/Copy selected
 +    DWORD object handle of window
 +    BYTE row of upper left corner
 +    BYTE column of upper left corner
 +    BYTE field number ul corner is in, 0=none
 +    DWORD handle of orphaned window created with
 + copy of data from specified region
 +    BYTE height of region
 +    BYTE width of region
 +        4Fh  Scissors/Paste selected
 +    DWORD object handle of window
 +    BYTE row of upper left corner
 +    BYTE column of upper left corner
 +    BYTE field number ul corner is in, 0=none
 +    DWORD handle of orphaned window with data
 +    BYTE height of region
 +    BYTE width of region
 + Note: orphaned data window should be adopted or freed
 + when done
 +        50h  main menu about to pop up
 +        51h  main menu popped down
 +Return: all registers unchanged
 +----------1512--BH06-------------------------
 +INT 15 - DESQview 2.20+ - SEND MESSAGE - "SETPRI" - SET PRIORITY WITHIN OBJECTQ
 + AH = 12h
 + BH = 06h
 + BL = object
 +     00h object handle in DWORD on top of stack
 + mailbox, keyboard, pointer, or timer
 +     04h given task's keyboard (task's handle on top of stack)
 +     05h current task's default keyboard
 + STACK: DWORD new priority of object in task's OBJECTQ 
 +Notes: initially all objects have the same default value.  Should only make 
 +   relative adjustments to this default value.
 + when changing priorities, all objects already on the objectq are
 +   reordered
 +SeeAlso: AH=12h/BH=07h
 +----------1512--BH07-------------------------
 +INT 15 - DESQview 2.20+ - SEND MESSAGE - "GETPRI" - GET PRIORITY WITHIN OBJECTQ
 + AH = 12h
 + BH = 07h
 + BL = object
 +     00h object handle in DWORD on top of stack
 + mailbox, keyboard, pointer, or timer
 +     04h given task's keyboard (task's handle on top of stack)
 +     05h current task's default keyboard
 +Return: STACK: DWORD object priority
 +Note: initially all objects have the same default value.  Should only make 
 +   relative adjustments to this default value.
 +SeeAlso: AH=12h/BH=06h
 +----------1512--BH08-------------------------
 +INT 15 - TopView - SEND MESSAGE - "SIZEOF" - GET OBJECT SIZE
 + AH = 12h
 + BH = 08h
 + BL = object
 +     00h handle in DWORD on top of stack
 + window: total character positions in window
 + timer: elapsed time since timer started
 + pointer: number of messages queued to pointer object
 + panel: number of panels in panel file
 + keyboard: number of input buffers queued
 +     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
 +     0Ch (DV 2.26+) total chars in window owning handle on top of stack
 +     0Dh (DV 2.26+) total chars in parent task's window
 +Return: DWORD on top of stack is result
 +Note: for panel objects, a count of zero is returned if no panel file is open
 +   for the object
 +SeeAlso: AH=12h/BH=04h,AH=12h/BH=09h
 +----------1512--BH09-------------------------
 +INT 15 - TopView - SEND MESSAGE - "LEN" - GET OBJECT LENGTH
 + AH = 12h
 + BH = 09h
 + BL = object
 +     00h handle in DWORD on top of stack
 + window: get chars/line
 + timer: get 1/100 seconds remaining before timer expires
 +     01h get number of chars/line in current task's default window
 +     0Ch (DV 2.26+) get chars/line in window owning handle on top of stk
 +     0Dh (DV 2.26+) get chars/line in parent task's window
 +Return: DWORD on top of stack is length
 +SeeAlso: AH=12h/BH=08h
 +----------1512--BH0A-------------------------
 +INT 15 - TopView - SEND MESSAGE - "ADDTO" - WRITE CHARS AND ATTRIBS TO WINDOW
 + AH = 12h
 + BH = 0Ah
 + BL = window to write to
 +     00h window handle is DWORD on top of stack
 +     01h current task's default window
 +     0Ch (DV 2.26+) default window of task owning handle on top of stack
 +     0Dh (DV 2.26+) default window of parent of current task
 + STACK: DWORD count of attributes
 + DWORD address of attribute string
 + DWORD count of characters
 + DWORD address of character string
 +Notes: if one string is longer than the other, the shorter one will be reused
 +   until the longer one is exhausted
 + the cursor is left just after the last character written
 +SeeAlso: AH=12h/BH=0Bh"WINDOW"
 +----------1512--BH0A-------------------------
 +INT 15 - TopView - SEND MESSAGE - "ADDTO" - SEND MAILBOX MESSAGE/STAT BY VALUE
 + AH = 12h
 + BH = 0Ah
 + BL = mailbox to write to
 +     00h handle is DWORD on top of stack
 +     02h default mailbox of task whose handle is on top of stack
 +     03h current task's default mailbox
 + STACK: DWORD status (low byte)
 + DWORD length of message
 + DWORD address of message
 +Notes: the message is copied into either system or common memory
 + insufficient memory normally causes the process to be aborted; under
 +   DESQview 2.2+, failed writes may return CF set instead (see AX=DE15h)
 +SeeAlso: AH=12h/BH=0Bh"MAILBOX"
 +----------1512--BH0A-------------------------
 +INT 15 - TopView - SEND MESSAGE - "ADDTO" - SET OBJECT BITS
 + AH = 12h
 + BH = 0Ah
 + BL = object
 +     00h handle is DWORD on top of stack
 + timer: start timer for specified interval
 + pointer: set control flags
 + keyboard: set control flags
 +     04h set control flags on KEYBOARD object (handle on top of stack)
 +     05h set control flags on task's default KEYBOARD object
 + STACK: (if timer)   DWORD duration in 1/100 seconds
 +        (otherwise)  DWORD bits to set
 +SeeAlso: AH=12h/BH=0Bh"OBJECT"
 +
 +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-6 unused
 + bit 5  (DV 2.2+) exclusive input
 + bit 4  filter all keys (used with handler established by SETESC)
 + if 0, only keys that would normally be displayed are filtered
 + bit 3  program continues executing while input in progress
 + bit 2  insert mode active for field mode
 + bit 1  hardware cursor displayed when task is hardware cursor owner
 + must be set if keyboard in field mode and field table includes
 + input fields
 + bit 0  keyboard is in field mode rather than keystroke 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  multiple clicks separated by less than 1/3 second are counted
 + and returned in a single message
 + 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  (DV 2.23+) send message with row=FFFFh and col=FFFFh whenever
 + pointer leaves the window
 + bit 0  send message only on button activity, not movement
 +        DV-specific, and INT 15/AX=DE0Fh must have been called first
 +----------1512--BH0B-------------------------
 +INT 15 - TopView - SEND MESSAGE - "SUBFROM" - WRITE ATTRIBUTES TO WINDOW
 + AH = 12h
 + BH = 0Bh
 + BL = window to write attributes to
 +     00h handle is DWORD on top of stack
 +     01h current task's default window
 +     0Ch (DV 2.26+) default window of task owning handle on top of stack
 +     0Dh (DV 2.26+) default window of parent of current task
 + STACK: DWORD number of attributes to write
 + DWORD address of attributes
 +Note: the attributes are written starting at the current cursor position; the
 +   cursor is left just after the last position written
 +SeeAlso: AH=12h/BH=0Ah"WINDOW"
 +----------1512--BH0B-------------------------
 +INT 15 - TopView - SEND MESSAGE - "SUBFROM" - SEND MAILBOX MESSAGE/STAT BY REF
 + AH = 12h
 + BH = 0Bh
 + BL = mailbox to write to
 +     00h handle is DWORD on top of stack
 +     02h default mailbox of task whose handle is on top of stack
 +     03h current task's default mailbox
 + STACK: DWORD status (low byte)
 + DWORD length of message
 + DWORD address of message
 +Notes: only a pointer to the message is stored, but the write may still fail
 +   due to insufficient memory
 + under DV 2.2+, failed mailbox writes may return CF set (see AX=DE15h)
 +SeeAlso: AH=12h/BH=0Ah"MAILBOX"
 +----------1512--BH0B-------------------------
 +INT 15 - TopView - SEND MESSAGE - "SUBFROM" - REMOVE OBJECT FROM OBJECTQ
 + AH = 12h
 + BH = 0Bh
 + BL = OBJECTQ from which to remove all copies of a particular object
 +     06h OBJECTQ of task whose handle is on top of stack
 +     07h task's default OBJECTQ
 + STACK: DWORD handle of object to remove
 +Note: should be sent whenever an object is erased or closed
 +----------1512--BH0B-------------------------
 +INT 15 - TopView - SEND MESSAGE - "SUBFROM" - RESET OBJECT BITS
 + AH = 12h
 + BH = 0Bh
 + BL = object
 +     00h handle is DWORD on top of stack
 + pointer: reset control flags
 + keyboard: reset control flags
 +     04h clear control flags on KEYBOARD object (handle on top of stack)
 +     05h clear control flags on task's default KEYBOARD object
 + STACK: DWORD which bits to clear (see AH=12h/BH=0Ah"OBJECT")
 +SeeAlso: AH=12h/BH=0Ah"OBJECT"
 +----------1512--BH0C-------------------------
 +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 from scroll origin to end
 + 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 char from scrl org to end
 +     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
 +     0Ch (DV 2.26+) fill def window of task owning handle on top of stck
 +     0Dh (DV 2.26+) fill default window of parent of current task
 + 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 or resident panel
 +       DWORD address of filename or resident panel
 + (otherwise)   nothing
 +Notes: if first byte of panel file name is 1Bh, then the "name" IS a panel
 + 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
 + logical cursor is left at scroll origin after filling window
 + the task opening a mailbox becomes its owner, and the only task allowed
 +   to read the mailbox
 + messages are only sent to a pointer object when the mouse is positioned
 +   in the window to which the pointer has been attached
 + there is no need to explicitly open a timer object, as ADDTO and WRITE
 +   messages automatically open the timer
 +SeeAlso: AH=12h/BH=0Dh,AH=12h/BH=14h"LOCK"
 +----------1512--BH0D-------------------------
 +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 and discard queued input
 + pointer:  stop taking input
 + panel:   close
 + mailbox:  close, unlock, and discard any pending messages
 +     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
 +Notes: when an OBJECTQ is closed, each object in the OBJECTQ is sent an
 +   ERASE message (AH=12h/BH=0Eh)
 + when a panel object is closed, the panel file and any panels currently
 +   in use are freed; window and keyboard objects created by APPLY are
 +   not affected, but field mode input ceases
 + open but idle timer objects consume a small amount of CPU time
 +SeeAlso: AH=12h/BH=0Ch,AH=12h/BH=0Eh,AH=12h/BH=14h"LOCK"
 +----------1512--BH0E-------------------------
 +INT 15 - TopView - SEND MESSAGE - "ERASE" - ERASE OBJECT
 + AH = 12h
 + BH = 0Eh
 + BL = object
 +     00h handle is DWORD on top of stack
 + window:   clear from scroll origin to end of window
 + keyboard: discard input
 + timer:   cancel current interval
 + pointer:  discard all pending messages
 + mailbox:  discard all pending messages
 +     01h clear task's default window from scroll origin to end
 +     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
 +     0Ch (DV 2.26+) clear window of task owning handle on top of stack
 +     0Dh (DV 2.26+) clear default window of parent of current task
 +Note: when an OBJECTQ is erased, each object in the OBJECTQ is also erased
 +SeeAlso: AH=12h/BH=02h
 +----------1512--BH0F-------------------------
 +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
 +Notes: if object is a panel object, the status indicates the error code:
 +   00h successful
 +   14h panel name not in panel directory
 +   15h not enough memory to apply panel
 +   16h invalid panel format
 +   17h panel file already open
 +   81h-92h  DOS error codes+80h \  codes > 80h indicate
 +   95h not enough memory to open panel file > that the panel was
 +   98h null panel file name /  not opened
 + if object is a timer, the status is:
 +   00000000h open but not running
 +   40000000h open and running
 +   80000000h closed
 + if object is an OBJECTQ, the status is:
 +   00000000h open
 +   80000000h closed
 + if object is a keyboard in keystroke mode, the status is the extended
 +   character code (scan code) of teh last keystroke
 + if object is a keyboard in field mode, the status indicates the reason
 +   for the last return from the field manager
 +   00h Enter key pressed
 +   01h Button 1 or keystroke selection
 +   02h Button 2
 +   03h validation
 +   04h auto Enter on field
 +   1Bh Escape pressed
 +   46h ^Break pressed
 +   other: extended code for key terminating input
 + the status of mailbox messages sent by the window manager is always 80h
 + the status of a pointer message is the same as the status field in the
 +   message
 +SeeAlso: AH=12h/BH=04h"READ"
 +----------1512--BH10-------------------------
 +INT 15 - TopView - SEND MESSAGE - "EOF" - GET OBJECT EOF STATUS
 + AH = 12h
 + BH = 10h
 + BL = object
 +     00h handle is DWORD on top of stack
 + window: return TRUE if logical cursor past end of window
 + mailbox: ???
 +     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
 +     0Ch (DV 2.26+) check log crsr of window owning handle on top of stk
 +     0Dh (DV 2.26+) check log cursor of window of parent task
 +Return: DWORD on top of stack is status
 +----------1512--BH11-------------------------
 +INT 15 - TopView - SEND MESSAGE - "AT" - POSITION OBJECT CURSOR
 + AH = 12h
 + BH = 11h
 + BL = window for which to move cursor
 +     00h window's handle is DWORD on top of stack
 +     01h task's default window
 +     0Ch (DV 2.26+) default window of task owning handle on top of stack
 +     0Dh (DV 2.26+) default window of parent of current task
 + STACK: DWORD column
 +        DWORD row
 +----------1512--BH11-------------------------
 +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
 +SeeAlso: AX=DE0Eh
 +----------1512--BX1100-----------------------
 +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
 +SeeAlso: AH=12h/BX=1200h
 +----------1512--BH12-------------------------
 +INT 15 - TopView - SEND MESSAGE - "READN" - GET NEXT N OBJECT BYTES
 + AH = 12h
 + BH = 12h
 + BL = window to read from
 +     00h handle is DWORD on top of stack
 +     01h read next N chars or attributes on task's default window
 +     0Ch (DV 2.26+) read window of task owning handle on top of stack
 +     0Dh (DV 2.26+) read default window of parent of current task
 + STACK: DWORD count
 +Return: STACK: DWORD width of screen line
 +        DWORD address
 +        DWORD count actually read
 +Notes: reading starts at the current logical cursor position; the cursor is
 +   updated to point at the character following the last one read
 + any translucent blanks (FFh) which are visible on screen are changed
 +   to the character which is seen through them
 + the string produced by the read is placed in an input buffer which may
 +   be reused by the next READ or READN of a window
 + window stream opcodes D8h and D9h determine whether the read returns
 +   characters or attributes
 +SeeAlso: AH=12h/BH=04h"WINDOW",AH=12h/BH=05h"WINDOW"
 +----------1512--BX1200-----------------------
 +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
 +SeeAlso: AH=12h/BX=1100h
 +----------1512--BH13-------------------------
 +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
 +     0Ch (DV 2.26+) redraw window of task owning handle on top of stack
 +     0Dh (DV 2.26+) redraw default window of parent of current task
 +SeeAlso: AH=12h/BH=05h"WINDOW",AH=12h/BH=0Eh
 +----------1512--BX1300-----------------------
 +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
 +----------1512--BH14-------------------------
 +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 = 00h or extended ASCII code if AL = 00h
 + BL = 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
 + DS:DI -> field table entry for field containing the cursor
 +The filter function should return
 + AH = 00h use keystroke
 +      01h ignore keystroke
 +      FFh beep and ignore keystroke
 +Note: the filter function is not allowed to make INT 15, DOS, or BIOS calls
 +----------1512--BH14-------------------------
 +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
 +SeeAlso: AH=12h/BH=0Dh
 +----------1512--BH15-------------------------
 +INT 15 - DESQview v2.20+ - SEND MESSAGE - "SETFLAGS" - SET OBJECT FLAGS
 + 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 flags
 + if mailbox:
 + bit 0: all mail messages in common memory
 + bit 1: allow write even if closed
 + bit 2: don't erase messages when mailbox closed
 + if keyboard:
 + bit 5: exclusive input when keyboard in use for input
 +Return: nothing
 +Notes: only available if the API level has been set to at least 2.20
 + equivalent to performing SUBFROM and ADDTO calls on the object
 +SeeAlso: AH=12h/BH=0Ah,AH=12h/BH=0Bh,AH=12h/BH=16h
 +----------1512--BH16-------------------------
 +INT 15 - DESQview v2.20+ - SEND MESSAGE - "GETFLAGS" - GET OBJECT FLAGS
 + 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 current control flags
 +Note: only available if the API level has been set to at least 2.20
 +SeeAlso: AH=12h/BH=0Ah,AH=12h/BH=0Bh,AH=12h/BH=15h
 +----------1512--BH17-------------------------
 +INT 15 - DESQview v2.42-2.52 - BUG
 + AH = 12h
 + BH = 17h
 + 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
 +Notes: due to a fencepost error, message 17h is accepted for mailboxes,
 +   keyboards, and pointers, but causes a random branch
 + DESQview v2.50-2.52 are distributed as part of DESQview/X v1.02
 +----------1513-------------------------------
 +INT 15 - VMiX - WAKE PROCESS
 + AH = 13h
 + STACK: WORD process ID
 +Return: AX = status
 +SeeAlso: AH=12h"VMiX"
 +----------1513-------------------------------
 +INT 15 - MultiDOS Plus - GET TASK CONTROL BLOCK
 + AH = 13h
 +Return: BX:AX -> task control block (see below)
 +SeeAlso: AH=15h"MultiDOS"
 +
 +Format of MultiDOS Plus v4.0 task control block:
 +Offset Size Description
 + 00h DWORD pointer to next TCB
 + 04h  8 BYTEs ASCIZ task name
 + 0Ch  2 BYTEs ???
 + 0Eh WORD task PSP segment
 + 10h WORD abort/suspend flags
 + 12h WORD current screen segment (see AH=0Bh,AH=0Ch)
 + 14h WORD priority level (0000h-FFFEh)
 + 16h WORD time slice counter
 + 18h  2 BYTEs ???
 + 1Ah WORD suspend timer value
 + 1Ch WORD stack segment
 + 1Eh WORD stack pointer
 + 20h WORD display type
 + 22h WORD display memory
 + 24h  2 BYTEs ???
 + 26h WORD termination count
 + 28h WORD equipment flag for BIO10 driver
 + 2Ah BYTE background CRT mode
 + 2Bh WORD screen width in columns
 + 2Dh WORD screen size in bytes
 + 2Fh WORD segment of physical screen memory
 + 31h 16 BYTEs eight cursor positions
 + 41h WORD current cursor shape
 + 43h BYTE active display page
 + 44h WORD CRT controller I/O port base
 + 46h  2 BYTEs ???
 + 48h WORD foreground task flag
 + 4Ah  6 BYTEs ???
 + 50h WORD saved video segment (see AH=0Bh,AH=0Ch)
 + 52h DWORD old INT 22
 + 56h DWORD old INT 23
 + 5Ah DWORD old INT 24
 + 5Eh WORD top of memory for task
 + 60h  4 BYTEs ???
 + 64h WORD DTA segment (see INT 21/AH=1Ah)
 + 66h WORD DTA offset
 + 68h  4 BYTEs ???
 + 6Ch BYTE current ANSI.SYS attribute
 + 6Dh BYTE current ANSI.SYS column
 + 6Eh BYTE current ANSI.SYS row
 + 6Fh BYTE current ANSI.SYS display state
 + 70h BYTE maximum ANSI.SYS columns
 + 71h BYTE current ANSI.SYS page
 + 72h WORD saved ANSI.SYS cursor position
 + 74h BYTE ANSI.SYS parameter buffer index
 + 75h BYTE current ANSI.SYS screen mode
 + 76h BYTE ANSI.SYS wrap flag
 + 77h  6 BYTEs ANSI.SYS parameter buffer
 + 7Dh BYTE ANSI.SYS keyboard DSR state
 + 7Eh  7 BYTEs ANSI.SYS keyboard DSR buffer
 + 85h  3 BYTEs ???
 + 88h 16 BYTEs request header for DOS driver calls
 + 98h 14 BYTEs ???
 + A6h WORD segment of EMS map if EMS task
 + A8h WORD flag: task makes EMS calls
 + AAh WORD EMS handle for task
 + ACh WORD keyboard shift state
 + AEh 12 BYTEs ???
 + BAh WORD TCB of parent if child task
 + BCh WORD termination code
 + BEh WORD COM port number
 + C0h  4 BYTEs ???
 + C4h WORD current IRQ number
 + C6h  2 BYTEs ???
 + C8h WORD miscellaneous flag word
 + CAh  2 BYTEs ???
 + CCh DWORD old INT 10
 + D0h WORD EMS alternate map set number
 + D2h 414 BYTEs DOS current disk and directory context (optional)
 +----------1514-------------------------------
 +INT 15 - VMiX - CLEAR WINDOW
 + AH = 14h
 + STACK: WORD top left corner of window
 + WORD bottom right corner of window
 +Return: AX = status
 +SeeAlso: AH=15h"VMiX"
 +----------1514-------------------------------
 +INT 15 - MultiDOS Plus - CHECK IF MultiDOS FOREGROUND OR BACKGROUND
 + AH = 14h
 +Return: AX = current state
 +     0000h MultiDOS Plus command prompt is background task
 +     0001h command prompt is foreground task
 +SeeAlso: AH=0Bh"MultiDOS"
 +----------1515-------------------------------
 +INT 15 - VMiX - SET BANNER WINDOW MESSAGE
 + AH = 15h
 + STACK: DWORD pointer to ASCIZ banner message
 +Return: AX = status
 +SeeAlso: AH=14h"VMiX"
 +----------1515-------------------------------
 +INT 15 - MultiDOS Plus - GET SYSTEM BLOCK
 + AH = 15h
 +Return: BX:AX -> system block (see below)
 +SeeAlso: AH=13h"MultiDOS"
 +
 +Format of MultiDOS Plus 4.0 system block:
 +Offset Size Description
 + 00h WORD segment of system control block
 + 02h WORD redirection flag set by /NOREDIRECT
 + 04h WORD no-INT 10 flag set by /NO10
 + 06h DWORD old INT 10
 + 0Ah DWORD new INT 10
 + 0Eh DWORD pointer to WORD with current TCB offset (see AH=13h)
 + 12h DWORD pointer to WORD with idle task TCB offset
 + 16h DWORD pointer to WORD with foreground TCB offset
 + 1Ah DWORD pointer to WORD with MultiDOS TCB offset
 + 1Eh WORD Task Control Block size
 + 20h WORD number of TCBs
 + 22h WORD flag: EMS present
 + 24h WORD EMS page frame base segment
 + 26h WORD 16K pages in EMS page frame
 + 28h WORD base segment for conventional memory tasks
 + 2Ah WORD conventional memory size in paragraphs
 + 2Ch DWORD pointer to list of queue pointers
 +----------1516-------------------------------
 +INT 15 - VMiX - SET ROOT WINDOW SIZE AND HOME CURSOR
 + AH = 16h
 + STACK: DWORD pointer to I/O Request Packet
 + WORD top left corner of window
 + WORD bottom right corner of window
 +Return: AX = status
 +SeeAlso: AH=17h"VMiX"
 +----------1516-------------------------------
 +INT 15 - MultiDOS Plus - INITIALIZATION
 + AH = 16h
 +Note: used internally during initialization; any other calls will cause
 +   unpredicatable results
 +----------1517-------------------------------
 +INT 15 - VMiX - GET CONSOLE WINDOW COLORS
 + AH = 17h
 +Return: AH = foreground color
 + AL = background color
 +SeeAlso: AH=16h"VMiX",AH=18h"VMiX"
 +----------1517-------------------------------
 +INT 15 - MultiDOS Plus - MAP IRQ
 + AH = 17h
 + AL = IRQ to map (01h-0Fh)
 + BX = offset of task control block (see AH=13h) to associate with IRQ
 +Return: AX = status
 +     0000h successful
 +     other invalid IRQ
 +Note: the EMS map of the specified TCB is associated with the given interrupt
 +SeeAlso: AH=18h"MultiDOS",AH=19h"MultiDOS"
 +----------1518-------------------------------
 +INT 15 - VMiX - SET CONSOLE COLORS
 + AH = 18h
 + STACK: WORD new background/foreground colors
 +Return: AX = color
 +SeeAlso: AH=17h"VMiX"
 +----------1518-------------------------------
 +INT 15 - MultiDOS Plus - UNMAP IRQ
 + AH = 18h
 + AL = IRQ to unmap (01h-0Fh)
 +Return: AX = status
 +     0000h successful
 +     0001h invalid IRQ
 +Note: results are unpredictable if the IRQ has not been mapped
 +SeeAlso: AH=17h"MultiDOS",AH=19h"MultiDOS"
 +----------1519-------------------------------
 +INT 15 - VMiX v2+ - ???
 + AH = 19h
 + STACK: WORD ???
 +Return: ???
 +----------1519-------------------------------
 +INT 15 - MultiDOS Plus - UNMAP ALL IRQs
 + AH = 19h
 +Return: AX destroyed
 +Note: for MultiDOS internal use only
 +SeeAlso: AH=17h"MultiDOS",AH=18h"MultiDOS"
 +----------151A-------------------------------
 +INT 15 - VMiX v2+ - ???
 + AH = 1Ah
 + STACK: 3 WORDs ???
 +Return: ???
 +----------151A-------------------------------
 +INT 15 - MultiDOS Plus - MAP SEMAPHORE NAME TO NUMBER
 + AH = 1Ah
 + DS:SI -> 8-byte name
 +Return: AL = status
 +     00h successful
 + AH = semaphore number (20h-3Fh)
 +     04h out of string space
 +Notes: all eight bytes of the name are significant
 + if the name does not already exist, it is added to the name table and
 +   associated with a free semaphore number
 + names cannot be destroyed
 +SeeAlso: AH=1Bh"MultiDOS",AH=1Ch"MultiDOS",AH=1Dh"MultiDOS"
 +----------151B-------------------------------
 +INT 15 - VMiX v2+ - ???
 + AH = 1Bh
 + STACK: 5 WORDs ???
 +Return: ???
 +----------151B-------------------------------
 +INT 15 - MultiDOS Plus - REQUEST RESOURCE SEMAPHORE BY NAME
 + AH = 1Bh
 + DS:SI -> 8-byte name
 +Return: AH = status
 +     00h successful
 +     02h invalid semaphore number
 +     03h caller already owns semaphore
 +     04h out of string space
 +Notes: (see notes for AH=01h"MultiDOS")
 + equivalent to AH=1Ah followed by AH=01h
 +SeeAlso: AH=01h"MultiDOS",AH=1Ah"MultiDOS",AH=1Ch"MultiDOS",AH=1Dh"MultiDOS"
 +----------151C-------------------------------
 +INT 15 - VMiX v2+ - ???
 + AH = 1Ch
 + STACK: 5 WORDs ???
 +Return: ???
 +----------151C-------------------------------
 +INT 15 - MultiDOS Plus - RELEASE RESOURCE SEMAPHORE BY NAME
 + AH = 1Ch
 + DS:SI -> 8-byte name
 +Return: AH = status
 +     00h successful
 +     01h not semaphore owner
 +     02h invalid semaphore number
 +     04h out of string space
 +Notes: (see notes for AH=02h"MultiDOS")
 + equivalent to AH=1Ah followed by AH=02h
 +SeeAlso: AH=02h"MultiDOS",AH=1Ah"MultiDOS",AH=1Bh"MultiDOS",AH=1Dh"MultiDOS"
 +----------151D-------------------------------
 +INT 15 - VMiX v2+ - ???
 + AH = 1Dh
 + ???
 +Return: ???
 +----------151D-------------------------------
 +INT 15 - MultiDOS Plus - TEST RESOURCE SEMAPHORE BY NAME
 + AH = 1Dh
 + DS:SI -> 8-byte name
 +Return; AH = status
 +     00h semaphore not in use
 +     01h semaphore owned by another task
 +     02h invalid semaphore number
 +     03h caller owns semaphore
 +     04h out of string space
 +Notes: (see notes for AH=10h"MultiDOS")
 + equivalent to AH=1Ah followed by AH=10h
 +SeeAlso: AH=10h"MultiDOS",AH=1Ah"MultiDOS",AH=1Bh"MultiDOS",AH=1Ch"MultiDOS"
 +----------151E-------------------------------
 +INT 15 - VMiX v2+ - ???
 + AH = 1Eh
 + STACK: WORD ???
 +Return: ???
 +----------151E00-----------------------------
 +INT 15 - MultiDOS Plus - CLEAR EVENT COUNTER
 + AX = 1E00h
 + DX = event/trigger number (00h-3Fh)
 +Return: AH = status
 +     00h successful
 +SeeAlso: AX=1E01h,AX=1E02h
 +----------151E01-----------------------------
 +INT 15 - MultiDOS Plus - TRIGGER EVENT
 + AX = 1E01h
 + DX = event/trigger number (00h-3Fh)
 +Return: AH = status
 +     00h successful
 +     01h invalid event/trigger number
 +Notes: schedules any task waiting for event; if no task is waiting, the event
 +   counter is incremented (and will roll over if it was 65535)
 + may be invoked by interrupt handler
 +SeeAlso: AX=1E00h,AX=1E02h
 +----------151E02-----------------------------
 +INT 15 - MultiDOS Plus - WAIT FOR EVENT
 + AX = 1E02h
 + DX = event/trigger number (00h-3Fh)
 +Return: AH = status
 +     00h successful
 +     01h invalid event/trigger number
 +Note: if the event counter is zero, the task is suspended until the event is
 +   triggered with AX=1E01h; else, the counter is decremented and the
 +   call returns immediately
 +SeeAlso: AX=1E00h,AX=1E01h
 +----------151F-------------------------------
 +INT 15 - MultiDOS Plus v4.01 - GET MEMORY PARAMETERS
 + AH = 1Fh
 +Return: BX = first segment of conventional memory
 + DX = first segment of EMS swap frame into which MultiDOS will load
 + programs
 +----------1520-------------------------------
 +INT 15 - MultiDOS Plus v4.01 - CHECK IF MULTITASKING ENABLED
 + AH = 20h
 +Return: AX = current state
 +     0000h multitasking enabled
 +     other TCB of task that disabled multitasking
 +SeeAlso: AH=0Dh"MultiDOS",AH=13h"MultiDOS"
 +----------152000-----------------------------
 +INT 15 - DOS 3+ PRINT.COM - DISABLE CRITICAL REGION FLAG
 + AX = 2000h
 +SeeAlso: AX=2001h
 +----------152001-----------------------------
 +INT 15 - DOS 3+ PRINT.COM - SET CRITICAL REGION FLAG
 + AX = 2001h
 + ES:BX -> byte which is to be incremented while in a DOS call
 +SeeAlso: AX=2000h
 +----------152010-----------------------------
 +INT 15 - OS HOOK - SETUP SYSREQ ROUTINE (AT,XT286,PS50+)
 + AX = 2010h
 + ???
 +Return: ???
 +SeeAlso: AX=2011h
 +----------152011-----------------------------
 +INT 15 - OS HOOK - COMPLETION OF SYSREQ FUNCTION (AT,XT286,PS50+)
 + AX = 2011h
 + ???
 +Return: ???
 +SeeAlso: AX=2010h
 +----------1521-------------------------------
 +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.
 +----------152400-----------------------------
 +INT 15 - Qualitas 386MAX v6.01 - TURN ON ???
 + AX = 2400h
 +Return: CF clear
 + AH = 00h
 +----------152401-----------------------------
 +INT 15 - Qualitas 386MAX v6.01 - TURN OFF ???
 + AX = 2401h
 +Return: CF clear
 + AH = 00h
 +----------152402-----------------------------
 +INT 15 - Qualitas 386MAX v6.01 - GET STATE OF ???
 + AX = 2402h
 +Return: CF clear
 + AH = 00h
 + AL = current state (00h off, 01h on)
 +----------152403-----------------------------
 +INT 15 - Qualitas 386MAX v6.01 - GET ???
 + AX = 2403h
 + ???
 +Return: CF clear
 + AH = 00h
 + BX = bit flags???
 +     bit 0: ???
 +     bit 1: ???
 +Note: reportedly also used by some PS/2 models
 +----------1540-------------------------------
 +INT 15 - SYSTEM - READ/MODIFY PROFILES (CONVERTIBLE)
 + AH = 40h
 + AL = subfunction
 +     00h get system profile in CX and BX
 +     01h set system profile from CX and BX
 +     02h get internal modem profile in BX
 +     03h set internal modem profile from BX
 +----------154000-----------------------------
 +INT 15 - Compaq SLT/286 or Portable 386 - READ LCD/PLASMA TIMEOUT
 + AX = 4000h
 +Return: AX = 4000h
 + CL = 00h timeout disabled
 +    else timeout in minutes
 +SeeAlso: AX=4001h,AX=4600h
 +----------154001CL00-------------------------
 +INT 15 - Compaq SLT/286 or Portable 386 - SET LCD/PLASMA TIMEOUT
 + AX = 4001h
 + CL = 00h timeout disabled
 +    else timeout in minutes
 +Return: AL = 00h timeout modified
 +      01h timeout cannot be modified
 +      40h timeout cannot be modified
 + CL = 00h timeout disabled
 +    else timeout in minutes
 +SeeAlso: AX=4000h,AX=4601h
 +----------1541-------------------------------
 +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
 +     00h means no timeout
 + DX = I/O port address if AL bit 4 set
 + ES:DI -> user byte if AL bit 4 clear
 +----------1542-------------------------------
 +INT 15 - SYSTEM - REQUEST POWER OFF (CONVERTIBLE)
 + AH = 42h
 + AL = 00h to use system profile
 +      01h to force suspend regardless of system profile
 +SeeAlso: AH=44h
 +----------154280-----------------------------
 +INT 15 - Compaq SLT/286 - ENTER STANDBY
 + AX = 4280h
 +Return: AH = 42h
 + CF clear if successful
 + CF set if unable to enter standby
 +SeeAlso: AX=4600h,AX=5307h/BX=0001h/CX=0001h
 +----------1543-------------------------------
 +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
 +----------1544-------------------------------
 +INT 15 - SYSTEM - (DE)ACTIVATE INTERNAL MODEM POWER (CONVERTIBLE)
 + AH = 44h
 + AL = 00h to power off
 +      01h to power on
 +SeeAlso: AH=42h
 +----------154600-----------------------------
 +INT 15 - Compaq SLT/286 - READ POWER CONSERVATION/MODEM CONFIGURATION
 + AX = 4600h
 +Return: AH = modem configuration information
 +     bit 0 powerup state
 +     0 off
 +     1 on
 + 1 modem installed
 + 2 IRQ line assignment
 +     0 IRQ 4
 +     1 IRQ 3
 + 3 COM port assignment
 +     0 = COM 2
 +     1 = COM 1
 + 4 modem state
 +     0 not assigned
 +     1 assigned
 + 5 modem is on
 + AL = power conservation status information
 +     bit 0  power source (0 internal, 1 external)
 +        1-2 low battery state
 +     00 no low battery condition
 +     01 low battery 1
 +     10 reserved
 +     11 low battery 2
 +        3-4 power conservation mode
 +     00 automatic
 +     01 on
 +     10 off
 +     11 reserved
 + BH = default system inactivity timeout (1-21 minutes)
 + BL = current system inactivity timeout (1-21 minutes)
 + CH = default video display inactivity timeout (1-63 minutes)
 + CL = current video display inactivity timeout (1-63 minutes)     
 + DH = default fixed disk drive inactivity timeout (1-21 minutes)
 + DL = current fixed disk drive inactivity timeout (1-21 minutes)
 +SeeAlso: AX=4280h,AX=4601h,INT 77
 +----------154601-----------------------------
 +INT 15 - Compaq SLT/286 - Modify Power Conservation/Modem Configuration
 + AX = 4601h
 + BL = system inactivity timeout (1-21 minutes)
 +    = FFh do not change
 + CL = video display inactivity timeout (1-63 minutes)     
 +    = FFh do not change
 + DL = current fixed disk drive inactivity timeout (1-21 minutes)
 +    = FFh do not change
 + DH = 00h turn modem OFF
 +    = 01h turn modem ON
 +    = FFh do not change modem state
 +Return: CF clear if successful
 +     AH = 00h
 +     BL = current system inactivity timeout (1-21 minutes)
 +     CL = current video display inactivity timeout (1-63 minutes)
 +     DL = current fixed disk drive inactivity timeout (1-21 minutes)
 +     DH = FFh modem state unchanged
 +        = 00h modem turned OFF
 +        = 01h modem turned ON
 + CF set on error
 +     AH = 01h input is out of range
 +        = 02h - No modem present
 +SeeAlso: AX=4600h,INT 77
 +----------154DD4-----------------------------
 +INT 15 - HP 95LX - INSTALLATION CHECK
 + AX = 4DD4h
 +Return: BX = 4850h ("HP") if HP 95LX
 +     CX = ??? (0101h)
 +     DL = ??? (00h)
 +SeeAlso: INT 0B"HP 95LX",INT 0F"HP 95LX",INT 5F/AH=00h,INT 60/DI=0100h
 +SeeAlso: INT 61"HP 95LX"
 +----------154E-------------------------------
 +INT 15 - HP 95LX - ENABLE/DISABLE LIGHT SLEEP
 + AH = 4Eh
 + AL = light sleep
 +     00h disabled
 +     01h enabled
 +Note: when light sleep is disabled, the system will continue running at full
 +   speed; when enabled, it may automatically slow to conserve batteries
 +SeeAlso: INT 06"HP 95LX",INT 60/DI=0100h
 +----------154F-------------------------------
 +INT 15 - OS HOOK - KEYBOARD INTERCEPT (AT model 3x9,XT2,XT286,CONV,PS)
 + AH = 4Fh
 + AL = hardware scan code
 + CF set
 +Return: CF set
 +    AL = hardware scan code
 + CF clear
 +    scan code should be ignored
 +Note: called by INT 9 handler to translate scan codes; the INT 09 code does
 +   not examine the scan code it reads from the keyboard until after
 +   this function returns.  This permits software to rearrange the
 +   keyboard; for example, swapping the CapsLock and Control keys, or
 +   turning the right Shift key into Enter.
 +SeeAlso: INT 09,INT 15/AH=C0h
 +----------155300BX0000-----------------------
 +INT 15 - Advanced Power Management Specification - INSTALLATION CHECK
 + AX = 5300h
 + BX = 0000h (device ID of system BIOS)
 +Return: CF clear if successful
 +     AH = major version (BCD)
 +     AL = minor version (BCD)
 +     BX = 504Dh ("PM")
 +     CX = flags
 +         bit 0: 16-bit protected mode interface supported
 + bit 1: 32-bit protected mode interface supported
 + bit 2: CPU idle call reduces processor speed
 + bit 3: BIOS power management disabled
 + bits 4-7 reserved
 + CF set on error
 +     AH = error code (86h) (see below)
 +
 +Values for error code:
 + 01h power management functionality disabled
 + 02h interface connection already in effect
 + 03h interface not connected
 + 04h real-mode interface not connected
 + 05h 16-bit protected-mode interface already connected
 + 06h 16-bit protected-mode interface not supported
 + 07h 32-bit protected-mode interface already connected
 + 08h 32-bit protected-mode interface not supported
 + 09h unrecognized device ID
 + 0Ah invalid parameter value in CX
 + 0Bh-1Fh reserved for other interface and general errors
 + 20h-3Fh reserved for CPU errors
 + 40h-5Fh reserved for device errors
 + 60h can't enter requested state
 + 61h-7Fh reserved for other system errors
 + 80h no power management events pending
 + 81h-85h reserved for other power management event errors
 + 86h APM not present
 + 87h-9Fh reserved for other power management event errors
 +----------155301BX0000-----------------------
 +INT 15 - Advanced Power Management Specification - CONNECT REAL-MODE INTERFACE
 + AX = 5301h
 + BX = 0000h (device ID of system BIOS)
 +Return: CF clear if successful
 + CF set on error
 +     AH = error code (02h,09h) (see AX=5300h)
 +SeeAlso: AX=5302h,AX=5303h,AX=5304h
 +----------155302BX0000-----------------------
 +INT 15 R - Advanced Power Management Spec - CONNECT 16-BIT PROTMODE INTERFACE
 + AX = 5302h
 + BX = 0000h (device ID of system BIOS)
 +Return: CF clear if successful
 +     AX = real-mode segment base address of protected-mode 16-bit code
 +     segment
 +     BX = offset of entry point
 +     CX = real-mode segment base address of protected-mode 16-bit data
 +     segment
 + CF set on error
 +     AH = error code (05h,06h,09h) (see AX=5300h)
 +Notes: the caller must initialize two consecutive descriptors with the
 +   returned segment base addresses; these descriptors must be valid
 +   whenever the protected-mode interface is called, and will have
 +   their limits arbitrarily set to 64K.
 + the protected mode interface is invoked by making a far call with the
 +   same register values as for INT 15; it must be invoked while CPL=0,
 +   the code segment descriptor must have a DPL of 0, the stack must be
 +   in a 16-bit segment and have enough room for BIOS use and possible
 +   interrupts, and the current I/O permission bit map must allow access
 +   to the I/O ports used for power management.
 + functions 00h-03h are not available from protected mode
 +SeeAlso: AX=5301h,AX=5303h,AX=5304h
 +----------155303BX0000-----------------------
 +INT 15 - Advanced Power Management Spec - CONNECT 32-BIT PROTMODE INTERFACE
 + AX = 5303h
 + BX = 0000h (device ID of system BIOS)
 +Return: CF clear if successful
 +     AX = real-mode segment base address of protected-mode 32-bit code
 +     segment
 +     EBX = offset of entry point
 +     CX = real-mode segment base address of protected-mode 16-bit code
 +     segment
 +     DX = real-mode segment base address of protected-mode 16-bit data
 +     segment
 + CF set on error
 +     AH = error code (07h,08h,09h) (see AX=5300h)
 +Notes: the caller must initialize three consecutive descriptors with the
 +   returned segment base addresses for 32-bit code, 16-bit code, and
 +   16-bit data, respectively; these descriptors must be valid whenever
 +   the protected-mode interface is called, and will have their limits
 +   arbitrarily set to 64K.
 + the protected mode interface is invoked by making a far call to the
 +   32-bit code segment with the same register values as for INT 15; it
 +   must be invoked while CPL=0, the code segment descriptor must have a
 +   DPL of 0, the stack must be in a 32-bit segment and have enough room
 +   for BIOS use and possible interrupts, and the current I/O permission
 +   bit map must allow access to the I/O ports used for power management.
 + functions 00h-03h are not available from protected mode
 +SeeAlso: AX=5301h,AX=5302h,AX=5304h
 +----------155304BX0000-----------------------
 +INT 15 - Advanced Power Management Specification - DISCONNECT INTERFACE
 + AX = 5304h
 + BX = 0000h (device ID of system BIOS)
 +Return: CF clear if successful
 + CF set on error
 +     AH = error code (03h,09h) (see AX=5300h)
 +SeeAlso: AX=5301h,AX=5302h,AX=5303h
 +----------155305-----------------------------
 +INT 15 - Advanced Power Management Specification - CPU IDLE
 + AX = 5305h
 +Return: after system leaves idle state
 + CF clear
 +Notes: call when the system is idle and should be suspended until the next
 +   system event or interrupt
 + should not be called from within a hardware interrupt handler to avoid
 +   reentrance problems
 + if an interrupt causes the system to resume normal processing, the
 +   interrupt may or may not have been handled when the BIOS returns
 +   from this call; thus, the caller should allow interrupts on return
 + interrupt handlers may not retain control if the BIOS allows
 +   interrupts while in idle mode even if they are able to determine
 +   that they were called from idle mode
 + the caller should issue this call continuously in a loop until it needs
 +   to perform some processing of its own
 +SeeAlso: AX=1000h,AX=5306h,INT 2F/AX=1680h
 +----------155306-----------------------------
 +INT 15 - Advanced Power Management Specification - CPU BUSY
 + AX = 5306h
 +Return: CF clear
 +Notes: called to ensure that the system runs at full speed even on systems
 +   where the BIOS is unable to recognize increased activity (especially
 +   if interrupts are hooked by other programs and not chained to the
 +   BIOS)
 + this call may be made even when the system is already running at full
 +   speed, but it will create unnecessary overhead
 + should not be called from within a hardware interrupt handler to avoid
 +   reentrance problems
 +SeeAlso: AX=5305h
 +----------155307-----------------------------
 +INT 15 - Advanced Power Management Specification - SET POWER STATE
 + AX = 5307h
 + BX = device ID (see below)
 + CX = system state ID
 +     0000h ready (not supported for device ID 0001h)
 +     0001h stand-by
 +     0002h suspend
 +     0003h off (not supported for device ID 0001h)
 +     0004h-FFFFh reserved
 +Return: CF clear if successful
 + CF set on error
 +     AH = error code (01h,09h,0Ah,60h) (see AX=5300h)
 +Note: should not be called from within a hardware interrupt handler to avoid
 +   reentrance problems
 +
 +Values for device IDs:
 + 0000h system BIOS
 + 0001h all devices for which the system BIOS manages power
 + 01xxh display (01FFh for all attached display devices)
 + 02xxh secondary storage (02FFh for all attached secondary storage devices)
 + 03xxh parallel ports (03FFh for all attached parallel ports)
 + 04xxh serial ports (04FFh for all attached serial ports)
 + 0500h-FFFFh reserved
 +----------155307BX0001-----------------------
 +INT 15 - Advanced Power Management Specification - SYSTEM STAND-BY
 + AX = 5307h
 + BX = 0001h
 + CX = 0001h
 +Return: CF clear
 +Notes: puts the entire system into stand-by mode; normally called in response
 +   to a System Stand-by Request notification after any necessary
 +   processing, but may also be invoked at the caller's discretion
 + should not be called from within a hardware interrupt handler to avoid
 +   reentrance problems
 + the stand-by state is typically exited on an interrupt
 +SeeAlso: AX=4280h,AX=5307h/BX=0001h/CX=0002h,AX=530Bh
 +----------155307BX0001-----------------------
 +INT 15 - Advanced Power Management Specification - SUSPEND SYSTEM
 + AX = 5307h
 + BX = 0001h
 + CX = 0002h
 +Return: after system is resumed
 + CF clear
 +Notes: puts the entire system into a low-power suspended state; normally
 +   called in response to a Suspend System Request notification after
 +   any necessary processing, but may also be invoked at the caller's
 +   discretion
 + should not be called from within a hardware interrupt handler to avoid
 +   reentrance problems
 + the caller may need to update its date and time values because the
 +   system could have been suspended for a long period of time
 +SeeAlso: AX=5307h/BX=0001h/CX=0001h,AX=530Bh
 +----------155308BXFFFF-----------------------
 +INT 15 - Advanced Power Management Spec - ENABLE/DISABLE POWER MANAGEMENT
 + AX = 5308h
 + BX = FFFFh
 + CX = new state
 +     0000h disabled
 +     0001h enabled
 +Return: CF clear if successful
 + CF set on error
 +     AH = error code (01h,09h,0Ah) (see AX=5300h)
 +Notes: when power management is disabled, the system BIOS will not
 +   automatically power down devices, enter stand-by or suspended mode,
 +   or perform any power-saving actions in response to AX=5305h calls
 + should not be called from within a hardware interrupt handler to avoid
 +   reentrance problems
 +SeeAlso: AX=5309h
 +----------155309BXFFFF-----------------------
 +INT 15 - Advanced Power Management Specification - RESTORE POWER-ON DEFAULTS
 + AX = 5309h
 + BX = FFFFh
 +Return: CF clear if successful
 + CF set on error
 +     AH = error code (09h) (see AX=5300h)
 +Note: should not be called from within a hardware interrupt handler to avoid
 +   reentrance problems
 +SeeAlso: AX=5308h
 +----------15530ABX0001-----------------------
 +INT 15 - Advanced Power Management Specification - GET POWER STATUS
 + AX = 530Ah
 + BX = 0001h
 +Return: CF clear if successful
 +     BH = AC line status
 +         00h off-line
 + 01h on-line
 + FFh unknown
 + other reserved
 +     BL = battery status
 +         00h high
 + 01h low
 + 02h critical
 + 03h charging
 + FFh unknown
 + other reserved
 +     CL = remaining battery life
 +         00h-64h (0-100) percentage of full charge
 + FFh unknown
 + CF set on error
 +     AH = error code (09h) (see AX=5300h)
 +Note: should not be called from within a hardware interrupt handler to avoid
 +   reentrance problems
 +----------15530B-----------------------------
 +INT 15 - Advanced Power Management Specification - GET POWER MANAGEMENT EVENT
 + AX = 530Bh
 +Return: CF clear if successful
 +     BX = event code
 +         0001h system stand-by request
 + 0002h system suspend request
 + 0003h normal resume system notification
 + 0004h critical resume system notification
 + 0005h battery low notification
 + CF set on error
 +     AH = error code (03h,80h) (see AX=5300h)
 +Notes: although power management events are often asynchronous, notification
 +   will not be made until polled via this call to permit software to
 +   only receive event notification when it is prepared to process
 +   power management events; since these events are not very time-
 +   critical, it should be sufficient to poll once or twice per second
 + the critical resume notification is made after the system resumes
 +   from an emergency suspension; normally, the system BIOS only notifies
 +   its partner that it wishes to suspend and relies on the partner to
 +   actually request the suspension, but no notification is made on an
 +   emergency suspension
 + should not be called from within a hardware interrupt handler to avoid
 +   reentrance problems
 +SeeAlso: AX=5307h,AX=5307h/BX=0001h/CX=0001h,AX=5307h/BX=0001h/CX=0002h
 +----------155400-----------------------------
 +INT 15 - Omniview Multitasker - INSTALLATION NOTIFICATION
 + AX = 5400h
 + ES:BX -> device information tables
 + DI:DX -> dispatcher entry point
 +Note: called by OmniView to notify programs loaded before OmniView of state
 +   changes inside OmniView
 +SeeAlso: AX=5407h
 +----------155401-----------------------------
 +INT 15 - Omniview Multitasker - PROCESS CREATION
 + AX = 5401h
 + ES:BX = process handle
 +Note: called by OmniView to notify programs loaded before OmniView of state
 +   changes inside OmniView
 +SeeAlso: AX=5402h
 +----------155402-----------------------------
 +INT 15 - Omniview Multitasker - PROCESS DESTRUCTION
 + AX = 5402h
 + ES:DX = process handle
 +Note: called by OmniView to notify programs loaded before OmniView of state
 +   changes inside OmniView
 +SeeAlso: AX=5401h
 +----------155403-----------------------------
 +INT 15 - Omniview Multitasker - SAVE
 + AX = 5403h
 + ES:DX = process swapping out
 +Note: called by OmniView to notify programs loaded before OmniView of state
 +   changes inside OmniView
 +SeeAlso: AX=5404h
 +----------155404-----------------------------
 +INT 15 - Omniview Multitasker - RESTORE
 + AX = 5404h
 + ES:DX = process swapping in
 +Note: called by OmniView to notify programs loaded before OmniView of state
 +   changes inside OmniView
 +SeeAlso: AX=5403h
 +----------155405-----------------------------
 +INT 15 - Omniview Multitasker - SWITCHING TO BACKGROUND
 + AX = 5405h
 + ES:DX = process swapping in
 +Note: called by OmniView to notify programs loaded before OmniView of state
 +   changes inside OmniView
 +SeeAlso: AX=5406h
 +----------155406-----------------------------
 +INT 15 - Omniview Multitasker - SWITCHING TO FOREGROUND
 + AX = 5406h
 + ES:DX = process swapping in
 +Note: called by OmniView to notify programs loaded before OmniView of state
 +   changes inside OmniView
 +SeeAlso: AX=5405h
 +----------155407-----------------------------
 +INT 15 - Omniview Multitasker - EXIT NOTIFICATION
 + AX = 5407h
 +Note: called by OmniView to notify programs loaded before OmniView of state
 +   changes inside OmniView
 +SeeAlso: AX=5400h
 +----------1580-------------------------------
 +INT 15 - OS HOOK - DEVICE OPEN (AT,XT286,PS)
 + AH = 80h
 + BX = device ID
 + CX = process ID
 + CF clear
 +Return: CF clear if successful
 +     AH = 00h
 + CF set on error
 +     AH = status
 + 80h invalid command (PC,PCjr)
 + 86h function not supported (XT)
 +Note: this function should be hooked by a multitasker which wishes to keep
 +   track of device ownership; the default BIOS handler merely returns
 +   successfully
 +SeeAlso: AH=81h,AH=82h
 +----------1581-------------------------------
 +INT 15 - OS HOOK - DEVICE CLOSE
 + AH = 81h
 + BX = device ID
 + CX = process ID
 + CF clear
 +Return: CF clear if successful
 +     AH = 00h
 + CF set on error
 +     AH = status (see AH=80h)
 +Note: this function should be hooked by a multitasker which wishes to keep
 +   track of device ownership; the default BIOS handler merely returns
 +   successfully
 +SeeAlso: AH=80h,AH=82h
 +----------1582-------------------------------
 +INT 15 - OS HOOK - PROGRAM TERMINATION
 + AH = 82h
 + BX = process ID
 + CF clear
 +Return: CF clear if successful
 +     AH = 00h
 + CF set on error
 +     AH = status (see AH=80h)
 +Notes: closes all devices opened by the given process ID with function 80h
 + this function should be hooked by a multitasker which wishes to keep
 +   track of device ownership; the default BIOS handler merely returns
 +   successfully
 +SeeAlso: AH=80h,AH=81h
 +----------1583-------------------------------
 +INT 15 - BIOS - SET EVENT WAIT INTERVAL (AT,PS50+)
 + AH = 83h
 + AL = subfunction
 +     00h set interval
 + CX:DX = microseconds to delay
 + ES:BX -> byte whose high bit is to be set at end of interval
 +     01h cancel wait interval
 +Return: CF set on error or function already busy
 +     AH = status
 + 80h invalid command (PC,PCjr)
 + 86h function not supported (XT and later)
 + CF clear if successful
 +Note: the resolution of the wait period is 977 microseconds on most systems
 +   because most BIOSes use the 1/1024 second fast interrupt from the AT
 +   real-time clock chip which is available on INT 70
 +SeeAlso: AH=86h,INT 70
 +----------1584-------------------------------
 +INT 15 - BIOS - JOYSTICK SUPPORT (XT after 11/8/82,AT,XT286,PS)
 + AH = 84h
 + DX = subfunction
 +     0000h read joystick switches
 + Return: AL bits 7-4 = switch settings
 +     0001h read positions of joysticks
 + Return: AX = X position of joystick A
 + BX = Y position of joystick A
 + CX = X position of joystick B
 + DX = Y position of joystick B
 +Return: CF set on error
 +     AH = status
 + 80h invalid command (PC,PCjr)
 + 86h function not supported (other)
 + CF clear if successful
 +Notes: if no game port is installed, subfunction 0000h returns AL=00h (all
 +   switches open) and subfunction 0001h returns AX=BX=CX=DX=0000h
 + a 250kOhm joystick typically returns 0000h-01A0h
 +----------1585-------------------------------
 +INT 15 - OS HOOK - SysRq KEY ACTIVITY (AT,PS)
 + AH = 85h
 + AL = 00h SysRq key pressed
 +    = 01h SysRq key released
 + CF clear
 +Return: CF clear if successful
 +     AH = 00h
 + CF set on error
 +     AH = status (see AH=84h)
 +Notes: called by keyboard decode routine
 + the default handler simply returns successfully; programs which wish
 +   to monitor the SysRq key must hook this call
 +SeeAlso: INT 09
 +----------1586-------------------------------
 +INT 15 - BIOS - WAIT (AT,PS)
 + AH = 86h
 + CX:DX = interval in microseconds
 +Return: CF clear if successful (wait interval elapsed)
 + CF set on error or AH=83h wait already in progress
 +     AH = status (see AH=84h)
 +Note: the resolution of the wait period is 977 microseconds on most systems
 +   because most BIOSes use the 1/1024 second fast interrupt from the AT
 +   real-time clock chip which is available on INT 70
 +SeeAlso: AH=83h,INT 70
 +----------1587-------------------------------
 +INT 15 - SYSTEM - COPY EXTENDED MEMORY
 + AH = 87h
 + CX = number of words to copy (max 8000h)
 + ES:SI -> global descriptor table
 +Return: CF set on error
 + CF clear if successful
 + AH = status
 +     00h source copied into destination
 +     01h parity error
 +     02h interrupt error
 +     03h address line 20 gating failed
 +     80h invalid command (PC,PCjr)
 +     86h unsupported function (XT,PS30)
 +Notes: copy is done in protected mode with interrupts disabled
 + this function is incompatible with the OS/2 compatibility box
 +SeeAlso: AH=88h,AH=89h
 +
 +Format of global descriptor table:
 +Offset Size Description
 + 00h 16 BYTEs zeros
 + 10h WORD source segment length in bytes (2*CX-1 or greater)
 + 12h  3 BYTEs 24-bit linear source address, low byte first
 + 15h BYTE source segment access rights (93h)
 + 16h WORD zero
 + 18h WORD destination segment length in bytes (2*CX-1 or greater)
 + 1Ah  3 BYTEs 24-bit linear destination address, low byte first
 + 1Dh BYTE destination segment access rights (93h)
 + 1Eh 18 BYTEs zeros
 +----------1588-------------------------------
 +INT 15 - SYSTEM - GET EXTENDED MEMORY SIZE (286+)
 + AH = 88h
 +Return: CF clear if successful
 +     AX = number of contiguous KB starting at absolute address 100000h
 + CF set on error
 +     AH = status
 + 80h invalid command (PC,PCjr)
 + 86h unsupported function (XT,PS30)
 +Note: TSRs which wish to allocate extended memory to themselves often hook
 +   this call, and return a reduced memory size. They are then free to
 +   use the memory between the new and old sizes at will.
 +SeeAlso: AH=87h
 +----------1589-------------------------------
 +INT 15 - SYSTEM - SWITCH TO PROTECTED MODE
 + AH = 89h
 + BL = interrupt number of IRQ0 (IRQ1-7 use next 7 interrupts)
 + BH = interrupt number of IRQ8 (IRQ9-F use next 7 interrupts)
 + ES:SI -> GDT for protected mode
 +        offset 0h  null descriptor (initialize to zeros)
 +       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 = FFh  error enabling address line 20
 + CF clear if successful
 +    AH = 00h
 +    in protected mode at specified address
 +Note: BL and BH must be multiples of 8
 +SeeAlso: AH=87h,AH=88h,INT 67/AX=DE0Ch
 +----------1590-------------------------------
 +INT 15 - OS HOOK - DEVICE BUSY (AT,PS)
 + AH = 90h
 + AL = device type
 +     00h disk
 +     01h diskette
 +     02h keyboard
 +     03h PS/2 pointing device
 +     21h waiting for keyboard input (Phoenix BIOS)
 +     80h network
 +     FBh digital sound (Tandy)
 +     FCh disk reset (PS)
 +     FDh diskette motor start
 +     FEh printer
 + ES:BX -> request block for type codes 80h through BFh
 + CF clear
 +Return: CF set if wait time satisfied
 + CF clear if driver must perform wait
 +     AH = 00h
 +Notes: 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
 + floppy and hard disk BIOS code uses this call to implement a timeout;
 +   for device types 00h and 01h, a return of CF set means that the
 +   timeout expired before the disk responded.
 + this function should be hooked by a multitasker to allow other tasks
 +   to execute while the BIOS is waiting for I/O completion; the default
 +   handler merely returns with AH=00h and CF clear
 +SeeAlso: AH=91h,INT 13/AH=00h,INT 17/AH=00h,INT 1A/AH=83h
 +----------1591-------------------------------
 +INT 15 - OS HOOK - DEVICE POST (AT,PS)
 + AH = 91h
 + AL = device type (see AH=90h)
 + ES:BX -> request block for type codes 80h through BFh
 + CF clear
 +Return: AH = 00h
 +Note: this function should be hooked by a multitasker to allow other tasks
 +   to execute while the BIOS is waiting for I/O completion; the default
 +   handler merely returns with AH=00h and CF clear
 +SeeAlso: AH=90h
 +----------15BC-------------------------------
 +INT 15 - Phoenix 386 BIOS - DETERMINE CPU SPEED
 + AH = BCh
 +Return: CF clear
 + BYTE 0040h:00B0h set to ??? (43 on my 386/33)
 +Note: reads system timer channel 0 twice, then does calculations on returned
 +   values
 +----------15BF00-----------------------------
 +INT 15 - Rational Systems DOS/16M - ???
 + AX = BF00h
 + ???
 +Return: ???
 +Note: under DESQview/X 1.02 DVDOS4GX.DVR, this call is identical to AX=BF02h
 +SeeAlso: AX=BF02h
 +----------15BF01-----------------------------
 +INT 15 - Rational Systems DOS/16M - ???
 + AX = BF01h
 + ???
 +Return: ???
 +Note: under DESQview/X 1.02 DVDOS4GX.DVR, this call is identical to AX=BF02h
 +SeeAlso: AX=BF02h
 +----------15BF02DX0000-----------------------
 +INT 15 - Rational Systems DOS/16M - INSTALLATION CHECK
 + AX = BF02h
 + DX = 0000h
 +Return: DX = nonzero if installed
 +     DX:SI -> XBRK structure (see below)
 +SeeAlso: AX=BFDEh/BX=0000h
 +SeeAlso: INT 21/AX=FF00h,INT 2F/AH=A1h,INT 2F/AX=F100h,INT 2F/AX=FBA1h
 +
 +Format of XBRK structure:
 +Offset Size Description
 + 00h DWORD linear address of last available byte + 1 ???
 +  ???
 +----------15BFDEBX0000-----------------------
 +INT 15 - DESQview/X - DVDOS4GX.DVR - INSTALLATION CHECK
 + AX = BFDEh
 + BX = 0000h
 +Return: AX = ??? (0003h)
 + BX = FFFFh
 +SeeAlso: AX=BF02h
 +----------15BFDEBX0001-----------------------
 +INT 15 - DESQview/X 1.02 - DVDOS4GX.DVR - GET PROCESS MANAGER NAME
 + AX = BFDEh
 + BX = 0001h
 +Return: BX = 0000h (success)
 + CX:DX -> name of process manager executable
 +SeeAlso: AX=BFDEh/BX=0000h
 +----------15BFDEBX0002-----------------------
 +INT 15 - DESQview/X 1.02 - DVDOS4GX.DVR - SET ???
 + AX = BFDEh
 + BX = 0002h
 + CX:DX -> ???
 +Return: BX = 0000h (success)
 +SeeAlso: AX=BFDEh/BX=0000h,AX=BFDEh/BX=0003h
 +----------15BFDEBX0003-----------------------
 +INT 15 - DESQview/X 1.02 - DVDOS4GX.DVR - GET ???
 + AX = BFDEh
 + BX = 0003h
 +Return: BX = 0000h (success)
 + CX:DX -> ???
 +SeeAlso: AX=BFDEh/BX=0000h,AX=BFDEh/BX=0002h
 +----------15BFDEBX0004-----------------------
 +INT 15 - DESQview/X 1.02 - DVDOS4GX.DVR - GET ???
 + AX = BFDEh
 + BX = 0004h
 +Return: BX = 0000h (success)
 + CX:DX -> ???
 +SeeAlso: AX=BFDEh/BX=0000h
 +----------15BFDEBX0005-----------------------
 +INT 15 - DESQview/X 1.02 - DVDOS4GX.DVR - ???
 + AX = BFDEh
 + BX = 0005h
 + CX = new value for ???
 +Return: BX = 0000h (success)
 + AX = old value of ???
 + DS:SI -> ??? (if AX nonzero on return)
 + ES:DI -> ??? (if AX zero on return)
 +SeeAlso: AX=BFDEh/BX=0000h
 +----------15BFDEBX0006-----------------------
 +INT 15 - DESQview/X 1.02 - DVDOS4GX.DVR - GET ???
 + AX = BFDEh
 + BX = 0006h
 +Return: BX = 0000h (success)
 + AH = interrupt number??? (BEh)
 + CX:DX = ???
 +SeeAlso: AX=BFDEh/BX=0000h,AX=BFDEh/BX=0007h,INT BE"DESQview"
 +----------15BFDEBX0007-----------------------
 +INT 15 - DESQview/X 1.02 - DVDOS4GX.DVR - SET ???
 + AX = BFDEh
 + BX = 0007h
 + CX:DX = ???
 +Return: BX = 0000h (success)
 +SeeAlso: AX=BFDEh/BX=0000h,AX=BFDEh/BX=0006h
 +----------15BFDEBX0008-----------------------
 +INT 15 - DESQview/X 1.02 - DVDOS4GX.DVR - ???
 + AX = BFDEh
 + BX = 0008h
 + CX = ???
 + DS = ???
 +Return: BX = status
 +     0000h successful
 +     AL = ??? (80h or C0h)
 + DX = ??? (0603h) if AL=C0h
 +     0001h failed
 +     AX = 0000h
 +SeeAlso: AX=BFDEh/BX=0000h
 +----------15BFDEBX0009-----------------------
 +INT 15 - DESQview/X 1.02 - DVDOS4GX.DVR - GET PROTECTED MODE PROGRAM LOADER
 + AX = BFDEh
 + BX = 0009h
 +Return: BX = 0000h (success)
 + CX:DX -> full pathname to LOAD32.EXP
 +SeeAlso: AX=BFDEh/BX=0000h
 +----------15BFDEBX000A-----------------------
 +INT 15 - DESQview/X 1.02 - DVDOS4GX.DVR - DECREMENT ???
 + AX = BFDEh
 + BX = 000Ah
 +Return: BX = 0000h (success)
 + AX = new value of ??? counter
 +Note: also resets a variety of values if the counter goes negative
 +SeeAlso: AX=BFDEh/BX=0000h,AX=BFDEh/BX=000Bh
 +----------15BFDEBX000B-----------------------
 +INT 15 - DESQview/X 1.02 - DVDOS4GX.DVR - INCREMENT ???
 + AX = BFDEh
 + BX = 000Bh
 +Return: AX = new value of ??? counter
 +SeeAlso: AX=BFDEh/BX=0000h,AX=BFDEh/BX=000Ah
 +----------15BFDEBX000C-----------------------
 +INT 15 - DESQview/X 1.02 - DVDOS4GX.DVR - ???
 + AX = BFDEh
 + BX = 000Ch
 + CL = ???
 +     00h
 +     nonzero
 +Return: ???
 +SeeAlso: AX=BFDEh/BX=0000h
 +----------15BFDEBX000D-----------------------
 +INT 15 - DESQview/X 1.02 - DVDOS4GX.DVR - ???
 + AX = BFDEh
 + BX = 000Dh
 + ???
 +Return: ???
 +SeeAlso: AX=BFDEh/BX=0000h
 +----------15BFDEBX000E-----------------------
 +INT 15 - DESQview/X 1.02 - DVDOS4GX.DVR - ???
 + AX = BFDEh
 + BX = 000Eh
 + DX:CX -> ???
 +Return: AX = segment of handle for calling task
 + BX = ??? (probably destroyed)
 + DX:CX -> ???
 +SeeAlso: AX=BFDEh/BX=0000h,AX=BFDEh/BX=000Fh,AX=BFDEh/BX=0013h
 +----------15BFDEBX000F-----------------------
 +INT 15 - DESQview/X 1.02 - DVDOS4GX.DVR - ???
 + AX = BFDEh
 + BX = 000Fh
 +Return: AX = segment of handle for calling task
 + BX = ??? (probably destroyed)
 + DX:CX -> ???
 +Note: identical to AX=BFDEh/BX=000Eh with CX:DX = 0000h:0000h
 +SeeAlso: AX=BFDEh/BX=000Eh,AX=BFDEh/BX=0010h
 +----------15BFDEBX0010-----------------------
 +INT 15 - DESQview/X 1.02 - DVDOS4GX.DVR - GET TASK HANDLE
 + AX = BFDEh
 + BX = 0010h
 +Return: AX = segment of caller's task handle
 + BX destroyed
 +SeeAlso: AX=BFDEh/BX=000Fh
 +----------15BFDEBX0011-----------------------
 +INT 15 - DESQview/X 1.02 - DVDOS4GX.DVR - GET ???
 + AX = BFDEh
 + BX = 0011h
 +Return: CX = code segment of DVDOS4GX.DVR
 + BX = ??? (0004h)
 +SeeAlso: AX=BFDEh/BX=0000h
 +----------15BFDEBX0012-----------------------
 +INT 15 - DESQview/X 1.02 - DVDOS4GX.DVR - GET ???
 + AX = BFDEh
 + BX = 0012h
 +Return: DX = code segment of DVDOS4GX.DVR
 + BX = ??? (012Ch)
 + CX = ??? (0006h)
 +SeeAlso: AX=BFDEh/BX=0000h
 +----------15BFDEBX0013-----------------------
 +INT 15 - DESQview/X 1.02 - DVDOS4GX.DVR - GET ???
 + AX = BFDEh
 + BX = 0013h
 +Return: DX:CX -> ???
 +SeeAlso: AX=BFDEh/BX=000Eh
 +----------15BFDEBX0014-----------------------
 +INT 15 - DESQview/X 1.02 - DVDOS4GX.DVR - LOCK ??? MAILBOX
 + AX = BFDEh
 + BX = 0014h
 + CX = index of ??? mailbox
 + (0000h-0004h valid, but no range checking done)
 +Return: AX,BX destroyed
 +SeeAlso: AX=BFDEh/BX=0015h,AX=BFDEh/BX=0017h
 +----------15BFDEBX0015-----------------------
 +INT 15 - DESQview/X 1.02 - DVDOS4GX.DVR - UNLOCK ??? MAILBOX
 + AX = BFDEh
 + BX = 0015h
 + CX = index of ??? mailbox
 + (0000h-0004h valid, but no range checking done)
 +Return: AX,BX destroyed
 +SeeAlso: AX=BFDEh/BX=0014h,AX=BFDEh/BX=0016h
 +----------15BFDEBX0016-----------------------
 +INT 15 - DESQview/X 1.02 - DVDOS4GX.DVR - CHECK IF ??? MAILBOX OWNED
 + AX = BFDEh
 + BX = 0016h
 + CX = index of ??? mailbox
 + (0000h-0004h valid, but no range checking done)
 +Return: AX = status
 +     0000h no one owns mailbox
 +     0001h mailbox has an owner
 + BX destroyed
 +SeeAlso: AX=BFDEh/BX=0015h,AX=BFDEh/BX=0017h
 +----------15BFDEBX0017-----------------------
 +INT 15 - DESQview/X 1.02 - DVDOS4GX.DVR - GET ??? MAILBOX OWNER
 + AX = BFDEh
 + BX = 0017h
 + CX = index of ??? mailbox
 + (0000h-0004h valid, but no range checking done)
 +Return: AX = segment of mailbox owner's handle
 + BX = segment of caller's task handle
 +SeeAlso: AX=BFDEh/BX=0015h,AX=BFDEh/BX=0016h
 +----------15BFDEBXFFFD-----------------------
 +INT 15 - DESQview/X 1.02 - DVDOS4GX.DVR - GET ???
 + AX = BFDEh
 + BX = FFFDh
 +Return: CX:DX = ???
 +SeeAlso: AX=BFDEh/BX=FFFEh
 +----------15BFDEBXFFFE-----------------------
 +INT 15 - DESQview/X 1.02 - DVDOS4GX.DVR - SET ???
 + AX = BFDEh
 + BX = FFFEh
 + CX:DX = ???
 +SeeAlso: AX=BFDEh/BX=FFFDh
 +----------15BFDEBXFFFF-----------------------
 +INT 15 - DESQview/X 1.02 - DVDOS4GX.DVR - NOP
 + AX = BFDEh
 + BX = FFFFh
 +SeeAlso: AX=BFDEh/BX=0000h
 +----------15C0-------------------------------
 +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
 + CF clear on success
 +     ES:BX -> ROM table (see below)
 + AH = status
 +     00h successful
 +     86h unsupported function
 +Notes: the 1/10/86 XT BIOS returns an incorrect value for the feature byte
 + the configuration table is at F000h:E6F5h in 100% compatible BIOSes
 + Dell machines contain the signature "DELL" or "Dell" at absolute FE076h
 +   and a model byte at absolute address FE845h
 + Tandy 1000 machines contain 21h in the byte at F000h:C000h
 + some AST machines contain the string "COPYRIGHT AST RESEARCH" one byte
 +   past the end of the configuration table
 +
 +Format of ROM configuration table:
 +Offset Size Description
 + 00h WORD number of bytes following
 + 02h BYTE model (see below)
 + 03h BYTE submodel (see below)
 + 04h BYTE BIOS revision: 0 for first release, 1 for 2nd, etc.
 + 05h BYTE feature byte 1:
 + bit 7 = DMA channel 3 used by hard disk BIOS
 + bit 6 = 2nd 8259 installed
 + bit 5 = Real-Time Clock installed
 + bit 4 = INT 15/AH=4Fh called upon INT 9h
 + bit 3 = wait for external event supported
 + bit 2 = extended BIOS area allocated (usually at top of RAM)
 + bit 1 = bus is Micro Channel instead of ISA
 + bit 0 reserved
 + 06h BYTE feature byte 2:
 + bit 7 = ???
 + bit 6 = INT 16/AH=09h (keyboard functionality) supported
 + bits 5-0 = ???
 + 07h BYTE feature byte 3:
 + reserved (0)
 + 08h BYTE feature byte 4:
 + reserved (0)
 + 09h BYTE feature byte 5:
 + reserved (0) (IBM)
 + ??? (08h) (Phoenix 386 v1.10)
 +---AWARD BIOS---
 + 0Ah  N BYTEs AWARD copyright notice
 +---Phoenix BIOS---
 + 0Ah BYTE ??? (00h)
 + 0Bh BYTE major version
 + 0Ch BYTE minor version (BCD)
 + 0Dh  4 BYTEs ASCIZ string "PTL" (Phoenix Technologies Ltd)
 +
 +Values for model/submodel/revision:
 +Model  Submdl  Rev BIOS date System
 + FFh * * 04/24/81 PC (original)
 + FFh * * 10/19/81 PC (some bugfixes)
 + FFh * * 10/27/82 PC (HD, 640K, EGA support)
 + FFh 46h ***   ??? Olivetti M15
 + FEh * * 08/16/82 PC XT
 + FEh * * 11/08/82 PC XT and Portable
 + FEh 43h ***   ??? Olivetti M240
 + FEh A6h ???   ??? ??? (checked for by 386MAX v6.01)
 + FDh * * 06/01/83 PCjr
 + FCh * * 01/10/84 AT models 068,099 6 MHz 20MB
 + FCh 00h 01h 06/10/85 AT model  239   6 MHz 30MB
 + FCh 00h <> 01h   ??? 7531/2 Industrial AT
 + FCh 01h 00h 11/15/85 AT models 319,339 8 MHz, Enh Keyb, 3.5"
 + FCh 01h 00h 09/17/87 Tandy 3000
 + FCh 01h 00h 01/15&88 Toshiba T5200/100
 + FCh 01h 00h 12/26*89 Toshiba T1200/XE
 + (Those date characters are not typos)
 + FCh 01h 30h   ??? Tandy 3000NL
 + FCh 01h ???   ??? Compaq 286/386
 + FCh 02h 00h 04/21/86 PC XT-286
 + FCh 04h 00h 02/13/87     ** PS/2 Model 50 (10 MHz/1 ws 286)
 + FCh 04h 03h 04/18/88 PS/2 Model 50Z (10 MHz/0 ws 286)
 + FCh 05h 00h 02/13/87     ** PS/2 Model 60 (10 MHz 286)
 + FCh 06h ???   ??? 7552 "Gearbox"
 + FCh 08h ***   ??? Epson, unknown model
 + FCh 09h 00h   ??? PS/2 Model 25 (10 MHz 286)
 + FCh 09h 02h 06/28/89 PS/2 Model 30-286
 + FCh 0Bh 00h 02/16/90 PS/1 Model 2011 (10 MHz 286)
 + FCh 30h ***   ??? Epson, unknown model
 + FCh 31h ***   ??? Epson, unknown model
 + FCh 33h ***   ??? Epson, unknown model
 + FCh 42h ***   ??? Olivetti M280
 + FCh 45h ***   ??? Olivetti M380 (XP 1, XP3, XP 5)
 + FCh 48h ***   ??? Olivetti M290
 + FCh 4Fh ***   ??? Olivetti M250
 + FCh 50h ***   ??? Olivetti M380 (XP 7)
 + FCh 51h ***   ??? Olivetti PCS286
 + FCh 52h ***   ??? Olivetti M300
 + FCh 81h 00h 01/15/88 Phoenix 386 BIOS v1.10 10a
 + FBh 00h 01h 01/10/86 PC XT, Enh Keyb, 3.5" support
 + FBh 00h 02h 05/09/86 PC XT
 + FBh 4Ch ***   ??? Olivetti M200
 + FAh 00h 00h 09/02/86 PS/2 Model 30 (8 MHz 8086)
 + FAh 00h 01h 12/12/86 PS/2 Model 30
 + FAh 01h 00h   ??? PS/2 Model 25/25L (8 MHz 8086)
 + FAh 4Eh ***   ??? Olivetti M111
 + F9h 00h 00h 09/13/85 PC Convertible
 + F8h 00h 00h 03/30/87     ** PS/2 Model 80 (16MHz 386)
 + F8h 01h 00h 10/07/87 PS/2 Model 80 (20MHz 386)
 + F8h 04h 02h 04/11/88 PS/2 Model 70 20MHz, type 2 system brd
 + F8h 04h 03h 03/17/89 PS/2 Model 70 20MHz, type 2 system brd
 + F8h 09h 00h   ??? PS/2 Model 70 16MHz, type 1 system brd
 + F8h 09h 02h 04/11/88 PS/2 Model 70 some models
 + F8h 09h 03h 03/17/89 PS/2 Model 70 some models
 + F8h 0Bh 00h 01/18/89 PS/2 Model P70 (8573-121) typ 2 sys brd
 + F8h 0Bh 02h 12/16/89 PS/2 Model P70 ??
 + F8h 0Ch 00h 11/02/88 PS/2 Model 55SX (16 MHz 386SX)
 + F8h 0Dh 00h   ??? PS/2 Model 70 25MHz, type 3 system brd
 + F8h 11h 00h 10/01/90 PS/2 Model 90 (25 MHz 486)
 + F8h 13h 00h 10/01/90 PS/2 Model 90 (33 MHz 486)
 + F8h 14h 00h 10/01/90 PS/2 Model 90-AK9 (25 MHz 486)
 + F8h 16h 00h 10/01/90 PS/2 Model 90-AKD (33 MHz 486)
 + F8h 19h 05h   ??? PS/2 Model 35/35LS or 40 (20 MHz 386SX)
 + F8h 1Bh 00h 10/02/89 PS/2 Model 70-486 (25 MHz 486)
 + F8h 1Ch 00h 02/08/90 PS/2 Model 65-121 (16 MHz 386SX)
 + F8h 1Eh 00h 02/08/90 PS/2 Model 55LS (16 MHz 386SX)
 + F8h 23h 01h   ??? PS/2 Model L40 (20 MHz 386SX)
 + F8h 25h 06h   ??? PS/2 Model M57 (20 MHz 386SLC)
 + F8h 26h 01h   ??? PS/2 Model 57 (20 MHz 386SX)
 + F8h 2Ah 00h   ??? PS/2 Model 95 (50 MHz 486)
 + F8h 2Bh 00h   ??? PS/2 Model 90 (50 MHz 486)
 + F8h 2Ch 01h   ??? PS/2 Model 95 (20 MHz 486SX)
 + F8h 2Dh 00h   ??? PS/2 Model 90 (20 MHz 486SX)
 + F8h 2Eh 01h   ??? PS/2 Model 95 (20 MHz 486SX + 487SX)
 + F8h 2Fh 00h   ??? PS/2 Model 90 (20 MHz 486SX + 487SX)
 + F8h 30h 00h   ??? PS/1 Model 2121 (16 MHz 386SX)
 + F8h 50h 00h   ??? PS/2 Model P70 (8573) (16 MHz 386)
 + F8h 50h 01h 12/16/89 PS/2 Model P70 (8570-031)
 + F8h 52h 00h   ??? PS/2 Model P75 (33 MHz 486)
 + F8h 61h ***   ??? Olivetti P500
 + F8h 62h ***   ??? Olivetti P800
 + F8h 80h 00h   ??? PS/2 Model 80 (25 MHz 386)
 + F8h 80h 01h 11/21/89 PS/2 Model 80-A21
 + F8h ??? ???   ??? PS/2 Model 90 (25 MHz 486SX)
 + F8h ??? ???   ??? PS/2 Model 95 (25 MHz 486SX)
 + F8h ??? ???   ??? PS/2 Model 90 (25 MHz 486SX + 487SX)
 + F8h ??? ???   ??? PS/2 Model 95 (25 MHz 486SX + 487SX)
 + 9Ah * *   ??? Compaq XT/Compaq Plus
 + 30h ??? ???   ??? Sperry PC
 + 2Dh * *   ??? Compaq PC/Compaq Deskpro
 + ??? 56h ???   ??? Olivetti, unknown model
 + ??? 74h ???   ??? Olivetti, unknown model
 +    * This BIOS call is not implemented in these early versions.
 +      Read Model byte at F000h:FFFEh and BIOS date at F000h:FFF5h.
 +   ** These BIOS versions require the DASDDRVR.SYS patches.
 +  *** These Olivetti and Epson machines store the submodel in the byte at
 +  F000h:FFFDh.
 +
 +Values for Dell model byte:
 + 02h Dell 200
 + 03h Dell 300
 + 05h Dell 220
 + 06h Dell 310
 + 07h Dell 325
 + 09h Dell 310A
 + 0Ah Dell 316
 + 0Bh Dell 220E
 + 0Ch Dell 210
 + 0Dh Dell 316SX
 + 0Eh Dell 316LT
 + 0Fh Dell 320LX
 + 11h Dell 425E
 +----------15C1-------------------------------
 +INT 15 - SYSTEM - RETURN EXTENDED-BIOS DATA-AREA SEGMENT ADDRESS (PS)
 + AH = C1h
 +Return: CF set on error
 + CF clear if successful
 +     ES = segment of data area
 +SeeAlso: AH=04h"ABIOS"
 +----------15C200BH00-------------------------
 +INT 15 - SYSTEM - POINTING DEVICE BIOS INTERFACE (PS) - ENABLE/DISABLE
 + AX = C200h
 + BH = 00h disable
 +      01h enable
 +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
 +----------15C201-----------------------------
 +INT 15 - SYSTEM - POINTING DEVICE BIOS INTERFACE (PS) - RESET
 + AX = C201h
 +Return: CF set on error
 +     AH = status (see AX=C200h)
 + CF clear if successful
 +     BH = device ID
 +SeeAlso: INT 33/AX=0000h
 +----------15C202-----------------------------
 +INT 15 - SYSTEM - POINTING DEVICE BIOS INTERFACE (PS) - SET SAMPLING RATE
 + AX = C202h
 + BH = sampling rate
 +     00h 10/second
 +     01h 20/second
 +     02h 40/second
 +     03h 60/second
 +     04h 80/second
 +     05h 100/second
 +     06h 200/second
 +Return: CF set on error
 +     AH = status (see AX=C200h)
 +SeeAlso: INT 33/AX=001Ch
 +----------15C203-----------------------------
 +INT 15 - SYSTEM - POINTING DEVICE BIOS INTERFACE (PS) - SET RESOLUTION
 + AX = C203h
 + BH = resolution
 +     00h one count per mm
 +     01h two counts per mm
 +     02h four counts per mm
 +     03h eight counts per mm
 +Return: CF set on error
 +     AH = status (see AX=C200h)
 +----------15C204-----------------------------
 +INT 15 - SYSTEM - POINTING DEVICE BIOS INTERFACE (PS) - GET TYPE
 + AX = C204h
 +Return: CF set on error
 +     AH = status (see AX=C200h)
 + CF clear if successful
 +     BH = device ID
 +----------15C205-----------------------------
 +INT 15 - SYSTEM - POINTING DEVICE BIOS INTERFACE (PS) - INITIALIZE
 + AX = C205h
 + BH = data package size (1 - 8 bytes)
 +Return: CF set on error
 +     AH = status (see AX=C200h)
 +SeeAlso: AX=C201h
 +----------15C206-----------------------------
 +INT 15 - SYSTEM - POINTING DEVICE BIOS INTERFACE (PS) - GET/SET SCALING FACTOR
 + AX = C206h
 + BH = subfunction
 +     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 AX=C203h)
 + DL = sample rate, reports per second
 +     01h set scaling at 1:1
 +     02h set scaling at 2:1
 +Return: CF set on error
 +     AH = status (see AX=C200h)
 +----------15C207-----------------------------
 +INT 15 - SYSTEM - POINTING DEVICE BIOS INTERFACE (PS) - SET DEVICE HANDLER ADDR
 + AX = C207h
 + ES:BX -> FAR user device handler
 +Return: CF set on error
 +     AH = status (see AX=C200h)
 +SeeAlso: INT 33/AX=000Ch
 +----------15C3------------------------------
 +INT 15 - SYSTEM - ENABLE/DISABLE WATCHDOG TIMEOUT (PS50+)
 + AH = C3h
 + AL = 00h disable
 +      01h enable
 + BX = timer counter
 +Return: CF set on error
 + CF clear if successful
 +Note: the watchdog timer generates an NMI
 +----------15C4-------------------------------
 +INT 15 - SYSTEM - 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)
 +----------15C5-------------------------------
 +INT 15 U - OS HOOK - ROM BIOS TRACING CALLOUT (PS30/286,PS50Z,PS95)
 + AH = C5h
 + AL = interrupt being invoked
 +     01h INT 19
 +     02h INT 14
 +     03h INT 16
 +     04h INT 40 (floppy INT 13)
 +     05h INT 17
 +     06h INT 10
 +     07h INT 12
 +     08h INT 11
 +     09h INT 1A
 +Return: all registers except AX must be preserved
 +Notes: called as the very first action of the indicated ROM BIOS interrupt
 +   handlers on the PS/2 Models 30/286, 50Z, and 95
 + default handler does nothing and returns CF clear for the above
 +   subfunctions, CF set and AH=86h for all other subfunctions
 + value of AX passed to the original interrupt handler is pushed on
 +   stack immediately prior to call
 +----------15C6-------------------------------
 +INT 15 U - PS/2 Model 95 - ???
 + AH = C6h
 + ???
 +Return: ???
 +----------15C7-------------------------------
 +INT 15 U - PS/2 Model 95 - ???
 + AH = C7h
 + ???
 +Return: ???
 +----------15C8-------------------------------
 +INT 15 U - PS/2 Model 95 - ???
 + AH = C8h
 + ???
 +Return: ???
 +----------15C9-------------------------------
 +INT 15 U - newer PS/2; various BIOSes - GET CPU TYPE AND MASK REVISION
 +        AH = C9h
 + AL = 10h (may be required on some non-PS BIOSes)
 +Return: AH = 00h
 + CH = CPU type
 +     03h 80386
 +            04h 80486
 +        CL = mask revision
 +     23h 386SX
 +Notes: the BIOS must save DX at startup in order to be able to support this
 +   call; PS/2 Models 56, 57, 90, and 95 are known to support it
 + the PS/2 BIOS merely reads CMOS locations 190h (type) and 191h (rev)
 +----------15CA-------------------------------
 +INT 15 U - PS/2 Model 95 - ???
 + AH = CAh
 + ???
 +Return: ???
 +----------15CB-------------------------------
 +INT 15 U - PS/2 Model 95 - ???
 + AH = CBh
 + ???
 +Return: ???
 +----------15CC-------------------------------
 +INT 15 U - PS/2 Model 95 - ???
 + AH = CCh
 + ???
 +Return: ???
 +----------15CD-------------------------------
 +INT 15 U - PS/2 Model 95 - ???
 + AH = CDh
 + ???
 +Return: ???
 +----------15CE-------------------------------
 +INT 15 U - PS/2 Model 95 - ???
 + AH = CEh
 + ???
 +Return: ???
 +----------15CF-------------------------------
 +INT 15 U - PS/2 Model 95 - ???
 + AH = CFh
 + ???
 +Return: ???
 +----------15D800-----------------------------
 +INT 15 - EISA SYSTEM ROM - READ SLOT CONFIGURATION INFORMATION
 + AX = D800h
 + CL = slot number (including embedded and virtual)
 +Return: CF clear if successful
 +     AH = 00h
 + CF set on error
 +     AH = error code
 + 80h invalid slot number
 + 82h EISA CMOS corrupt
 + 83h empty slot
 + 86h invalid BIOS-FW function call
 + 87h invalid system configuration
 + AL bit flags
 +     bit 7: set if duplicate IDs
 + 6: set if product ID readable
 +       4,5: slot type (00=expansion, 01=embedded, 10=virtual device)
 +       0-3: duplicate ID number if bit 7 set
 + BH = major revision level of configuration utility
 + BL = minor revision level of configuration utility
 + CX = checksum of configuration file
 + DH = number of device functions
 + DL = combined function information byte
 + SI:DI = 4-byte compressed ID (DI = bytes 0&1, SI = bytes 2&3)
 +Note: call with AL=80h if using 32-bit CS addressing mode instead of 16-bit
 +SeeAlso: AX=D801h,AX=D804h
 +----------15D801-----------------------------
 +INT 15 - EISA SYSTEM ROM - READ FUNCTION CONFIGURATION INFORMATION
 + AX = D801h
 + CH = function number to read
 + CL = slot number (including embedded and virtual)
 + DS:SI -> 320-byte buffer for standard configuration data block
 +Return: CF clear if successful
 +     AH = 00h
 +     DS:SI buffer filled
 + CF set on error
 +     AH = error code
 + 80h invalid slot number
 + 81h invalid function number
 + 82h EISA CMOS corrupt
 + 83h empty slot
 + 86h invalid BIOS-FW function call
 + 87h invalid system configuration
 + BX destroyed
 +Note: call with AL=81h if using 32-bit CS addressing mode instead of 16-bit
 +----------15D802-----------------------------
 +INT 15 - EISA SYSTEM ROM - CLEAR NONVOLATILE MEMORY (EISA CMOS)
 + AX = D802h
 + BH = EISA config utility major revision level
 + BL = EISA config utility minor revision level
 +Return: CF clear if successful
 +     AH = 00h
 + CF set on error
 +     AH = error code
 + 84h error clearing CMOS
 + 86h invalid BIOS-FW function call
 + 88h config utility version not supported
 +Note: call with AL=82h if using 32-bit CS addressing mode instead of 16-bit
 +SeeAlso: AX=D803h
 +----------15D803-----------------------------
 +INT 15 - EISA SYSTEM ROM - WRITE NONVOLATILE MEMORY
 + AX = D803h
 + CX = length of data structure (0000h = empty slot)
 + includes two bytes for config file checksum
 + DS:SI -> configuration data
 +Return: CF clear if successful
 +     AH = 00h
 + CF set on error
 +     AH = error code
 + 84h error clearing CMOS
 + 85h EISA CMOS is full
 + 86h invalid BIOS-FW function call
 +Note: call with AL=83h if using 32-bit CS addressing mode instead of 16-bit
 +SeeAlso: AX=D802h
 +----------15D804-----------------------------
 +INT 15 - EISA SYSTEM ROM - READ PHYSICAL SLOT
 + AX = D804h
 + CL = slot number (including embedded and virtual)
 +Return: CF clear if successful
 +     AH = 00h
 + CF set on error
 +     AH = error code
 + 80h invalid slot number
 + 83h empty slot
 + 86h invalid BIOS-FW function call
 + SI:DI = 4-byte compressed ID (DI = bytes 0&1, SI = bytes 2&3)
 +Note: call with AL=84h if using 32-bit CS addressing mode instead of 16-bit
 +SeeAlso: AX=D800h
 +----------15D8-------------------------------
 +INT 15 - EISA SYSTEM ROM - 32-bit CS ADDRESSING MODE CALLS
 + AH = D8h
 + AL = 80h to 84h
 + other registers as appropriate for AL=00h to 04h
 +Return: as appropriate for AL=00h to 04h
 +Note: these functions are identical to AX=D800h to D804h, except that they
 +   should be called when using 32-bit CS addressing mode (pointers use
 +   ESI rather than SI as offset) instead of 16-bit addressing mode
 +SeeAlso: AX=D800h,AX=D801h,AX=D802h,AX=D803h,AX=D804h
 +----------15DE00-----------------------------
 +INT 15 - DESQview - GET PROGRAM NAME
 + AX = DE00h
 +Return: AX = offset into DESQVIEW.DVO of program most recently selected from
 + the "Switch Windows" menu (see below)
 +Note: always returns AX=0000h under DESQview/X
 +SeeAlso: AX=DE07h
 +
 +Format of program entry in DESQVIEW.DVO:
 +Offset Size Description
 + 00h BYTE length of name (FFh if end of file)
 + 01h  N BYTEs name
 +      2 BYTEs keys to invoke program (second = 00h if only one key used)
 + BYTE program type
 + 00h normal program
 + 04h divider
 + 80h Delete a Program
 + 81h Change a Program
 + WORD ??? apparently always 0000h
 +----------15DE01-----------------------------
 +INT 15 - DESQview - UPDATE "OPEN WINDOW" MENU
 + AX = DE01h
 +Return: nothing
 +Notes: reads DESQVIEW.DVO, disables Open menu if file not in current directory
 + NOP for DESQview/X
 +----------15DE02-----------------------------
 +INT 15 - DESQview 1.x only - SET ??? FLAG FOR CURRENT WINDOW
 + AX = DE02h
 +Return: nothing
 +Note: this call is a NOP in DV 2.x
 +SeeAlso: AX=DE03h
 +----------15DE03-----------------------------
 +INT 15 - DESQview 1.x only - GET ??? FOR CURRENT WINDOW
 + AX = DE03h
 +Return: AX = ??? for current window
 + BX = ??? for current window
 +Note: this call is a NOP in DV 2.x
 +SeeAlso: AX=DE02h
 +----------15DE04-----------------------------
 +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
 +SeeAlso: AX=DE05h,AX=DE06h
 +----------15DE05-----------------------------
 +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
 +SeeAlso: AX=DE04h,AX=DE06h
 +----------15DE06-----------------------------
 +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
 +SeeAlso: AX=DE04h,AX=DE05h
 +----------15DE07-----------------------------
 +INT 15 - DESQview - "APPNUM" - GET CURRENT PROGRAM'S NUMBER
 + AX = DE07h
 +Return: AX = number of program as it appears on the "Switch Windows" menu
 +Note: this API call may be made from a hardware interrupt handler
 +SeeAlso: AX=DE00h
 +----------15DE08-----------------------------
 +INT 15 - DESQview - GET ???
 + AX = DE08h
 +Return: AX = 0000h if ??? is not set to the current task
 +      0001h if ??? is set to the current task
 +----------15DE09-----------------------------
 +INT 15 - DESQview - UNIMPLEMENTED
 + AX = DE09h
 +Return: nothing (NOP in DV 1.x and 2.x)
 +----------15DE0A-----------------------------
 +INT 15 - DESQview v2.00+ - "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
 + this API call may be made from a hardware interrupt handler
 +SeeAlso: AX=1003h
 +----------15DE0B-----------------------------
 +INT 15 - DESQview v2.00+ - "APILEVEL" - DEFINE MINIMUM API LEVEL REQUIRED
 + AX = DE0Bh
 + BL = API level minor version number
 + BH = API level major version number
 +Return: AX = maximum API level (AH = major, AL = minor)
 +Notes: if the requested API level is greater than the version of DESQview, a
 +   "You need a newer version" error window is popped up
 + the API level defaults to 1.00, and is inherited by child tasks
 +----------15DE0C-----------------------------
 +INT 15 - DESQview v2.00+ - "GETMEM" - ALLOCATE "SYSTEM" MEMORY
 + AX = DE0Ch
 + BX = number of bytes
 +Return: ES:DI -> allocated block or 0000h:0000h (DV 2.26+)
 +Note: use SETERROR (AX=DE15h) to avoid a user prompt if there is insufficient
 +   system memory
 +SeeAlso: AX=1001h,AX=DE0Dh,AX=DE15h
 +----------15DE0D-----------------------------
 +INT 15 - DESQview v2.00+ - "PUTMEM" - DEALLOCATE "SYSTEM" MEMORY
 + AX = DE0Dh
 + ES:DI -> previously allocated block
 +Return: nothing
 +SeeAlso: AX=1002h,AX=DE0Ch
 +----------15DE0E-----------------------------
 +INT 15 - DESQview v2.00+ - "FINDMAIL" - FIND MAILBOX BY NAME
 + AX = DE0Eh
 + ES:DI -> name to find
 + CX = length of name
 +Return: BX = 0000h not found
 +      0001h found
 + DS:SI = object handle
 +SeeAlso: AH=12h/BH=11h
 +
 +Special mailbox names:
 + "COM1" ... "COM4" RBcomm using COM1 ... COM4
 + "DESQview/X Help Engine"
 + "DESQview/X Network Server"
 + "DESQview X Server0"
 + "INBOX" DESQview/X LPD requests
 + "OUTBOX" DESQview/X LPD responses
 + "WAITBOX" semaphore to synchronize DESQview/X LPD communications
 +----------15DE0F-----------------------------
 +INT 15 - DESQview v2.00+ - 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
 +----------15DE10-----------------------------
 +INT 15 - DESQview v2.00+ - "PUSHKEY" - PUT KEY INTO KEYBOARD INPUT STREAM
 + AX = DE10h
 + BH = scan code
 + BL = character
 +Return: nothing
 +Notes: a later read will get the keystroke as if it had been typed by the user
 + multiple pushes are read last-in first-out
 + if a script exists for the pushed key in the current application, the
 +   script will be executed
 + early copies of DV 2.00 destroy AX, BX, ES, and DI
 +SeeAlso: INT 16/AH=05h
 +----------15DE11BL00-------------------------
 +INT 15 - DESQview 2.00+ - "JUSTIFY" - EN/DISABLE AUTOMATIC WINDOW JUSTIFICATION
 + AX = DE11h
 + BL = 00h      viewport will not move automatically
 +      nonzero  viewport will move to keep cursor visible (default)
 +Return: nothing
 +----------15DE12BX0000-----------------------
 +INT 15 - DESQview v2.01+ - "CSTYLE" - SET "C"-COMPATIBLE CONTROL CHAR INTERPRET
 + AX = DE12h
 + BX = 0000h    select normal style (linefeed only moves down)
 +      nonzero  select C style (linefeed moves to start of next line)
 +Return: nothing
 +Note: set on a per-task basis, and inherited from the parent task
 +----------15DE13-----------------------------
 +INT 15 - DESQview v2.20+ - "GETCRIT" - GET CRITICAL NESTING COUNT
 + AX = DE13h
 +Return: BX = number of calls to BEGINC or ENTERC (see INT 15/AX=101Bh,DE1Ch)
 +      without matching ENDC (see INT 15/AX=101Ch)
 +Note: this API call may be made from within a hardware interrupt handler
 +SeeAlso: AX=101Bh,AX=101Ch,AX=DE1Bh,AX=DE1Ch
 +----------15DE14-----------------------------
 +INT 15 - DESQview v2.20+ - 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
 +SeeAlso: AX=1016h
 +----------15DE15BL00-------------------------
 +INT 15 - DESQview v2.20+ - SET ERROR HANDLING
 + AX = DE15h
 + BL = 00h post system error on all error conditions
 +      01h return carry flag set on calls to ADDTO, SUBFROM, and WRITE
 + messages sent to mailboxes which fail due to lack of system
 + or common memory
 +      02h (v2.26+) same as 01h, but return null pointer for GETMEM
 + calls which fail due to lack of system memory
 +Return: nothing
 +SeeAlso: AX=DE16h
 +----------15DE16-----------------------------
 +INT 15 - DESQview v2.20+ - GET ERROR HANDLING
 + AX = DE16h
 +Return: BL = 00h always post system error
 +      01h return carry flag set on failed mailbox writes
 +      02h return CF set on failed mailbox writes and NULL on failed
 + GETMEM calls
 +SeeAlso: AX=DE15h
 +----------15DE17-----------------------------
 +INT 15 - DESQview v2.20-2.25 - reserved
 + AX = DE17h
 +Return: pops up "Programming error" window
 +Note: AX = 1117h is NOT identical to this call under DESQview 2.20 thru 2.25
 +SeeAlso: AX=1117h
 +----------15DE17BX0000-----------------------
 +INT 15 - DESQview v2.26+ - "ASSERTMAP" - GET/SET MAPPING CONTEXT
 + AX = DE17h
 + BX = 0000h get current mapping context without setting
 +      nonzero set new mapping context
 +Return: BX = mapping context in effect before call
 +Notes: mapping contexts determine conventional-memory addressability; setting
 +   a mapping context ensures that the associated program and data areas
 +   are in memory for access.  Usable by drivers, TSRs and shared
 +   programs.
 + caller need not be running under DESQview
 + this API call may be made from a hardware interrupt handler
 +SeeAlso: AX=1117h,INT 2F/AX=1685h
 +----------15DE18-----------------------------
 +INT 15 - DESQview v2.20+ - internal - ???
 + AX = DE18h
 + BP = function number
 +     high byte must be 10h
 +     low byte is function
 + 00h set ???
 +     BL = ???  (00h-10h, video mode???)
 +     BH = value to store
 + 03h set ???
 +     BL = ??? (stored in driver)
 + 0Ah get ???
 +     ES:DI -> 18-byte buffer to hold ???
 +Note: calls video driver (NOP for Hercules driver,probably CGA and MCGA also)
 +----------15DE19-----------------------------
 +INT 15 - DESQview v2.23+ - "GETCOMMON" - ALLOCATE "COMMON" MEMORY
 + AX = DE19h
 + BX = number of bytes to allocate
 +Return: AX = 0000h successful
 + ES:DI -> allocated block
 +      nonzero insufficient memory
 +Note: this API call may be made from within a hardware interrupt handler
 +SeeAlso: AX=DE0Ch,AX=DE15h,AX=DE1Ah
 +----------15DE1A-----------------------------
 +INT 15 - DESQview v2.23+ - "PUTCOMMON" - DEALLOCATE "COMMON" MEMORY
 + AX = DE1Ah
 + DS:SI -> previously allocated block
 +Note: this function may be called from within a hardware interrupt handler
 +SeeAlso: AX=DE0Dh,AX=DE19h
 +----------15DE1B-----------------------------
 +INT 15 - DESQview v2.23+ internal - DECREMENT CRITICAL NESTING COUNT
 + AX = DE1Bh
 +Return: nothing
 +SeeAlso: AX=101Ch,AX=DE13h,AX=DE1Ch
 +----------15DE1C-----------------------------
 +INT 15 - DESQview v2.23+ - "ENTERC" - INCREMENT CRITICAL NESTING COUNT
 + AX = DE1Ch
 +Return: nothing
 +Notes: similar to AX=101Bh, but begins the critical region without ensuring
 +   that DOS is free
 + the official documentation states that this call should be paired with
 +   "ENDC" (AX=101Ch); no mention is made of AX=DE1Bh
 + this API call may be made from within a hardware interrupt handler
 +SeeAlso: AX=101Bh,AX=101Ch,AX=DE13h,AX=DE1Bh
 +----------15DE1D-----------------------------
 +INT 15 - DESQview v2.23+ - "PUTKEY" - FAKE USER KEYSTROKES
 + AX = DE1Dh
 + DX = segment of handle for task to receive keystroke
 + BL = character
 + BH = scan code
 +Return: AX = 0000h if successful
 +    nonzero if receiver's keyboard buffer was full
 +Notes: the key is treated as though the user had pressed it, ignoring any
 +   script which may be bound to the key, and using the current field
 +   table if the keyboard object is in field processing mode
 + multiple PUTKEYs are seen in the order in which they are executed
 +SeeAlso: AX=DE10h
 +----------15DE1E-----------------------------
 +INT 15 - DESQview v2.23+ - "SCRNINFO" - GET TRUE VIDEO PARAMETERS
 + AX = DE1Eh
 +Return: CL = actual number of rows on screen
 + CH = actual number of columns on screen
 + BL = actual video mode (may differ from INT 10/AH=0Fh return) (v2.26+)
 +Note: this API call may be made from a hardware interrupt handler
 +SeeAlso: INT 10/AH=0Fh
 +----------15DE1F-----------------------------
 +INT 15 - DESQview v2.23+ - "DOSUSER" - GET HANDLE OF TASK CURRENTLY USING DOS
 + AX = DE1Fh
 +Return: BX = segment of task handle or 0000h if no tasks are using DOS
 +Note: this API call may be made from within a hardware interrupt handler
 +SeeAlso: AX=DE13h
 +----------15DE20-----------------------------
 +INT 15 - DESQview v2.26+ - "DISPATCHINT" - INTERRUPT ANOTHER TASK
 + AX = DE20h
 + BX = segment of handle of task to interupt
 + DX:CX -> FAR interrupt routine
 +Return: nothing
 +Notes: unlike "PGMINT" (AX=1021h), DISPATCHINT may be applied to the task
 +   making the DISPATCHINT call
 + multiple "DISPATCHINT" calls are processed in the order in which they
 +   were executed
 + the FAR routine is entered with the current ES, DS, SI, DI, and BP
 +   values, using the task's internal stack (see AX=101Ah); only SS:SP
 +   needs to be preserved
 + this API call may be made from within a hardware interrupt handler
 +SeeAlso: AX=1021h
 +----------15DE21BX0000-----------------------
 +INT 15 - DESQview v2.26+ - "ASSERTVIR" - CONTROL 386 SCREEN VIRTUALIZATION
 + AX = DE21h
 + BX = 0000h turn off
 +      nonzero turn on
 +Return: BX = old state of virtualization
 +Note: this API call may be made from within a hardware interrupt handler
 +----------15DE22-----------------------------
 +INT 15 - DESQview v2.26+ - "PROCESSMEM" - GET TASK MEMORY STATUS
 + AX = DE22h
 + DX = segment of task handle
 +Return: DX = total amount of memory in paragraphs
 + BX = amount of system memory in paragraphs
 + CX = largest block of system memory available in paragraphs
 + AX = flags
 +     bit 0: system memory resides in shared memory
 + 1: process's memory is swapped out
 + 2: process's system memory is swapped out
 +Notes: if the task handle is a child task, the returned values will be for the
 +   process containing the task, rather than the task itself
 + if the process's system memory is swapped out, BX,CX,DX remain
 +   unchanged, because the memory usage cannot be determined
 +SeeAlso: AX=DE04h,AX=DE05h,AX=DE06h
 +----------15DE23-----------------------------
 +INT 15 - DESQview v2.31+ - ???
 + AX = DE23h
 + BX = ??? IRQ number on first PIC?
 + CX = ??? IRQ number on second PIC?
 +Return: ???
 +Note: called by QEMM 6.00+
 +----------15DE24-----------------------------
 +INT 15 - DESQview v2.40+ - ???
 + AX = DE24h
 +Return: BX = ??? (0000h for v2.40)
 +----------15DE25-----------------------------
 +INT 15 - DESQview v2.40+ - ???
 + AX = DE25h
 + ???
 +Return: nothing
 +----------15DE26-----------------------------
 +INT 15 - DESQview v2.40+ - GET ???
 + AX = DE26h
 +Return: BX = segment of handle for X server???
 +----------15DE27-----------------------------
 +INT 15 - DESQview v2.50+ - ???
 + AX = DE27h
 + BX = ??? (0000h,0001h)
 + ES:DI -> ???
 +Return: CF clear if successful
 +     AX = ???
 +     BX = ???
 + CF set on error
 +     AX = ???
 +Note: DESQview 2.50-2.52 are distributed as part of DESQview/X v1.0x.
 +----------15DE28-----------------------------
 +INT 15 - DESQview v2.50+ - ???
 + AX = DE28h
 + BX = segment of ??? or 0000h for default
 + ???
 +Return: ???
 +Note: DESQview 2.50-2.52 are distributed as part of DESQview/X v1.0x.
 +SeeAlso: AX=DE2Ah
 +----------15DE29BX0000-----------------------
 +INT 15 - DESQview v2.50+ - ???
 + AX = DE29h
 + BX = 0000h
 + ???
 +Return: CF clear if successful
 +     ???
 + CF set on error
 +Note: DESQview 2.50-2.52 are distributed as part of DESQview/X v1.0x.
 +----------15DE29BX0001-----------------------
 +INT 15 - DESQview v2.50+ - ???
 + AX = DE29h
 + BX = 0001h
 + DX = segment of window handle
 +Return: CF clear if successful
 +     AX = ???
 +     DX = ???
 + CF set on error
 +Note: DESQview 2.50-2.52 are distributed as part of DESQview/X v1.0x.
 +----------15DE29BX0002-----------------------
 +INT 15 - DESQview v2.50+ - ???
 + AX = DE29h
 + BX = 0002h
 + DX = segment of window handle
 +Return: CF clear if successful
 +     AX = ???
 +     DX = ???
 + CF set on error
 +Note: DESQview 2.50-2.52 are distributed as part of DESQview/X v1.0x.
 +----------15DE29BX0003-----------------------
 +INT 15 - DESQview v2.50+ - ???
 + AX = DE29h
 + BX = 0003h
 + DX = segment of window handle
 +Return: CF clear if successful
 +     ???
 + CF set on error
 +Note: DESQview 2.50-2.52 are distributed as part of DESQview/X v1.0x.
 +----------15DE29BX0004-----------------------
 +INT 15 - DESQview v2.50+ - GET DISPLAY NAME
 + AX = DE29h
 + BX = 0004h
 + CX = size of buffer in bytes
 + DX = segment of window handle
 + ES:DI -> buffer for display name
 +Return: CF clear if successful
 +     buffer filled with ASCIZ display name (truncated if necessary) or
 +       null string if no display
 + CF set on error
 +Notes: DESQview 2.50-2.52 are distributed as part of DESQview/X v1.0x.
 + the name ":0" refers to the local display
 +----------15DE29BX0005-----------------------
 +INT 15 - DESQview v2.50+ - ???
 + AX = DE29h
 + BX = 0005h
 + ???
 +Return: CF clear if successful
 +     ???
 + CF set on error
 +Note: DESQview 2.50-2.52 are distributed as part of DESQview/X v1.0x.
 +----------15DE2A-----------------------------
 +INT 15 - DESQview v2.50+ - ???
 + AX = DE2Ah
 + BX = segment of ??? or 0000h for default
 + ???
 +Return: ???
 +Note: DESQview 2.50-2.52 are distributed as part of DESQview/X v1.0x.
 +SeeAlso: AX=DE28h,AX=DE2Bh
 +----------15DE2B-----------------------------
 +INT 15 - DESQview v2.50+ - TRAVERSE OBJECT LIST
 + AX = DE2Bh
 + ES:DI -> object
 +Return: AX = status
 +     0000h successful
 +         ES:DI -> next object of same type in circular linked list
 +     0001h failed (ES:DI was not a valid handle)
 +Note: DESQview 2.50-2.52 are distributed as part of DESQview/X v1.0x.
 +SeeAlso: AX=1016h,AX=DE2Ah,AX=DE2Ch
 +----------15DE2C-----------------------------
 +INT 15 - DESQview v2.50+ - GET WINDOW INFORMATION???
 + AX = DE2Ch
 + DX = 0100h
 + BX = segment of window handle or 0000h for default
 + ES:DI -> buffer for info (see below)
 +Return: AX = status???
 +     0000h successful
 +Note: DESQview 2.50-2.52 are distributed as part of DESQview/X v1.0x.
 +SeeAlso: AX=DE2Bh
 +
 +Format of window information:
 +Offset Size Description
 + 00h BYTE task flag: 00h window, 01h task
 + 01h BYTE process number if task
 + 02h WORD segment of owner's handle
 + 04h WORD mapping context???
 + 06h BYTE status
 +  00h waiting
 + 01h idle
 + 04h pausing
 + 0Ah slicing
 + 0Bh exit DOS
 + 07h BYTE ???
 + 08h BYTE 01h if DESQview task???
 + 09h  2 BYTEs ???
 +----------15DE2D-----------------------------
 +INT 15 - DESQview v2.50+ - GET/SET ??? FUNCTION
 + AX = DE2Dh
 + CX = direction
 +     FFFFh set ??? function
 +         DX:BX -> FAR function for ???
 + must contain data storage for a WORD three bytes past
 + the function entry point and a DWORD five bytes past
 + the start
 +     other get ??? function
 +Return: DX:BX -> function if CX<>FFFFh on entry
 +Note: DESQview 2.50-2.52 are distributed as part of DESQview/X v1.0x.
 +SeeAlso: AX=DE2Eh,INT 63"DESQview"
 +----------15DE2E-----------------------------
 +INT 15 - DESQview v2.50+ - ???
 + AX = DE2Eh
 + DX:BX = ??? or 0000h:0000h for default
 +Return: CX = ???
 + DX:BX = ???
 +Note: DESQview 2.50-2.52 are distributed as part of DESQview/X v1.0x.
 +SeeAlso: AX=DE2Dh
 +---------------------------------------------
 +INT 15 - DESQview v2.50+ - ???
 + AX = DE2Fh
 +Return: BL = ??? (00h,01h)
 +Note: DESQview 2.50-2.52 are distributed as part of DESQview/X v1.0x.
 +----------15DE30-----------------------------
 +INT 15 - DESQview v2.50+ - GET DESQview/X VERSION
 + AX = DE30h
 +Return: BX = version (BH=major, BL=minor) or 0000h if not DESQview/X
 +Note: DESQview 2.50-2.52 are distributed as part of DESQview/X v1.0x.
 +SeeAlso: INT 21/AH=2Bh/CX=4445h
 +----------15E00F-----------------------------
 +INT 15 - Compaq Systempro - MULTIPROCESSOR DISPATCH
 + AX = E00Fh
 + ES:BX -> start of 2nd processor's execution
 +Return: AL = 0Fh successful
 +    = 00h failure
 +SeeAlso: AX=E10Eh,AX=E200h
 +----------15E10E-----------------------------
 +INT 15 - Compaq Systempro - MULTIPROCESSOR END-OF-DISPATCH
 + AX = E10Eh
 + ES:BX -> start of 2nd processor's execution
 +Return: AL = 0Fh successful (halted)
 +    = 00h failure (not halted)
 +SeeAlso: AX=E00Fh,AX=E200h
 +----------15E200-----------------------------
 +INT 15 - Compaq Systempro - MULTIPROCESSOR AVAILABLE
 + AX = E200h
 +Return: AX = 8000h if 2nd processor available
 +SeeAlso: AX=E00Fh,AX=E10Eh
 +----------15E4-------------------------------
 +INT 15 - ???
 + AH = E4h
 + AL = subfunction
 +     21h, 89h, 8Ah, 8Bh called by 386MAX v6.01
 + DL = ???
 +Return: ???
 +----------15F200CX454D-----------------------
 +INT 15 - Tandon memory mapper - Tandon MAPPER HARDWARE INITIALISATION CHECK ???
 + AX = F200h
 + CX = 454Dh
 +Return: CF clear if hardware already initialised
 +     BX = upper RAM areas in use
 + bit 0: C000-C3FF
 + bit 1: C400-C7FF
 + ...
 + bit 11: EC00-EFFF
 + CF set if hardware not initialised yet