Interrupt List, part 6 of 8
This compilation is Copyright (c) 1989,1990,1991,1992 Ralf Brown
----------2FC0-------------------------------
INT 2F - MTEZ XpressFax Hardware TSR (CLASS2) - API
       AH = C0h
       AL = function code (01h to 15h)
Return: ???
SeeAlso: AX=C000h"MTEZ",AX=CB00h"MTEZ"
----------2FC000-----------------------------
INT 2F - Novell ODI Link Support Layer (LSL.COM) - INSTALLATION CHECK
       AX = C000h
Return: AL = FFh
       ES:BX -> FAR entry point
       ES:SI -> signature string "LINKSUP$"
Note:   LSL.COM may use any multiplex number between C0h and FFh; it searches
         for itself in that range, and installs using the first free multiplex
         number in the range if not already loaded.

Call entry point with:
       BX = 0002h get entry points
               ES:SI -> buffer for entry point record (see below)
               Return: ES:SI buffer filled

Format of entry point record:
Offset  Size    Description
00h    DWORD   pointer to ??? entry point in LSL
04h    DWORD   pointer to ??? entry point in LSL
----------2FC000-----------------------------
INT 2F - MTEZ XpressFax Hardware TSR (CLASS2) - INSTALLATION CHECK
       AX = C000h
       BX = 444Bh
       CX = 4A4Eh
Return: AL = status
           00h not installed, OK to install
           FFh installed
               BX = 646Bh
               CX = 6A6Eh
Note:   this TSR will use any free multiplex number from C0h to FFh
SeeAlso: AH=C0h"MTEZ"
----------2FC050-----------------------------
INT 2F U - Explosiv 2.00 - INSTALLATION CHECK
       AX = C050h
Return: AL = 51h if installed
Notes:  Explosiv is a shareware animated screen blanker for DOS and Windows 3
         by Reidar Gresseth and Chris Hook
       AH=C0h is the default multiplex number, but may be reconfigured to
         any value from C0h to C9h
SeeAlso: AX=C052h
----------2FC052-----------------------------
INT 2F U - Explosiv 2.00 - UNINSTALL
       AX = C052h
       DX:BX = address to return to on successful uninstall
Return: at specified address if successful
       AL = 53h on error
Note:   specified return address must have the segment of the caller's PSP
SeeAlso: AX=C050h
----------2FC054-----------------------------
INT 2F U - Explosiv 2.00 - GET ???
       AX = C054h
Return: AL = ???
Note:   returns value set by AX=C057h
SeeAlso: AX=C057h
----------2FC055-----------------------------
INT 2F U - Explosiv 2.00 - SET BLANKING INTERVAL
       AX = C055h
       BX = new interval in clock ticks
----------2FC056-----------------------------
INT 2F U - Explosiv 2.00 - SET ???
       AX = C056h
       BL = ???
----------2FC057-----------------------------
INT 2F U - Explosiv 2.00 - SET ???
       AX = C057h
       BL = ???
SeeAlso: AX=C054h
----------2FC058-----------------------------
INT 2F U - Explosiv 2.00 - SET ???
       AX = C058h
       BL = ???
----------2FC059-----------------------------
INT 2F U - Explosiv 2.00 - CLEAR ???
       AX = C059h
Note:   clears flag set by AX=C05Ah
SeeAlso: AX=C05Ah
----------2FC05A-----------------------------
INT 2F U - Explosiv 2.00 - SET ???
       AX = C05Ah
       BL = ???
Note:   sets flag cleared by AX=C059h then stores BL
SeeAlso: AX=C059h,AX=C05Bh
----------2FC05B-----------------------------
INT 2F U - Explosiv 2.00 - SET ???
       AX = C05Bh
       BL = ???
SeeAlso: AX=C05Ah,AX=C05Ch
----------2FC05C-----------------------------
INT 2F U - Explosiv 2.00 - SET ???
       AX = C05Ch
       BL = ???
SeeAlso: AX=C05Bh
----------2FC900BP0000-----------------------
INT 2F U - ThunderByte??? - INSTALLATION CHECK
       AX = C900h
       BP = 0000h
Return: AL = FFh if installed
           BP >= 0014h
Note:   called by TBSCANX
SeeAlso: AX=C987h,AX=CA00h
----------2FC987-----------------------------
INT 2F U - ThunderByte??? - DISINFECT FILE???
       AX = C987h
       BX:DX -> filename
       BX:CX -> virus name
Return: AX = status
           0000h successful???
Note:   called by TBSCANX
SeeAlso: AX=CA00h
----------2FC9FF-----------------------------
INT 2F - STACKMAN - INSTALLATION BROADCAST
       AX = C9FFh
       BL = BCD version number
       CX = number of stacks
       DX = stack size in bytes
Notes:  called by STACKMAN when it goes resident to inform interested TSRs that
         its API is available
       the installation check consists of testing for the string "STACKXXX" at
         offset 0Ah from the INT B4 handler
SeeAlso: INT B4"STACKMAN",INT B5"STACKMAN"
----------2FCA00BX5442-----------------------
INT 2F - TBSCANX - INSTALLATION CHECK
       AX = CA00h
       BX = 5442h ('TB')
Return: AL = 00h not installed
          = FFh installed
               BX = 7462h ('tb') if BX was 5442h on entry
Note:   TBSCANX is a resident virus scanning module by Frans Veldman.  Programs
         may perform virus checks on themselves, other program files, or their
         data files by invoking the TBSCANX API.
SeeAlso: AX=4653h,AX=C900h
----------2FCA01-----------------------------
INT 2F - TBSCANX - GET STATUS
       AX = CA01h
Return: AH = BCD version number (v2.2+)
          = CAh for versions before 2.2
       AL = state (00h = disabled, 01h = enabled)
       CX = number of signatures which will be searched
---v2.0---
       BX = EMS handle, 0000h if not using EMS
---v2.3+---
       BX = segment of swap area, 0000h if not swapped
       DX = EMS or XMS handle (XMS handle if BX=0000h), FFFFh if not using EMS
SeeAlso: AX=CA02h
----------2FCA02-----------------------------
INT 2F - TBSCANX - SET STATE
       AX = CA02h
       BL = new state (00h = disabled, 01h = enabled)
SeeAlso: AX=CA01h
----------2FCA03-----------------------------
INT 2F - TBSCANX - SCAN BUFFER
       AX = CA03h
       CX = size of buffer
       DS:DX -> buffer containing data to scan
Return: CF clear if no virus signatures found
           BX,ES destroyed
       CF set if signature found
           ES:BX -> ASCIZ virus name (v2.3+)
           DS:DX -> ASCIZ virus name (v2.0)
       AX,CX,DX destroyed (v2.3+)
       all other registers except CS:IP and SS:SP destroyed (v2.0)
SeeAlso: AX=CA04h
----------2FCA04-----------------------------
INT 2F - TBSCANX - SCAN FILE
       AX = CA04h
       DS:DX -> filename
Return: CF clear if no virus signatures found
           BX,ES destroyed
       CF set if signature found
           ES:BX -> ASCIZ virus name
       AX,CX,DX destroyed
Note:   this function requires at least 4K free memory
SeeAlso: AX=CA03h
----------2FCAFEBX0000-----------------------
INT 2F U - THELP v3.0 - INSTALLATION CHECK
       AX = CAFEh
       BX = 0000h
Return: BX = segment of resident code if installed
          = 0000h if not installed
SeeAlso: AX=5453h
----------2FCB00-----------------------------
INT 2F - Communicating Applications Specification - INSTALLATION CHECK
       AX = CB00h
Return: AL = status
           00h not installed, OK to install
           01h not installed, not OK to install
           FFh installed
Note:   AH = CBh is the default identifier, but may be reconfigured
SeeAlso: AH=2Ah,AX=8000h"FaxBIOS",AX=CB0Eh,AX=CBDCh
----------2FCB00BX4D53-----------------------
INT 2F - MTEZ XpressFax CASMGR - INSTALLATION CHECK
       AX = CB00h
       BX = 4D53h
       CX = 4949h
Return: AL = status
           00h not installed, OK to install
           01h not installed, not OK to install
           FFh installed
               BX = 6D73h
               CX = 6969h
Note:   this function is equivalent to the standard CASMGR installation check,
         but uses the additional magic values to identify which CAS is
         installed
SeeAlso: AH=2Ah,AX=8000h"FaxBIOS",AX=C000h"MTEZ",AX=CB0Eh,AX=CB16h
----------2FCB01-----------------------------
INT 2F - Communicating Applications Specification - SUBMIT A TASK
       AX = CB01h
       DS:DX -> ASCIZ name of task control file
Return: AX >= 0: event handle
          < 0: error code
Note:   files needed for an event must be kept until task is complete or error
SeeAlso: AX=CB0Bh,AX=CB15h

Error codes (AH = class, AL = subcode, value passed back is 2's complement):
 Class 00h     --- FAX warnings
       Subcode 00h     no error
               02h     bad scanline count
               03h     page sent with errors, could not retransmit
               04h     received data lost
               05h     invalid or missing logo file
               06h     filename does not match nonstandard format (NSF) header
               07h     file size does not match NSF header
 Class 01h     --- DOS warnings (data was sent)
       Subcode 01h     invalid function
               05h     access denied
               06h     invalid handle
               others  see INT 21/AH=59h
 Class 02h     --- fatal errors (data not sent)
       Subcode 00h     multiplex handler failed
               01h     unknown command
               02h     bad event handle
               03h     FIND NEXT attempted before FIND FIRST
               04h     no more events
               07h     invalid queue type
               08h     bad control file
               09h     communication board busy
               0Ah     invalid command parameter
               0Bh     can't uninstall resident code
               0Ch     file exists
               80h     unknown task type
               81h     bad phone number
               82h     bad .PCX file header
               83h     unexpected EOF
               84h     unexpected disconnect
               85h     too many dialing retries
               86h     no file specified for send
               87h     communication board timeout
               88h     received too many pages (>1023) of data
               89h     manual connect initiated too long ago
               8Ah     hardware command set error
               8Bh     bad NonStandard Format (NSF) header file
 Class 03h     --- fatal DOS errors
       Subcode 02h     file not found
               03h     path not found
               others  see INT 21/AH=59h
 Class 04h     --- FAX errors
       Subcode 01h     remote unit not Group 3 compatible
               02h     remote unit did not send capabilities
               03h     other FAX machine incompatible
               04h     other FAX incapable of file transfers
               05h     exceeded retrain or FAX resend limit
               06h     line noise or failure to agree on bit rate
               07h     remote disconnected after receiving data
               08h     no response from remote after sending data
               09h     remote's capabilities incompatible
               0Ah     no dial tone (v1.2+)
               0Bh     invalid response from remote unit after sending data
               0Dh     phone line dead or remote unit disconnected
               0Eh     timeout while waiting for secondary dial tone (v1.2+)
               11h     invalid command from remote after receiving data
               15h     tried to receive from incompatible hardware
               5Ch     received data overflowed input buffer
               5Dh     remote unexpectedly stopped sending data
               5Eh     other FAX machine jammed (no data sent)
               5Fh     remote took too long to send fax scan line
               63h     can't get through to remote unit
               64h     user canceled event
 Class 05h     --- application-specific (v1.2+)
 ---Intel FAXPOP.EXE
       Subcode 00h     tried to send while in graphics mode
               01h     insufficient disk space
               02h     internal buffer overflow
 Class 06h     --- CAS implementation-specific (v1.2+)
----------2FCB02-----------------------------
INT 2F - Communicating Applications Specification - ABORT CURRENT EVENT
       AX = CB02h
Return: AX >= 0: event handle of aborted event
          < 0: error code (see AX=CB01h)
Note:   termination could take up to 30 seconds
SeeAlso: AX=CB08h,AX=CB10h
----------2FCB05-----------------------------
INT 2F - Communicating Applications Specification - FIND FIRST QUEUE ENTRY
       AX = CB05h
       CX = status of events to find
           0000h successful completion
           0001h waiting to be processed
           0002h number has been dialed
           0003h connection established, sending
           0004h connection established, receiving
           0005h event aborted
           FFFFh find any event, regardless of status
           other negative values, match error code
       DH = direction
           00h chronological order, earliest to latest
           01h reverse chronological order, latest to earliest
       DL = queue to search
           00h task queue
           01h receive queue
           02h log queue
Return: AX = 0000h successful
           BX = event handle for found event
          < 0     error code (see AX=CB01h)
SeeAlso: AX=CB06h,AX=CB07h
----------2FCB06-----------------------------
INT 2F - Communicating Applications Specification - FIND NEXT QUEUE ENTRY
       AX = CB06h
       DL = queue to search
           00h task queue
           01h receive queue
           02h log queue
Return: AX = 0000h successful
           BX = event handle for found event
          < 0     error code (see AX=CB01h)
Note:   direction of search is same as preceding FIND FIRST call
SeeAlso: AX=CB05h
----------2FCB07-----------------------------
INT 2F - Communicating Applications Specification - OPEN FILE
       AX = CB07h
       BX = event handle from find (AL=05h,06h) or submit task (AL=01h)
       CX = receive file number (ignored for task queue and log queue)
           0000h  open receive control file
           N      open Nth received data file
       DL = queue
           00h task queue
           01h receive queue control file or received file, as given by CX
           02h log queue
           03h group file in task queue (v1.2+)
           04h group file in log queue (v1.2+)
Return: AX = 0000h successful
           BX = DOS file handle for requested file
          < 0     error code (see AX=CB01h)
Note:   the returned file handle has been opened in read-only mode and should
         be closed with INT 21/AH=3Eh after use
SeeAlso: AX=CB01h,AX=CB05h,AX=CB14h
----------2FCB08-----------------------------
INT 2F - Communicating Applications Specification - DELETE FILE
       AX = CB08h
       BX = event handle
       CX = receive file number
           0000h delete ALL received files and receive control file
           N     delete Nth received file
       DL = queue
           00h delete control file in task queue and corresponding group file
               if it exists
           01h delete file in receive queue, as given by CX
           02h delete control file in log queue (individual deletions not
               recommended, to maintain integrity of log) and corresponding
               group file if it exists
Return: AX = 0000h successful
          < 0     error code (see AX=CB01h)\
SeeAlso: AX=CB02h,AX=CB09h
----------2FCB09-----------------------------
INT 2F - Communicating Applications Specification - DELETE ALL FILES IN Q
       AX = CB09h
       DL = queue
           00h delete all control files in task queue, including all group
               files
           01h delete all files in receive queue
           02h delete all control files in log queue, including all group
               files
Return: AX = 0000h successful
          < 0     error code (see AX=CB01h)
SeeAlso: AX=CB08h
----------2FCB0A-----------------------------
INT 2F - Communicating Applications Specification - GET EVENT DATE
       AX = CB0Ah
       BX = event handle
       DL = queue
           00h task queue
           01h receive queue
           02h log queue
Return: AX = 0000h successful
               CX = year
               DH = month
               DL = day
          < 0     error code (see AX=CB01h)
SeeAlso: AX=CB0Bh,AX=CB0Ch
----------2FCB0B-----------------------------
INT 2F - Communicating Applications Specification - SET TASK DATE
       AX = CB0Bh
       BX = event handle (task event only)
       CX = year
       DH = month
       DL = day
Return: AX = 0000h successful
          < 0     error code (see AX=CB01h)
Note:   setting a task's date and time to before the current date and time
         causes it to execute immediately
SeeAlso: AX=CB01h,AX=CB0Ah,AX=CB0Dh
----------2FCB0C-----------------------------
INT 2F - Communicating Applications Specification - GET EVENT TIME
       AX = CB0Ch
       BX = event handle
       DL = queue
           00h task queue
           01h receive queue
           02h log queue
Return: AX = 0000h successful
               CH = hour
               CL = minute
               DH = second
               DL = 00h
          < 0     error code (see AX=CB01h)
SeeAlso: AX=CB0Ah,AX=CB0Dh
----------2FCB0D-----------------------------
INT 2F - Communicating Applications Specification - SET TASK TIME
       AX = CB0Dh
       BX = event handle (task events only)
       CH = hour
       CL = minute
       DH = second
       DL unused
Return: AX = 0000h successful
          < 0     error code (see AX=CB01h)
Note:   setting a task's date and time to before the current date and time
         causes it to execute immediately
SeeAlso: AX=CB0Bh,AX=CB0Ch,AX=CB10h
----------2FCB0E-----------------------------
INT 2F - Communicating Applications Specification - GET EXTERNAL DATA BLOCK
       AX = CB0Eh
       DS:DX -> 256-byte buffer
Return: AX = 0000h successful
               buffer filled
          < 0     error code (see AX=CB01h)

Format of external data block:
Offset  Size    Description
00h    BYTE    CAS major version
01h    BYTE    CAS minor version
02h 68 BYTEs   ASCIZ path to directory containing CAS software, ends in slash
46h 13 BYTEs   ASCIZ name of current phonebook (in CAS directory)
53h 13 BYTEs   ASCIZ name of current logo file (in CAS directory)
60h 32 BYTEs   ASCIZ default sender name
80h 21 BYTEs   ASCIZ CCITT identification of fax device
95h 107 BYTEs  reserved
----------2FCB0F-----------------------------
INT 2F - Communicating Applications Specification - GET/SET AUTORECEIVE
       AX = CB0Fh
       DL = subfunction
           00h get current autoreceive state
           01h set autoreceive state
               DH = number of rings before answer, 00h = never
Return: AX = 0000h autoreceive disabled
          = N     number of rings before answer
          < 0     error code (see AX=CB01h)
----------2FCB10-----------------------------
INT 2F - Communicating Applications Specification - GET CURRENT EVENT STATUS
       AX = CB10h
       DS:DX -> 512-byte buffer
Return: AX = 0000h successful
               BX = event handle of current event or negative error code if
                       no current event
               buffer filled
          < 0     error code (see AX=CB01h)
SeeAlso: AX=CB02h,AX=CB0Dh

Format of status area:
Offset  Size    Description
00h    BYTE    event type
               00h send
               01h receive
               02h polled send
               03h polled receive
               04h to 7Fh reserved
               FFh serious hardware error
01h    BYTE    transfer type
               00h 200x200 dpi, FAX mode
               01h 100x200 dpi, FAX mode
               02h file transfer mode
               03h to 7Fh reserved
02h    WORD    event status
               0000h completed successfully
               0001h waiting
               0002h number dialed
               0003h connected, sending
               0004h connected, receiving
               0005h aborted
               0006h to 007Fh reserved
               0080h to 7FFFh application-specific events
               8000h to FFFFh error codes
04h    WORD    event time (packed DOS time format, see INT 21/AX=5700h)
06h    WORD    event date (packed DOS date format, see INT 21/AX=5700h)
08h    WORD    number of files to transfer, max 7FFFh
0Ah    WORD    offset of file transfer record
0Ch 47 BYTEs   ASCIZ phone number to call
3Bh 64 BYTEs   ASCIZ application-specific tag string
7Bh    BYTE    reserved (00h)
7Ch    BYTE    connect time, seconds
7Dh    BYTE    connect time, minutes
7Eh    BYTE    connect time, hours
7Fh    DWORD   total number of pages in all files
83h    DWORD   pages already transmitted
87h    WORD    number of files already transmitted
89h    BYTE    cover page flag
               00h don't transmit cover page
               01h transmit cover page
               02h to 7Fh reserved
8Ah    WORD    total number of transmission errors
8Ch 78 BYTEs   reserved (zeros)
DAh 21 BYTEs   ASCIZ remote FAX's CCITT identification
EFH 32 BYTEs   ASCIZ destination name
10Fh 32 BYTEs   ASCIZ sender name
12Fh 80 BYTEs   filename of PCX logo file (max 1780x800 pixels)
17Fh 128 BYTEs  file transfer record for current event (see below)

Format of file transfer record:
Offset  Size    Description
00h    BYTE    file type (ignored unless FAX)
               00h ASCII
               01h PCX
               02h DCX
               03h to 7Fh reserved
01h    BYTE    text size for ASCII FAX file
               00h = 80 columns by 66 lines (11 inches)
               01h = 132 columns by 88 lines (11 inches)
               02h to 7Fh reserved
02h    BYTE    status of file
               00h untouched
               01h opened
               02h moved
               03h deleted
               04h not yet received
               05h to 7Fh reserved
03h    DWORD   bytes already transmitted
07h    DWORD   file size in bytes
0Bh    WORD    pages alread transmitted
0Dh    WORD    number of pages in file
0Fh 80 BYTEs   ASCIZ filename
5Fh    BYTE    1/8 inch page length
               if page length below set to 01h through 7Fh, this value
               specifies additional 1/8 inch increments to page length
60h    BYTE    page length
               00h = 11 inches
               01h to 7Fh = page length is this number of inches plus value of
                       1/8 inch field above
               80h to FEh reserved
               FFh = ASCII pages ending with formfeed
61h 31 BYTEs   reserved (zeros)
----------2FCB11-----------------------------
INT 2F - Communicating Applications Specification - GET QUEUE STATUS
       AX = CB11h
       DL = queue to get status of
           00h task queue
           01h receive queue
           02h log queue
           03h send events (v1.2+)
           04h receive events (v1.2+)
Return: AX >= 0  total number of changes made to queue, modulo 32768
               BX = number of control files currently in queue
               CX = number of received files (zero for task and log queues)
       AX < 0  error code (see AX=CB01h)
SeeAlso: AX=CB12h
----------2FCB11DL03-------------------------
INT 2F - Communicating Applications Spec v1.2+ - GET NUMBER OF SEND EVENTS
       AX = CB11h
       DL = 03h
Return: AX = number of successful sends since resident manager started
       BX = number of unsuccessful sends, including warnings
SeeAlso: AX=CB11h/DL=04h
----------2FCB11DL04-------------------------
INT 2F - Communicating Applications Spec v1.2+ - GET NUMBER OF RECEIVE EVENTS
       AX = CB11h
       DL = 04h
Return: AX = number of received file events since resident manager started
       BX = number of received FAX events
SeeAlso: AX=CB11h/DL=03h
----------2FCB12-----------------------------
INT 2F - Communicating Applications Specification - GET HARDWARE STATUS
       AX = CB12h
       DS:DX -> 128-byte status buffer
Return: AX = 0000h successful
               buffer filled with hardware-dependent status information
          < 0     error code (see AX=CB01h)
SeeAlso: AX=CB10h,AX=CB11h

Format of status buffer for Intel Connection CoProcessor:
Offset  Size    Description
00h    BYTE    bit flags
               bit 7: hardware busy sending or receiving
               bit 6: last page of data
               bit 5: no data on current page
               bit 4: retransmit request for current page being transmitted
               bit 3: NSF mode active
               bits 2-0: reserved
01h    BYTE    number of kilobytes of free buffer space
02h    BYTE    page buffer status
               bit 7: Connection CoProcessor has documents to send
               bits 6-0: number of pages in buffer
03h    BYTE    number of retries left for dialing number
04h    BYTE    page number to retransmit
05h    BYTE    communications status
               bit 7: originating call
               bit 6: FAX message to be sent
               bit 5: on line
               bit 4: ring detected and receive enabled
               bit 3: buffer dumped on receive
               bits 2-0: hardware sequence state
                       000 idle
                       001 dial
                       010 answer
                       011 transmit
                       100 receive
                       101 pre-message
                       110 post-message
                       111 disconnect
06h    BYTE    baud rate
               bit 7: reserved
               bits 6-4: baud rate
                       000 = 300 baud  (V.21 SDLC or HDLC mode)
                       100 = 2400 baud (V.27 ter)
                       101 = 4800 baud (V.27 ter)
                       110 = 7200 baud (V.29)
                       111 = 9600 baud (V.29)
               bits 3-0: reserved, should be 0110
07h  3 BYTEs   reserved
0Ah    BYTE    hardware status
               bit 7: modem option installed
               bit 6: Connection CoProcessor has control of DAA (not latched)
               bit 5: on line (not latched)
               bit 4: ring detected (not latched)
               bit 3: data in command buffer (not latched)
               bit 2: set if using DMA channel 1, clear if using DMA channel 3
               bit 1: line length compensation bit 1 set (not latched)
               bit 0: line length compensation bit 0 set (not latched)
0Bh    BYTE    switch states
               bit 7: reserved
               bit 6: unused
               bit 5: spare switch open
               bit 4: FAX ADR1 switch open
               bit 3: FAX ADR0 switch open
               bit 2: alternate interrupt switch open
               bit 1: COM SEL 1 switch open
               bit 0: COM SEL 0 switch open
                       Note: valid combinations of bits 0-2 are
                               000  COM2 IRQ3 IObase 2F8h
                               001  COM1 IRQ4 IObase 3F8h
                               010  COM4 IRQ3 IObase 2E8h
                               011  COM3 IRQ4 IObase 3E8h
                               110  COM4 IRQ2 IObase 2E8h
                               111  COM3 IRQ5 IObase 3E8h
0Ch    BYTE    bit flags
               bit 7: reserved
               bit 6: auxiliary relay forced ON
               bit 5: modem select relay forced ON
               bit 4: offhook relay forced ON
               bit 3: 9600 bps enabled
               bit 2: 7200 bps enabled
               bit 1: 4800 bps enabled
               bit 0: 2400 bps enabled
0Dh    BYTE    reserved
0Eh    WORD    error count (only valid while busy, reset when idle)
10h    DWORD   size of nonstandard format (NSF) file in bytes
14h    BYTE    'A' if Connection CoProcessor board present
15h  9 BYTEs   reserved
1Eh 21 BYTEs   ASCIZ CCITT identification
33h 77 BYTEs   reserved

Format of status buffer for Intel SatisFAXtion board:
Offset  Size    Description
00h    BYTE    connection status flags
               bit 7: busy in T.30 CCITT fax protocol
               bit 6: data on current page/file (only used for block xfers)
               bit 5: retransmission of last page requested
               bit 4: in file transfer mode
               bit 3: data in buffer
               bit 2: data buffer dumped on receive
               bit 1: 200x100 dpi resolution instead of 200x200 dpi
               bit 0: data modem in use, FAX image modem not available
01h    BYTE    board state
               bit 7: reserved
               bit 6: handset jack active, data and FAX modems not available
               bits 5-3: current bit rate
                   000  300 bps (V.21 HDLC)
                   100 2400 bps (V.27 ter)
                   101 4800 bps (V.27 ter)
                   110 7200 bps (V.29)
                   111 9600 bps (V.29)
               bits 2-0: T.30 CCITT protocol state
                   000 idle
                   001 dialing
                   010 answering
                   011 transmitting
                   100 receiving
                   101 pre-message
                   110 post-message
                   111 disconnect
02h    BYTE    number of KB free in buffer
03h    BYTE    number of pages or files in buffer
04h    BYTE    number of redials remaining on current number
05h    BYTE    FAX page number to retransmit
06h    BYTE    current page/file in block transfer
07h    BYTE    number of rings received (only if auto-answer enabled)
08h    WORD    error count
0Ah    DWORD   length of file being transferred
0Eh  6 BYTEs   reserved
14h    BYTE    'B' is SatisFAXtion board present
15h 13 BYTEs   ASCIZ transfer agent name
22h  5 BYTEs   ASCIZ transfer agent version number
27h 13 BYTEs   ASCIZ resident loader name
34h  5 BYTEs   ASCIZ resident loader version number
39h 21 BYTEs   ASCIZ remote CSID
4Eh 13 BYTEs   ASCIZ resident manager name
5Bh  5 BYTEs   ASCIZ resident manager version number
60h 32 BYTEs   reserved
Note:   the Intel Connection CoProcessor and SatisFAXtion may be distinguished
         by examining the byte at offset 14h
----------2FCB13DL00-------------------------
INT 2F - Communicating Applications Specification - GET DIAGNOSTICS RESULTS
       AX = CB13h
       DL = 00h
Return: AX = 0040h in progress
          >= 0    passed
          < 0     hardware-dependent failure code (see below)
SeeAlso: AX=CB13h/DL=01h

Intel Connection CoProcessor failure codes:
       bit 3: 9600 bps FAX modem module failed
       bit 2: SDLC chip failed
       bit 1: RAM failed
       bit 0: ROM checksum failed

Intel SatisFAXtion failure codes:
       bit 1: 2400 bps data modem failed
       bit 0: 9600 bps FAX modem failed
----------2FCB13DL01-------------------------
INT 2F - Communicating Applications Specification - START DIAGNOSTICS
       AX = CB13h
       DL = 01h
Return: AX = 0000h successfully started
          < 0     error code (see AX=CB01h)
SeeAlso: AX=CB13h/DL=00h
----------2FCB14-----------------------------
INT 2F - Communicating Applications Specification - MOVE RECEIVED FILE
       AX = CB14h
       BX = event handle
       CX = receive file number
            0001h first received file
            N     Nth received file
       DS:DX -> ASCIZ string specifying new name for file (must not exist)
Return: AX = 0000h successful
          < 0     error code (see AX=CB01h)
----------2FCB15-----------------------------
INT 2F - Communicating Applications Specification - SUBMIT FILE TO SEND
       AX = CB15h
       DS:DX -> variable-length data area (see below)
Return: AX >= 0 event handle
          < 0  error code (see AX=CB01h)
SeeAlso: AX=CB01h

Format of data area:
Offset  Size    Description
00h    BYTE    transfer type
               00h = 200x200 dpi, fax mode
               01h = 100x200 dpi, fax mode
               02h = file transfer mode
               03h to 7Fh reserved
01h    BYTE    text size
               00h = 80 columns
               01h = 132 columns
               02h to 7Fh reserved
02h    WORD    time to send (DOS packed time format, see INT 21/AX=5700h)
04h    WORD    date to send (DOS packed date format, see INT 21/AX=5700h)
06h 32 BYTEs   ASCIZ destination name
26h 80 BYTEs   ASCIZ name of file to send
76h 47 BYTEs   ASCIZ phone number to dial
A5h 64 BYTEs   ASCIZ application-specific tag string
E5h    BYTE    reserved (00h)
E6h    BYTE    cover page
               00h don't send cover page
               01h send cover page
               02h to 7Fh reserved
E7h 23 BYTEs   reserved (zeros)
FEh variable   ASCIZ string containing text of cover page (if cover page flag
               set to 01h)
----------2FCB16BX1234-----------------------
INT 2F - Communicating Applications Spec v1.2+ - UNLOAD RESIDENT MANAGER
       AX = CB16h
       BX = 1234h
       CX = 5678h
       DX = 9ABCh
Return: AX = 0000h successful
          < 0     error code
Note:   the MTEZ XpressFax CASMGR ignores the values in BX,CX, and DX
SeeAlso: AX=C000h"MTEZ",AX=CB00h
----------2FCB17-----------------------------
INT 2F - Communicating Applications Spec v1.2+ - SET COVER PAGE STATUS
       AX = CB17h
       BX = event handle
       CL = cover page status
           00h not read
           01h read by user
Return: AX = 0000h successful
          < 0     error code
----------2FCB80-----------------------------
INT 2F - Intel SatisFAXtion CASMGR - ???
       AX = CB80h
       ???
Return: ???
----------2FCB81-----------------------------
INT 2F - Intel SatisFAXtion CASMGR - ???
       AX = CB81h
       ???
Return: ???
----------2FCB82-----------------------------
INT 2F - Intel SatisFAXtion CASMGR - ???
       AX = CB82h
       ???
Return: ???
----------2FCBDCBL56-------------------------
INT 2F - Comwave Microfax Specification - GET STATUS ARRAY
       AX = CBDCh
       BL = 56h
       BH = line number (starts with 1)
       CX:DX -> 32-byte status buffer or 80 character string
Return: AX = number of cards installed, or FFFFh on error
Program: Comwave manufacturers the Microfax line of fax cards which are a high-
         performance multi-card FAX solution for OEMs.
Note:   defaults to AH=CBh but can be changed
SeeAlso: AX=CBDDh,AX=DA00h
----------2FCBDDBL56-------------------------
INT 2F - Comwave Microfax Specification - COMMAND SUBMISSION
       AX = CBDDh
       BL = 56h
       BH = ?
       CX:DX -> command to execute
Return: AX = status
           0000h success
           FFFFh on error
SeeAlso: AH=2Ah,AX=CBDCh,AX=80FBh
----------2FCC--SI5453-----------------------
INT 2F U - Qualitas Qcach v4.00
       AH = CCh
       SI = 5453h or 7473h
       AL = ???
       DL = 00h or ???
Return: SI = 7473h
       ???
----------2FCD00-----------------------------
INT 2F - Intel Image Processing Interface - INSTALLATION CHECK
       AX = CD00h
Return: AL = 00h not installed, OK to install
            01h not installed, not OK to install
            FFh installed
SeeAlso: AX=CD02h"Image"
----------2FCD00-----------------------------
INT 2F - SWELL.EXE - INSTALLATION CHECK
       AX = CD00h
Return: AX = 00FFh installed
           BH = major version
           BL = minor version
Note:   SWELL.EXE is a TSR which swaps programs to disk when they EXEC a child
         process with INT 21/AH=4Bh
----------2FCD01-----------------------------
INT 2F - Intel Image Processing Interface - SET DEVICE NAME
       AX = CD01h
       CX:BX -> ASCIZ character device name ("LPTn", "COMn", "PRN")
Return: AL = 00h successful
               CX:BX -> internal character device name
          = 80h error
----------2FCD01-----------------------------
INT 2F - SWELL.EXE - SUSPEND ONCE
       AX = CD01h
Return: AX = 0000h
SeeAlso: AX=CD02h"SWELL"
----------2FCD02-----------------------------
INT 2F - Intel Image Processing Interface - GET VERSION NUMBER
       AX = CD02h
Return: AL = 00h/01h successful
               BH = major version number (BCD)
               BL = minor version number (BCD)
          = 80h error
Note:   if return AL = 01h, the IPI supports network redirection
SeeAlso: AX=CD00h"Image"
----------2FCD02-----------------------------
INT 2F - SWELL.EXE - SUSPEND
       AX = CD02h
Return: AX = 0000h
SeeAlso: AX=CD03h"SWELL"
----------2FCD03-----------------------------
INT 2F - Intel Image Processing Interface - SELECT SCAN LINE
       AX = CD03h
       BX = scan line
       CX = requested density in dots per inch (300, 600, or 1200)
Return: AL = 00h succesful
               CX = density at which scan line was mapped
               ES:DI -> start of scan line
       AL = 80h unsuccessful
          = 81h scan line out of range
          = 82h unsupported scan line density
          = 83h out of memory
SeeAlso: AX=CD04h"Image"
----------2FCD03-----------------------------
INT 2F - SWELL.EXE - ACTIVATE
       AX = CD03h
Return: AX = 0000h
SeeAlso: AX=CD02h"SWELL"
----------2FCD04-----------------------------
INT 2F - Intel Image Processing Interface - MOVE BITMAP TO SCANLINE
       AX = CD04h
       CX:BX -> structure (see below)
Return: AL = 00h successful
          = 80h unsuccessful
          = 81h scan line out of range
          = 82h unsupported scan line density
          = 83h out of memory
          = 84h unrecognized source
          = 85h initialization error
SeeAlso: AX=CD03h"Image"

Format of structure:
Offset  Size    Description
00h    WORD    image source (0 = conventional memory, 1 = expanded memory)
02h    DWORD   pointer to image data
06h    WORD    scan line on which to place
08h    WORD    bit offset from start of scan line at which to place
0Ah    WORD    density of bitmap data (300, 600, or 1200 dpi)
0Ch    WORD    width in bits of data
0Eh    WORD    source logical page number
10h    WORD    source handle (only if source in expanded memory)
12h    WORD    source offset (only if source in expanded memory)
----------2FCD04-----------------------------
INT 2F - SWELL.EXE - TURN OFF VERBOSE MODE
       AX = CD04h
Return: AX = 0000h
SeeAlso: AX=CD05h"SWELL"
----------2FCD05-----------------------------
INT 2F - Intel Image Processing Interface - PRINT PAGE
       AX = CD05h
Return: AL = 00h successful
          = 80h unsuccessful
Note:   page image is retained, so multiple calls will print multiple copies of
         the page
SeeAlso: AX=CD06h"Image"
----------2FCD05-----------------------------
INT 2F - SWELL.EXE - TURN ON VERBOSE MODE
       AX = CD05h
Return: AX = 0000h
SeeAlso: AX=CD04h"SWELL"
----------2FCD06-----------------------------
INT 2F - Intel Image Processing Interface - CLEAR PAGE
       AX = CD06h
Return: AL = 00h successful
          = 80h unsuccessful
Note:   palette is reset to default
SeeAlso: AX=CD09h"Image"
----------2FCD06-----------------------------
INT 2F - SWELL.EXE - UNINSTALL
       AX = CD06h
Return: AX = 0000h uninstalled
          = 8002h programs still swapped, not uninstalled
----------2FCD07-----------------------------
INT 2F - Intel Image Processing Interface - reserved
       AX = CD07h
----------2FCD07-----------------------------
INT 2F - SWELL.EXE - GET INFO
       AX = CD07h
       ES:BX -> 32-byte buffer for info
Return: AX = 0000h successful
           ES:BX buffer filled
          = 8001h buffer wrong size

Format of info buffer:
Offset  Size    Description
00h    WORD    20h  (total size of buffer)
02h    BYTE    suspend-once mode active if nonzero
03h    BYTE    00h active, 01h suspended
04h    BYTE    00h quiet, 01h verbose
05h    BYTE    "Borland support" (allowing INT 21/AX=4B01h) on if nonzero
06h 26 BYTEs   unused???
----------2FCD08-----------------------------
INT 2F - Intel Image Processing Interface - SCREEN IMAGE
       AX = CD08h
       CX:BX -> structure (see below)
Return: AL = 00h successful
          = 80h unsuccessful
          = 81h scan line out of range
          = 82h unsupported scan line density
          = 83h out of memory
          = 84h unrecognized source
          = 85h initialization error
SeeAlso: AX=CD05h"Image",AX=CD09h"Image"

Format of structure:
Offset  Size    Description
00h    WORD    image source (0 = conventional memory, 1 = expanded memory)
02h    DWORD   pointer to image data
06h    WORD    horizontal position on paper of left edge (in 1200 dpi units)
08h    WORD    vertical position on paper of top edge (in 1200 dpi units)
0Ah    WORD    left cropping (currently must be zero)
0Ch    WORD    top cropping (currently must be zero)
0Eh    WORD    width (currently must be 8000h)
10h    WORD    height (currently must be 8000h)
12h    WORD    horizontal size of image in 1200 dpi units
14h    WORD    vertical size of image in 1200 dpi units
16h    WORD    aspect ratio (currently reserved)
18h    WORD    initialization flag (if 01h, initialization is performed)
1Ah    WORD    pixels per line of source data
1Ch    WORD    number of scan lines in source data
1Eh    WORD    number of scan lines in packet
20h    WORD    bits per pixel (1,2,4,6, or 8)
22h    WORD    pixels per byte (1,2,4, or 8)
24h    WORD    compression type (currently only 00h [uncompressed] supported)
26h    WORD    source page number (if in expanded memory)
28h    WORD    source handle (if in expanded memory)
2Ah    WORD    source offset (if in expanded memory)
----------2FCD08-----------------------------
INT 2F - SWELL.EXE - UNUSED
       AX = CD08h
Return: AX = FFFFh (error)
----------2FCD09-----------------------------
INT 2F - Intel Image Processing Interface - LOAD SCREEN
       AX = CD09h
       CX:BX -> structure (see below)
Return: AL = 00h successful
          = 80h unsuccessful
SeeAlso: AX=CD06h"Image Processing",AX=CD0Ah"Image Processing"

Format of structure:
Offset  Size    Description
00h    BYTE    style
               44h ('D') diamond style
               4Ch ('L') line style
01h    BYTE    reserved (00h)
02h    WORD    frequency in lines per inch [sic]
               currently, coerced to nearest of 50, 60, 68, 70, 75, 85, or 100
04h    WORD    screen angle in degrees (-360 to 360)
               currently coerced to nearest of -45, 0, 45, or 90
----------2FCD09-----------------------------
INT 2F - SWELL.EXE - TURN OFF "BORLAND SUPPORT"
       AX = CD09h
Return: AX = 0000h
SeeAlso: AX=CD0Ah"SWELL"
----------2FCD0A-----------------------------
INT 2F - Intel Image Processing Interface - LOAD PALETTE
       AX = CD0Ah
       CX:BX -> palette structure (see below)
Return: AL = 00h successful
          = 80h unsuccessful
SeeAlso: AX=CD09h"Image Processing"

Format of palette structure:
Offset  Size    Description
00h    BYTE    bits per pixel for which palette is to be used (1,2,4,6, or 8)
01h    2**N    palette translation values, one per possible pixel value
----------2FCD0A-----------------------------
INT 2F - SWELL.EXE - TURN ON "BORLAND SUPPORT"
       AX = CD0Ah
Return: AX = 0000h
SeeAlso: AX=CD09h"SWELL"
----------2FCF00-----------------------------
INT 2F - TEMPLEXX - INSTALLATION CHECK
       AX = CF00h
Return: AL = FFh if installed
Program: TEMPLEXX is a popup keyboard template by Henson Scientific, Inc.
Note:   values in AL other than 00h cause an immediate return without modifying
         any registers
----------2FD000-----------------------------
INT 2F - MDEBUG display driver - GET DRIVER STATUS
       AX = D000h
Return: CF set on error
           all other registers must be unchanged)
       CF clear if successful
           AL = FFh
           AH = driver semaphor
               00h driver is not active
               01h driver is active
           BX = CS of the driver
           CX = driver version (CH = major, CL = minor, must be >= 013Ch)
           DL = buffer semaphor
               00h driver is not pending
               01h driver is pending between functions 02h and 03h
           DH = show semaphor
               00h driver is not pending
               01h driver is pending between functions 04h and 05h
Notes:  MDEBUG is a shareware memory-resident debugging tool by Bernd Schemmer,
         including a memory monitor, an interpreter and a disassembler
       MDEBUG can use any two consecutive multiplex numbers between C0h and
         FFh; the default is D0h for the display driver and D1h for the
         command driver (see INT 60/AH=00h"MDEBUG" for the actual multiplex
         numbers used)
       this function MUST be reentrant, as MDEBUG calls it after every popup
         before any other actions.  The handler should not change any
         registers if the display is in an unsupported mode or in a mode
         MDEBUG supports itself, e.g. a normal text mode with at least 80x25
         characters (i.e. 80x43 or 132x44 (v1.60+)). In this case MDEBUG will
         not call any of the other functions for this popup session.
       MDEBUG will not call the other functions if the returned version is
         less than the actual version of MDEBUG.
       if the driver is reentrant, DL and DH should be 00h
SeeAlso: AX=D001h,AX=D002h,AX=D003h,AX=D004h,AX=D005h
----------2FD000-----------------------------
INT 2F - ZWmous - INSTALLATION CHECK
       AX = D000h
Return: AX = 5A57h ("ZW") if installed
           BX = segment of resident code
Note:   ZWmous is a shareware TSR by Zen Wu which permits the use of a mouse
         with many non-mouse applications by entering the letter under the
         mouse cursor on button presses
SeeAlso: INT 33/AX=0003h
----------2FD000-----------------------------
INT 2F - Lotus CD/Networker - INSTALLATION CHECK
       AX = D000h
Return: AL = FF if CD/Networker TSR is loaded
       BX = 4D44h ("MD") signature
       CX = Windows mode word (from INT 2F/AX=1600h) at time of TSR load
       DX = bitmap identifying all loaded CD/Networker TSRs.
Notes:  INT 2F/AH=D0h is used by CD/Networker to communicate between a
         resident redirector TSR and a transient program that controls the
         TSR's CD-ROM drive emulation (volume attachments, caching, etc).
       At present there is only one CD/Networker TSR; the bitmap always = 4.
SeeAlso: AX=D002h"Lotus",INT 2F/AX=1500h"CD-ROM"
----------2FD001-----------------------------
INT 2F - MDEBUG display driver - INITIALIZE DRIVER
       AX = D001h
Return: CF set on error
       AL = driver semaphor
       AH = buffer semaphor
Notes:  MDEBUG calls this function after every succesful call of the function
         00h. The function should reset all internal data and the status of
         the driver. If this function returns an error, MDEBUG will not call
         the other functions in this popup session.
       MDEBUG can use any two consecutive multiplex numbers between C0h and
         FFh; the default is D0h for the display driver and D1h for the
         command driver
SeeAlso: AX=D000h
----------2FD002-----------------------------
INT 2F - MDEBUG display driver - SAVE GRAPHIC DATA
       AX = D002h
Return: CF set on error
       CF clear if successful
           display memory saved and display switched to one of the text modes
             02h, 03h or 07h.
Note:   MDEBUG calls this function only once every popup session before
         displaying its windows.
SeeAlso: AX=D000h,AX=D003h
----------2FD002BX4D44-----------------------
INT 2F - Multiplex - Lotus CD/Networker GET DATA AREA
       AX = D002h
       BX = 4D44h
       DX = bitmap identifying one loaded CD/Networker TSR
Return: ES:DI -> data area owned by TSR
Note:   the format of the data area changes with each minor revision, so it
         cannot be counted on
SeeAlso: AX=D000h"Lotus"
----------2FD003-----------------------------
INT 2F - MDEBUG display driver - RESTORE GRAPHIC DATA
       AX = D003h
Return: CF set on error
       CF clear if successful
           display restored to the mode it was in before calling AX=D002h and
             the display memory is restored
Note:   MDEBUG calls this function only once every popup session just before
        it exits to normal DOS.
SeeAlso: AX=D000h,AX=D002h
----------2FD004-----------------------------
INT 2F - MDEBUG display driver - SHOW SAVED DATA
       AX = D004h
Return: CF set on error
       CF clear if successful
           display switched to mode it was in before calling AX=D002h and the
             display memory is restored
Note:   This function needn't save the display memory before changing it.
SeeAlso: AX=D000h,AX=D005h
----------2FD005-----------------------------
INT 2F - MDEBUG display driver - SWITCH BACK TO TEXT SCREEN
       AX = D005h
Return: CF set on error
       CF clear if successful
           display restored to mode it was in before calling AX=D004h
Note:   This function needn't save or change the display memory
SeeAlso: AX=D000h,AX=D004h
----------2FD0-------------------------------
INT 2F - MDEBUG display driver - RESERVED FUNCTION NUMBERS
       AH = D0h
       AL = 06h-7Fh
Note:   these functions are reserved for future use
----------2FD0-------------------------------
INT 2F - MDEBUG display driver - USER DEFINED FUNCTION NUMBERS
       AH = D0h
       AL = 80h-FFh
Note:   these functions numbers are reserved for user defined features (e.g.
         communication between the transient und resident parts of the driver)
----------2FD100-----------------------------
INT 2F - MDEBUG command driver - GET STATUS
       AX = D100h
       BX = version of MDEBUG (BH = major, BL = minor)
       CX = command driver counter
---v1.60+---
       DS:SI -> MDEBUG identification table (see below)
       ES = segment of display memory used by MDEBUG
       DI = size of video mode used by MDEBUG
           (high byte = lines, low byte = columns)
Return: DL = FFh
       BX = version number of the driver if it is less than the version in BX,
            else unchanged
       CX incremented
Notes:  MDEBUG is a shareware memory-resident debugging tool by Bernd Schemmer,
         including a memory monitor, an interpreter, and a disassembler
       called by MDEBUG at start of popup session; if the version number
         returned in BX is less than 1.52 (1.60 for MDEBUG v1.70), MDEBUG will
         not call any of the other functions during this popup session
       MDEBUG can use any two consecutive multiplex numbers between C0h and
         FFh; the default is D0h for the display driver and D1h for the
         command driver (see INT 60/AH=00h"MDEBUG" for the multiplex numbers
         actually used)
       this function must end with a far call to the old INT 2F handler after
         changing the registers
       this function MUST be reentrant
       command drivers must also declare the following data at the given
         offsets in the code segment
               100h  3 BYTEs   JMP-command in .COM-files
               103h    BYTE    NOP-command (90h)
               104h 26 BYTEs   signature "Kommandotreiber f�r MDEBUG"
               11Eh 12 BYTEs   name of driver, e.g. "MDHISDRV.COM"
                               each driver must have a unique name
       MDEBUG will pass every key and command to the command driver(s) before
         checking for a valid internal command
SeeAlso: AX=D000h,AX=D101h

Format of MDEBUG identification table:
Offset  Size    Description
-2     WORD    entry offset
00h    WORD    CS of MDEBUG
02h    DWORD   old INT 08h vector
06h    DWORD   old INT 09h vector
0Ah    DWORD   address INT 16h routine used by MDEBUG
0Eh    BYTE    length of version string
0Fh  N BYTEs   version string
----------2FD101-----------------------------
INT 2F - MDEBUG command driver - INITIALIZE DRIVER
       AX = D101h
       CX = command driver counter
Return: DL = FFh if successful
               CX incremented
            else error: all registers unchanged
Note:   this function must end with a  far call to the old INT 2F handler after
         changing the registers
       this function must be reentrant
----------2FD102-----------------------------
INT 2F - MDEBUG command driver - EXECUTE INTERPRETER COMMAND
       AX = D102h
       BL = first character of the interpreter command
       BH = last character of the interpreter command (or blank)
       DS:SI -> parameter for the interpreter command as ASCIZ string
       DS:DI -> MDEBUG data structure (see below)
Return: AL = FFh
       CF set on error
           AH = error number
               01h syntax error
               02h first shell of the command.com is activ
               03h esc pressed
               04h break pressed
               05h DOS is busy
               06h command ended
               07h division by zero
               08h invalid display driver
               09h invalid command driver
               0Ah error 8 and 9
               0Bh unknown error
               0Ch new error
                   DS:SI -> ASCIZ error message (max 30 characters)
              else unknown error
       CF clear if successful
           AH = return code
               00h continue processing the command line
               01h leave MDEBUG popup session
               02h leave MDEBUG popup session and automatically popup again
                   if the InDOS flag is zero
               03h not used (same as 00h)
               04h not used (same as 00h)
               05h put new command line into the input buffer,
                   DS:SI -> new command line (ASCIZ string, max 66 chars)
               06h process new command line
                   DS:SI -> new command line (ASCIZ string, max 66 chars)
              else unknown status, but continue processing commmand line
Note:   this function must end with a far call to the old INT 2F handler (with
         registers unchanged) if the driver does not support the interpreter
         command in BX.  Otherwise, the driver must not chain to the old
         INT 2F.

Format of MDEBUG data structure:
Offset  Size    Description
00h    WORD    register SE
02h    WORD    register OF
04h    WORD    register FS
06h    WORD    register FO
08h    WORD    register AX
0Ah    WORD    register BX
0Ch    WORD    register CX
0Eh    WORD    register DX
10h    WORD    register SI
12h    WORD    register DI
14h    WORD    register DS
16h    WORD    register ES
18h    WORD    register BP
1Ah    WORD    register SS
1Ch    WORD    register SP
1Eh    WORD    register FL (flags)
20h    WORD    register R0
22h    WORD    register R1
24h    WORD    register R2
26h    WORD    register R3
28h    WORD    register R4
2Ah    WORD    register R5
2Ch    WORD    register R6
2Eh    WORD    register R7
30h    WORD    register R8
32h    WORD    register CS, return-address
34h    WORD    register IP, return-address
36h    DWORD   saved pointer to data for key <F6> (v1.60)
               saved monitor address (v1.70)
3Ah 12 WORDs   saved register values on last popup entry (for <F8> key)
               (original register values at popup entry of MDEBUG)
               AX, BX, CX, DX, SI, DI, DS, ES, BP, SS, SP, flags
52h 12 WORDs   saved register values on last popup exit (for <SHIFT-F8> key)
               AX, BX, CX, DX, SI, DI, DS, ES, BP, SS, SP, flags
6Ah    DWORD   address of the DOS-invars-table
6Eh    DWORD   address of the InDOS flag
72h    WORD    offset of the register which is used for the segment of the
               first monitor window
74h    WORD    offset of the register which is used for the offset of the
               first monitor window
76h    WORD    name of the register which is used for the segment of the
               first monitor segment
78h    WORD    name of the register which is used for the offset of the first
               monitor window
7Ah    WORD    pseudo register 1
7Ch    WORD    pseudo register 2
----------2FD103-----------------------------
INT 2F - MDEBUG command driver - EXECUTE KEY IN THE MONITOR
       AX = D103h
       BX = key code (like result of an interrupt 16h call)
       CX = 0 -> the cursor is in the ASCII column of the monitor
       CX = 1 -> the cursor is in one of the hex fields of the monitor
       DS:SI -> MDEBUG data structure (see AX=D102h)
       ES:DI -> actual byte in the monitor
Return: AL = FFh
       AH = return code
           00h key processed, read next key
           01h leave MDEBUG popup session
           02h leave MDEBUG popup session and automatically popup again if DOS
               is not busy
           03h signal an error (beep)
           04h driver has redefined the key, proceed with the new key
               BX = new key code
               MDEBUG will not pass the new key to the command driver(s)
          else treat like code 00h
Note:   this function must end with a far call to the old INT 2F handler (with
         registers unchanged) if the driver does not support the key in BX.
         Otherwise, the driver must not chain to the old INT 2F.
SeeAlso: AX=D104h
----------2FD104-----------------------------
INT 2F - MDEBUG command driver - EXECUTE KEY IN THE INTERPRETER
       AX = D104h
       DS:SI -> MDEBUG data structure (see AX=D102h)
Return: AL = FFh
       AH = return code
           00h key processed, read next key
           01h leave MDEBUG popup session
           02h leave MDEBUG popup session and automactically popup again if
               DOS is not busy
           03h signal an error (beep)
           04h driver has redefined the key, proceed with the new key
               BX = new key code
               MDEBUG won't pass the new key to the command driver(s)
           05h put new command line into the input buffer
               DS:SI -> new command line (ASCIZ string, max 66 chars)
           06h process new command line
               DS:SI -> new command line (ASCIZ string, max 66 chars)
          else treat like code 00h
Note:   this function must end with a far call to the old INT 2F handler if the
         driver does not support the key in BX.  Otherwise, the driver must
         not chain to the old INT 2F.
SeeAlso: AX=D103h
----------2FD1-------------------------------
INT 2F - MDEBUG command driver - RESERVED FUNCTIONS
       AH = D1h
       AL = 05h-0Ah
Note:   these functions are reserved for future use
----------2FD110-----------------------------
INT 2F - MDEBUG command driver - GET ADDRESS OF THE OLD INT 2F
       AX = D110h
Return: DL = FFh
       ES:BX -> next program in the chain for INT 2F
       CX = code segment of this driver
       DI = offset of driver identification table (see below) (v1.60+)
Notes:  only called by the transient part of the driver
       must be reentrant and the driver must not chain this function to the
         old INT 2F

Format of the driver identification table:
Offset  Size    Description
00h  26 BYTEs   signature "Kommandotreiber f�r MDEBUG"
                                            ^- Note: ASCII 129,German U-umlaut
27h  12 BYTEs   name of driver, e.g. "MDHISDRV.COM"
                each driver must have a unique name
----------2FD111-----------------------------
INT 2F - MDEBUG command driver - START DRIVER
       AX = D111h
Return: DL = FFh
Notes:  only called by the transient part of the driver to inform the resident
         part that it is installed
       the function must be reentrant and the driver mustn't chain this
         function to the old INT 2F
SeeAlso: AX=D101h,AX=D112h
----------2FD112-----------------------------
INT 2F - MDEBUG command driver - END DRIVER
       AX = D112h
Return: DL = FFh
Notes:  only called by the transient part of the driver to inform the resident
         part that it will be released after this function
       the function must be reentrant and the driver mustn't chain this
         function to the old INT 2F
SeeAlso: AX=D101h,AX=D111h
----------2FD1-------------------------------
INT 2F - MDEBUG command driver - RESERVED FUNCTIONS
       AH = D1h
       AL = 13h-7Fh
Note:   these functions are reserved for future use
----------2FD1-------------------------------
INT 2F - MDEBUG command driver - USER DEFINED FUNCTIONS
       AH = D1h
       AL = 80h-FFh
Note:   these functions are reserved for user defined features (e.g.
         communication between the transient und resident parts of the driver)
----------2FD200BX5144-----------------------
INT 2F U - Quarterdeck - QEMM/QRAM/VIDRAM/MANIFEST v5.0+ - INSTALLATION CHECK
       AX = D200h
       BX = 5144h ("QD")
       CX = 4D45h ("ME")
       DX = 4D30h ("M0")
Return: AL = FFh installed
       if BX,CX,DX registers were as specified on entry:
           BX = 4D45h ("ME")
           CX = 4D44h ("MD")
           DX = 5652h ("VR")
Notes:  QEMM/QRAM/VIDRAM/MANIFEST/etc will search for a free AH value from D2h
         through FFh, then C0h through D1h
       for AL <> 0, if the BX/CX/DX values don't match a the identifier of a
         Quarterdeck product, it just chains to the previous INT 2F handler
----------2FD201BX4849-----------------------
INT 2F U - Quarterdeck - GET QD HIMEM PRESENCE
       AX = D201h
       BX = 4849h ("HI")
       CX = 4D45h ("ME")
       DX = 4D51h ("MQ")
Return: BX = 4F4Bh ("OK")
       ES:DI -> HIMEM entry point
Notes:  QEMM/QRAM/VIDRAM/MANIFEST will search for a free AH value from D2h
         through FFh, then C0h through D1h
SeeAlso: AX=D201h/BX=5145h
----------2FD201BX4849-----------------------
INT 2F U - Quarterdeck - QEMM/QRAM v5.0+ - GET HIRAM MEMORY CHAIN
       AX = D201h
       BX = 4849h ("HI")
       CX = 5241h ("RA")
       DX = 4D30h ("M0")
Return: BX = 4F4Bh ("OK")
       CX = segment of start of HIRAM chain
       DX = QEMM/QRAM code segment
Notes:  QEMM/QRAM/VIDRAM/MANIFEST will search for a free AH value from D2h
         through FFh, then C0h through D1h
       QEMM and QRAM both responded the same
       the HIRAM memory chain has the same format as the regular DOS 4.0
         memory chain (see INT 21/AH=52h), except that XMS Upper Memory Blocks
         have the block header program name field set to "UMB"; blocks whose
         "owner" field is set to the QEMM/QRAM code segment returned in DX
         are locked out regions such as video memory and ROMs.
----------2FD201BX4D41-----------------------
INT 2F U - Quarterdeck - MANIFEST v1.0+ - INSTALLATION CHECK
       AX = D201h
       BX = 4D41h ("MA")
       CX = 4E49h ("NI")
       DX = 4645h ("FE")
Return: BX = 5354h ("ST")
Note:   QEMM/QRAM/VIDRAM/MANIFEST will search for a free AH value from D2h
         through FFh, then C0h through D1h
----------2FD201BX4D45-----------------------
INT 2F U - Quarterdeck - DVDOS4GX.DVR - ???
       AX = D201h
       BX = 4D45h ("ME")
       CX = 5155h ("QU")
       DX = 5044h ("PD")
Return: ???
Notes:  AH=D2h is the default; use the Quarterdeck installation check described
         under AX=D200h
       called by QEMM 6.03
----------2FD201BX5145-----------------------
INT 2F U - Quarterdeck - QEMM v5.0+ - INSTALLATION CHECK
       AX = D201h
       BX = 5145h ("QE")
       CX = 4D4Dh ("MM")
       DX = 3432h ("42")
Return: BX = 4F4Bh ("OK")
       ES:DI -> QEMM API entry point (see INT 67/AH=3Fh)
Notes:  QEMM/QRAM/VIDRAM/MANIFEST will search for a free AH value from D2h
         through FFh, then C0h through D1h
       this call is not available under QEMM v6.00 unless Windows3 support
         has been disabled with the NW3 switch to QEMM386.SYS
SeeAlso: AX=D201h/BX=4849h,INT 67/AH=3Fh
----------2FD201BX5649-----------------------
INT 2F U - Quarterdeck - VIDRAM v5.0+ - INSTALLATION CHECK
       AX = D201h
       BX = 5649h ("VI")
       CX = 4452h ("DR")
       DX = 414dh ("AM")
Return: BX = 4F4Bh ("OK")
       ES:DI -> VIDRAM entry point
Note:   QEMM/QRAM/VIDRAM/MANIFEST will search for a free AH value from D2h
         through FFh, then C0h through D1h

Call VIDRAM entry point with:
       AH = 00h get status
               Return: AL = VIDRAM state (see below)
                       BL = bit 0: ???
                            bits 1-7 not used
                       BH = flags???
                           bit 4: high RAM exists in video area???
                       CL = current monitor (01h = mono, 80h = color)
                       SI = current top of memory (paragraph)???
                       DI = segment of ???
       AH = 01h setup
               AL = VIDRAM state (00h off, 01h no EGA graphics, 02h no graph)
               BL = bit 0: ???
                    bits 1-7 not used
               BH = flags???
               CL = monitor (01h = monochrome, 80h = color)
               SI = new top of memory (paragraph)???
       AH = 02h get ???
               Return: ES:DI -> ??? data
Return: CF set on error
       CF clear if successful
----------2FD300BX4562-----------------------
INT 2F U - TeleReplica - INSTALLATION CHECK
       AX = D300h
       BX = 4562h
       CX = 2745h
       DX = serial port I/O base address??? (03F8h for v3.9)
Return: SI = segment of resident code
       AX = 251Dh
       BX = DF21h
       CX = F321h
       DX = ???
----------2FD3CB-----------------------------
INT 2F U - LapLink Quick Connect v6 - API
       AX = D3CBh
       CX = function
           0002h get ???
               Return: BX:AX -> ???
                       CL = ???
                       CH = ???
                       DX = ???
                       DI = COM1 I/O port???
                       SI = COM2 I/O port???
           0003h initialization???
           0004h ???
           0005h initialization???
           0006h reset/clear ???
               Return: AX = 0000h
                       ES:DI -> next byte after ??? cleared by this call
           0007h initialization???
           0008h uninstall
               Return: BX = status
                           0000h successful
                           FFFFh incomplete, stub remains in memory
Return: CX = 534Bh (except function 0002h)
----------2FD44D-----------------------------
INT 2F - 4DOS.COM v2.1+ - API
       AX = D44Dh
       BH = function
           00h installation check
               Return: AX = 44DDh
                       BL = minor version number
                       BH = major version number
                       CX = PSP segment address for current invocation
                       DL = 4DOS shell number (0 for the first (root) shell,
                            updated each time a new copy is loaded)
           01h (internal, v2.1-3.03) terminate current copy of 4DOS
               Return: nothing
               (internal, v4.0) ???
               Return: ES:BX -> data area (see below)
           02h ???
               DX = ???
       ---v2.1-3.03 only---
           03h EXEC program
               CX:DX -> EXEC record
           FEh deallocate shell number (passed through to root shell)
               ???
           FFh allocate shell number (passed through to root shell)
Note:   bug in v3.00 will crash system if unrecognized value in BH
SeeAlso: AX=D44Eh,AX=E44Dh,INT 21/AX=4403h

Format of EXEC record:
Offset  Size    Description
00h    WORD    offset of ASCIZ program name in same segment as EXEC record
02h    WORD    offset of DOS commandline in same segment as EXEC record
04h    WORD    segment of environment for child process (see INT 21/AH=26h)

Format of 4DOS v4.0 data area:
Offset  Size    Description
00h  2 BYTEs   ???
06h    WORD    XMS handle for swapping
       ???
----------2FD44E-----------------------------
INT 2F - 4DOS v3.0+ - AWAITING USER INPUT
       AX = D44Eh
---4DOS v3.01+---
       BX = 0000h 4DOS is ready to display prompt
          = 0001h 4DOS has displayed the prompt, about to accept user input
Return: handler must preserve SI, DI, BP, SP, DS, ES, and SS
Note:   v3.00 only makes the call corresponding to BX=0001h, does not set BX
SeeAlso: AX=D44Dh
----------2FD44FBX0000-----------------------
INT 2F - 4DOS v4.0+ - KSTACK.COM - INSTALLATION CHECK
       AX = D44Fh
       BX = 0000h
Return: AX = 44DDh if installed
SeeAlso: AX=D44Fh/BX=0001h
----------2FD44FBX0001-----------------------
INT 2F - 4DOS v4.0+ - KSTACK.COM - PLACE KEYSTROKES INTO KEYSTACK
       AX = D44Fh
       BX = 0001h
       CX = number of keystrokes (01h-FFh)
       DS:DX -> keystroke list (one word per keystroke)
Return: AX = status
           0000h successful
           nonzero failed
       BX,CX,DX destroyed
Notes:  the keystrokes are the exact values to return from subsequent calls to
         INT 16 with AH=00h,01h,10h, or 11h, with the following exceptions:
               0000h causes subfunctions 01h and 11h to indicate an empty
                       keyboard buffer
               FFFFh is followed by a word indicating the number of clock
                       ticks to delay before the next faked keystroke
       v4.00 KSTACK overwrites any unread keystrokes from the previous
         invocation, and does not range-check CX; it will overwrite memory
         following the resident portion if CX is greater than 100h.
SeeAlso: AX=D44Fh/BX=0000h,INT 16/AH=00h,INT 21/AX=4403h
----------2FD600-----------------------------
INT 2F - HEART.COM - INSTALLATION CHECK
       AX = D600h
Return: AX = 0303h (two hearts) if installed
           ES:DI -> buffer (see below)
Program: HEART.COM is a CPU lock-up/critical indicator utility by Mitch Davis.
Notes:  Once the host program has identified the address of the data area, it
         can change this to indicate safe/critical, alternate colours, etc.
       The entries for the color table are in char/attrib form.  Every two
         entries form a pair which is alternated between 68 times a minute.
         The first half of the table is for color videos, the second mono.
         Within each half, the first half is for the safe chars, and the
         second for the critical chars.

Format of buffer:
Offset  Size    Description
00h  8 WORDs   table of colors/attributes (see notes above)
10h    BYTE    flags
               bit 0: program is in critical section, so flash double
                       exclamation mark
               bit 1: program is in safe code, so flash the heart character
11h    WORD    position of heartbeat on screen, normally 009Eh (last column
               of second line)
----------2FD600-----------------------------
INT 2F U - VEDIT VSWAP - INSTALLATION CHECK
       AX = D600h
Return: AL = D6h if installed
Note:   VSWAP is the resident portion of VEDIT's "swapper" capability.
       VEDIT is a programmer's text editor by Greenview Data.
SeeAlso: AX=D601h,AX=D602h
----------2FD601-----------------------------
INT 2F U - VEDIT VSWAP - ???
       AX = D601h
       BL = subfunction number???
Return: BL = return code ???
       ES = resident portion's data??? segment
       DX = resident portion's code segment
SeeAlso: AX=D600h"VSWAP"
----------2FD602-----------------------------
INT 2F U - VEDIT VSWAP - EXEC PROGRAM WITH SWAP
       AX = D602h
       other registers set as for INT 21/AX=4B00h
Return: CF set on error
           AL = error code
               82h = failure due to ???
       CF clear on success
SeeAlso: AX=D600h"VSWAP",INT 21/AH=4Bh"EXEC"
----------2FD701-----------------------------
INT 2F - BANYAN VINES v4+ - GET BANV INTERRUPT NUMBER
       AX = D701h
Return: AX = 0000h installed
           BX = interrupt number (60h to 66h)
          nonzero not present
Note:   if AX is nonzero, VINES 3.x or earlier may be installed, thus it is
         necessary to examine the four bytes preceding the handlers for
         INT 60 through INT 66 for the string "BANV"
SeeAlso: AX=D702h,AX=D703h,AX=D704h
----------2FD702-----------------------------
INT 2F U - BANYAN VINES v4+ - PCPRINT interface
       AX = D702h
       BX = function
       ???
Return: ???
SeeAlso: AX=D701h,AX=D703h,INT 61/AX=0005h"Banyan"
----------2FD703-----------------------------
INT 2F U - BANYAN VINES v4+ - MAIL interface
       AX = D703h
       BX = function
       ???
Return: ???
SeeAlso: AX=D702h,AX=D704h
----------2FD704-----------------------------
INT 2F U - BANYAN VINES v4+ - Streettalk Directory Assistance interface
       AX = D704h
       BX = function
       ???
Return: ???
SeeAlso: AX=D703h,INT 61/AX=0007h"Banyan"
----------2FD800-----------------------------
INT 2F - Novell NetWare Lite - CLIENT.EXE - INSTALLATION CHECK
       AX = D800h
Return: AL = FFh if installed
           DX = version number??? (0100h in 1.00)
           BX = data segment of resident copy???
           ES:DI = FAR entry point for API routines
                   Load BX = function number and call for various
                   functions.  Functions 00h - 10h supported in 1.00.
SeeAlso: AX=7A00h,AX=D880h
----------2FD880-----------------------------
INT 2F - Novell NetWare Lite - SERVER.EXE - INSTALLATION CHECK
       AX = D880h
Return: AL = FFh if installed
           DX = version number??? (0100h in 1.00)
           BX = Data segment of resident copy???
           CL = 01h if SERVER is active
              = 00h if SERVER is disabled
SeeAlso: AX=7A00h,AX=D800h
----------2FDA00-----------------------------
INT 2F - ZyXEL ZFAX - INSTALLATION CHECK
       AX = DA00h
Return: AH = enabled state (00h = enabled, 01h = disabled)
       AL = 5Ah installed
Note:   ZFAX is the bundled FAX software which comes with the ZyXEL model
         fax modems.
SeeAlso: AX=CBDCh,AX=DA01h,AX=DA02h,AX=DA03h
----------2FDA01-----------------------------
INT 2F - ZyXEL ZFAX - UNINSTALL
       AX = DA01h
Return: AL = 00h Success
            01h Failure
SeeAlso: AX=DA00h
----------2FDA02-----------------------------
INT 2F - ZyXEL ZFAX - DISABLE
       AX = DA02h
Return: AL = 00h
SeeAlso: AX=DA03h
----------2FDA03-----------------------------
INT 2F - ZyXEL ZFAX - ENABLE
       AX = DA03h
Return: AL = 00h
SeeAlso: AX=DA02h
----------2FDA55-----------------------------
INT 2F U - TRAP.COM - INSTALLATION CHECK
       AX = DA55h
       DL = interrupt number
       DH = ???
Return: if installed
           AH = interrupt number
           AL = ???
           ES:BX -> ???
Notes:  TRAP is an interrupt call tracer by Patrick Phillipot/Udo Chrosziel
       a separate copy of TRAP is loaded for each interrupt to be traced; thus
         the interrupt number is part of the installation check
----------2FDC00-----------------------------
INT 2F - GOLD.COM - INSTALLATION CHECK
       AX = DC00h
Return: AL = 00h not installed
          = FFh installed
Note:   GOLD is a TSR by Bob Eager which makes the NumLock key return the code
         for F1; the purpose is to improve Kermit's VTxxx emulation
----------2FDC01-----------------------------
INT 2F - GOLD.COM - GET STATE
       AX = DC01h
Return: AL = status
           00h off
           01h on
SeeAlso: AX=DC00h,AX=DC02h
----------2FDC02-----------------------------
INT 2F - GOLD.COM - SET STATE
       AX = DC02h
       DL = new state
           00h off
           01h on
Return: AL = 00h (OK)
SeeAlso: AX=DC01h
----------2FDD-------------------------------
INT 2F - SoftCom programs - API
       AH = DDh
       AL = FEh get info
           Return: ES:BX -> TSR info list (see below)
       AL = program identifier
           BH = function
               FDh get version
                   Return: BX = version
               FFh installation check
                   Return: AL = FFh if installed
                               BX = version
                               ES = segment of resident code
               others vary by program
Return: AL = status
           bit 7 set on error
           AL = 81h unknown function

Format of TSR info list:
Offset  Size    Description
00h  9 BYTEs   blank-padded ASCIZ program name
09h    BYTE    program ID
0Ah    WORD    program's PSP segment
0Ch    WORD    program version (major in high byte)
0Eh    DWORD   pointer to next item in info list or 0000h:0000h
12h    BYTE    number of interrupts hooked
13h  5 BYTEs   interrupt numbers hooked by program
18h  8 BYTEs   reserved
----------2FDE00BX4445-----------------------
INT 2F - DESQview v2.26+ External Device Interface - INSTALLATION CHECK
       AX = DE00h
       BX = 4445h ("DE")
       CX = 5844h ("XD")
       DX = 4931h ("I1")
Return: AL = FFh if installed (even if other registers do not match)
       if BX,CX, and DX were as specified on entry,
           BX = 4845h ("HE")
           CX = 5245h ("RE")
           DX = 4456h ("DV")
Notes:  AH=DEh is the default XDI multiplex number, but may range from C0h-FFh
       programs should check for XDI starting at DEh to FFh, then C0h to DDh
       the XDI handler should not issue any DOS or BIOS calls, nor should it
         issue DESQview API calls other than those allowed from hardware ints
SeeAlso: AX=DE02h,INT 15/AX=5400h
----------2FDE01-----------------------------
INT 2F - DESQview v2.26+ External Device Interface - DRIVER CUSTOM SUBFUNCTION
       AX = DE01h
       BX = driver ID
       other registers as needed by driver
Notes:  XDI drivers should pass this call through to previous handler if ID
         does not match
       DESQview never calls this function
----------2FDE01BX4450-----------------------
INT 2F U - Quarterdeck QDPMI.SYS v1.0 - INSTALLATION CHECK
       AX = DE01h
       BX = 4450h ("DP")
       CX = 4D49h ("MI")
       DX = 3039h ("09")
Return: AL = FFh if installed
           BX = 4D42h ("MB")
           CX = 4921h ("I!")
           DX = 8F4Fh
           ES:DI -> filename of DPMI host overlay
Note:   the installation check consists of testing for the existence of the
         character device QDPMI$$$
----------2FDE01BX5242-----------------------
INT 2F - DESQview v2.26+ XDI - CUSTOM SUBFUNCTION, Ralf Brown's XDI drivers
       AX = DE01h
       BX = 5242h ("RB")
       CX:DX = program identifier
               656F7000h ("eop",0) for DVeop
Return: AX = 5242h ("RB") if installed
           ES:BX -> data or entry point
           CX = version number (CH = major, CL = minor)

Call DVeop entry point with:
       ES:DI -> callback address or 0000h:0000h to remove callback
Return: AX = status
           0000h failed (callback table full or attempted to remove non-
                       existent callback)
           0001h successful
               ES:DI -> chaining address
       BX,CX,DX destroyed
Notes:  the callback function is called with a simulated interrupt when the
         DESQview window containing it is closed; it should perform all
         necessary cleanup and then perform a FAR jump to the chaining address
         or an IRET if the chaining address is 0000h:0000h
       if the program wishes to remove itself before the window is closed, it
         should call the DVeop entry point with the previously returned
         chaining address and ignore the returned chaining address.
----------2FDE01BX7474-----------------------
INT 2F - DESQview v2.26+ XDI - CUSTOM SUBFUNCTION, DVTXDI.COM
       AX = DE01h
       BX = 7474h
       CL = function
           00h installation check
               Return: AL = FFh
           01h get process handle
               DX = keys on Open Window menu (DL = first, DH = second)
               Return: AX = process handle or 0000h if not running
           02h (v1.3+) set TMAN handle
               DX = TMAN process handle
           03h (v1.3+) set open keys to ignore on next CL=01h call
               DX = keys on Open Window menu (DL = first, DH = second)
Return: BX = 4F4Bh ("OK")
       DL destroyed
Note:   DVTXDI is distributed as part of the shareware products DVTree (DOS
        shell/DESQview process manager) and DVTMAN by Mike Weaver
----------2FDE01BX7575-----------------------
INT 2F - DESQview v2.26+ XDI - CUSTOM SUBFUNCTION, DVSIXDI.COM
       AX = DE01h
       BX = 7575h
       CX = function
           0000h installation check
               Return: AX = 00FFh if installed
           0001h turn on notification (currently unused)
               Return: AX = 0001h
           0002h turn off notification (currently unused)
               Return: AX = 0001h
           0003h get process information
               Return: AX = status
                           0000h failed
                           0001h successful
                               BX = last instantaneous time slice
                                       in 1/100s (v1.10)
                                       in 1/18s (v1.11+)
                               CX = number of processes
                               DX = number of "(starting)" records (v2.00+)
                               SI = number of records in process info array
                                    (v2.00+) (always 15 for v1.x)
                               ES:DI -> process info array (see below)
           0004h get version
               Return: AH = major version
                       AL = minor version
           0005h (v1.10+) get time since DESQview started
               Return: DX:AX = 1/100s since DV start (v1.10)
                       DX:AX = 1/18s since DV start (v1.11+)
           0006h (v1.10+) get number of task switches
               Return: DX:AX = total task switches
                       CX = task switches in last instantaneous interval
Notes:  DVSIXDI is part of the DVSI (DESQview System Information) package by
         Daniel J. Bodoh
       for v1.00, function 0003h allocates common memory, which the caller
         must deallocate after reading the process information; only the
         currently used records are placed in the buffer
       for v1.10+, function 0003h merely returns a pointer to the internal
         array of process information; the caller should make a copy of the
         array while inside a critical section (see INT 15/AX=101Bh).  Only
         those records with bit 7 of the first byte set are valid.

Format of information for one process (v1.00):
Offset  Size    Description
00h    BYTE    flags
               bit 7: process slot is valid
01h    WORD    offset into DESQVIEW.DVO of program's record if started from
               Open Windows menu, else undefined
03h    WORD    Switch Windows window number
05h    WORD    segment of process handle
07h    WORD    number of tasks owned by process
09h    WORD    mapping context of process
0Bh    DWORD   hook for other programs

Format of information for one process (v1.10-v2.00):
Offset  Size    Description
00h    BYTE    flags
               bit 7: valid record
                   6: (v2.00+) record is allocated; if bit 7 clear, process
                       is "(starting)" and only offsets 01h and 09h are valid
                   5: (v2.00+) this app currently owns the CPU
                   4: reserved (0)
                   3: DESQview system task
                   2: reserved (0)
                   1: task has keyboard (currently unused)
                   0: task swapped out (currently unused)
01h    WORD    Open Window keys
03h    WORD    Switch Windows number
05h    WORD    segment of process handle
07h    WORD    number of tasks for process
09h    WORD    process mapping context
0Bh    DWORD   time process started (relative to start of DESQview)
0Fh    DWORD   time process last got CPU (relative to start of DESQview)
13h    DWORD   time process last gave up CPU (relative to start of DESQview)
17h    DWORD   total CPU time since process started
1Bh    DWORD   CPU time at start of current instantaneous interval
1Fh    DWORD   CPU time in current instantaneous interval
23h    DWORD   hook for other programs
Note:   all times are in 1/100s for v1.10, in 1/18s for v1.11+
----------2FDE01BXFFFE-----------------------
INT 2F U - DESQview v2.26+ XDI - DVXMS.DVR - ???
       AX = DE01h
       BX = FFFEh
       CX = 4D47h ("MG")
       DX = 0052h (0,"R")
Return: AL = FFh
       DX = 584Dh
----------2FDE02-----------------------------
INT 2F - DESQview v2.26+ External Device Interface - DV INITIALIZATION COMPLETE
       AX = DE02h
       BX = mapping context of DESQview
       DX = handle of DESQview system task
Note:   driver should pass this call to previous handler after doing its work
SeeAlso: AX=DE03h,AX=DE0Fh,INT 15/AX=5400h
----------2FDE03-----------------------------
INT 2F - DESQview v2.26+ External Device Interface - DV TERMINATION
       AX = DE03h
       BX = mapping context of DESQview
       DX = handle of DESQview system task
Notes:  driver should pass this call to previous handler before doing its work
       DESQview makes this call when it is exiting, but before unhooking any
         interrupt vectors
SeeAlso: AX=DE02h,AX=DE0Fh,INT 15/AX=5407h
----------2FDE04-----------------------------
INT 2F - DESQview v2.26+ External Device Interface - ADD PROCESS
       AX = DE04h
       BX = mapping context of new process
       DX = handle of process
Return: nothing
Notes:  XMS XDI handler (installed by default) allocates a 22-byte record
         (see below) from "common" memory to control access to XMS memory
       all DOS, BIOS, and DV API calls are valid in handler
       driver should pass this call to previous handler after processing it
SeeAlso: AX=DE05h,AX=DE06h,INT 15/AX=5401h

Format of XMS XDI structure:
Offset  Size    Description
00h    DWORD   pointer to 10-byte record???
04h    DWORD   pointer to next XMS XDI structure
08h    WORD    mapping context
0Ah    BYTE    ???
0Bh  5 BYTEs   XMS entry point to return for INT 2F/AX=4310h
               (FAR jump to next field)
10h  6 BYTEs   FAR handler for XMS driver entry point
               (consists of a FAR CALL followed by RETF)
----------2FDE05-----------------------------
INT 2F - DESQview v2.26+ External Device Interface - REMOVE PROCESS
       AX = DE05h
       BX = mapping context of process
       DX = handle of last task in process
Return: nothing
Notes:  XMS XDI handler releases the structure allocated by AX=DE04h
       driver should pass this call to previous handler before processing it
       all DOS, BIOS, and DV API calls except those generating a task switch
         are valid in handler
SeeAlso: AX=DE04h,AX=DE07h,INT 15/AX=5402h
----------2FDE06-----------------------------
INT 2F - DESQview v2.26+ External Device Interface - CREATE TASK
       AX = DE06h
       BX = mapping context of process containing task
       DX = handle of new task
Notes:  driver should pass this call to previous handler after processing it
       all DOS, BIOS, and DV API calls are valid in handler
----------2FDE07-----------------------------
INT 2F - DESQview v2.26+ External Device Interface - TERMINATE TASK
       AX = DE07h
       BX = mapping context of process containing task
       DX = handle of task
Notes:  driver should pass this call to previous handler before processing it
       all DOS, BIOS, and DV API calls except those generating a task switch
         are valid in handler
SeeAlso: AX=DE04h,AX=DE06h,AX=DE10h
----------2FDE08-----------------------------
INT 2F - DESQview v2.26+ External Device Interface - SAVE STATE
       AX = DE08h
       BX = mapping context of task being switched from
       DX = handle of task being switched from
Notes:  invoked prior to task swap, interrupts, etc
       driver should pass this call to previous handler after processing it
SeeAlso: AX=DE09h,INT 15/AX=5403h,INT 15/AX=DE27h
----------2FDE09-----------------------------
INT 2F - DESQview v2.26+ External Device Interface - RESTORE STATE
       AX = DE09h
       BX = mapping context of task being switched to
       DX = handle of task being switched to
Notes:  state is restored except for interrupts
       driver should pass this call to previous handler before processing it
SeeAlso: AX=DE08h,INT 15/AX=5404h,INT 15/AX=DE27h
----------2FDE0A-----------------------------
INT 2F - DESQview v2.26+ External Device Interface - CHANGE KEYBOARD FOCUS
       AX = DE0Ah
       BX = mapping context of task receiving focus
       DX = handle of running task
Notes:  driver should pass this call to previous handler before processing it
       this call often occurs inside a keyboard interrupt
SeeAlso: INT 15/AX=DE26h,INT 15/AX=DE2Fh
----------2FDE0B-----------------------------
INT 2F - DESQview v2.26+ External Device Interface - DVP PROCESSING COMPLETE
       AX = DE0Bh
       BX = mapping context of DESQview system task
       CX = number of system memory paragraphs required for the use of all
               XDI drivers (DV will add this to system memory in DVP buffer)
       DX = handle of DESQview system task
       SI = mapping context of new process if it starts
       ES:DI -> DVP buffer
Return: CX incremented as needed
Notes:  once DV invokes this function, the DVP buffer contents may be changed
       driver should pass this call to previous handler before processing it
----------2FDE0C-----------------------------
INT 2F - DESQview v2.26+ External Device Interface - SWAP OUT PROCESS
       AX = DE0Ch
       BX = mapping context of task being swapped out
       DX = handle of DESQview system task
Note:   driver should pass this call to previous handler after processing it
----------2FDE0D-----------------------------
INT 2F - DESQview v2.26+ External Device Interface - SWAP IN PROCESS
       AX = DE0Dh
       BX = mapping context of process just swapped in
       DX = handle of DESQview system task
Note:   driver should pass this call to previous handler before processing it
----------2FDE0E-----------------------------
INT 2F - DESQview v2.26+ External Device Interface - DVP START FAILED
       AX = DE0Eh
       BX = mapping context of DESQview system task
       DX = handle of DESQview system task
       SI = mapping context of failed process (same as for call to AX=DE0Bh)
Note:   driver should pass this call to previous handler after processing it
----------2FDE0F-----------------------------
INT 2F - DESQview v2.50+ External Device Interface - INITIALIZE DV
       AX = DE0Fh
Note:   DESQview 2.50+ calls this function just before it completes its
         initialization.  At the time of the call, DESQview has not yet
         changed any interrupt vectors
SeeAlso: AX=DE02h
----------2FDE10-----------------------------
INT 2F - DESQview v2.50+ External Device Interface - FREE TASK
       AX = DE10h
       BX = mapping context of process
       DX = task handle of process
Note:   DESQview 2.50+ calls this function before it frees the task; it is
         similar to AX=DE07h but allows the XDI handler to make calls which
         cause context switches
SeeAlso: AX=DE06h,AX=DE07h
----------2FDF--BX4448-----------------------
INT 2F U - HyperDisk v4.20+ - INSTALLATION CHECK
       AH = DFh
       BX = 4448h ('DH')
Return: AL = FFh if installed
           CX = 5948h ('YH')
           BX:DX -> ??? in resident portion if BX=4448h on entry
Note:   HyperDisk is a shareware disk cache by HyperWare (Roger Cross)
SeeAlso: INT 13/AX=8EEDh
----------2FE000-----------------------------
INT 2F - SETDRVER.COM v2.10+ - INSTALLATION CHECK
       AX = E000h
Return: AX = 4A52h ("JR") if present
Program: SETDRVER is a public domain TSR by Jacob Rieper which sets the
         apparent DOS version analogously to MSDOS SETVER
Note:   this installation check differs from the usual one of returning AL=FFh
SeeAlso: AX=E001h,INT 21/AH=52h
----------2FE001-----------------------------
INT 2F - SETDRVER.COM v2.10+ - GET SETDRVER VERSION
       AX = E001h
Return: AH = major version
       AL = minor version
SeeAlso: AX=E000h
----------2FE002-----------------------------
INT 2F - SETDRVER.COM v2.10+ - GET ORIGINAL DOS VERSION INFO
       AX = E002h
Return: AL = FFh if successful
           BH = major DOS version
           BL = minor DOS version
           CH = DOS version flag
           CL = OEM number
           DH = major DR-DOS version number (FFh if unknown)
           DL = minor DR-DOS version number (FFh if unknown)
SeeAlso: AX=E003h,AX=E007h,INT 21/AH=30h
----------2FE003-----------------------------
INT 2F - SETDRVER.COM v2.10+ - RESET INTERNAL VARIABLES
       AX = E003h
       BH = new major DOS version
       BL = new minor DOS version
       CH = new DOS version flag
       CL = new DOS revision number
       DH = new OEM number
SeeAlso: AX=E002h
----------2FE004-----------------------------
INT 2F - SETDRVER.COM v2.10+ - ENABLE TSR
       AX = E004h
Return: AL = FFh if successful
SeeAlso: AX=E000h,AX=E005h,AX=E006h
----------2FE005-----------------------------
INT 2F - SETDRVER.COM v2.10+ - DISABLE TSR
       AX = E005h
Return: AL = FFh if successful
SeeAlso: AX=E000h,AX=E004h,AX=E006h
----------2FE006-----------------------------
INT 2F - SETDRVER.COM v2.10+ - GET TSR STATUS
       AX = E006h
Return: AL = FFh if successful
           BL = status
               01h resident and active
               02h resident and inactive
----------2FE007-----------------------------
INT 2F - SETDRVER.COM v2.10+ - GET TaskMAX STATUS AT INSTALLATION
       AX = E007h
Return: AL = FFh if successful
           BL = status
               00h if TaskMAX not loaded before SETDRVER
               FFh if TaskMAX was loaded before SETDRVER
SeeAlso: AX=E003h
----------2FE0-------------------------------
INT 2F - SETDRVER.COM - RESERVED FOR FUTURE USE
       AH = E0h
       AL = 08h-10h
----------2FE300-----------------------------
INT 2F - ANARKEY.COM - INSTALLATION CHECK
       AX = E300h
Return: AL = 00h not installed
            FEh if installed but suspended (v3.0+)
            FFh installed
Notes:  ANARKEY.COM is a commandline recall program by Steven Calwas
       E3h is the default function number, but can be set to any value from
         C0h to FFh
SeeAlso: AX=E301h,AX=E302h,AX=E303h,AX=E304h,AX=E305h,AX=E306h,AX=E307h
----------2FE301-----------------------------
INT 2F U - ANARKEY.COM v2+ - GET ???
       AX = E301h
Return: DX:BX -> ???
SeeAlso: AX=E300h

Format of returned data structure for ANARKEY v2.0:
Offset  Size    Description
-7   7 BYTEs   signature ('ANARKEY')
00h    WORD    ??? (I see 0001h in v2.0)
02h    WORD    ??? (I see 0001h in v2.0)
04h    WORD    ??? (I see 0 in v2.0)
06h    WORD    PSP segment of next program loaded

Format of returned data structure for ANARKEY v3+:
Offset  Size    Description
-1     BYTE    multiplex number
00h    WORD    ??? (I see 0001h in v3.0-4.0)
02h    WORD    ??? (I see 0001h in v3.0-4.0)
04h    BYTE    ??? (I see 0 in v3.0-4.0)
05h    WORD    PSP segment of next program loaded
----------2FE302-----------------------------
INT 2F U - ANARKEY.COM v3+ - ???
       AX = E302h
       BL = ???
Return: ???
SeeAlso: AX=E300h
----------2FE303-----------------------------
INT 2F U - ANARKEY.COM v3+ - ANARKMD API
       AX = E303h
       BL = function
           01h toggle insert mode
           02h display contents of history buffer
           03h write history buffer to file
               ES:DX -> file name
           04h clear history buffer
           05h undefine all aliases
           06h show aliases
           07h list programs using Unix switchar
           08h jump to bottom of history buffer
           09h (v4.0) add string to history buffer
               ES:DX -> ASCIZ string
           0Ah (v4.0) ???
               ES:DX -> ???
           0Bh (v4.0) copy string to edit buffer for use as next input line
               ES:DX -> ASCIZ string
           0Ch (v4.0) ???
           0Dh (v4.0) copy ??? to ???
           0Eh (v4.0) ???
           0Fh (v4.0) ???
           10h (v4.0) set ??? flag
           11h (v4.0) display error message about running in EMS under Windows
Return: ???
SeeAlso: AX=E300h
----------2FE304-----------------------------
INT 2F U - ANARKEY.COM v2+ - ???
       AX = E304h
       BL = ???
Return: ???
SeeAlso: AX=E300h
----------2FE305-----------------------------
INT 2F U - ANARKEY.COM v3+ - ENABLE/SUSPEND ANARKEY
       AX = E305h
       BL = new state
           01h suspended
           00h enabled
SeeAlso: AX=E300h
----------2FE306-----------------------------
INT 2F U - ANARKEY.COM v4.0 - GET ???
       AX = E306h
Return: AX = ???
SeeAlso: AX=E300h
----------2FE307-----------------------------
INT 2F U - ANARKEY.COM v4.0 - GET ???
       AX = E307h
Return: AX = ???
       BL = ???
SeeAlso: AX=E300h
----------2FE44D-----------------------------
INT 2F - NDOS - API
       AX = E44Dh
Note:   as NDOS is a licensed version of 4DOS v3.03, the API is identical to
         that for 4DOS, except that AH=E4h instead of D4h and the installation
         check returns AX=44EEh instead of AX=44DDh
SeeAlso: AX=D44Dh,AX=E44Eh
----------2FE44EBX0000-----------------------
INT 2F - NDOS - AWAITING USER INPUT
       AX = E44Eh
       BX = 0000h NDOS is ready to display prompt
          = 0001h NDOS has displayed the prompt, about to accept user input
Return: handler must preserve SI, DI, BP, SP, DS, ES, and SS
SeeAlso: AX=E44Dh
----------2FED00-----------------------------
INT 2F - Phar Lap DOS EXTENDERS - INSTALLATION CHECK
       AX = ED00h
       BL = DOS extender
           01h 286dosx v1.3+ (Software Development Kit)
           02h 286dosx v1.3+ (Run-Time Kit)
           03h 386dosx v4.0+ (SDK)
           04h 386dosx v4.0+ (RTK)
Return: AL = status
           00h not installed
           FFh installed
               SI = 5048h ("PH")
               DI = 4152h ("AR")
               CH = major version number
               CL = minor version number
               DX = flags
                   bit 0: running under DPMI
                       1: running under Phar Lap VMM
SeeAlso: AH=A1h,AX=F100h,AX=FBA1h
----------2FED80-----------------------------
INT 2F - Phar Lap 286|DOS Extender Lite v2.5 - ???
       AX = ED80h
       BL = DOS extender ID (see AX=ED00h)
       SI = 5048h ("PH")
       DI = 4152h ("AR")
       ???
Return: ???
----------2FEE00-----------------------------
INT 2F - GRIDLOC.EXE - INSTALLATION CHECK
       AX = EE00h
Return: AL = FFh if installed
Note:   GRIDLOC is a PC security program by Intelligent Security Systems, Inc.
----------2FF000-----------------------------
INT 2F U - 4MAP - INSTALLATION CHECK
       AX = F000h
Return: AX = 00FFh
Notes:  returns AX=00FFh for any value of AL not listed here
       4MAP is a keybinding program for 4DOS (see AX=D44Dh) by Ho-Ping Tseng
----------2FF001-----------------------------
INT 2F U - 4MAP - GET KEY MAPPINGS
       AX = F001h
Return: ES:BX -> key mappings
SeeAlso: AX=F000h
----------2FF002-----------------------------
INT 2F U - 4MAP - INSERT CHARACTER INTO ???
       AX = F002h
       BL = character to insert
Return: AX = status
           0000h successful
           0001h buffer full
SeeAlso: AX=F000h,AX=F003h
----------2FF003-----------------------------
INT 2F U - 4MAP - INSERT CHARACTER INTO ???
       AX = F003h
       BL = character to insert
Return: AX = status
           0000h successful
           0001h buffer full
SeeAlso: AX=F000h,AX=F002h
----------2FF1-------------------------------
INT 2F U - MIN-MEM v2.11 - INSTALLATION CHECK
       AH = F1h
       AL <> F1h
Return: AL = F1h if installed
Note:   MIN-MEM is a shareware TSR manager by Biologic which permits up to 24
         popup TSRs to be loaded but swapped out to disk, EMS, or XMS.  One
         TSR at a time is brought back into memory at the user's request.
----------2FF100-----------------------------
INT 2F - DOS EXTENDER INSTALLATION CHECK
       AX = F100h
Return: AL = FFh if DOS extender present
           SI = 444Fh ("DO")
           DI = 5358h ("SX")
Note:   supported or soon to be supported by Phar Lap, Rational, Ergo, and IGC
SeeAlso: AH=A1h,AX=ED00h,AX=FBA1h/BX=0081h,INT 15/AX=BF02h
----------2FF700-----------------------------
INT 2F - AUTOPARK.COM - INSTALLATION CHECK
       AX = F700h
Return: AL = 00h not installed
            FFh installed
Note:   AUTOPARK.COM is a resident hard disk parker by Alan D. Jones
----------2FF701-----------------------------
INT 2F - AUTOPARK.COM - SET PARKING DELAY
       AX = F701h
       BX:CX = 32-bit count of 55ms timer ticks
----------2FFB-------------------------------
INT 2F - Multiplex - RESERVED BY BORLAND INTERNATIONAL
       AH = FBh
----------2FFB00-----------------------------
INT 2F U - AutoBraille v1.1A - INSTALLATION CHECK
       AX = FB00h
Return: AX = 00FFh if installed
Note:   AutoBraille is a shareware text-to-braille converter by KANSYS, Inc.
SeeAlso: INT 10/AH=38h,INT 14/AX=F0F1h
----------2FFB00-----------------------------
INT 2F U - Jot-It! v1.50 - INSTALLATION CHECK
       AX = FB00h
Return: AX = FFFFh if installed
           BX = version (BCD, BH=major, BL=minor)
SeeAlso: AX=FB03h"Jot-It",AX=FB01h"Jot-It"
----------2FFB01-----------------------------
INT 2F U - AutoBraille v1.1A - ???
       AX = FB01h
       ???
Return: ???
----------2FFB01-----------------------------
INT 2F U - Jot-It! v1.50 - GET USER NAME
       AX = FB01h
Return: DX:BX -> ASCIZ user name
SeeAlso: AX=FB02h"Jot-It"
----------2FFB02-----------------------------
INT 2F U - AutoBraille v1.1A - ???
       AX = FB02h
Return: AH = ???
       AL = ???
----------2FFB02-----------------------------
INT 2F U - Jot-It! v1.50 - GET MESSAGE DIRECTORY
       AX = FB02h
Return: DX:BX -> ASCIZ name of directory in which messages are stored
SeeAlso: AX=FB01h"Jot-It"
----------2FFB03-----------------------------
INT 2F U - AutoBraille v1.1A - GET NEXT ???
       AX = FB03h
Return: AX = ???
----------2FFB03-----------------------------
INT 2F U - Jot-It! v1.50 - UNINSTALL
       AX = FB03h
Return: resident code removed from memory
Note:   CAUTION: NO checks are performed to ensure that the interrupt vectors
         being unhooked (08h,09h,28h,2Fh) actually point at the Jot-It! code
SeeAlso: AX=FB00h"Jot-It"
----------2FFB-------------------------------
INT 2F U - AutoBraille v1.1A - SET ???
       AH = FBh
       AL = 04h-08h
Return: AX = 0000h
----------2FFB-------------------------------
INT 2F U - AutoBraille v1.1A - SET ???
       AH = FBh
       AL = 09h-0Fh (???, 0Eh = COM1, 0Fh = COM2)
Return: ???
Note:   AutoBraille is a shareware text-to-braille converter by KANSYS, Inc.
----------2FFB-------------------------------
INT 2F U - AutoBraille v1.1A - SET ???
       AH = FBh
       AL = 10h-1Fh
       ???
Return: ???
----------2FFB20-----------------------------
INT 2F U - AutoBraille v1.1A - SET ??? FLAGS
       AX = FB20h
       BL = flags to set
SeeAlso: AX=FB21h"AutoBraille"
----------2FFB21-----------------------------
INT 2F U - AutoBraille v1.1A - CLEAR ??? FLAGS
       AX = FB21h
       BL = flags to clear
SeeAlso: AX=FB20h"AutoBraille"
----------2FFB22-----------------------------
INT 2F U - AutoBraille v1.1A - SET ???
       AX = FB22h
       BL = ???
Note:   AutoBraille is a shareware text-to-braille converter by KANSYS, Inc.
----------2FFB28-----------------------------
INT 2F U - AutoBraille v1.1A - ???
       AX = FB28h
       BX = ???
       ???
Return: ???
SeeAlso: AX=FB29h"AutoBraille"
----------2FFB29-----------------------------
INT 2F U - AutoBraille v1.1A - ???
       AX = FB29h
       BX = ???
       ???
Return: ???
SeeAlso: AX=FB28h"AutoBraille"
----------2FFB-------------------------------
INT 2F U - AutoBraille v1.1A - SET ???
       AH = FBh
       AL = 2Bh-34h
       BX = ???
----------2FFB35-----------------------------
INT 2F U - AutoBraille v1.1A - SET ???
       AX = FB35h
       BL = ???
----------2FFB36-----------------------------
INT 2F U - AutoBraille v1.1A - SET ???
       AX = FB36h
       BL = ???
----------2FFB37-----------------------------
INT 2F U - AutoBraille v1.1A - SET ???
       AX = FB37h
       BL = ???
Note:   AutoBraille is a shareware text-to-braille converter by KANSYS, Inc.
----------2FFB42BX0001-----------------------
INT 2F PU - Borland C++ DPMILOAD.EXE - INSTALLATION CHECK???
       AX = FB42h
       BX = 0001h
Return: AX = version number??? (AL=major, AH=minor)
       CX = next-selector increment
---BC2.0---
       ES:BX -> 80-byte buffer for ???
       DX = DPMI version
---BC3.0---
       BX = ??? (0000h)
       DX = ???
       ES:SI -> list of valid selectors ???
Notes:  The version of DPMILOAD distributed with BC++ v2.0 identifies itself
         as version 1.000, while the version distributed with BC++ 3.0
         identifies itself as version 1.0; the former is 10864 bytes, the
         latter 22180 bytes.  The BC2.0 version is a DPMI loader, while
         the BC3.0 version also adds a DPMI host and DOS extender
       the BC++ 2.0 version displays an error message if called with BX
         values other than 0001h-0008h
----------2FFB42BX0002-----------------------
INT 2F PU - Borland C++ 2.0 DPMILOAD.EXE - ALLOCATE MEMORY
       AX = FB42h
       BX = 0002h
       CX = size in bytes
       DX = bit flags
           bit 2: set to allocate DOS memory, clear for DPMI memory
       SI = selector of descriptor to be modified to access allocated memory
       DI = selector of a second descriptor to be modified
Return: AX = ??? or 0000h on error
       CX:DX = linear base address of DPMI memory block
       SI:DI = handle for DPMI memory block or FFFFh:FFFFh
       ???
Note:   two segment descriptors may be set if a code and an aliased data
         segment are required; if only one descriptor is needed, SI should
         equal DI on entry
BUG:    when allocating DOS memory, the code computes the linear address by
         multiplying the segment number by 4 rather than shifting by 4
SeeAlso: AX=FB42h/BX=0003h,AX=FB42h/BX=0008h
----------2FFB42BX0002-----------------------
INT 2F PU - Borland C++ 3.0 DPMILOAD.EXE - ALLOCATE MEMORY
       AX = FB42h
       BX = 0002h
       ES:SI -> memory block info (see below)
Return: ???
Note:   The version of DPMILOAD distributed with BC++ v2.0 identifies itself
         as version 1.000, while the version distributed with BC++ 3.0
         identifies itself as version 1.0; the former is 10864 bytes, the
         latter 22180 bytes.
SeeAlso: AX=FB42h/BX=0003h,AX=FB42h/BX=0008h

Format of memory block info:
Offset  Size    Description
00h    WORD    flags
               bit 0: set if data segment rather than code segment
               bit 1: information valid
               bit 2: set if DOS memory block rather than DPMI memory block
               bit 4: ???
               bit 15: set if no LDT selectors for memory block???
02h    DWORD   block size in bytes
---DPMI memory block---
06h    DWORD   DPMI memory block handle
---DOS memory block---
06h    WORD    real-mode segment of memory block
08h    WORD    selector of memory block
---
0Ah    DWORD   linear address of memory
0Eh    WORD    memory operation error code
               0008h no more free LDT descriptors
---if flags bit 0 clear---
10h    WORD    code segment selector for memory block or 0000h or FFFFh
12h    WORD    data alias selector for memory block or 0000h or FFFFh
---if flags bit 0 set---
10h    WORD    data segment selector for memory block or 0000h or FFFFh
12h    WORD    unused???
----------2FFB42BX0003-----------------------
INT 2F PU - Borland C++ DPMILOAD.EXE - GET AVAILABLE MEMORY
       AX = FB42h
       BX = 0003h
Return: DX:AX = size of largest free block in paragraphs
               0000h:0000h on error (BC3.0 version only)
Note:   AX and DX are destroyed on error, but no other error indicator is
         returned, under the BC++ 2.0 version of DPMILOAD
SeeAlso: AX=FB42h/BX=0002h
----------2FFB42BX0004-----------------------
INT 2F PU - Borland C++ DPMILOAD.EXE - LOAD PROTECTED-MODE EXECUTABLE???
       AX = FB42h
       BX = 0004h
       DS:DX -> ASCIZ filename of protected-mode executable
Return: CX = selector of ??? or 0000h
---BC3.0---
       DX = status (0000h,FFF4h,others???) (see below)
Note:   the filename may also be terminated by a CR rather than a NUL under the
         BC++ 3.0 version of DPMILOAD

Values for status:
0000h  successful
0001h  ??? failure
0002h  invalid selector
0004h  unknown error
0008h  no more LDT descriptors available???
FFDEh  unable to set descriptor
FFDFh  unable to get segment base address
FFE0h  ???
FFF2h  invalid parameter value
FFF4h  component of filename too long (name not in 8.3 format)
FFF5h  pathname too long (>79 chars)
FFF6h  ???
FFF8h  ???
FFF9h  index out of range
FFFAh  ???
FFFCh  invalid access to code segment???
FFFEh  ???
FFFFh  general error
----------2FFB42BX0005-----------------------
INT 2F PU - Borland C++ DPMILOAD.EXE - GET ADDRESS OF ??? BY NAME
       AX = FB42h
       BX = 0005h
       CX = selector of DPMILOAD data (see below)
       DS:DX -> ASCIZ or CR-terminated name of ??? (case ignored)
Return: DX = status (see AX=FB42h/BX=0004h)
           0000h successful
               AX:BX -> ??? FAR function (called with two words on top of stk)
           else
               BX destroyed
SeeAlso: AX=FB42h/BX=0006h,AX=FB42h/BX=000Eh

Format of DPMILOAD data:
Offset  Size    Description
00h 12 BYTEs   ???
0Ch    WORD    ??? bit flags
0Eh 14 BYTEs   ???
1Ch    WORD    number of memory control records
1Eh 25 BYTEs   ???
37h    BYTE    ??? bit flags
               bit 4: data valid???
38h  4 BYTEs   ???
3Ch    WORD    ???
3Eh 12 BYTEs   ???
46h    BYTE    ??? counter
47h    BYTE    ???
48h    BYTE    ???
49h    BYTE    ???
4Ah    WORD    ???
4Ch  2 BYTEs   ???
4Eh    WORD    offset of array of 64-byte memory control records
52h    WORD    offset of name list (see below)
54h  4 BYTEs   ???
58h    WORD    offset of array of 6-byte objects
5Ah  8 BYTEs   ???
62h  9 BYTEs   ASCIZ name for ???
6Bh  9 BYTEs   ASCIZ name for ???
       ???

Format of name list entry [array]:
Offset  Size    Description
00h    BYTE    length of name (00h if end of array)
01h  N BYTEs   name
N+1    WORD    1-based index into array of unknown 6-byte objects

Format of 6-byte objects:
Offset  Size    Description
00h    BYTE    ???
01h    BYTE    ???
02h    BYTE    ???
03h    BYTE    1-based index of memory control record
04h    WORD    ???

Format of memory control record:
Offset  Size    Description
00h 20 BYTEs   memory block info (see AX=FB42h/BX=0002h)
14h  6 BYTEs   ???
1Ah    BYTE    ???
1Bh  2 BYTEs   ???
1Dh    BYTE    ??? bit flags
1Eh 14 BYTEs   ???
2Ch    DWORD   pointer to ??? memory control record or 0000h:0000h
30h    DWORD   pointer to ??? memory control record or 0000h:0000h
34h    DWORD   pointer to next??? memory control record or 0000h:0000h
38h    DWORD   pointer to prev??? memory control record or 0000h:0000h
3Ch  4 BYTEs   ???
Note:   the pointers at offsets 2Ch and 30h form a doubly-linked list, as do
         the pointers at offsets 34h and 38h
----------2FFB42BX0006-----------------------
INT 2F PU - Borland C++ DPMILOAD.EXE - GET ADDRESS OF ??? BY NUMBER
       AX = FB42h
       BX = 0006h
       CX = selector of DPMILOAD data (see AX=FB42h/BX=0005h)
       DX = 1-based index into array of ??? 6-byte objects
Return: DX = status (see AX=FB42h/BX=0004h)
           0000h successful
               AX:BX -> ??? FAR function (called with two words on top of stk)
           else
               BX destroyed
SeeAlso: AX=FB42h/BX=0005h,AX=FB42h/BX=000Eh
----------2FFB42BX0007-----------------------
INT 2F PU - Borland C++ 2.0 DPMILOAD.EXE - ???
       AX = FB42h
       BX = 0007h
       CX = selector of ???
Return: ???
Note:   The version of DPMILOAD distributed with BC++ v2.0 identifies itself
         as version 1.000, while the version distributed with BC++ 3.0
         identifies itself as version 1.0; the former is 10864 bytes, the
         latter 22180 bytes.
----------2FFB42BX0007-----------------------
INT 2F PU - Borland C++ 3.0 DPMILOAD.EXE - ???
       AX = FB42h
       BX = 0007h
       CX = selector of DPMILOAD data (see AX=FB42h/BX=0005h)
       ???
Return: DX = status (see AX=FB42h/BX=0004h)
           0000h successful
               AX = ???
----------2FFB42BX0008-----------------------
INT 2F PU - Borland C++ 2.0 DPMILOAD.EXE - FREE MEMORY BLOCK
       AX = FB42h
       BX = 0008h
       CX = bit flags
           bit 2: set if DPMI memory, clear if DOS memory
       DX = selector of DOS memory block
       SI:DI = handle of DPMI memory block
Return: DX = 0000h on error, unchanged if succcessful
Note:   The version of DPMILOAD distributed with BC++ v2.0 identifies itself
         as version 1.000, while the version distributed with BC++ 3.0
         identifies itself as version 1.0; the former is 10864 bytes, the
         latter 22180 bytes.
SeeAlso: AX=FB42h/BX=0002h
----------2FFB42BX0008-----------------------
INT 2F PU - Borland C++ 3.0 DPMILOAD.EXE - FREE MEMORY BLOCK
       AX = FB42h
       BX = 0008h
       ES:SI -> memory block info (see AX=FB42h/BX=0002h"3.0")
Return: ???
SeeAlso: AX=FB42h/BX=0009h
----------2FFB42BX0009-----------------------
INT 2F PU - Borland C++ 3.0 DPMILOAD.EXE - RESIZE MEMORY BLOCK
       AX = FB42h
       BX = 0009h
       ES:SI -> memory block info (see AX=FB42h/BX=0002h"3.0")
       ???
Return: ???
SeeAlso: AX=FB42h/BX=0008h"3.0"
----------2FFB42BX000A-----------------------
INT 2F RU - Borland C++ 3.0 DPMILOAD.EXE - INIT DPMI HOST AND SPAWN SUBSHELL
       AX = FB42h
       BX = 000Ah
       CX = 0001h
       DX = ???
       SI = ???
Return: after user exits subshell
Notes:  this call is used by DPMIRES; unlike most of the DPMILOAD calls, this
         function is not available in protected mode.
       the BC2.0 version of DPMILOAD is purely a DPMI loader, while the BC3.0
         version also adds a DPMI host and DOS extender.
SeeAlso: AX=FB42h/BX=0004h,AX=FB42h/BX=0015h
----------2FFB42BX000B-----------------------
INT 2F PU - Borland C++ 3.0 DPMILOAD.EXE - UNUSED
       AX = FB42h
       BX = 000Bh
----------2FFB42BX000C-----------------------
INT 2F PU - Borland C++ 3.0 DPMILOAD.EXE - FREE DESCRIPTORS FOR MEMORY BLOCK???
       AX = FB42h
       BX = 000Ch ???
       ES:SI -> memory block info ??? (see AX=FB42h/BX=0002h"3.0")
Return: DX = status???
SeeAlso: AX=FB42h/BX=000Fh
----------2FFB42BX000D-----------------------
INT 2F PU - Borland C++ 3.0 DPMILOAD.EXE - SIMULATE REAL MODE INTERRUPT
       AX = FB42h
       BX = 000Dh
       CX = number of words to copy from protected-mode to real mode stack
       DL = interrupt number
       DH = flags
           bit 0: reset the interrupt controller and A20 line
       ES:DI -> real-mode call structure (see INT 31/AX=0300h)
Return: CX = status
           0000h successful
           0001h failed
SeeAlso: INT 31/AX=0300h
----------2FFB42BX000E-----------------------
INT 2F PU - Borland C++ 3.0 DPMILOAD.EXE - GET ADDRESS OF ???
       AX = FB42h
       BX = 000Eh
       DS:DX -> ASCIZ or CR-terminated name of ???
Return: CX = selector of DPMILOAD data (see AX=FB42h/BX=0005h) corresponding to
               name, 0000h on error
SeeAlso: AX=FB42h/BX=0006h,AX=FB42h/BX=001Fh
----------2FFB42BX000F-----------------------
INT 2F PU - Borland C++ 3.0 DPMILOAD.EXE - REALLOCATE LDT DESCRPS TO MEMBLK???
       AX = FB42h
       BX = 000Fh
       ES:SI -> memory block info (see AX=FB42h/BX=0002h"3.0")
Return: ???
SeeAlso: AX=FB42h/BX=000Ch
----------2FFB42BX0010-----------------------
INT 2F PU - Borland C++ 3.0 DPMILOAD.EXE - CONVERT SEGMENT TO SELECTOR
       AX = FB42h
       BX = 0010h
       DX = segment number
Return: CX = status (see also AX=FB42h/BX=0004h)
           0000h successful
               DX = selector number for descriptor
           0008h failed
SeeAlso: AX=FB42h/BX=0023h
----------2FFB42BX0011-----------------------
INT 2F PU - Borland C++ 3.0 DPMILOAD.EXE - ???
       AX = FB42h
       BX = 0011h
       CX = selector of DPMILOAD data (see AX=FB42h/BX=0005h)
       ???
Return: DX = status (see also AX=FB42h/BX=0004h)
           0000h successful
               AX:BX -> ??? name
           0002h invalid selector
           FFFEh ??? error
----------2FFB42BX0012-----------------------
INT 2F PU - Borland C++ 3.0 DPMILOAD.EXE - ???
       AX = FB42h
       BX = 0012h
       CX = selector for ???
Return: CX = selector for ???
----------2FFB42BX0013-----------------------
INT 2F PU - Borland C++ 3.0 DPMILOAD.EXE - ???
       AX = FB42h
       BX = 0013h
       CX = selector of DPMILOAD data (see AX=FB42h/BX=0005h)
       DX = 1-based index of ???
Return: CX = status (see also AX=FB42h/BX=0004h)
           0000h successful
               BX = ??? or 0000h
           0002h invalid selector
           FFF9h ??? error
----------2FFB42BX0014-----------------------
INT 2F RU - Borland C++ 3.0 DPMILOAD.EXE - ???
       AX = FB42h
       BX = 0014h ???
               CX = 0001h
               Return: BX = 0000h
Note:   unlike most of the DPMILOAD functions, this call is available only in
         real or V86 mode
SeeAlso: AX=FB42h/BX=000Ah
----------2FFB42BX0015-----------------------
INT 2F RU - Borland C++ 3.0 DPMILOAD.EXE - ???
       AX = FB42h
       BX = 0015h uninstall
       CX = 0001h
Return: ???
Note:   unlike most of the DPMILOAD functions, this call is available only in
         real or V86 mode
SeeAlso: AX=FB42h/BX=000Ah
----------2FFB42BX0016-----------------------
INT 2F PU - Borland C++ 3.0 DPMILOAD.EXE - GET ???
       AX = FB42h
       BX = 0016h
       CX = selector of DPMILOAD data (see AX=FB42h/BX=0005h)
Return: DX = status (see also AX=FB42h/BX=0004h)
           0000h successful
               CX = ???
----------2FFB42BX0017-----------------------
INT 2F PU - Borland C++ 3.0 DPMILOAD.EXE - ???
       AX = FB42h
       BX = 0017h
       CX = ???
       DX = ???
       ???
Return: DX = status (0000h,0001h) (see below)
----------2FFB42BX0018-----------------------
INT 2F PU - Borland C++ 3.0 DPMILOAD.EXE - SET ???
       AX = FB42h
       BX = 0018h
       CX = ???
----------2FFB42BX0019-----------------------
INT 2F PU - Borland C++ 3.0 DPMILOAD.EXE - ???
       AX = FB42h
       BX = 0019h
       CX = selector for ???
       ???
Return: DX = status (see also AX=FB42h/BX=0004h)
           0000h successful
               CX = selector for ???
----------2FFB42BX001A-----------------------
INT 2F PU - Borland C++ 3.0 DPMILOAD.EXE - ???
       AX = FB42h
       BX = 001Ah
       CX = selector for ???
       ???
Return: DX = status (see also AX=FB42h/BX=0004h)
           0000h successful
           0004h failed
       CX:BX -> ???
----------2FFB42BX001B-----------------------
INT 2F PU - Borland C++ 3.0 DPMILOAD.EXE - ???
       AX = FB42h
       BX = 001Bh
       CX = selector of DPMILOAD data (see AX=FB42h/BX=0005h)
       DX = offset of ???
Return: DX = status (see also AX=FB42h/BX=0004h)
           0000h successful
               BX = selector for ???
               CX = selector for ???
           0002h invalid selector
----------2FFB42BX001C-----------------------
INT 2F PU - Borland C++ 3.0 DPMILOAD.EXE - ???
       AX = FB42h
       BX = 001Ch
       ES = selector for DPMILOAD data (see AX=FB42h/BX=0005h)
       CX = 1-based index of ???
       DX = 1-based index of ???
Return: DX = status (0000h,0002h,FFF9h) (see AX=FB42h/BX=0004h)
----------2FFB42BX001D-----------------------
INT 2F PU - Borland C++ 3.0 DPMILOAD.EXE - GET ???
       AX = FB42h
       BX = 001Dh
Return: CX:DX = ???
----------2FFB42BX001E-----------------------
INT 2F PU - Borland C++ 3.0 DPMILOAD.EXE - ???
       AX = FB42h
       BX = 001Eh
       CX = ???
       ???
Return: DX = status (see also AX=FB42h/BX=0004h)
           0000h successful
           FFF7h ??? error
       CX:BX -> ???
----------2FFB42BX001F-----------------------
INT 2F PU - Borland C++ 3.0 DPMILOAD.EXE - GET ADDRESS OF ???
       AX = FB42h
       BX = 001Fh
       DS:DX -> 8-character name of ???
       ???
Return: CX = selector of DPMILOAD data (see AX=FB42h/BX=0005h) for ???
               0000h on error
SeeAlso: AX=FB42h/BX=000Eh
----------2FFB42BX0020-----------------------
INT 2F PU - Borland C++ 3.0 DPMILOAD.EXE - NULL FUNCTION???
       AX = FB42h
       BX = 0020h
Return: DX = ??? (always 0000h)
----------2FFB42BX0021-----------------------
INT 2F PU - Borland C++ 3.0 DPMILOAD.EXE - GET PROCESSOR EXCEPTION HANDLER VECT
       AX = FB42h
       BX = 0021h
       CL = exception number (00h-1Fh)
Return: DX = status (see also AX=FB42h/BX=0004h)
           0000h successful
               AX:BX = selector:offset of handler
           FFF2h unable to get exception handler vector
SeeAlso: AX=FB42h/BX=0022h,AX=FB42h/BX=0024h,INT 31/AX=0202h
----------2FFB42BX0022-----------------------
INT 2F PU - Borland C++ 3.0 DPMILOAD.EXE - SET PROCESSOR EXCEPTION HANDLER VECT
       AX = FB42h
       BX = 0022h
       CL = exception number (00h-1Fh)
       SI:DX = selector:offset of new handler
Return: DX = status (0000h,0004h,FFF2h) (see AX=FB42h/BX=0004h)
SeeAlso: AX=FB42h/BX=0021h,AX=FB42h/BX=0025h,INT 31/AX=0203h
----------2FFB42BX0023-----------------------
INT 2F PU - Borland C++ 3.0 DPMILOAD.EXE - CONVERT SELECTOR TO SEGMENT NUMBER
       AX = FB42h
       BX = 0023h
       CX = selector
Return: DX = status (see also AX=FB42h/BX=0004h)
           0000h successful
               CX = real-mode segment number
           FFF2h descriptor has invalid base address for real-mode segment
SeeAlso: AX=FB42h/BX=0010h
----------2FFB42BX0024-----------------------
INT 2F PU - Borland C++ 3.0 DPMILOAD.EXE - GET PROTECTED-MODE INTERRUPT VECTOR
       AX = FB42h
       BX = 0024h
       CL = interrupt number
Return: DX = status (0000h) (see also AX=FB42h/BX=0004h)
       AX:BX = selector:offset of handler
SeeAlso: AX=FB42h/BX=0025h,INT 31/AX=0204h
----------2FFB42BX0025-----------------------
INT 2F PU - Borland C++ 3.0 DPMILOAD.EXE - SET PROTECTED-MODE INTERRUPT VECTOR
       AX = FB42h
       BX = 0025h
       CL = interrupt number
       SI:DX = selector:offset of new handler
Return: DX = status (0000h,0004h,FFF2h) (see AX=FB42h/BX=0004h)
SeeAlso: AX=FB42h/BX=0024h,INT 31/AX=0205h
----------2FFB42BX0026-----------------------
INT 2F PU - Borland C++ 3.0 DPMILOAD.EXE - ???
       AX = FB42h
       BX = 0026h
       CX = selector of DPMILOAD data (see AX=FB42h/BX=0005h)
       DX = 1-based index of ???
       ???
Return: DX = status (0000h,0002h,FFF9h) (see AX=FB42h/BX=0004h)
           0000h successful
               BX = offset of ??? within data structure
----------2FFB42BX0027-----------------------
INT 2F PU - Borland C++ 3.0 DPMILOAD.EXE - GET ???
       AX = FB42h
       BX = 0027h
       CX = selector of DPMILOAD data (see AX=FB42h/BX=0005h)
       DX = offset of ???
Return: DX = status (see also AX=FB42h/BX=0004h)
           0000h successful
               BX = ???
----------2FFB42BX0080-----------------------
INT 2F U - ??? - CALLED BY Borland C++ 3.0 DPMILOAD.EXE
       AX = FB42h
       BX = 0080h
       ???
Return: AX = ???
       ???
----------2FFB42BX0081-----------------------
INT 2F U - ??? - CALLED BY Borland C++ 3.0 DPMILOAD.EXE
       AX = FB42h
       BX = 0081h
       ???
Return: AX = ???
       ???
----------2FFB43-----------------------------
INT 2F PU - Borland C++ 3.0 DPMILOAD.EXE - NULL FUNCTION
       AX = FB43h
       BX = subfunction (at least 0000h-000Eh)
Notes:  this function is only present in protected mode; it does nothing but
         an immediate IRET
       DPMILOAD.EXE itself calls various subfunctions:
           subfunction 0004h is called with CX=selector of ???, DI=selector
               of DPMILOAD data
           subfunction 0008h is called with CX=selector of DPMILOAD data
----------2FFB64-----------------------------
INT 2F U - AutoBraille v1.1A - GET ???
       AX = FB64h
Return: AX = ??? (0006h seen)
Note:   AutoBraille is a shareware text-to-braille converter by KANSYS, Inc.
----------2FFBA1BX0081-----------------------
INT 2F U - TKERNEL (Borland DOS extender) - INSTALLATION CHECK
       AX = FBA1h
       BX = 0081h
       ES:DI -> 16-byte buffer
Return: if installed, first four bytes of ES:DI buffer are "IABH"
Note:   TKERNEL is a licensed version of AI Architects/Ergo's OS/x86.  It was
         present only in Borland C++ 2.0; with version 3.0, the DOS extender
         was moved into DPMILOAD.
SeeAlso: AH=A1h,AX=F100h,AX=FBA1h/BX=0082h,AX=FBA1h/BX=0084h,INT 15/AX=BF02h
SeeAlso: INT 21/AX=4403h"TKERNEL"
----------2FFBA1BX0082-----------------------
INT 2F U - TKERNEL (Borland DOS extender) - GET ENTRY POINT
       AX = FBA1h
       BX = 0082h
       ES:DI -> response buffer (see below)
Return: ES:DI buffer filled
SeeAlso: AX=FBA1h/BX=0081h,AX=FBA1h/BX=0084h

Format of response buffer:
Offset  Size    Description
00h  4 BYTEs   signature "IABH"
04h    DWORD   pointer to FAR extender entry point

Call entry point with:
       AX = function number
           0000h initialize???
               STACK:  WORD  ???
               Return: AX = status???
                       STACK unchanged
           0001h get version???
               Return: AX = 0200h for v2.0.34
           0002h get ???
               Return: AX = ??? (011Eh or 0182h seen)
           0003h load protected-mode executable
               STACK:  DWORD -> ASCIZ filename of executable
                       DWORD   ???
                       DWORD -> program arguments (counted string plus CR)
                       DWORD -> environment for protected-mode executable
                               (terminated with two consecutive NULs)
                       DWORD -> WORD buffer for ???
               Return: AX = status???
                       STACK unchanged
           0004h get descriptor
               STACK:  WORD    selector for which to get descriptor
                       WORD    segment number (when running in real mode)
                       DWORD -> buffer for descriptor
               Return: CF clear if successful
                           buffer filled
                       CF set on error
                           AX destroyed???
                       STACK unchanged
           0005h ???
               STACK:  WORD    selector for ???
                       WORD    subfunction number???
                               0000h run previously-loaded program???
                               0001h ??? (similar to 0000h)
                               0002h
                               0003h
                               0005h ??? (similar to 0000h and 0001h)
               Return: AX = status???
                       STACK unchanged
           0006h ???
               STACK:  WORD ???
                       DWORD -> WORD (call) max iterations of ???
                                     (return) remaining iterations
               Return: AX = ???
                       STACK unchanged
           0007h unused
               Return: AX = 0001h
           0008h unused
               Return: AX = 0001h
           0009h copy protected-mode memory into conventional memory
               STACK:  WORD    selector for source segment
                       WORD    segment of source if in real mode???
                       DWORD   offset of source
                       WORD    number of bytes to copy
                       DWORD -> low-memory destination
               Return: AX = status
                       STACK unchanged
           000Ah copy conventional memory into protected-mode memory
               STACK:  WORD    selector for destination segment
                       WORD    segment of destination if in real mode???
                       DWORD   offset of destination
                       WORD    number of bytes to copy
                       DWORD -> low-memory source
               Return: AX = status
                       STACK unchanged
           000Bh get ??? pointers
               STACK:  WORD desired pointer
                               0000h get ???
                               0002h get protected-mode CR3
                               0003h get 4K page table buffer pointer
                               else Return: DX:AX = FFFFh:FFFFh
               Return: DX:AX = requested pointer
                       STACK unchanged
           000Ch set ??? pointers
               STACK:  WORD desired pointer
                               0000h set ???
                               0002h set protected-mode CR3
                               0003h set 4K page table buffer pointer
                               else ignore
                       DWORD new value for pointer
               Return: STACK unchanged
           000Dh get ??? pointers
               STACK:  WORD desired pointer
                               0000h get ???
                               0001h get ???
                               0002h get ???
                               0003h get ???
                               0004h get ???
                               0005h get ???
                               0006h get ???
                               0007h get ???
                               else Return: DX:AX = FFFFh:FFFFh
               Return: DX:AX = desired pointer
                       STACK unchanged
           000Eh set ??? pointer
               STACK:  WORD desired pointer
                               0000h set ???
                               0001h set ???
                               0002h set ???
                               0003h set ???
                               0004h set ???
                               0005h set ???
                               0006h set ???
                               0007h set ???
                               else Return: DX:AX = FFFFh:FFFFh
               Return: STACK unchanged
           000Fh get ???
               Return: AX = ??? (seen 0008h)
           0010h get ???
               Return: AX = ???
           0011h determine whether selector is valid
               STACK:  WORD    possible selector
               Return: AX = selector or 0000h if invalid
                       STACK unchanged
           0012h get physical address
               STACK:  WORD    selector for desired segment
                       WORD    segment number if in real mode
                       DWORD   offset within segment
               Return: DX:AX = 32-bit physical address or 00000000h on error
                       BX destroyed
                       STACK unchanged
           0013h ???
               Note:   normally jumps to code for function 0012h
           0014h copy protected-mode memory to conventional memory, with ???
               STACK:  WORD    selector for source segment
                       WORD    segment of source if in real mode???
                       DWORD   offset of source
                       WORD    number of bytes to copy
                       DWORD -> low-memory destination
               Return: AX = status???
                       STACK unchanged
           0015h copy conventional memory to protected-mode memory, with ???
               STACK:  WORD    selector for destination segment
                       WORD    segment of destination if in real mode???
                       DWORD   offset of destination
                       WORD    number of bytes to copy
                       DWORD -> low-memory source
               Return: AX = status???
                       STACK unchanged
           0016h set ??? pointer
               STACK:  WORD    unused
                       DWORD -> ??? or 0000h:0000h
               Return: AX = 0000h
                       STACK unchanged
           0017h allocate real-mode procedure???
               STACK:  DWORD   ASCIZ name of procedure
                       DWORD ???
                       DWORD   address of subroutine to invoke
               Return: AX = status
                           0032h procedure by that name exists
                           0033h no more real-mode procedures available
                       DX destroyed
                       STACK unchanged
           0018h unused
               Return: AX = 0001h
           0019h get parameter block
               Return: DX:AX -> parameter block (format unknown at this time,
                               but 92h bytes)
                               (preceded by signature "!!PARAM-BLOCK!!")
           001Ah get ???
               Return: AX = ??? (0148h seen)
           001Bh free real-mode procedure???
               STACK:  DWORD -> ASCIZ name of procedure
               Return: ???
                       STACK unchanged
           001Ch check whether packets from protected mode task pending
               Return: AX = 0001h if packets pending, 0000h if not
           001Dh set ???
               STACK:  DWORD ??? or 0000h:0000h
               Return: AX,BX destroyed
                       STACK unchanged
           001Eh ???
               STACK:  WORD ??? (high byte ignored)
                       DWORD -> data structure (see below)
               Return: AX,BX,CX,DX destroyed
                       data structure updated
                       STACK unchanged
               Format of data structure
               Offset  Size    Description
                00h  2 BYTEs   unused
                02h    WORD    ???
                04h    WORD    ???
                06h    WORD    ???
                08h  2 BYTEs   unused
                0Ah    WORD    ???
                0Ch    WORD    (call) ???
                               (return) offset of this data structure (BUG?)
           001Fh set ???
               STACK:  WORD ??? (set to 0001h if zero)
               Return: AX destroyed
                       STACK unchanged
           0020h ???
               STACK:  DWORD -> ??? (8 bytes of data)
               Return: AX = ???
                       STACK unchanged
           0021h ???
               STACK:  DWORD -> ??? (8 bytes of data)
                       WORD    ???
                       WORD    ???
               Return: AX = ???
                       STACK unchanged
           0022h ???
               STACK:  DWORD -> ??? (8 bytes of data)
                       DWORD -> 4-byte buffer for results
               Return: AX = ???
                       STACK unchanged
           0023h ???
               STACK:  DWORD -> ??? (8 bytes of data)
               Return: AX = ???
                       STACK unchanged
           0024h set ???
               STACK:  WORD ???
               Return: AX destroyed
                       STACK unchanged
           0025h get ???
               Return: AX = ??? (value set with func 0024h)
           0026h BUG: jumps to hyperspace due to fencepost error
           FFFFh set DOS memory management functions
               BX:SI -> FAR routine for allocating DOS memory
                       (called with AH=48h,BX=number of paragraphs to alloc;
                        returns CF clear, AX=segment of allocated memory, or
                                CF set on error)
               CX:DI -> FAR routine for freeing DOS memory
                       (called with AH=49h,ES=segment of block to free;
                        returns CF set on error,AX=error code)
               Note: each of these pointers normally points at INT 21/RETF
           other Return: AX = 0001h
Note:   BX may be destroyed by any of the API calls
----------2FFBA1BX0084-----------------------
INT 2F U - TKERNEL (Borland DOS extender) - UNINSTALL
       AX = FBA1h
       BX = 0084h
       ES:DI -> response buffer (see below)
Return: ES:DI buffer filled
SeeAlso: AX=FBA1h/BX=0081h,AX=FBA1h/BX=0084h

Format of response buffer:
Offset  Size    Description
00h  4 BYTEs   signature "IABH"
04h    WORD    success indicator
               0001h failed (INT 2F hooked by another program)
               unchanged if successful
06h    WORD    segment of ???
08h    WORD    segment of ??? memory block to free if nonzero
0Ah    WORD    segment of ??? memory block to free if nonzero
----------2FFBFBES0000-----------------------
INT 2F U - SoundBlaster speech driver - INSTALLATION CHECK
       AX = FBFBh
       ES = 0000h
Return: ES nonzero if installed
           ES:BX -> entry point data structure (see below)
SeeAlso: INT 80/BX=0000h,INT F3"SoundBlaster"

Format of entry point data structure:
Offset  Size    Description
00h  3 BYTEs   signature "FB "
03h    BYTE    driver major version number???
04h    DWORD   speech driver entry point
08h 24 BYTEs   ???
20h  ? BYTEs   data buffer for calling speech driver

Call driver entry point with:
       AL = function
           07h speak a string
               data buffer (see above) contains:
                       BYTE  length of string
                     N BYTEs string to speak
----------2FFE00DI4E55-----------------------
INT 2F U - NORTON UTILITIES 5.0+ TSRs - INSTALLATION CHECK/STATUS REPORT
       AX = FE00h
       DI = 4E55h ("NU")
       SI = TSR identifier
           4346h ("CF") NCACHE-F (v5) / NCACHE (v6.0+)
           4353h ("CS") NCACHE-S (v5 only)
           4443h ("DC") DISKREET
           444Dh ("DM") DISKMON
           4653h ("FS") FILESAVE (v5) / EP (v6.0+)
Return: SI = TSR reply
           lowercase version of SI on entry (i.e. SI OR 2020h)
       AH = status
           00h installed but disabled internally
           01h installed and enabled
       AL = status
           00h NCACHE-x or DISKREET installed
           01h FILESAVE / EP / DISKMON v6 installed
           45h DISKMON v5 installed
       BX = length of *.INI file (DISKMON and FILESAVE/EP only) (see below)
       CX = segment of resident portion
           FFFFh if completely loaded high (NCACHE)
---FILESAVE/EP---
       DL = ??? (apparently always 00h)
---DISKMON---
       DX = ??? (apparently always 1AE6h [v5] / 1B86h [v6])
Note:   the value returned in CX is incorrect for NCACHE 6.00
SeeAlso: AX=FE01h,AX=FE02h,AX=FE03h,AX=FE04h,AX=FE05h

Format of DISKMON.INI file:
Offset  Size    Description
-6Ch 108 BYTEs  (in memory copy only)
               list of filenames which are always protected:
                 IBMBIO.COM/IBMDOS.COM, IO.SYS/MSDOS.SYS, TBIOS.SYS/TDOS.SYS,
                 MIO.SYS/IO.BIN, COMMAND.COM
00h    BYTE    ??? always 01h
01h    BYTE    disk light (00h off, 01h on)
02h    BYTE    disk protection (00h off, 01h on)
03h    BYTE    protected areas
               01h system area
               02h files
               03h system area and files
               04h entire disk
04h    BYTE    floppy access (00h not allowed, 01h allowed)
05h 27 BYTEs   filename extension list (9 entries)
               (lowercase, blank padded or = 000000h)
20h 240 BYTEs  filename list (20 entries)
               (lowercase, name and extension blank padded, with '.')
Note:   CX:0508h -> copy in installed TSR (v5)
       CX:052Fh -> copy in installed TSR (v6)

Format of FILESAVE.INI / EP.INI file:
Offset  Size    Description
00h 26 BITs    drive list (bit set: file protection on, cleared: off):
00h    BYTE    drives  A: - H:
01h    BYTE    drives  I: - P:
02h    BYTE    drives  Q: - X:
03h    BYTE    drives  Y: - Z:
04h    BYTE    which files to protect
               00h all files
               01h all files with extension in list
               02h all files except those with extension in list
05h 27 BYTEs   filename extension list (9 entries, uppercase, ASCIZ)
20h    BYTE    include files with archive bit clear (00h no, 01h yes)
21h    WORD    number of days after which files are purged (0 = never)
23h    WORD    max kilobytes of erased file space to hold (0 = all)
Note:   CX:03D2h -> copy in installed TSR (v5.0)
       CX:03F5h -> copy in installed TSR (v6.0)
----------2FFE01DI4E55-----------------------
INT 2F U - NORTON UTILITIES 5.0+ TSRs - ENABLE
       AX = FE01h
       DI = 4E55h ("NU")
       SI = TSR identifier (see AX=FE00h)
Return: SI = TSR reply (lowercase version of entry SI, i.e. SI OR 2020h)
       AX = status
           0002h successful (DISKMON, FILESAVE, EP)
           FE00h successful (NCACHE-x, DISKREET)
Notes:  if the enable/disable calls are used on DISKMON or NCACHE-x, the status
         report generated by the programs still indicates the previous state,
         and DISKMON.INI is not updated
       apparently has no effect on DISKREET
SeeAlso: AX=FE00h,AX=FE02h
----------2FFE02DI4E55-----------------------
INT 2F U - NORTON UTILITIES 5.0+ TSRs - DISABLE
       AX = FE02h
       DI = 4E55h ("NU")
       SI = TSR identifier (see AX=FE00h)
Return: SI = TSR reply (lowercase version of entry SI, i.e. SI OR 2020h)
       AX = status
           0004h successful (DISKMON, FILESAVE)
           FE00h successful (NCACHE-x, DISKREET)
Note:   (see AX=FE01h)
SeeAlso: AX=FE00h,AX=FE01h
----------2FFE03DI4E55-----------------------
INT 2F U - NORTON UTILITIES 5.0+ TSRs - internal - ???
       AX = FE03h
       DI = 4E55h ("NU")
       SI = TSR identifier (see AX=FE00h)
Return: SI = TSR reply (lowercase version of entry SI, i.e. SI OR 2020h)
       AX = status
           0006h successful???
Notes:  only supported by DISKMON, FILESAVE, and NCACHE-x
       reportedly dangerous
SeeAlso: AX=FE00h
----------2FFE04DI4E55-----------------------
INT 2F U - NORTON UTILITIES 5.0+ DISKMON, FILESAVE / EP - internal - ???
       AX = FE04h
       DI = 4E55h ("NU")
       SI = TSR identifier (see AX=FE00h)
Return: SI = TSR reply (lowercase version of entry SI, i.e. SI or 2020h)
       AX = status
           0008h successful???
SeeAlso: AX=FE00h
----------2FFE05DI4E55-----------------------
INT 2F U - NORTON UTILITIES 5.0+ DISKMON, FILESAVE / EP - internal - ???
       AX = FE05h
       DI = 4E55h ("NU")
       SI = TSR identifier (see AX=FE00h)
Return: SI = TSR reply (lowercase version of entry SI, i.e. SI or 2020h)
       AX = status
           000Ah successful???
Note:   reportedly dangerous
SeeAlso: AX=FE00h
----------2FFF00-----------------------------
INT 2F - Topware Network Operating System - INSTALLATION CHECK
       AX = FF00h
Return: AL = 00h not installed, OK to install
          = 01h not installed, not OK to install
          = FFh installed
SeeAlso: AX=FF01h,INT 21/AH=FFh"Topware",INT 7A"Topware"
----------2FFF01-----------------------------
INT 2F - Topware Network Operating System - GET VERSION
       AX = FF01h
Return: AX = version
SeeAlso: AX=FF00h
----------30---------------------------------
INT 30 - (NOT A VECTOR!) - DOS 1+ - FAR JMP instruction for CP/M-style calls
  the CALL 5 entry point does a FAR jump to here
Note:   under DOS 2+, the instruction at PSP:0005 points two bytes too low in
         memory
SeeAlso: INT 21/AH=26h
----------31---------------------------------
INT 31 - overwritten by CP/M jump instruction in INT 30
----------310000-----------------------------
INT 31 P - DPMI 0.9+ - ALLOCATE LDT DESCRIPTORS
       AX = 0000h
       CX = number of descriptors to allocate
Return: CF clear if successful
           AX = base selector
       CF set on error
           AX = error code (DPMI 1.0+)
               0000h-7FFFh DOS error passed through by DPMI
               8001h unsupported function
               8002h object in wrong state for function
               8003h system integrity would be endangered
               8004h deadlock detected
               8005h pending serialization request cancelled
               8010h out of DPMI internal resources
               8011h descriptor unavailable
               8012h linear memory unavailable
               8013h physical memory unavailable
               8014h backing store unavailable
               8015h callback unavailable
               8016h handle unavailable
               8017h maximum lock count exceeded
               8018h shared memory already serialized exclusively by another
               8019h shared memory already serialized shared by another client
               8021h invalid value for numeric or flag parameter
               8022h invalid segment selector
               8023h invalid handle
               8024h invalid callback
               8025h invalid linear address
               8026h request not supported by hardware
Notes:  DPMI is the DOS Protected-Mode Interface
       the base and limit of the returned descriptors will be 0, and the type
         will be "data"
       add the value returned by INT 31/AX=0003h to move to subsequent
         descriptors if multiple descriptors were allocated
       not supported by MS Windows 3.0 in Standard mode
SeeAlso: AX=0001h,AX=000Dh,INT 21/AX=3501h
----------310001-----------------------------
INT 31 P - DPMI 0.9+ - FREE LDT DESCRIPTOR
       AX = 0001h
       BX = selector to free
Return: CF clear if successful
       CF set on error
           AX = error code (DPMI 1.0+) (8022h) (see AX=0000h)
Notes:  only one descriptor is freed per call
       the program's initial CS, DS, and SS descriptors may be freed
       (DPMI 1.0+) any segment registers containing the freed selector are
         set to 0000h
       not supported by MS Windows 3.0 in Standard mode
SeeAlso: AX=0000h,AX=000Ah,AX=000Dh,INT 21/AX=3502h
----------310002-----------------------------
INT 31 P - DPMI 0.9+ - SEGMENT TO DESCRIPTOR
       AX = 0002h
       BX = real mode segment
Return: CF clear if successful
           AX = selector corresponding to real mode segment (64K limit)
       CF set on error
           AX = error code (DPMI 1.0+) (8011h) (see AX=0000h)
Notes:  multiple calls for the same real mode segment return the same selector
       the returned descriptor can never be modified or freed
       not supported by MS Windows 3.0 in Standard mode
----------310003-----------------------------
INT 31 P - DPMI 0.9+ - GET NEXT SELECTOR INCREMENT VALUE
       AX = 0003h
Return: CF clear
           AX = value to add to get next sequential selector
Notes:  the increment will be a power of two
       not supported by MS Windows 3.0 in Standard mode
SeeAlso: AX=0000h
----------310004-----------------------------
INT 31 P - DPMI 0.9+ - LOCK SELECTOR
       AX = 0004h
       BX = selector to lock (prevent paging)
Return: ???
Note:   although marked as reserved in versions 0.9 and 1.0 of the DPMI
         specification, this function is called by MS Windows TASKMAN,
         PROGMAN, and KERNEL
SeeAlso: AX=0005h,AX=0600h
----------310005-----------------------------
INT 31 P - DPMI 0.9+ - UNLOCK SELECTOR
       AX = 0005h
       BX = selector to unlock (permit paging)
Return: ???
Note:   although marked as reserved in versions 0.9 and 1.0 of the DPMI
         specification, this function is called by MS Windows TASKMAN,
         PROGMAN, and KERNEL
SeeAlso: AX=0004h,AX=0601h
----------310006-----------------------------
INT 31 P - DPMI 0.9+ - GET SEGMENT BASE ADDRESS
       AX = 0006h
       BX = selector
Return: CF clear if successful
           CX:DX = linear base address of segment
       CF set on error
           AX = error code (DPMI 1.0+) (8022h) (see AX=0000h)
Note:   not supported by MS Windows 3.0 in Standard mode
SeeAlso: AX=0007h
----------310007-----------------------------
INT 31 P - DPMI 0.9+ - SET SEGMENT BASE ADDRESS
       AX = 0007h
       BX = selector
       CX:DX = linear base address
Return: CF clear if successful
       CF set on error
           AX = error code (DPMI 1.0+) (8022h,8025h) (see AX=0000h)
Notes:  only modify descriptors allocated with INT 31/AX=0000h
       only the low 24 bits of the address will be used by 16-bit DPMI
         implementations even on a 386 or higher
       DPMI 1.0+ automatically reloads any segment registers containing the
         selector being modified
       not supported by MS Windows 3.0 in Standard mode
SeeAlso: AX=0006h,AX=0008h,AX=0009h,AX=000Ch,INT 21/AX=3503h
SeeAlso: INT 21/AH=E9h"OS/286"
----------310008-----------------------------
INT 31 P - DPMI 0.9+ - SET SEGMENT LIMIT
       AX = 0008h
       BX = selector
       CX:DX = segment limit
Return: CF clear if successful
       CF set on error
           AX = error code (DPMI 1.0+) (8021h,8022h,8025h) (see AX=0000h)
Notes:  CX must be zero for 16-bit DPMI implementations
       limits greater than 1MB must be page aligned (low 12 bits set)
       only modify descriptors allocated with INT 31/AX=0000h
       DPMI 1.0+ automatically reloads any segment registers containing the
         selector being modified
       not supported by MS Windows 3.0 in Standard mode
SeeAlso: AX=0007h,AX=0009h,AX=000Ch,INT 21/AH=E9h"OS/286"
----------310009-----------------------------
INT 31 P - DPMI 0.9+ - SET DESCRIPTOR ACCESS RIGHTS
       AX = 0009h
       BX = selector
       CL = access rights/type byte
       CH = 80386 extended rights/type byte (32-bit DPMI implementations only)
Return: CF clear if successful
       CF set on error
           AX = error code (DPMI 1.0+) (8021h,8022h,8025h) (see AX=0000h)
Notes:  if the Present bit is clear, CL bits 0-3 may have any value
       DPMI 1.0+ automatically reloads any segment registers containing the
         selector being modified
       not supported by MS Windows 3.0 in Standard mode
SeeAlso: AX=0007h,AX=0008h,AX=000Ch,INT 21/AX=2514h
----------31000A-----------------------------
INT 31 P - DPMI 0.9+ - CREATE ALIAS DESCRIPTOR
       AX = 000Ah
       BX = selector
Return: CF clear if successful
           AX = new data selector
       CF set on error
           AX = error code (DPMI 1.0+) (8011h,8022h) (see AX=0000h)
Notes:  fails if selector in BX is not a code segment or is invalid
       use INT 31/AX=0001h to free new selector
       future changes to the original selector will not be reflected in the
         returned alias selector
       not supported by MS Windows 3.0 in Standard mode
SeeAlso: AX=0001h
----------31000B-----------------------------
INT 31 P - DPMI 0.9+ - GET DESCRIPTOR
       AX = 000Bh
       BX = LDT selector
       ES:(E)DI -> 8-byte buffer for copy of descriptor
Return: CF clear if successful
           buffer filled
       CF set on error
           AX = error code (DPMI 1.0+) (8022h) (see AX=0000h)
Notes:  16-bit programs use ES:DI as pointer, 32-bit must use ES:EDI
       not supported by MS Windows 3.0 in Standard mode
SeeAlso: AX=000Ch
----------31000C-----------------------------
INT 31 P - DPMI 0.9+ - SET DESCRIPTOR
       AX = 000Ch
       BX = LDT selector
       ES:(E)DI -> 8-byte buffer containing descriptor
Return: CF clear if successful
       CF set on error
           AX = error code (DPMI 1.0+) (8021h,8022h,8025h) (see AX=0000h)
Notes:  16-bit programs use ES:DI as pointer, 32-bit must use ES:EDI
       only modify descriptors allocated with INT 31/AX=0000h
       DPMI 1.0+ automatically reloads any segment registers containing the
         selector being modified
       not supported by MS Windows 3.0 in Standard mode
SeeAlso: AX=000Bh
----------31000D-----------------------------
INT 31 P - DPMI 0.9+ - ALLOCATE SPECIFIC LDT DESCRIPTOR
       AX = 000Dh
       BX = LDT selector
Return: CF clear if successful
           descriptor allocated
       CF set on error
           AX = error code (DPMI 1.0+) (8011h,8022h) (see AX=0000h)
Notes:  free descriptor with INT 31/AX=0001h
       the first 16 descriptors (04h-7Ch) are reserved for this function, but
         some may already be in use by other applications under DPMI 0.9;
         DPMI 1.0 guarantees 16 descriptors per client
       not supported by MS Windows 3.0 in Standard mode
SeeAlso: AX=0000h,AX=0001h
----------31000E-----------------------------
INT 31 P - DPMI 1.0+ - GET MULTIPLE DESCRIPTORS
       AX = 000Eh
       CX = number of descriptors to copy
       ES:(E)DI -> descriptor buffer (see below)
Return: CF clear if successful
           descriptors copied
       CF set on error
           AX = error code (8022h) (see AX=0000h)
           CX = number of descriptors successfully copied
Notes:  16-bit programs use ES:DI as pointer, 32-bit must use ES:EDI
       if the function fails, the first CX descriptors are valid; the
         remainder are not modified
SeeAlso: AX=000Bh,AX=000Fh

Format of descriptor buffer entry (one per descriptor to get):
Offset  Size    Description
00h    WORD    selector (set by client)
02h    QWORD   descriptor (set by host)
----------31000F-----------------------------
INT 31 P - DPMI 1.0+ - SET MULTIPLE DESCRIPTORS
       AX = 000Fh
       CX = number of descriptors to copy
       ES:(E)DI -> descriptor buffer (see below)
Return: CF clear if successful
           descriptors copied
       CF set on error
           AX = error code (8021h,8022h,8025h) (see AX=0000h)
           CX = number of descriptors successfully copied
Notes:  16-bit programs use ES:DI as pointer, 32-bit must use ES:EDI
       if the function fails, the first CX descriptors are valid; the
         remainder are not modified
       DPMI 1.0+ automatically reloads any segment registers containing a
         selector being modified
SeeAlso: AX=000Ch,AX=000Eh

Format of descriptor buffer entry (one per descriptor to set):
Offset  Size    Description
00h    WORD    selector
02h    QWORD   descriptor
----------310100-----------------------------
INT 31 P - DPMI 0.9+ - ALLOCATE DOS MEMORY BLOCK
       AX = 0100h
       BX = number of paragraphs to allocate
Return: CF clear if successful
           AX = real mode segment of allocated block
           DX = first selector for allocated block
       CF set on error
           AX = DOS error code (07h,08h) (see INT 21/AH=59h)
                (DPMI 1.0+) DPMI error code (8011h) (see AX=0000h)
           BX = size (in paragraphs) of largest available block
Notes:  multiple contiguous selectors are allocated for blocks of more than 64K
         if the caller is a 16-bit program
       never modify or deallocate returned descriptors
       not supported by MS Windows 3.0 in Standard mode
SeeAlso: AX=0101h,AX=0501h
----------310101-----------------------------
INT 31 P - DPMI 0.9+ - FREE DOS MEMORY BLOCK
       AX = 0101h
       DX = selector of block
Return: CF set if successful
       CF set on error
           AX = DOS error code (07h,09h) (see INT 21/AH=59h)
Notes:  all descriptors allocated for the block are automatically freed
       DPMI 1.0+ automatically zeros any segment registers containing a
         selector freed by this function
       not supported by MS Windows 3.0 in Standard mode
SeeAlso: AX=0100h,AX=0102h,AX=0502h
----------310102-----------------------------
INT 31 P - DPMI 0.9+ - RESIZE DOS MEMORY BLOCK
       AX = 0102h
       BX = new block size in paragraphs
       DX = selector of block
Return: CF clear if successful
       CF set on error
           AX = DOS error code (07h,08h,09h) (see INT 21/AH=59h)
                (DPMI 1.0+) DPMI error code (8011h,8022h) (see AX=0000h)
           BX = maximum block size (in paragraphs) possible
Notes:  increasing the size of a block past a 64K boundary will fail if the
         next descriptor in the LDT is already in use
       shrinking a block past a 64K boundary will cause some selectors to be
         freed; DPMI 1.0+ automatically zeros any segment registers containing
         a selector freed by this function
       not supported by MS Windows 3.0 in Standard mode
SeeAlso: AX=0100h
----------310200-----------------------------
INT 31 P - DPMI 0.9+ - GET REAL MODE INTERRUPT VECTOR
       AX = 0200h
       BL = interrupt number
Return: CF clear
       CX:DX = segment:offset of real mode interrupt handler
Note:   the DPMI implementation is required to support all 256 vectors
SeeAlso: AX=0201h,AX=0204h,INT 21/AX=2503h
----------310201-----------------------------
INT 31 P - DPMI 0.9+ - SET REAL MODE INTERRUPT VECTOR
       AX = 0201h
       BL = interrupt number
       CX:DX = segment:offset of real mode handler
Return: CF clear
Note:   all memory that may be touched by a hardware interrupt handler must be
         locked down with INT 31/AX=0600h
SeeAlso: AX=0200h,AX=0205h,AX=0600h,INT 21/AX=2505h
----------310202-----------------------------
INT 31 P - DPMI 0.9+ - GET PROCESSOR EXCEPTION HANDLER VECTOR
       AX = 0202h
       BL = exception number (00h-1Fh)
Return: CF clear if successful
           CX:(E)DX = selector:offset of handler
       CF set on error
           AX = error code (DPMI 1.0+) (8021h) (see AX=0000h)
Notes:  16-bit programs receive the pointer in CX:DX, 32-bit programs in CX:EDX
       DPMI 1.0+ supports this function only for backward compatibility; use
          AX=0210h or AX=0211h instead
       not supported by MS Windows 3.0 in Standard mode
SeeAlso: AX=0203h,AX=0210h,AX=0211h,INT 2F/AX=FB42h/BX=0021h
----------310203-----------------------------
INT 31 P - DPMI 0.9+ - SET PROCESSOR EXCEPTION HANDLER VECTOR
       AX = 0203h
       BL = exception number (00h-1Fh)
       CX:(E)DX = selector:offset of handler
Return: CF clear if successful
       CF set on error
           AX = error code (DPMI 1.0+) (8021h,8022h) (see AX=0000h)
Notes:  32-bit programs must supply an offset in EDX and use a 32-bit interrupt
         stack frame on chaining to the next exception handler
       the handler should return using a FAR return
       all fault stack frames contain an error code, but it is only valid for
         exceptions 08h and 0Ah-0Eh
       handlers will only be called if the exception occurs in protected mode,
         and the DPMI host does not transparently handle the exception
       the handler may change certain values on the stack frame (see below)
       DPMI 1.0+ supports this function only for backward compatibility; use
          AX=0212h or AX=0213h instead
       not supported by MS Windows 3.0 in Standard mode
SeeAlso: AX=0202h,AX=0212h,AX=0213h,INT 2F/AX=FB42h/BX=0022h

Format of stack frame for 16-bit programs: (offset from SS:SP)
Offset  Size    Description
00h    DWORD   return CS:IP (do not change)
04h    WORD    error code
06h    DWORD   CS:IP of exception
0Ah    WORD    flags
0Ch    DWORD   SS:SP

Format of stack frame for 32-bit programs: (offset from SS:ESP)
Offset  Size    Description
00h    DWORD   return EIP (do not change)
04h    WORD    return CS selector (do not change)
06h    WORD    reserved (do not change)
08h    DWORD   error code
0Ch    DWORD   EIP of exception
10h    WORD    CS selector of exception
12h    WORD    reserved (do not change)
14h    DWORD   EFLAGS
18h    DWORD   ESP
1Ch    WORD    SS
1Eh    WORD    reserved (do not change)
----------310204-----------------------------
INT 31 P - DPMI 0.9+ - GET PROTECTED MODE INTERRUPT VECTOR
       AX = 0204h
       BL = interrupt number
Return: CF clear
       CX:(E)DX = selector:offset of handler
Notes:  16-bit programs use CX:DX, 32-bit programs use CX:EDX
       DPMI implementations are required to support all 256 vectors
       not supported by MS Windows 3.0 in Standard mode
SeeAlso: AX=0200h,AX=0205h,INT 21/AX=2502h,INT 2F/AX=FB42h/BX=0024h
----------310205-----------------------------
INT 31 P - DPMI 0.9+ - SET PROTECTED MODE INTERRUPT VECTOR
       AX = 0205h
       BL = interrupt number
       CX:(E)DX = selector:offset of handler
Return: CF clear if successful
       CF set on error
           AX = error code (DPMI 1.0+) (8022h) (see AX=0000h)
Notes:  16-bit programs use CX:DX, 32-bit programs use CX:EDX
       32-bit programs must use a 32-bit interrupt stack frame when chaining
         to the next handler
       DPMI implementations are required to support all 256 vectors
       hardware interrupts are reflected to the virtual machine's primary
         client, software interrupts to the current client
       not supported by MS Windows 3.0 in Standard mode
SeeAlso: AX=0201h,AX=0204h,INT 21/AX=2504h,INT 2F/AX=FB42h/BX=0025h
----------310210-----------------------------
INT 31 P - DPMI 1.0+ - GET PROTECTED MODE EXTENDED PROCESSOR EXCEPTION HANDLER
       AX = 0210h
       BL = exception number (00h-1Fh)
Return: CF clear if successful
           CX:(EDX) = selector:offset of exception handler
       CF set on error
           AX = error code (8021h) (see AX=0000h)
Note:   DPMI host reflects exception to current client's handler
SeeAlso: AX=0202h,AX=0211h,AX=0212h
----------310211-----------------------------
INT 31 P - DPMI 1.0+ - GET REAL MODE EXTENDED PROCESSOR EXCEPTION HANDLER
       AX = 0211h
       BL = exception number (00h-1Fh)
Return: CF clear if successful
           CX:(EDX) = selector:offset of exception handler
       CF set on error
           AX = error code (8021h) (see AX=0000h)
Notes:  returns address of protected-mode handler for real-mode exception
       DPMI host performs a switch to protected mode, reflects the exception
         to the virtual machine's primary client, and returns to real mode
         on the handler's completion
SeeAlso: AX=0202h,AX=0210h,AX=0213h
----------310212-----------------------------
INT 31 P - DPMI 1.0+ - SET PROTECTED MODE EXTENDED PROCESSOR EXCEPTION HANDLER
       AX = 0212h
       BL = exception or fault number (00h-1Fh)
       CX:(E)DX = exception handler selector:offset
Return: CF clear if successful
       CF set on error
           AX = error code (8021h,8022h) (see AX=0000h)
Note:   DPMI host sends exception to current client's handler
SeeAlso: AX=0203h,AX=0210h,AX=0213h
----------310213-----------------------------
INT 31 P - DPMI 1.0+ - SET REAL MODE EXTENDED PROCESSOR EXCEPTION HANDLER
       AX = 0213h
       BL = exception or fault number (00h-1Fh)
       CX:(E)DX = exception handler selector:offset
Return: CF clear if successful
       CF set on error
           AX = error code (8021h,8022h) (see AX=0000h)
Notes:  specifies address of protected-mode handler for real-mode exception
       DPMI host performs a switch to protected mode, reflects the exception
         to the virtual machine's primary client, and returns to real mode
         on the handler's completion
SeeAlso: AX=0203h,AX=0211h,AX=0212h
----------310300-----------------------------
INT 31 P - DPMI 0.9+ - SIMULATE REAL MODE INTERRUPT
       AX = 0300h
       BL = interrupt number
       BH = flags
           bit 0: reset the interrupt controller and A20 line (DPMI 0.9)
                  reserved, must be 0 (DPMI 1.0+)
           others must be 0
       CX = number of words to copy from protected mode to real mode stack
       ES:(E)DI = selector:offset of real mode call structure (see below)
Return: CF clear if successful
           real mode call structure modified (all fields except SS:SP, CS:IP
             filled with return values from real mode interrupt)
       CF set on error
           AX = error code (DPMI 1.0+) (8012h,8013h,8014h,8021h)(see AX=0000h)
       protected mode stack unchanged
Notes:  16-bit programs use ES:DI as pointer, 32-bit programs use ES:EDI
       CS:IP in the real mode call structure is ignored for this call,
         instead, the indicated interrupt vector is used for the address
       the flags in the call structure are pushed on the real mode stack to
         form an interrupt stack frame, and the trace and interrupt flags are
         clear on entry to the handler
       DPMI will provide a small (30 words) real mode stack if SS:SP is zero
       the real mode handler must return with the stack in the same state as
         it was on being called
SeeAlso: AX=0302h,INT 21/AX=2511h,INT 21/AH=E3h"OS/286"
SeeAlso: INT 2F/AX=FB42h/BX=000Dh

Format of real mode call structure:
Offset  Size    Description
00h    DWORD   EDI
04h    DWORD   ESI
08h    DWORD   EBP
0Ch    DWORD   reserved (00h)
10h    DWORD   EBX
14h    DWORD   EDX
18h    DWORD   ECX
1Ch    DWORD   EAX
20h    WORD    flags
22h    WORD    ES
24h    WORD    DS
26h    WORD    FS
28h    WORD    GS
2Ah    WORD    IP
2Ch    WORD    CS
2Eh    WORD    SP
30h    WORD    SS
----------310301-----------------------------
INT 31 P - DPMI 0.9+ - CALL REAL MODE PROCEDURE WITH FAR RETURN FRAME
       AX = 0301h
       BH = flags
           bit 0: reset the interrupt controller and A20 line (DPMI 0.9)
                  reserved, must be 0 (DPMI 1.0+)
           others must be 0
       CX = number of words to copy from protected mode to real mode stack
       ES:DI / ES:EDI = selector:offset of real mode call structure
                       (see INT 31/AX=0300h)
Return: CF clear if successful
           real mode call structure modified (all fields except SS:SP, CS:IP
             filled with return values from real mode interrupt)
       CF set on error
           AX = error code (DPMI 1.0+) (8012h,8013h,8014h,8021h)(see AX=0000h)
       protected mode stack unchanged
Notes:  16-bit programs use ES:DI as pointer, 32-bit programs use ES:EDI
       the real mode procedure must exit with a FAR return
       DPMI will provide a small (30 words) real mode stack if SS:SP is zero
       the real mode handler must return with the stack in the same state as
         it was on being called
SeeAlso: AX=0300h,AX=0302h,INT 21/AX=250Eh,INT 21/AH=E1h"OS/286"
----------310302-----------------------------
INT 31 P - DPMI 0.9+ - CALL REAL MODE PROCEDURE WITH IRET FRAME
       AX = 0302h
       BH = flags
           bit 0: reset the interrupt controller and A20 line (DPMI 0.9)
                  reserved, must be 0 (DPMI 1.0+)
           others must be 0
       CX = number of words to copy from protected mode to real mode stack
       ES:DI / ES:EDI = selector:offset of real mode call structure
                       (see INT 31/AX=0300h)
Return: CF clear if successful
           real mode call structure modified (all fields except SS:SP, CS:IP
             filled with return values from real mode interrupt)
       CF set on error
           AX = error code (DPMI 1.0+) (8012h,8013h,8014h,8021h)(see AX=0000h)
       protected mode stack unchanged
Notes:  16-bit programs use ES:DI as pointer, 32-bit programs use ES:EDI
       the flags in the call structure are pushed on the real mode stack to
         form an interrupt stack frame, and the trace and interrupt flags are
         clear on entry to the handler
       the real mode procedure must exit with an IRET
       DPMI will provide a small (30 words) real mode stack if SS:SP is zero
       the real mode handler must return with the stack in the same state as
         it was on being called
SeeAlso: AX=0300h
----------310303-----------------------------
INT 31 P - DPMI 0.9+ - ALLOCATE REAL MODE CALLBACK ADDRESS
       AX = 0303h
       DS:SI / DS:ESI = selector:offset of procedure to call
       ES:DI / ES:EDI = selector:offset of real mode call structure
                       (see AX=0300h)
Return: CF clear if successful
           CX:DX = segment:offset of real mode call address
       CF set on error
           AX = error code (DPMI 1.0+) (8015h) (see AX=0000h)
Notes:  the real mode call structure is static, causing reentrancy problems;
         its contents are only valid at the time of a callback
       the called procedure must modify the real mode CS:IP before returning
       values are returned to real mode by modifying the real mode call struc
       DPMI hosts must provide at least 16 callbacks per client
SeeAlso: AX=0304h,AX=0C00h

Values callback procedure is called with:
       DS:SI / DS:ESI = selector:offset of real mode SS:SP
       ES:DI / ES:EDI = selector:offset of real mode call structure
       SS:SP / SS:ESP = locked protected mode API stack
       interrupts disabled
Return: (with IRET)
       ES:DI / ES:EDI = selector:offset of real mode call structure to restore
----------310304-----------------------------
INT 31 P - DPMI 0.9+ - FREE REAL MODE CALLBACK ADDRESS
       AX = 0304h
       CX:DX = real mode callback address
Return: CF clear if successful
       CF set on error
           AX = error code (DPMI 1.0+) (8024h) (see AX=0000h)
SeeAlso: AX=0303h
----------310305-----------------------------
INT 31 P - DPMI 0.9+ - GET STATE SAVE/RESTORE ADDRESSES
       AX = 0305h
Return: CF clear
       AX = size in bytes of state buffer
       BX:CX = real mode address of procedure to save/restore state
       SI:DI / SI:EDI = protected mode procedure to save/restore state
Notes:  the buffer size will be zero if it is not necessary to preserve state
       16-bit programs should call SI:DI, 32-bit programs should call SI:EDI
       this function is only needed if using the raw mode switch service
SeeAlso: AX=0306h

Values to call state-save procedures with:
       AL = direction
           00h save state
           01h restore state
       ES:DI / ES:EDI -> state buffer
Return: all registers preserved
----------310306-----------------------------
INT 31 P - DPMI 0.9+ - GET RAW MODE SWITCH ADDRESSES
       AX = 0306h
Return: CF clear
       BX:CX -> procedure to switch from real to protected mode
       SI:DI / SI:EDI -> procedure to switch from protected to real mode
Notes:  16-bit programs should jump to SI:DI, 32-bit programs should use SI:EDI
       the caller must save and restore the state of the task with AX=0305h
       not supported by MS Windows 3.0 in Standard mode
SeeAlso: AX=0305h

Values to JUMP at mode-switch procedures with:
       AX = new DS
       CX = new ES
       DX = new SS
       BX / EBX = new SP / ESP
       SI = new CS
       DI / EDI = new IP / EIP
Notes:  BP/EBP is preserved across the call, but AX/EAX, BX/EBX, CX/ECX,
         DX/EDX, SI/ESI, and DI/EDI will be undefined; FS and GS will be 0000h
       interrupts will stay disabled during the entire mode switch if they
         are disabled on entry to the mode-switch procedure
----------310400-----------------------------
INT 31 P - DPMI 0.9+ - GET DPMI VERSION
       AX = 0400h
Return: CF clear
       AH = major version of DPMI spec supported
       AL = two-digit minor version of DPMI spec supported
       BX = flags
           bit 0: running under an 80386 (32-bit) implementation
           bit 1: processor returns to real mode for reflected interrupts
                  instead of V86 mode
           bit 2: virtual memory supported
           bit 3: reserved (undefined)
           others reserved (zero)
       CL = processor type (02h=80286, 03h=80386, 04h=80486)
       DH = curr value of virtual master interrupt controller base interrupt
       DL = curr value of virtual slave interrupt controller base interrupt
SeeAlso: AX=0401h,INT 21/AX=250Ch,INT 67/AX=DE0Ah
----------310401-----------------------------
INT 31 P - DPMI 1.0+ - GET DPMI CAPABILITIES
       AX = 0401h
       ES:(E)DI -> 128-byte buffer (see below)
Return: CF clear if successful
           AX = capabilities
               bit 0: paged accessed/dirty supported (see AX=0506h,AX=0507h)
                   1: exceptions restartability supported
                   2: device mapping supported (see AX=0508h)
                   3: conventional memory mapping supported (see AX=0509h)
                   4: demand zero-fill supported
                   5: write-protect client capability supported
                   6: write-protect host capability supported
                   7-15: reserved
           CX = reserved (00h)
           DX = reserved (00h)
           buffer filled
       CF set on error (DPMI 0.9 only)
SeeAlso: AX=0400h

Format of buffer:
Offset  Size    Description
00h    BYTE    host major version number
01h    BYTE    host minor version number
02h 126 BYTEs  ASCIZ host vendor name
----------310500-----------------------------
INT 31 P - DPMI 0.9+ - GET FREE MEMORY INFORMATION
       AX = 0500h
       ES:DI / ES:EDI -> buffer for memory information (see below)
Return: CF clear
Notes:  16-bit programs use ES:DI, 32-bit programs use ES:EDI
       this function must be considered advisory because other applications
         may affect the results at any time after the call
       fields not supported by the DPMI implementation are filled with
         FFFFFFFFh
       DPMI 1.0+ supports this function solely for backward compatibility; use
         AX=050Bh instead
SeeAlso: AX=0501h,AX=0604h

Format of memory information:
Offset  Size    Description
00h    DWORD   largest available block in bytes
04h    DWORD   maximum unlocked page allocation
08h    DWORD   maximum locked page allocation
0Ch    DWORD   total linear address space in pages
10h    DWORD   total unlocked pages
14h    DWORD   free pages
18h    DWORD   total physical pages
1Ch    DWORD   free linear address space in pages
20h    DWORD   size of paging file/partition in pages
24h 12 BYTEs   reserved
----------310501-----------------------------
INT 31 P - DPMI 0.9+ - ALLOCATE MEMORY BLOCK
       AX = 0501h
       BX:CX = size in bytes
Return: CF clear if successful
           BX:CX = linear address of block
           SI:DI = memory block handle for resizing and freeing block
       CF set on error
           AX = error code (DPMI 1.0+) (8012h-8014h,8016h,8021h)(see AX=0000h)
Notes:  no selectors are allocated
       the memory block is allocated unlocked (can be locked with AX=0600h)
       allocations are often page granular (see AX=0604h)
SeeAlso: AX=0000h,AX=0100h,AX=0500h,AX=0502h,AX=0503h,AX=0504h,AX=0D00h
----------310502-----------------------------
INT 31 P - DPMI 0.9+ - FREE MEMORY BLOCK
       AX = 0502h
       SI:DI = handle of memory block
Return: CF clear if successful
       CF set on error
           AX = error code (DPMI 1.0+) (8023h) (see AX=0000h)
Note:   any selectors allocated for the memory block must also be freed,
         preferably before freeing the memory block
SeeAlso: AX=0001h,AX=0101h,AX=0501h,AX=0D01h
----------310503-----------------------------
INT 31 P - DPMI 0.9+ - RESIZE MEMORY BLOCK
       AX = 0503h
       BX:CX = new size in bytes (nonzero)
       SI:DI = handle of memory block
Return: CF clear if successful
           BX:CX = new linear address
           SI:DI = new handle of memory block
       CF set on error
           AX = error code (DPMI 1.0+) (8012h-8014h,8016h,8021h,8023h)
               (see AX=0000h)
Notes:  any selectors pointing at the block must be updated
       the previous memory block handle becomes invalid
       an error is returned if the new size is 0
SeeAlso: AX=0102h,AX=0501h,AX=0505h
----------310504-----------------------------
INT 31 P - DPMI 1.0+ - ALLOCATE LINEAR MEMORY BLOCK
       AX = 0504h
       EBX = page-aligned linear address of memory block (00000000h if any
               address is acceptable)
       ECX = size in bytes (nonzero)
       EDX = flags
           bit 0: set to create committed pages instead of uncommitted pages
           bits 1-31: reserved (0)
Return: CF clear if successful
           EBX = linear address of memory block
           ESI = memory block handle
       CF set on error
           AX = error code (8001h,8012h-8014h,8016h,8021h,8025h)(see AX=0000h)
Note:   only supported by 32-bit DPMI hosts, but may be used by 16-bit clients
SeeAlso: AX=0501h,AX=0505h
----------310505-----------------------------
INT 31 P - DPMI 1.0+ - RESIZE LINEAR MEMORY BLOCK
       AX = 0505h
       ESI = memory block handle
       ECX = new size in bytes (nonzero)
       EDX = flags
           bit 0: create committed pages rather than uncommitted pages
           bit 1: segment descriptor update required
               ES:EBX -> buffer containing array of WORDs with selectors
               EDI = number of selectors in array
           bits 2-31: reserved (0)
Return: CF clear if successful
           EBX = new linear base address
           ESI = new memory block handle
       CF set on error
           AX = error code (8001h,8012h-8014h,8016h,8021h,8023h)(see AX=0000h)
Notes:  only supported by 32-bit DPMI hosts, but may be used by 16-bit clients
       the old memory block handle becomes invalid
       if EDX bit 1 set and the block's base address is changed, DPMI updates
         all descriptors for selectors in the update buffer which fall within
         the memory block
SeeAlso: AX=0503h,AX=0504h
----------310506-----------------------------
INT 31 P - DPMI 1.0+ - GET PAGE ATTRIBUTES
       AX = 0506h
       ESI = memory block handle
       EBX = offset in memory block of first page
       ECX = number of pages
       ES:EDX -> array of WORDs to hold page attributes (see below)
Return: CF clear if successful
           buffer filled
       CF set on error
           AX = error code (8001h,8023h,8025h) (see AX=0000h)
Notes:  only supported by 32-bit DPMI hosts, but may be used by 16-bit clients
       if EBX is not page-aligned, it will be rounded down
SeeAlso: AX=0504h,AX=0507h,INT 21/AX=251Dh,INT 21/AX=EB00h

Format of page attribute words:
bits 0-2       page type
               000 uncommitted
               001 committed
               010 mapped (see AX=0508h,AX=0509h)
               other currently unused
bit 3          page is read/write rather than read-only
bit 4          accessed/dirty bits supplied in bits 5 and 6
bit 5          page has been accessed (only valid if bit 4 set)
bit 6          page has been written (only valid if bit 4 set)
bits 7-15      reserved (0)
----------310507-----------------------------
INT 31 P - DPMI 1.0+ - MODIFY PAGE ATTRIBUTES
       AX = 0507h
       ESI = memory block handle
       EBX = offset in memory block of first page
       ECX = number of pages
       ES:EDX -> array of WORDs with new page attributes (see AX=0506h)
Return: CF clear if successful
       CF set on error
           AX = error code (8001h,8002h,8013h,8014h,8021h,8023h,8025h)
               (see AX=0000h)
           ECX = number of pages which have been set
Notes:  only supported by 32-bit DPMI hosts, but may be used by 16-bit clients
       if EBX is not page-aligned, it will be rounded down
SeeAlso: AX=0504h,AX=0506h,INT 21/AX=251Eh
----------310508-----------------------------
INT 31 P - DPMI 1.0+ - MAP DEVICE IN MEMORY BLOCK
       AX = 0508h
       ESI = memory block handle
       EBX = page-aligned offset within memory block of page(s) to be mapped
       ECX = number of pages to map
       EDX = page-aligned physical address of device
Return: CF clear if successful
       CF set on error
           AX = error code (8001h,8003h,8023h,8025h) (see AX=0000h)
Notes:  only supported by 32-bit DPMI hosts, but may be used by 16-bit clients
       support of this function is optional; hosts are also allowed to support
         the function for some devices but not others
SeeAlso: AX=0504h,AX=0509h,AX=0800h,AX=0801h
----------310509-----------------------------
INT 31 P - DPMI 1.0+ - MAP CONVENTIONAL MEMORY IN MEMORY BLOCK
       AX = 0509h
       ESI = memory block handle
       EBX = page-aligned offset within memory block of page(s) to map
       ECX = number of pages to map
       EDX = page-aligned linear address of conventional (below 1M) memory
Return: CF clear if successful
       CF set on error
           AX = error code (8001h,8003h,8023h,8025h) (see AX=0000h)
Notes:  only supported by 32-bit DPMI hosts, but may be used by 16-bit clients
       support of this function is optional
SeeAlso: AX=0504h,AX=0508h,AX=0801h
----------31050A-----------------------------
INT 31 P - DPMI 1.0+ - GET MEMORY BLOCK SIZE AND BASE
       AX = 050AH
       SI:DI = memory block handle
Return: CF clear if successful
           SI:DI = size in bytes
           BX:CX = base address
       CF set on error
           AX = error code (8023h) (see AX=0000h)
SeeAlso: AX=0501h,AX=0504h
----------31050B-----------------------------
INT 31 P - DPMI 1.0+ - GET MEMORY INFORMATION
       AX = 050Bh
       ES:(E)DI -> 128-byte buffer for memory information (see below)
Return: CF clear if successful
       CF set on error (DPMI 0.9 only)
Note:   16-bit programs use ES:DI, 32-bit programs must use ES:EDI
SeeAlso: AX=0500h

Format of memory information:
Offset  Size    Description
00h    DWORD   total allocated bytes of physical memory controlled by host
04h    DWORD   total allocated bytes of virtual memory controlled by host
08h    DWORD   total available bytes of virtual memory controlled by host
0Ch    DWORD   total allocated bytes of virtual memory for curr virtual mach
10h    DWORD   total available bytes of virtual memory for curr virtual mach
14h    DWORD   total allocated bytes of virtual memory for current client
18h    DWORD   total available bytes of virtual memory for current client
1Ch    DWORD   total locked bytes for current client
20h    DWORD   maximum locked bytes for current client
24h    DWORD   highest linear address available to current client
28h    DWORD   largest available memory block in bytes
2Ch    DWORD   minimum allocation unit in bytes
30h    DWORD   allocation alignment unit size in bytes
34h 76 BYTEs   reserved (00h)
----------310600-----------------------------
INT 31 P - DPMI 0.9+ - LOCK LINEAR REGION
       AX = 0600h
       BX:CX = starting linear address
       SI:DI = size of region in bytes
Return: CF clear if successful
       CF set on error
           none of the memory is locked
           AX = error code (DPMI 1.0+) (8013h,8017h,8025h) (see AX=0000h)
Notes:  pages at beginning and end will be locked if the region overlaps them
       may be called multiple times for a given page; the DPMI host keeps a
         lock count for each page
SeeAlso: AX=0004h,AX=0601h,INT 21/AX=251Ah,INT 21/AX=EB06h
----------310601-----------------------------
INT 31 P - DPMI 0.9+ - UNLOCK LINEAR REGION
       AX = 0601h
       BX:CX = starting linear address
       SI:DI = size of region in bytes
Return: CF clear if successful
       CF set on error
           none of the memory is unlocked
           AX = error code (DPMI 1.0+) (8002h,8025h) (see AX=0000h)
Notes:  pages at beginning and end will be unlocked if the region overlaps them
       memory whose lock count has not reached zero remains locked
SeeAlso: AX=0005h,AX=0600h,INT 21/AX=251Bh,INT 21/AX=EB07h
----------310602-----------------------------
INT 31 P - DPMI 0.9+ - MARK REAL MODE REGION AS PAGEABLE
       AX = 0602h
       BX:CX = starting linear address
       SI:DI = size of region in bytes
Return: CF clear if successful
       CF set on error
           none of the memory is made pageable
           AX = error code (DPMI 1.0+) (8002h,8025h) (see AX=0000h)
Notes:  must relock all unlocked real mode memory before terminating process
         for DPMI 0.9; DPMI 1.0+ automatically relocks real mode memory
       pages at beginning and end will be unlocked if the region overlaps them
       pageability of real mode pages is binary, not a count
SeeAlso: AX=0600h,AX=0603h
----------310603-----------------------------
INT 31 P - DPMI 0.9+ - RELOCK REAL MODE REGION
       AX = 0603h
       BX:CX = starting linear address
       SI:DI = size of region in bytes
Return: CF clear if successful
       CF set on error
           none of the memory is relocked
           AX = error code (DPMI 1.0+) (8002h,8013h,8025h) (see AX=0000h)
Notes:  pages at beginning and end will be relocked if the region overlaps them
       pageability of real mode pages is binary, not a count
SeeAlso: AX=0602h
----------310604-----------------------------
INT 31 P - DPMI 0.9+ - GET PAGE SIZE
       AX = 0604h
Return: CF clear if successful
           BX:CX = page size in bytes
       CF set on error
           AX = error code (DPMI 1.0+)
               8001h unsupported, 16-bit host
----------310700-----------------------------
INT 31 P - DPMI 0.9+ - MARK PAGES AS PAGING CANDIDATES
       AX = 0700h
       BX:CX = starting linear page number
       SI:DI = number of pages to mark as paging candidates
Return: ???
Note:   although marked as reserved in versions 0.9 and 1.0 of the DPMI
         specification, this function is called by MS Windows TASKMAN,
         PROGMAN, and KERNEL
SeeAlso: AX=0701h,AX=0702h
----------310701-----------------------------
INT 31 P - DPMI 0.9+ - DISCARD PAGES
       AX = 0701h
       BX:CX = starting linear page number
       SI:DI = number of pages to discard
Return: ???
Note:   although marked as reserved in versions 0.9 and 1.0 of the DPMI
         specification, this function is called by MS Windows TASKMAN,
         PROGMAN, and KERNEL
SeeAlso: AX=0700h,AX=0703h
----------310702-----------------------------
INT 31 P - DPMI 0.9+ - MARK PAGE AS DEMAND PAGING CANDIDATE
       AX = 0702h
       BX:CX = starting linear address
       SI:DI = number of bytes to mark as paging candidates
Return: CF clear if successful
       CF set on error
           AX = error code (DPMI 1.0+) (8025h) (see AX=0000h)
Notes:  this function is advisory, and does not force immediate paging
       partial pages will not be discarded
SeeAlso: AX=0700h,AX=0703h
----------310703-----------------------------
INT 31 P - DPMI 0.9+ - DISCARD PAGE CONTENTS
       AX = 0703h
       BX:CX = starting linear address
       SI:DI = number of bytes to mark as discarded
Return: CF clear if successful
       CF set on error
           AX = error code (DPMI 1.0+) (8025h) (see AX=0000h)
Notes:  this function is advisory, and may be ignored by DPMI implementations
       partial pages will not be discarded
SeeAlso: AX=0701h,AX=0702h
----------310800-----------------------------
INT 31 P - DPMI 0.9+ - PHYSICAL ADDRESS MAPPING
       AX = 0800h
       BX:CX = physical address (should be above 1 MB)
       SI:DI = size in bytes
Return: CF clear if successful
           BX:CX = linear address which maps the requested physical memory
       CF set on error
           AX = error code (DPMI 1.0+) (8003h,8021h) (see AX=0000h)
Notes:  implementations may refuse this call because it can circumvent protects
       the caller must build an appropriate selector for the memory
       do not use for memory mapped in the first megabyte
SeeAlso: AX=0002h,AX=0508h,AX=0509h,AX=0801h,INT 21/AX=250Ah,INT 21/AX=EB05h
----------310801-----------------------------
INT 31 P - DPMI 1.0+ - FREE PHYSICAL ADDRESS MAPPING
       AX = 0801h
       BX:CX = linear address returned by AX=0800h
Return: CF clear if successful
       CF set on error
           AX = error code (8025h) (see AX=0000h)
Note:   should be called at end of access to device mapped with AX=0800h
SeeAlso: AX=0508h,AX=0509h,AX=0800h,INT 21/AX=EB03h
----------310900-----------------------------
INT 31 P - DPMI 0.9+ - GET AND DISABLE VIRTUAL INTERRUPT STATE
       AX = 0900h
Return: CF clear
       virtual interrupts disabled
       AL = 00h if previously disabled
          = 01h if previously enabled
       AH preserved
Notes:  the previous state may be restored simply by executing another INT 31
       a CLI instruction may be used if the previous state is unimportant,
         but should be assumed to be very slow due to trapping by the host
SeeAlso: AX=0901h,AX=0902h
----------310901-----------------------------
INT 31 P - DPMI 0.9+ - GET AND ENABLE VIRTUAL INTERRUPT STATE
       AX = 0901h
Return: CF clear
       virtual interrupts enabled
       AL = 00h if previously disabled
          = 01h if previously enabled
       AH preserved
Notes:  the previous state may be restored simply by executing another INT 31
       a STI instruction may be used if the previous state is unimportant,
         but should be assumed to be very slow due to trapping by the host
SeeAlso: AX=0900h,AX=0902h
----------310902-----------------------------
INT 31 P - DPMI 0.9+ - GET VIRTUAL INTERRUPT STATE
       AX = 0902h
Return: CF clear
       AL = 00h if disabled
          = 01h if enabled
Note:   should be used rather than PUSHF because that instruction yields the
         physical interrupt state rather than the per-client virtualized
         interrupt flag
SeeAlso: AX=0900h,AX=0901h
----------310A00-----------------------------
INT 31 P - DPMI 0.9+ - GET VENDOR SPECIFIC API ENTRY POINT
       AX = 0A00h
       DS:SI / DS:ESI -> case-sensitive ASCIZ vendor name or identifier
Return: CF clear if successful
           ES:DI / ES:EDI -> FAR extended API entry point
           DS, FS, GS, EAX, EBX, ECX, EDX, ESI, EBP destroyed
       CF set on error
           AX = error code (DPMI 1.0+) (8001h) (see AX=0000h)
Notes:  extended API parameters are vendor-specific
       DPMI 1.0+ supports this function solely for backward compatibility; use
         INT 2F/AX=168Ah instead
SeeAlso: INT 2F/AX=168Ah
----------310B00-----------------------------
INT 31 P - DPMI 0.9+ - SET DEBUG WATCHPOINT
       AX = 0B00h
       BX:CX = linear address
       DL = size (1,2,4 bytes)
       DH = type (00h execute, 01h write, 02h read/write)
Return: CF clear if successful
           BX = watchpoint handle
       CF set on error
           AX = error code (DPMI 1.0+) (8016h,8021h,8025h) (see AX=0000h)
SeeAlso: AX=0212h,AX=0601h
----------310B01-----------------------------
INT 31 P - DPMI 0.9+ - CLEAR DEBUG WATCHPOINT
       AX = 0B01h
       BX = watchpoint handle
Return: CF clear if successful
       CF set on error
           AX = error code (DPMI 1.0+) (8023h) (see AX=0000h)
Note:   the watchpoint handle is freed
SeeAlso: AX=0B00h
----------310B02-----------------------------
INT 31 P - DPMI 0.9+ - GET STATE OF DEBUG WATCHPOINT
       AX = 0B02h
       BX = watchpoint handle
Return: CF clear if successful
           AX = status flags
               bit 0: watch point has been executed since AX=0B00h or AX=0B03h
       CF set on error
           AX = error code (DPMI 1.0+) (8023h) (see AX=0000h)
SeeAlso: AX=0B00h,AX=0B03h
----------310B03-----------------------------
INT 31 P - DPMI 0.9+ - RESET DEBUG WATCHPOINT
       AX = 0B03h
       BX = watchpoint handle
Return: CF clear if successful
       CF set on error
           AX = error code (DPMI 1.0+) (8023h) (see AX=0000h)
SeeAlso: AX=0B02h
----------310C00-----------------------------
INT 31 P - DPMI 1.0+ - INSTALL RESIDENT HANDLER INIT CALLBACK
       AX = 0C00h
       ES:(E)DI -> resident service provider structure (see below)
Return: CF clear if successful
       CF set on error
           AX = error code (8015h,8021h,8025h) (see AX=0000h)
Note:   calling this function declares an intent to provide resident
         protected mode services after terminating with AX=0C01h
SeeAlso: AX=0303h,AX=0C01h

Format of resident service provider structure:
Offset  Size    Description
00h    QWORD   descriptor for 16-bit data segment
08h    QWORD   descriptor for 16-bit code segment (zeros if not supported)
10h    WORD    offset of 16-bit callback procedure
12h  2 BYTEs   reserved
14h    QWORD   descriptor for 32-bit data segment
1Ch    QWORD   descriptor for 32-bit code segment (zeros if not supported)
24h    DWORD   offset of 32-bit callback procedure
----------310C01-----------------------------
INT 31 P - DPMI 1.0+ - TERMINATE AND STAY RESIDENT
       AX = 0C01h
       BL = return code
       DX = number of paragraphs of DOS memory to reserve (0 or >= 6)
Return: never
Notes:  should only be used if the program will only provide services to
         other DPMI programs
       any protected mode memory remains allocated to the program unless
         explicitly freed before this call
       must first call AX=0C00h or program will simply be terminated
SeeAlso: AX=0C00h,INT 21/AH=31h
----------310D00-----------------------------
INT 31 P - DPMI 1.0+ - ALLOCATE SHARED MEMORY
       AX = 0D00h
       ES:(E)DI -> shared memory allocation request structure (see below)
Return: CF clear if successful
           request structure updated
       CF set on error
           AX = error code (8012h,8013h,8014h,8016h,8021h) (see AX=0000h)
Note:   first 16 bytes of memory block will be initialized to zeros on the
         first allocation
SeeAlso: AX=0501h,AX=0D01h,AX=0D02h

Format of shared memory allocation request structure:
Offset  Size    Description
00h    DWORD   requested length of shared memory block in bytes
04h    DWORD   (return) allocated length of block
08h    DWORD   (return) shared memory handle
0Ch    DWORD   (return) linear address of memory block
10h  6 BYTEs   selector:offset32 of ASCIZ name for memory block
               (name max 128 bytes)
16h  2 BYTEs   reserved
18h  4 BYTEs   reserved (00h)
----------310D01-----------------------------
INT 31 P - DPMI 1.0+ - FREE SHARED MEMORY
       AX = 0D01h
       SI:DI = shared memory block handle
Return: CF clear if successful
       CF set on error
           AX = error code (8023h) (see AX=0000h)
Notes:  handle becomes invalid after this call
       DPMI maintains separate global and virtual machine use counts for each
         shared memory block; when the global use counts reaches zero, the
         block is finally destroyed
SeeAlso: AX=0502h,AX=0D00h
----------310D02-----------------------------
INT 31 P - DPMI 1.0+ - SERIALIZE SHARED MEMORY
       AX = 0D02h
       SI:DI = shared memory block handle
       DX = flags
           bit 0: return immediately rather than suspending if serialization
                       unavailable
               1: shared rather than exclusive serialization
               2-15: reserved (0)
Return: CF clear if successful
       CF set on error
           AX = error code (8004h,8005h,8017h-8019h,8023h) (see AX=0000h)
Notes:  an exclusive serialization blocks any other serialization attempts for
         the same block by another virtual machine; a shared serialization
         blocks attempts at exclusive serialization by another virtual machine
       hosts are not required to detect deadlock
       a client's interrupt handler can cancel a serialization call which
         caused it to block by calling AX=0D03h
SeeAlso: AX=0D00h,AX=0D03h
----------310D03-----------------------------
INT 31 P - DPMI 1.0+ - FREE SERIALIZATION ON SHARED MEMORY
       AX = 0D03h
       SI:DI = shared memory block handle
       DX = flags
           bit 0: release shared serialization rather than exclusive serialztn
           bit 1: free pending serialization
           bits 2-15: reserved (0)
Return: CF clear if successful
       CF set on error
           AX = error code (8002h,8023h) (see AX=0000h)
SeeAlso: AX=0D00h,AX=0D02h
----------310E00-----------------------------
INT 31 P - DPMI 1.0+ - GET COPROCESSOR STATUS
       AX = 0E00h
Return: CF clear
       AX = coprocessor status
           bit 0: numeric coprocessor enabled for current client
           bit 1: client is emulating coprocessor
           bit 2: numeric coprocessor is present
           bit 3: host is emulating coprocessor instructions
           bits 4-7: coprocessor type
               0000 none
               0010 80287
               0011 80387
               0100 80486 with numeric coprocessor
               other reserved
           bits 8-15: not used
Note:   supported by 386MAX v6.01, which otherwise only supports DPMI 0.9
SeeAlso: AX=0E01h
----------310E01-----------------------------
INT 31 P - DPMI 1.0+ - SET EMULATION
       AX = 0E01h
       BX = coprocessor flag bits
           bit 0: enable numeric coprocessor for current client
           bit 1: client will emulate coprocessor
           bits 2-15: not used
Return: CF clear if successful
       CF set on error
           AX = error code (8026h) (see AX=0000h)
Note:   supported by 386MAX v6.01, which otherwise only supports DPMI 0.9
SeeAlso: AX=0E00h
----------32---------------------------------
INT 32 - VIRUS - reportedly used by "Tiny" Viruses
SeeAlso: INT 60"VIRUS"
----------330000-----------------------------
INT 33 - MS MOUSE - RESET DRIVER AND READ STATUS
       AX = 0000h
Return: AX = status
           0000h hardware/driver not installed
           FFFFh hardware/driver installed
       BX = number of buttons
           0000h other than two
           0002h two buttons (many drivers)
           0003h Mouse Systems/Logitech three-button mouse
           FFFFh two buttons
Notes:  to use mouse on a Hercules-compatible monographics card in graphics
         mode, you must first set 0040h:0049h to 6 for page 0 or 5 for page 1,
         and then call this function.  Logitech drivers v5.01 and v6.00
         reportedly do not correctly use Hercules graphics in dual-monitor
         systems, while version 4.10 does.
       the Logitech mouse driver contains the signature string "LOGITECH"
         three bytes past the interrupt handler; many of the Logitech mouse
         utilities check for this signature.
SeeAlso: AX=0011h,AX=0021h,AX=002Fh,INT 62/AX=007Ah,INT 74
----------330001-----------------------------
INT 33 - MS MOUSE - SHOW MOUSE CURSOR
       AX = 0001h
SeeAlso: AX=0002h,INT 16/AX=FFFEh,INT 62/AX=007Bh
----------330002-----------------------------
INT 33 - MS MOUSE - HIDE MOUSE CURSOR
       AX = 0002h
Note:   multiple calls to hide the cursor will require multiple calls to
         function 01h to unhide it.
SeeAlso: AX=0001h,AX=0010h,INT 16/AX=FFFFh,INT 62/AX=007Bh
----------330003-----------------------------
INT 33 - MS MOUSE - RETURN POSITION AND BUTTON STATUS
       AX = 0003h
Return: BX = button status
          bit 0  left button pressed if 1
          bit 1  right button pressed if 1
          bit 2  middle button pressed if 1 (Mouse Systems/Logitech mouse)
       CX = column
       DX = row
SeeAlso: AX=0004h,AX=000Bh,INT 2F/AX=D000h"ZWmous"
----------330004-----------------------------
INT 33 - MS MOUSE - POSITION MOUSE CURSOR
       AX = 0004h
       CX = column
       DX = row
Note:   the row and column are truncated to the next lower multiple of the cell
         size; however, some versions of the Microsoft documentation
         incorrectly state that the coordinates are rounded
SeeAlso: AX=0003h,INT 62/AX=0081h
----------330005-----------------------------
INT 33 - MS MOUSE - RETURN BUTTON PRESS DATA
       AX = 0005h
       BX = button
           0000h left
           0001h right
           0002h middle (Mouse Systems/Logitech mouse)
Return: AX = button states
           bit 0 left button pressed if 1
           bit 1 right button pressed if 1
           bit 2 middle button pressed if 1 (Mouse Systems/Logitech mouse)
       BX = number of times specified button has been pressed since last call
       CX = column at time specified button was last pressed
       DX = row at time specified button was last pressed
SeeAlso: AX=0006h,INT 62/AX=007Ch
----------330006-----------------------------
INT 33 - MS MOUSE - RETURN BUTTON RELEASE DATA
       AX = 0006h
       BX = button
           0000h left
           0001h right
           0002h middle (Mouse Systems/Logitech mouse)
Return: AX = button states
           bit 0 left button pressed if 1
           bit 1 right button pressed if 1
           bit 2 middle button pressed if 1 (Mouse Systems/Logitech mouse)
       BX = number of times specified button has been released since last call
       CX = column at time specified button was last released
       DX = row at time specified button was last released
SeeAlso: AX=0005h,INT 62/AX=007Ch
----------330007-----------------------------
INT 33 - MS MOUSE - DEFINE HORIZONTAL CURSOR RANGE
       AX = 0007h
       CX = minimum column
       DX = maximum column
SeeAlso: AX=0008h,AX=0010h,AX=0031h,INT 62/AX=0080h
----------330008-----------------------------
INT 33 - MS MOUSE - DEFINE VERTICAL CURSOR RANGE
       AX = 0008h
       CX = minimum row
       DX = maximum row
SeeAlso: AX=0007h,AX=0010h,AX=0031h,INT 62/AX=0080h
----------330009-----------------------------
INT 33 - MS MOUSE - DEFINE GRAPHICS CURSOR
       AX = 0009h
       BX = column of cursor hot spot in bitmap (-16 to 16)
       CX = row of cursor hot spot (-16 to 16)
       ES:DX -> bitmap
               16 words screen mask
               16 words cursor mask
                   each word defines the sixteen pixels of a row, low bit
                   rightmost
SeeAlso: AX=000Ah,AX=0012h,AX=002Ah,INT 62/AX=007Fh
----------33000A-----------------------------
INT 33 - MS MOUSE - DEFINE TEXT CURSOR
       AX = 000Ah
       BX = hardware/software text cursor
           0000h software
               CX = screen mask
               DX = cursor mask
           0001h hardware
               CX = start scan line
               DX = end scan line
Note:   when the software cursor is selected, the char/attribute data at the
         current screen position is ANDed with the screen mask and then XORed
         with the cursor mask
SeeAlso: AX=0009h,INT 62/AX=007Eh
----------33000B-----------------------------
INT 33 - MS MOUSE - READ MOTION COUNTERS
       AX = 000Bh
Return: CX = number of mickeys mouse moved horizontally since last call
       DX = number of mickeys mouse moved vertically
Notes:  a mickey is the smallest increment the mouse can sense
       positive values indicate down/right
SeeAlso: AX=0003h,AX=001Bh,AX=0027h
----------33000C-----------------------------
INT 33 - MS MOUSE - DEFINE INTERRUPT SUBROUTINE PARAMETERS
       AX = 000Ch
       CX = call mask
            bit 0 call if mouse moves
            bit 1 call if left button pressed
            bit 2 call if left button released
            bit 3 call if right button pressed
            bit 4 call if right button released
            bit 5 call if middle button pressed (Mouse Systems/Logitech mouse)
            bit 6 call if middle button released (Mouse Sys/Logitech mouse)
       ES:DX -> FAR routine
Notes:  when the subroutine is called, it is passed the following values:
         AX = condition mask (same bit assignments as call mask)
         BX = button state
         CX = cursor column
         DX = cursor row
         SI = horizontal mickey count
         DI = vertical mickey count
       some versions of the Microsoft documentation incorrectly state that CX
         bit 0 means call if mouse cursor moves, and swap the meanings of SI
         and DI
SeeAlso: AX=0018h
----------33000D-----------------------------
INT 33 - MS MOUSE - LIGHT PEN EMULATION ON
       AX = 000Dh
SeeAlso: AX=000Eh,INT 10/AH=04h
----------33000E-----------------------------
INT 33 - MS MOUSE - LIGHT PEN EMULATION OFF
       AX = 000Eh
SeeAlso: AX=000Dh
----------33000F-----------------------------
INT 33 - MS MOUSE - DEFINE MICKEY/PIXEL RATIO
       AX = 000Fh
       CX = number of mickeys per 8 pixels horizontally (default 8)
       DX = number of mickeys per 8 pixels vertically (default 16)
SeeAlso: AX=0013h,AX=001Ah,INT 62/AX=0082h
----------330010-----------------------------
INT 33 - MS MOUSE - DEFINE SCREEN REGION FOR UPDATING
       AX = 0010h
       CX,DX = X,Y coordinates of upper left corner
       SI,DI = X,Y coordinates of lower right corner
Note:   mouse cursor is hidden in the specified region, and needs to be
         explicitly turned on again
SeeAlso: AX=0001h,AX=0002h,AX=0007h,AX=0010h"Genius MOUSE",AX=0031h
----------330010-----------------------------
INT 33 - Genius MOUSE - DEFINE SCREEN REGION FOR UPDATING
       AX = 0010h
       ES:DX -> update region list (see below)
Notes:  mouse cursor is hidden in the specified region, and needs to be
         explicitly turned on again
       this version of the call is described in an August 1988 version of the
         Genius Mouse programmer's reference; it has been changed to conform
         to the Microsoft version shown above by version 9.06 (and possibly
         earlier versions)
SeeAlso: AX=0001h,AX=0002h,AX=0007h,AX=0010h"MS MOUSE"

Format of update region list:
Offset  Size    Description
00h    WORD    left-most column
02h    WORD    top-most row
04h    WORD    right-most column
06h    WORD    bottom-most row
----------330011-----------------------------
INT 33 - Genius Mouse 9.06 - GET NUMBER OF BUTTONS
       AX = 0011h
Return: AX = FFFFh
       BX = number of buttons
SeeAlso: AX=0000h
----------330012-----------------------------
INT 33 - MS MOUSE - SET LARGE GRAPHICS CURSOR BLOCK
       AX = 0012h
       BH = cursor width in words
       CH = rows in cursor
       BL = horizontal hot spot (-16 to 16)
       CL = vertical hot spot (-16 to 16)
       ES:DX -> bit map of screen and cursor maps
Return: AX = FFFFh if successful
SeeAlso: AX=0009h,AX=002Ah,AX=0035h
----------330013-----------------------------
INT 33 - MS MOUSE - DEFINE DOUBLE-SPEED THRESHOLD
       AX = 0013h
       DX = threshold speed in mickeys/second, 0000h = default of 64/second
Note:   if speed exceeds threshold, the cursor's on-screen motion is doubled
SeeAlso: AX=000Fh,AX=001Bh,AX=002Ch
----------330014-----------------------------
INT 33 - MS MOUSE - EXCHANGE INTERRUPT SUBROUTINES
       AX = 0014h
       CX = call mask (see AX=000Ch)
       ES:DX -> FAR routine
Return: CX = call mask of previous interrupt routine
       ES:DX = FAR address of previous interrupt routine
SeeAlso: AX=000Ch,AX=0018h
----------330015-----------------------------
INT 33 - MS MOUSE - RETURN DRIVER STORAGE REQUIREMENTS
       AX = 0015h
Return: BX = size of buffer needed to store driver state
SeeAlso: AX=0016h,AX=0017h,AX=0042h
----------330016-----------------------------
INT 33 - MS MOUSE - SAVE DRIVER STATE
       AX = 0016h
       BX = size of buffer (see AX=0015h)
       ES:DX -> buffer for driver state
Note:   although not documented, many drivers appear to require BX on input
SeeAlso: AX=0015h,AX=0017h
----------330017-----------------------------
INT 33 - MS MOUSE - RESTORE DRIVER STATE
       AX = 0017h
       BX = size of buffer (see AX=0015h)
       ES:DX -> buffer containing saved state
Notes:  although not documented, many drivers appear to require BX on input
       some mouse drivers range-check the values in the saved state based on
         the current video mode; thus, the video mode should be restored
         before the mouse driver's state is restored
SeeAlso: AX=0015h,AX=0016h
----------330018-----------------------------
INT 33 - MS MOUSE - SET ALTERNATE MOUSE USER HANDLER
       AX = 0018h
       CX = call mask
            bit 0 call if mouse moves
            bit 1 call if left button pressed
            bit 2 call if left button released
            bit 3 call if right button pressed
            bit 4 call if right button released
            bit 5 call if shift button pressed during event
            bit 6 call if ctrl key pressed during event
            bit 7 call if alt key pressed during event
       ES:DX -> FAR routine
Return: AX = 0018h if successful
          = FFFFh on error
Notes:  when the subroutine is called, it is passed the following values:
         AX = condition mask (same bit assignments as call mask)
         BX = button state
         CX = cursor column
         DX = cursor row
         SI = horizontal mickey count
         DI = vertical mickey count
       up to three handlers can be defined by separate calls to this function
SeeAlso: AX=000Ch,AX=0014h,AX=0019h
----------330019-----------------------------
INT 33 - MS MOUSE - RETURN USER ALTERNATE INTERRUPT VECTOR
       AX = 0019h
       CX = call mask (see AX=0018h)
Return: BX:DX = user interrupt vector
       CX = call mask (0000h if not found)
Note:   attempts to find a user event handler (defined by function 18h)
         whose call mask matches CX
SeeAlso: AX=0018h
----------33001A-----------------------------
INT 33 - MS MOUSE - SET MOUSE SENSITIVITY
       AX = 001Ah
       BX = horizontal speed \
       CX = vertical speed   / (see AX=000Fh)
       DX = double speed threshold (see AX=0013h)
SeeAlso: AX=0013h,AX=001Bh,INT 62/AX=0082h
----------33001B-----------------------------
INT 33 - MS MOUSE - RETURN MOUSE SENSITIVITY
       AX = 001Bh
Return: BX = horizontal speed
       CX = vertical speed
       DX = double speed threshold
SeeAlso: AX=000Bh,AX=001Ah
----------33001C-----------------------------
INT 33 - MS MOUSE - SET INTERRUPT RATE
       AX = 001Ch
       BX = rate
           00h no interrupts allowed
           01h 30 per second
           02h 50 per second
           03h 100 per second
           04h 200 per second
Notes:  only available on InPort mouse
       values greater than 4 may cause unpredictable driver behavior
----------33001D-----------------------------
INT 33 - MS MOUSE - DEFINE DISPLAY PAGE NUMBER
       AX = 001Dh
       BX = display page number
Note:   the cursor will be displayed on the specified page
SeeAlso: AX=001Eh
----------33001E-----------------------------
INT 33 - MS MOUSE - RETURN DISPLAY PAGE NUMBER
       AX = 001Eh
Return: BX = display page number
SeeAlso: AX=001Dh
----------33001F-----------------------------
INT 33 - MS MOUSE - DISABLE MOUSE DRIVER
       AX = 001Fh
Return: AX = 001Fh unsuccessful
            FFFFh successful
       ES:BX = vector for INT 33h before mouse driver was first installed
Note:   restores vectors for Int 10h and Int 71h (8086) or Int 74h (286/386)
       if you restore Int 33h to ES:BX, driver will be completely disabled
SeeAlso: AX=0020h
----------330020-----------------------------
INT 33 - MS MOUSE - ENABLE MOUSE DRIVER
       AX = 0020h
Return: AX = 0020h unsuccessful (or driver not installed)
            FFFFh successful
Note:   restores vectors for Int 10h and Int 71h (8086) or Int 74h (286/386)
         which were removed by function 1Fh
SeeAlso: AX=001Fh
----------330021-----------------------------
INT 33 - MS MOUSE - SOFTWARE RESET
       AX = 0021h
Return: AX = FFFFh if mouse driver installed
               BX = number of buttons (FFFFh = two buttons)
            0021h if mouse driver not installed
Note:   identical to funtion 00h, but does not reset the mouse
SeeAlso: AX=0000h
----------330022-----------------------------
INT 33 - MS MOUSE - SET LANGUAGE FOR MESSAGES
       AX = 0022h
       BX = language
           00h English
           01h French
           02h Dutch
           03h German
           04h Swedish
           05h Finnish
           06h Spanish
           07h Portugese
           08h Italian
Note:   only available on international versions of the driver, US versions
         ignore this call
SeeAlso: AX=0023h
----------330023-----------------------------
INT 33 - MS MOUSE - GET LANGUAGE FOR MESSAGES
       AX = 0023h
Return: BX = language (see AX=0022h)
Note:   the US version of the driver always returns zero
SeeAlso: AX=0022h
----------330024-----------------------------
INT 33 - MS MOUSE v6.26+ - GET SOFTWARE VERSION, MOUSE TYPE, AND IRQ NUMBER
       AX = 0024h
Return: AX = FFFFh on error
       otherwise,
           BH = major version
           BL = minor version
           CH = type (1=bus, 2=serial, 3=InPort, 4=PS/2, 5=HP)
           CL = interrupt (0=PS/2, 2=IRQ2, 3=IRQ3,...,7=IRQ7)
SeeAlso: AX=004Dh,AX=006Dh
----------330025-----------------------------
INT 33 - MS MOUSE v6.26+ - GET GENERAL DRIVER INFORMATION
       AX = 0025h
Return: AX = general information
           bit 15: driver loaded as device driver rather than TSR
           bit 14: driver is newer integrated type
           bits 13,12: current cursor type
                       00 software text cursor
                       01 hardware text cursor
                       1X graphics cursor
           bits 11-8: interrupt rate (see AX=001Ch)
           bits 7-0:  count of currently-active Mouse Display Drivers (MDD),
                       the newer integrated driver type
       BX = cursor lock flag for OS/2 to prevent reentrancy problems
       CX = mouse code active flag (for OS/2)
       DX = mouse driver busy flag (for OS/2)
----------330026-----------------------------
INT 33 - MS MOUSE v6.26+ - GET MAXIMUM VIRTUAL COORDINATES
       AX = 0026h
Return: BX = mouse-disabled flag
       CX = maximum virtual X (for current video mode)
       DX = maximum virtual Y
SeeAlso: AX=0031h
----------330026-----------------------------
INT 33 - Genius Mouse 9.06 - ???
       AX = 0026h
Return: CX = 0204h if CX was 0105h on entry, else unchanged
----------330027-----------------------------
INT 33 - MS MOUSE v7.01+ - GET SCREEN/CURSOR MASKS AND MICKEY COUNTS
       AX = 0027h
Return: AX = screen-mask value (or hardware cursor scan-line start for v7.02+)
       BX = cursor-mask value (or hardware cursor scan-line stop for v7.02+)
       CX = horizontal mickeys moved since last call
       DX = vertical mickeys moved since last call
SeeAlso: AX=000Bh
----------330028-----------------------------
INT 33 - MS MOUSE v7.0+ - SET VIDEO MODE
       AX = 0028h
       CX = new video mode (call is NOP if 0000h)
       DH = Y font size (00h = default)
       DL = X font size (00h = default)
Return: CL = status (00h = successful)
Note:   DX is ignored unless the selected video mode supports font size control
SeeAlso: AX=0029h,INT 10/AH=00h
----------330029-----------------------------
INT 33 - MS MOUSE v7.0+ - ENUMERATE VIDEO MODES
       AX = 0029h
       CX = previous video mode
           0000h get first supported video mode
           other get next supported mode after mode CX
Return: CX = first/next video mode (0000h = no more video modes)
       BS:DX -> description of video mode or 0000h:0000h if none
Notes:  the enumerated video modes may be in any order and may repeat
       the description string (if available) is terminated by '$' followed by
         a NUL byte
SeeAlso: AX=0028h
----------33002A-----------------------------
INT 33 - MS MOUSE v7.02+ - GET CURSOR HOT SPOT
       AX = 002Ah
Return: AX = internal counter controlling cursor visibility
       BX = cursor hot spot column
       CX = cursor hot spot row
       DX = mouse type (00h none, 01h bus, 02h serial, 03h InPort, 04h IBM,
                        05h Hewlett-Packard)
Note:   the hot spot location is relative to the upper left corner of the
         cursor block and may range from -128 to +127 both horizontally and
         vertically
SeeAlso: AX=0009h,AX=0012h,AX=0035h
----------33002B-----------------------------
INT 33 - MS MOUSE v7.0+ - LOAD ACCELERATION PROFILES
       AX = 002Bh
       BX = active acceleration profile
               0001h-0004h or FFFFh to restore default curves
       ES:SI -> buffer containing acceleration profile data (see below)
Return: AX = success flag
SeeAlso: AX=002Ch,AX=002Dh,AX=0033h

Format of acceleration profile data:
Offset  Size    Description
00h    BYTE    length of acceleration profile 1
01h    BYTE    length of acceleration profile 2
02h    BYTE    length of acceleration profile 3
03h    BYTE    length of acceleration profile 4
04h 32 BYTEs   threshold speeds for acceleration profile 1
24h 32 BYTEs   threshold speeds for acceleration profile 2
44h 32 BYTEs   threshold speeds for acceleration profile 3
64h 32 BYTEs   threshold speeds for acceleration profile 4
84h 32 BYTEs   speedup factor for acceleration profile 1
               (10h = 1.0, 14h = 1.25, 20h = 2.0, etc)
A4h 32 BYTEs   speedup factor for acceleration profile 2
               (10h = 1.0, 14h = 1.25, 20h = 2.0, etc)
C4h 32 BYTEs   speedup factor for acceleration profile 3
               (10h = 1.0, 14h = 1.25, 20h = 2.0, etc)
E4h 32 BYTEs   speedup factor for acceleration profile 4
               (10h = 1.0, 14h = 1.25, 20h = 2.0, etc)
104h 16 BYTEs   name of acceleration profile 1 (blank-padded)
114h 16 BYTEs   name of acceleration profile 2 (blank-padded)
124h 16 BYTEs   name of acceleration profile 3 (blank-padded)
134h 16 BYTEs   name of acceleration profile 4 (blank-padded)
Note:   unused bytes in the threshold speed fields are filled with 7Fh and
         unused bytes in the speedup factor fields are filled with 10h
----------33002C-----------------------------
INT 33 - MS MOUSE v7.0+ - GET ACCELERATION PROFILES
       AX = 002Ch
Return: AX = status (0000h success)
       BX = currently-active acceleration profile
       ES:SI -> acceleration profile data (see AX=002Bh)
SeeAlso: AX=002Bh,AX=002Dh,AX=0033h
----------33002D-----------------------------
INT 33 - MS MOUSE v7.0+ - SELECT ACCELERATION PROFILE
       AX = 002Dh
       BX = acceleration level
               0001h-0004h to set profile, or FFFFh to get current profile
Return: AX = status
           0000h successful
               ES:SI -> 16-byte blank-padded name of acceleration profile
           FFFEh invalid acceleration curve number
               ES:SI destroyed
       BX = active acceleration curve number
SeeAlso: AX=0013h,AX=002Bh,AX=002Ch,AX=002Eh
----------33002E-----------------------------
INT 33 - MS MOUSE v8.10+ - SET ACCELERATION PROFILE NAMES
       AX = 002Eh
       BL = flag (if nonzero, fill ES:SI buffer with default names on return)
       ES:SI -> 64-byte buffer for profile names (16 bytes per name)
Return: AX = status (0000h success)
       ES:SI buffer filled with default names if BL nonzero on entry
Note:   not supported by Logitech driver v6.10
SeeAlso: AX=002Ch,AX=002Dh,AX=012Eh,AX=022Eh
----------33002F-----------------------------
INT 33 - MS MOUSE v7.02+ - MOUSE HARDWARE RESET
       AX = 002Fh
Return: AX = status
Note:   invoked by mouse driver v8.20 on being called with INT 2F/AX=530Bh
SeeAlso: INT 2F/AH=53h
----------330030-----------------------------
INT 33 - MS MOUSE v7.04+ - GET/SET BallPoint INFORMATION
       AX = 0030h
       CX = command
           0000h get status of BallPoint device
           other set rotation angle and masks
               BX = rotation angle (-32768 to 32767 degrees)
               CH = primary button mask
               CL = secondary button mask
Return: AX = button status (FFFFh if no BallPoint)
               bit 5: button 1
               bit 4: button 2
               bit 3: button 3
               bit 2: button 4
               other: zero
       BX = rotation angle (0-360 degrees)
       CH = primary button mask
       CL = secondary button mask
----------330031-----------------------------
INT 33 - MS MOUSE v7.05+ - GET CURRENT MINIMUM/MAXIMUM VIRTUAL COORDINATES
       AX = 0031h
Return: AX = virtual X minimum
       BX = virtual Y minimum
       CX = virtual X maximum
       DX = virtual Y maximum
Note:   the minimum and maximum values are those set by AX=0007h and AX=0008h;
         the default is minimum = 0 and maximum = absolute maximum
         (see AX=0026h)
SeeAlso: AX=0007h,AX=0008h,AX=0010h,AX=0026h
----------330032-----------------------------
INT 33 - MS MOUSE v7.05+ - GET ACTIVE ADVANCED FUNCTIONS
       AX = 0032h
Return: AX = active function flags (FFFFh for v8.10)
               bit 15: function 0025h supported
               bit 14: function 0026h supported
               ...
               bit 0: function 0034h supported
       BX = ??? (0000h) officially unused
       CX = ??? (E000h) officially unused
       DX = ??? (0000h) officially unused
----------330033-----------------------------
INT 33 - MS MOUSE v7.05+ - GET SWITCH SETTINGS AND ACCELERATION PROFILE DATA
       AX = 0033h
       CX = size of buffer
           0000h get required buffer size
               Return: AX = 0000h
                       CX = required size (0154h for Logitech v6.10, 0159h
                               for MS v8.10-8.20)
           other
               ES:DX -> buffer of CX bytes
               Return: AX = 0000h
                       CX = number of bytes returned
                       ES:DX buffer filled (see below)
SeeAlso: AX=002Bh

Format of data buffer:
Offset  Size    Description
00h    BYTE    mouse type
01h    BYTE    current language
02h    BYTE    horizontal sensitivity (00h-64h)
03h    BYTE    vertical sensitivity (00h-64h)
04h    BYTE    double-speed threshold (00h-64h)
05h    BYTE    ballistic curve (01h-04h)
06h    BYTE    interrupt rate (01h-04h)
07h    BYTE    cursor override mask
08h    BYTE    laptop adjustment
09h    BYTE    memory type (00h-02h)
0Ah    BYTE    SuperVGA support (00h,01h)
0Bh    BYTE    rotation angle
0Ch    BYTE    ???
0Dh    BYTE    primary button (01h-04h)
0Eh    BYTE    secondary button (01h-04h)
0Fh    BYTE    click lock enabled (00h,01h)
10h 324 BYTEs  acceleration profile data (see AX=002Bh)
154h  5 BYTEs   ??? (Microsoft driver, but not Logitech)
----------330034-----------------------------
INT 33 - MS MOUSE v8.0+ - GET INITIALIZATION FILE
       AX = 0034h
Return: AX = status (0000h successful)
       ES:DX -> ASCIZ initialization (.INI) file name
----------330035-----------------------------
INT 33 - MS MOUSE v8.10+ - LCD SCREEN LARGE POINTER SUPPORT
       AX = 0035h
       BX = function
           FFFFh get current settings
               Return: AX = 0000h
                       BH = style (see below)
                       BL = size (see below)
                       CH = threshold
                       CL = active flag (00h disabled, 01h enabled)
                       DX = delay
           other
               BH = style (00h normal, 01h reverse, 02h transparent)
               BL = size (00h small "1", 01h medium "1.5", 02h large "2")
               CH = threshold (00h-64h)
               CL = active flag (00h disable size change, 01h enable)
               DX = delay (0000h-0064h)
               Return: AX = 0000h
Note:   not supported by Logitech driver v6.10
SeeAlso: AX=0012h,AX=002Ah
----------330042-----------------------------
INT 33 - PCMOUSE - GET MSMOUSE STORAGE REQUIREMENTS
       AX = 0042h
Return: AX = FFFFh successful
               BX = buffer size in bytes for functions 50h and 52h
          = 0000h MSMOUSE not installed
          = 0042h functions 42h, 50h, and 52h not supported
Note:   this function is also supported by the Genius Mouse 9.06 driver
SeeAlso: AX=0015h,AX=0050h,AX=0052h
----------330043-----------------------------
INT 33 - Mouse Systems MOUSE DRIVER v7.01 - CONFIGURE MOUSE???
       AX = 0043h
       CX:BX -> ??? buffer (see below)
       DL = ???
Return: ???
Notes:  also calls routines for INT 33/AX=0053h and INT 33/AX=004Fh
       this function is also supported by the Genius Mouse 9.06 driver

Format of buffer:
Offset  Size    Description
00h    WORD    I/O port address
02h    BYTE    ???
03h    BYTE    interrupt number
04h    BYTE    interrupt mask for interrupt controller
05h  5 BYTEs   ???
----------330044CXCDEF-----------------------
INT 33 - Mouse Systems MOUSE DRIVER v7.01 - TOGGLE ???
       AX = 0044h
       CX = CDEFh
Return: AX = new state of ???
Note:   this function is also supported by the Genius Mouse 9.06 driver
SeeAlso: AX=0045h
----------330045CXCDEF-----------------------
INT 33 - Mouse Systems MOUSE DRIVER v7.01 - TOGGLE ???
       AX = 0045h
       CX = CDEFh
Return: AX = new state of ???
Note:   this function is also supported by the Genius Mouse 9.06 driver
SeeAlso: AX=0044h
----------330047-----------------------------
INT 33 - Mouse Systems MOUSE DRIVER v7.01 - SET BUTTON ASSIGNMENTS
       AX = 0047h
       ES:BX -> button assignments (3 bytes, combinations of "L", "M", "R")
Return: ???
Note:   also supported by Genius Mouse 9.06 driver
SeeAlso: AX=0067h
----------330048BXCDEF-----------------------
INT 33 - Mouse Systems MOUSE DRIVER v7.01 - GET ???
       AX = 0048h
       BX = CDEFh
Return: CX = ???
       BH = ???
       BL = ??? (if 50h, driver is using PS/2 pointing device BIOS interface)
Note:   also supported by Genius Mouse 9.06 driver
----------33004B-----------------------------
INT 33 - Z-NIX MOUSE DRIVER v7.04d - INSTALLATION CHECK
       AX = 004Bh
Return: ES:DI -> signature/description string if installed
Note:   the signature string in v7.04d is
         "Z-NIX;BUS,AUX,Serial 3-byte and 5-byte Mouse Driver;ZMOUSE;v7.04d"
----------33004CBXCDEF-----------------------
INT 33 - Mouse Systems MOUSE DRIVER v7.01 - SET ??? FLAG
       AX = 004Ch
       BX = CDEFh
Note:   also supported by Genius Mouse 9.06
SeeAlso: AX=006Ch
----------33004D-----------------------------
INT 33 - MS MOUSE - RETURN POINTER TO COPYRIGHT STRING
       AX = 004Dh
Return: ES:DI -> copyright message "*** This is Copyright 1983 Microsoft"
Notes:  also supported by Logitech, Kraft, Genius Mouse, and Mouse Systems
         mouse drivers
       in the Genius Mouse 9.06 driver, the ASCIZ signature "KYE" immediately
         follows the above copyright message (KYE Corp. manufactures the
         driver)
SeeAlso: AX=0024h,AX=006Dh
----------33004F-----------------------------
INT 33 - Mouse Systems MOUSE DRIVER v7.01 - ENABLE MOUSE
       AX = 004Fh
Return: nothing
Note:   also supported by Genius Mouse 9.06
SeeAlso: AX=0043h,AX=0053h
----------330050-----------------------------
INT 33 - PCMOUSE - SAVE MSMOUSE STATE
       AX = 0050h
       BX = buffer size (ignored by some driver versions)
       ES:DX -> buffer
Return: AX = FFFFh if successful
Notes:  the buffer must be large enough to hold the entire state, or following
         data will be overwritten by state data in versions which ignore BX;
         use INT 33/AX=0042h to get the required size
       this function is also supported by the Genius Mouse 9.06 driver
SeeAlso: AX=0042h,AX=0052h
----------330052-----------------------------
INT 33 - PCMOUSE - RESTORE MSMOUSE STATE
       AX = 0052h
       BX = buffer size (ignored by some driver versions)
       ES:DX -> buffer
Return: AX = FFFFh if successful
Note:   also supported by Genius Mouse 9.06 driver
SeeAlso: AX=0050h
----------330053-----------------------------
INT 33 - Mouse Systems MOUSE DRIVER v7.01 - DISABLE MOUSE
       AX = 0053h
Return: nothing
Note:   also supported by Genius Mouse 9.06
SeeAlso: AX=0043h,AX=004Fh
----------330054CXCDEF-----------------------
INT 33 - Mouse Systems MOUSE DRIVER v7.01 - SELECT ULTRARES ACCELERATION LEVEL
       AX = 0054h
       CX = CDEFh
       BX = ??? (NOP if <= 0000h)
Return: ???
Note:   this function is also supported by the Genius Mouse 9.06 driver
SeeAlso: AX=005Ah
----------330055-----------------------------
INT 33 - Kraft Mouse - GET ???
       AX = 0055h
Return: CX = ???
       DX = ???
       ES = ???
----------330058-----------------------------
INT 33 - Mouse Systems MOUSE DRIVER v7.01 - ???
       AX = 0058h
Return: AX = CS of driver
       CX:BX = original INT 33 vector
       DX = ???
Note:   this function is also supported by the Genius Mouse 9.06 driver
----------33005A-----------------------------
INT 33 - Mouse Systems MOUSE DRIVER v7.01 - SET ULTRARES ACCELERATIONS
       AX = 005Ah
       CX = number of WORDs to copy (max 0014h, but not range-checked)
       DX:SI -> buffer containing thresholds??? (CX words)
       DX:BX -> buffer containing acceleration values???
               (9*14h words, only first CX of each 14h used)
       ???
Return: CF clear
       ???
Note:   this function is also supported by Genius Mouse 9.06
SeeAlso: AX=0054h
----------330061BXCDEF-----------------------
INT 33 - Mouse Systems MOUSE DRIVER v7.01 - ???
       AX = 0061h
       BX = CDEFh
Return: CX = ???
Note:   also supported by Genius Mouse 9.06
----------330067-----------------------------
INT 33 - Mouse Systems MOUSE DRIVER v7.01 - GET MOUSE BUTTONS???
       AX = 0067h
Return: BL = number of buttons???
Note:   also supported by Genius Mouse 9.06
SeeAlso: AX=0047h
----------33006CBXCDEF-----------------------
INT 33 - Mouse Systems MOUSE DRIVER v7.01 - CLEAR ??? FLAG
       AX = 006Ch
       BX = CDEFh
Note:   also supported by Genius Mouse 9.06
SeeAlso: AX=004Ch
----------33006D-----------------------------
INT 33 - MS MOUSE - GET VERSION STRING
       AX = 006Dh
Return: ES:DI -> Microsoft version number of resident driver (see below)
Notes:  also supported by Logitech, Mouse Systems, Kraft, and Genius mouse
         drivers
       the Mouse Systems 7.01 and Genius Mouse 9.06 drivers report their
         Microsoft version as 7.00 even though they do not support any of the
         functions from 0025h through 002Dh supported by the MS 7.00 driver
         (the Genius Mouse driver supports function 0026h, but it differs
         from the Microsoft function)
SeeAlso: AX=0024h,AX=004Dh,AX=266Ch

Format of Microsoft version number:
Offset  Size    Description
00h    BYTE    major version
01h    BYTE    minor version (BCD)
----------330070BXABCD-----------------------
INT 33 - Mouse Systems MOUSE DRIVER - POPUP.COM - INSTALLATION CHECK
       AX = 0070h
       BX = ABCDh
Return: AX = ABCDh if installed
           BX:CX -> data structure (see below)
Notes:  this function is also supported by the Genius Mouse 9.06 driver
       the v7.01 POPUP.COM and menu drivers also check for the signature
         CDh ABh BAh DCh at offset -2Ch from the interrupt handler
       if POPUP is not loaded, the returned data structure contains the proper
         signature at offset 00h, but not at offset 08h

Format of data structure:
Offset  Size    Description
00h    WORD    signature ABCDh
02h    DWORD   pointer to info structure???
06h  2 BYTEs   ???
08h    WORD    signature ABCDh

Format of info structure:
Offset  Size    Description
00h    WORD    driver version
02h  8 BYTEs   ???
0Ah    WORD    segment of ???
       ???
----------330072BXABCD-----------------------
INT 33 - Mouse Systems MOUSE DRIVER v7.01 - ???
       AX = 0072h
       BX = ABCDh
Return: ???
Note:   this function is also supported by the Genius Mouse 9.06 driver
----------330073BXCDEF-----------------------
INT 33 - Mouse Systems MOUSE DRIVER v7.01 - GET BUTTON ASSIGNMENTS
       AX = 0073h
       BX = CDEFh
       ES:DX -> 3-byte buffer for button assignments
Return: CX = number of buttons???
       ES:DX buffer filled (default is "LMR")
Note:   also supported by Genius Mouse 9.06
SeeAlso: AX=0067h
----------33012E-----------------------------
INT 33 - MS MOUSE v8.10+ - ???
       AX = 012Eh
       BL = ???
Return: AX = 0000h
Note:   not supported by Logitech driver v6.10
SeeAlso: AX=002Eh,AX=022Eh
----------33022E-----------------------------
INT 33 - MS MOUSE v8.10+ - ???
       AX = 022Eh
       BL = ???
Return: AX = 0000h
Note:   not supported by Logitech driver v6.10
SeeAlso: AX=002Eh,AX=012Eh
----------33136C-----------------------------
INT 33 - LOGITECH MOUSE v6.10+ - ???
       AX = 136Ch
       BX = ???
Return: AX = ???
       BX = ???
----------33146C-----------------------------
INT 33 - LOGITECH MOUSE v6.10+ - GET/SET ???
       AX = 146Ch
       BL = function
           00h set ???
               BH = new value (zero/nonzero to clear/set)
           else get ???
               Return: ???
----------33156C-----------------------------
INT 33 - LOGITECH MOUSE v6.10+ - GET SIGNATURE AND VERSION STRINGS
       AX = 156Ch
Return: ES:DI -> signature "LOGITECH MOUSE DRIVER"
       ES:SI -> version string, terminated with CRLF
----------33166C-----------------------------
INT 33 - LOGITECH MOUSE v6.10+ - ???
       AX = 166Ch
       BL = ???
           00h ???
           01h ???
           other ???
               BH = new value of ???
               Return: AX = FFFFh
----------33176C-----------------------------
INT 33 - LOGITECH MOUSE v6.10+ - ???
       AX = 176Ch
       ???
Return: ???
----------33186C-----------------------------
INT 33 - LOGITECH MOUSE v6.10+ - ???
       AX = 186Ch
       ???
Return: ???
----------33196C-----------------------------
INT 33 - LOGITECH MOUSE v6.10+ - ???
       AX = 196Ch
       ???
Return: ???
----------331A6C-----------------------------
INT 33 - LOGITECH MOUSE v6.10+ - GET ???
       AX = 1A6Ch
Return: AX = FFFFh
       BX = ???
       CX = ???
SeeAlso: AX=1B6Ch
----------331B6C-----------------------------
INT 33 - LOGITECH MOUSE v6.10+ - SET ???
       AX = 1B6Ch
       BX = new value for ??? (0000h-0003h)
Return: AX = FFFFh
SeeAlso: AX=1A6Ch
----------331C6C-----------------------------
INT 33 - LOGITECH MOUSE v6.10+ - ???
       AX = 1C6Ch
       BX = ???
               <42h ???
               =42h ???
               >42h ???
                       ES:DI -> ???
                       Return: AX = ???
----------331D6C-----------------------------
INT 33 - LOGITECH MOUSE - GET COMPASS PARAMETER
       AX = 1D6Ch
Return: BX = direction (0=north, 1=south, 2=east, 3=west)
SeeAlso: AX=1E6Ch
----------331E6C-----------------------------
INT 33 - LOGITECH MOUSE - SET COMPASS PARAMETER
       AX = 1E6Ch
       BX = direction (0=north, 1=south, 2=east, 3=west)
SeeAlso: AX=1D6Ch
----------331F6C-----------------------------
INT 33 - LOGITECH MOUSE - GET BALLISTICS INFORMATION
       AX = 1F6Ch
Return: BX = 0=off, 1=on
       CX = 1=low, 2=high
SeeAlso: AX=002Ch,AX=236Ch
----------33206C-----------------------------
INT 33 - LOGITECH MOUSE - SET LEFT OR RIGHT PARAMETER
       AX = 206Ch
       BX = parameter (00h = right, FFh = left)
SeeAlso: AX=216Ch
----------33216C-----------------------------
INT 33 - LOGITECH MOUSE - GET LEFT OR RIGHT PARAMETER
       AX = 216Ch
Return: BX = parameter (00h = right, FFh = left)
SeeAlso: AX=206Ch
----------33226C-----------------------------
INT 33 - LOGITECH MOUSE - REMOVE DRIVER FROM MEMORY
       AX = 226Ch
Note:   this only frees memory; does not restore hooked interrupts
----------33236C-----------------------------
INT 33 - LOGITECH MOUSE - SET BALLISTICS INFORMATION
       AX = 236Ch
       BX = 0=off, 1=on
       CX = 1=low, 2=high
SeeAlso: AX=002Ch,AX=1F6Ch
----------33246C-----------------------------
INT 33 - LOGITECH MOUSE - GET PARAMETERS AND RESET SERIAL MOUSE
       AX = 246Ch
       ES:DX -> parameter table buffer (see below)
Return: AX = FFFFh if driver installed for serial mouse
SeeAlso: AX=0000h,AX=256Ch

Format of parameter table:
Offset  Size    Description
00h    WORD    baud rate divided by 100  (serial mouse only)
02h    WORD    emulation                 (serial mouse only)
04h    WORD    report rate               (serial mouse only)
06h    WORD    firmware revision         (serial mouse only)
08h    WORD    0                         (serial mouse only)
0Ah    WORD    port                      (serial mouse only)
0Ch    WORD    physical buttons
0Eh    WORD    logical buttons
----------33256CBX00h -----------------------
INT 33 - LOGITECH MOUSE - SET PARAMETERS
       AX = 256Ch
       BX = 00h set baud rate (serial mouse only)
               CX = rate (0=1200, 1=2400, 2=4800, 3=9600)
          = 01h set emulation (serial mouse only)
               CX = emulation
                   0 = 5 byte packed binary
                   1 = 3 byte packed binary
                   2 = hexadecimal
                   3 = relative bit pad
                   4 = not supported
                   5 = MM Series
                   6 = not supported
                   7 = Microsoft
          = 02h set report rate (serial mouse only)
               CX = rate (0=10, 1=20, 2=35, 3=50, 4=70, 5=100, 6=150)
          = 03h set port (serial mouse only)
               CX = port (1, 2)
          = 04h set mouse logical buttons
               CX = buttons (2, 3)
Return: AX = FFFFh if driver installed for serial mouse
SeeAlso: AX=246Ch,AX=276Ch
----------33266C-----------------------------
INT 33 - LOGITECH MOUSE - GET VERSION???
       AX = 266Ch
Return: BX = 'SS'
       CH = '4'  major version number
       CL = '1'  minor version number
SeeAlso: AX=006Dh
----------33276C-----------------------------
INT 33 - LOGITECH MOUSE - ??? Tries MMSeries, Baud 2400
       AX = 276Ch
SeeAlso: AX=256Ch
----------333000-----------------------------
INT 33 - Smooth Mouse Driver, PrecisePoint - INSTALLATION CHECK
       AX = 3000h
Return: AX = FFFFh if installed
           BX = version number (BH = major, BL = minor)
Program: SMD is a programmer's library by Andy Hakim which provides a
         graphics-style mouse cursor in text mode.  PrecisePoint is an
         SMD-based TSR which replaces the block mouse cursor in text
         applications.
SeeAlso: AX=0000h,AX=3001h,AX=3003h
----------333001-----------------------------
INT 33 - Smooth Mouse Driver, PrecisePoint - ENABLE SMOOTH MOUSE
       AX = 3001h
Return: AX = status (0000h = disabled, 0001h = enabled)
Note:   SMD remains disabled if running under Desqview or in graphics mode
SeeAlso: AX=0001h,AX=0002h,AX=3002h
----------333002-----------------------------
INT 33 - Smooth Mouse Driver, PrecisePoint - DISABLE SMOOTH MOUSE
       AX = 3002h
Return: AX = status (0000h = disabled, 0001h = enabled)
SeeAlso: AX=0001h,AX=0002h,AX=3000h,AX=3001h
----------333003-----------------------------
INT 33 - Smooth Mouse Driver, PrecisePoint - GET INFORMATION
       AX = 3003h
       BL = data structure selector
           00h Primary Bitmap (used for 25 line mode)
           01h Secondary Bitmap (used for 43/50 line modes)
           02h Sacrifice Character Map
           03h Program Information
Return: ES:DI -> selected data structure
SeeAlso: AX=3000h

Format of Primary/Secondary Bitmap [SMD_BITMAP_STRUCT]
Offset  Size    Description
00h    BYTE    vertical size of bitmap (00h - 10h)
01h    BYTE    horizontal size of bitmap (00h - 10h)
02h    BYTE    vertical hotspot position (00h - 10h)
03h    BYTE    horizontal hotspot position (00h - 10h)
04h 16 WORDs   cursor bitmap data
14h 16 WORDs   screen bitmap data

Format of Sacrifice Character Map [SMD_SMAP_STRUCT]
Offset  Size    Description
00h    BYTE    bytes are character values (00h-FFh) used in place of the
01h    BYTE    actual character for the corresponding position on the screen
02h    BYTE         +--------------+     occupied by part or all of the mouse
03h    BYTE         | 0h | 1h | 2h |     cursor
04h    BYTE         |----+----+----|
05h    BYTE         | 3h | 4h | 5h |
06h    BYTE         |----+----+----|
07h    BYTE         | 6h | 7h | 8h |
08h    BYTE         +--------------+

Format of Program Information [SMD_INFO_STRUCT]
Offset  Size    Description
00h    WORD    segment of old interrupt 33h handler
02h    WORD    offset of old interrupt 33h handler
04h    WORD    PSP of SMD
06h    BYTE    ENABLE/DISABLE manual setting status
07h    BYTE    ENABLE/DISABLE internal usage status
----------33---------------------------------
INT 33 - Smooth Mouse Driver, PrecisePoint - RESERVED FUTURE EXPANSION
       AX = 3004
SeeAlso: AX=3000h
----------33---------------------------------
INT 33 - Smooth Mouse Driver, PrecisePoint - RESERVED FUTURE EXPANSION
       AX = 3005
SeeAlso: AX=3000h
----------334F00-----------------------------
INT 33 - LOGITECH MOUSE v6.10+ - GET ???
       AX = 4F00h
Return: AX = 004Fh if supported
       BX = ???
       ES:DI -> ???
SeeAlso: AX=4F01h
----------334F01-----------------------------
INT 33 - LOGITECH MOUSE v6.10+ - ???
       AX = 4F01h
       ES = ???
Return: AX = 004Fh if supported
       ES:DI -> ???
SeeAlso: AX=4F00h
----------34---------------------------------
INT 34 - FLOATING POINT EMULATION - OPCODE D8h
Note:   the floating-point emulators in Borland and Microsoft languages and
         Lahey FORTRAN use this interrupt
SeeAlso: INT 35,INT 3E
----------35---------------------------------
INT 35 - FLOATING POINT EMULATION - OPCODE D9h
Note:   the floating-point emulators in Borland and Microsoft languages and
         Lahey FORTRAN use this interrupt
SeeAlso: INT 34,INT 36
----------36---------------------------------
INT 36 - FLOATING POINT EMULATION - OPCODE DAh
Note:   the floating-point emulators in Borland and Microsoft languages and
         Lahey FORTRAN use this interrupt
SeeAlso: INT 35,INT 37
----------37---------------------------------
INT 37 - FLOATING POINT EMULATION - OPCODE DBh
Note:   the floating-point emulators in Borland and Microsoft languages and
         Lahey FORTRAN use this interrupt
SeeAlso: INT 36,INT 38
----------38---------------------------------
INT 38 - FLOATING POINT EMULATION - OPCODE DCh
Note:   the floating-point emulators in Borland and Microsoft languages and
         Lahey FORTRAN use this interrupt
SeeAlso: INT 37,INT 39
----------3802-------------------------------
INT 38 - PC-MOS/386 v3.0 - GET MOS INTERNAL DATA POINTER
       AH = 02h
Return: AX = 0000h
       ES:BX -> ??? internal data structure
Program: PC-MOS/386 is a multitasking/multiuser MSDOS-compatible operating
         system by Software Links, Inc.
SeeAlso: AH=04h,AH=10h,INT 21/AX=3000h
----------3804-------------------------------
INT 38 - PC-MOS/386 v3.0 - GET TASK CONTROL BLOCK
       AH = 04h
Return: ES = segment of Task Control Block (TCB) (see below)
SeeAlso: AH=02h

Format of Task Control Block:
Offset  Size    Description
00h  2 BYTEs   signature "HT"
02h 23 BYTEs   ???
19h    BYTE    task time slice
1Ah  7 BYTEs   ???
21h 11 BYTEs   name of currently executing task
2Ch 79 BYTEs   ???
7Bh  4 BYTEs   user name
7Fh    BYTE    current output class
80h  7 BYTEs   protection access rights, 2 bits per class (writeable!)
       ???
----------380703-----------------------------
INT 38 - PC-MOS/386 v3.0 - WAIT FOR KEYPRESS OR TIMEOUT
       AX = 0703h
       CX = timeout (in seconds???)
Return: AH bit 0 set if key pressed, clear otherwise
SeeAlso: INT 16/AH=00h
----------3810-------------------------------
INT 38 - PC-MOS/386 v3.0 - ENTER NATIVE 386 EXECUTION MODE
       AH = 10h
       CX = NCA (???) length in bytes (at least 1024???)
       DX = NCA segment
Return: in protected mode
       all segment registers converted to appropriate selectors
Note:   MSDOS calls are available in protected mode
SeeAlso: AH=11h,AH=12h,INT 2F/AX=1687h,INT 67/AX=DE0Ch
----------3811-------------------------------
INT 38 - PC-MOS/386 v3.0 - ALLOCATE NATIVE MODE MEMORY BLOCK
       AH = 11h
       EBX = block length
Return: ES = selector for allocated block
SeeAlso: AH=10h,AH=12h
----------3812-------------------------------
INT 38 - PC-MOS/386 v3.0 - FREE NATIVE MODE MEMORY BLOCK
       AH = 12h
       ES = selector for block to free
SeeAlso: AH=10h,AH=11h
----------39---------------------------------
INT 39 - FLOATING POINT EMULATION - OPCODE DDh
Note:   the floating-point emulators in Borland and Microsoft languages and
         Lahey FORTRAN use this interrupt
SeeAlso: INT 38,INT 3A
----------3A---------------------------------
INT 3A - FLOATING POINT EMULATION - OPCODE DEh
Note:   the floating-point emulators in Borland and Microsoft languages and
         Lahey FORTRAN use this interrupt
SeeAlso: INT 39,INT 3B
----------3B---------------------------------
INT 3B - FLOATING POINT EMULATION - OPCODE DFh
Note:   the floating-point emulators in Borland and Microsoft languages and
         Lahey FORTRAN use this interrupt
SeeAlso: INT 3A,INT 3C
----------3C---------------------------------
INT 3C - FLOATING POINT EMULATION - INSTRUCTIONS WITH SEGMENT OVERRIDE
Notes:  the floating-point emulators in Borland and Microsoft languages and
         Lahey FORTRAN use this interrupt
       the generated code is  CD 3C xy mm ....
         where xy is a modified ESC instruction and mm is the modR/M byte.
         The xy byte appears to be encoded as
               s s 0 1 1 x x x   or    s s 0 0 0 x x x
         where "ss" specifies the segment override:
               00 -> DS:
               01 -> SS:
               10 -> CS:
               11 -> ES:
SeeAlso: INT 3B,INT 3D
----------3D---------------------------------
INT 3D - FLOATING POINT EMULATION - STANDALONE FWAIT
Notes:  the floating-point emulators in Borland and Microsoft languages use
         this interrupt
       this vector is modified but not restored by Direct Access v4.0, and
         may be left dangling by other programs written with the same version
         of compiled BASIC
SeeAlso: INT 3C,INT 3E
----------3E---------------------------------
INT 3E - FLOATING POINT EMULATION - Borland LANGUAGES "SHORTCUT" CALL
Notes:  the two bytes following the INT 3E instruction are the subcode and
         a NOP (90h), except for subcodes DCh and DEh, where the second byte
         is a register count (01h-08h)
       this vector is modified but not restored by Direct Access v4.0, and
         may be left dangling by other programs written with the same version
         of compiled BASIC
SeeAlso: INT 3D

Subcode         Function
DCh    load 8086 stack with 8087 registers; overwrites the 10*N bytes at the
         top of the stack prior to the INT 3E with the 8087 register contents
DEh    load 8087 registers from top of 8086 stack; ST0 is furthest from top
         of 8086 stack
E0h    round TOS and R1 to single precision, compare, pop twice
         returns AX=8087 status word, FLAGS=8087 condition bits
E2h    round TOS and R1 to double precision, compare, pop twice
         returns AX=8087 status word, FLAGS=8087 condition bits
       Note: buggy in TPas5.5, because it sets the 8087 precision control
         field to the undocumented value 01h; this results in actually
         rounding to single precision
E4h    compare TOS/R1 with two POP's
         returns FLAGS=8087 condition bits
E6h    compare TOS/R1 with POP
         returns FLAGS=8087 condition bits
E8h    FTST (check TOS value)
         returns FLAGS=8087 condition bits
EAh    FXAM (check TOS value)
         returns AX=8087 status word
ECh    sine(ST0)
EEh    cosine(ST0)
F0h    tangent(ST0)
F2h    arctangent(ST0)
F4h    ST0 = ln(ST0)
F6h    ST0 = log2(ST0)
F8h    ST0 = log10(ST0)
FAh    ST0 = e**ST0
FCh    ST0 = 2**ST0
FEh    ST0 = 10**ST0
----------3F---------------------------------
INT 3F - Overlay manager interrupt (Microsoft LINK.EXE, Borland TLINK VROOMM)
Notes:  INT 3F is the default, and may be overridden while linking
       this vector is modified but not restored by Direct Access v4.0, and
         may be left dangling by other programs written with the same version
         of compiled BASIC
SeeAlso: INT FE"OVERLAY"
----------3F---------------------------------
INT 3F - Microsoft Dynamic Link Library manager
SeeAlso: INT 21/AH=4Bh
----------40---------------------------------
INT 40 - DISKETTE - ROM BIOS DISKETTE HANDLER RELOCATED BY HARD DISK BIOS
SeeAlso: INT 13,INT 63
----------40---------------------------------
INT 40 - Z100 - Master 8259 - Parity error or S100 error
SeeAlso: INT 41"Z100",INT FF"Z100"
----------40---------------------------------
INT 40 - Acorn BBC Master 512 - "OSFIND" - OPEN FILE
       AL = operation
           00h close file
           40h open file for reading
           80h open file for writing
           C0h open file for random access
       DS:BX -> CR-terminated filename
Return: AL = file handle (00h if file closed or could not be opened)
Note:   the Acorn BBC Master 512 is an 80186-based add-on board for the
         6502-based Master 128 which uses the original CPU as an I/O processor
SeeAlso: INT 41"Acorn",INT 42"Acorn",INT 43"Acorn",INT 44"Acorn",INT 4C"Acorn"
----------41---------------------------------
INT 41 - SYSTEM DATA - HARD DISK 0 PARAMETER TABLE
Note:   the default parameter table array is located at F000h:E401h in 100%
         compatible BIOSes; the pointer may be overridden by the hard disk
         controller's BIOS to support drive formats unknown to the ROM BIOS
SeeAlso: INT 13/AH=09h,INT 1E,INT 46

Format of fixed disk parameters:
Offset  Size    Description
00h    WORD    number of cylinders
02h    BYTE    number of heads
03h    WORD    starting reduced write current cylinder (XT only, 0 for others)
05h    WORD    starting write precompensation cylinder number
07h    BYTE    maximum ECC burst length (XT only)
08h    BYTE    control byte
                  bits 0-2: drive option (XT only, 0 for others)
                  bit 3:    set if more than 8 heads (AT and later only)
                  bit 4:    always 0
                  bit 5:    set if manufacturer's defect map on max cylinder+1
                            (AT and later only)
                  bit 6:    disable ECC retries
                  bit 7:    disable access retries
09h    BYTE    standard timeout (XT only, 0 for others)
0Ah    BYTE    formatting timeout (XT only, 0 for others)
0Bh    BYTE    timeout for checking drive (XT only, 0 for others)
0Ch    WORD    cylinder number of landing zone (AT and later only)
0Eh    BYTE    number of sectors per track (AT and later only)
0Fh    BYTE    reserved
----------41---------------------------------
INT 41 - Z100 - Master 8259 - Processor Swap
SeeAlso: INT 40"Z100",INT 42"Z100"
----------41---------------------------------
INT 41 - Acorn BBC Master 512 - "OSGBPB" - MULTI-BYTE GET/PUT
       AL = function
           01h put bytes sequentially
           02h put bytes, ignoring sequential pointer
           03h get bytes sequentially
           04h get bytes, ignoring sequential pointer
           05h get media title and boot option
           06h get current device and directory
           07h get current library and device
           08h search directory
       DS:BX -> control block (see below)
Return: CF clear if successful
       CF set on error
       AL = 00h if operation attempted
       AL unchanged if unsupported function
SeeAlso: INT 40"Acorn",INT 42"Acorn",INT 43"Acorn"

Format of control block:
Offset  Size    Description
00h    BYTE    file handle
01h    DWORD   pointer to data in either I/O processor or Tube processor
05h    DWORD   number of bytes to be transferred
09h    DWORD   transfer address
----------4112-------------------------------
INT 41 P - MS Windows debugging kernel - "OutputDebugString"
       AH = 12h
       ???
Return: ???
SeeAlso: AH=50h
----------4150-------------------------------
INT 41 P - MS Windows debugging kernel - "DefineDebugSegment"
       AH = 50h
       ???
Return: ???
SeeAlso: AH=12h
----------42---------------------------------
INT 42 - VIDEO - RELOCATED DEFAULT INT 10 VIDEO SERVICES (EGA,VGA)
SeeAlso: INT 10
Note:   not used by PS/2 built-in VGA or XGA
----------42---------------------------------
INT 42 - Z100 - Master 8259 - Timer
SeeAlso: INT 41"Z100",INT 43"Z100"
----------42---------------------------------
INT 42 - Acorn BBS Master 512 - "OSBPUT" - WRITE SINGLE BYTE TO FILE
       AL = byte to be written
       BH = file handle
Return: flags destroyed
SeeAlso: INT 40"Acorn",INT 41"Acorn",INT 43"Acorn",INT 47"Acorn",INT 49"Acorn"
----------43---------------------------------
INT 43 - VIDEO DATA - CHARACTER TABLE (EGA,MCGA,VGA)
  points at graphics data for characters 00h-7Fh of the current font
SeeAlso: INT 1F,INT 44"VIDEO"
----------43---------------------------------
INT 43 - Z100 - Master 8259 - Slave 8259 input
Note:   slave runs in special fully nested mode
SeeAlso: INT 42"Z100",INT 44"Z100"
----------43---------------------------------
INT 43 - Acorn BBC Master 512 - "OSBGET" - READ SINGLE BYTE FROM FILE
       BH = file handle
Return: CF clear if successful
           AL = byte read from file
       CF set on error
SeeAlso: INT 40"Acorn",INT 41"Acorn",INT 42"Acorn",INT 46"Acorn"
----------44---------------------------------
INT 44 - VIDEO DATA - ROM BIOS CHARACTER FONT, CHARACTERS 00h-7Fh (PCjr)
  points at graphics data for current character font
SeeAlso: INT 1F,INT 43"VIDEO"
----------44---------------------------------
INT 44 - Novell NetWare - HIGH-LEVEL LANGUAGE API
----------44---------------------------------
INT 44 - IBM 3270-PC High Level Language API
       DS:SI -> parameter control block
----------44---------------------------------
INT 44 - Z100 - Master 8259 - Serial A
SeeAlso: INT 43"Z100",INT 45"Z100"
----------44---------------------------------
INT 44 - Acorn BBC Master 512 - "OSARGS" - GET/SET FILE PARAMS FOR OPEN FILE
       AH = 00h
           AL = function
               00h get current filing system
                       Return: AL = filing system (see below)
               01h get address of commandline tail
                       Return: BX buffer filled with address of command tail
                                       in I/O processor address space
                                       (use INT 4A/AL=05h to retrieve)
               FFh flush all files onto secondary storage
       AH = file handle
           AL = function
               00h get sequential pointer for file
               01h set sequential pointer for file
               02h get length of file
       BX -> 4-byte data buffer
Return: BX buffer updated if appropriate
Note:   the commandline tail is terminated with a carriage return (0Dh)
SeeAlso: INT 40"Acorn",INT 41"Acorn",INT 45"Acorn",INT 4A"Acorn"

Values for filing system:
00h none
01h 1200 bps cassette
02h 300 bps cassette
03h ROM FS
04h DFS
05h ANFS/NFS
06h TFS
08h ADFS
----------45---------------------------------
INT 45 - Z100 - Master 8259 - Serial B
SeeAlso: INT 44"Z100",INT 46"Z100"
---------------------------------------------
INT 45 - Acorn BBC Master 512 - "OSFILE" - READ/WRITE FILE OR DIRECTORY INFO
       AL = function
           00h save block of memory as file
           01h update directory entry for existing file
           02h set load address for existing file
           03h set execution address for existing file
           04h set attributes for existing file
           05h read directory
           06h delete file
           FFh load file
       DS:BX -> control block (see below)
Return: FLAGS destroyed
       AL = file type
           00h not found
           01h file found
           02h directory found
           FFh protected file
SeeAlso: INT 40"Acorn",INT 41"Acorn",INT 44"Acorn",INT 46"Acorn"

Format of control block:
Offset  Size    Description
00h    WORD    address of CR-terminated filename
02h    DWORD   load address of file
06h    DWORD   execution address of file
0Ah    DWORD   start address of data to save
0Eh    DWORD   end address of data to save, or file attributes
               file attributes in low byte:
                   bit 0: no owner read access
                   bit 1: no owner write access
                   bit 2: not executable by owner
                   bit 3: not deletable by owner
                   bit 4: no public read access
                   bit 5: no public write access
                   bit 6: not executable with public access
                   bit 7: not deletable with public access
               other three bytes are filing-system specific file attributes
----------46---------------------------------
INT 46 - SYSTEM DATA - HARD DISK 1 DRIVE PARAMETER TABLE
SeeAlso: INT 13/AH=09h,INT 41
----------46---------------------------------
INT 46 - Z100 - Master 8259 - Keyboard, Retrace, and Light Pen
SeeAlso: INT 45"Z100",INT 47"Z100"
----------46---------------------------------
INT 46 - Acorn BBC Master 512 - "OSRDCH" - GET CHARACTER FROM CUR INPUT STREAM
Return: CF clear if successful
           AL = character read
       CF set on error
           AL = error code
SeeAlso: INT 40"Acorn",INT 43"Acorn",INT 47"Acorn",INT 49"Acorn"
----------47---------------------------------
INT 47 - Z100 - Master 8259 - Printer
SeeAlso: INT 46"Z100",INT 48"Z100"
----------47---------------------------------
INT 47 - Acorn BBC Master 512 - "OSWRCH" - WRITE CHARACTER TO CUR OUTPUT STREAM
       AL = character to be written
Return: FLAGS destroyed
SeeAlso: INT 40"Acorn",INT 46"Acorn",INT 49"Acorn"
----------478000-----------------------------
INT 47 - SQL Base - DATABASE ENGINE API
       AX = 8000h
       DS:BX -> parameter block, first word is function number
Note:   SQL Base is a network-oriented database engine by Gupta Technologies

Values for function number:
01h    "SQLFINI" initalialize application's use of the database
02h    "SQLFDON" application is done using the database
03h    "SQLFCON" connect to a cursor/database
04h    "SQLFDIS" disconnect from a cursor/database
05h    "SQLFCOM" compile a SQL command
06h    "SQLFEXE" execute a SQL command
07h    "SQLFCEX" compile and execute a SQL command
08h    "SQLFCMT" commit a transaction to the database
09h    "SQLFDES" describe the items of a SELECT statement
0Ah    "SQLFGFI" get fetch information
0Bh    "SQLFFBK" fetch previous result row from SELECT statement
0Ch    "SQLFFET" fetch next result row from SELECT statement
0Dh    "SQLFEFB" enable fetch backwards
0Eh    "SQLFPRS" position in result set
0Fh    "SQLFURS" undo result set
10h    "SQLFNBV" get number of bind variables
11h    "SQLFBND" bind data variables
12h    "SQLFBNN" bind numerics
13h    "SQLFBLN" bind long number
14h    "SQLFBLD" bind long data variables
15h    "SQLFSRS" start restriction set processing
16h    "SQLFRRS" restart restriction set processing
17h    "SQLFCRS" close restriction set
18h    "SQLFDRS" drop restriction set
19h    "SQLFARF" apply Roll Forward journal
1Ah    "SQLFERF" end Roll Forward journal
1Bh    "SQLFSRF" start Roll Forward journal
1Ch    "SQLFSTO" store a compiled SQL command
1Dh    "SQLFRET" retrieve a compiled SQL command
1Eh    "SQLFDST" drop a stored command
1Fh    "SQLFCTY" get command type
20h    "SQLFEPO" get error position
21h    "SQLFGNR" get number of rows
22h    "SQLFNSI" get number of select items
23h    "SQLFRBF" get Roll Back flag
24h    "SQLFRCD" get return code
25h    "SQLFROW" get number of ROWs
26h    "SQLFSCN" set cursor name
27h    "SQLFSIL" set isolation level
28h    "SQLFSLP" set log parameters
29h    "SQLFSSB" set select buffer
2Ah    "SQLFSSS" set sort space
2Bh    "SQLFRLO" read long
2Ch    "SQLFWLO" write long
2Dh    "SQLFLSK" long seek
2Eh    "SQLFGLS" get long size
2Fh    "SQLFELO" end long operation
30h    "SQLFRBK" roll back a transaction from the database
31h    "SQLFERR" error message
32h    "SQLFCPY" copy
33h    "SQLFR01" reserved
34h    "SQLFSYS" system
35h    "SQLFSTA" statistics
36h    "SQLFR02" reserved
37h    "SQLFXAD" extra add
38h    "SQLFXCN" extra character to number
39h    "SQLFXDA" extra date add
3Ah    "SQLFXDP" extra date picture
3Bh    "SQLFXDV" extra divide
3Ch    "SQLFXML" extra multiply
3Dh    "SQLFXNP" extra number picture
3Eh    "SQLFXPD" extra picture date
3Fh    "SQLFXSB" extra subtract
40h    "SQLFINS" install database
41h    "SQLFDIN" deinstall database
42h    "SQLFDIR" directory of databases
43h    "SQLFTIO" timeout
44h    "SQLFFQN" get fully qualified column name
45h    "SQLFEXP" explain execution plan
46h    "SQLFFER" get full error
47h    "SQLFBKP" begin online backup
48h    "SQLFRDC" read backup data chunk
49h    "SQLFEBK" end backup
4Ah    "SQLFRES" begin restore from backup
4Bh    "SQLFWDC" write backup data chunk for restore
4Ch    "SQLFRRD" recover restored database to consistent state
4Dh    "SQLFERS" end restore
4Eh    "SQLFNRR" return number of result set rows
4Fh    "SQLFSTR" start restriction mode
50h    "SQLFSPR" stop restriction mode
51h    "SQLFCNC" connect 2
52h    "SQLFCNR" connect with no recovery
53h    "SQLFOMS" set output message size
54h    "SQLFIMS" set input message size
55h    "SQLFSCP" set cache pages
56h    "SQLFDSC" describe items of a SELECT statement (external)
57h    "SQLFLAB" get label info for items in SELECT statement
58h    "SQLFCBV" clear bind variables
59h    "SQLFGET" get database information
5Ah    "SQLFSET" set database information
5Bh    "SQLFTEC" translate error code
----------478001-----------------------------
INT 47 - SQL Base - GET VERSION NUMBER
       AX = 8001h
Return: ???
Note:   SQL Base is a network-oriented database engine by Gupta Technologies
----------48---------------------------------
INT 48 - KEYBOARD - CORDLESS KEYBOARD TRANSLATION (PCjr)
SeeAlso: INT 49"PCjr"
----------48---------------------------------
INT 48 - Z100 - Slave 8259 - S100 vectored line 0
SeeAlso: INT 47"Z100",INT 49"Z100"
----------48---------------------------------
INT 48 - Watstar PC Network data pointer 1
SeeAlso: INT 49"Watstar"
----------48---------------------------------
INT 48 - Acorn BBC Master 512 - "OSNEWL" - SEND NEWLINE TO OUTPUT STREAM
Return: FLAGS destroyed
Note:   writes a carriage return (0Dh) followed by a linefeed (0Ah)
SeeAlso: INT 40"Acorn",INT 47"Acorn",INT 49"Acorn"
----------49---------------------------------
INT 49 - SYSTEM DATA - NON-KEYBOARD SCAN-CODE TRANSLATION TABLE (PCjr)
SeeAlso: INT 48"PCjr"

Format of translation table:
Offset  Size    Description
00h    BYTE    number of nonkeyboard scancodes in the table
01h  N WORDs   high byte 00h (NUL) byte scancode with low order byte
               representing the scancode mapped values relative to their
               input values within the range of 56h through 7Eh
----------49---------------------------------
INT 49 - Z100 - Slave 8259 - S100 vectored line 1
SeeAlso: INT 48"Z100",INT 4A"Z100"
----------49---------------------------------
INT 49 - Texas Instruments PC - VIDEO I/O???
       apparently provides direct video display on the TI Professional PC
----------49---------------------------------
INT 49 - Watstar PC Network data pointer 2
SeeAlso: INT 49"Watstar"
----------49---------------------------------
INT 49 - Acorn BBC Master 512 - "OSASCI" - WRITE CHARACTER TO CUR OUTPUT STREAM
       AL = character to be written
Return: FLAGS destroyed
Note:   converts carriage return (0Dh) into CRLF sequence (0Dh 0Ah)
SeeAlso: INT 40"Acorn",INT 46"Acorn",INT 47"Acorn",INT 48"Acorn"
----------490001-----------------------------
INT 49 - MAGic v1.16+ - TURN ON MAGNIFICATION
       AX = 0001h
Return: AX = status
           0000h cannot magnify current video mode
           0002h magnified (text mode)
           0003h magnified (graphics mode)
           FFFDh function works only in magnified mode
           FFFFh MAGic busy, retry later
       BX,CX,DX destroyed
Notes:  MAGic (MAGnification In Color) is a TSR by Microsystems Software, Inc.
         providing 2x2 text and graphics magnification on VGA, XGA, and SVGA
       INT 49 is the default, but may be overridden on the commandline.  The
         actual interrupt in use may be found by searching for the signature
         "MAGic" or "xMAGic" (for the deluxe version) immediately preceding
         the interrupt handler (this is also the installation check).  MAGic
         uses CodeRunneR, which places the signature "RT" at offset 0000h in
         the interrupt handler's segment, followed by MAGic's TSR ID of
         "VMAG".
SeeAlso: AX=0001h,AX=0003h,AX=0004h,AX=0008h
----------490002-----------------------------
INT 49 - MAGic v1.16+ - TURN OFF MAGNIFICATION
       AX = 0002h
Return: AX = status (see AX=0001h)
       BX,CX,DX destroyed
SeeAlso: AX=0001h
----------490003-----------------------------
INT 49 - MAGic v1.16+ - SHIFT MAGNIFIED WINDOW TO INCLUDE SPECIFIED LOCATION
       AX = 0003h
       BX = vertical position (character row [text] or pixel row [graphics])
       DX = horizontal position (char column [text] or 8-pixel units [gr])
Return: AX = status
           0000h successful
           FFFFh MAGic busy, retry later
       BX,CX,DX destroyed
Note:   window is not moved if the position is inside the current window
SeeAlso: AX=0001h,AX=0004h,AX=0005h
----------490004-----------------------------
INT 49 - MAGic v1.16+ - REPOSITION MAGNIFIED WINDOW
       AX = 0004h
       BX = vertical position of upper left corner
       DX = horizontal position
Return: AX = status (see AX=0003h)
       BX,CX,DX destroyed
SeeAlso: AX=0001h,AX=0003h,AX=0005h
----------490005-----------------------------
INT 49 - MAGic v1.16+ - GET POSITION OF MAGNIFIED WINDOW
       AX = 0005h
Return: AX = status
           0000h successful
               BX = vertical position (char row or pixel row)
               DX = horizontal position (char column or 8-pixel units)
           FFFFh MAGic busy, retry later
               BX,DX destroyed
       CX destroyed
SeeAlso: AX=0001h,AX=0003h,AX=0004h,AX=0006h,AX=0007h
----------490006-----------------------------
INT 49 - MAGic v1.16+ - GET SIZE OF FULL SCREEN
       AX = 0006h
Return: AX = status
           0000h successful
               BX = vertical size (char rows or pixel rows)
               DX = horizontal size (char cols or 8-pixel units)
           FFFFh MAGic busy, retry later
               BX,DX destroyed
       CX destroyed
SeeAlso: AX=0001h,AX=0005h,AX=0007h
----------490007-----------------------------
INT 49 - MAGic v1.16+ - GET SIZE OF MAGNIFICATION WINDOW
       AX = 0007h
Return: AX = status
           0000h successful
               BX = vertical size (char rows or pixel rows)
               DX = horizontal size (char cols or 8-pixel units)
           FFFEh invalid function
           FFFFh MAGic busy, retry later
               BX,DX destroyed
       CX destroyed
BUG:    in v1.16 and v1.17, this function is not recognized as valid, but
         AX=0000h is accepted and will branch into hyperspace
SeeAlso: AX=0001h,AX=0006h
----------490008-----------------------------
INT 49 - MAGic v1.23+ - SET TEXT MODE MAGNIFICATION SIZE
       AX = 0008h
       BX = scaling factor (01h=1.4 times, 02h, 04h, 06h, 08h, 09h=12 times)
Return: AX = status
           0000h successful
           FFFBh scaling factor only available in MAGic Deluxe
           FFFCh already in magnified state, can't set size
Notes:  this call specifies the amount a subsequent call to AX=0001h should
         magnify the display
       scaling factors greater than 2 are only available in MAGic Deluxe
SeeAlso: AX=0001h
----------4A---------------------------------
INT 4A - SYSTEM - USER ALARM HANDLER
  This interrupt is invoked by the BIOS when a real-time clock alarm occurs.
  An application may use it to perform an action at a predetermined time;
  however, this interrupt is called from within a hardware interrupt handler,
  so all usual precautions against reentering DOS must be taken.
SeeAlso: INT 1A/AH=06h
----------4A---------------------------------
INT 4A - Z100 - Slave 8259 - S100 vectored line 2
SeeAlso: INT 49"Z100",INT 4B"Z100"
----------4A---------------------------------
INT 4A - Acorn BBC Master 512 - "OSWORD" - MISC FUNCTIONS USING CONTROL BLOCK
       AL = function code
           FAh transfer data between 80186 and 65C12 I/O processor
       DS:BX -> control block (see below)
Return: FLAGS destroyed
       control block updated
Note:   there are more functions than are listed here, but details are not
         available
SeeAlso: INT 40"Acorn",INT 4B"Acorn",INT 4C"Acorn"

Format of control block for function FAh:
Offset  Size    Description
00h    BYTE    number of parameters sent to I/O processor (0Dh,0Eh)
01h    BYTE    number of parameters read from I/O processor (01h)
02h    DWORD   I/O processor address
06h    DWORD   80186 segment:offset address
0Ah    WORD    number of bytes to transfer
0Ch    BYTE    operation type
               00h write to 65C12 at 24 us/byte
               01h read from 65C12 at 24 us/byte
               02h write to 65C12 at 26 us/word
               03h read from 65C12 at 26 us/word
               04h write to 65C12 at 10 us/byte using 256-byte blocks
               05h read from 65C12 at 10 us/byte using 256-byte blocks
0Dh    BYTE    65C12 memory access control (only used if offset 00h = 0Eh)
               bit 7: unused
               bit 6: always use main screen memory if I/O addr 3000h-7FFFh
                       (overrides bit 5)
               bit 5: use shadow screen memory if screen address specified
               bit 4: use current ROM rather than ROM selected by bits 3-0
                       (only if I/O address between 8000h and BFFFh)
               bits 3-0: paged ROM number
----------4B---------------------------------
INT 4B - Z100 - Slave 8259 - S100 vectored line 3
SeeAlso: INT 4A"Z100",INT 4C"Z100"
----------4B---------------------------------
INT 4B - Common Access Method SCSI interface (draft revision 1.9)
       ES:DI -> CAM Control Block (see INT 4F/AX=8100h)
Notes:  the CAM committee moved the interface to INT 4F after revision 1.9
         to avoid conflicting with the IBM SCSI interface and the Virtual
         DMA specification
       the installation check for the driver is the string "SCSI_CAM" eight
         bytes past the INT 4Bh handler
       it is not known whether any drivers actually implemented this
         interface on INT 4B instead of INT 4F
SeeAlso: INT 4F/AX=8100h
----------4B---------------------------------
INT 4B - Acorn BBC Master 512 - "OSBYTE" - MISC FUNCTIONS USING REGISTER PARAMS
       AL = function code
       BL = first parameter
       BH = second parameter (if needed)
Return: BL = first return parameter
       BH = second return parameter
       CF depends on function
SeeAlso: INT 40"Acorn",INT 4A"Acorn",INT 4C"Acorn"
----------4B80-------------------------------
INT 4B - IBM SCSI interface
       AH = 80h
       details not yet available
----------4B8102DX0000-----------------------
INT 4B - Virtual DMA Specification (VDS) - GET VERSION
       AX = 8102h
       DX = 0000h
Return: CF clear if successful
           AH = major version number
           AL = minor version number
           BX = product number
               0000h for Quadtel's QMAPS and Hewlett-Packard's HPMM.SYS
               0001h for Microsoft's EMM386.EXE
               4560h ("E`") for Qualitas' 386MAX
               4D43h ("MC") for V Communication's Memory Commander
               5145h ("QE") for Quarterdeck's QEMM-386
           CX = product revision number
               always 0000h for QMAPS and HPMM.SYS
               always 0001h for Microsoft's EMM386.EXE v4.20-4.41
           SI:DI = maximum DMA buffer size
           DX = flags
               bit 0: PC/XT bus (DMA in first megabyte only)
                   1: physical buffer/remap region in first megabyte
                   2: automatic remap enabled
                   3: all memory is physically contiguous
                4-15: reserved (zero)
       CF set on error
           AL = error code (see below)
Note:   bit 5 of 0040h:007Bh is supposed to be set if VDS is supported; this is
         apparently not always the case
SeeAlso: INT 31

Values for error code:
01h    region not in contiguous memory
02h    region crossed a physical alignment boundary
03h    unable to lock pages
04h    no buffer available
05h    region too large for buffer
06h    buffer currently in use
07h    invalid memory region
08h    region was not locked
09h    number of physical pages greater than table length
0Ah    invalid buffer ID
0Bh    copy out of buffer range
0Ch    invalid DMA channel number
0Dh    disable count overflow
0Eh    disable count underflow
0Fh    function not supported
10h    reserved flag bits set in DX

Format of DMA descriptor structure (DDS):
Offset  Size    Description
00h    DWORD   region size
04h    DWORD   offset
08h    WORD    segment/selector
0Ah    WORD    buffer ID
0Ch    DWORD   physical address

Format of Extended DMA descriptor structure (EDDS):
Offset  Size    Description
00h    DWORD   region size
04h    DWORD   offset
08h    WORD    segment/selector
0Ah    WORD    reserved
0Ch    WORD    number available
0Eh    WORD    number used
10h    DWORD   region 0 physical address
14h    DWORD   region 0 size in bytes
18h    DWORD   region 1 physical address
1Ch    DWORD   region 1 size in bytes
       ...

Format of Extended DMA descriptor structure (EDDS) with page table entries:
Offset  Size    Description
00h    DWORD   region size
04h    DWORD   offset
08h    WORD    segment/selector
0Ah    WORD    reserved
0Ch    WORD    number available
0Eh    WORD    number used
10h    DWORD   page table entry 0 (same as 80386 page table entry)
14h    DWORD   page table entry 1
       ...
Note:   bits 1-11 of the page table entries should be zero; bit 0 set if page
         is present and locked
----------4B8103-----------------------------
INT 4B - Virtual DMA Specification - LOCK DMA REGION
       AX = 8103h
       DX = flags
           bit 0: reserved (zero)
               1: data should be copied into buffer (ignored if bit 2 set)
               2: buffer should not be allocated if region noncontiguous or
                  crosses physical alignment boundary specified by bits 4-5
               3: don't attempt automatic remap
               4: region must not cross 64K physical alignment boundary
               5: region must not cross 128K physical alignment boundary
            6-15: reserved (zero)
       ES:DI -> DMA descriptor structure (see AX=8102h)
Return: CF clear if successful
           DDS physical address field filled in
           DDS buffer ID field filled (0000h if no buffer allocated)
       CF set on error
           AL = error code (see AX=8102h)
           DDS region size field filled wth maximum contiguous length in bytes
SeeAlso: AX=8104h,AX=8105h
----------4B8104-----------------------------
INT 4B - Virtual DMA Specification - UNLOCK DMA REGION
       AX = 8104h
       DX = flags
           bit 0: reserved (zero)
               1: data should be copied out of buffer
            2-15: reserved (zero)
       ES:DI -> DMA descriptor structure (see AX=8102h) with region size,
               physical address, and buffer ID fields set
Return: CF clear if successful
           DDS physical address field set
           DDS buffer ID field set (0000h if no buffer allocated)
       CF set on error
           AL = error code (see AX=8102h)
           DDS region size field filled wth maximum contiguous length in bytes
SeeAlso: AX=8103h,AX=8106h
----------4B8105-----------------------------
INT 4B - Virtual DMA Specification - SCATTER/GATHER LOCK REGION
       AX = 8105h
       DX = flags
           bits 0-5: reserved (zero)
                  6: EDDS should be returned with page table entries
                  7: only present pages should be locked (not-present pages
                       receive entry of 0000h)
               8-15: reserved (zero)
       ES:DI -> Extended DMA descriptor structure (see AX=8102h)
               region size, linear segment, linear offset, and number avail
               fields set
Return: CF clear if successful
           EDDS number used field set
           if DX bit 6 set, lower 12 bits of BX = offset in first page
       CF set on error
           AL = error code (see AX=8102h)
           EDDS region size field filled with max length in bytes that can be
               locked and described in the EDDS table
SeeAlso: AX=8103h,AX=8106h
----------4B8106-----------------------------
INT 4B - Virtual DMA Specification - SCATTER/GATHER UNLOCK REGION
       AX = 8106h
       DX = flags
           bits 0-5: reserved (zero)
                  6: EDDS contains page table entries
                  7: EDDS may contain not-present pages (entry = 0000h)
               8-15: reserved (zero)
       ES:DI -> Extended DMA descriptor structure (see AX=8102h) returned
               by AX=8105h
Return: CF clear if successful
       CF set on error
           AL = error code (see AX=8102h)
Note:   according to the Microsoft version of the VDS specification, the
         actual scatter/gather list is ignored, while according to the IBM
         version of the specification, "the result of a LOCK operation"
         must be provided to this function
SeeAlso: AX=8104h,AX=8105h
----------4B8107-----------------------------
INT 4B - Virtual DMA Specification - REQUEST DMA BUFFER
       AX = 8107h
       DX = flags
           bit 0: reserved (zero)
               1: data should be copied into buffer
            2-15: reserved (zero)
       ES:DI -> DMA descriptor structure (see AX=8102h) with region size set
               (also region offset and region segment if DX bit 1 set)
Return: CF clear if successful
           DDS physical address and buffer ID set
           DDS region size filled with length of buffer
       CF set on error
           AL = error code (see AX=8102h)
SeeAlso: AX=8108h
----------4B8108-----------------------------
INT 4B - Virtual DMA Specification - RELEASE DMA BUFFFER
       AX = 8108h
       DX = flags
           bit 0: reserved (zero)
               1: data should be copied out of buffer
            2-15: reserved (zero)
       ES:DI -> DMA descriptor structure (see AX=8102h) with buffer ID set
               (also region size/region offset/segment if DX bit 1 set)
Return: CF clear if successful
       CF set on error
           AL = error code (see AX=8102h)
SeeAlso: AX=8107h
----------4B8109DX0000-----------------------
INT 4B - Virtual DMA Specification - COPY INTO DMA BUFFER
       AX = 8109h
       DX = 0000h
       ES:DI -> DMA descriptor structure (see AX=8102h) with buffer ID,
               region segment/offset, and region size fields set
       BX:CX = starting offset into DMA buffer
Return: CF clear if successful
       CF set on error
           AL = error code (see AX=8102h)
SeeAlso: AX=810Ah
----------4B810ADX0000-----------------------
INT 4B - Virtual DMA Specification - COPY OUT OF DMA BUFFER
       AX = 810Ah
       DX = 0000h
       ES:DI -> DMA descriptor structure (see AX=8102h) with buffer ID,
               region segment/offset, and region size fields set
       BX:CX = starting offset into DMA buffer
Return: CF clear if successful
       CF set on error
           AL = error code (see AX=8102h)
SeeAlso: AX=8109h
----------4B810B-----------------------------
INT 4B - Virtual DMA Specification - DISABLE DMA TRANSLATION
       AX = 810Bh
       BX = DMA channel number
       DX = 0000h
Return: CF clear if successful
       CF set on error
           AL = error code (see AX=8102h)
SeeAlso: AX=810Ch
----------4B810C-----------------------------
INT 4B - Virtual DMA Specification - ENABLE DMA TRANSLATION
       AX = 810Ch
       BX = DMA channel number
       DX = 0000h
Return: CF clear if successful
           ZF set if disable count decremented to zero
       CF set on error
           AL = error code (see AX=8102h)
SeeAlso: AX=810Bh
----------4B810D-----------------------------
INT 4B - QEMM-386 - BUG
       AX = 810Dh
Note:   the code in QEMM v5.11 and 6.00 jumps to an invalid location on this
         call
----------4C---------------------------------
INT 4C - Z100 - Slave 8259 - S100 vectored line 4
SeeAlso: INT 4B"Z100",INT 4D"Z100"
----------4C---------------------------------
INT 4C - Acorn BBC Master 512 - "OSCLI" - INTERPRET COMMAND LINE
       DS:BX -> CR-terminated command string
Return: FLAGS destroyed
SeeAlso: INT 40"Acorn",INT 4A"Acorn",INT 4B"Acorn"
----------4D---------------------------------
INT 4D - Z100 - Slave 8259 - S100 vectored line 5
SeeAlso: INT 4C"Z100",INT 4E"Z100"
----------4E---------------------------------
INT 4E - TI Professional PC - DISK I/O
       used instead of INT 13 on the TI Professional PC
SeeAlso: INT 13
----------4E---------------------------------
INT 4E - Z100 - Slave 8259 - S100 vectored line 6
SeeAlso: INT 4D"Z100",INT 4F"Z100"
----------4F---------------------------------
INT 4F - Z100 - Slave 8259 - S100 vectored line 7
SeeAlso: INT 4E"Z100"
----------4F8100-----------------------------
INT 4F - Common Access Method SCSI interface rev 2.3 - SEND CCB TO XPT/SIM
       AX = 8100h
       ES:BX -> CAM Control Block (CCB) (see below)
Return: AH = status
           00h successful
           01h invalid CCB address (0000h:0000h)
Note:   the SCSI Interface Module (SIM) may complete the requested function
         and invoke the completion callback function before this call returns
SeeAlso: AX=8200h,INT 4B"Common Access Method"

Format of CAM Control Block:
Offset  Size    Description
00h    DWORD   physical address of this CCB
04h    WORD    CAM control block length
06h    BYTE    function code (see below)
07h    BYTE    CAM status (see below)
08h    BYTE    SCSI status
09h    BYTE    path ID (FFh = XPT)
0Ah    BYTE    target ID
0Bh    BYTE    logical unit number
0Ch    BYTE    CAM flags
               bits 7-6: direction
                       00 reserved
                       01 in
                       10 out
                       11 no data transfer
               bit 5: disable autosense
                   4: scatter/gather
                   3: disable callback on completion
                   2: linked CDB
                   1: tagged queue action enable
                   0: CDB is a pointer
0Dh    BYTE    CAM flags
               bit 7: disable disconnect
                   6: initiate synchronous transfers  \ mutually
                   5: disable synchronous transfers   / exclusive
                   4: SIM queue priority
                       1 head insertion
                       0 tail insertion (normal)
               bit 3: SIM queue freeze
                   2: engine synchronize
               bits 1-0: reserved
0Eh    BYTE    CAM address flags
               bit 7: SG list/data (0 = host, 1 = engine)
               bit 6: CDB pointer    (bits 6-1: 0=virtual addr, 1=phys addr)
               bit 5: SG list/data
               bit 4: sense buffer
               bit 3: message buffer
               bit 2: next CCB
               bit 1: callback on completion
               bit 0: reserved
0Fh    BYTE    target-mode flags
               bit 7: data buffer valid
               bit 6: status valid
               bit 5: message buffer valid
               bit 4: reserved
               bit 3: phase-cognizant mode
               bit 2: target CCB available
               bit 1: disable autodisconnect
               bit 0: disable autosave/restore
---function 02h---
10h    DWORD   pointer to 36-byte buffer for inquiry data or 0000h:0000h
14h    BYTE    peripheral device type of target logical unit number
---function 03h---
10h    BYTE    version number (00h-07h prior to rev 1.7, 08h = rev 1.7,
               09h-FFh = rev no, i.e. 23h = rev 2.3)
11h    BYTE    SCSI capabilities
               bit 7: modify data pointers
                   6: wide bus (32 bits)
                   5: wide bus (16 bits)
                   4: synchronous transfers
                   3: linked commands
                   2: reserved
                   1: tagged queueing
                   0: soft reset
12h    BYTE    target mode support
               bit 7: processor mode
                   6: phase-cognizant mode
                   5-0: reserved
13h    BYTE    miscellaneous flags
               bit 7: scanned high to low instead of low to high
                   6: removables not included in scan
                   5: inquiry data not kept by XPT
                   4-0: reserved
14h    WORD    engine count
16h 14 BYTEs   vendor-specific data
24h    DWORD   size of private data area
28h    DWORD   asynchronous event capabilities
               bits 31-24: vendor-specific
                    23-8: reserved
                       7: new devices found during rescan
                       6: SIM module deregistered
                       5: SIM module registered
                       4: sent bus device reset to target
                       3: SCSI AEN
                       2: reserved
                       1: unsolicited reselection
                       0: unsolicited SCSI bus reset
2Ch    BYTE    highest path ID assigned
2Dh    BYTE    SCSI device ID of initiator
2Eh  2 BYTEs   reserved
30h 16 BYTEs   SIM vendor ID
40h 16 BYTEs   HBA (host bus adaptor) vendor ID
50h  4 BYTEs   operating-system dependant usage
---functions 00h,04h,11h,12h---
no additional fields
---function 05h---
10h    DWORD   asynchronous event enables (see function 03h above)
14h    DWORD   pointer to asynchronous callback routine
18h    DWORD   pointer to peripheral driver buffer
1Ch    BYTE    size of peripheral buffer
---function 06h---
10h    BYTE    peripheral device type of target
---functions 10h,13h---
10h    DWORD   pointer to CCB to be aborted
---function 20h---
10h    WORD    engine number
12h    BYTE    engine type
               00h buffer memory
               01h lossless compression
               02h lossy compression
               03h encryption
13h    BYTE    engine algorithm ID
               00h vendor-unique
               01h LZ1 variation 1 (STAC)
               02h LZ2 variation 1 (HP DCZL)
               03h LZ2 variation 2 (Infochip)
14h    DWORD   engine memory size
---function 21h---
10h    DWORD   pointer to peripheral driver
14h  4 BYTEs   reserved
18h    DWORD   OS-dependent request-mapping info
1Ch    DWORD   address of completion callback routine
20h    DWORD   pointer to scatter/gather list or data buffer
24h    DWORD   length of data transfer
28h    DWORD   pointer to engine buffer data
2Ch  2 BYTEs   reserved
2Eh    WORD    number of scatter/gather entries
30h    DWORD   maximum destination data length
34h    DWORD   length of destination data
38h    DWORD   source residual length
3Ch 12 BYTEs   reserved
48h    DWORD   OS-dependent timeout value
4Ch  4 BYTEs   reserved
50h    WORD    engine number
52h    WORD    vendor-unique flags
54h  4 BYTEs   reserved
58h  N BYTEs   private data area for SIM
---function 30h---
10h    WORD    group 6 vendor-unique CDB length
12h    WORD    group 7 vendor-unique CDB length
14h    DWORD   pointer to target CCB list
18h    WORD    number of target CCBs
---other functions---
10h    DWORD   pointer to peripheral driver
14h    DWORD   pointer to next CCB
18h    DWORD   OS-dependent request mapping information
1Ch    DWORD   address of completion callback routine
20h    DWORD   pointer to scatter/gather list or data buffer
24h    DWORD   length of data transfer
28h    DWORD   pointer to sense info buffer
2Ch    BYTE    length of sense info buffer
2Dh    BYTE    CDB length
2Eh    WORD    number of scatter/gather entries
30h  4 BYTEs   reserved
34h    BYTE    SCSI status
35h  3 BYTEs   reserved
38h    DWORD   residual length
40h 12 BYTEs   Command Descriptor Block (CDB)
44h    DWORD   OS-dependent timeout value
48h    DWORD   pointer to message buffer
4Ch    WORD    length of message buffer
4Eh    WORD    vendor-unique flags
50h    BYTE    tag queue action
51h  3 BYTEs   reserved
54h  N BYTEs   private data area for SIM

Values for CAM function code:
00h NOP
01h execute SCSI I/O
02h get device type
03h path inquiry
04h release SIM queue
05h set async callback
06h set device type
07h-0Fh reserved
10h abort SCSI command
11h reset SCSI bus
12h reset SCSI device
13h terminate I/O process
14h-1Fh reserved
20h engine inquiry
21h execute engine request
22h-2Fh reserved
30h enable logical unit number
31h execute target I/O
32h-7Fh reserved
80h-FFh vendor-specific functions

Values for CAM status:
00h request in progress
01h request successful
02h host aborted request
03h unable to abort request
04h request completed with error
05h CAM is busy
06h invalid request
07h invalid path ID
08h no such SCSI device
09h unable to terminate I/O process
0Ah timeout on target selection
0Bh timeout on command
0Dh receive message rejection
0Eh sent/received SCSI bus reset
0Fh detected uncorrectable parity error
10h Autosense request failed
11h no HBA detected
12h data over/underrun
13h bus freed unexpectedly
14h target bus phase sequence failure
15h CCB too small
16h requested capability not available
17h sent bus device reset
18h terminate I/O process
38h invalid LUN
39h invalid target ID
3Ah unimplemented function
3Bh nexus not established
3Ch invalid initiator ID
3Dh received SCSI Command Descriptor Block
3Eh LUN already enabled
3Fh SCSI bus busy
Note:   bit 6 set to indicate frozen SIM queue
       bit 7 set to indicate valid autosense

Completion callback function called with:
       interrupts disabled
       ES:BX -> completed CCB

Asynchronous callback function called with:
       AH = opcode
       AL = path ID generating callback
       DH = target ID causing event
       DL = LUN causing event
       CX = data byte count (if applicable)
       ES:BX -> data buffer (if applicable)
Return: all registers preserved
----------4F8200CX8765-----------------------
INT 4F - Common Access Method SCSI interface rev 2.3 - INSTALLATION CHECK
       AX = 8200h
       CX = 8765h
       DX = CBA9h
Return: AH = 00h if installed
           CX = 9ABCh
           DX = 5678h
           ES:DI -> "SCSI_CAM"
SeeAlso: AX=8100h,INT 4B"Common Access Method"
---------------------------------------------

Downloaded From P-80 International Information Systems 304-744-2253