Outils pour utilisateurs

Outils du site


back2root:ibm-pc-ms-dos:interrupts:old:ms_interrupt_list-22-30

Différences

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

Lien vers cette vue comparative

Les deux révisions précédentesRévision précédente
back2root:ibm-pc-ms-dos:interrupts:old:ms_interrupt_list-22-30 [2023/01/05 04:01] – supprimée - modification externe (Unknown date) 127.0.0.1back2root:ibm-pc-ms-dos:interrupts:old:ms_interrupt_list-22-30 [2023/01/05 04:01] (Version actuelle) – créée - modification externe 127.0.0.1
Ligne 1: Ligne 1:
 +====== MSDOS - Interrupt List 22h-30h ======
 +
 +----------22---------------------------------
 +INT 22 - DOS 1+ - PROGRAM TERMINATION ADDRESS
 +   specifies the address of the routine which is to be given control after
 +   a program is terminated; should never be called directly, since it does not
 +   point at an interrupt handler
 +Notes: this vector is restored from the DWORD at offset 0Ah in the PSP during
 +   termination, and then a FAR JMP is performed to the address in INT 22
 + normally points at the instruction immediately following INT 21/AH=4Bh
 +   call which loaded the current program
 +SeeAlso: INT 20,INT 21/AH=00h,INT 21/AH=31h,INT 21/AH=4Ch
 +----------23---------------------------------
 +INT 23 - DOS 1+ - CONTROL-C/CONTROL-BREAK HANDLER
 +   invoked whenever DOS detects a ^C or ^Break; should never be called directly
 +---DOS 1.x---
 +Return: AH = 00h abort program
 + if all registers preserved, restart DOS call
 +---DOS 2+---
 +Return: all registers preserved
 + return via RETF or RETF 2 with CF set
 +     DOS will abort program with errorlevel 0
 + else (RETF/RETF 2 with CF clear or IRET)
 +     interrupted DOS call is restarted
 +Notes: MSDOS 1.25 also invokes INT 23 on a divide overflow (INT 00)
 + any DOS call may safely be made within the INT 23 handler, although
 +   the handler must to check for a recursive invocation if it does
 +   call DOS
 +SeeAlso: INT 1B
 +----------24---------------------------------
 +INT 24 - DOS 1+ - CRITICAL ERROR HANDLER
 +   invoked when a critical (usually hardware) error is encountered; should
 +   never be called directly
 +
 +Critical error handler is invoked with:
 + AH = type and processing flags
 +     bit 7 clear = disk I/O error
 +   set = -- if block device, bad FAT image in memory
 +   -- if char device, error code in DI
 +     bit 6  unused
 +     bit 5 = 1 if Ignore allowed, 0 if not (DOS 3+)
 +     bit 4 = 1 if Retry allowed, 0 if not (DOS 3+)
 +     bit 3 = 1 if Fail allowed, 0 if not (DOS 3+)
 +     bit 2 \ disk area of error 00 = DOS area  01 = FAT
 +     bit 1 / 10 = root dir  11 = data area
 +     bit 0 = 1 if write, 0 if read
 + AL = drive number if AH bit 7 clear
 + BP:SI -> device driver header (BP:[SI+4] bit 15 set if char device)
 + DI low byte contains error code if AH bit 7 set
 +    00h write-protection violation attempted
 +    01h unknown unit for driver
 +    02h drive not ready
 +    03h unknown command given to driver
 +    04h data error (bad CRC)
 +    05h bad device driver request structure length
 +    06h seek error
 +    07h unknown media type
 +    08h sector not found
 +    09h printer out of paper
 +    0Ah write fault
 +    0Bh read fault
 +    0Ch general failure
 +    0Dh (DOS 3+) sharing violation
 +    0Eh (DOS 3+) lock violation
 +    0Fh invalid disk change
 +    10h (DOS 3+) FCB unavailable
 +    11h (DOS 3+) sharing buffer overflow
 +    12h (DOS 4+) code page mismatch
 +    13h (DOS 4+) out of input
 +    14h (DOS 4+) insufficient disk space
 + STACK: DWORD return address for INT 24 call
 + WORD flags pushed by INT 24
 + WORD original AX on entry to INT 21
 + WORD BX
 + WORD CX
 + WORD DX
 + WORD SI
 + WORD DI
 + WORD BP
 + WORD DS
 + WORD ES
 + DWORD return address for INT 21 call
 + WORD flags pushed by INT 21
 +Handler must return:
 + AL = action code
 +     00h ignore error and continue processing request
 +     01h retry operation
 +     02h terminate program through the equivalent of INT 21/AH=4Ch
 + (INT 20h for DOS 1.x)
 +     03h fail system call in progress
 + SS,SP,DS,ES,BX,CX,DX preserved
 +Notes: the only DOS calls the handler may make are INT 21/AH=01h-0Ch,30h,59h
 + if the handler returns to the application by popping the stack, DOS
 +   will be in an unstable state until the first call with AH > 0Ch
 + for DOS 3.1+, IGNORE (AL=00h) is turned into FAIL (AL=03h) on network
 +   critical errors
 + if IGNORE specified but not allowed, it is turned into FAIL
 + if RETRY specified but not allowed, it is turned into FAIL
 + if FAIL specified but not allowed, it is turned into ABORT
 + (DOS 3+) if a critical error occurs inside the critical error handler,
 +   the DOS call is automatically failed
 +----------25---------------------------------
 +INT 25 - DOS 1+ - ABSOLUTE DISK READ (except partitions > 32M)
 + AL = drive number (00h = A:, 01h = B:, etc)
 + CX = number of sectors to read
 + DX = starting logical sector number (0000h - highest sector on drive) 
 + DS:BX -> buffer for data
 +Return: CF clear if successful
 + CF set on error
 +     AH = status
 + 80h device failed to respond (timeout)
 + 40h seek operation failed
 + 20h controller failed
 + 10h data error (bad CRC)
 + 08h DMA failure
 + 04h requested sector not found
 + 03h write-protected disk (INT 26 only)
 + 02h bad address mark
 + 01h bad command
 +     AL = error code (same as passed to INT 24 in DI)
 + may destroy all other registers except segment registers
 +Notes: original flags are left on stack, and must be popped by caller
 + this call bypasses the DOS filesystem
 +BUG: DOS 3.1 through 3.3 set the word at ES:[BP+1Eh] to FFFFh if AL is an
 + invalid drive number
 +SeeAlso: INT 13/AH=02h,INT 26
 +----------25---------------------------------
 +INT 25 - DOS 3.31+ - ABSOLUTE DISK READ (>32M hard-disk partition)
 + AL = drive number (0=A, 1=B, etc)
 + CX = FFFFh
 + DS:BX -> disk read packet (see below)
 +Return: same as above
 +Notes: partition is potentially >32M (and requires this form of the call) if
 +   bit 1 of device attribute word in device driver is set
 + original flags are left on stack, and must be removed by caller
 + this call bypasses the DOS filesystem
 +SeeAlso: INT 13/AH=02h,INT 26
 +
 +Format of disk read packet:
 +Offset Size Description
 + 00h DWORD sector number
 + 04h WORD number of sectors to read
 + 06h DWORD transfer address
 +----------25CDCD-----------------------------
 +INT 25 - Stacker - GET DEVICE DRIVER ADDRESS
 + AX = CDCDh
 + DS:BX -> buffer for address (see below)
 + CX = 0001h
 + DX = 0000h
 +Return: AX = CDCDh if Stacker installed
 +     DS:BX buffer filled
 +
 +Format of driver address buffer:
 +Offset Size Description
 + 00h WORD signature CDCDh
 + 02h WORD ??? 0001h
 + 04h DWORD pointer to start of Stacker device driver
 +
 +Format of device driver:
 +Offset Size Description
 + 00h WORD signature A55Ah
 + 02h WORD Stacker version * 64h
 + 04h WORD offset of volume-specific information offset table
 + (list of WORDs, one per drive, containing offsets to various
 + information)
 + 06h 56 BYTEs n/a
 + 3Eh BYTE volume number, set after INT 21/AX=4404h
 + (use to index into volume-specific info offset table)
 + 3Fh 19 BYTEs n/a
 + 52h  4 BYTEs ASCII string "SWAP"
 + 56h 26 BYTEs drive mapping table (one byte for each drive A: through Z:)
 +
 +Format of Stacker boot record:
 +Offset Size Description
 +1F0h  8 BYTEs Stacker signature (first byte is CDh)
 +1F8h DWORD pointer to start of Stacker device driver
 +1FCh WORD Stacker volume number
 +1FEh WORD ???
 +----------25----ALFF-------------------------
 +INT 25 - PC-CACHE.SYS - INSTALLATION CHECK
 + AL = FFh
 + SI = 4358h
 +Return: SI = 6378h if installed
 +     CX = segment of device driver PC-CACHE.SYS
 +     DX = version (major in DH, minor in DL)
 +Note: PC-CACHE.SYS is a small device driver used by PC-Cache v5.x to obtain
 +   access to certain disk drivers for devices such as Bernoulli drives
 +SeeAlso: INT 13/AH=A0h
 +----------26---------------------------------
 +INT 26 - DOS 1+ - ABSOLUTE DISK WRITE (except partitions > 32M)
 + AL = drive number (00h = A:, 01h = B:, etc)
 + CX = number of sectors to write
 + DX = starting logical sector number (0000h - highest sector on drive) 
 + DS:BX -> data to write
 +Return: CF clear if successful
 + CF set on error
 +     AH = status
 + 80h device failed to respond (timeout)
 + 40h seek operation failed
 + 20h controller failed
 + 10h data error (bad CRC)
 + 08h DMA failure
 + 04h requested sector not found
 + 03h write-protected disk (INT 26 only)
 + 02h bad address mark
 + 01h bad command
 +     AL = error code (same as passed to INT 24 in DI)
 + may destroy all other registers except segment registers
 +Notes: original flags are left on stack, and must be popped by caller
 + this call bypasses the DOS filesystem
 +BUG: DOS 3.1 through 3.3 set the word at ES:[BP+1Eh] to FFFFh if AL is an
 + invalid drive number
 +SeeAlso: INT 13/AH=03h,INT 25
 +----------26---------------------------------
 +INT 26 - DOS 3.31+ - ABSOLUTE DISK WRITE (>32M hard-disk partition)
 + AL = drive number (0=A, 1=B, etc)
 + CX = FFFFh
 + DS:BX -> disk write packet (see below)
 +Return: same as above
 +Notes: partition is potentially >32M (and requires this form of the call) if
 +   bit 1 of device attribute word in device driver is set
 + original flags are left on stack, and must be removed by caller
 + this call bypasses the DOS filesystem
 +SeeAlso: INT 13/AH=03h,INT 25
 +
 +Format of disk write packet:
 +Offset Size Description
 + 00h DWORD sector number
 + 04h WORD number of sectors to read
 + 06h DWORD transfer address
 +----------27---------------------------------
 +INT 27 - DOS 1+ - TERMINATE AND STAY RESIDENT
 + DX = number of bytes to keep resident (max FFF0h)
 + CS = segment of PSP
 +Return: never
 +Notes: this is an obsolete call
 + INT 22, INT 23, and INT 24 are restored from the PSP
 + does not close any open files
 + the minimum number of bytes which will remain resident is 110h for
 +   DOS 2.x and 60h for DOS 3+; there is no minimum for DOS 1.x, which
 +   implements this service in COMMAND.COM rather than the DOS kernel
 +SeeAlso: INT 21/AH=31h
 +----------28---------------------------------
 +INT 28 - DOS 2+ - DOS IDLE INTERRUPT
 +   Invoked each time one of the DOS character input functions loops while
 +   waiting for input.  Since a DOS call is in progress even though DOS is
 +   actually idle during such input waits, hooking this function is necessary
 +   to allow a TSR to perform DOS calls while the foreground program is
 +   waiting for user input.  The INT 28h handler may invoke any INT 21 function
 +   except functions 00h through 0Ch.  Under DOS 2.x, the critical error flag
 +   (the byte immediately after the InDOS flag) must be set in order to call
 +   DOS functions 50h/51h without destroying the DOS stacks.
 +
 +Notes: calls to INT 21/AH=3Fh,40h may not use a handle which refers to CON
 + at the time of the call, the InDOS flag (see INT 21/AH=34h) is normally
 +   set to 01h; if larger, DOS is truly busy and should not be reentered
 + the default handler is an IRET instruction
 + supported in OS/2 compatibility box
 +SeeAlso: INT 21/AH=34h,INT 2A/AH=84h
 +----------29---------------------------------
 +INT 29 - DOS 2+ - FAST CONSOLE OUTPUT
 + AL = character to display
 +Return: nothing
 +Notes: automatically called when writing to a device with bit 4 of its device
 +   driver header set (see also INT 21/AH=52h)
 + COMMAND.COM v3.2 and v3.3 compare the INT 29 vector against the INT 20
 +   vector and assume that ANSI.SYS is installed if the segment is larger
 + the default handler under DOS 2.x and 3.x simply calls INT 10/AH=0Eh
 + the default handler under DESQview 2.2 understands the <Esc>[2J
 +   screen-clearing sequence, calls INT 10/AH=0Eh for all others
 +SeeAlso: INT 79
 +----------2A00-------------------------------
 +INT 2A - NETWORK (Microsoft, LANtastic) - INSTALLATION CHECK
 + AH = 00h
 +Return: AH <> 00h if installed
 +SeeAlso: INT 5C
 +----------2A0000-----------------------------
 +INT 2A - AT&T Starlan Extended NetBIOS (var length names) - INSTALLATION CHECK
 + AX = 0000h
 +Return: AH = DDh
 +SeeAlso: INT 5B
 +----------2A01-------------------------------
 +INT 2A - NETWORK (Microsoft,LANtastic) - EXECUTE NETBIOS REQUEST,NO ERROR RETRY
 + AH = 01h
 + ES:BX -> NCB (see INT 5C)
 +Return: AL = NetBIOS error code
 + AH = 00h if no error
 +    = 01h on error
 +SeeAlso: AH=04h,AX=0500h,INT 5B,INT 5C"NetBIOS"
 +----------2A02-------------------------------
 +INT 2A - NETWORK (Microsoft) - SET NET PRINTER MODE
 + AH = 02h
 + ???
 +Return: ???
 +----------2A0300-----------------------------
 +INT 2A - NETWORK (Microsoft,LANtastic) - CHECK DIRECT I/O
 + AX = 0300h
 + DS:SI -> ASCIZ device name (may be full path or only drive specifier--
 + must include the colon)
 +Return: CF clear if direct physical addressing (INT 13,INT 25) permissible
 + CF set if access via files only
 +Notes: do not use direct disk accesses if this function returns CF set or the
 +   device is redirected (INT 21/AX=5F02h)
 + may take some time to execute
 + called by DOS kernel on INT 25 and INT 26
 +SeeAlso: INT 13,INT 25,INT 26,INT 21/AX=5F02h
 +----------2A04-------------------------------
 +INT 2A - NETWORK (Microsoft,LANtastic) - EXECUTE NetBIOS REQUEST
 + AH = 04h
 + AL = error retry
 +     00h automatically retry request on errors 09h, 12h, and 21h
 +     01h no retry
 + ES:BX -> Network Control Block (see INT 5C"NetBIOS")
 +Return: AX = 0000h if successful
 + AH = 01h on error
 +     AL = error code
 +Note: invokes either INT 5B or INT 5C as appropriate
 +SeeAlso: AH=01h,AX=0500h,INT 5B,INT 5C"NetBIOS"
 +----------2A0500-----------------------------
 +INT 2A - NETWORK (Microsoft,LANtastic) - GET NETWORK RESOURCE AVAILABILITY
 + AX = 0500h
 +Return: AX reserved
 + BX = number of network names available
 + CX = number of network control blocks available
 + DX = number of network sessions available
 +SeeAlso: AH=01h,AH=04h,INT 5C"NetBIOS"
 +----------2A06-------------------------------
 +INT 2A - NETBIOS, LANtastic - NETWORK PRINT-STREAM CONTROL
 + AH = 06h
 + AL = 01h set concatenation mode (all printer output put in one job)
 +      02h set truncation mode (default)
 + printer open/close starts new print job
 +      03h flush printer output and start new print job
 +Return: CF set on error
 +     AX = error code
 + CF clear if successful
 +Notes: subfunction 03h is equivalent to Ctrl/Alt/keypad-*
 + LANtastic v4.x no longer supports this call
 +SeeAlso: INT 21/AX=5D08h,INT 21/AX=5D09h,INT 2F/AX=1125h
 +----------2A2001-----------------------------
 +INT 2A - MS Networks or NETBIOS - ???
 + AX = 2001h
 + ???
 +Return: ???
 +Note: intercepted by DESQview 2.x
 +----------2A2002-----------------------------
 +INT 2A - NETWORK - ???
 + AX = 2002h
 + ???
 +Return: ???
 +Note: called by MSDOS 3.30-5.00 APPEND
 +----------2A2003-----------------------------
 +INT 2A - NETWORK - ???
 + AX = 2003h
 + ???
 +Return: ???
 +Note: called by MSDOS 3.30-5.00 APPEND
 +----------2A7802-----------------------------
 +INT 2A - NETWORK - PC LAN PROG v1.31+ - GET LOGGED ON USER NAME
 + AX = 7802h
 + ES:DI -> 8-byte buffer to be filled
 +Return: AL = 00h if no user logged on to Extended Services
 + AL <> 00h if user logged on to Extended Services
 +     buffer at ES:DI filled with name, padded to 8 chars with blanks.
 +----------2A80-------------------------------
 +INT 2A - NETWORK - BEGIN DOS CRITICAL SECTION
 + AH = 80h
 + AL = critical section number (00h-0Fh)
 +     01h DOS kernel, SHARE.EXE
 + apparently for maintaining the integrity of DOS/SHARE/NET
 +   data structures
 +     02h DOS kernel
 + ensures that no multitasking occurs while DOS is calling an
 +   installable device driver
 +     05h DOS 4.x only IFSFUNC
 +     06h DOS 4.x only IFSFUNC
 +     08h ASSIGN.COM
 +     0Ah MSCDEX
 +Notes: normally hooked to avoid interrupting a critical section, rather than
 +   called
 + the handler should ensure that none of the critical sections are
 +   reentered, usually by suspending a task which attempts to reenter
 +   an active critical section
 + the DOS kernel does not invoke critical sections 01h and 02h unless it
 +   is patched.  DOS 3.1 through 3.31 contain a zero-terminated list of
 +   words beginning at offset 02C3h in the IBMDOS segment; each word
 +   contains the offset within the IBMDOS segment of a byte which must
 +   be changed from C3h to 50h to enable use of critical sections.
 +SeeAlso: AH=81h,AH=82h,AH=87h,INT 21/AX=5D06h,INT 21/AX=5D0Bh
 +----------2A81-------------------------------
 +INT 2A - NETWORK - END DOS CRITICAL SECTION
 + AH = 81h
 + AL = critical section number (00h-0Fh) (see AH=80h)
 +Notes: normally hooked rather than called
 + the handler should reawaken any tasks which were suspended due to an
 +   attempt to enter the specified critical section
 +SeeAlso: AH=80h,AH=82h,AH=87h
 +----------2A82-------------------------------
 +INT 2A - NETWORK - END DOS CRITICAL SECTIONS 0 THROUGH 7
 + AH = 82h
 +Notes: called by the INT 21h function dispatcher for function 0 and functions
 +   greater than 0Ch except 59h, and on process termination
 + the handler should reawaken any tasks which were suspended due to an
 +   attempt to enter one of the critical sections 0 through 7
 +SeeAlso: AH=81h
 +----------2A84-------------------------------
 +INT 2A - Microsoft Networks - KEYBOARD BUSY LOOP
 + AH = 84h
 +Note: similar to DOS's INT 28h, called from inside the DOS keyboard input
 +   loop to allow network to process requests
 +SeeAlso: INT 28
 +----------2A87-------------------------------
 +INT 2A - PRINT??? - CRITICAL SECTION
 + AH = 87h
 + AL = start/end
 +     00h start
 +     01h end
 +Note: called by PRINT.COM
 +SeeAlso: AH=80h,AH=81h
 +----------2A89-------------------------------
 +INT 2A - Network - ???
 + AH = 89h
 + AL = ???  (ASSIGN uses 08h)
 + ???
 +Return: ???
 +----------2A90-------------------------------
 +INT 2A - IBM PC 3270 EMULATION PROGRAM - ???
 + AH = 90h
 + ???
 +Return: ???
 +Note: the LANtastic redirector and SERVER.EXE use this function with AL=01h,
 +   03h-07h,0Ch-11h
 +----------2AC2-------------------------------
 +INT 2A - Network - ???
 + AH = C2h
 + AL = subfunction
 +     07h ???
 +     08h ???
 + BX = 0001h
 + ???
 +Return: ???
 +Note: called by DOS 3.30-5.00 APPEND
 +----------2AFF90-----------------------------
 +INT 2A - PC/TCP PREDIR.EXE - ???
 + AX = FF90h
 +Return: AX = ???
 +Note: PREDIR.EXE is the network printer redirector included as part of the
 +   PC/TCP system by FTP Software, Inc.
 +----------2AFF91-----------------------------
 +INT 2A - PC/TCP PREDIR.EXE - ???
 + AX = FF91h
 + BX = ???
 +Return: AX = status???
 +----------2AFF92-----------------------------
 +INT 2A - PC/TCP PREDIR.EXE - INSTALLATION CHECK
 + AX = FF92h
 +Return: AX = 0000h if installed
 +    BX = redirected printer port (FFFFh if no printers redirected)
 +    CX = version (CH = major, CL = minor)
 +Note: PREDIR.EXE is the network printer redirector included as part of the
 +   PC/TCP system by FTP Software, Inc.
 +----------2AFF93-----------------------------
 +INT 2A - PC/TCP PREDIR.EXE - ???
 + AX = FF93h
 +Return: AX = ???
 +----------2AFF94-----------------------------
 +INT 2A - PC/TCP PREDIR.EXE - ???
 + AX = FF94h
 + BX = ???
 + CX = ???
 + DX = ???
 +Return: AX = ???
 +Note: PREDIR.EXE is the network printer redirector included as part of the
 +   PC/TCP system by FTP Software, Inc.
 +----------2AFF95-----------------------------
 +INT 2A - PC/TCP PREDIR.EXE - GET CONFIGURATION STRINGS
 + AX = FF95h
 + CX = what to get
 +     0000h ??? (returned pointer to "C:\COMMAND.COM")
 +     0001h spooling program
 +     0002h ???
 +     0003h spool file name
 +     0004h swap file name
 +Return: AX = status
 +     0000h successful
 + BX:DX -> ASCIZ configuration string
 +----------2AFF96-----------------------------
 +INT 2A - PC/TCP PREDIR.EXE - SET PRINT JOB TERMINATION CONFIGURATION
 + AX = FF96h
 + CX = what to set
 +     0000h ???
 +     0001h print-on-hotkey state
 +     0002h print-on-exit state
 +     0003h print job timeout in clock ticks
 +     0004h print-on-EOF state
 + BX = new value (0000h disabled, 0001h enabled except for timeout)
 +Return: AX = ???
 +SeeAlso: AX=FF97h
 +Note: PREDIR.EXE is the network printer redirector included as part of the
 +   PC/TCP system by FTP Software, Inc.
 +----------2AFF97-----------------------------
 +INT 2A - PC/TCP PREDIR.EXE - GET PRINT JOB TERMINATION CONFIGURATION
 + AX = FF97h
 + CX = what to get
 +     0000h ???
 +     0001h print-on-hotkey state
 +     0002h print-on-exit state
 +     0003h print job timeout in clock ticks
 +     0004h print-on-EOF state
 +Return: AX = status
 +     0000h successful
 + BX = old value (0000h disabled, 0001 enabled except for timeout)
 +SeeAlso: AX=FF96h
 +----------2B---------------------------------
 +INT 2B - DOS 2+ - RESERVED
 +Note: this vector is not used in DOS versions <= 5.00, and points at an IRET
 +----------2C---------------------------------
 +INT 2C - DOS 2+ - RESERVED
 +Note: this vector is not used in DOS versions <= 5.00, and points at an IRET
 +----------2C---------------------------------
 +INT 2C - STARLITE architecture - KERNEL API
 +Note: STARLITE is an architecture by General Software for a series of MS-DOS
 +   compatible operating systems (OEM DOS, NETWORK DOS, and SMP DOS) to
 +   be released in 1991. The interrupt number is subject to change
 +   before the actual release.
 +----------2D---------------------------------
 +INT 2D - DOS 2+ - RESERVED
 +Note: this vector is not used in DOS versions <= 5.00, and points at an IRET
 +----------2D---------------------------------
 +INT 2D - ALTERNATE MULTIPLEX INTERRUPT SPECIFICATION (AMIS) [proposal v3.4]
 + AH = multiplex number
 + AL = function
 +     00h installation check
 + Return: AL = FFh if multiplex number in use
 +     CX = version number (CH = major, CL = minor)
 +     DX:DI -> signature string (see below) identifying
 +     the program using the multiplex number
 + AL = 00h if free
 +     01h get entry point
 + Return: AL = FFh if entry point supported
 +     DX:BX -> entry point for bypassing interrupt chain
 + AL = 00h if all API calls via INT 2D
 +     02h uninstall
 +     DX:BX = return address for successful uninstall (may be
 + ignored by TSR)
 + Return: AL = status
 +     00h not implemented
 +     01h unsuccessful
 +     02h can not uninstall yet, will do so when able
 +     03h safe to remove, but no resident uninstaller
 +     (TSR still enabled)
 +     BX = segment of memory block with resident code
 +     04h safe to remove, but no resident uninstaller
 +     (TSR now disabled)
 +     BX = segment of memory block with resident code
 +     05h not safe to remove now, try again later
 +     FFh successful
 + return at DX:BX with AX destroyed if successful and
 +   TSR honors specific return address
 +     03h request pop-up
 + Return: AL = status
 +     00h not implemented or TSR is not a pop-up
 +     01h can not pop up at this time, try again later
 +     02h can not pop up yet, will do so when able
 +     03h already popped up
 +     04h unable to pop up, user intervention required
 +     BX = standard reason code
 +     0000h unknown failure 
 +     0001h interrupt chain passes through memory
 +       which must be swapped out to pop up
 +     0002h swap-in failed
 + CX = application's reason code if nonzero
 +     FFh TSR popped up and was exited by user
 + BX = return value
 +     0000h no return value
 +     0001h TSR unloaded
 +     0002h-00FFh reserved
 +     0100h-FFFFh application-dependent
 +     04h determine chained interrupts
 +     BL = interrupt number (except 2Dh)
 + Return: AL = status
 +     00h not implemented
 +     01h unable to determine
 +     02h interrupt hooked
 +     03h interrupt hooked, address returned
 +     DX:BX -> TSR's interrupt BL handler
 +     04h list of hooked interrupts returned
 +     DX:BX -> interrupt hook list (see below)
 +     FFh interrupt not hooked
 + Notes: since INT 2D is known to be hooked, the resident code
 +   need not test for BL=2Dh (to minimize its size), and
 +   the return value is therefore undefined in that case.
 + BL is ignored if the TSR returns AL=04h; in that case,
 +   the caller needs to scan the return list rather than
 +   making additional calls to this function.  If the
 +   return is not 00h or 04h, then the caller must cycle
 +   through the remaining interrupt numbers it wishes to
 +   check.
 + return values 01h thru 03h are disparaged and may be
 +   removed from future versions of the specification;
 +   they are included for compatibility with version 3.3
 +     05h-0Fh reserved for future enhancements
 + Return: AL = 00h (not implemented)
 +     other  application-dependent
 +Notes: programs should not use fixed multiplex numbers; rather, a program
 +   should scan all multiplex numbers from 00h to FFh, remembering the
 +   first unused multiplex in case the program is not yet installed.
 +   For multiplex numbers which are in use, the program should compare
 +   the first 16 bytes of the signature string to determine whether it
 +   is already installed on that multiplex number.  If not previously
 +   installed, it should use the first free multiplex number.
 + functions other than 00h are not valid unless a program is installed
 +   on the selected multiplex number
 + to be considered fully compliant with version 3.4 of the specification,
 +   programs must implement at least functions 00h, 02h (no resident
 +   uninstall code required), and 04h (return value 04h).  The absolute
 +   minimum implementation has an overhead of 64 bytes plus 22 bytes per
 +   hooked interrupt (for the interrupt sharing protocol header and hook
 +   list entry).
 + the signature string and description may be used by memory mappers
 +   to display the installed programs
 + users of this proposal should adhere to the IBM interrupt sharing
 +   protocol (see below), which will permit removal of TSRs in
 +   arbitrary order and interrupt handler reordering.  All TSRs
 +   following this proposal should be removable, though they need not
 +   keep the code for removing themselves resident; it is acceptable
 +   for a separate program to perform the removal.
 + A sample implementation including example TSRs and utility programs
 +   may be found in a separate package distributed as AMISLnnn.ZIP
 +   (AMISL081.ZIP as of this writing).
 + Please let me know if you choose to follow this proposal.  A list of
 +   the private API calls you use would be appreciated, as well.
 +SeeAlso: INT 2F
 +
 +Format of signature string:
 +Offset Size Description
 + 00h  8 BYTEs blank-padded manufacturer's name (possibly abbreviated)
 + 08h  8 BYTEs blank-padded product name
 + 10h 64 BYTEs ASCIZ product description (optional, may be a single 00h)
 +Note: it is not necessary to reserve a full 64 bytes for the description,
 +   just enough to store the actual ASCIZ string
 +
 +Format of interrupt hook list [array]:
 +Offset Size Description
 + 00h BYTE interrupt number (last entry in array is 2Dh)
 + 01h WORD offset within hook list's segment of the interrupt handler
 +  this will point at the initial short jump of the interrupt
 + sharing protocol header (see below)
 +
 +Format of interrupt sharing protocol interrupt handler entry point:
 +Offset Size Description
 + 00h  2 BYTEs short jump to actual start of interrupt handler, immediately
 + following this data block (EBh 10h)
 + 02h DWORD address of next handler in chain
 + 06h WORD signature 424Bh
 + 08h BYTE EOI flag
 + 00h software interrupt or secondary hardware interrupt handler
 + 80h primary hardware interrupt handler (will issue EOI)
 + 09h  2 BYTEs short jump to hardware reset routine
 + must point at a valid FAR procedure (may be just RETF)
 + 0Bh  7 BYTEs reserved (0)
 +
 +Signatures known to be in use:
 + 'Crynwr  ' 'SPELLER '  TSR spelling-checker
 + 'heathh  ' 'Monitor '
 + 'Ralf B  ' 'FASTMOUS'  example TSR included with sample AMIS library code
 + 'Ralf B  ' 'NOLPT n '  example TSR -- turn LPTn into bit-bucket
 + 'Ralf B  ' 'NOTE    '  example TSR -- popup note-taker
 + 'Ralf B  ' 'SWITCHAR'  example TSR -- add switchar() support removed from DOS5
 + 'Ralf B  ' 'VGABLANK'  example TSR -- VGA-only screen blanker
 + 'TifaWARE' 'EATMEM  ' George A. Theall's public domain memory restrictor for
 +  testing programs (v1.1+)
 +     'RECALL  ' public domain commandline editor and history (v1.2+)
 +----------2E---------------------------------
 +INT 2E - DOS 2+ - PASS COMMAND TO COMMAND INTERPRETER FOR EXECUTION
 + DS:SI -> commandline to execute (see below)
 +Return: all registers except CS:IP destroyed
 + AX = status (4DOS v4.0)
 +    0000h successful
 +    FFFFh error before processing command (not enough memory, etc)
 +    other error number returned by command
 +Notes: this call allows execution of arbitrary commands (including COMMAND.COM
 +   internal commands) without loading another copy of COMMAND.COM
 + if COMMAND.COM is the user's command interpreter, the primary copy
 +   executes the command; this allows the master environment to be
 +   modified by issuing a "SET" command, but changes in the master
 +   environment will not become effective until all programs descended
 +   from the primary COMMAND.COM terminate
 + since COMMAND.COM processes the string as if typed from the keyboard,
 +   the transient portion needs to be present, and the calling program
 +   must ensure that sufficient memory to load the transient portion can
 +   be allocated by DOS if necessary
 + results are unpredictable if invoked by a program run from a batch file
 +   because this call is not reentrant and COMMAND.COM uses the same
 +   internal variables when processing a batch file
 + hooked but ignored by 4DOS v3.0 COMMAND.COM replacement unless SHELL2E
 +   has been loaded
 +
 +Format of commandline:
 +Offset Size Description
 + 00h BYTE length of command string, not counting trailing CR
 + 01h var command string
 +  N BYTE 0Dh (CR)
 +----------2E----BXE22E-----------------------
 +INT 2E - 4DOS v2.x-3.03 SHELL2E.COM - UNINSTALL
 + BX = E22Eh
 + DS:SI -> zero byte
 +Return: if successful, SHELL2E terminates itself with INT 21/AH=4Ch
 +----------2F---------------------------------
 +INT 2F - Multiplex - NOTES
 + AH = identifier of program which is to handle the interrupt
 +    00h-7Fh reserved for DOS
 +    C0h-FFh reserved for applications
 + AL is the function code
 +   This is a general mechanism for verifying the presence of a TSR and 
 +   communicating with it.  When searching for a free identifier code for AH
 +   using the installation check (AL=00h), the calling program should set
 +   BX/CX/DX to 0000h and must not depend on any registers other than CS:IP
 +   and SS:SP to be valid on return, since numerous programs now use additional
 +   registers on input and/or output for the installation check.
 +Note: Since the multiplex chain is growing so long, and beginning to
 +   experience multiplex number collisions, I am proposing an alternate
 +   multiplex interrupt on INT 2D.  If you decide to use the alternate
 +   multiplex, please let me know.
 +SeeAlso: INT 2D
 +----------2F---------------------------------
 +INT 2F - BMB Compuscience Canada Utilities Interface
 + AH = xx (dynamically assigned based upon a search for a multiplex
 + number which doesn't answer installed)
 + AL = 00h installation check
 + ES:DI = EBEBh:BEBEh
 +Return: AL = 00h not installed
 +      01h not installed, not OK to install
 +      FFh installed; if ES:DI was EBEBh:BEBEh on entry, ES:DI will point
 + to a string of the form 'MMMMPPPPPPPPvNNNN' where MMMM is a
 + short form of the manufacturer's name, PPPPPPPP is a product
 + name and NNNN is the product's version number
 +----------2F---------------------------------
 +INT 2F - Ross Wentworth's Turbo Pascal POPUP LIBRARY
 + AH = programmer-selected multiplex number
 + AL = function
 +     00h installation check
 + Return: AL = FFh if installed
 +     01h get TSR interrupt vectors
 + Return: DX:AX -> vector table (see below)
 +     02h get TSR code segment
 + Return: AX = code segment for all interrupt handlers
 +     03h call user exit routine and release TSR's memory
 +     04h get signature string
 + Return: DX:AX -> counted string containing signature
 +     05h get TSR's INT 2F handler
 + Return: DX:AX -> INT 2F handler
 +     06h enable/disable TSR
 + BL = new state (00h disabled, 01h enabled)
 +     07h activate TSR (popup if not disabled)
 +     08h get hotkeys
 + BL = which hotkey (00h = hotkey 1, 01h = hotkey 2)
 + Return: AX = hotkey (AH = keyflags, AL = scancode)
 +     09h set hotkey
 + BL = which hotkey (00h = hotkey 1, 01h = hotkey 2)
 + CX = new hotkey (CH = keyflags, CL = scancode)
 +     0Ah-1Fh reserved
 +
 +Format of vector table entry:
 +Offset Size Description
 + 00h BYTE vector number (00h = end of table)
 + 01h DWORD original vector
 + 05h WORD offset of interrupt handler in TSR's code segment
 +----------2F---------------------------------
 +INT 2F - CiriSOFT Spanish University of Valladolid TSR's Interface
 + AH = xx (dynamically assigned based upon a search for a multiplex
 + number from C0h to FFh which doesn't answer installed)
 + AL = 00h installation check
 + ES:DI = 1492h:1992h
 +Return: AL = 00h not installed
 +      01h not installed, not OK to install
 +      FFh installed; and if ES:DI was 1492h:1992h on entry, ES:DI will
 + point to author_name_ver table (see below)
 + AH = FFh
 +Note: this interface permits advanced communication with TSRs: it is possible
 +   to make a generic unistall utility, advanced TSR relocator programs
 +   in order to fit fragmented memory areas, etc.
 +See also: INT 2D"AMIS",INT 2F"Compuscience"
 +
 +Format of author_name_ver table:
 +Offset Size Description
 + -16 WORD segment in which really begins the TSR code (CS in programs
 + with PSP, XMS upper memory segment if installed as UMB...)
 + -14 WORD offset in which really begins the TSR code (frecuently 100h
 + in *.COM programs and 0 in upper memory TSR's).
 + -12 WORD memory used by TSR (in paragraphs). Knowing the memory area
 + used by TSR is possible to determine if hooked vectors are
 + still pointing it (and if it is safe the unistall process).
 + -10 BYTE characteristics byte
 + bits 0-2: 000 normal program (with PSP)
 +   001 upper XMS memory block (needed HIMEM.SYS function
 +       to free memory when unistalling)
 +   010 device driver (*.SYS)
 +   011 device driver in EXE format
 +   1xx others (reserved)
 + bits 3-6 reserved
 + bit 7 set if extra_table defined and supported
 + -9 BYTE number of multiplex entry used (redefinition available). Note
 + that the TSR must be use THIS variable in it's INT 2Fh handler.
 + -8 WORD offset to vector_area table (see bellow)
 + -6 WORD offset to extra_area table (see bit 7 in offset -10 and bellow)
 + -4   4 BYTEs "*##*" (to insure that the TSR verify this agreement)
 + 00h var "AUTHOR:PROGRAM_NAME:VERSION",0 (variable length, this area
 + is used in order to determine if the TSR is already resident
 + and it's version code; the ':' char is used as delimiter)
 +
 +Format of vector_area table:
 +Offset Size Description
 + -1 BYTE number of vectors intercepted by TSR
 + 00h BYTE first vector number
 + 01h DWORD first vector pointer before installing the TSR
 + 05h BYTE second vector number
 + 06h DWORD second vector pointer before installing the TSR
 +  .   . (and so on) Note that the TSR must be use THIS variables to
 + invoke previous interrupt handler routines.
 +
 +Format of extra_area table (needed only to improve relocation feature):
 +Offset Size Description
 + 00h WORD offset to external_ctrl table (0 if not supported)
 + 02h WORD reserved for future use (0)
 +
 +Format of external_ctrl table:
 +Offset Size Description
 + 00h BYTE bit 0: TSR is relocatable (no absolute segment references)
 + 01h WORD offset to a variable which can activate/inhibit the TSR
 + ---And if bit 0 in offset 00h is off:
 + 03h DWORD pointer to ASCIIZ with pathname to executable file which
 + supports /SR parameter (silent installation & inhibit)
 + 07h DWORD pointer to first variable to initialize on the copy reloaded
 + from the previous TSR still resident
 + 0Bh DWORD pointer to last variable (all variables packed in one block)
 +----------2F00-------------------------------
 +INT 2F U - DOS 2.x PRINT.COM - ???
 + AH = 00h
 + ???
 +Return: ???
 +Notes: DOS 2.x PRINT.COM does not chain to previous INT 2F handler
 + values in AH other than 00h or 01h cause PRINT to return the number of
 +   files in the queue in AH
 +SeeAlso: AH=01h
 +----------2F0080-----------------------------
 +INT 2F - DOS 3.1+ PRINT.COM - GIVE PRINT A TIME SLICE
 + AX = 0080h
 +Return: after PRINT executes
 +----------2F01-------------------------------
 +INT 2F U - DOS 2.x PRINT.COM - ???
 + AH = 01h
 + ???
 +Return: ???
 +Notes: DOS 2.x PRINT.COM does not chain to previous INT 2F handler
 + values in AH other than 00h or 01h cause PRINT to return the number of
 +   files in the queue in AH
 +SeeAlso: AH=00h
 +----------2F0100-----------------------------
 +INT 2F - DOS 3+ PRINT.COM - INSTALLATION CHECK
 + AX = 0100h
 +Return: AL = status
 +     00h not installed
 +     01h not installed, but not OK to install
 +     FFh installed
 +SeeAlso: AX=0101h
 +----------2F0101-----------------------------
 +INT 2F - DOS 3+ PRINT.COM - SUBMIT FILE FOR PRINTING
 + AX = 0101h
 + DS:DX -> submit packet (see below)
 +Return: CF clear if successful
 +     AL = 01h added to queue
 + 9Eh now printing
 + CF set on error
 +     AX = error code (see also INT 21/AH=59h)
 + 01h invalid function
 + 02h file not found
 + 03h path not found
 + 04h out of file handles
 + 05h access denied
 + 08h print queue full
 + 09h spooler busy
 + 0Ch name too long
 + 0Fh invalid drive
 +SeeAlso: AX=0102h
 +
 +Format of submit packet:
 +Offset Size Description
 + 00h BYTE level (must be 00h)
 + 01h DWORD pointer to ASCIZ filename (no wildcards)
 +----------2F0102-----------------------------
 +INT 2F - DOS 3+ PRINT.COM - REMOVE FILE FROM PRINT QUEUE
 + AX = 0102h
 + DS:DX -> ASCIZ filename (wildcards allowed)
 +Return: CF clear if successful
 + CF set on error
 +     AX = error code (see AX=0101h)
 +SeeAlso: AX=0101h,AX=0103h
 +----------2F0103-----------------------------
 +INT 2F - DOS 3+ PRINT.COM - CANCEL ALL FILES IN PRINT QUEUE
 + AX = 0103h
 +Return: CF clear if successful
 + CF set on error
 +     AX = error code (see AX=0101h)
 +SeeAlso: AX=0102h
 +----------2F0104-----------------------------
 +INT 2F - DOS 3+ PRINT.COM - FREEZE PRINT QUEUE TO READ JOB STATUS
 + AX = 0104h
 +Return: CF clear if successful
 +     DX = error count
 +     DS:SI -> print queue
 + CF set on error
 +     AX = error code (see AX=0101h)
 +Notes: the print queue is an array of 64-byte ASCIZ filenames terminated by
 +   an empty filename; the first name is the file currently being printed
 + printing is stopped until AX=0105h is called to prevent the queue
 +   from changing while the filenames are being read
 +SeeAlso: AX=0101h,AX=0105h
 +----------2F0105-----------------------------
 +INT 2F - DOS 3+ PRINT.COM - RESTART PRINT QUEUE AFTER STATUS READ
 + AX = 0105h
 +Return: CF clear if successful
 + CF set on error
 +     AX = error code (see AX=0101h)
 +SeeAlso: AX=0104h
 +----------2F0106-----------------------------
 +INT 2F - DOS 3.3+ PRINT.COM - GET PRINTER DEVICE
 + AX = 0106h
 +Return: CF set if files in print queue
 +     AX = error code 0008h (queue full)
 +     DS:SI -> device driver header
 + CF clear if print queue empty
 +     AX = 0000h
 +Note: documented for DOS 5+, but not documented for prior versions
 +SeeAlso: AX=0104h
 +----------2F0200-----------------------------
 +INT 2F U - PC LAN PROGRAM REDIR/REDIRIFS internal - INSTALLATION CHECK
 + AX = 0200h
 +Return: AL = FFh if installed
 +----------2F0201-----------------------------
 +INT 2F U - PC LAN PROGRAM REDIR/REDIRIFS internal - ???
 + AX = 0201h
 +Return: nothing???
 +Notes: called by DOS 3.3+ PRINT.COM
 + AX=0202h appears to be the opposite function
 +SeeAlso: AX=0202h
 +----------2F0202-----------------------------
 +INT 2F U - PC LAN PROGRAM REDIR/REDIRIFS internal - ???
 + AX = 0202h
 + ???
 +Return: nothing???
 +Note: called by DOS 3.3+ PRINT.COM
 +SeeAlso: AX=0201h
 +----------2F0203-----------------------------
 +INT 2F U - PC LAN PROGRAM REDIR/REDIRIFS internal - ???
 + AX = 0203h
 +Return: nothing???
 +Notes: called by DOS 3.3+ PRINT.COM
 + AX=0204h appears to be the opposite function
 +SeeAlso: AX=0204h
 +----------2F0204-----------------------------
 +INT 2F U - PC LAN PROGRAM REDIR/REDIRIFS internal - ???
 + AX = 0204h
 + ???
 +Return: nothing???
 +Note: called by DOS 3.3 PRINT.COM
 +----------2F---------------------------------
 +INT 2F U - PC LAN PROGRAM REDIR/REDIRIFS internal - ???
 + AX = 02xxh
 + ???
 +Return: ???
 +----------2F0500-----------------------------
 +INT 2F U - DOS 3+ CRITICAL ERROR HANDLER - INSTALLATION CHECK
 + AX = 0500h
 +Return: AL = 00h not installed, OK to install
 +      01h not installed, can't install
 +      FFh installed
 +Note: this set of functions allows a user program to partially or completely
 +   override the default critical error handler's message in COMMAND.COM
 +SeeAlso: AH=05h,INT 24
 +----------2F05-------------------------------
 +INT 2F U - DOS 3+ CRITICAL ERROR HANDLER - EXPAND ERROR INTO STRING
 + AH = 05h
 +---DOS 3.x---
 + AL = extended error code (not zero)
 +---DOS 4+ ---
 + AL = error type
 +     01h DOS extended error code
 +     02h parameter error
 + BX = error code
 +Return: CF clear if successful
 +     ES:DI -> ASCIZ error message (read-only)
 +     AL = ???
 + CF set if error code can't be converted to string
 +Notes: called at start of COMMAND.COM's default critical error handler if 
 +   installed by a user program, allowing partial or complete overriding
 +   of the default error message
 + subfunction 02h called by many DOS 4 external programs
 +SeeAlso: AX=122Eh,INT 24
 +----------2F0600-----------------------------
 +INT 2F - DOS v3.0+ ASSIGN - INSTALLATION CHECK
 + AX = 0600h
 +Return: AL = status
 +     00h not installed
 +     01h not installed, but not OK to install
 +     FFh installed
 +Note: ASSIGN is not a TSR in DR-DOS 5.0; it is internally replaced by SUBST
 +   (see INT 21/AX=2152h)
 +SeeAlso: AX=0601h,INT 21/AX=2152h
 +----------2F0601-----------------------------
 +INT 2F U - DOS v3.0+ ASSIGN - GET DRIVE ASSIGNMENT TABLE
 + AX = 0601h
 +Return: ES = segment of ASSIGN work area and assignment table
 +Note: under DOS 3+, the 26 bytes starting at ES:0103h specify which drive
 +   each of A: to Z: is mapped to.  Initially set to 01h 02h 03h....
 +SeeAlso: AX=0600h
 +----------2F0800-----------------------------
 +INT 2F U - DRIVER.SYS support - INSTALLATION CHECK
 + AX = 0800h
 +Return: AL = 00h not installed, OK to install
 +      01h not installed, not OK to install
 +      FFh installed
 +Note: supported by DR-DOS 5.0
 +----------2F0801-----------------------------
 +INT 2F U - DRIVER.SYS support - ADD NEW BLOCK DEVICE
 + AX = 0801h
 + DS:DI -> drive data table (see AX=0803h)
 +Notes: moves down internal list of drive data tables, copying and modifying
 +   the drive description flags word for tables referencing same physical
 +   drive
 + data table appended to chain of tables
 + supported by DR-DOS 5.0
 +SeeAlso: AX=0803h
 +----------2F0802-----------------------------
 +INT 2F U - DRIVER.SYS support - EXECUTE DEVICE DRIVER REQUEST
 + AX = 0802h
 + ES:BX -> device driver request header (see below)
 +Return: request header updated as per requested operation
 +Notes: supported by DR-DOS 5.0
 + DOS 3.2 executes this function on any AL value from 02h through F7h
 +
 +Format of device driver request header:
 +Offset Size Description
 + 00h BYTE length of request header
 + 01h BYTE subunit within device driver
 + 02h BYTE command code (see below)
 + 03h WORD status (filled in by device driver)
 + bit 15: error
 + bits 14-11: reserved
 + bit 10: ??? set by DOS kernel on entry to some driver calls
 + bit 9: busy
 + bit 8: done
 + bits 7-0: error code if bit 15 set (see below)
 +---DOS---
 + 05h  8 BYTEs reserved (unused in DOS 2.x and 3.x)
 +---STARLITE architecture---
 + 05h DWORD pointer to next request header
 + 09h  4 BYTEs reserved
 +---command code 00h---
 + 0Dh BYTE number of units (set by driver)
 + 0Eh DWORD address of first free byte following driver (set by driver)
 + 12h DWORD pointer to BPB array (set by block drivers only)
 + 16h BYTE (DOS 3+) drive number for first unit of block driver (0=A)
 +---command code 01h---
 + 0Dh BYTE media descriptor
 + 0Eh BYTE returned status
 + 00h don't know
 + 01h media has not changed
 + FFh media has been changed
 + 0Fh DWORD (DOS 3+) pointer to previous volume ID if OPEN/CLOSE/RM bit in
 +   device header set and disk changed (set by driver)
 +---command code 02h---
 + 0Dh BYTE media descriptor
 + 0Eh DWORD transfer address
 + -> scratch sector if NON-IBM FORMAT bit in device header set
 + -> first FAT sector otherwise
 + 12h DWORD pointer to BPB (set by driver)
 +---command codes 03h,0Ch--- (see also INT 21/AX=4402h,INT 21/AX=4403h)
 + 0Dh BYTE media descriptor (block devices only)
 + 0Eh DWORD transfer address
 + 12h WORD byte count (character devices) or sector count (block devices)
 + 14h WORD starting sector number (block devices only)
 + 16h DWORD (DOS 3+) pointer to volume label if error 0Fh (set by driver)
 +---command codes 04h,08h,09h---
 + 0Dh BYTE media descriptor (block devices only)
 + 0Eh DWORD transfer address
 + 12h WORD byte count (character devices) or sector count (block devices)
 + 14h WORD starting sector number (block devices only)
 + 16h DWORD (DOS 3+) pointer to volume ID if error 0Fh returned
 + 1Ah DWORD (DOS 4+) 32-bit starting sector number (block devices with
 + device attribute word bit 1 set only) (see INT 21/AH=52h)
 +---command code 05h---
 + 0Dh BYTE byte read from device if BUSY bit clear on return
 +---command codes 06h,07h,0Ah,0Bh,0Dh,0Eh,0Fh,85h,88h---
 + no further fields
 +---command code 10h---
 + 0Dh BYTE unused
 + 0Eh DWORD transfer address
 + 12h WORD byte count
 +---command codes 13h,19h---
 + 0Dh BYTE category code
 + 00h unknown
 + 01h COMn:
 + 03h CON
 + 05h LPTn:
 + 08h disk
 + 9Eh (STARLITE) Media Access Control driver
 + 0Eh BYTE function code
 + 00h (STARLITE) MAC Bind request
 + 0Fh WORD copy of DS at time of IOCTL call (apparently unused in DOS 3.3)
 + 11h WORD offset of device driver header
 + 13h DWORD pointer to parameter block from INT 21/AX=440Ch or AX=440Dh
 +---command codes 80h,82h---
 + 0Dh BYTE addressing mode
 + 00h HSG (default)
 + 01h Phillips/Sony Red Book
 + 0Eh DWORD transfer address (ignored for command 82h)
 + 12h WORD number of sectors to read
 + (if 0 for command 82h, request is an advisory seek)
 + 14h DWORD starting sector number
 + logical sector number in HSG mode
 + frame/second/minute/unused in Red Book mode
 + (HSG sector = minute * 4500 + second * 75 + frame - 150)
 + 18h BYTE data read mode
 + 00h cooked (2048 bytes per frame)
 + 01h raw (2352 bytes per frame, including EDC/ECC)
 + 19h BYTE interleave size (number of sectors stored consecutively)
 + 1Ah BYTE interleave skip factor (# sectors between consec portions)
 +---command code 83h---
 + 0Dh BYTE addressing mode (see above)
 + 0Eh DWORD transfer address (ignored)
 + 12h WORD number of sectors to read (ignored)
 + 14h DWORD starting sector number (see also above)
 +---command code 84h---
 + 0Dh BYTE addressing mode (see above)
 + 0Eh DWORD starting sector number (see also above)
 + 12h DWORD number of sectors to play
 +---command codes 86h,87h---
 + 0Dh BYTE addressing mode (see above)
 + 0Eh DWORD transfer address (ignored in write mode 0)
 + 12h WORD number of sectors to write
 + 14h DWORD starting sector number (see also above)
 + 18h BYTE write mode
 + 00h mode 0 (write all zeros)
 + 01h mode 1 (default) (2048 bytes per sector)
 + 02h mode 2 form 1 (2048 bytes per sector)
 + 03h mode 2 form 2 (2336 bytes per sector)
 + 19h BYTE interleave size (number of sectors stored consecutively)
 + 1Ah BYTE interleave skip factor (# sectors between consec portions)
 +
 +Values for command code:
 + 00h INIT
 + 01h MEDIA CHECK (block devices)
 + 02h BUILD BPB (block devices)
 + 03h IOCTL INPUT
 + 04h INPUT
 + 05h NONDESTRUCTIVE INPUT, NO WAIT (character devices)
 + 06h INPUT STATUS (character devices)
 + 07h INPUT FLUSH (character devices)
 + 08h OUTPUT
 + 09h OUTPUT WITH VERIFY
 + 0Ah OUTPUT STATUS (character devices)
 + 0Bh OUTPUT FLUSH (character devices)
 + 0Ch IOCTL OUTPUT
 + 0Dh (DOS 3+) DEVICE OPEN
 + 0Eh (DOS 3+) DEVICE CLOSE
 + 0Fh (DOS 3+) REMOVABLE MEDIA (block devices)
 + 10h (DOS 3+) OUTPUT UNTIL BUSY (character devices)
 + 11h unused
 + 12h unused
 + 13h (DOS 3.2+) GENERIC IOCTL
 + 14h unused
 + 15h unused
 + 16h unused
 + 17h (DOS 3.2+) GET LOGICAL DEVICE
 + 18h (DOS 3.2+) SET LOGICAL DEVICE
 + 19h (DOS 5.0+) CHECK GENERIC IOCTL SUPPORT
 + 80h (CD-ROM) READ LONG
 + 81h (CD-ROM) reserved
 + 82h (CD-ROM) READ LONG PREFETCH
 + 83h (CD-ROM) SEEK
 + 84h (CD-ROM) PLAY AUDIO
 + 85h (CD-ROM) STOP AUDIO
 + 86h (CD-ROM) WRITE LONG
 + 87h (CD-ROM) WRITE LONG VERIFY
 + 88h (CD-ROM) RESUME AUDIO
 +
 +Values for error code:
 + 00h write-protect violation
 + 01h unknown unit
 + 02h drive not ready
 + 03h unknown command
 + 04h CRC error
 + 05h bad drive request structure length
 + 06h seek error
 + 07h unknown media
 + 08h sector not found
 + 09h printer out of paper
 + 0Ah write fault
 + 0Bh read fault
 + 0Ch general failure
 + 0Dh reserved
 + 0Eh (CD-ROM) media unavailable
 + 0Fh invalid disk change
 +----------2F0803-----------------------------
 +INT 2F U - DOS 4+ DRIVER.SYS support - GET DRIVE DATA TABLE LIST
 + AX = 0803h
 +Return: DS:DI -> first drive data table in list
 +Note: not available under DR-DOS 5.0
 +SeeAlso: AX=0801h
 +
 +Format of DOS 3.30 drive data table:
 +Offset Size Description
 + 00h DWORD pointer to next table
 + 04h BYTE physical unit number (for INT 13)
 + 05h BYTE logical drive number
 + 06h 19 BYTEs BIOS Parameter Block (see also INT 21/AH=53h)
 + Offset Size Description
 + 00h WORD bytes per sector
 + 02h BYTE sectors per cluster, FFh if unknown
 + 03h WORD number of reserved sectors
 + 05h BYTE number of FATs
 + 06h WORD number of root dir entries
 + 08h WORD total sectors
 + 0Ah BYTE media descriptor, 00h if unknown
 + 0Bh WORD sectors per FAT
 + 0Dh WORD sectors per track
 + 0Fh WORD number of heads
 + 11h WORD number of hidden sectors
 + 19h BYTE flags
 + bit 6: 16-bit FAT instead of 12-bit FAT
 + 1Ah WORD number of DEVICE OPEN calls without corresponding DEVICE CLOSE
 + 1Ch 11 BYTEs volume label or "NO NAME    " if none (always "NO NAME" for
 + fixed media)
 + 27h BYTE terminating null for volume label???
 + 28h BYTE device type (see INT 21/AX=440Dh)
 + 29h WORD bit flags describing drive
 + bit 0: fixed media
 + bit 1: door lock supported
 + bit 2: ??? (used in determining BPB to set for INT 21/AX=440Dh)
 + bit 3: all sectors in a track are the same size
 + bit 4: physical drive has multiple logical units
 + bit 5: current logical drive for physical drive
 + bit 6: ???
 + bit 7: ???
 + bit 8: ??? (related to disk change detection)
 + 2Bh WORD number of cylinders
 + 2Dh 19 BYTEs BIOS Parameter Block for highest capacity supported
 + 40h  3 BYTEs ???
 + 43h  9 BYTEs filesystem type???, default = "NO NAME "
 + (apparently only MSDOS 3.30 fixed media, nulls for removable
 + media and PCDOS 3.30)
 + 4Ch BYTE least-significant byte of last-accessed cylinder number
 +---removable media---
 + 4Dh DWORD time of last access in clock ticks (FFFFFFFFh if never)
 +---fixed media---
 + 4Dh WORD partition (FFFFh = primary, 0001h = extended)
 + 4Fh WORD absolute cylinder number of partition's start on physical
 + drive (always FFFFh if primary partition)
 +
 +Format of COMPAQ DOS 3.31 drive data table:
 +Offset Size Description
 + 00h DWORD pointer to next table
 + 04h BYTE physical unit number (for INT 13)
 + 05h BYTE logical drive number
 + 06h 25 BYTEs BIOS Parameter Block (see DOS 4.01 drive data table below)
 + 1Fh  6 BYTEs ??? apparently always zeros
 + 25h BYTE flags
 + bit 6: 16-bit FAT instead of 12-bit FAT
 +     5: large volume???
 + 26h WORD device-open count???
 + 28h 11 BYTEs volume label or "NO NAME    " if none (always "NO NAME" for
 + fixed media)
 + 33h BYTE terminating null for volume label
 + 34h BYTE device type (see INT 21/AX=440Dh)
 + 35h WORD bit flags describing drive
 + 37h WORD number of cylinders
 + 39h 25 BYTEs BIOS parameter block for highest capacity drive supports
 + 52h  6 BYTEs ??? apparently always zeros
 + 58h BYTE least-significant byte of last-accessed cylinder number
 +---removable media---
 + 59h DWORD time of last access in clock ticks (FFFFFFFFh if never)
 +---fixed media---
 + 59h WORD partition (FFFFh = primary, 0001h = extended)
 + 5Bh WORD absolute cylinder number of partition's start on physical
 + drive (always FFFFh if primary partition)
 +
 +Format of DOS 4.0-5.0 drive data table:
 +Offset Size Description
 + 00h DWORD pointer to next table
 + 04h BYTE physical unit number (for INT 13)
 + 05h BYTE logical drive number
 + 06h 25 BYTEs BIOS Parameter Block (see also INT 21/AH=53h)
 + Offset Size Description
 + 00h WORD bytes per sector
 + 02h BYTE sectors per cluster, FFh if unknown
 + 03h WORD number of reserved sectors
 + 05h BYTE number of FATs
 + 06h WORD number of root dir entries
 + 08h WORD total sectors (see offset 15h if zero)
 + 0Ah BYTE media descriptor, 00h if unknown
 + 0Bh WORD sectors per FAT
 + 0Dh WORD sectors per track
 + 0Fh WORD number of heads
 + 11h DWORD number of hidden sectors
 + 15h DWORD total sectors if WORD at 08h is zero
 + 1Fh BYTE flags
 + bit 6: 16-bit FAT instead of 12-bit
 + 20h  2 BYTEs ???
 + 22h BYTE device type (see INT 21/AX=440Dh)
 + 23h WORD bit flags describing drive
 + bit 0: fixed media
 + bit 1: door lock supported
 + bit 2: ???
 + bit 3: all sectors in a track are the same size
 + bit 4: physical drive has multiple logical units
 + bit 5: current logical drive for physical drive
 + bit 6: ???
 + bit 7: ???
 + bit 8: ???
 + 25h WORD number of cylinders
 + 27h 25 BYTEs BIOS Parameter Block for highest capacity supported
 + 40h  7 BYTEs ???
 +---removable media---
 + 47h DWORD time of last access in clock ticks (FFFFFFFFh if never)
 +---fixed media, DOS 4.x---
 + 47h WORD partition (FFFFh = primary, 0001h = extended)
 + 49h WORD absolute cylinder number of partition's start on phys drive
 + (FFFFh if primary partition)
 +---fixed media, DOS 5.0---
 + 47h WORD ??? apparently always 0001h
 + 49h WORD absolute cylinder number of partition's start on phys drive
 +------
 + 4Bh 11 BYTEs volume label or "NO NAME    " if none (apparently taken from
 + extended boot record rather than root directory)
 + 56h BYTE terminating null for volume label???
 + 57h DWORD serial number
 + 5Bh  8 BYTEs filesystem type ("FAT12   " or "FAT16 ")
 + 63h BYTE terminating null for filesystem type???
 +----------2F0C00-----------------------------
 +INT 2F - AD-DOS - INSTALLATION CHECK
 + AX = 0C00h
 +Return: AL = FF if installed
 +     BX = 4144H ('AD')
 +     CX = 2D44H ('-D')
 +     DX = 4F53H ('OS')
 +Notes: AD-DOS is the DOS version of the After Dark screen blanker for
 +   MS Windows
 + AH=0Ch is the default multiplex number
 +SeeAlso: AX=0C01h
 +----------2F0C01ES0000-----------------------
 +INT 2F - AD-DOS - GET RESIDENT CODE SEGMENT
 + AX = 0C01h
 + ES = 0000h
 +Return: CF clear succesful
 +     ES = AD-DOS TSR Code Segment
 + CF set if failed
 +SeeAlso: AX=0C00h
 +----------2F0C02-----------------------------
 +INT 2F - AD-DOS - CHECK FOR NEW INPUT
 + AX = 0C02h
 +Return: BX = status
 +     0000h no input since last check
 +     0001h new input available
 +Note: this call also resets the new-input flag
 +----------2F0C03-----------------------------
 +INT 2F - AD-DOS - SET MINUTES TO WAIT
 + AX = 0C03h
 + BX = minutes to wait before blanking screen
 + CF set
 +Return: n/a???
 +Notes: AD-DOS is the DOS version of the After Dark screen blanker
 + AH=0Ch is the default multiplex number
 +SeeAlso: AX=0C04h
 +----------2F0C04-----------------------------
 +INT 2F - AD-DOS - GET MINUTES TO WAIT
 + AX = 0C04h
 + CF set
 +Return: BX = minutes to wait before blanking screen
 + ???
 +SeeAlso: AX=0C03h
 +----------2F0C05-----------------------------
 +INT 2F - AD-DOS - SET ENABLE??? FLAG
 + AX = 0C05h
 + BX = new state (0000h or 0001h) (default 0001h)
 + CF set
 +Return: n/a???
 +SeeAlso: AX=0C06h
 +----------2F0C06-----------------------------
 +INT 2F - AD-DOS - GET ENABLE??? FLAG
 + AX = 0C06h
 + Carry Set
 +Return: BX = current state of ??? flag (0000h or 0001h)
 + ???
 +Notes: AD-DOS is the DOS version of the After Dark screen blanker
 + AH=0Ch is the default multiplex number
 +SeeAlso: AX=0C05h
 +----------2F0C07-----------------------------
 +INT 2F - AD-DOS - SET HOT KEY
 + AX = 0C07h
 + BX = hot key
 + CL = hot key shift status
 + CF set
 +Return: n/a???
 +SeeAlso: AX=0C08h
 +----------2F0C08-----------------------------
 +INT 2F - AD-DOS - GET CURRENT HOT KEY
 + AX = 0C08h
 + CF set
 +Return: AX = status
 +     0000h successful
 + BX = Hot Key
 + CL = Hot Key Shift Status
 +     0008h otherwise
 +SeeAlso: AX=0C07h
 +----------2F0C09-----------------------------
 +INT 2F - AD-DOS - ???
 + AX = 0C09h
 + Carry Set
 +Return: AX = status
 +     0000h successful
 + ???
 +     0009h otherwise
 +Notes: AD-DOS is the DOS version of the After Dark screen blanker
 + AH=0Ch is the default multiplex number
 +----------2F0C0A-----------------------------
 +INT 2F - AD-DOS - ???
 + AX = 0C0Ah
 + CF set
 +Return: AX = status
 +     0000h successful
 + BH = ??
 + BL = ??
 +     000Ah failed
 +----------2F0C0B-----------------------------
 +INT 2F - AD-DOS - ???
 + AX = 0C0Bh
 + CF set
 +Return: AX = status 
 +     0000h successful
 +     000Bh failed
 +----------2F0C0C-----------------------------
 +INT 2F - AD-DOS - SET ??? INTERNAL FLAG TO 01h
 + AX = 0C0Ch
 + CF set
 +Return: AX = status
 +     0000h successful
 +     000Ch failed
 +Notes: AD-DOS is the DOS version of the After Dark screen blanker
 + AH=0Ch is the default multiplex number
 +----------2F0C20-----------------------------
 +INT 2F - AD-DOS - GET AND RESET VxD API STATUS
 + AX = 0C20h
 + CF set
 +Return: AX = status
 +     0000h successful
 + BX = VxD API Status
 +     0000h no error
 +     0001h error
 +     0100h neither Windows 3.X enhanced mode nor
 + Windows/386 2.x is running
 +     0200h VM API entry point found
 +     0020h otherwise
 +Note: this call resets the VxD API Status to zero
 +SeeAlso: AX=1602h,AX=1607h
 +----------2F1000-----------------------------
 +INT 2F - SHARE - INSTALLATION CHECK
 + AX = 1000h
 +Return: AL = 00h  not installed, OK to install
 +      01h  not installed, not OK to install
 +      FFh  installed
 +BUGS: values of AL other than 00h put DOS 3.x SHARE into an infinite loop
 +   (08E9: OR  AL,AL
 +    08EB: JNZ 08EB) <- the buggy instruction (DOS 3.3)
 + values of AL other than described here put PCDOS 4.00 into the same
 +   loop (the buggy instructions are the same)
 +Notes: supported by OS/2 v1.3+ compatibility box, which always returns AL=FFh
 + if DOS 4.01 SHARE was automatically loaded, file sharing is in an
 +   inactive state (due to the undocumented /NC flag used by the autoload
 +   code) until this call is made
 + DOS 5.0 chains to the previous handler if AL <> 00h on entry
 +SeeAlso: AX=1080h,INT 21/AH=52h
 +----------2F1040-----------------------------
 +INT 2F U - DOS 4 only SHARE internal - ???
 + AX = 1040h
 + ???
 +Return: AL = FFh???
 +SeeAlso: AX=1000h
 +----------2F1080-----------------------------
 +INT 2F U - DOS 4 only SHARE internal - TURN ON FILE SHARING CHECKS
 + AX = 1080h
 +Return: AL = status
 +     F0h successful
 +     FFh checking was already on
 +Note: DOS 4.x SHARE has dual functions: FCB support for large (>32M) media
 +   and file sharing checks.  The undocumented commandline flag /NC can
 +   be used to disable the sharing code.
 +SeeAlso: AX=1000h,AX=1081h
 +----------2F1081-----------------------------
 +INT 2F U - DOS 4 only SHARE internal - TURN OFF FILE SHARING CHECKS
 + AX = 1081h
 +Return: AL = status
 +     F0h successful
 +     FFh checking was already off
 +Note: (see AX=1080h)
 +SeeAlso: AX=1000h,AX=1080h
 +----------2F10FF-----------------------------
 +INT 2F U - Multiplex - DR-DOS 5.0 - ???
 + AX = 10FFh
 + ES:BX -> ???
 +Note: sets pointer in kernel
 +----------2F1100-----------------------------
 +INT 2F - NETWORK REDIRECTOR - INSTALLATION CHECK
 + AX = 1100h
 +Return: AL = 00h  not installed, OK to install
 +      01h  not installed, not OK to install
 +      FFh  installed
 +Notes: called by DOS 3.1+ kernel
 + In DOS 4.x only, the 11xx calls are all in IFSFUNC.EXE, not in the
 +   PC LAN Program redirector; DOS 5.0 moves the calls back into the
 +   redirector
 +----------2F1100-----------------------------
 +INT 2F - MSCDEX (MS CD-ROM Extensions) - INSTALLATION CHECK
 + AX = 1100h
 + STACK: WORD DADAh
 +Return: AL = 00h not installed, OK to install
 + STACK unchanged
 +    = 01h not installed, not OK to install
 + STACK unchanged
 +    = FFh installed
 + STACK: WORD ADADh
 +----------2F1101-----------------------------
 +INT 2F U - NETWORK REDIRECTOR - REMOVE REMOTE DIRECTORY
 + AX = 1101h
 + SS = DOS DS
 + SDA first filename pointer -> fully-qualified directory name
 + SDA CDS pointer -> current directory structure for drive with dir
 +Return: CF set on error
 +     AX = DOS error code (see INT 21/AH=59h)
 + CF clear if successful
 +Note: called by DOS 3.1+ kernel
 +SeeAlso: AX=1103h,AX=1105h,INT 21/AH=3Ah,INT 21/AH=60h
 +----------2F1102-----------------------------
 +INT 2F U - IFSFUNC.EXE (DOS 4.x only) - REMOVE REMOTE DIRECTORY
 + AX = 1102h
 + SS = DOS DS
 + SDA first filename pointer -> fully-qualified directory name
 + SDA CDS pointer -> current directory structure for drive with dir
 +Return: CF set on error
 +     AX = DOS error code (see INT 21/AH=59h)
 + CF clear if successful
 +Note: appears to be identical to AX=1101h
 +SeeAlso: AX=1101h
 +----------2F1103-----------------------------
 +INT 2F U - NETWORK REDIRECTOR - MAKE REMOTE DIRECTORY
 + AX = 1103h
 + SS = DOS DS
 + SDA first filename pointer -> fully-qualified directory name
 + SDA CDS pointer -> current directory structure for drive with dir
 +Return: CF set on error
 +     AX = DOS error code (see INT 21/AH=59h)
 + CF clear if successful
 +Note: called by DOS 3.1+ kernel
 +SeeAlso: AX=1101h,AX=1105h,INT 21/AH=39h,INT 21/AH=60h
 +----------2F1104-----------------------------
 +INT 2F U - IFSFUNC.EXE (DOS 4.x only) - MAKE REMOTE DIRECTORY
 + AX = 1104h
 + SS = DOS DS
 + SDA first filename pointer -> fully-qualified directory name
 + SDA CDS pointer -> current directory structure for drive with dir
 +Return: CF set on error
 +     AX = DOS error code (see INT 21/AH=59h)
 + CF clear if successful
 +Note: appears to be identical to AX=1103h
 +SeeAlso: AX=1103h
 +----------2F1105-----------------------------
 +INT 2F U - NETWORK REDIRECTOR - CHDIR
 + AX = 1105h
 + SS = DOS DS
 + SDA first filename pointer -> fully-qualified directory name
 + SDA CDS pointer -> current directory structure for drive with dir
 +Return: CF set on error
 +     AX = DOS error code (see INT 21/AH=59h)
 + CF clear if successful
 +     CDS updated with new path
 +Notes: called by DOS 3.1+ kernel
 + directory string in CDS should not have a terminating backslash unless
 +   the current directory is the root
 +SeeAlso: AX=1101h,AX=1103h,INT 21/AH=3Bh,INT 21/AH=60h
 +----------2F1106-----------------------------
 +INT 2F U - NETWORK REDIRECTOR - CLOSE REMOTE FILE
 + AX = 1106h
 + ES:DI -> SFT
 +     SFT DPB field -> DPB of drive containing file
 +Return: CF set on error
 +     AX = DOS error code (see INT 21/AH=59h)
 + CF clear if successful
 +     SFT updated (except handle count, which DOS manages itself)
 +Note: called by DOS 3.1+ kernel
 +SeeAlso: AX=1201h,AX=1227h,INT 21/AH=3Eh
 +----------2F1107-----------------------------
 +INT 2F U - NETWORK REDIRECTOR - COMMIT REMOTE FILE
 + AX = 1107h
 + ES:DI -> SFT
 +     SFT DPB field -> DPB of drive containing file
 +Return: CF set on error
 +     AX = DOS error code (see INT 21/AH=59h)
 + CF clear if successful
 +     all buffers for file flushed
 +     directory entry updated
 +Note: called by DOS 3.1+ kernel
 +SeeAlso: INT 21/AH=68h,INT 21/AX=5D01h
 +----------2F1108-----------------------------
 +INT 2F U - NETWORK REDIRECTOR - READ FROM REMOTE FILE
 + AX = 1108h
 + ES:DI -> SFT
 +     SFT DPB field -> DPB of drive containing file
 + CX = number of bytes
 + SS = DOS DS
 + SDA DTA field -> user buffer
 +Return: CF set on error
 +     AX = DOS error code (see INT 21/AH=59h)
 + CF clear if successful
 +     CX = number of bytes read (0000h = end of file)
 +     SFT updated
 +Note: called by DOS 3.1+ kernel
 +SeeAlso: AX=1109h,AX=1229h,INT 21/AH=3Fh,INT 21/AX=5D06h
 +----------2F1109-----------------------------
 +INT 2F U - NETWORK REDIRECTOR - WRITE TO REMOTE FILE
 + AX = 1109h
 + ES:DI -> SFT
 +     SFT DPB field -> DPB of drive containing file
 + CX = number of bytes
 + SS = DOS DS
 + SDA DTA field -> user buffer
 +Return: CF set on error
 +     AX = DOS error code (see INT 21/AH=59h)
 + CF clear if successful
 +     CX = number of bytes written
 +     SFT updated
 +Note: called by DOS 3.1+ kernel
 +SeeAlso: AX=1107h,AX=1108h,INT 21/AH=40h,INT 21/AX=5D06h
 +----------2F110A-----------------------------
 +INT 2F U - NETWORK REDIRECTOR (DOS 3.x only) - LOCK REGION OF FILE
 + AX = 110Ah
 + BX = file handle
 + CX:DX = starting offset
 + SI = high word of size
 + STACK: WORD low word of size
 + ES:DI -> SFT
 +     SFT DPB field -> DPB of drive containing file
 + SS = DOS DS
 +Return: CF set on error
 +    AL = DOS error code (see INT 21/AH=59h)
 + STACK unchanged
 +Notes: called by DOS 3.10-3.31 kernel
 + the redirector is expected to resolve lock conflicts
 +SeeAlso: AX=110Bh,INT 21/AH=5Ch
 +----------2F110A-----------------------------
 +INT 2F U - NETWORK REDIRECTOR (DOS 4+) - LOCK/UNLOCK REGION OF FILE
 + AX = 110Ah
 + BL = function
 +     00h lock
 +     01h unlock
 + DS:DX -> parameter block (see below)
 + ES:DI -> SFT
 +     SFT DPB field -> DPB of drive containing file
 + SS = DOS DS
 +Return: CF set on error
 +    AL = DOS error code (see INT 21/AH=59h)
 +Notes: called by DOS 4.0+ kernel
 + the redirector is expected to resolve lock conflicts
 +SeeAlso: AX=110Bh,INT 21/AH=5Ch
 +
 +Format of parameter block:
 +Offset Size Description
 + 00h DWORD start offset
 + 04h DWORD size of region
 +----------2F110B-----------------------------
 +INT 2F U - NETWORK REDIRECTOR (DOS 3.x only) - UNLOCK REGION OF FILE
 + AX = 110Bh
 + BX = file handle
 + CX:DX = starting offset
 + SI = high word of size
 + STACK: WORD low word of size
 + ES:DI -> SFT for file
 +     SFT DPB field -> DPB of drive containing file
 +Return: CF set on error
 +    AL = DOS error code (see INT 21/AH=59h)
 + STACK unchanged
 +Note: called by DOS 3.1-3.31 kernel; DOS 4.0+ calls AX=110Ah instead
 +SeeAlso: AX=110Ah,INT 21/AH=5Ch
 +----------2F110C-----------------------------
 +INT 2F U - NETWORK REDIRECTOR - GET DISK SPACE
 + AX = 110Ch
 + ES:DI -> current directory structure for desired drive
 +Return: AL = sectors per cluster
 + AH = media ID byte
 + BX = total clusters
 + CX = bytes per sector
 + DX = number of available clusters
 +Note: called by DOS 3.1+ kernel
 +SeeAlso: INT 21/AH=36h
 +----------2F110D-----------------------------
 +INT 2F U - IFSFUNC.EXE (DOS 4.x only) - ???
 + AX = 110Dh
 + SDA first filename pointer -> name of file
 + ???
 +Return: ???
 +Note: appears to be similar to AX=110Fh
 +SeeAlso: AX=110Fh
 +----------2F110E-----------------------------
 +INT 2F U - NETWORK REDIRECTOR - SET REMOTE FILE'S ATTRIBUTES
 + AX = 110Eh
 + SS = DOS DS
 + SDA first filename pointer -> fully-qualified name of file
 + SDA CDS pointer -> current directory structure for drive with file
 + STACK: WORD new file attributes
 +Return: CF set on error
 +     AX = DOS error code (see INT 21/AH=59h)
 + CF clear if successful
 + STACK unchanged
 +Note: called by DOS 3.1+ kernel
 +SeeAlso: AX=110Fh,INT 21/AX=4301h,INT 21/AH=60h
 +----------2F110F-----------------------------
 +INT 2F U - NETWORK REDIRECTOR - GET REMOTE FILE'S ATTRIBUTES AND SIZE
 + AX = 110Fh
 + SS = DOS DS
 + SDA first filename pointer -> fully-qualified name of file
 + SDA CDS pointer -> current directory structure for drive with file
 +Return: CF set on error
 +     AX = DOS error code (see INT 21/AH=59h)
 + CF clear if successful
 +     AX = file attributes
 +     BX:DI = file size
 +Note: called by DOS 3.1+ kernel
 +SeeAlso: AX=110Eh,INT 21/AX=4300h,INT 21/AH=60h
 +----------2F1110-----------------------------
 +INT 2F U - IFSFUNC.EXE (DOS 4.x only) - ???
 + AX = 1110h
 + SDA first filename pointer -> name of file
 + ???
 +Return: ???
 +Note: appears to be similar to AX=110Eh
 +SeeAlso: AX=110Eh
 +----------2F1111-----------------------------
 +INT 2F U - NETWORK REDIRECTOR - RENAME REMOTE FILE
 + AX = 1111h
 + SS = DS = DOS DS
 + SDA first filename pointer = offset of fully-qualified old name
 + SDA second filename pointer = offset of fully-qualified new name
 + SDA CDS pointer -> current directory structure for drive with file
 +Return: CF set on error
 +     AX = DOS error code (see INT 21/AH=59h)
 + CF clear if successful
 +Note: called by DOS 3.1+ kernel
 +SeeAlso: INT 21/AH=56h,INT 21/AH=60h
 +----------2F1112-----------------------------
 +INT 2F U - IFSFUNC.EXE (DOS 4.x only) - ???
 + AX = 1112h
 + SS = DS = DOS DS
 + SDA first filename pointer -> name of file
 + ???
 +Return: ???
 +SeeAlso: AX=1111h
 +----------2F1113-----------------------------
 +INT 2F U - NETWORK REDIRECTOR - DELETE REMOTE FILE
 + AX = 1113h
 + SS = DS = DOS DS
 + SDA first filename pointer -> fully-qualified filename in DOS DS
 + SDA CDS pointer -> current directory structure for drive with file
 +Return: CF set on error
 +     AX = DOS error code (see INT 21/AH=59h)
 + CF clear if successful
 +Notes: called by DOS 3.1+ kernel
 + the filespec may contain wildcards
 +SeeAlso: INT 21/AH=41h,INT 21/AH=60h
 +----------2F1114-----------------------------
 +INT 2F U - IFSFUNC.EXE (DOS 4.x only) - ???
 + AX = 1114h
 + SDA first filename pointer -> name of file
 + ???
 +Return: ???
 +SeeAlso: AX=1113h
 +----------2F1115-----------------------------
 +INT 2F U - IFSFUNC.EXE (DOS 4.x only) - ???
 + AX = 1115h
 + SS = DOS DS
 + ES:DI -> SFT ???
 + ???
 +Return: ???
 +SeeAlso: AX=112Eh
 +----------2F1116-----------------------------
 +INT 2F U - NETWORK REDIRECTOR - OPEN EXISTING REMOTE FILE
 + AX = 1116h
 + ES:DI -> uninitialized SFT
 + SS = DOS DS
 + SDA first filename pointer -> fully-qualified name of file to open
 + STACK: WORD file open mode (see INT 21/AH=3Dh)
 +Return: CF set on error
 +     AX = DOS error code (see INT 21/AH=59h)
 + CF clear if successful
 +     SFT filled (except handle count, which DOS manages itself)
 + STACK unchanged
 +Note: called by DOS 3.1+ kernel
 +SeeAlso: AX=1106h,AX=1117h,AX=1118h,AX=112Eh,INT 21/AH=3Dh,INT 21/AH=60h
 +----------2F1117-----------------------------
 +INT 2F U - NETWORK REDIRECTOR - CREATE/TRUNCATE REMOTE FILE
 + AX = 1117h
 + ES:DI -> uninitialized SFT
 + SS = DOS DS
 + SDA first filename pointer -> fully-qualified name of file to open
 + SDA CDS pointer -> current directory structure for drive with file
 + STACK: WORD file creation mode
 + low byte = file attributes
 + high byte = 00h normal create, 01h create new file
 +Return: CF set on error
 +     AX = DOS error code (see INT 21/AH=59h)
 + CF clear if successful
 +     SFT filled (except handle count, which DOS manages itself)
 + STACK unchanged
 +Note: called by DOS 3.1+ kernel
 +SeeAlso: AX=1106h,AX=1116h,AX=1118h,AX=112Eh,INT 21/AH=3Ch,INT 21/AH=60h
 +----------2F1118-----------------------------
 +INT 2F U - NETWORK REDIRECTOR - CREATE/TRUNCATE FILE WITHOUT CDS
 + AX = 1118h
 + ES:DI -> uninitialized SFT
 + SS = DOS DS
 + SDA first filename pointer -> fully-qualified name of file
 + STACK: WORD file creation mode
 + low byte = file attributes
 + high byte = 00h normal create, 01h create new file
 +Return: ???
 + STACK unchanged
 +Note: called by DOS 3.1+ kernel when creating a file on a drive for which the
 +   SDA CDS pointer has offset FFFFh
 +SeeAlso: AX=1106h,AX=1116h,AX=1117h,AX=112Eh,INT 21/AH=60h
 +----------2F1119-----------------------------
 +INT 2F U - NETWORK REDIRECTOR - FIND FIRST FILE WITHOUT CDS
 + AX = 1119h
 + SS = DS = DOS DS
 + [DTA] = uninitialized 21-byte findfirst search data (see INT 21/AH=4Eh)
 + SDA first filename pointer -> fully-qualified search template
 + SDA search attribute = attribute mask for search
 +Return: CF set on error
 +     AX = DOS error code (see INT 21/AH=59h)
 + CF clear if successful
 +     [DTA] = updated findfirst search data
 +     (bit 7 of first byte must be set)
 +     [DTA+15h] = standard directory entry for file
 +Notes: called by DOS 3.1+ kernel
 + DOS 4.x IFSFUNC returns CF set, AX=0003h
 +----------2F111A-----------------------------
 +INT 2F U - IFSFUNC.EXE (DOS 4.x only) - ???
 + AX = 111Ah
 + ???
 +Return: CF set
 +     AX = error code (03h for DOS 4.01 IFSFUNC)
 +----------2F111B-----------------------------
 +INT 2F U - NETWORK REDIRECTOR - FINDFIRST
 + AX = 111Bh
 + SS = DS = DOS DS
 + [DTA] = uninitialized 21-byte findfirst search data (see INT 21/AH=4Eh)
 + SDA first filename pointer -> fully-qualified search template
 + SDA CDS pointer -> current directory structure for drive with file
 + SDA search attribute = attribute mask for search
 +Return: CF set on error
 +     AX = DOS error code (see INT 21/AH=59h)
 + CF clear if successful
 +     [DTA] = updated findfirst search data
 +     (bit 7 of first byte must be set)
 +     [DTA+15h] = standard directory entry for file
 +Note: called by DOS 3.1+ kernel
 +SeeAlso: AX=111Ch,INT 21/AH=4Eh,INT 21/AH=60h
 +----------2F111C-----------------------------
 +INT 2F U - NETWORK REDIRECTOR - FINDNEXT
 + AX = 111Ch
 + SS = DS = DOS DS
 + [DTA] = 21-byte findfirst search data (see INT 21/AH=4Eh)
 +Return: CF set on error
 +     AX = DOS error code (see INT 21/AH=59h)
 + CF clear if successful
 +     [DTA] = updated findfirst search data
 +     (bit 7 of first byte must be set)
 +     [DTA+15h] = standard directory entry for file
 +Note: called by DOS 3.1+ kernel
 +SeeAlso: AX=111Bh,INT 21/AH=4Fh
 +----------2F111D-----------------------------
 +INT 2F U - NETWORK REDIRECTOR - CLOSE ALL REMOTE FILES FOR PROCESS
 + AX = 111Dh
 + DS???
 + SS = DOS DS
 +Return: ???
 +Notes: called by DOS 3.1+ kernel
 + closes all FCBs opened by process
 +----------2F111E-----------------------------
 +INT 2F U - NETWORK REDIRECTOR - DO REDIRECTION
 + AX = 111Eh
 + SS = DOS DS
 + STACK: WORD function to execute
 + 5F00h  get redirection mode
 + BL = type (03h printer, 04h disk)
 + Return: BH = state (00h off, 01h on)
 + 5F01h  set redirection mode
 + BL = type (03h printer, 04h disk)
 + BH = state (00h off, 01h on)
 + 5F02h  get redirection list entry
 + BX = redirection list index
 + DS:SI -> 16-byte local device name buffer
 + ES:DI -> 128-byte network name buffer
 + Return: must set user's BX to device type and CX to
 + stored parameter value, using AX=1218h to get
 + stack frame address
 + 5F03h  redirect device
 + BL = device type (see INT 21/AX=5F03h)
 + CX = stored parameter value
 + DS:SI -> ASCIZ source device name
 + ES:DI -> destination ASCIZ network path + ASCIZ passwd
 + 5F04h  cancel redirection
 + DS:SI -> ASCIZ device name or network path
 + 5F05h  get redirection list extended entry
 + BX = redirection list index
 + DS:SI -> buffer for ASCIZ source device name
 + ES:DI -> buffer for destination ASCIZ network path
 + Return: BH = status flag
 + BL = type (03h printer, 04h disk)
 + CX = stored parameter value
 + BP = NETBIOS local session number
 + 5F06h  similar to 5F05h???
 +Return: CF set on error
 +     AX = error code (see INT 21/AH=59h)
 + STACK unchanged
 +Note: called by DOS 3.1+ kernel
 +SeeAlso: INT 21/AX=5F00h,INT 21/AX=5F01h,INT 21/AX=5F02h,INT 21/AX=5F03h
 +SeeAlso: INT 21/AX=5F04h,INT 21/AX=5F05h,INT 21/AX=5F06h
 +----------2F111F-----------------------------
 +INT 2F U - NETWORK REDIRECTOR - PRINTER SETUP
 + AX = 111Fh
 + STACK: WORD function
 + 5E02h  set printer setup
 + 5E03h  get printer setup
 + 5E04h  set printer mode
 + 5E05h  get printer mode
 +Return: CF set on error
 +     AX = error code (see INT 21/AH=59h)
 + STACK unchanged
 +Note: called by DOS 3.1+ kernel
 +SeeAlso: INT 21/AX=5E02h,INT 21/AX=5E03h,INT 21/AX=5E04h,INT 21/AX=5E05h
 +----------2F1120-----------------------------
 +INT 2F U - NETWORK REDIRECTOR - FLUSH ALL DISK BUFFERS
 + AX = 1120h
 + DS = DOS DS
 + ???
 +Return: CF clear (successful)
 +Notes: called by DOS 3.1+ kernel
 + uses CDS array pointer and LASTDRIVE= entries in DOS list of lists
 +SeeAlso: INT 21/AH=0Dh,INT 21/AX=5D01h
 +----------2F1121-----------------------------
 +INT 2F U - NETWORK REDIRECTOR - SEEK FROM END OF REMOTE FILE
 + AX = 1121h
 + CX:DX = offset (in bytes) from end
 + ES:DI -> SFT
 +     SFT DPB field -> DPB of drive with file
 + SS = DOS DS
 +Return: CF set on error
 +     AL = DOS error code (see INT 21/AH=59h)
 + CF clear if successful
 +     DX:AX = new file position
 +Note: called by DOS 3.1+ kernel
 +SeeAlso: AX=1228h,INT 21/AH=42h
 +----------2F1122-----------------------------
 +INT 2F U - NETWORK REDIRECTOR - PROCESS TERMINATION HOOK
 + AX = 1122h
 + SS = DOS DS
 + ???
 +Return: ???
 +Note: called by DOS 3.1+ kernel
 +----------2F1123-----------------------------
 +INT 2F U - NETWORK REDIRECTOR - QUALIFY REMOTE FILENAME
 + AX = 1123h
 + DS:SI -> ASCIZ filename to canonicalize
 + ES:DI -> 128-byte buffer for qualified name
 +Return: CF set if not resolved
 +Notes: called by MSDOS 3.1+ kernel, but not called by DRDOS 5.0 unless the
 +   filename matches the name of a character device
 + called first when DOS attempts to resolve a filename (unless inside an
 +   AX=5D00h server call); if this fails, DOS resolves the name locally
 +SeeAlso: AX=1221h,INT 21/AH=60h
 +----------2F1124-----------------------------
 +INT 2F U - NETWORK REDIRECTOR - PRINTER OFF???
 + AX = 1124h
 + ES:DI -> SFT
 + SS = DOS DS
 + ???
 +Return: CX = ???
 +Note: called by DOS 3.1+ kernel if AX=1126h returns CF set
 +SeeAlso: AX=1126h
 +----------2F1125-----------------------------
 +INT 2F U - NETWORK REDIRECTOR - REDIRECTED PRINTER MODE
 + AX = 1125h
 + STACK: WORD subfunction
 + 5D07h get print stream state
 + Return: DL = current state
 + 5D08h set print stream state
 + DL = new state
 + 5D09h finish print job
 +Return: CF set on error
 +     AX = error code (see INT 21/AH=59h)
 + STACK unchanged
 +Note: called by DOS 3.1+ kernel
 +SeeAlso: INT 21/AX=5D07h,INT 21/AX=5D08h,INT 21/AX=5D09h
 +----------2F1126-----------------------------
 +INT 2F U - NETWORK REDIRECTOR - PRINTER ON/OFF???
 + AX = 1126h
 + ES:DI -> SFT for file handle 4???
 + SS = DOS DS???
 + ???
 +Return: CF set on error
 +Notes: called by DOS 3.1+ kernel
 + called when print echoing (^P, ^PrtSc) changes state and STDPRN has
 +   bit 11 of the device information word in the SFT set
 +SeeAlso: AX=1124h
 +----------2F1127-----------------------------
 +INT 2F U - IFSFUNC.EXE (DOS 4.x only) - UNUSED
 + AX = 1127h
 +Return: CF set
 +     AX = 0001h (invalid function) (see INT 21/AH=59h)
 +----------2F1128-----------------------------
 +INT 2F U - IFSFUNC.EXE (DOS 4.x only) - UNUSED
 + AX = 1128h
 +Return: CF set
 +     AX = 0001h (invalid function) (see INT 21/AH=59h)
 +----------2F1129-----------------------------
 +INT 2F U - IFSFUNC.EXE (DOS 4.x only) - UNUSED
 + AX = 1129h
 +Return: CF set
 +     AX = 0001h (invalid function) (see INT 21/AH=59h)
 +----------2F112A-----------------------------
 +INT 2F U - IFSFUNC.EXE (DOS 4.x only) - ???
 + AX = 112Ah
 + DS = DOS DS
 + ???
 +Return: ???
 +Note: does something to each IFS driver
 +----------2F112B-----------------------------
 +INT 2F U - IFSFUNC.EXE (DOS 4.x only) - GENERIC IOCTL???
 + AX = 112Bh
 + SS = DOS DS
 + CX = function/category
 + DS:DX -> parameter block
 + STACK: WORD value of AX on entry to INT 21 (440Ch or 440Dh)
 + ???
 +Return: CF set on error
 +     AX = DOS error code (see INT 21/AH=59h)
 + CF clear if successful
 +Note: called by DOS 4.0 kernel
 +----------2F112C-----------------------------
 +INT 2F U - IFSFUNC.EXE (DOS 4.x only) - ???
 + AX = 112Ch
 + SS = DOS DS
 + SDA current SFT pointer -> SFT for file
 + ???
 +Return: CF set on error
 +----------2F112D-----------------------------
 +INT 2F U - IFSFUNC.EXE (DOS 4.x only) - ???
 + AX = 112Dh
 + BL = subfunction (value of AL on INT 21)
 +     04h truncate open file to zero length
 + ES:DI -> SFT for file
 + Return: CF clear
 +     else ???
 + Return: CX = ??? (00h or 02h for DOS 4.01)
 + ES:DI -> SFT
 + SS = DOS DS
 +Return: DS = DOS DS
 +Note: called by DOS 4.0 kernel on INT 21/AX=5702h,INT 21/AX=5703h,
 +   INT 21/AX=5704h
 +----------2F112E-----------------------------
 +INT 2F U - NETWORK REDIRECTOR (DOS 4+) - EXTENDED OPEN/CREATE FILE
 + AX = 112Eh
 + SS = DS = DOS DS
 + ES:DI -> uninitialized SFT for file
 + STACK: WORD file attribute for created/truncated file
 + low byte = file attributes
 + high byte = 00h normal create/open, 01h create new file
 + SDA first filename pointer -> fully-qualified filename
 + SDA extended file open action = action code (see INT 21/AX=6C00h)
 + SDA extended file open mode = open mode for file (see INT 21/AX=6C00h)
 +Return: CF set on error
 +     AX = error code
 + CF clear if successful
 +     CX = result code
 + 01h file opened
 + 02h file created
 + 03h file replaced (truncated)
 +     SFT initialized (except handle count, which DOS manages itself)
 +Note: called by DOS 4.0 kernel
 +SeeAlso: AX=1115h,AX=1116h,AX=1117h,INT 21/AX=6C00h
 +----------2F112F-----------------------------
 +INT 2F U - IFSFUNC.EXE (DOS 4.x only) - ???
 + AX = 112Fh
 + SS = DOS DS
 + STACK: WORD function in low byte
 + 00h ???
 +     DS:SI -> Current Directory Structure???
 +     CL = drive (1=A:)
 + 01h ???
 +     DS:SI -> ???
 +     CL = file handle???
 + 02h ???
 +     DS:SI -> Current Directory Structure???
 +     DI = ???
 +     CX = drive (1=A:)
 + ???
 +Return: CF set on error
 +     AX = DOS error code (see INT 21/AH=59h)
 + CF clear if successful
 +Note: called by DOS 4.0 kernel
 +SeeAlso: INT 21/AH=6Bh
 +----------2F1130-----------------------------
 +INT 2F U - IFSFUNC.EXE (DOS 4.x only) - GET IFSFUNC SEGMENT
 + AX = 1130h
 +Return: ES = CS of resident IFSFUNC
 +----------2F1186-----------------------------
 +INT 2F - LAN Manager Enhanced DOS API - DosReadAsynchNmPipe
 + AX = 1186h
 + ???
 +Return: ???
 +Note: LAN Manager enhance mode adds features beyond the standard redirector
 +   file/printer services
 +SeeAlso: AX=118Fh,INT 21/AX=5F39h
 +----------2F118A-----------------------------
 +INT 2F - LAN Manager 2.0 DOS Enhanced ENCRYPT.EXE - STREAM ENCRYPTION SERVICE
 + AX = 118Ah
 + ???
 +Return: ???
 +SeeAlso: AX=1186h,AH=41h,AH=42h,AH=4Bh
 +----------2F118F-----------------------------
 +INT 2F - LAN Manager Enhanced DOS API - DosWriteAsynchNmPipe
 + AX = 118Fh
 + ???
 +Return: ???
 +SeeAlso: AX=1186h,INT 21/AX=5F3Ah
 +----------2F1200-----------------------------
 +INT 2F U - DOS 3+ internal - INSTALLATION CHECK
 + AX = 1200h
 +Return: AL = FFh (for compatibility with other INT 2F functions)
 +----------2F1201-----------------------------
 +INT 2F U - DOS 3+ internal - CLOSE CURRENT FILE
 + AX = 1201h
 + SS = DOS DS
 + SDA current SFT pointer -> SFT of file to close
 +Return: CF set on error
 + BX???
 + CX new reference count of SFT
 + ES:DI -> SFT for file
 +SeeAlso: AX=1106h,AX=1227h,INT 21/AH=3Eh
 +----------2F1202-----------------------------
 +INT 2F U - DOS 3+ internal - GET INTERRUPT ADDRESS
 + AX = 1202h
 + STACK: WORD vector number
 +Return: ES:BX -> interrupt vector
 + STACK unchanged
 +----------2F1203-----------------------------
 +INT 2F U - DOS 3+ internal - GET DOS DATA SEGMENT
 + AX = 1203h
 +Return: DS = segment of IBMDOS.COM/MSDOS.SYS
 +----------2F1204-----------------------------
 +INT 2F U - DOS 3+ internal - NORMALIZE PATH SEPARATOR
 + AX = 1204h
 + STACK: WORD character to normalize
 +Return: AL = normalized character (forward slash turned to backslash, all
 + others unchanged)
 + ZF set if path separator
 + STACK unchanged
 +----------2F1205-----------------------------
 +INT 2F U - DOS 3+ internal - OUTPUT CHARACTER TO STANDARD OUTPUT
 + AX = 1205h
 + STACK: WORD character to output
 +Return: STACK unchanged
 +Note: can be called only from within DOS
 +----------2F1206-----------------------------
 +INT 2F U - DOS 3+ internal - INVOKE CRITICAL ERROR
 + AX = 1206h
 + DI = error code
 + BP:SI -> device driver header
 + SS = DOS DS
 + STACK: WORD value to be passed to INT 24 in AX
 +Return: AL = 0-3 for Abort, Retry, Ignore, Fail
 + STACK unchanged
 +SeeAlso: INT 24
 +----------2F1207-----------------------------
 +INT 2F U - DOS 3+ internal - MAKE DISK BUFFER MOST-RECENTLY USED
 + AX = 1207h
 + DS:DI -> disk buffer
 +Return: nothing
 +Notes: can be called only from within DOS
 + buffer is moved to end of buffer list (least-recently used is first)
 +SeeAlso: AX=120Fh
 +----------2F1208-----------------------------
 +INT 2F U - DOS 3+ internal - DECREMENT SFT REFERENCE COUNT
 + AX = 1208h
 + ES:DI -> SFT
 +Return: AX = original value of reference count
 +Note: if the reference count was 1, it is set to FFFFh (since 0 indicates
 +   that the SFT is not in use). It is the caller's responsibility to
 +   set the reference count to zero after cleaning up.
 +----------2F1209-----------------------------
 +INT 2F U - DOS 3+ internal - FLUSH AND FREE DISK BUFFER
 + AX = 1209h
 + DS:DI -> disk buffer
 +Return: disk buffer marked unused, contents written to disk if buffer dirty
 +Note: can be called only from within DOS
 +SeeAlso: AX=120Eh,AX=1215h
 +----------2F120A-----------------------------
 +INT 2F U - DOS 3+ internal - PERFORM CRITICAL ERROR INTERRUPT
 + AX = 120Ah
 + DS = SS = DOS DS
 + STACK: WORD extended error code
 +Return: AL = user response (0=ignore, 1=retry, 2=abort, 3=fail)
 + CF clear if retry, set otherwise
 + STACK unchanged
 +Notes: can only be called during a DOS function call, as it uses various
 +   fields in the SDA to set up the registers for the INT 24
 + reportedly sets current DPB's first root directory sector to 1
 +SeeAlso: INT 24
 +----------2F120B-----------------------------
 +INT 2F U - DOS 3+ internal - SIGNAL SHARING VIOLATION TO USER
 + AX = 120Bh
 + ES:DI -> system file table entry for previous open of file
 + STACK: WORD extended error code (should be 20h--sharing violation)
 +Return: CF clear if operation should be retried
 + CF set if operation should not be retried
 +     AX = error code (20h) (see INT 21/AH=59h)
 + STACK unchanged
 +Notes: can only be called during a DOS function call
 + should only be called if an attempt was made to open an already-open
 +   file contrary to the sharing rules
 + invokes INT 24 if SFT file opened via FCB or in compatibility mode with
 +   inheritance allowed
 +----------2F120C-----------------------------
 +INT 2F U - DOS 3+ internal - OPEN DEVICE AND SET SFT OWNER???
 + AX = 120Ch
 + SDA current SFT pointer -> SFT for file
 + DS = SS = DOS DS
 +Return: ES, DI, AX destroyed
 +Notes: invoked "device open" call on device driver for SFT
 + changes owner of last-accessed SFT to calling process if it was opened
 +   via FCB
 + called by network redirectors
 +----------2F120D-----------------------------
 +INT 2F U - DOS 3+ internal - GET DATE AND TIME
 + AX = 120Dh
 + SS = DOS DS
 +Return: AX = current date in packed format (see INT 21/AX=5700h)
 + DX = current time in packed format (see INT 21/AX=5700h)
 +SeeAlso: INT 21/AH=2Ah,INT 21/AH=2Ch
 +----------2F120E-----------------------------
 +INT 2F U - DOS 3+ internal - MARK ALL DISK BUFFERS UNREFERENCED
 + AX = 120Eh
 + SS = DOS DS
 +Return: DS:DI -> first disk buffer
 +Note: clears "referenced" flag on all disk buffers
 +SeeAlso: AX=1209h,AX=1210h,INT 21/AH=0Dh
 +----------2F120F-----------------------------
 +INT 2F U - DOS 3+ internal - MAKE BUFFER MOST RECENTLY USED
 + AX = 120Fh
 + DS:DI -> disk buffer
 + SS = DOS DS
 +Return: DS:DI -> next buffer in buffer list
 +Note: indicated buffer moved to end of chain
 +SeeAlso: AX=1207h
 +----------2F1210-----------------------------
 +INT 2F U - DOS 3+ internal - FIND UNREFERENCED DISK BUFFER
 + AX = 1210h
 + DS:DI -> first disk buffer to check
 +Return: ZF clear if found
 +     DS:DI -> first unreferenced disk buffer
 + ZF set if not found
 +SeeAlso: AX=120Eh
 +----------2F1211-----------------------------
 +INT 2F U - DOS 3+ internal - NORMALIZE ASCIZ FILENAME
 + AX = 1211h
 + DS:SI -> ASCIZ filename to normalize
 + ES:DI -> buffer for normalized filename
 +Return: destination buffer filled with uppercase filename, with slashes turned
 + to backslashes
 +SeeAlso: AX=121Eh,AX=1221h
 +----------2F1212-----------------------------
 +INT 2F U - DOS 3+ internal - GET LENGTH OF ASCIZ STRING
 + AX = 1212h
 + ES:DI -> ASCIZ string
 +Return: CX = length of string
 +SeeAlso: AX=1225h
 +----------2F1213-----------------------------
 +INT 2F U - DOS 3+ internal - UPPERCASE CHARACTER
 + AX = 1213h
 + STACK: WORD character to convert to uppercase
 +Return: AL = uppercase character
 + STACK unchanged
 +----------2F1214-----------------------------
 +INT 2F U - DOS 3+ internal - COMPARE FAR POINTERS
 + AX = 1214h
 + DS:SI = first pointer
 + ES:DI = second pointer
 +Return: ZF set if pointers are equal, ZF clear if not equal
 +----------2F1215-----------------------------
 +INT 2F U - DOS 3+ internal - FLUSH BUFFER
 + AX = 1215h
 + DS:DI -> disk buffer
 + SS = DOS DS
 + STACK: WORD drives for which to skip buffer
 + ignore buffer if drive same as high byte, or bytes differ and
 + the buffer is for a drive OTHER than that given in low byte
 +Return: STACK unchanged
 +Note: can be called only from within DOS
 +SeeAlso: AX=1209h
 +----------2F1216-----------------------------
 +INT 2F U - DOS 3+ internal - GET ADDRESS OF SYSTEM FILE TABLE
 + AX = 1216h
 + BX = system file table entry number
 +Return: CF clear if successful
 +     ES:DI -> system file table entry
 + CF set if BX greater than FILES=
 +SeeAlso: AX=1220h
 +----------2F1217-----------------------------
 +INT 2F U - DOS 3+ internal - GET CURRENT DIRECTORY STRUCTURE FOR DRIVE
 + AX = 1217h
 + SS = DOS DS
 + STACK: WORD drive (0 = A:, 1 = B:, etc)
 +Return: CF set on error
 +     (drive > LASTDRIVE)
 + CF clear if successful
 +     DS:SI -> current directory structure for specified drive
 + STACK unchanged
 +SeeAlso: AX=1219h
 +----------2F1218-----------------------------
 +INT 2F U - DOS 3+ internal - GET CALLER'S REGISTERS
 + AX = 1218h
 +Return: DS:SI -> saved caller's AX,BX,CX,DX,SI,DI,BP,DS,ES (on stack)
 +Note: only valid while within DOS
 +----------2F1219-----------------------------
 +INT 2F U - DOS 3+ internal - SET DRIVE???
 + AX = 1219h
 + SS = DOS DS
 + STACK: WORD drive (0 = default, 1 = A:, etc)
 +Return: ???
 + STACK unchanged
 +Notes: calls AX=1217h
 + builds a current directory structure if inside server call
 +   (INT 21/AX=5D00h)
 +SeeAlso: AX=1217h,AX=121Fh
 +----------2F121A-----------------------------
 +INT 2F U - DOS 3+ internal - GET FILE'S DRIVE
 + AX = 121Ah
 + DS:SI -> filename
 +Return: AL = drive (0 = default, 1 = A:, etc, FFh = invalid)
 + DS:SI -> filename without leading X: (if present)
 +SeeAlso: INT 21/AH=19h,INT 21/AH=60h
 +----------2F121B-----------------------------
 +INT 2F U - DOS 3+ internal - SET YEAR/LENGTH OF FEBRUARY
 + AX = 121Bh
 + CL = year - 1980
 +Return: AL = number of days in February
 +Note: requires DS to be set to the DOS code segment
 +SeeAlso: INT 21/AH=2Bh
 +----------2F121C-----------------------------
 +INT 2F U - DOS 3+ internal - CHECKSUM MEMORY
 + AX = 121Ch
 + DS:SI -> start of memory to checksum
 + CX = number of bytes
 + DX = initial checksum
 + SS = DOS DS
 +Return: AX, CX destroyed
 + DX = checksum
 + DS:SI -> first byte after checksummed range
 +Note: used by DOS to determine day count since 1/1/80 given a date
 +SeeAlso: AX=121Dh
 +----------2F121D-----------------------------
 +INT 2F U - DOS 3+ internal - SUM MEMORY
 + AX = 121Dh
 + DS:SI -> memory to add up
 + CX = 0000h
 + DX = limit
 +Return: AL = byte which exceeded limit
 + CX = number of bytes before limit exceeded
 + DX = remainder after adding first CX bytes
 + DS:SI -> byte beyond the one which exceeded the limit
 +Note: used by DOS to determine year or month given day count since 1/1/80
 +SeeAlso: AX=121Ch
 +----------2F121E-----------------------------
 +INT 2F U - DOS 3+ internal - COMPARE FILENAMES
 + AX = 121Eh
 + DS:SI -> first ASCIZ filename
 + ES:DI -> second ASCIZ filename
 +Return: ZF set if filenames equivalent, ZF clear if not
 +SeeAlso: AX=1211h,AX=1221h
 +----------2F121F-----------------------------
 +INT 2F U - DOS 3+ internal - BUILD CURRENT DIRECTORY STRUCTURE
 + AX = 121Fh
 + SS = DOS DS
 + STACK: WORD drive letter
 +Return: ES:DI -> current directory structure (will be overwritten by next call)
 + STACK unchanged
 +----------2F1220-----------------------------
 +INT 2F U - DOS 3+ internal - GET JOB FILE TABLE ENTRY
 + AX = 1220h
 + BX = file handle
 +Return: CF set on error
 +     AL = 6 (invalid file handle)
 + CF clear if successful
 +     ES:DI -> JFT entry for file handle in current process
 +Note: the byte pointed at by ES:DI contains the number of the SFT for the
 +   file handle, or FFh if the handle is not open
 +SeeAlso: AX=1216h,AX=1229h
 +----------2F1221-----------------------------
 +INT 2F U - DOS 3+ internal - CANONICALIZE FILE NAME
 + AX = 1221h
 + DS:SI -> file name to be fully qualified
 + ES:DI -> 128-byte buffer for resulting canonical file name
 + SS = DOS DS
 +Return: (see INT 21/AH=60h)
 +Note: identical to INT 21/AH=60h
 +SeeAlso: AX=1123h,INT 21/AH=60h
 +----------2F1222-----------------------------
 +INT 2F U - DOS 3+ internal - SET EXTENDED ERROR INFO
 + AX = 1222h
 + SS = DOS data segment
 + SS:SI -> 4-byte records
 + BYTE error code, FFh = last record
 + BYTE error class, FFh = don't change
 + BYTE suggested action, FFh = don't change
 + BYTE error locus, FFh = don't change
 + SDA error code set
 +Return: SI destroyed
 + SDA error class, error locus, and suggested action fields set
 +Note: can be called only from within DOS
 +SeeAlso: AX=122Dh,INT 21/AH=59h
 +----------2F1223-----------------------------
 +INT 2F U - DOS 3+ internal - CHECK IF CHARACTER DEVICE
 + AX = 1223h
 + SDA+218h (DOS 3.10-3.30) = eight-character blank-padded name
 + SDA+22Bh (DOS 4.0x) = eight-character blank-padded name
 +Return: CF set if no character device by that name found
 + CF clear if found
 +     BH = low byte of device attribute word
 +Note: can only be called from within DOS (assumes DS=SS=DOS DS)
 +SeeAlso: INT 21/AX=5D06h,INT 21/AX=5D0Bh
 +----------2F1224-----------------------------
 +INT 2F U - DOS 3+ internal - DELAY
 + AX = 1224h
 + SS = DOS DS
 +Return: after delay set by INT 21/AX=440Bh, unless in server call
 +   (INT 21/AX=5D00h)
 +Note: delay is dependent on the processor speed, and is skipped entirely if
 +   inside a server call
 +SeeAlso: INT 21/AX=440Bh,INT 21/AH=52h
 +----------2F1225-----------------------------
 +INT 2F U - DOS 3+ internal - GET LENGTH OF ASCIZ STRING
 + AX = 1225h
 + DS:SI -> ASCIZ string
 +Return: CX = length of string
 +SeeAlso: AX=1212h
 +----------2F1226-----------------------------
 +INT 2F U - DOS 3.3+ internal - OPEN FILE
 + AX = 1226h
 + CL = access mode
 + DS:DX -> ASCIZ filename
 +Return: CF set on error
 +     AL = error code (see INT 21/AH=59h)
 + CF clear if successful
 +     AX = file handle
 +Notes: can only be called from within DOS (assumes SS=DOS DS)
 + equivalent to INT 21/AH=3Dh
 +SeeAlso: AX=1227h,INT 21/AH=3Dh
 +----------2F1227-----------------------------
 +INT 2F U - DOS 3.3+ internal - CLOSE FILE
 + AX = 1227h
 + BX = file handle
 +Return: CF set on error
 +     AL = 06h invalid file handle
 + CF clear if successful
 +Notes: can only be called from within DOS (assumes SS=DOS DS)
 + equivalent to INT 21/AH=3Eh
 +SeeAlso: AX=1106h,AX=1201h,AX=1226h,INT 21/AH=3Eh
 +----------2F1228BP4200-----------------------
 +INT 2F U - DOS 3.3+ internal - MOVE FILE POINTER
 + AX = 1228h
 + BP = 4200h, 4201h, 4202h (see INT 21/AH=42h)
 + BX = file handle
 + CX:DX = offset in bytes
 + SS = DOS DS
 +Return: as for INT 21/AH=42h
 +Notes: equivalent to INT 21/AH=42h, but may only be called from inside a DOS
 +   function call
 + sets user stack frame pointer to dummy buffer, moves BP to AX, performs
 +   LSEEK, and restores frame pointer
 +SeeAlso: INT 21/AH=42h
 +----------2F1229-----------------------------
 +INT 2F U - DOS 3.3+ internal - READ FROM FILE
 + AX = 1229h
 + BX = file handle
 + CX = number of bytes to read
 + DS:DX -> buffer
 + SS = DOS DS
 +Return: as for INT 21/AH=3Fh
 +Note: equivalent to INT 21/AH=3Fh, but may only be called when already inside
 +   a DOS function call
 +SeeAlso: AX=1226h,INT 21/AH=3Fh
 +----------2F122A-----------------------------
 +INT 2F U - DOS 3.3+ internal - SET FASTOPEN ENTRY POINT
 + AX = 122Ah
 + BX = entry point to set (0001h or 0002h)
 + DS:SI -> FASTOPEN entry point
 + (entry point not set if SI = FFFFh for DOS 4+)
 +Return: CF set if specified entry point already set
 +Notes: entry point in BX is ignored under DOS 3.30
 + both entry points set to same handler by DOS 4.01
 +
 +DOS 3.30+ FASTOPEN is called with:
 + AL = 01h  ???
 +     CX = ??? seems to be offset
 +     DI = ??? seems to be offset
 +     SI = offset in DOS DS of filename
 + AL = 02h  ???
 + AL = 03h  open file???
 +     SI = offset in DOS DS of filename
 + AL = 04h  ???
 +     AH = subfunction (00h,01h,02h)
 +     ES:DI -> ???
 +     CX = ??? (subfunctions 01h and 02h only)
 +Returns: CF set on error or not installed
 +Note: function 03h calls function 01h first
 +
 +PCDOS 4.01 FASTOPEN is additionally called with:
 + AL = 04h ???
 +     AH = 03h
 +     ???
 + AL = 05h ???
 + AL = 0Bh ???
 + AL = 0Ch ???
 + AL = 0Dh ???
 + AL = 0Eh ???
 + AL = 0Fh ???
 + AL = 10h ???
 +
 +MSDOS 5.0 FASTOPEN is additionally called with:
 + AL = 04h ???
 +     AH = 03h
 +     ???
 + AL = 05h ???
 +     DL = drive (00h = A:)
 +     ???
 + AL = 06h ???
 +----------2F122B-----------------------------
 +INT 2F U - DOS 3.3+ internal - IOCTL
 + AX = 122Bh
 + BP = 44xxh
 + SS = DOS DS
 + additional registers as appropriate for INT 21/AX=44xxh
 +Return: as for INT 21/AH=44h
 +Notes: equivalent to INT 21/AH=44h, but may only be called when already inside
 +   a DOS function call
 + sets user stack frame pointer to dummy buffer, moves BP to AX, performs
 +   IOCTL, and restores frame pointer
 +SeeAlso: INT 21/AH=44h
 +----------2F122C-----------------------------
 +INT 2F U - DOS 3.3+ internal - GET DEVICE CHAIN
 + AX = 122Ch
 +Return: BX:AX -> header of second device driver (NUL is first) in driver chain
 +SeeAlso: INT 21/AH=52h
 +----------2F122D-----------------------------
 +INT 2F U - DOS 3.3+ internal - GET EXTENDED ERROR CODE
 + AX = 122Dh
 +Return: AX = current extended error code
 +SeeAlso: AX=1222h,INT 21/AH=59h
 +----------2F122E-----------------------------
 +INT 2F U - DOS 4+ internal - GET OR SET ERROR TABLE ADDRESSES
 + AX = 122Eh
 + DL = subfunction
 +     00h get standard DOS error table (errors 00h-12h,50h-5Bh)
 + Return: ES:DI -> error table
 +     01h set standard DOS error table
 + ES:DI -> error table
 +     02h get parameter error table (errors 00h-0Ah)
 + Return: ES:DI -> error table
 +     03h set parameter error table
 + ES:DI -> error table
 +     04h get critical/SHARE error table (errors 13h-2Bh)
 + Return: ES:DI -> error table
 +     05h set critical/SHARE error table
 + ES:DI -> error table
 +     06h get ??? error table
 + Return: ES:DI -> error table or 0000h:0000h
 +     07h set ??? error table
 + ES:DI -> error table
 +     08h get error message retriever (see below)
 + Return: ES:DI -> FAR procedure to fetch error message 
 +     09h set ??? error table
 + ES:DI -> error table
 +Notes: if the returned segment on a "get" is 0001h, then the offset specifies
 +   the offset of the error message table within COMMAND.COM, and the
 +   procedure returned by DL=08h should be called
 + DOS 5.0 COMMAND.COM does not allow setting any of the addresses; they
 +   are always returned with segment 0001h
 +SeeAlso: AX=0500h,INT 21/AH=59h
 +
 +Format of DOS 4.x error table:
 +Offset Size Description
 + 00h BYTE FFh
 + 01h  2 BYTEs 04h,00h (DOS version???)
 + 03h BYTE number of error headers following
 + 04h 2N WORDs table of all error headers for table
 + Offset Size Description
 + 00h WORD error message number
 + 02h WORD offset of error message from start of header
 + error messages are count byte followed by msg
 +Note: DOS 5 error tables consist of one word per error number; each word
 +   contains either the offset of a counted string or 0000h
 +
 +Call error retrieval function with:
 + AX = error number
 + DI = offset of error table
 +Return: ES:DI -> error message (counted string)
 +Notes: this function needs to access COMMAND.COM if the messages were not
 +   loaded into memory permanently with /MSG; the caller should assume
 +   that the returned message will be overwritten by the next call of
 +   the function
 + supported by DR-DOS 5.0
 +----------2F122F-----------------------------
 +INT 2F U - DOS 4+ internal - SET DOS VERSION NUMBER TO RETURN
 + AX = 122Fh
 + DX = DOS version number (0000h = return true DOS version)
 +Note: not available under DR-DOS 5.0
 +SeeAlso: INT 21/AH=30h
 +----------2F13-------------------------------
 +INT 2F U - DOS 3.2+ - SET DISK INTERRUPT HANDLER
 + AH = 13h
 + DS:DX -> interrupt handler disk driver calls on read/write
 + ES:BX = address to restore INT 13 to on system halt (exit from root
 + shell) or warm boot (INT 19)
 +Return: DS:DX from previous invocation of this function
 + ES:BX from previous invocation of this function
 +Notes: IO.SYS hooks INT 13 and inserts one or more filters ahead of the
 +   original INT 13 handler.  The first is for disk change detection
 +   on floppy drives, the second is for tracking formatting calls and
 +   correcting DMA boundary errors, the third is for working around
 +   problems in a particular version of IBM's ROM BIOS
 + before the first call, ES:BX points at the original BIOS INT 13; DS:DX
 +   also points there unless IO.SYS has installed a special filter for
 +   hard disk reads (on systems with model byte FCh and BIOS date
 +   "01/10/84" only), in which case it points at the special filter
 + most DOS 3.3+ disk access is via the vector in DS:DX, although a few
 +   functions are still invoked via an INT 13 instruction
 + this is a dangerous security loophole for any virus-monitoring software
 +   which does not trap this call (many Bulgarian viruses are known to
 +   use it to get the original ROM entry point)
 +SeeAlso: INT 13/AH=01h,INT 19
 +----------2F1400-----------------------------
 +INT 2F - NLSFUNC.COM - INSTALLATION CHECK
 + AX = 1400h
 +Return: AL = 00h not installed, OK to install
 +      01h not installed, not OK
 +      FFh installed
 +Notes: called by DOS v3.3+ kernel
 + supported by OS/2 v1.3+ compatibility box, which always returns AL=FFh
 + supported by DR-DOS 5.0
 + documented for MS-DOS 5.0, but undocumented in prior versions
 +----------2F1401-----------------------------
 +INT 2F U - NLSFUNC.COM - CHANGE CODE PAGE
 + AX = 1401h
 + DS:SI -> internal code page structure (see below)
 + BX = new code page
 + DX = country code???
 +Return: AL = status
 +      00h successful
 +      else DOS error code
 +Note: called by DOS v3.3+ kernel
 +SeeAlso: INT 21/AH=66h
 +
 +Format of DOS 3.30 internal code page structure:
 +Offset Size Description
 + 00h  8 BYTEs ???
 + 08h 64 BYTEs name of country information file
 + 48h WORD system code page
 + 4Ah WORD number of supported subfunctions
 + 4Ch  5 BYTEs data to return for INT 21/AX=6502h
 + 51h  5 BYTEs data to return for INT 21/AX=6504h
 + 56h  5 BYTEs data to return for INT 21/AX=6505h
 + 5Bh  5 BYTEs data to return for INT 21/AX=6506h
 + 60h 41 BYTEs data to return for INT 21/AX=6501h
 +----------2F1402-----------------------------
 +INT 2F U - NLSFUNC.COM - GET COUNTRY INFO
 + AX = 1402h
 + BP = subfunction (same as AL for INT 21/AH=65h)
 + BX = code page
 + DX = country code
 + DS:SI -> internal code page structure (see AX=1401h)
 + ES:DI -> user buffer
 + CX = size of user buffer
 +Return: AL = status
 +     00h successful
 +     else DOS error code
 +Notes: called by DOS v3.3+ kernel on INT 21/AH=65h
 + code page structure apparently only needed for COUNTRY.SYS pathname
 +SeeAlso: AX=1403h,AX=1404h,INT 21/AH=65h
 +----------2F1403-----------------------------
 +INT 2F U - NLSFUNC.COM - SET COUNTRY INFO
 + AX = 1403h
 + DS:SI -> internal code page structure (see AX=1401h)
 + BX = code page
 + DX = country code
 +Return: AL = status 
 +      ???
 +Note: called by DOS v3.3+ kernel on INT 21/AH=38h
 +SeeAlso: AX=1402h,AX=1404h,INT 21/AH=38h"SET"
 +----------2F1404-----------------------------
 +INT 2F U - NLSFUNC.COM - GET COUNTRY INFO
 + AX = 1404h
 + BX = code page
 + DX = country code
 + DS:SI -> internal code page structure (see AX=1401h)
 + ES:DI -> user buffer
 +Return: AL = status
 +      ???
 +Notes: called by DOS v3.3+ kernel on INT 21/AH=38h
 + code page structure apparently only needed for COUNTRY.SYS pathname
 +SeeAlso: AX=1402h,AX=1403h,INT 21/AH=38h"GET"
 +----------2F14FE-----------------------------
 +INT 2F U - DR-DOS 5.0 NLSFUNC - ???
 + AX = 14FEh
 + DI = ???
 + ???
 +Return: ???
 +Note: DR-DOS 5.0 NLSFUNC returns CF set and AX=0001h if AL was not 00h, FEh,
 +   or FFh on entry.
 +SeeAlso: AX=14FFh
 +----------2F14FF-----------------------------
 +INT 2F U - DR-DOS 5.0 NLSFUNC - ???
 + AX = 14FFh
 + ???
 +Return: ???
 +Note: DR-DOS 5.0 NLSFUNC returns CF set and AX=0001h if AL was not 00h, FEh,
 +   or FFh on entry.
 +SeeAlso: AX=14FEh
 +----------2F1500-----------------------------
 +INT 2F - DOS 4.00 GRAPHICS.COM - INSTALLATION CHECK
 + AX = 1500h
 +Return: AX = FFFFh
 + ES:DI -> ??? (graphics data?)
 +Note: this installation check conflicts with the CD-ROM Extensions
 +   installation check; moved to AX=AC00h in later versions
 +SeeAlso: AX=AC00h
 +----------2F1500BX0000-----------------------
 +INT 2F - CD-ROM - INSTALLATION CHECK
 + AX = 1500h
 + BX = 0000h
 +Return: BX = number of CD-ROM drive letters used
 + CX = starting drive letter (0=A:)
 +Notes: this installation check DOES NOT follow the format used by other
 +   software
 + this installation check conflicts with the DOS 4.00 GRAPHICS.COM
 +   installation check
 +SeeAlso: INT 2F/AX=D000h"Lotus"
 +----------2F1501-----------------------------
 +INT 2F - CD-ROM - GET DRIVE DEVICE LIST
 + AX = 1501h
 + ES:BX -> buffer to hold drive letter list (5 bytes per drive letter)
 +Return: buffer filled, for each drive letter
 +   BYTE subunit number in driver
 +   DWORD address of device driver header
 +----------2F1502-----------------------------
 +INT 2F - CD-ROM - GET COPYRIGHT FILE NAME
 + AX = 1502h
 + ES:BX -> 38-byte buffer for name of copyright file
 + CX = drive number (0=A:)
 +Return: CF set if drive is not a CD-ROM drive
 +     AX = 15 (invalid drive)
 + CF clear if successful
 +SeeAlso: AX=1503h
 +----------2F1503-----------------------------
 +INT 2F - CD-ROM - GET ABSTRACT FILE NAME
 + AX = 1503h
 + ES:BX -> 38-byte buffer for name of abstract file
 + CX = drive number (0=A:)
 +Return: CF set if drive is not a CD-ROM drive
 +     AX = 15 (invalid drive)
 + CF clear if successful
 +SeeAlso: AX=1502h
 +----------2F1504-----------------------------
 +INT 2F - CD-ROM - GET BIBLIOGRAPHIC DOC FILE NAME
 + AX = 1504h
 + ES:BX -> 38-byte buffer for name of bibliographic documentation file
 + CX = drive number (0=A:)
 +Return: CF set if drive is not a CD-ROM drive
 +     AX = 15 (invalid drive)
 + CF clear if successful
 +----------2F1505-----------------------------
 +INT 2F - CD-ROM - READ VTOC
 + AX = 1505h
 + ES:BX -> 2048-byte buffer
 + CX = drive number (0=A:)
 + DX = sector index (0=first volume descriptor,1=second,...)
 +Return: CF set on error
 +     AX = error code (15=invalid drive,21=not ready)
 + CF clear if successful
 +     AX = volume descriptor type (1=standard,FFh=terminator,0=other)
 +----------2F1506-----------------------------
 +INT 2F - CD-ROM - TURN DEBUGGING ON
 + AX = 1506h
 + BX = debugging function to enable
 +Note: reserved for development
 +SeeAlso: AX=1507h
 +----------2F1507-----------------------------
 +INT 2F - CD-ROM - TURN DEBUGGING OFF
 + AX = 1507h
 + BX = debugging function to disable
 +Note: reserved for development
 +SeeAlso: AX=1506h
 +----------2F1508-----------------------------
 +INT 2F - CD-ROM - ABSOLUTE DISK READ
 + AX = 1508h
 + ES:BX -> buffer
 + CX = drive number (0=A:)
 + SI:DI = starting sector number
 + DX = number of sectors to read
 +Return: CF set on error
 +     AL = error code (15=invalid drive,21=not ready)
 + CF clear if successful
 +SeeAlso: AX=1509h
 +
 +===== INT 2F - CD-ROM - ABSOLUTE DISK WRITE =====
 +
 + AX = 1509h
 + ES:BX -> buffer
 + CX = drive number (0=A:)
 + SI:DI = starting sector number
 + DX = number of sectors to write
 +Note: corresponds to INT 26h and is currently reserved and nonfunctional
 +SeeAlso: AX=1508h
 +----------2F150A-----------------------------
 +INT 2F - CD-ROM - RESERVED
 + AX = 150Ah
 +----------2F150B-----------------------------
 +INT 2F - CD-ROM v2.00+ - DRIVE CHECK
 + AX = 150Bh
 + CX = drive number (0=A:)
 +Return: BX = ADADh if MSCDEX.EXE installed
 +     AX = 0000h if drive not supported
 + nonzero if supported
 +SeeAlso: AX=150Dh
 +----------2F150C-----------------------------
 +INT 2F - CD-ROM v2.00+ - GET MSCDEX.EXE VERSION
 + AX = 150Ch
 +Return: BH = major version
 + BL = minor version
 +Note: MSCDEX.EXE versions prior to 2.00 return BX=0
 +----------2F150D-----------------------------
 +INT 2F - CD-ROM v2.00+ - GET CD-ROM DRIVE LETTERS
 + AX = 150Dh
 + ES:BX -> buffer for drive letter list (1 byte per drive)
 +Return: buffer filled with drive numbers (0=A:).  Each byte corresponds
 + to the drive in the same position for function 1501h
 +SeeAlso: AX=150Bh
 +----------2F150E-----------------------------
 +INT 2F - CD-ROM v2.00+ - GET/SET VOLUME DESCRIPTOR PREFERENCE
 + AX = 150Eh
 + BX = subfunction
 +     00h get preference
 + DX = 0000h
 + Return: DX = preference settings
 +     01h set preference
 + DH = volume descriptor preference
 +     01h = primary volume descriptor
 +     02h = supplementary volume descriptor
 + DL = supplementary volume descriptor preference
 +     01h = shift-Kanji
 + CX = drive number (0=A:)
 +Return: CF set on error
 +     AX = error code (15=invalid drive,1=invalid function)
 + CF clear if successful
 +----------2F150F-----------------------------
 +INT 2F - CD-ROM v2.00+ - GET DIRECTORY ENTRY
 + AX = 150Fh
 + CL = drive number (0=A:)
 + CH bit 0 = copy flag
 + clear if direct copy
 + set if copy to structure which removed ISO/High Sierra diffs
 + ES:BX -> ASCIZ path name
 + SI:DI -> buffer for directory entry (see below)
 + minimum 255 bytes for direct copy
 +Return: CF set on error
 +     AX = error code
 + CF clear if succesful
 +     AX = disk format (0=High Sierra,1=ISO 9660)
 +
 +Format of directory entry (direct copy):
 +Offset Size Description
 + 00h BYTE  length of directory entry
 + 01h BYTE  length of XAR in Logical Block Numbers
 + 02h DWORD LBN of data, Intel (little-endian) format
 + 06h DWORD LBN of data, Motorola (big-endian) format
 + 0Ah DWORD length of file, Intel format
 + 0Eh DWORD length of file, Motorola format
 +---High Sierra---
 + 12h  6 BYTEs date and time
 + 18h BYTE  bit flags
 + 19h BYTE  reserved
 +---ISO 9660---
 + 12h  7 BYTEs date and time
 + 19h BYTE  bit flags
 +---both formats---
 + 1Ah BYTE  interleave size
 + 1Bh BYTE  interleave skip factor
 + 1Ch WORD  volume set sequence number, Intel format
 + 1Eh WORD  volume set sequence number, Motorola format
 + 20h BYTE  length of file name
 + 21h  N BYTEs file name
 + BYTE (optional) padding if filename is odd length
 +      N BYTEs system data
 +
 +Format of directory entry (canonicalized):
 +Offset Size Description
 + 00h BYTE length of XAR in Logical Block Numbers
 + 01h DWORD Logical Block Number of file start
 + 05h WORD size of disk in logical blocks
 + 07h DWORD file length in bytes
 + 0Bh  7 BYTEs date and time
 + 12h BYTE bit flags
 + 13h BYTE interleave size
 + 14h BYTE interleave skip factor
 + 15h WORD volume set sequence number
 + 17h BYTE length of file name
 + 18h 38 BYTEs ASCIZ filename
 + 3Eh WORD file version number
 + 40h BYTE number of bytes of system use data
 + 41h 220 BYTEs system use data
 +----------2F1510-----------------------------
 +INT 2F - CD-ROM v2.10+ - SEND DEVICE DRIVER REQUEST
 + AX = 1510h
 + CX = CD-ROM drive letter (0 = A, 1 = B, etc)
 + ES:BX -> CD-ROM device driver request header (see AX=0802h)
 +----------2F1600-----------------------------
 +INT 2F - MS WINDOWS - WINDOWS ENHANCED MODE INSTALLATION CHECK
 + AX = 1600h
 +Return: AL = 00h if Windows 3.x enhanced mode or Windows/386 2.x not running
 + AL = 80h if Windows 3.x enhanced mode or Windows/386 2.x not running
 + AL = 01h if Windows/386 2.x running
 + AL = FFh if Windows/386 2.x running
 + AL = anything else
 +     AL = Windows major version number >= 3
 +     AH = Windows minor version number
 +Note: INT 2F/AH=16h comprises an API for non-Windows programs (DOS device
 +   drivers, TSRs, and applications) to cooperate with multitasking
 +   Windows/386 2.x and Windows 3.x and higher enhanced mode.
 + certain calls are also supported in the Microsoft 80286 DOS extender in
 +   Windows standard mode
 +SeeAlso: AX=4680h
 +----------2F1602-----------------------------
 +INT 2F - MS WINDOWS/386 2.x - GET API ENTRY POINT
 + AX = 1602h
 +Return: ES:DI -> Windows/386 2.x API procedure entry point
 +Notes: this interface is supported in Windows 3.x only for 2.x compatibility
 + to get the current virtual machine (VM) ID in Windows/386 2.x:
 +     AX = 0000h
 +     ES:DI -> return address
 +     JUMP to address returned from INT 2F/AX=1602h
 + After JUMP, at return address:
 +     BX = current VM ID.
 +SeeAlso: AX=0C20h
 +----------2F1603-----------------------------
 +INT 2F - RM Nimbus MSDOS 3.3 - ???
 + AX = 1603h
 +Return: AX = 5248h ('RH')
 + DS:SI -> first byte after INT 2F handler in IBMBIO.COM
 +----------2F1605-----------------------------
 +INT 2F - MS WINDOWS - WINDOWS ENH MODE & 286 DOSX INIT BROADCAST
 + AX = 1605h
 + ES:BX = 0000h:0000h
 + DS:SI = 0000h:0000h
 + CX = 0000h
 + DX = flags
 +     bit 0 = 0 if Windows enhanced-mode initialization
 +     bit 0 = 1 if Microsoft 286 DOS extender initialization
 +     bits 1-15 reserved (undefined)
 + DI = version number (major in upper byte, minor in lower)
 +Return: CX = 0000h if okay for Windows to load
 + CX <> 0 if Windows should not load
 + ES:BX -> startup info structure (see below)
 + DS:SI -> virtual86 mode enable/disable callback or 0000h:0000h
 +Notes: the Windows enhanced mode loader and Microsoft 286 DOS extender will
 +   broadcast an INT 2F/AX=1605h call when initializing. Any DOS device
 +   driver or TSR can watch for this broadcast and return the appropriate
 +   values.  If the driver or TSR returns CX <> 0, it is also its
 +   responsibility to display an error message.
 + each handler must first chain to the prior INT 2F handler with
 +   registers unchanged before processing the call
 + if the handler requires local data on a per-VM basis, it must store the
 +   returned ES:BX in the "next" field of a startup info structure and
 +   return a pointer to that structure in ES:BX
 + a single TSR may set the V86 mode enable/disable callback; if DS:SI is
 +   already nonzero, the TSR must fail the initialization by setting CX
 +   nonzero
 +SeeAlso: AX=1606h,AX=1608h,AX=4B05h
 +
 +Format of Startup Information Structure:
 +Offset Size Description
 + 00h  2 BYTEs major, minor version of info structure
 + 02h DWORD pointer to next startup info structure or 0000h:0000h
 + 06h DWORD pointer to ASCIZ name of virtual device file or 0000h:0000h
 + 0Ah DWORD virtual device reference data (only used if above nonzero)
 + 0Eh DWORD pointer to instance data records or 0000h:0000h
 +
 +Format of one Instance Item in array:
 +Offset Size Description
 + 00h DWORD address of instance data (end of array if 0000h:0000h)
 + 04h WORD size of instance data
 +
 +Virtual mode enable/disable procedure called with:
 + AX = 0000h disable V86 mode
 + AX = 0001h enable V86 mode
 + interrupts disabled
 +Return: CF set on error
 + CF clear if successful
 + interrupts disabled
 +----------2F1606-----------------------------
 +INT 2F - MS WINDOWS - WINDOWS ENH MODE & 286 DOSX EXIT BROADCAST
 + AX = 1606h
 + DX = flags
 +     bit 0 = 0 if Windows enhanced-mode exit
 +     bit 0 = 1 if Microsoft 286 DOS extender exit
 +     bits 1-15 reserved (undefined)
 +Notes: if the init broadcast fails (AX=1605h returned CX <> 0), then this
 +   broadcast will be issued immediately.
 + this call will be issued in real mode
 +SeeAlso: AX=1605h,AX=1609h
 +----------2F1607-----------------------------
 +INT 2F - MS WINDOWS - VIRTUAL DEVICE CALL OUT API
 + AX = 1607h
 + BX = virtual device ID (see INT 2F/AX=1684h)
 +Notes: more of a convention than an API, this call specifies a standard
 +   mechanism for Windows enhanced-mode virtual devices (VxD's) to talk
 +   to DOS device drivers and TSRs
 + VNETBIOS calls this function and then checks ES:DI to determine whether
 +   the NetBIOS has any extensions Windows should know about
 + VMD (Virtual Mouse Driver) calls this and then checks whether CX is
 +   nonzero; if yes, it will not automatically virtualize the mouse
 +   driver.  This would be used if MOUSE.COM already virtualizes
 +   itself using the Windows API.
 +SeeAlso: AX=0C20h,AX=1605h,AX=1684h
 +----------2F1607BX0015-----------------------
 +INT 2F - DOS 5.0 kernel - "DOSMGR" VIRTUAL DEVICE SUPPORT
 + AX = 1607h
 + BX = 0015h (VxD identifier of "DOSMGR")
 + CX = function
 +     0000h ???
 +     Return: CX = 0001h
 + ES:BX -> ??? data
 +     0001h ???
 +     DX = ???
 + Return: AX = B97Ch
 + BX = value of DX on call
 + DX = A2ABh
 +     0002h NOP
 +     0003h ???
 +     DX = ??? (bit 0 significant)
 + Return: if DX bit 0 set:
 + AX = B97Ch
 + CX = ??? (0058h)
 + DX = A2ABh
 + if DX bit 0 clear:
 + all registers preserved
 +     0004h ???
 +     Return: DX = 0000h
 +     0005h get device driver size
 +     ES = segment of device driver
 + Return: DX:AX = 0000h:0000h on error (not dev. driver segment)
 + DX:AX = A2ABh:B97Ch if successful
 +     BX:CX = size of device driver in bytes
 +----------2F1608-----------------------------
 +INT 2F - MS WINDOWS - WINDOWS ENHANCED MODE INIT COMPLETE BROADCAST
 + AX = 1608h
 +Notes: called after all installable devices have been initialized
 + real-mode software may be called between the Windows enhanced-mode init
 +   call (AX=1605h) and this call; the software must detect this
 +   situation
 +SeeAlso: AX=1605h,AX=1609h
 +----------2F1609-----------------------------
 +INT 2F - MS WINDOWS - WINDOWS ENHANCED MODE BEGIN EXIT BROADCAST
 + AX = 1609h
 +Note: called at the beginning of a normal exit sequence; not made in the
 +   event of a fatal system crash
 +SeeAlso: AX=1606h,AX=1608h
 +----------2F160A-----------------------------
 +INT 2F - MS Windows 3.1 - IDENTIFY WINDOWS VERSION AND TYPE
 + AX = 160Ah
 + ???
 +Return: ???
 +----------2F160B-----------------------------
 +INT 2F - MS Windows 3.1 - IDENTIFY TSRs
 + AX = 160Bh
 + ???
 +Return: ???
 +
 +Format of TSR-to-Windows communication structure:
 +Offset Size Description
 + 00h DWORD pointer to next structure
 + 04h WORD PSP segment
 + 06h WORD API version ID (0100h)
 + 08h WORD EXEC flags
 +  bit 0: "WINEXEC"
 + bit 1: "LOADLIBRARY"
 + bit 2: "OPENDRIVER"
 + 0Ah WORD "exec_cmd_show"
 + 0Ch DWORD "exec_cmd"
 + 10h  4 BYTEs reserved (0)
 + 14h DWORD TSR ID block
 + 18h DWORD TSR data block
 +----------2F160C-----------------------------
 +INT 2F - MS Windows 3.1 - DETECT ROMs
 + AX = 160Ch
 + ???
 +Return: ???
 +Note: used by ROM Windows
 +----------2F1680-----------------------------
 +INT 2F - MS WINDOWS, DPMI, various - RELEASE CURRENT VIRTUAL MACHINE TIME-SLICE
 + AX = 1680h
 +Return: AL = 00h if the call is supported
 + AL = 80h (unchanged) if the call is not supported
 +Notes: programs can use this function in idle loops to enhance performance
 +   under multitaskers; this call is supported by MS Windows 3.0, DOS 5+,
 +   DPMI 1.0+, and will be supported in OS/2 2.0 for multitasking DOS
 +   applications
 + does not block the program; it just gives up the remainder of the time
 +   slice
 + should not be used by Windows-specific programs
 +SeeAlso: INT 15/AX=1000h
 +----------2F1681-----------------------------
 +INT 2F - MS WINDOWS 3+ - BEGIN CRITICAL SECTION
 + AX = 1681h
 +Notes: used to prevent a task switch from occurring
 + should be followed by an INT 2F/AX=1682h call as soon as possible
 + nested calls are allowed, and must be followed by an appropriate number
 +   of "end critical section" calls
 + not supported in Windows/386 2.x. Get INDOS flag with INT 21/AH=34h and
 +   and increment by hand.
 +SeeAlso: AX=1682h,INT 15/AX=101Bh,INT 21/AH=34h
 +----------2F1682-----------------------------
 +INT 2F - MS WINDOWS 3+ - END CRITICAL SECTION
 + AX = 1682h
 +Notes: not supported in Windows/386 2.x.  Get InDOS flag with INT 21/AH=34h
 +   and decrement by hand, taking care not to decrement InDOS flag
 +   through zero
 +SeeAlso: AX=1681h,INT 15/AX=101Ch,INT 21/AH=34h
 +----------2F1683-----------------------------
 +INT 2F - MS WINDOWS 3+ - GET CURRENT VIRTUAL MACHINE ID
 + AX = 1683h
 +Return: BX = current virtual machine (VM) ID
 +Notes: Windows itself currently runs in VM 1, but this can't be relied upon
 + VM IDs are reused when VMs are destroyed
 + an ID of 0 will never be returned
 +SeeAlso: AX=1684h,AX=1685h,AX=168Bh
 +----------2F1684-----------------------------
 +INT 2F - MS WINDOWS - GET DEVICE API ENTRY POINT
 + AX = 1684h
 + BX = virtual device (VxD) ID (see below)
 + ES:DI = 0000h:0000h
 +Return: ES:DI -> VxD API entry point, or 0:0 if the VxD does not support an API
 +Note: some Windows enhanced-mode virtual devices provide services that
 +   applications can access.  For example, the Virtual Display Device
 +   (VDD) provides an API used in turn by WINOLDAP.
 +SeeAlso: AX=1683h
 +
 +Values for VxD ID:
 + 01h VMM Virtual Machine Manager
 + 02h Debug
 + 03h VPICD Virtual Prog. Interrupt Controller (PIC) Device
 + 04h VDMAD Virtual Direct Memory Access (DMA) Device
 + 05h VTD Virtual Timer Device
 + 06h V86MMGR Virtual 8086 Mode Device
 + 07h PAGESWAP Paging Device
 + 08h Parity
 + 09h Reboot
 + 0Ah VDD Virtual Display Device (GRABBER)
 + 0Bh VSD Virtual Sound Device
 + 0Ch VMD Virtual Mouse Device
 + 0Dh VKD Virtual Keyboard Device
 + 0Eh VCD Virtual COMM Device
 + 0Fh VPD Virtual Printer Device
 + 10h VHD Virtual Hard Disk Device
 + 11h VMCPD
 + 12h EBIOS Reserve EBIOS page (e.g., on PS/2)
 + 13h BIOSXLAT Map ROM BIOS API between prot & V86 mode
 + 14h VNETBIOS Virtual NetBIOS Device
 + 15h DOSMGR
 + 16h WINLOAD
 + 17h SHELL
 + 18h VMPoll
 + 19h VPROD
 + 1Ah DOSNET assures network integrity across VMs
 + 1Bh VFD Virtual Floppy Device
 + 1Ch VDD2 Secondary display adapter
 + 1Dh WINDEBUG
 + 1Eh TSRLoad TSR instance utility
 +Note: The high bit of the VxD ID is reserved for future use. The
 + next 10 bits are the OEM # which is assigned by Microsoft. The
 + low 5 bits are the device number. 
 +
 +Call VTD.386 entry point with:
 + AX = 0000h get VTD version number
 +     Return: AH = major version
 +         AL = minor version
 + AX = 0100h get current clock tick time
 +     Return: EDX:EAX = clock tick time in 840ns units since Windows was
 +     started
 + AX = 0101h get current system time in milliseconds
 +     Return: EAX = time in milliseconds that Windows has been running
 + AX = 0102h get current virtual machine time
 +     Return: EAX = cumulative amount of time the virtual machine has
 +     been active, in milliseconds
 +Note: should only be called directly when TOOLHELP.DLL TimerCount() cannot
 +   be called
 +----------2F1685-----------------------------
 +INT 2F - MS WINDOWS - SWITCH VMs AND CALLBACK
 + AX = 1685h
 + BX = VM ID of virtual machine to switch to
 + CX = flags
 + bit 0 wait until interrupts enabled
 + bit 1 wait until critical section unowned
 + bits 2-15 reserved (zero)
 + DX:SI = priority boost (see VMM.INC)
 + ES:DI -> FAR procedure to callback
 +Return: CF set on error
 +     AX = error code
 + 01h invalid VM ID
 + 02h invalid priority boost
 + 03h invalid flags
 + CF clear if successful
 +     event will be or has been called
 +Notes: some DOS devices, such as networks, need to call functions in a
 +   specific VM. This call forces the appropriate VM to be installed.
 + the callback procedure must preserve all registers and return with IRET
 +SeeAlso: AX=1683h,INT 15/AX=1117h
 +----------2F1686-----------------------------
 +INT 2F - DOS Protected-Mode Interface - DETECT MODE
 + AX = 1686h
 +Return: AX = 0000h if operating in protected mode under DPMI (INT 31 available)
 + AX nonzero if in real/V86 mode or no DPMI (INT 31 not available)
 +SeeAlso: AX=1687h
 +----------2F1687-----------------------------
 +INT 2F - DOS Protected-Mode Interface - INSTALLATION CHECK
 + AX = 1687h
 +Return: AX = 0000h if installed
 +     BX = flags
 + bit 0: 32-bit programs supported
 +     CL = processor type (02h=80286, 03h=80386, 04h=80486)
 +     DH = DPMI major version
 +     DL = two-digit DPMI minor version
 +     SI = number of paragraphs of DOS extender private data
 +     ES:DI -> DPMI mode-switch entry point
 + AX nonzero if not installed
 +SeeAlso: AX=1686h
 +
 +Call mode switch entry point with:
 + AX = flags
 +     bit 0: set if 32-bit program
 + ES = real mode segment of buffer for DPMI private data (ignored if
 + SI was zero)
 +Return: CF set on error
 +     program still in real mode
 +     AX = error code (DPMI 1.0+)
 +        8011h unable to allocate all necessary descriptors
 +        8021h 32-bit program specified, but 16-bit DPMI host
 + CF clear if successful
 +     CS = 16-bit selector corresponding to real-mode CS
 +     SS = selector corresponding to real-mode SS (64K limit)
 +     DS = selector corresponding to real-mode DS (64K limit)
 +     ES = selector to program's PSP (100h byte limit)
 +     FS = GS = 0
 +     high word of ESP = 0 if 32-bit program
 +     program now in protected mode
 +Note: this entry point is only called for the initial switch to protected
 +   mode
 +----------2F1688-----------------------------
 +INT 2F U - MS Windows 3.0, 386MAX v6.01 - GET SELECTOR TO LDT
 + AX = 1688h
 +Return: AX = status??? (0000h for 386MAX)
 + BX = selector for ???
 +----------2F1689-----------------------------
 +INT 2F U - MS Windows 3.0+ - KERNEL IDLE CALL
 + AX = 1689h
 + ???
 +Return: ???
 +----------2F168A-----------------------------
 +INT 2F - DPMI 0.9+ - GET VENDOR-SPECIFIC API ENTRY POINT
 + AX = 168Ah
 + DS:(E)SI = selector:offset of ASCIZ vendor name
 +Return: AL = status
 +     00h successful
 +        ES:(E)DI -> extended API entry point
 +     8Ah unsuccessful
 +Notes: the vendor name is used to determine which entry point to return; it is
 +   case-sensitive
 + available in protected mode only
 + 32-bit applications use ESI and EDI, 16-bit applications use SI and DI
 + this call is present but not documented for DPMI 0.9
 +SeeAlso: INT 31/AX=0A00h
 +
 +Vendor names:
 + "MS-DOS" ??? and 386MAX v6.00+
 + "386MAX" 386MAX v6.00+
 +----------2F168B-----------------------------
 +INT 2F - MS Windows 3.1 - SET FOCUS TO SPECIFIED VIRTUAL MACHINE
 + AX = 168Bh
 + ???
 +Return: ???
 +SeeAlso: AX=1683h
 +----------2F168C-----------------------------
 +INT 2F - MS Windows 3.1 - RESTART COMMAND
 + AX = 168Ch
 + ???
 +Return: ???
 +Note: WIN.COM executes specified application
 +----------2F1700-----------------------------
 +INT 2F - MS WINDOWS "WINOLDAP" - IDENTIFY WinOldAp VERSION
 + AX = 1700h
 +Return: AX = 1700h if this version of WINOLDAP doesn't support clipboard
 + AX <> 1700h
 + AL = WINOLDAP major version
 + AH = WINOLDAP minor version
 +Notes: WinOldAp (WINOLDAP.MOD) is a Microsoft Windows extension supporting
 +   "old" (character-mode) application access to Dynamic Data Exchange,
 +   menus, and the Windows clipboard.
 + this installation check DOES NOT follow the format used by other
 +   software
 +----------2F1701-----------------------------
 +INT 2F - MS WINDOWS "WINOLDAP" - OPEN CLIPBOARD
 + AX = 1701h
 +Return: AX <> 0 success
 + AX = 0 clipboard is already open
 +----------2F1702-----------------------------
 +INT 2F - MS WINDOWS "WINOLDAP" - EMPTY CLIPBOARD
 + AX = 1702h
 +Return: AX <> 0 clipboard has been emptied
 + AX = 0 failure
 +----------2F1703-----------------------------
 +INT 2F - MS WINDOWS "WINOLDAP" - SET CLIPBOARD DATA
 + AX = 1703h
 + DX = clipboard format supported by WinOldAp:
 + 01h text
 + 02h bitmap
 + 03h metafile picture
 + 04h SYLK
 + 05h DIF
 + 06h TIFF
 + 07h OEM text
 + ES:BX -> data (see below for formats)
 + SI:CX = size of data
 +Return: AX <> 0 data copied into the Clipboard
 + AX = 0 failure
 +
 +Format of bitmap:
 +Offset Size Description
 + 00h WORD type (0000h)
 + 02h WORD width of bitmap in pixels
 + 04h WORD height of bitmap in pixels
 + 06h WORD bytes per line
 + 08h BYTE number of color planes
 + 09h BYTE number of adjacent color bits in pixel
 + 0Ah DWORD pointer to start of data
 + 0Eh WORD width in 0.1mm units
 + 10h WORD height in 0.1mm units
 + 12h  N BYTEs bitmap data
 +
 +Format of metafile picture:
 +Offset Size Description
 + 00h WORD mapping mode
 + 02h WORD X extent
 + 04h WORD Y extent
 + 06h WORD picture data
 +----------2F1704-----------------------------
 +INT 2F - MS WINDOWS "WINOLDAP" - GET CLIPBOARD DATA SIZE
 + AX = 1704h
 + DX = clipboard format supported by WinOldAp (see AX=1703h)
 +Return: DX:AX = size of data in bytes, including any headers
 +Failure: DX:AX = 0  no data in this format in the Clipboard
 +----------2F1705-----------------------------
 +INT 2F - MS WINDOWS "WINOLDAP" - GET CLIPBOARD DATA
 + AX = 1705h
 + DX = clipboard format supported by WinOldAp (see AX=1703h)
 + ES:BX -> buffer
 +Return: AX <> 0 success
 + AX = 0 error, or no data in this format in Clipboard
 +----------2F1708-----------------------------
 +INT 2F - MS WINDOWS "WINOLDAP" - CloseClipboard
 + AX = 1708h
 +Return: AX <> 0 success
 + AX = 0 failure
 +----------2F1709-----------------------------
 +INT 2F - MS WINDOWS "WINOLDAP" - COMPACT CLIPBOARD
 + AX = 1709h
 + SI:CX = desired size in bytes
 +Return: DX:AX = number of bytes in largest block of free memory
 +Note: WinOldAp is responsible for including the size of any headers
 +----------2F170A-----------------------------
 +INT 2F - MS WINDOWS "WINOLDAP" - GET DEVICE CAPABILITIES
 + AX = 170Ah
 + DX = GDI information index
 +     00h device driver version
 +     02h device classification
 +     04h width in mm
 +     06h height in mm
 +     08h width in pixels
 +     0Ah height in pixels
 +     0Ch bits per pixel
 +     0Eh number of bit planes
 +     10h number of brushes supported by device
 +     12h number of pens supported by device
 +     14h number of markers supported by device
 +     16h number of fonts supported by device
 +     18h number of colors
 +     1Ah size required for device descriptor
 +     1Ch curve capabilities
 +     1Eh line capabilities
 +     20h polygon capabilities
 +     22h text capabilities
 +     24h clipping capabilities
 +     26h bitblt capabilities
 +     28h X aspect
 +     2Ah Y aspect
 +     2Ch length of hypotenuse of aspect
 +     58h logical pixels per inch of width
 +     5Ah logical pixels per inch of height
 +Return: AX = integer value of the desired item
 + device classification
 +     00h vector plotter
 +     01h raster display
 +     02h raster printer
 +     03h raster camera
 +     04h character-stream, PLP
 +     05h Metafile, VDM
 +     06h display-file
 + curve capabilities
 +     bit 0  circles
 +     bit 1  pie wedges
 +     bit 2  chord arcs
 +     bit 3  ellipses
 +     bit 4  wide lines
 +     bit 5  styled lines
 +     bit 6  wide styled lines
 +     bit 7  interiors
 + line capabilities
 +     bit 1  polylines
 +     bit 2  markers
 +     bit 3  polymarkers
 +     bit 4  wide lines
 +     bit 5  styled lines
 +     bit 6  wide styled lines
 +     bit 7  interiors
 + polygon capabilities
 +     bit 0  polygons
 +     bit 1  rectangles
 +     bit 2  trapezoids
 +     bit 3  scanlines
 +     bit 4  wide borders
 +     bit 5  styled borders
 +     bit 6  wide styled borders
 +     bit 7  interiors
 + text capabilities
 +     bit 0  output precision character
 +     bit 1  output precision stroke
 +     bit 2  clippping precision stroke
 +     bit 3  90-degree character rotation
 +     bit 4  arbitrary character rotation
 +     bit 5  independent X and Y scaling
 +     bit 6  double-size
 +     bit 7  integer scaling
 +     bit 8  continuous scaling
 +     bit 9  bold
 +     bit 10 italic
 +     bit 11 underline
 +     bit 12 strikeout
 +     bit 13 raster fonts
 +     bit 14 vector fonts
 +     bit 15 reserved
 + clipping capabilities
 +     00h none
 +     01h clipping to rectangles
 + raster capabilities
 +     bit 0  simple bitBLT
 +     bit 1  device requires banding support
 +     bit 2  device requires scaling support
 +     bit 3  supports >64K bitmap
 +Note:  This function returns the device-capability bits for the given display
 +----------2F1900-----------------------------
 +INT 2F U - DOS 4.x only SHELLB.COM - INSTALLATION CHECK
 + AX = 1900h
 +Return: AL = 00h  not installed
 +      FFh  installed
 +----------2F1901BL00-------------------------
 +INT 2F U - DOS 4.x only SHELLB.COM - SHELLC.EXE INTERFACE
 + AX = 1901h
 + BL = 00h if SHELLC transient
 +      01h if SHELLC resident
 + DS:DX -> far call entry point for resident SHELLC.EXE
 +Return: ES:DI -> SHELLC.EXE workspace within SHELLB.COM
 +Note: SHELLB.COM and SHELLC.EXE are parts of the DOS 4.x shell
 +----------2F1902-----------------------------
 +INT 2F U - DOS 4.x only SHELLB.COM - COMMAND.COM INTERFACE
 + AX = 1902h
 + ES:DI -> ASCIZ full filename of current batch file, with at least the
 + final filename element uppercased
 + DS:DX -> buffer for results
 +Return: AL = 00h  failed, either
 +   (a) final filename element quoted at ES:DI does not match
 +       identity of shell batch file quoted as parameter of most
 +       recent call of SHELLB command, or
 +   (b) no more Program Start Commands available.
 + AL= FFh success, then:
 + memory at DS:[DX+1] onwards filled as:
 + DX+1: BYTE count of bytes of PSC
 + DX+2: N BYTEs Program Start Command text
 + BYTE 0Dh terminator 
 +Explanation: COMMAND.COM executes the result of this call in preference to 
 + reading a command from a batch file. Thus the batch file does not
 + advance in execution for so long as SHELLB provides PSCs from its
 + workspace. The PSCs are planted in SHELLB workspace by SHELLC, the user
 + menu interface. The final PSC of a sequence is finished with a 
 + GOTO COMMON, which causes a loop back in the batch file which called
 + SHELLC so as to execute SHELLC again. The check on batch file name
 + permits PSCs to CALL nested batch files while PSCs are still stacked
 + up for subsequent execution.
 +----------2F1903-----------------------------
 +INT 2F U - DOS 4.x only SHELLB.COM - COMMAND.COM interface
 + AX = 1903h
 + ES:DI -> ASCIZ batch file name as for AX=1902h
 +Return: AL = FFh if quoted batch file name matches last SHELLB parameter
 + AL = 00h if it does not
 +----------2F1904-----------------------------
 +INT 2F U - DOS 4.x only SHELLB.COM - SHELLB transient to TSR intrface
 + AX = 1904h
 +Return: ES:DI -> name of current shell batch file:
 + WORD number of bytes of name following
 + BYTEs (8 max) uppercase name of shell batch file
 +----------2F1A00-----------------------------
 +INT 2F - DOS 4+ ANSI.SYS - INSTALLATION CHECK
 + AX = 1A00h
 +Return: AL = FFh if installed
 +Notes: AVATAR.SYS also responds to this call
 + documented for DOS 5+, but undocumented for DOS 4.x
 +----------2F1A00BX4156-----------------------
 +INT 2F - AVATAR.SYS - INSTALLATION CHECK
 + AX = 1A00h
 + BX = 4156h ('AV')
 + CX = 4154h ('AT')
 + DX = 4152h ('AR')
 +Return: AL = FFh if installed
 +     CF clear
 +     BX = AVATAR protocol level supported
 +     CX = driver type
 + 0000h AVATAR.SYS
 + 4456h DVAVATAR.COM inside DESQview window
 +     DX = 0016h
 +Notes: AVATAR also identifies itself as ANSI.SYS if BX, CX, or DX differ from
 +   the magic values
 + AVATAR.SYS is a CON replacement by George Adam Stanislav which
 +   interprets AVATAR command codes in the same way that ANSI interprets
 +   ANSI command codes
 +----------2F1A01-----------------------------
 +INT 2F U - DOS 4+ ANSI.SYS internal - GET/SET DISPLAY INFORMATION
 + AX = 1A01h
 + CL = function
 +     7Fh for GET
 +     5Fh for SET
 + DS:DX -> parm block as for INT 21,AX=440Ch,CX=037Fh/035Fh respectively
 +Return: CF set on error
 +     AX = error code (many non-standard)
 + CF clear if successful
 +     AX destroyed
 +Note: presumably this is the DOS IOCTL interface to ANSI.SYS
 +SeeAlso: AX=1A02h,INT 21/AX=440Ch
 +----------2F1A02-----------------------------
 +INT 2F U - DOS 4+ ANSI.SYS internal - MISCELLANEOUS REQUESTS
 + AX = 1A02h
 + DS:DX -> parameter block (see below)
 +Note: DOS 5.0 chains to previous handler if AL > 02h on call
 +SeeAlso: AX=1A01h
 +
 +Format of parameter block:
 +Offset Size Description
 + 00h BYTE subfunction
 + 00h set/reset interlock
 + 01h get /L flag
 + 01h BYTE interlock state
 + 00h=reset, 01h=set
 +   This interlock prevents some of the ANSI.SYS post-processing
 +   in its hook onto INT 10, AH=00h mode set
 + 02h BYTE (returned)
 + 00h if /L not in effect
 + 01h if /L in effect
 +----------2F1A21-----------------------------
 +INT 2F - AVATAR.SYS - SET DRIVER STATE
 + AX = 1A21h (AL='!')
 + DS:SI -> command string with one or more state characters
 + CX = length of command string
 +Return: CF set on error (invalid subfunction)
 + CF clear if successful
 +Note: the characters in the state string are interpreted left to right, and
 +   need not be in any particular order
 +SeeAlso: AX=1A3Fh
 +
 +Values of state characters:
 + 'a' activate driver
 + 'd' disable driver
 + 'f' use fast screen output
 + 'g' always convert gray keys (+ and -) to function keys
 + 'G' never convert gray keys
 + 'l' convert gray keys only when ScrollLock active
 + 's' use slow screen output
 + 't' Tandy 1000 keyboard (not yet implemented)
 +----------2F1A3C-----------------------------
 +INT 2F U - AVATAR.SYS v0.11 - ???
 + AX = 1A3Ch
 + ???
 +Return: CX = 0000h
 +----------2F1A3E-----------------------------
 +INT 2F U - AVATAR.SYS v0.11 - ???
 + AX = 1A3Eh
 + CL = ???
 + CH = ???
 + DL = ???
 + DH = ???
 +Return: CL = ???
 + CH = ???
 + DL = ???
 + DH = ???
 +----------2F1A3F-----------------------------
 +INT 2F - AVATAR.SYS - QUERY DRIVER STATE
 + AX = 1A3Fh (AL='?')
 + ES:DI -> buffer
 + CX = length of buffer in bytes
 +Return: CF clear
 + CX = actual size of returned info
 +Note: the returned information consists of multiple letters whose meanings
 +   are described under AX=1A21h
 +SeeAlso: AX=1A21h
 +----------2F1A42BX4156-----------------------
 +INT 2F - AVATAR Serial Dispatcher - INSTALL IRQ3 HANDLER
 + AX = 1A42h
 + BX = 4156h ('AV')
 + ES:DI -> FAR handler for serial port using IRQ3
 + DS = data segment needed by handler
 +Return: AX = 1A42h if ASD not installed
 +    = 0000h if no more room
 +    else handle to use when uninstalling
 +Notes: the handler need not save/restore registers or signal EOI to the
 +   interrupt controller
 + the handler should return AX=0000h if the interrupt was meant for it,
 +   and either leave AX unchanged or return a non-zero value otherwise
 + the most recently installed handler will be called first, continuing
 +   to earlier handlers until one returns AX=0000h
 +SeeAlso: AX=1A43h,AX=1A62h
 +----------2F1A43BX4156-----------------------
 +INT 2F - AVATAR Serial Dispatcher - INSTALL IRQ4 HANDLER
 + AX = 1A43h
 + BX = 4156h ('AV')
 + ES:DI -> FAR handler for serial port using IRQ4
 + DS = data segment needed by handler
 +Return: AX = 1A43h if ASD not installed
 +    = 0000h if no more room
 +    else handle to use when uninstalling
 +Notes: (see AX=1A42h)
 +SeeAlso: AX=1A42h,AX=1A63h
 +----------2F1A44BX4156-----------------------
 +INT 2F - AVATAR.SYS v0.11+ - GET DATA SEGMENT
 + AX = 1A44h
 + BX = 4156h ('AV')
 +Return: AX = 0000h
 + DS = data segment
 + CX = size of data segment
 +Note: AVATAR.SYS calls this function whenever it is invoked. If each
 +   process under a multitasker hooks this function and provides a
 +   separate data segment, AVATAR.SYS becomes fully reentrant.
 +SeeAlso: AX=1A21h,AX=1A3Fh
 +----------2F1A52-----------------------------
 +INT 2F U - AVATAR.SYS v0.11 - GET ???
 + AX = 1A52h
 + CX = size of buffer
 + ES:DI -> buffer
 +Return: ??? copied into user buffer
 +Note: the maximum size of the data which may be copied is returned by
 +   AX=1A72h
 +SeeAlso: AX=1A72h
 +----------2F1A53-----------------------------
 +INT 2F U - AVATAR.SYS v0.11 - ???
 + AX = 1A53h
 + CL = ??? (00h-05h)
 + ???
 +Return: ???
 +----------2F1A62BX4156-----------------------
 +INT 2F - AVATAR Serial Dispatcher - UNINSTALL IRQ3 HANDLER
 + AX = 1A62h
 + BX = 4156h ('AV')
 + CX = handle for IRQ routine returned by AX=1A42h
 +SeeAlso: AX=1A42h,AX=1A63h
 +----------2F1A63BX4156-----------------------
 +INT 2F - AVATAR Serial Dispatcher - UNINSTALL IRQ4 HANDLER
 + AX = 1A63h
 + BX = 4156h ('AV')
 + CX = handle for IRQ routine returned by AX=1A43h
 +SeeAlso: AX=1A43h,AX=1A62h
 +----------2F1A72-----------------------------
 +INT 2F U - AVATAR.SYS v0.11 - GET ??? SIZE
 + AX = 1A72h
 +Return: CX = maximum size of ???
 +SeeAlso: AX=1A52h
 +----------2F1A7B-----------------------------
 +INT 2F U - AVATAR.SYS v0.11 - ???
 + AX = 1A7Bh
 +Return: AX = 0000h
 + CX = 0000h
 +----------2F1A7D-----------------------------
 +INT 2F U - AVATAR.SYS v0.11 - ???
 + AX = 1A7Dh
 +Return: AX = ???
 +----------2F1AADDX0000-----------------------
 +INT 2F U - AVATAR.SYS v0.11 - ???
 + AX = 1AADh
 + DX = 0000h
 + CX = subfunction (00h-0Ch)
 + ???
 +Return: AX = 0000h if DX was nonzero
 + ???
 +----------2F1B00-----------------------------
 +INT 2F U - DOS 4+ XMA2EMS.SYS extension internal - INSTALLATION CHECK
 + AX = 1B00h
 +Return: AL = FFh if installed
 +Note: XMA2EMS.SYS extension is only installed if DOS has page frames to hide.
 + This extension hooks onto INT 67/AH=58h and returns from that call data
 +   which excludes the physical pages being used by DOS.
 +SeeAlso: AH=1Bh"FRAME INFO"
 +----------2F1B-------------------------------
 +INT 2F U - DOS 4+ XMA2EMS.SYS extension internal - GET HIDDEN FRAME INFORMATION
 + AH = 1Bh
 + AL <> 00h
 + DI = hidden physical page number
 +Return: AX = FFFFh if failed (no such hidden page)
 + AX = 0000h if OK, then
 +      ES = segment of page frame
 +      DI = physical page number
 +Notes: this corresponds to the data edited out of the INT 67/AH=58h call
 + FASTOPEN makes this call with AL = FFh
 +SeeAlso: AX=1B00h
 +----------2F2300-----------------------------
 +INT 2F - DR-DOS 5.0 GRAFTABL - INSTALLATION CHECK
 + AX = 2300h
 +Return: AH = FFh
 +Note: this installation check does not follow the usual format
 +SeeAlso: AH=23h
 +----------2F23-------------------------------
 +INT 2F - DR-DOS 5.0 GRAFTABL - GET GRAPHICS DATA
 + AH = 23h
 + AL nonzero
 +Return: AH = FFh
 + ES:BX -> graphics data
 +SeeAlso: AX=2300h
 +----------2F2700-----------------------------
 +INT 2F - DR-DOS 6.0 TaskMAX - INSTALLATION CHECK
 + AX = 2700h
 +Return: AL = 00h not installed
 +    = FFh installed
 +----------2F2701-----------------------------
 +INT 2F - DR-DOS 6.0 TaskMAX - GET STATUS
 + AX = 2701h
 +Return: AX = maximum simultaneous tasks
 + BX = index into TASK_IDS of current foreground task
 + CX = currently-active tasks
 + DX = version number (DR-DOS 6.0 = 0001h)
 + ES:SI -> TASK_IDS
 + ES:DI -> name table (array of 8-byte names, NUL-terminated if <8 chars)
 +Notes: do not attempt to create a new task if CX == AX
 + the task's index is its position on the task menu, while its ID is the
 +   position within the internal task name table
 +SeeAlso: AX=2714h,AX=2716h
 +----------2F2702-----------------------------
 +INT 2F - DR-DOS 6.0 TaskMAX - GET PER-TASK EMS LIMIT
 + AX = 2702h
 +Return: DX = maximum pages INT 67/AH=42h will report available
 +Note: TaskMAX does not limit EMS allocations other than by limiting the
 +   amount which is reported as being available at a given time
 +SeeAlso: AX=2703h,INT 67/AH=42h
 +----------2F2703-----------------------------
 +INT 2F - DR-DOS 6.0 TaskMAX - SET PER-TASK EMS LIMIT
 + AX = 2703h
 + DX = maximum pages INT 67/AH=42h should report available
 +Return: DX = new maximum for reporting
 +SeeAlso: AX=2702h,INT 67/AH=42h
 +----------2F2704-----------------------------
 +INT 2F - DR-DOS 6.0 TaskMAX - REGISTER/UNREGISTER TASK MANAGER
 + AX = 2704h
 + DL = subfunction
 +     00h unregister task manager
 +     01h register task manager
 +Return: DL = status
 +     00h registered
 +     01h unregistered
 +Notes: a task manager replaces TaskMAX's menu system with its own user
 +   interface; while one is registered, the TaskMAX hotkeys and
 +   Ctrl-Alt-Del invoke the manager rather than the built-in menu system
 + unregister the task manager before terminating it
 +SeeAlso: AX=2705h
 +----------2F2705-----------------------------
 +INT 2F - DR-DOS 6.0 TaskMAX - ENABLE/DISABLE DIRECT SWITCHING
 + AX = 2705h
 + DL = subfunction
 +     00h disable keystrokes for switching to next/prev/specified task
 +     01h enable
 +Return: nothing
 +Note: should only be called by a registered task manager (see AX=2704h)
 +SeeAlso: AX=2704h,AX=2706h
 +----------2F2706-----------------------------
 +INT 2F - DR-DOS 6.0 TaskMAX - SWITCH TO SPECIFIED TASK
 + AX = 2706h
 + DX = task index (see AX=2701h) of task to be activated
 +Return: DX = task index of previously-active task
 +SeeAlso: AX=2705h,AX=2707h,AX=2715h
 +----------2F2707-----------------------------
 +INT 2F - DR-DOS 6.0 TaskMAX - CREATE NEW TASK
 + AX = 2707h
 + DS:DX -> ASCIZ pathname of executable
 + ES:BX -> parameter block (see below)
 + CX = number of ticks before automatic return to task manager
 + (0000h = run until termination or explicitly switched)
 +Return: DX = new task's task index (FFFFh if task terminated)
 +SeeAlso: AX=2706h,AX=2708h
 +
 +Format of parameter block:
 +Offset Size Description
 + 00h WORD reserved, should be 0000h
 + 02h DWORD pointer to command tail to be copied into child's PSP
 + 06h DWORD pointer to first FCB to be copied into child's PSP
 + 0Ah DWORD pointer to second FCB to be copied into child's PSP
 +----------2F2708-----------------------------
 +INT 2F - DR-DOS 6.0 TaskMAX - DELETE TASK
 + AX = 2708h
 + DX = task index
 +Return: DX = FFFFh (task deleted)
 +Notes: this call should only be used for abnormal task termination, after
 +   first checking for open files with AX=270Ch; should not be used
 +   with programs that allocate EMS or XMS memory
 + switches to specified task first
 +SeeAlso: AX=2707h
 +----------2F2709-----------------------------
 +INT 2F - DR-DOS 6.0 TaskMAX - NAME TASK
 + AX = 2709h
 + DX = task index
 + DS:SI -> 8-byte name (8 NULs = remove name)
 +Return: AL = task flags
 +     00h ID unused or task terminated
 +     01h ID in use, task name table entry valid
 +     81h ID in use, task name fixed
 + BX = task ID
 + ES:DI -> name in task name table (see AX=2701h)
 +Note: the task retains the given name until it terminates or the name is
 +   removed by specifying a name of 8 NULs.
 +SeeAlso: AX=2701h,AX=2707h
 +----------2F270A-----------------------------
 +INT 2F - DR-DOS 6.0 TaskMAX - CONVERT TASK INDEX TO TASK ID
 + AX = 270Ah
 + DX = task index
 +Return: DX = task ID (FFFFh if index invalid)
 +Note: task IDs stay constant, while indexes can change when other tasks are
 +   deleted
 +SeeAlso: AX=2701h,AX=270Bh
 +----------2F270B-----------------------------
 +INT 2F - DR-DOS 6.0 TaskMAX - CONVERT TASK ID TO TASK INDEX
 + AX = 270Bh
 + DX = task ID
 +Return: DX = task index (FFFFh if task not active)
 +SeeAlso: AX=270Ah
 +----------2F270C-----------------------------
 +INT 2F - DR-DOS 6.0 TaskMAX - CHECK OPEN FILES
 + AX = 270Ch
 + DX = task index
 +Return: AX = number of files currently open for specified task
 +SeeAlso: AX=2708h
 +----------2F270D-----------------------------
 +INT 2F - DR-DOS 6.0 TaskMAX - CHECK IF TASK RUNNING PRIMARY COMMAND INTERPRETER
 + AX = 270Dh
 + DX = task index
 +Return: DX = status
 +     0000h if primary command interpreter (COMMAND.COM, etc.) running
 +     0001h if not in root shell for task
 +Note: TaskMAX will return 0001h if the specified task has spawned another
 +   command interpreter with AX=2707h
 +SeeAlso: AX=2707h,AX=270Ch
 +----------2F270E-----------------------------
 +INT 2F - DR-DOS 6.0 TaskMAX - GET/SET TEXT PASTE LEAD-IN
 + AX = 270Eh
 + CX = length of string (max 15 keystrokes, 0000h to get current string)
 + DS:SI -> pasting lead-in string (character/scan-code pairs)
 +Return: ES:DI -> current lead-in string
 +Note: the specified sequence of keystrokes is sent to the application before
 +   every line of a text-mode spreadsheet paste
 +SeeAlso: AX=270Fh,AX=2710h,AX=2713h
 +----------2F270F-----------------------------
 +INT 2F - DR-DOS 6.0 TaskMAX - GET/SET NUMERIC PASTE LEAD-IN
 + AX = 270Fh
 + CX = length of string (max 15 keystrokes, 0000h to get current string)
 + DS:SI -> pasting lead-in string (character/scan-code pairs)
 +Return: ES:DI -> current lead-in string
 +Note: the specified sequence of keystrokes is sent to the application before
 +   every number in a numeric-mode spreadsheet paste
 +SeeAlso: AX=270Eh,AX=2710h,AX=2711h,AX=2713h
 +----------2F2710-----------------------------
 +INT 2F - DR-DOS 6.0 TaskMAX - GET/SET PASTE LINE TERMINATOR STRING
 + AX = 2710h
 + CX = length of string (max 15 keystrokes, 0000h to get current string)
 + DS:SI -> pasting lead-in string (character/scan-code pairs)
 +Return: ES:DI -> current lead-in string
 +Note: the specified sequence of keystrokes is sent to the application after
 +   every line of a spreadsheet paste operation
 +SeeAlso: AX=270Eh,AX=270Fh,AX=2713h
 +----------2F2711-----------------------------
 +INT 2F - DR-DOS 6.0 TaskMAX - GET/SET NUMERIC PASTE DECIMAL POINT
 + AX = 2711h
 + DX = ASCII code for separator (FFFFh to get current)
 +Return: DL = current separator character
 +SeeAlso: AX=270Fh
 +----------2F2712-----------------------------
 +INT 2F - DR-DOS 6.0 TaskMAX - INITIATE EXPORTING TASK DATA
 + AX = 2712h
 + DX = task index
 +----------2F2713-----------------------------
 +INT 2F - DR-DOS 6.0 TaskMAX - INITIATE PASTE OPERATION
 + AX = 2713h
 + DX = task index
 + CX = past mode
 +     0000h alphanumeric
 +     0001h numeric
 +     0002h text
 +SeeAlso: AX=270Eh,AX=270Fh,AX=2710h,AX=2711h
 +----------2F2714-----------------------------
 +INT 2F - DR-DOS 6.0 TaskMAX - GET SWAP SPACE INFO
 + AX = 2714h
 +Return: CX = total KB of swap space
 + DX = available KB of swap space
 +SeeAlso: AX=2701h
 +----------2F2715-----------------------------
 +INT 2F - DR-DOS 6.0 TaskMAX - SWITCH TO TASK MANAGER
 + AX = 2715h
 +Return: only after calling task is again selected
 +SeeAlso: AX=2706h
 +----------2F2716-----------------------------
 +INT 2F - DR-DOS 6.0 TaskMAX - GET PASTE BUFFER STATUS
 + AX = 2716h
 +Return: AX = 0000h if AX=2716h,AX=2717h,AX=2718h supported
 +     CX = bytes in paste buffer
 +     DX = current generation number (updated after every copy operation)
 +SeeAlso: AX=2701h,AX=2713h,AX=2714h,AX=2717h,AX=2718h
 +----------2F2717-----------------------------
 +INT 2F - DR-DOS 6.0 TaskMAX - PASTE DATA DIRECTLY TO APPLICATION BUFFER
 + AX = 2717h
 + CX = bytes in destination buffer
 + ES:DI -> destination buffer
 +Return: AX = 0000h if function supported
 +     CX = bytes actually copied (FFFFh if buffer too small)
 +     DX = current generation number for paste buffer
 +Note: the destination buffer may be too small if another task adds more data
 +   to the paste buffer after the AX=2716h call but before this call
 +SeeAlso: AX=2713h,AX=2716h,AX=2718h
 +----------2F2718-----------------------------
 +INT 2F - DR-DOS 6.0 TaskMAX - COPY DATA DIRECTLY INTO PASTE BUFFER
 + AX = 2718h
 + CX = bytes in source buffer
 + DS:SI -> source buffer (plain ASCII, lines terminated with CR LF)
 +Return: AX = 0000h if function supported
 +     CX = bytes actually copied
 +     DX = current generation number for paste buffer
 +SeeAlso: AX=2712h,AX=2716h,AX=2717h
 +----------2F2A-------------------------------
 +INT 2F - Gammafax DOS Dispatcher INTERFACE
 + AH = 2Ah
 +Note: details not available at this time
 +SeeAlso: AX=8000h"FaxBIOS",AX=CB00h,AX=CBDDh,INT 66"BitFax"
 +----------2F3900-----------------------------
 +INT 2F - Kingswood TSR INTERFACE - COMPATIBILITY MODE
 + AX = 3900h
 +Return: AL = status
 +     00h not installed
 +     FFh one or more TSRs using this interface is installed
 +Note: this function is provided to that the multiplex number will appear used
 +   to other programs
 +SeeAlso: AH=39h/BL=00h
 +----------2F39--BL00-------------------------
 +INT 2F - Kingswood TSR INTERFACE - INSTALLATION CHECK
 + AH = 39h
 + BL = 00h
 + AL = TSR ID number (01h-FFh, currently only 01h-0Eh used) (see below)
 +Return: AL = status
 +     00h not installed
 +     FFh installed
 + DX = segment address of resident module
 +Note: All of Kingswood Software's TSRs use this interface.  Usually the
 +   resident module is installed by allocating a block of upper memory,
 +   setting its owner ID to 0008h (DOS data), and filling the MCB name
 +   field with the TSR's name.
 +SeeAlso: AX=3900h,AH=39h/BL=01h
 +
 +Values for TSR ID number:
 + 01h TSR Windows
 + 02h NOBUSY
 + 03h CD STACK
 + 04h DISK WATCH
 + 05h PUSHBP
 + 06h ALIAS
 + 07h KEYMACRO
 + 08h SLOWDOWN
 + 09h ANSIGRAB
 + 0Ah TEE
 + 0Bh FASTMOUS
 + 0Ch EXTWILD
 + 0Dh BREAKOUT
 + 0Eh STOPDISK
 +
 +Format of TSR modules:
 +Offset Size Description
 + 00h  4 BYTEs signature "FTSR"
 + 04h WORD segment address of this module
 + 06h WORD number of words to skip (usually 0000h if no PSP present)
 + 08h  N WORDs module-defined data that must be at a fixed segment offset
 + (usually only a PSP if file access is required)
 +     5N BYTEs interrupt list (see below)
 + BYTE FFh terminator
 +
 +Format of interrupt list entry:
 +Offset Size Description
 + 00h BYTE interrupt number (00h-FEh)
 + 01h WORD offset within segment of DWORD pointer to previous interrupt
 + 03h WORD offset within segment of begin of interrupt handler code
 +----------2F39--BL01-------------------------
 +INT 2F - Kingswood TSR INTERFACE - REMOVAL CHECK
 + AH = 39h
 + BL = 01h
 + AL = TSR ID number (01h-FFh) (see AH=39h/BL=00h)
 +Return: AL = status
 +     00h not ready to be removed
 +     FFh resident module may be removed by deassigning the interrupts
 + hooked by the TSR and deallocating the TSR's memory block
 + AH,BX,CX,DX,ES may be destroyed
 +SeeAlso: AX=3900h,AH=39h/BL=00h
 +----------2F39-------------------------------
 +INT 2F - Kingswood TSR INTERFACE - APPLICATION-SPECIFIC FUNCTION CALLS
 + AH = 39h
 + BL = function number (02h-FFh)
 + AL = TSR ID number (01h-FFh)
 + CX,DX,SI,DI,DS,ES may contain parameters
 +Return: as appropriate for the called function
 +SeeAlso: AX=3900h,AH=39h/BL=00h,AX=3901h/BL=02h
 +----------2F3901BL02-------------------------
 +INT 2F - Kingswood TSR Windows - OPEN WINDOW
 + AX = 3901h
 + BL = 02h
 +Return: AX = error code (0000h if successful)
 +Notes: opens the next TSR window on top of any others. Only three
 +   TSR windows can be opened at any one time.  The three windows
 +   are all 40x11 characters, partly overlapping.
 +SeeAlso: AH=39h/BL=00h,AX=3901h/BL=03h,AX=3901h/BL=05h,AX=3901h/BL=06h
 +----------2F3901BL03-------------------------
 +INT 2F - Kingswood TSR Windows - HIDE WINDOWS
 + AX = 3901h
 + BL = 03h
 +Return: AX = error code (0000h if successful)
 +Notes: Hide any visible TSR windows from view.
 +SeeAlso: AH=39h/BL=00h,AX=3901h/BL=02h,AX=3901h/BL=05h
 +----------2F3901BL04-------------------------
 +INT 2F - Kingswood TSR Windows - SHOW WINDOWS
 + AX = 3901h
 + BL = 04h
 +Return: AX = error code (0000h if successful)
 +Notes: Re-display all TSR windows after a HIDE WINDOWS call.
 +SeeAlso: AH=39h/BL=00h,AX=3901h/BL=02h,AX=3901h/BL=03h
 +----------2F3901BL05-------------------------
 +INT 2F - Kingswood TSR Windows - CLOSE WINDOW
 + AX = 3901h
 + BL = 05h
 +Return: AX = error code (0000h if successful)
 +Notes: Close the last opened TSR window.
 +SeeAlso: AH=39h/BL=00h,AX=3901h/BL=02h
 +----------2F3901BL06-------------------------
 +INT 2F - Kingswood TSR Windows - SET WINDOW TITLE
 + AX = 3901h
 + BL = 06h
 + DS:SI -> title string
 +Return: AX = error code (0000h if successful)
 +SeeAlso: AH=39h/BL=00h,AX=3901h/BL=02h
 +----------2F3901BL07-------------------------
 +INT 2F - Kingswood TSR Windows - POSITION CURSOR
 + AX = 3901h
 + BL = 07h
 + CH = Y coordinate (0-10)
 + CL = X coordinate (0-39)
 +Return: AX = error code (0000h if successful)
 +Note: the hardware cursor is always disabled when a TSR window is opened;
 +   this call only sets a text position
 +SeeAlso: AH=39h/BL=00h,AX=3901h/BL=08h,AX=3901h/BL=09h
 +----------2F3901BL08-------------------------
 +INT 2F - Kingswood TSR Windows - DISPLAY STRING
 + AX = 3901h
 + BL = 08h
 + DS:SI -> string
 +Return: AX = error code (0000h if successful)
 +Notes: The text is not clipped.
 + This routine understands Tab, NewLine and Carriage Return
 +SeeAlso: AH=39h/BL=00h,AX=3901h/BL=07h
 +----------2F3901BL09-------------------------
 +INT 2F - Kingswood TSR Windows - SCROLL WINDOW
 + AX = 3901h
 + BL = 09h
 + CL = scroll direction: 00h up, FFh down, 00h clear window
 +Return: AX = error code (0000h if successful)
 +SeeAlso: AH=39h/BL=00h,AX=3901h/BL=07h
 +----------2F3901BL0A-------------------------
 +INT 2F - Kingswood TSR Windows - SOUND BEEPER
 + AX = 3901h
 + BL = 0Ah
 + DX = sound divisor, or 0 for silence.
 +      (divide 1843200 by required frequency to get value for DX)
 + CL = sound length in 18.2 Hz clock ticks
 +Return: AX = error code (0000h if successful)
 +SeeAlso: AH=39h/BL=00h
 +----------2F3901BL0B-------------------------
 +INT 2F - Kingswood TSR Windows - ADD OR REMOVE USER
 + AX = 3901h
 + BL = 0Bh
 + CL = number of users increment: +1 if adding a new user
 + -1 if removing a user
 +Return: AX = error code (0000h if successful)
 +Note: the TSR windows resident module may only be removed when the internal
 +   user count is zero
 +SeeAlso: AH=39h/BL=00h,AX=3901h/BL=02h
 +----------2F4000-----------------------------
 +INT 2F - Windows 3.x (OS/2 2.x???) - GET VIRTUAL DEVICE DRIVER (VDD) CAPABLTIES
 + AX = 4000h
 +Return: AL = 01h does not virtualize video access
 +      02h virtualizes the video when in text mode
 +      03h virtualizes the video when in text mode or single plane
 + graphics modes
 +      04h virtualizes the video when in text mode, single plane
 + graphics modes, and VGA multiplane modes
 +      FFh virtualizes the video fully
 +Note: this function is used by display drivers to find out what capabilities
 +   exist for the VDD driver and also trigger then VDD driver to call
 +   functions 4005h and 4006h.  This function also gives the Video Driver
 +   hardware access to the video registers.
 +----------2F4001-----------------------------
 +INT 2F - OS/2 compatibility box - SWITCHING DOS TO BACKGROUND
 + AX = 4001h
 +Note: called by OS/2 when the DOS box is about to be placed in the background
 +   and the video driver should save any necessary state
 +SeeAlso: AX=4002h,AX=4005h
 +----------2F4002-----------------------------
 +INT 2F - OS/2 compatibility box - SWITCHING DOS TO FOREGROUND
 + AX = 4002h
 +Note: called by OS/2 when the DOS box is about to be placed in the foreground
 +   and the video driver should restore the previously-saved state
 +SeeAlso: AX=4001h,AX=4006h
 +----------2F4003-----------------------------
 +INT 2F - Windows 3.x - ENTERING VIDEO DRIVER CRITICAL SECTION
 + AX = 4003h
 +Note: This critical section must be exited within 1 second.
 +SeeAlso: AX=4004h
 +----------2F4004-----------------------------
 +INT 2F - Windows 3.x - EXITING VIDEO DRIVER CRITICAL SECTION
 + AX = 4004h
 +SeeAlso: AX=4003h
 +----------2F4005-----------------------------
 +INT 2F - Windows 3.x - SWITCHING DOS TO BACKGROUND
 + AX = 4005h
 +Note: called by Windows when the DOS box is about to be placed in the
 +   background and the video driver should save any necessary state
 +   information
 +SeeAlso: AX=4001h,AX=4006h
 +----------2F4006-----------------------------
 +INT 2F - Windows 3.x - SWITCHING DOS TO FOREGROUND
 + AX = 4006h
 +Note: called by Windows when the DOS box is about to be placed in the
 +   foreground and the video driver should restore any necessary state
 +   information
 +SeeAlso: AX=4002h,AX=4005h
 +----------2F4007-----------------------------
 +INT 2F - Windows 3.x - ENABLE VDD TRAPPING OF VIDEO REGISTERS
 + AX = 4007h
 +----------2F41-------------------------------
 +INT 2F - LAN Manager 2.0 DOS Enhanced NETPOPUP.EXE - NETWORK POP-UP SERVICE
 + AH = 41h
 + ???
 +Return: ???
 +Note: LAN Manager enhanced mode adds features beyond the standard redirector
 +   file/printer services
 +SeeAlso: AX=118Ah,AH=42h,AH=4Bh
 +----------2F42-------------------------------
 +INT 2F - LAN Manager 2.0 DOS Enhanced MSRV.EXE - MESSENGER SERVICE
 + AH = 42h
 + ???
 +Return: ???
 +Note: LAN Manager enhanced mode adds features beyond the standard redirector
 +   file/printer services
 +SeeAlso: AX=118Ah,AH=41h,AH=4Bh
 +----------2F4300-----------------------------
 +INT 2F - EXTENDED MEMORY SPECIFICATION (XMS) - INSTALLATION CHECK
 + AX = 4300h
 +Return: AL = 80h XMS driver installed
 + AL <> 80h no driver
 +Notes: XMS gives access to extended memory and noncontiguous/nonEMS memory
 +   above 640K
 + this installation check DOES NOT follow the format used by other
 +   software
 +SeeAlso: AX=4310h
 +----------2F4310-----------------------------
 +INT 2F - EXTENDED MEMORY SPECIFICATION (XMS) - GET DRIVER ADDRESS
 + AX = 4310h
 +Return: ES:BX -> driver entry point
 +Note: HIMEM.SYS v2.77 chains to previous handler if AH is not 00h or 10h
 +SeeAlso: AX=4300h
 +
 +Perform a FAR call to the driver entry point with AH set to the function code
 + AH function
 + 00h  Get XMS version number
 +      Return: AX = XMS version (in BCD, AH=major, AL=minor)
 +      BX = internal revision number
 +      DX = 0001h if HMA (1M to 1M + 64K) exists
 +   0000h if HMA does not exist
 + 01h  Request High Memory Area (1M to 1M + 64K)
 +      DX = memory in bytes (for TSR or device drivers)
 +   FFFFh if application program
 +      Return: AX = 0001h success
 + = 0000h failure
 +    BL = error code (80h,81h,90h,91h,92h) (see below)
 + 02h  Release High Memory Area
 +      Return: AX = 0001h success
 + = 0000h failure
 +    BL = error code (80h,81h,90h,93h) (see below)
 + 03h  Global enable A20, for using the HMA
 +      Return: AX = 0001h success
 + = 0000h failure
 +    BL = error code (80h,81h,82h) (see below)
 + 04h  Global disable A20
 +      Return: AX = 0001h success
 + = 0000h failure
 +    BL = error code (80h,81h,82h,94h) (see below)
 + 05h  Local enable A20, for direct access to extended memory
 +      Return: AX = 0001h success
 + = 0000h failure
 +    BL = error code (80h,81h,82h) (see below)
 + 06h  Local disable A20
 +      Return: AX = 0001h success
 + = 0000h failure
 +    BL = error code (80h,81h,82h,94h) (see below)
 + 07h  Query A20 state
 +      Return: AX = 0001h enabled
 + = 0000h disabled
 +      BL = error code (00h,80h,81h) (see below)
 + 08h  Query free extended memory, not counting HMA
 +      BL = 00h (some implementations leave BL unchanged on success)
 +      Return: AX = size of largest extended memory block in K
 +      DX = total extended memory in K
 +      BL = error code (00h,80h,81h,A0h) (see below)
 + 09h  Allocate extended memory block
 +      DX = Kbytes needed
 +      Return: AX = 0001h success
 +    DX = handle for memory block
 + = 0000h failure
 +    BL = error code (80h,81h,A0h) (see below)
 + 0Ah  Free extended memory block
 +      DX = handle of block to free
 +      Return: AX = 0001h success
 + = 0000h failure
 +    BL = error code (80h,81h,A2h,ABh) (see below)
 + 0Bh  Move extended memory block
 +      DS:SI -> EMM structure (see below)
 +      Note: if either handle is 0000h, the corresponding offset is
 +    considered to be an absolute segment:offset address in
 +    directly addressable memory
 +      Return: AX = 0001h success
 + = 0000h failure
 +    BL = error code (80h-82h,A3h-A9h) (see below)
 + 0Ch  Lock extended memory block
 +      DX = handle of block to lock
 +      Return: AX = 0001h success
 +    DX:BX = 32-bit linear address of locked block
 + = 0000h failure
 +    BL = error code (80h,81h,A2h,ACh,ADh) (see below)
 + 0Dh  Unlock extended memory block
 +      DX = handle of block to unlock
 +      Return: AX = 0001h success
 + = 0000h failure
 +    BL = error code (80h,81h,A2h,AAh) (see below)
 + 0Eh  Get handle information
 +      DX = handle for which to get info
 +      Return: AX = 0001h success
 +    BH = block's lock count
 +    BL = number of free handles left
 +    DX = block size in K
 + = 0000h failure
 +    BL = error code (80h,81h,A2h) (see below)
 + 0Fh  Reallocate extended memory block
 +      DX = handle of block
 +      BX = new size of block in K
 +      Return: AX = 0001h success
 + = 0000h failure
 +    BL = error code (80h,81h,A0h-A2h,ABh) (see below)
 + 10h  Request upper memory block (nonEMS memory above 640K)
 +      DX = size of block in paragraphs
 +      Return: AX = 0001h success
 +    BX = segment address of UMB
 +    DX = actual size of block
 + = 0000h failure
 +    BL = error code (80h,B0h,B1h) (see below)
 +    DX = largest available block
 + 11h  Release upper memory block
 +      DX = segment address of UMB to release
 +      Return: AX = 0001h success
 + = 0000h failure
 +    BL = error code (80h,B2h) (see below)
 + 12h  (XMS v3.0) Reallocate upper memory block
 +      DX = segment address of UMB to resize
 +      BX = new size of block in paragraphs
 +      Return: AX = 0001h success
 + = 0000h failure
 +    BL = error code (80h,B0h,B2h) (see below)
 + 34h  (QEMM 5.11 only, undocumented) ???
 + 44h  (QEMM 5.11 only, undocumented) ???
 + 88h  (XMS v3.0) Query free extended memory
 +      Return: EAX = largest block of extended memory, in K
 +      BL = status
 +          00h success
 + 80h not implemented (i.e. on a 286 system)
 + 81h VDISK detected
 + A0h all extended memory allocated
 +            ECX = physical address of highest byte of memory
 +       (valid even on error codes 81h and A0h)
 +      EDX = total Kbytes of extended memory (0 if status A0h)
 + 89h  (XMS v3.0) Allocate any extended memory
 +      EDX = Kbytes needed
 +      Return: AX = 0001h success
 +           DX = handle for allocated block (free with AH=0Ah)
 + = 0000h failure
 +     BL = status (80h,81h,A0h,A1h,A2h) (see below)
 + 8Eh  (XMS v3.0) Get extended EMB handle information
 +      DX = handle
 +      Return: AX = 0001h success
 +           BH = block's lock count
 +     CX = number of free handles left
 +     EDX = block size in K
 +       = 0000h failure
 +           BL = status (80h,81h,A2h) (see below)
 + 8Fh  (XMS v3.0) Reallocate any extended memory block
 +      DX = unlocked handle
 +      EBX = new size in K
 +      Return: AX = 0001h success
 +       = 0000h failure
 +     BL = status (80h,81h,A0h-A2h,ABh) (see below)
 +Notes: HIMEM.SYS requires at least 256 bytes free stack space
 + the XMS driver need not implement functions 10h through 12h to be
 +   considered compliant with the standard
 +
 +Format of EMM structure:
 +Offset Size Description
 + 00h DWORD number of bytes to move (must be even)
 + 04h WORD source handle
 + 06h DWORD offset into source block
 + 0Ah WORD destination handle
 + 0Ch DWORD offset into destination block
 +Notes: if source and destination overlap, only forward moves (source base
 +   less than destination base) are guaranteed to work properly
 + if either handle is zero, the corresponding offset is interpreted
 +   as a real-mode address referring to memory directly addressable
 +   by the processor
 +
 +Error codes returned in BL:
 + 00h successful
 + 80h function not implemented
 + 81h Vdisk was detected
 + 82h an A20 error occurred
 + 8Eh a general driver error
 + 8Fh unrecoverable driver error
 + 90h HMA does not exist
 + 91h HMA is already in use
 + 92h DX is less than the /HMAMIN= parameter
 + 93h HMA is not allocated
 + 94h A20 line still enabled
 + A0h all extended memory is allocated
 + A1h all available extended memory handles are allocated
 + A2h invalid handle
 + A3h source handle is invalid
 + A4h source offset is invalid
 + A5h destination handle is invalid
 + A6h destination offset is invalid
 + A7h length is invalid
 + A8h move has an invalid overlap
 + A9h parity error occurred
 + AAh block is not locked
 + ABh block is locked
 + ACh block lock count overflowed
 + ADh lock failed
 + B0h only a smaller UMB is available
 + B1h no UMB's are available
 + B2h UMB segment number is invalid
 +----------2F44-------------------------------
 +INT 2F U - ???
 + AH = 44h
 + AL = function (at least 0Bh, 15h, 17h)
 + ???
 +Return: ???
 +Note: called by Codeview for Windows
 +SeeAlso: AH=86h
 +----------2F4500-----------------------------
 +INT 2F U - Microsoft Profiler (PROF.COM/VPROD.386) - INSTALLATION CHECK
 + AX = 4500h
 +Return: AL = 01h if PROF.COM installed
 + AL = 02h if VPROD.386 installed
 +SeeAlso: AX=4501h,AX=4502h
 +----------2F4501-----------------------------
 +INT 2F U - Microsoft Profiler (PROF.COM/VPROD.386) - SETUP PROFILER
 + AX = 4501h
 + BX = CSIPS buffer size in KB (first parameter for ProfSetup)
 + CX = output limit in KB (second parameter for ProfSetup)
 +Note: this call is not supported by PROF.COM
 +SeeAlso: AX=4502h,AX=4503h
 +----------2F4502-----------------------------
 +INT 2F U - Microsoft Profiler (PROF.COM/VPROD.386) - SET SAMPLING RATE
 + AX = 4502h
 + BL = sampling rate for PROF.COM (0 < BL <= 13)
 +     (01h = 8192/s, 04h = 1024/s, 08h = 32/s, 0Dh = 1/s)
 + CX = sampling rate for VPROD.386
 +Note: for PROF.COM, this programs the CMOS clock by setting BL+2 as the
 +   low four bits of CMOS register 0Ah.  The interruption rate is
 +   1 SHL (15 - BL) per second.
 +SeeAlso: AX=4501h,AX=4503h
 +----------2F4503-----------------------------
 +INT 2F U - Microsoft Profiler (PROF.COM/VPROD.386) - START PROFILING
 + AX = 4503h
 +Notes: Profiling is also turned on by the key combinations
 +   LeftShift + RightShift + Alt
 +   LeftShift + RightShift + Ctrl
 + for PROF.COM, this call programs the CMOS clock by reading register
 +   0Ch, and setting bit 6 of register 0Bh.  It then makes sure that IRQ8
 +   is unmasked
 +SeeAlso: AX=4504h
 +----------2F4504-----------------------------
 +INT 2F U - Microsoft Profiler (PROF.COM/VPROD.386) - STOP PROFILING
 + AX = 4504h
 +Notes: profiling is also turned off by the key combination
 +   LeftShift + RightShift
 + for PROF.COM, this programs the CMOS clock by reading register 0Ch
 +   and clearing bit 6 of register 0Bh.  It then masks IRQ8.
 +SeeAlso: AX=4503h,AX=4505h,AX=4506h,AX=4507h
 +----------2F4505-----------------------------
 +INT 2F U - Microsoft Profiler (PROF.COM/VPROD.386) - CLEAR PROFILING DATA
 + AX = 4505h
 +SeeAlso: AX=4503h,AX=4504h,AX=4506h
 +----------2F4506-----------------------------
 +INT 2F U - Microsoft Profiler (PROF.COM/VPROD.386) - "ProfFlush"
 + AX = 4506h
 +SeeAlso: AX=4505h,AX=4507h
 +----------2F4507-----------------------------
 +INT 2F U - Microsoft Profiler (PROF.COM/VPROD.386) - "ProfFinish"
 + AX = 4507h
 +Note: this call is essentially a "ProfStop" (AX=4504h) followed by
 +   "ProfFlush" (AX=4506h)
 +SeeAlso: AX=4504h,AX=4505h,AX=4506h
 +----------2F4508-----------------------------
 +INT 2F U - Microsoft Profiler (PROF.COM/VPROD.386) - ALTERNATE SEGDEBUG IFACE
 + AX = 4508h
 + BX = ordinal (or 0000h)
 + CX = segment
 + DX = instance (or 0000h)
 + SI = type (or 0000h)
 + ES:DI -> ASCIZ module name
 +Notes: this call is an alternate entry to the profiler's SEGDEBUG
 +   interface, but only to function 0, for notifying the profiler of
 +   each new segment loaded.  The SHOWHITS utility then examines the
 +   profiler's output files (CSIPS.DAT and SEGENTRY.DAT) in conjunction
 +   with symbol files to provide information in a useful form.
 + this call does not have a corresponding Windows function
 +SeeAlso: AX=4500h 
 +----------2F4601-----------------------------
 +INT 2F U - DOS 5.0 kernel - ???
 + AX = 4601h
 +Return: ???
 +Note: copies the MCB following the caller's PSP memory block into DOS data
 +   segment
 +SeeAlso: AX=4602h
 +----------2F4602-----------------------------
 +INT 2F U - DOS 5.0 kernel - ???
 + AX = 4602h
 +Return: ???
 +Note: copies previously copied MCB from DOS data segment into MCB following
 +   caller's PSP memory block
 +SeeAlso: AX=4601h
 +----------2F46-------------------------------
 +INT 2F U - ???
 + AH = 46h
 + AL = subfunction (03h,04h)
 +Return: ???
 +Note: these two subfunctions are called by MS Windows 3.0
 +----------2F4653CX0002-----------------------
 +INT 2F - F-PROT v1.x only - F-LOCK.EXE 
 + AX = 4653h
 + CX = 0002h
 + BX = subfunction
 +     0000h  installation check
 + Return: AX = FFFFh
 +     0001h  uninstall
 + Return: AX,BX,ES destroyed
 +     0002h  disable (v1.08 and below only)
 +     0003h  enable (v1.08 and below only)
 +Note: F-LOCK is part of the F-PROT virus/trojan protection package by Fridrik
 +   Skulason
 +SeeAlso: AX=4653h/CX=0003h,AX=CA00h,INT 21/AX=4BEEh
 +----------2F4653CX0003-----------------------
 +INT 2F - F-PROT v1.x only - F-XCHK.EXE
 + AX = 4653h
 + CX = 0003h
 + BX = subfunction
 +     0000h  installation check
 + Return: AX = FFFFh
 +     0001h  uninstall
 + Return: AX,BX,ES destroyed
 +Note: F-XCHK is part of the F-PROT virus/trojan protection package by Fridrik
 +   Skulason
 +SeeAlso: AX=4653h/CX=0002h,AX=4653h/CX=0004h,AX=CA00h
 +----------2F4653CX0004-----------------------
 +INT 2F - F-PROT v1.x only - F-POPUP.EXE
 + AX = 4653h
 + CX = 0004h
 + BX = subfunction
 +     0000h  installation check
 + Return: AX = FFFFh
 +     0001h  uninstall
 + Return: AX,BX,ES destroyed
 +     0002h  disable (v1.08 and below only)
 +    display message (v1.14+)
 + other registers: ???
 +     0003h  enable (v1.08 and below only)
 +    display message (v1.14+)
 + other registers: ???
 + Return: AX = key pressed by user
 +Note: F-POPUP is part of the F-PROT virus/trojan protection package by
 +   Fridrik Skulason
 +SeeAlso: AX=4653h/CX=0003h,AX=4653h/CX=0005h,AX=CA00h
 +----------2F4653CX0005-----------------------
 +INT 2F - F-PROT v1.x only - F-DLOCK.EXE
 + AX = 4653h
 + CX = 0005h
 + BX = subfunction
 +     0000h installation check
 + Return: AX = FFFFh
 +     0001h uninstall
 + Return: AX,BX,ES destroyed
 +Note: F-DLOCK is part of the F-PROT virus/trojan protection package by
 +   Fridrik Skulason
 +SeeAlso: AX=4653h/CX=0004h,AX=CA00h
 +----------2F4680-----------------------------
 +INT 2F - MS Windows v3.0 - INSTALLATION CHECK
 + AX = 4680h
 +Return: AX = 0000h MS Windows 3.0 running in real (/R) or standard (/S) mode,
 +    or DOS 5 DOSSHELL active
 +    nonzero  no Windows, Windows prior to 3.0, or Windows3 in enhanced
 +     mode
 +Note: not officially documented, but Microsoft has indicated that they
 +   intend to provide an installation check which works in all modes
 +SeeAlso: AX=1600h
 +----------2F4800-----------------------------
 +INT 2F - DOS v5.0 DOSKEY - INSTALLATION CHECK
 + AX = 4800h
 +Return: AL = nonzero if installed
 +SeeAlso: AX=4810h
 +----------2F4810-----------------------------
 +INT 2F - DOS v5.0 DOSKEY - READ INPUT LINE FROM CONSOLE
 + AX = 4810h
 + DS:DX -> line buffer (see INT 21/AH=0Ah)
 +Return: AX = 0000h if successful
 +Notes: the first byte (length) of the buffer MUST be 80h, or DOSKEY chains to
 +   the previous handler
 + if the user's input is a macro name, no text is placed in the buffer
 +   even though AX=0000h on return; the program must immediately issue
 +   this call again to retrieve the expansion of the macro.  Similarly,
 +   if the user enters a special parameter such as $*, this call must
 +   be repeated to retrieve the expansion; on the second call, DOSKEY
 +   overwrites the macro name on the screen with its expansion.
 +SeeAlso: AX=4800h,INT 21/AH=0Ah
 +----------2F4A00CX0000-----------------------
 +INT 2F U - DOS v5.0 - SINGLE-FLOPPY LOGICAL DRIVE CHANGE NOTIFICATION
 + AX = 4A00h
 + CX = 0000h
 + DH = new drive number
 + DL = current drive number
 +Return: CX = FFFFh to skip "Insert diskette for drive X:" message
 +Note: called by MSDOS 5.00 IO.SYS just before displaying the message
 +   "Insert diskette for drive X:" on single-floppy systems
 +----------2F4A01-----------------------------
 +INT 2F - DOS v5.0 - QUERY FREE HMA SPACE
 + AX = 4A01h
 +Return: BX = number of bytes available in HMA (0000h if DOS not using HMA)
 + ES:DI -> start of available HMA area (FFFFh:FFFFh if not using HMA)
 +SeeAlso: AX=4310h,AX=4A02h
 +----------2F4A02-----------------------------
 +INT 2F - DOS v5.0 - ALLOCATE HMA SPACE
 + AX = 4A02h
 + BX = number of bytes
 +Return: ES:DI -> start of allocated HMA block or FFFFh:FFFFh
 + BX destroyed
 +Note: this call is not valid unless DOS is loaded in the HMA (DOS=HIGH)
 +SeeAlso: AX=4A01h
 +----------2F4A05-----------------------------
 +INT 2F U - DOS v5.0 DOSSHELL - ???
 + AX = 4A05h
 + SI = function
 +     0000h reset???
 +     0001h ???
 +     0002h ???
 +     0003h ???
 +     0004h ???
 + BL = ???
 +     0005h ???
 +     0006h get ???
 + Return: ES:DI -> ???
 +     0007h get ???
 + Return: AX = ???
 +     0008h get ???
 + Return: DX:AX -> ???
 +     0009h get ???
 + Return: ES = ???
 +     000Ah ???
 + BL = ???
 + ES:DI -> ???
 +     000Bh get ???
 + Return: AX = ???
 +     000Ch ???
 + BL = ???
 + Return: DX:AX -> ???
 +Notes: DOSSHELL chains to the previous handler if SI is not one of the values
 +   listed above
 + the DOSSWAP.EXE module calls functions 03h,04h,05h,07h,08h,09h,0Ch
 +SeeAlso: AX=4B01h
 +----------2F4A06-----------------------------
 +INT 2F U - ??? - GET MEMORY SIZE
 + AX = 4A06h
 + DX = segment following last byte of conventional memory
 +Return: DX = segment following last byte of memory available for use by DOS
 +Note: called by MSDOS 5.00 IO.SYS startup code if the signature "RPL" is
 +   present three bytes beyond the INT 2F handler; this call overrides
 +   the value returned by INT 12
 +SeeAlso: INT 12
 +----------2F4A10-----------------------------
 +INT 2F - SMARTDRV v4.00+ - API
 +        AX = 4A10h
 +        BX = command
 +            0000h installation check and hit ratios
 +                Return: AX = BABEh if installed
 +                            DX:BX = cache hits
 +                            DI:SI = cache misses
 +                            CX = ???
 +                            BP = version (4.00 = 0400h)
 +            0001h reset cache
 +            0002h flush buffers
 +            0003h status
 +                BP = drive # (0=A, 1=B, etc.)
 +                DL = subfunction
 +     00h only get information
 +                    01h turn on read cache
 +     02h turn off read cache
 +     03h turn on write cache
 +     04h turn off write cache
 +     Return: AX = BABEh if OK
 +                        DL = status
 +                            bit 7  not cached
 +     bit 6  write-through
 +     bit 5  ???
 +     bits 0-4 drive # (0=A, 1=B...)
 +                        DL = FFh if drive does not exist
 +                Note: If the read cache is off, reads will not be cached,
 +   but writes will continue to be cached if the write-
 +   cache is enabled.
 +            0004h cache size
 +                Return: AX = ???
 +                        BX = largest number of elements
 +                        CX = size of elements in bytes
 +                        DX = number of elements under Windows
 +            0005h double-buffer status
 +                BP = drive # (0=A, 1=B...)
 +                Return: AX = BABEh if double-buffered
 +            0007h ???
 +                Return: DI = random number???
 +            000Ah get table pointer???
 +                Return: ES:BX -> table of about 10 bytes or 5 words. Seems to
 + be words pointing to memory addresses 
 + containing info??? (see below)
 +            1234h signal serious error
 +                pops up a message box saying that a serious error occurred and
 +                  to hit R to retry.
 +SeeAlso: INT 21/AX=4402h"SMARTDRV",INT 21/AX=4403h"SMARTDRV"
 +
 +Format of data table:
 +Offset Size Description
 + 00h  8 BYTEs ???
 + 08h WORD offset of WORD containing number of elements in cache
 +----------2F4B-------------------------------
 +INT 2F - LAN Manager 2.0 DOS Enh NETWKSTA.EXE - NETWORK WORKSTATION REDIRECTOR
 + AH = 4Bh
 + ???
 +Return: ???
 +Note: LAN Manager enhanced mode adds features beyond the standard redirector
 +   file/printer services
 +SeeAlso: AX=118Ah,AH=41h,AH=42h
 +----------2F4B01-----------------------------
 +INT 2F - DOS v5.0 TASK SWITCHER - BUILD CALLOUT CHAIN
 + AX = 4B01h
 + CX:DX -> task switcher entry point (see AX=4B02h)
 + ES:BX = 0000h:0000h
 +Return: ES:BX -> callback info structure (see below) or 0000h:0000h
 +Notes: called by the task switcher
 + this function is hooked by clients which require notification of task
 +   switcher activities; the call must first be passed on to the prior
 +   handler with registers unchanged using a simulated interrupt. On
 +   return, the client must build a callback info structure and store
 +   the returned ES:BX in the "next" field, then return the address of
 +   its own callback info structure.
 + a client program must add itself to the notification chain if it
 +   provides services to other programs; before terminating, it must
 +   remove itself from the chain by calling the task switcher's entry
 +   point with AX=0005h (see AX=4B02h)
 + the task switcher entry point should not be saved, as it is subject to
 +   change and will be provided on any notification call
 + the Windows 3.1 Standard Mode supports this API
 +SeeAlso: AX=4B02h
 +
 +Format of callback info structure:
 +Offset Size Description
 + 00h DWORD pointer to next callback info structure
 + 04h DWORD pointer to notification function (see below)
 + 08h DWORD reserved
 + 0Ch DWORD address of zero-terminated list of API info structures
 + (see AX=4B02h)
 +
 +Notification function is called with:
 + AX = function
 +     0000h switcher initialization
 + Return: AX = 0000h if OK to load
 +    = nonzero to abort task switcher
 +     0001h query suspend
 + BX = session ID
 + Return: AX = 0000h if OK to switch session
 +    = 0001h if not
 +     0002h suspend session
 + BX = session ID
 + interrupts disabled
 + Return: AX = 0000h if OK to switch session
 +    = 0001h if not
 +     0003h activate session
 + BX = session ID
 + CX = session status flags
 + bit 0: set if first activation of session
 + bits 1-15: reserved (0)
 + interrupts disabled
 + Return: AX = 0000h
 +     0004h session active
 + BX = session ID
 + CX = session status flags
 + bit 0: set if first activation of session
 + bits 1-15: reserved (0)
 + Return: AX = 0000h
 +     0005h create session
 + BX = session ID
 + Return: AX = 0000h if OK to create session
 +    = 0001h if not
 +     0006h destroy session
 + BX = session ID
 + Return: AX = 0000h
 +     0007h switcher termination
 + BX = flags
 +     bit 0: set if calling switcher is only switcher loaded
 +     bits 1-15: reserved (0)
 + Return: AX = 0000h
 + ES:DI -> task switcher entry point (see AX=4B02h)
 +Notes: function 0000h is generally called by the program which controls or
 +   invokes the task switcher, rather than by the task switcher itself;
 +   the entry point supplied to this function is not necessarily the
 +   entry point to the task switcher itself, and may be 0000h:0000h.  If
 +   any client indicates that loading is not possible, all clients will
 +   be called with function 0007h; thus it is possible for a client to
 +   receive a termination notice without a corresponding initialization
 +   notice.
 + except for functions 0002h and 0003h, the notification handler is
 +   called with interrupts enabled and may make any INT 21h function
 +   call; interrupts must not be enabled in functions 0002h and 0003h
 + function 0007h may be called with ES:DI = 0000h:0000h if the entry
 +   point is no longer valid
 +----------2F4B02BX0000-----------------------
 +INT 2F - DOS v5.0 TASK SWITCHER - INSTALLATION CHECK
 + AX = 4B02h
 + BX = 0000h
 + ES:DI = 0000h:0000h
 +Return: ES:DI = 0000h:0000h if task switcher not loaded
 + ES:DI -> task switcher entry point (see below) if loaded
 +     AX = 0000h
 +Note: the returned entry point is that for the most-recently loaded task
 +   switcher; the entry points for prior task switchers may be determined
 +   with the "get version" call (see below)
 +SeeAlso: AX=4A05h,AX=4B03h
 +
 +Call task switcher entry point with:
 + AX = 0000h get version
 + Return: CF clear if successful
 +     AX = 0000h
 +     ES:BX -> task switcher version struct (see below)
 + CF set if unsupported function
 + AX = 0001h test memory region
 + ES:DI -> first byte to be tested
 + CX = size of region to test
 + Return: CF clear if successful
 +     AX = memory type of tested region
 + 0000h global
 + 0001h global and local
 + 0002h local (replaced on session switch)
 + CF set if unsupported function
 + AX = 0002h suspend switcher
 + ES:DI -> new task switcher's entry point
 + Return: CF clear if successful
 +     AX = state
 + 0000h switcher has been suspended
 + 0001h switcher not suspended, new switcher must
 + abort
 + 0002h switcher not suspended, but new switcher
 + may run anyway
 + CF set if unsupported function
 + AX = 0003h resume switcher
 + ES:DI -> new task switcher's entry point
 + Return: CF clear if successful
 +     AX = 0000h
 + CF set if unsupported function
 + AX = 0004h hook notification chain
 + ES:DI -> callback info structure to be added to chain
 + (see AX=4B01h)
 + Return: CF clear if successful
 +     AX = 0000h
 + CF set if unsupported function
 + AX = 0005h unhook notification chain
 + ES:DI -> callback info structure to be removed from chain
 + (see AX=4B01h)
 + Return: CF clear if successful
 +     AX = 0000h
 + CF set if unsupported function
 + AX = 0006h query API support
 + BX = asynchronous API identifier
 + Return: CF clear if successful
 +     AX = 0000h
 +     ES:BX -> API info structure (see below) for the
 + client which provides the highest
 + level of 
 + CF set if unsupported function
 +
 +Format of task switcher version structure:
 +Offset Size Description
 + 00h WORD major version of supported protocol  (current protocol is 1.0)
 + 02h WORD minor version of supported protocol
 + 04h WORD major version of task switcher
 + 06h WORD minor version of task switcher
 + 08h WORD task switcher ID (see AX=4B03h)
 + 0Ah WORD operation flags
 + bit 0: set if task switcher disabled
 + bits 1-15: reserved (0)
 + 0Ch DWORD pointer to ASCIZ task switcher name
 + ("MS-DOS Shell Task Switcher" for DOSSHELL task switcher)
 + 10h DWORD pointer to previous task switcher's entry point or 0000h:0000h
 +
 +Format of API info structure:
 +Offset Size Description
 + 00h WORD size of structure in bytes (000Ah)
 + 02h WORD API identifier
 + 0001h NetBIOS
 + 0002h 802.2
 + 0003h TCP/IP
 + 0004h LAN Manager named pipes
 + 0005h Novell NetWare IPX
 + 04h WORD major version \ of highest version of API for which the support
 + 06h WORD minor version / level specified in the next field is provided
 + 08h WORD support level
 + 0001h minimal support
 + 0002h API-level support
 + 0003h switcher compatibility
 + 0004h seamless compatibility
 +----------2F4B03-----------------------------
 +INT 2F - DOS v5.0 TASK SWITCHER - ALLOCATE SWITCHER ID
 + AX = 4B03h
 + ES:DI -> task switcher entry point (see AX=4B02h)
 +Return: AX = 0000h
 + BX = switcher ID (0001h-000Fh), or 0000h if no more available
 +Notes: if a task switcher has determined that it is the first to be loaded, it
 +   must allocate an identifier for itself and provide this function to
 +   all subsequent task switchers; if it is not the first to be loaded,
 +   it must call this function to allocate an ID. The switcher ID is
 +   used as the high four bits of all session identifiers to ensure
 +   unique session IDs.
 + if no more switcher IDs are available, the new task switcher making the
 +   call must terminate or disable itself
 + the task switcher providing the identifiers may call the new task
 +   switcher's entry point as needed
 + this call is available from within DOSSHELL even if the task switcher
 +   is not installed
 +SeeAlso: AX=4B02h,AX=4B04h
 +----------2F4B04-----------------------------
 +INT 2F - DOS v5.0 TASK SWITCHER - FREE SWITCHER ID
 + AX = 4B04h
 + BX = switcher ID
 + ES:DI -> task switcher entry point (see AX=4B02h)
 +Return: AX = 0000h
 + BX = status
 +     0000h successful
 +     other error (invalid ID or ID not allocated)
 +Notes: called by a task switcher when it exits, unless it was the first loaded
 +   and is providing the support for AX=4B03h and AX=4B04h
 + the task switcher providing the identifiers may call the terminating
 +   task switcher's entry point as needed
 + this call is available from within DOSSHELL even if the task switcher
 +   is not installed
 +SeeAlso: AX=4B02h,AX=4B03h
 +----------2F4B05-----------------------------
 +INT 2F - DOS v5.0 DOSSHELL TASK SWITCHER - IDENTIFY INSTANCE DATA
 + AX = 4B05h
 + ES:BX = 0000h:0000h
 + CX:DX -> task switcher entry point (see AX=4B02h)
 +Return: ES:BX -> startup info structure (see below) or 0000h:0000h
 +Notes: called by task switcher
 + clients with instance data should hook this call, pass it through to
 +   the previous handler with unchanged registers using a simulated
 +   interrupt.  On return, the client should create a startup info
 +   structure (see below), store the returned ES:BX in the "next"
 +   field, and return the address of the created structure in ES:BX
 + all MSDOS function calls are available from within this call
 +SeeAlso: AX=1605h,AX=4B02h
 +
 +Format of startup info structure:
 +Offset Size Description
 + 00h  2 BYTEs major, minor version of info structure (03h,00h)
 + 02h DWORD pointer to next startup info structure or 0000h:0000h
 + 06h DWORD 0000h:0000h (ignored)
 + 0Ah DWORD ignored
 + 0Eh DWORD pointer to instance data records
 +
 +Format of one instance data record in array:
 +Offset Size Description
 + 00h DWORD address of instance data (end of array if 0000h:0000h)
 + 04h WORD size of instance data
 +----------2F53-------------------------------
 +INT 2F U - ???
 + AH = 53h
 + AL = subfunction (0Bh, maybe others???)
 +Return: ???
 +Note: called by MS Windows 3.1 POWER.DRV; hooked by MS Mouse driver v8.20+
 +SeeAlso: AH=54h,INT 33/AX=002Fh
 +----------2F54-------------------------------
 +INT 2F U - ???
 + AH = 54h
 + AL = subfunction (00h, 01h, maybe others???)
 +Return: ???
 +Note: called by MS Windows 3.1 POWER.DRV
 +SeeAlso: AH=53h
 +----------2F5453-----------------------------
 +INT 2F - TesSeRact RAM-RESIDENT PROGRAM INTERFACE
 + AX = 5453h
 + BX = subfunction
 +     00h installation check
 + CX = 0000h
 + DS:SI -> 8-char blank-padded name
 + Return: AX = FFFFh installed
 + CX = ID number of already-installed copy
 +    = anything else, not installed
 + CX = ID number for TSR when installed
 +     01h get user parameters
 + CX = TSR ID number
 + Return: AX = 0000h successful
 +    ES:BX -> user parameter block (see below)
 +    = nonzero failed
 +     02h check if hotkey in use
 + CL = scan code of hot key
 + Return: AX = FFFFh hot key conflicts with another TSR
 +      otherwise safe to use the hotkey
 +     03h replace default critical error handler
 + CX = TSR ID number
 + DS:SI -> new routine for INT 24h
 + Return: AX = nonzero, unable to install new handler
 +     04h get internal data area
 + CX = TSR ID number
 + Return: AX = 0000h
 +     ES:BX -> TSR's internal data area (see below)
 +    = nonzero, TSR not found
 +     05h set multiple hot keys
 + CX = TSR ID number
 + DL = number of additional hot keys to allocate
 + DS:SI -> table of hot keys
 + BYTE  hotkey scan code
 + BYTE  hotkey shift state
 + BYTE  flag value to pass to TSR (nonzero)
 + Return: AX = nonzero, unable to install hot keys
 +     06h - 0Fh reserved
 +     10h enable TSR
 + CX = TSR ID number
 + Return: AX = nonzero, unable to enable
 +     11h disable TSR
 + CX = TSR ID number
 + Return: AX = nonzero, unable to disable
 +     12h unload TSR
 + CX = TSR ID number
 + Return: AX = nonzero, invalid TSR number
 + Note: if any interrupts used by TSR have been grabbed by
 + another TSR, the TesSeRact routines will wait until
 + it is safe to remove the indicated TSR from memory
 +     13h restart TSR
 + CX = TSR ID number of TSR which was unloaded but is still in
 +      memory
 + Return: AX = nonzero, unable to restart TSR
 +     14h get status word
 + CX = TSR ID number
 + Return: AX = FFFFh invalid ID number
 +    = other, successful
 + BX = bit flags
 +     15h set status word
 + CX = TSR ID number
 + DX = new bit flags
 + Return: AX = nonzero, unable to set status word
 +     16h get INDOS state at popup
 + CX = TSR ID number
 + Return: AX = 0000h successful
 +     BX = value of INDOS flag
 +     17h - 1Fh reserved
 +     20h call user procedure
 + CX = TSR ID number
 + ES:DI -> user-defined data
 + Return: AX = 0000h successful
 +     21h stuff keystrokes into keyboard buffer
 + CX = TSR ID number
 + DL = speed
 +     00h stuff keystrokes only when buffer is empty
 +     01h stuff up to four keystrokes per clock tick
 +     02h stuff up to 15 keystrokes per clock tick
 + DH = scan code flag
 +     if zero, buffer contains alternating ASCII and scan codes
 +     if nonzero, buffer contains only ASCII codes
 + SI = number of keystrokes
 + ES:DI -> buffer to stuff
 + Return: AX = 0000h success
 +      F0F0h user aborted with ^C or ^Break
 +      other unable to stuff keystrokes
 +     22h (v1.10) trigger popup
 + CX = TSR ID number
 + Return: AX = 0000h success, TSR will either pop up or beep to
 +    indicate that it is unable to pop up
 +      nonzero invalid ID number
 +     23h (v1.10) invoke TSR's background function
 + CX = TSR ID number
 + Return: AX = 0000h success
 +      FFFFh not safe to call background function
 +      nonzero invalid ID number
 +     24h - 2Fh reserved
 +Notes: Borland's THELP.COM popup help system for Turbo Pascal and Turbo C
 +   (versions 1.x and 2.x only) fully supports the TesSeRact API, as
 +   do the SWAP?? programs by Innovative Data Concepts.
 + AVATAR.SYS supports functions 00h and 01h (only the first three fields
 +   of the user parameter block) using the name "AVATAR  "
 +SeeAlso: AX=CAFEh
 +
 +Format of User Parameter Block:
 +Offset Size Description
 + 00h  8 BYTEs blank-padded TSR name
 + 08h WORD TSR ID number
 + 0Ah DWORD bitmap of supported functions
 + 0Eh BYTE scan code of primary hotkey
 +     00h = pop up when shift states match
 +     FFh = no popup (if shift state also FFh)
 + 0Fh BYTE shift state of primary hotkey
 +     FFh = no popup (if scan code also FFh)
 + 10h BYTE number of secondary hotkeys
 + 11h DWORD pointer to extra hotkeys set by func 05h
 + 15h WORD current TSR status flags
 + 17h WORD PSP segment of TSR
 + 19h DWORD DTA for TSR
 + 1Dh WORD default DS for TSR
 + 1Fh DWORD stack at popup
 + 23h DWORD stack at background invocation
 +
 +Format of TSR internal data area:
 +Offset Size Description
 + 00h BYTE revision level of TesSeRact library
 + 01h BYTE type of popup in effect
 + 02h BYTE INT 08 occurred since last invocation
 + 03h BYTE INT 13 occurred since last invocation
 + 04h BYTE active interrupts
 + 05h BYTE active soft interrupts
 + 06h BYTE DOS major version
 + 07h BYTE how long to wait before popping up
 + 08h DWORD pointer to INDOS flag
 + 0CH DWORD pointer to DOS critical error flag
 + 10h WORD PSP segment of interrupted program
 + 12h WORD PSP segment of prog interrupted by INT 28
 + 14h DWORD DTA of interrupted program
 + 18h DWORD DTA of program interrupted by INT 28
 + 1Ch WORD SS of interrupted program
 + 1Eh WORD SP of interrupted program
 + 20h WORD SS of program interrupted by INT 28
 + 22h WORD SP of program interrupted by INT 28
 + 24h DWORD INT 24 of interrupted program
 + 28h  3 WORDs DOS 3+ extended error info
 + 2Eh BYTE old BREAK setting
 + 2Fh BYTE old VERIFY setting
 + 30h BYTE were running MS WORD 4.0 before popup
 + 31h BYTE MS WORD 4.0 special popup flag
 + 32h BYTE enhanced keyboard call in use
 + 33h BYTE delay for MS WORD 4.0
 +11 times (for INTs 08h,09h,13h,16h,1Ch,21h,28h,2Fh,1Bh,23h, and 24h):
 + DWORD old interrupt vector
 + BYTE interrupt number
 + WORD offset in TesSeRact code segment of new interrupt handler
 +----------2F5500-----------------------------
 +INT 2F U - DOS v5.0 - COMMAND.COM INTERFACE
 + AX = 5500h
 +Return: AX = 0000h
 + DS:SI -> entry point table
 +Notes: used to access the shareable portion of COMMAND.COM, which may have
 +   been moved into the HMA; only the primary COMMAND.COM retains this
 +   portion
 + procedures called from a dispatcher in COMMAND's resident portion;
 +   most assume that the segment address of the resident portion is on
 +   the stack and are thus not of general use
 +----------2F6282-----------------------------
 +INT 2F U - PC Tools v7.0+ VDEFEND, DATAMON - SET ??? ADDRESS
 + AX = 6282h
 + CX:DX -> ??? or 0000h:0000h
 + DI = 0000h ???
 +      FFFFh ???
 +      other segment of ???
 +Return: BX = 0062h
 +Note: if CX:DX = 0000h:0000h on entry, the ??? address is not changed
 +   (DATAMON only)
 +SeeAlso: INT 21/AH=FAh"VDEFEND"
 +----------2F6284BX0000-----------------------
 +INT 2F U - PC Tools v7.0+ DATAMON - INSTALLATION CHECK
 + AX = 6284h
 + BX = 0000h
 + CX = 0000h
 +Return: AX = segment of resident code
 + BX = 5555h
 + CX = 5555h
 +----------2F6284BX0001-----------------------
 +INT 2F U - PC Tools v7.0+ DATAMON - GET ???
 + AX = 6284h
 + BX = 0001h
 + CX = 0001h
 +Return: AX:BX -> ???
 + CX = BX
 +----------2F6284BX0002-----------------------
 +INT 2F U - PC Tools v7.0+ DATAMON - GET ???
 + AX = 6284h
 + BX = 0002h
 + CX = 0002h
 +Return: AX = ???
 + BX = ???
 + CX = AX
 + DX = BX
 +----------2F6284BX0003-----------------------
 +INT 2F U - PC Tools v7.0+ DATAMON - SET ??? FLAGS
 + AX = 6284h
 + BX = 0003h
 + CX = flags
 +     bit 12: ???
 + 10: ???
 + 5: ???
 + 3: ???
 + DX = flags
 +     bit 15: ???
 +----------2F6400-----------------------------
 +INT 2F - SCRNSAV2.COM - INSTALLATION CHECK
 + AX = 6400h
 +Return: AL = 00h not installed
 +      FFh installed
 +Note: SCRNSAV2.COM is a screen saver for PS/2's with VGA by Alan Ballard
 +SeeAlso: INT 10/AX=5555h
 +----------2F7200-----------------------------
 +INT 2F - SRDISK v1.30 - INSTALLATION CHECK
 + AX = 7200h
 +Return: AL = FFh if installed
 +     ES = segment of device driver header (see below)
 +Note: SRDISK is a freeware resizeable RAMdisk by Marko Kohtala
 +
 +Format of device driver header:
 +Offset Size Description
 + 00h 10 BYTEs same as standard device driver header (see INT 21/AH=52h)
 + 0Ah BYTE number of subunits (drives) supported by driver
 + 0Bh  3 BYTEs signature "SRD"
 + 0Eh  4 BYTEs memory type string (currently only "XMS ")
 + 12h  4 BYTEs ASCII driver version string "N.NN"
 + 16h BYTE 00h
 + 17h BYTE configuration format version (currently 00h)
 + 18h WORD offset of drive configuration data
 +----------2F7A00-----------------------------
 +INT 2F - Novell NetWare - LOW-LEVEL API (IPX) INSTALLATION CHECK
 + AX = 7A00h
 +Return: AL = 00h not installed
 +    = FFh installed
 + ES:DI -> FAR entry point for routines accessed exclusively
 + through INT 7A in NetWare versions through 2.0a.  Call
 + with same values as INT 7A
 +SeeAlso: AX=7AFFh/BX=0000h,AX=D800h,INT 64"Novell",INT 7A"Novell"
 +----------2F7A10-----------------------------
 +INT 2F - Novell NetWare - TBMI v2.0 - GET TBMI STATUS
 + AX = 7A10h
 +Return: DH = major TBMI version number
 + DL = minor TBMI version number
 + CX = segment address of TBMI resident part
 + BX = status word of TBMI
 + bit 0: INT2F intercepted by TBMI
 + bit 1: INT7A intercepted by TBMI
 + bit 2: INT64 intercepted by TBMI
 + bits 3-14: reserved or unused ???
 + bit 15: outstanding task ID was detected
 +Note: TBMI is the Task-Switched Buffer Manager Interface
 +SeeAlso: AX=7A11h,AX=7A12h,AX=7A13h,AX=7A14h
 +----------2F7A11-----------------------------
 +INT 2F - Novell NetWare - TBMI v2.0 - GET INT2F HANDLERS
 + AX = 7A11h
 +Return: ES:BX -> old INT 2F handler
 + DS:DX -> TBMI INT 2F handler
 +SeeAlso: AX=7A10h,AX=7A12h,AX=7A13h
 +----------2F7A12-----------------------------
 +INT 2F - Novell NetWare - TBMI v2.0 - GET INT64 HANDLERS
 + AX = 7A12h
 +Return: ES:BX -> old INT 64 handler
 + DS:DX -> TBMI INT 64 handler
 +SeeAlso: AX=7A10h,AX=7A11h,AX=7A13h
 +----------2F7A13-----------------------------
 +INT 2F - Novell NetWare - TBMI v2.0 - GET INT7A HANDLERS
 + AX = 7A13h
 +Return: ES:BX = old INT 7A handler
 + DS:DX = TBMI INT 7A handler
 +SeeAlso: AX=7A10h,AX=7A11h,AX=7A12h
 +----------2F7A14-----------------------------
 +INT 2F - Novell NetWare - TBMI v2.0 - GET STATISTICS
 + AX = 7A14h
 + CX = statistic to retrieve
 +     0000h available diagnostic functions???
 + Return: CX = maximum available function??? (000Ch for v2.0)
 +     0001h buffers in use
 + Return: CX = TBMI buffers currently in use
 +     0002h maximum buffers used
 + Return: CX = maximum number of buffers ever in use
 +     0003h unavailable buffers
 + Return: CX = count of unavailable TBMI buffers
 +     0004h old interrupt usage
 + Return: CX = TBMI accesses to intercepted old vectors INT 2F,
 + INT 64, and INT 7A
 +     0005h far call usage
 + Return: CX = TBMI accesses to IPX/SPX far call handler (not
 + including internal accesses)
 +     0006h task buffering
 + Return: CX = TBMI task buffering status (enabled/disabled or
 + disable/enable switch count???)
 +     0007h current task ID
 + Return: CX = TBMI current task ID number (0000h if ???)
 +     0008h outstanding ID count
 + Return: CX = number of outstanding TBMI IDs
 +     0009h configured ECBs
 + Return: CX = number of TBMI Event Control Blocks configured
 +     000Ah configured data ECBs
 + Return: CX = number of TBMI data ECBs configured
 +     000Bh configured sockets
 + Return: CX = number of TBMI sockets configured (from NETCFG)
 +     000Ch current sockets
 + Return: CX = number of TBMI sockets currently in use
 +SeeAlso: AX=7A10h
 +----------2F7A1B-----------------------------
 +INT 2F - Novell NetWare - TBMI v2.0 - RESERVED???
 + AX = 7A1Bh
 +Note: this call merely performs an IRET
 +----------2F7A80-----------------------------
 +INT 2F - Novell NetWare - shell 3.01d - ???
 + AX = 7A80h
 +Return: nothing
 +Note: apparently called on abnormal exit of the shell
 +----------2F7A81-----------------------------
 +INT 2F - Novell NetWare - shell 3.01d - ???
 + AX = 7A81h
 + CX:DX -> ??? in shell's CS (may be callback address or data structure)
 +Return: nothing???
 +----------2F7A85-----------------------------
 +INT 2F - Novell NetWare - shell 3.01 - BROADCAST INFORM
 + AX = 7A85h
 + CX = broadcast server number
 +Return: CX = 0000h if broadcast message handled by another program
 + CX unchanged if broadcast not handled
 +----------2F7AFE-----------------------------
 +INT 2F - Novell NetWare - shell 3.01d - ???
 + AX = 7AFEh
 +Return: AL = FFh ???
 +      other ???
 +----------2F7AFFBX0000-----------------------
 +INT 2F - Novell NetWare - TBMI v2.0 - INSTALLATION CHECK???
 + AX = 7AFFh
 + BX = 0000h
 + CX = 4E65h ("Ne")
 + DX = 7457h ("tW")
 + ES:DI -> IPX/SPX special handler (XMS/EMS ???)
 +Return: AL = FFh if installed
 +     CX = configured sockets (14h)
 +     DS:SI -> data table ???
 +     ES:DI -> IPX far call handler
 +Note: for IPX/SPX this call reportedly returns DS:DI pointing to the table
 +   of pointers to service events queue head and tail
 +SeeAlso: AX=7AFFh/BX=0001h
 +----------2F7AFFBX0001-----------------------
 +INT 2F - Novell NetWare - TBMI v2.0, shell v3.01d - INSTALLATION CHECK???
 + AX = 7AFFh
 + BX = 0001h
 + CX = 4E65h ("Ne")
 + DX = 7457h ("tW")
 +Return: AL = FFh if installed
 +     CX = ???  (8000h)
 +     SI = ??? (or -> ???) (0002h)
 +     ES:DI -> IPX far call handler
 +     ES:DX -> 6-byte data area ???
 +SeeAlso: AX=7AFFh/BX=0000h
 +----------2F7F24-----------------------------
 +INT 2F - Multiplex - ???
 + AX = 7F24h
 + ???
 +Return: ???
 +Note: called by PC/370, an IBM 370 emulator by Donald S. Higgins
 +----------2F7F26-----------------------------
 +INT 2F - Multiplex - ???
 + AX = 7F26h
 + ???
 +Return: ???
 +Note: called by PC/370, an IBM 370 emulator by Donald S. Higgins
 +---------------------------------------------
 +Interrupt List, part 5 of 7
 +This compilation is Copyright (c) 1989,1990,1991,1992 Ralf Brown
 +----------2F8000-----------------------------
 +INT 2F - EASY-NET - INSTALLATION CHECK
 + AX = 8000h
 +Return: AL = 00h not installed
 +      FFh installed
 +Note: EASY-NET is a shareware two-machine serial-port network
 +----------2F8000-----------------------------
 +INT 2F - Nanosoft, Inc. TurboNET server - INSTALLATION CHECK
 + AX = 8000h
 +Return: AL = FFh if installed
 +     BX = CS of resident code
 +     CX = ??? (03FCh)
 +Note: TurboNET is a NetBIOS-based file redirector and server; a demonstration
 +   version may be downloaded from Nanosoft's BBS
 +SeeAlso: AX=8100h
 +----------2F8000DX0000-----------------------
 +INT 2F - FaxBIOS interface - INSTALLATION CHECK
 + AX = 8000h
 + DX = 0000h
 + DI = 0000h
 +Return: AL = FFh if installed
 + DX:DI -> signature "FaxBiosjpc"
 +Note: FaxBIOS may use any multiplex number from 80h through FFh; to determine
 +   whether it is installed, it is necessary to poll all multiplex
 +   numbers for one which returns the above signature
 +SeeAlso: AH=2Ah,AX=80FBh
 +----------2F8001-----------------------------
 +INT 2F - Nanosoft, Inc. TurboNET server - ???
 + AX = 8001h
 + DS:SI -> 16-byte buffer for ???
 +Return: AH = status
 +     00h successful
 +     01h error
 +Note: makes NetBIOS calls
 +----------2F80FB-----------------------------
 +INT 2F - FaxBIOS interface - COMMAND SUBMISSION
 + AX = 80FBh
 + BX = function number (see below)
 + DX:DI -> command buffer (see below)
 +Return: AL = FFh if submitted OK
 + CX = result code (see below)
 +Note: FaxBIOS may use any multiplex number from 80h through FFh
 +SeeAlso: AX=8000h"FaxBIOS",AX=CBDDh
 +
 +Values for function number:
 + 0001h SYS_LOGIN
 + 0002h SYS_LOGOUT
 + 0003h SYS_GET_FAXAPP_INFO
 + 0004h STAT_IO_GET
 + 0005h STAT_FAXBIOS_GET
 + 0006h PDIR_OPEN
 + 0007h PDIR_CLOSE
 + 0008h PDIR_READ_PERSON
 + 0009h PDIR_PARTIAL_READ
 + 000Ah PDIR_READ_GROUP
 + 000Bh PDIR_READ_MEMBER_LIST
 + 000Ch PDIR_WRITE_PERSON
 + 000Dh PDIR_WRITE_GROUP
 + 000Eh PDIR_DELETE_PERSON
 + 000Fh PDIR_DELETE_GROUP
 + 0010h PDIR_READ_GROUP_LIST
 + 0011h PDIR_IN_GROUP
 + 0012h PDIR_OUT_GROUP
 + 0013h SCHED_OPEN
 + 0014h SCHED_ADD_DEST
 + 0015h SCHED_ADD_FILE
 + 0016h SCHED_SET_PARAMS
 + 0017h SCHED_CANCEL
 + 0018h SCHED_CLOSE
 + 0019h SLOG_OPEN
 + 001Ah SLOG_CLOSE
 + 001Bh SLOG_SHORT_ENV_STAT
 + 001Ch SLOG_LONG_ENV_STAT
 + 001Dh SLOG_DEST_STAT
 + 001Eh SLOG_FILE_STAT
 + 001Fh SLOG_CANCEL_ENV
 + 0020h RLOG_OPEN
 + 0021h RLOG_CLOSE
 + 0022h RLOG_READ
 + 0023h GRAPH_GET_FILE_TYPE
 + 0024h GRAPH_EXPORT_FILE
 + 0025h GRAPH_GET_LAYOUT_INFO
 + 0026h GRAPH_CREATE_FILE
 + 0027h GRAPH_CLOSE_FILE
 + 0028h GRAPH_CREATE_PAGE
 + 0029h GRAPH_WRITE
 + 002Ah GRAPH_END_PAGE
 + 002Bh GRAPH_OPEN_FILE
 + 002Ch GRAPH_GOTO_PAGE
 + 002Dh GRAPH_READ
 + 002Eh IOCTL_GET
 + 002Fh IOCTL_SET
 + 0030h IOCTL_ANSWER_FAX
 + 0031h IOCTL_DIAL
 +
 +Values for result code:
 + 0000h successful
 + 0001h not prepared or servicing another client (busy)
 + 0002h call failed due to sharing (LOCKED)
 + 0003h logged-in client limit reached (FULL)
 + 0004h transport denied (TRANSPORT_DENIED)
 + 0005h not implemented (NOT_IMPLEMENTED)
 + 0006h aborted while in progress (ABORTED)
 + 0007h permissions denied (PERMISSION_DENIED)
 + 0008h requested data is no longer valid (NO_LONGER_VALID)
 + 0080h unspecified system error occurred
 + 0081h an internal file was not found
 + 0082h an internal file could not be created
 + 0083h an internal file could not be opened
 + 0084h an internal file could not be closed
 + 0085h error occurred writing to an internal file
 + 0086h error occurred reading from an internal file
 + 0087h bad or corrupted file encountered
 + 0088h an access violation occurred
 + 0089h an internal file is empty
 + 008Ah insufficient memory to process request
 + 008Bh FaxBIOS was unable to issue a handle
 + 008Ch an error internal to FaxBIOS occurred
 + 008Dh no room on disk
 + 0100h unspecified error accessing client file
 + 0101h file not found
 + 0102h creation fault
 + 0103h open fault
 + 0104h close fault
 + 0105h write fault
 + 0106h read fault
 + 0107h file corrupted
 + 0108h access violation
 + 0109h empty file
 + 0200h unspecified argument error
 + 0201h bad function
 + 0202h bad option
 + 0203h bad structure size
 + 0204h bad buffer size
 + 0205h bad client ID
 + 0300h unspecified error with token
 + 0301h cover sheet token was invalid
 + 0302h logo token was invalid
 + 0303h signature token was invalid
 + 0304h font token was invalid
 + 0305h phone directory token was invalid
 + 0306h outbound route token was invalid
 + 0307h priority token was invalid
 + 0308h sort token was invalid
 + 0309h billing token was invalid
 + 0400h unspecified handle error
 + 0401h bad Phone Directory handle
 + 0402h bad scheduling handle
 + 0403h bad read send log handle
 + 0404h bad read receive log handle
 + 0405h bad graphics handle
 + 0500h data passed in structure was invalid
 + 0501h name field given is invalid
 + 0502h phone number given is invalid
 + 0503h poll code submitted is invalid
 + 0504h file type constant was invalid
 + 0505h BFT constant not defined or supported
 + 0506h resolution not defined or supported
 + 0507h page length not defined or supported
 + 0508h page width not defined or supported
 + 0509h date & time requested are ridiculous
 + 050Ah Subject text was not an ASCIIZ string
 + 050Bh From text was not an ASCIIZ string
 + 050Ch requested envelope ID was not found
 + 050Dh requested envelope ID is not valid
 + 050Eh envelope requested was not found
 + 050Fh destination index is out of range
 + 0510h file index is out of range
 + 0511h index into receive log is out of range
 + 0512h file name specified was incomplete or invalid
 + 0513h page selected was out of range
 + 0514h bit width more than byte width 
 + 0515h mode for open is not defined
 + 0516h person index is out of range
 + 0517h person ID is out of range
 + 0518h group index out of range or invalid
 + 0519h group ID out of range or invalid
 + 051Ah range of indices to read is invalid
 + 051Bh group name given is invalid
 + 051Ch field_to_use is badly specified
 + 051Dh predicate invalid for field specified
 + 0600h unspecified client procedure error
 + 0601h device of interest is not present
 + 0602h device of interest has been removed
 + 0603h device of interest is not responding
 + 0604h device of interest is disabled
 + 0605h could not dial because device was in use
 + 0606h maximum destination limit exceeded
 + 0607h maximum file limit exceeded
 + 0608h scheduling closed with no destination
 + 0609h scheduling closed with no files or poll
 + 060Ah scheduling closed with no parameters specified
 + 060Bh file type specified does not match file
 + 060Ch file type specified is not supported
 + 060Dh file submitted is not exportable
 + 060Eh file type specified is not imageable
 + 060Fh error converting file
 + 0610h envelope could not be cancelled
 + 0611h Phone Directory is full
 + 0612h record is already in the Phone Directory
 + 0613h selected group in Phone Directory is full
 + 0614h person is already in the group
 + 0615h person is not in the group & cannot be removed
 + 0616h a graphics file to be created already exists
 + 0617h a grphics file to be read is empty
 + 0618h GRAPH_CREATE_PAGE called before GRAPH_END_PAGE
 + 0619h graph read or write attempted without goto or create
 + 061Ah graph page contains no data
 + 061Bh Phone Directory is already open for this client
 + 061Ch schedule log is already open for this client
 + 061Dh receive log is aready open for this client
 + 061Eh Phone Directory function requires write mode
 + 0800h denied exclusive use of the API
 +
 +Format of SYS_LOGIN command buffer:
 +Offset Size Description
 + 00h WORD structure size
 + 02h WORD function number
 + 04h WORD return code
 + 06h WORD client ID
 + 08h WORD API Major Version
 + 0Ah WORD API Minor Version
 + 0Ch DWORD reserved for manufacturer's use
 + 10h 22 BYTEs manufacturer's ID
 + 26h WORD highest possible device number
 + 28h WORD maximum destinations per envelope
 + 2Ah WORD maximum files per envelope
 + 2Ch WORD FaxBIOS capabilities bitmap
 +  bit 0: transmit supported
 + bit 1: receive supported
 + bit 2: IOCTL supported
 + bit 3: IOCTL_DIAL supported
 + bit 4: IOCTL_ANSWER_FAX supported
 + bit 5: manual transmit supported
 + bit 6: optional phone services supported
 + bit 7: canonical phone objects
 + bit 8: seam with next supported
 + 2Eh DWORD T.30 capabilities bitmap
 +  bit 0:  low vertical resolution (minimum)
 + bit 1:  high vertical resolution
 + bit 2:  page width 107mm (4.21 in)
 + bit 3:  page width 151mm (5.91 in)
 + bit 4:  page width 215mm (8.46 in) (minimum)
 + bit 5:  page width 255mm (10.04 in)
 + bit 6:  page width 303mm (11.93 in)
 + bit 7:  unused
 + bit 8:  page length 297mm (11.69 in) (minimum)
 + bit 9:  page length 364mm (14.33 in)
 + bit 10: page length 279mm (11 in)
 + bit 11: page length unlimited
 + bit 12: Group 4 resolution 300x300
 + bit 13: Group 4 resolution 400x400
 + bit 14: able to respond to poll from remote
 + bit 15: able to poll remote
 + bit 16: binary file transfer supported
 + 32h WORD IPC handle
 + 34h DWORD amount of memory needed to load
 + 38h WORD scope (00h for public, nonzero for private)
 + 3Ah  6 BYTEs future expansion
 + 40h WORD structure size
 +
 +Format of SYS_LOGOUT command buffer:
 +Offset Size Description
 + 00h WORD structure size
 + 02h WORD function number
 + 04h WORD return code
 + 06h WORD client ID
 + 08h DWORD client tag (for client's internal use)
 + 0Ch  6 BYTEs future expansion
 + 12h WORD structure size
 +
 +Format of SYS_GET_FAXAPP_INFO command buffer:
 +Offset Size Description
 + 00h 12 BYTEs common data (see SYS_LOGOUT above)
 + 0Ch 80 BYTEs FaxBIOS data
 + 5Ch 80 BYTEs default cover
 + ACh 80 BYTEs default logo
 + FCh 80 BYTEs default signature
 +14Ch 80 BYTEs default font 10
 +19Ch 80 BYTEs default font 165
 +1ECh 80 BYTEs default user font
 +23Ch 80 BYTEs default Pdir
 +28Ch 80 BYTEs default sort
 +2DCh 10 BYTEs default bill
 +2E6h 10 BYTEs default route
 +2F0h 40 BYTEs default cover sheet form
 +318h 34 BYTEs valid dial characters
 +33Ah  6 BYTEs local country code
 +340h  6 BYTEs local city or area code
 +346h  6 BYTEs future expansion
 +34Ch WORD structure size
 +
 +Format of STAT_IO_GET command buffer:
 +Offset Size Description
 + 00h 12 BYTEs common data (see SYS_LOGOUT above)
 + 0Ch WORD device number
 + 0Eh WORD current activity
 + 10h WORD number of rings (if ringing)
 + 12h WORD number of fascimiles transmitted
 + 14h WORD number of fascimiles received
 + 16h WORD status of last transmission
 + 18h WORD envelope number of last transmission
 + 1Ah WORD index of last destination in envelope
 + 1Ch WORD status of last reception
 + 1Eh WORD current page (if session in progress)
 + 20h 80 BYTEs current file
 + 70h104 BYTEs remote number
 + D8h 20 BYTEs last name
 + ECh 20 BYTEs first name
 +100h 32 BYTEs company name
 +120h 32 BYTEs notes
 +140h WORD current envelope ID (if sending)
 +142h WORD total pages in transmission (if sending)
 +144h  6 BYTEs future expansion
 +14h WORD structure size
 +
 +Format of STAT_FAXBIOS_GET command buffer:
 +Offset Size Description
 + 00h 12 BYTEs common data (see SYS_LOGOUT above)
 + 0Ch WORD status ID
 + 0Eh WORD currenty FaxBIOS function number
 + 10h WORD current Client ID being serviced
 + 12h WORD number of things to do
 + 14h WORD number of them done
 + 16h WORD number of pages to do (if any)
 + 18h WORD number of them done
 + 1Ah WORD number of files to do
 + 1Ch WORD number of them done
 + 1Eh 80 BYTEs current File
 + 6Eh WORD 0 if all devices are idle
 + 70h WORD number of fascimiles transmitted
 + 72h WORD number of fascimiles received
 + 74h WORD status of last transmission in system
 + 76h WORD envelope ID of last transmission
 + 78h WORD index of last destination in envelope
 + 7Ah WORD status of last reception in system
 + 7Ch DWORD time of next transmission
 + 80h  6 BYTEs future expansion
 + 86h WORD structure size
 + 
 +Format of PDIR_OPEN command buffer:
 +Offset Size Description
 + 00h 12 BYTEs common data (see SYS_LOGOUT above)
 + 0Ch 80 BYTEs Phone Directory token
 + 5Ch 80 BYTEs sort order token
 + ACh WORD open Mode (0 = read, 1 = write)
 + AEh WORD Phone Directory handle
 + B0h WORD number of people
 + B2h WORD number of groups
 + B4h WORD bitmap of fields supported by partial read
 + B6h  6 BYTEs future expansion
 + BCh WORD structure size
 + 
 +Format of PDIR_CLOSE command buffer:
 +Offset Size Description
 + 00h 12 BYTEs common data (see SYS_LOGOUT above)
 + 0Ch WORD Phone Directory handle
 + 0Eh  6 BYTEs future expansion
 + 14h WORD structure size
 + 
 +Format of PDIR_READ_PERSON command buffer:
 +Offset Size Description
 + 00h 12 BYTEs common data (see SYS_LOGOUT above)
 + 0Ch WORD Phone Directory handle
 + 0Eh WORD retrieve by index
 + 10h WORD person ID or index
 + 12h WORD how many groups person is in
 + 14h WORD person ID
 + 16h 20 BYTEs last name
 + 2Ah 20 BYTEs first name
 + 3Eh 32 BYTEs company
 + 5Eh 32 BYTEs notes
 + 7Eh  6 BYTEs FAX country code
 + 84h  6 BYTEs FAX city/area code
 + 8Ah 14 BYTEs FAX local number
 + 98h 14 BYTEs FAX extension
 + A6h 24 BYTEs reserved
 + BEh  6 BYTEs voice country code
 + C4h  6 BYTEs voice city/area code
 + CAh 14 BYTEs voice local number
 + D8h 14 BYTEs voice extension
 + E6h 24 BYTEs reserved
 + FEh 10 BYTEs outbound routing information
 +108h 10 BYTEs billing information, credit card etc
 +112h DWORD remote FAX capabilities
 +116h 21 BYTEs T.30 poll code of FAX number
 +12Bh 15 BYTEs reserved
 +13Ah  6 BYTEs future expansion
 +140h WORD structure size
 +
 +Format of SCHED_OPEN, SCHED_CANCEL command buffer:
 +Offset Size Description
 + 00h 12 BYTEs common data (see SYS_LOGOUT above)
 + 0Ch WORD scheduler handle
 + 0Eh  6 BYTEs future expansion
 + 14h WORD structure size
 + 
 +Format of SCHED_ADD_DEST command buffer:
 +Offset Size Description
 + 00h 12 BYTEs common data (see SYS_LOGOUT above)
 + 0Ch WORD schedule handle
 + 0Eh WORD device number if manual send wanted
 + 10h WORD non-zero if poll desired
 + 12h WORD person ID
 + 14h 20 BYTEs last name
 + 28h 20 BYTEs first name
 + 3Ch 32 BYTEs company
 + 5Ch 32 BYTEs notes
 + 7Ch  6 BYTEs FAX country code
 + 82h  6 BYTEs FAX city/area code
 + 88h 14 BYTEs FAX local number
 + 96h 14 BYTEs FAX extension
 + A4h 24 BYTEs reserved
 + BCh  6 BYTEs voice country code
 + C2h  6 BYTEs voice city/area code
 + C8h 14 BYTEs voice local number
 + D6h 14 BYTEs voice extension
 + E4h 24 BYTEs reserved
 + FCh 10 BYTEs outbound routing information
 +106h 10 BYTEs billing information, credit card etc
 +110h DWORD remote FAX capabilities
 +114h 21 BYTEs T.30 poll code of FAX number
 +129h 15 BYTEs reserved
 +138h  6 BYTEs future expansion
 +13Eh WORD structure size
 +
 +Format of SCHED_ADD_FILE command buffer:
 +Offset Size Description
 + 00h 12 BYTEs common data (see SYS_LOGOUT above)
 + 0Ch WORD schedule handle
 + 0Eh WORD file type
 + 0000h unidentified
 + 0001h native file format
 + 0002h ASCII
 + 0003h FaxBIOS Tiff Class F
 + 10h 80 BYTEs file name
 + 60h 80 BYTEs font token
 + B0h WORD conversion options bitmap
 + B2h WORD resolution
 + 0000h standard 98 lines per inch, 204 dpi
 + 0001h fine 196 lines per inch, 204 dpi
 + 0002h Group4 300 dpi
 + 0003h Group4 400 dpi
 + B4h WORD page length
 + 0000h 279 mm (11 in)
 + 0001h 297 mm (11.69 in)
 + 0002h 364 mm (14.33 in)
 + 0003h unlimited
 + B6h WORD page width
 + 0000h 215 mm (8.46 in)
 + 0001h 255 mm (10.04 in)
 + 0002h 303 mm (11.93 in)
 + 0003h 151 mm (5.91 in)
 + 0004h 107 mm (4.21 in)
 + B8h WORD binary file transfer specification
 + 0000h only as FAX
 + 0001h only as file (for non-faxable files)
 + 0002h as file when possible else FAX
 + BAh WORD seam flag (nonzero for seam with next)
 + BCh WORD delete flag (nonzero to delete when done)
 + BEh  6 BYTEs future expansion
 + C4h WORD structure size
 + 
 +Format of SCHED_SET_PARAMS command buffer:
 +Offset Size Description
 + 00h 12 BYTEs common data (see SYS_LOGOUT above)
 + 0Ch WORD scheduler handle
 + 0Eh DWORD time to send
 + 10h 10 BYTEs priority token
 + 1Ch 80 BYTEs logo file token
 + 6Ch 80 BYTEs signature file token
 + BCh 80 BYTEs cover page token
 +10Ch 40 BYTEs Subject text
 +134h 40 BYTEs From text
 +15Ch WORD user ID
 +15Eh  6 BYTEs future expansion
 +164h WORD structure size
 +
 +Format of SCHED_CLOSE command buffer:
 +Offset Size Description
 + 00h 12 BYTEs common data (see SYS_LOGOUT above)
 + 0Ch WORD scheduler handle
 + 0Eh WORD envelope ID generated
 + 10h  6 BYTEs future expansion
 + 16h WORD structure size
 +
 +Format of SLOG_OPEN, SLOG_CLOSE, RLOG_OPEN, RLOG_CLOSE command buffer:
 +Offset Size Description
 + 00h 12 BYTEs common data (see SYS_LOGOUT above)
 + 0Ch WORD log handle
 + 0Eh WORD number of entries 
 + 10h  6 BYTEs future expansion
 + 16h WORD structure size
 +
 +Format of GRAPH_GET_FILE_TYPE command buffer:
 +Offset Size Description
 + 00h 12 BYTEs common data (see SYS_LOGOUT above)
 + 0Ch 80 BYTEs filename
 + 5Ch WORD file type
 + 0000h unidentified
 + 0001h native file format
 + 0002h ASCII
 + 0003h FaxBIOS Tiff Class F
 + 5Eh WORD bitmap of supported capabilities
 + 60h  6 BYTEs future expansion
 + 66h WORD structure size
 +
 +Format of GRAPH_CREATE_FILE command buffer:
 +Offset Size Description
 + 00h 12 BYTEs common data (see SYS_LOGOUT above)
 + 0Ch 80 BYTEs filename
 + 5Ch WORD graph handle
 + 5Eh  6 BYTEs future expansion
 + 64h WORD structure size
 +
 +Format of GRAPH_CLOSE_FILE, GRAPH_END_PAGE command buffer:
 +Offset Size Description
 + 00h 12 BYTEs common data (see SYS_LOGOUT above)
 + 0Ch WORD graph handle
 + 0Eh  6 BYTEs future expansion
 + 14h WORD structure size
 +
 +Format of GRAPH_CREATE_PAGE command buffer:
 +Offset Size Description
 + 00h 12 BYTEs common data (see SYS_LOGOUT above)
 + 0Ch WORD graph handle
 + 0Eh WORD resolution
 + 10h WORD page width
 + 12h  6 BYTEs future expansion
 + 18h WORD structure size
 +
 +Format of GRAPH_WRITE_PAGE command buffer:
 +Offset Size Description
 + 00h 12 BYTEs common data (see SYS_LOGOUT above)
 + 0Ch WORD graph handle
 + 0Eh DWORD pointer to storage for image
 + 12h WORD band height in lines
 + 14h WORD width of page image in bytes
 + 16h WORD facsimile page width constant
 + 18h WORD width of page image in bits
 + 1Ah WORD number of bytes actually processed
 + 1Ch  6 BYTEs future expansion
 + 22h WORD structure size
 +
 +Format of GRAPH_OPEN_FILE command buffer:
 +Offset Size Description
 + 00h 12 BYTEs common data (see SYS_LOGOUT above)
 + 0Ch 80 BYTEs filename
 + 5Ch WORD file type
 + 5Eh WORD graph handle
 + 60h WORD number of pages
 + 62h  6 BYTEs future expansion
 + 68h WORD structure size
 +
 +Format of GRAPH_GOTO_PAGE command buffer:
 +Offset Size Description
 + 00h 12 BYTEs common data (see SYS_LOGOUT above)
 + 0Ch WORD graph handle
 + 0Eh WORD page number
 + 10h WORD vertical resolution
 + 12h WORD page width
 + 14h DWORD page length
 + 18h  6 BYTEs future expansion
 + 1Eh WORD structure size
 +
 +Format of GRAPH_READ_PAGE command buffer:
 +Offset Size Description
 + 00h 12 BYTEs common data (see SYS_LOGOUT above)
 + 0Ch WORD graph handle
 + 0Eh DWORD pointer to storage for image
 + 12h WORD band height in lines
 + 14h WORD width of page image in bytes
 + 16h WORD facsimile page width constant
 + 18h WORD width of page image in bits
 + 1Ah WORD number of bytes actually processed
 + 1Ch  6 BYTEs future expansion
 + 22h WORD structure size
 +
 +Format of IOCTL_ANSWER_FAX command buffer:
 +Offset Size Description
 + 00h 12 BYTEs common data (see SYS_LOGOUT above)
 + 0Ch WORD device number
 + 0Eh  6 BYTEs future expansion
 + 14h WORD structure size
 + 
 +Format of IOCTL_DIAL command buffer:
 +Offset Size Description
 + 00h 12 BYTEs common data (see SYS_LOGOUT above)
 + 0Ch WORD device number
 + 0Eh  6 BYTEs country code
 + 14h  6 BYTEs city or area code
 + 1Ah 14 BYTEs local number
 + 28h 14 BYTEs extension
 + 36h 14 BYTEs reserved
 + 4Eh  6 BYTEs future expansion
 + 54h WORD structure size
 +----------2F8100-----------------------------
 +INT 2F U - Nanosoft, Inc. TurboNET redirector - INSTALLATION CHECK
 + AX = 8100h
 +Return: AL = FFh if installed
 +Note: TurboNET is a NetBIOS-based file redirector and server; a demonstration
 +   version may be downloaded from Nanosoft's BBS
 +SeeAlso: AX=8000h"TurboNET"
 +----------2F8101-----------------------------
 +INT 2F U - Nanosoft, Inc. TurboNET redirector - ???
 + AX = 8101h
 +Return: AL = ???
 + DL = ???
 +----------2F8102-----------------------------
 +INT 2F U - Nanosoft, Inc. TurboNET redirector - ???
 + AX = 8102h
 +Return: AL = ???
 + DL = ???
 +----------2F8103-----------------------------
 +INT 2F U - Nanosoft, Inc. TurboNET redirector - GET MACHINE NAME???
 + AX = 8103h
 + ES:DI -> 17-byte buffer
 +Return: buffer filled
 +----------2F8104-----------------------------
 +INT 2F U - Nanosoft, Inc. TurboNET redirector - ???
 + AX = 8104h
 + BL = ???
 + BH = ???
 + CX = ???
 + DX = ???
 + DS:SI -> 16-byte buffer containing ???
 +Return: AL = 00h ???
 +----------2F8105-----------------------------
 +INT 2F U - Nanosoft, Inc. TurboNET redirector - ???
 + AX = 8105h
 + CX = ??? (don't change current value if 0000h)
 + DX = ??? (don't change current value if 0000h)
 +Return: AL = 00h successful
 +----------2F82-------------------------------
 +INT 2F U - Nanosoft, Inc. TurboNET - ???
 + AH = 82h
 + ???
 +Return: ???
 +Note: called by TNR.EXE, the TurboNET redirector configuration program
 +SeeAlso: AX=8100h
 +----------2F8200-----------------------------
 +INT 2F - RESPLAY - SAMPLE/PLAYBACK
 + AX = 8200h
 + DX:DI -> start of sample space
 + CX:BX = length in bytes
 +Return: AX = status
 +     1000h successful
 +     2000h not initialized (see AX=8210h)
 +     other RESPLAY not installed
 +Note: RESPLAY is a freeware sound sampling/playback utility by Mark J. Cox
 +SeeAlso: AX=8201h,AX=8210h
 +----------2F8201-----------------------------
 +INT 2F - RESPLAY - INSTALLATION CHECK
 + AX = 8201h
 +Return: AX = 7746h if installed
 +SeeAlso: AX=8202h
 +----------2F8202-----------------------------
 +INT 2F - RESPLAY - UNINSTALL
 + AX = 8202h
 +Return: AX = status
 +     1000h successful
 +SeeAlso: AX=8201h
 +----------2F8210-----------------------------
 +INT 2F - RESPLAY - INITIALIZE
 + AX = 8210h
 + BL = sound device
 +     00h printer port LPT1
 +     01h printer port LPT2
 +     02h prototype board at I/O address 0300h
 +     03h printer port (alternative LPT1)
 +     04h internal speaker
 + BH = sample rate in multiples of 250 Hz (14h to A0h)
 + CL = direction
 +     00h playback
 +     01h sample
 +Return: AX = status
 +     1000h successful
 +     2000h parameter out of range
 +     other RESPLAY not installed
 +SeeAlso: AX=8200h
 +----------2F86-------------------------------
 +INT 2F U - ???
 + AH = 86h
 + AL = function (at least 06h and 07h)
 + ???
 +Return: ???
 +Note: called by Codeview for Windows
 +SeeAlso: AH=44h
 +----------2F8900-----------------------------
 +INT 2F - WHOA!.COM - INSTALLATION CHECK
 + AX = 8900h
 +Return: AL = 00h not installed
 +    = FFh installed
 +Note: WHOA!.COM is a system slow-down utility by Brad D Crandall
 +SeeAlso: AX=8901h,AX=8902h
 +----------2F8901-----------------------------
 +INT 2F - WHOA!.COM - UNINSTALL
 + AX = 8901h
 +Return: AL = FDh successful
 +    = FEh error
 +Note: WHOA!.COM is a system slow-down utility by Brad D Crandall
 +SeeAlso: AX=8900h
 +----------2F8902-----------------------------
 +INT 2F - WHOA!.COM - SET DELAY COUNT
 + AX = 8902h
 + BX = delay count (larger values slow system down more)
 +Return: AL = FDh successful
 +    = FEh error
 +Note: WHOA!.COM is a system slow-down utility by Brad D Crandall
 +SeeAlso: AX=8900h
 +----------2F9000-----------------------------
 +INT 2F U - RAID - INSTALLATION CHECK
 + AX = 9000h
 +Return: AL = FFh if installed
 +Note: RAID (Resident AID) is a TSR utility program by Ross Neilson Wentworth
 +   that resides mostly in EMS
 +----------2F9001-----------------------------
 +INT 2F U - RAID - GET ???
 + AX = 9001h
 +Return: DX:AX -> ???
 +SeeAlso: AX=9000h
 +----------2F9002-----------------------------
 +INT 2F U - RAID - GET RESIDENT SEGMENT
 + AX = 9002h
 +Return: AX = segment of resident (conventional memory) portion
 +SeeAlso: AX=9000h
 +----------2F9003-----------------------------
 +INT 2F U - RAID - UNINSTALL
 + AX = 9003h
 +Return: ???
 +SeeAlso: AX=9000h
 +----------2F9004-----------------------------
 +INT 2F U - RAID - GET ???
 + AX = 9004h
 +Return: AX = first available paragraph past end of resident portion???
 + CX destroyed
 +SeeAlso: AX=9000h
 +----------2F92-------------------------------
 +INT 2F - Couriers LAN E-Mail - API
 + AH = 92h
 + AL = function
 +     00h installation check
 +     01h uninstall
 +     02h pop down MICRO.EXE notification window
 +     03h ???
 +     04h ???
 +     05h ???
 +Return: ???
 +SeeAlso: AH=9Ch
 +----------2F93-------------------------------
 +INT 2F - InnerMission v1.7+ - INSTALLATION CHECK
 + AH = 93h
 + BX = CX = AX
 +Return: AL = FFh if installed and BX=CX=AX on entry
 +     BX = segment of resident code
 +    = 01h if installed but BX or CX differ from AX
 +Note: InnerMission is a shareware graphical screen blanker by Kevin Stokes
 +----------2F9C-------------------------------
 +INT 2F - Couriers LAN E-Mail OPERATOR.EXE - API
 + AH = 9Ch
 + AL = subfunction
 +     01h uninstall
 +Return: ???
 +SeeAlso: AH=92h
 +----------2FA1--BX0081-----------------------
 +INT 2F - Ergo DOS extenders - INSTALLATION CHECK
 + AH = A1h
 + BX = 0081h
 + AL = which
 +     FEh OS/286,OS/386
 +     FFh HummingBoard DOS extender
 + ES:DI -> 16-byte buffer
 +Return: if installed, first four bytes of ES:DI buffer are "IABH"
 +Note: since TKERNEL is a licensed version, it is likely that subfunctions
 +   BX=0082h and BX=0084h are present and function identically to the
 +   AX=FBA1h/BX=008xh calls
 +SeeAlso: AX=ED00h,AX=FBA1h,INT 15/AX=BF02h
 +----------2FA189-----------------------------
 +INT 2F U - Biologic HRAMDEV.SYS - API
 + AX = A189h
 + BX = subfunction
 +     0000h set ???
 +     0001h remove ???
 +     0002h get status ???
 +     0003h enable ???
 +     0004h disable ???
 +     0005h set ??? flag
 +     0006h clear ??? flag
 +     0007h set ??? flag
 +     0008h clear ??? flag
 +     0009h set ???
 + ES:DI -> function-specific arguments
 + if func 0000h: 20-byte buffer containing ???
 + if func 0001h: 20-byte buffer for returned ???
 + if func 0002h: 16-byte buffer for returned ???
 + if func 0009h: WORD containing ???
 +Return: BX = A189h if installed
 + AH = status
 +     00h successful
 +     FFh failed or invalid function number
 +Notes: HRAMDEV.SYS is a part of the shareware package HRAM by Biologic which
 +   provides improved high memory access under MSDOS 5.0
 + functions 00h and 01h use a stack of four entries; function 01h always
 +   removes the values stored with the most recent function 00h call
 +   which has not yet been matched with a function 01h call.
 +----------2FA900-----------------------------
 +INT 2F - METZTSR.COM - INSTALLATION CHECK
 + AX = A900h
 + CF set
 +Return: CF clear if resident
 +     AX = 97FFh
 + CF set if not present
 +Notes: METZTSR.COM prevents METZ applications (such as the MAGIC screen
 +   saver) inactivity timeout while running a DOSapp under MS Windows.
 + the default multiplex number is A9h, but may be set to any value from
 +   80h to FFh with a commandline switch
 +SeeAlso: AX=A901h,AX=A902h
 +----------2FA901-----------------------------
 +INT 2F - METZTSR.COM - GET TIME OF LAST KEYBOARD ACTIVITY
 + AX = A901h
 + CF set
 +Return: CF clear if successful
 +     AX:DX = BIOS time at which INT 09 was last invoked
 + CF set if not present
 +SeeAlso: INT 09,INT 1A/AH=00h
 +----------2FA902-----------------------------
 +INT 2F - METZTSR.COM - SET METZ Ctrl-Alt-Del FLAG
 + AX = A902h
 + BL = new value
 +     00h Ctrl-Alt-Del not allowed
 +     else Ctrl-Alt-Del allowed (startup default is 01h)
 + CF set
 +Return: CF clear if successful
 +     AX = 97FFh
 + CF set if not resident
 +SeeAlso: AX=A903h
 +----------2FA903-----------------------------
 +INT 2F - METZTSR.COM - GET METZ Ctrl-Alt-Del FLAG
 + AX = A903h
 + CF set
 +Return: CF clear if successful
 +     AX = 97FFh if Ctrl-Alt-Del allowed
 +     AX = 0000h if Ctrl-Alt-Del not allowed
 + CF set if not resident
 +SeeAlso: AX=A902h
 +----------2FAA00-----------------------------
 +INT 2F - VIDCLOCK.COM - INSTALLATION CHECK
 + AX = AA00h
 +Return: AL = 00h not installed
 +      FFh installed
 +Note: VIDCLOCK.COM is a memory-resident clock by Thomas G. Hanlin III
 +----------2FAB00-----------------------------
 +INT 2F - Btrieve Multi-User - INSTALLATION CHECK
 + AX = AB00h
 +Return: AL = 4Dh if installed
 +SeeAlso: AX=AB01h,AX=AB02h,INT 21/AX=3000h"Btrieve",INT 7B"Btrieve"
 +----------2FAB01-----------------------------
 +INT 2F - Btrieve Multi-User - EXECUTE Btrieve OPERATION
 + AX = AB01h
 + BX = process ID
 + DS:DX -> 38-byte parameter record (see INT 7B"Btrieve")
 +Return: AL = 00h OK
 +    = other retry after calling INT 7F/AX=0200h
 +SeeAlso: AX=AB00h,AX=AB02h,INT 7B"Btrieve",INT 7F/AX=0200h
 +----------2FAB02-----------------------------
 +INT 2F - Btrieve Multi-User - GET NEW PROCESS ID
 + AX = AB02h
 +Return: AL = 00h succesful
 +     BX = process ID
 + AL > 00h failed, retry after calling INT 7F/AX=0200h
 +SeeAlso: AX=AB00h,AX=AB01h,INT 7B"Btrieve",INT 7F/AX=0200h
 +----------2FAC00-----------------------------
 +INT 2F - DOS 4.01+ GRAPHICS.COM - INSTALLATION CHECK
 + AX = AC00h
 +Return: AX = FFFFh
 + ES:DI -> ??? (graphics data?) (not documented)
 +Note: this installation check was moved here to avoid the conflict with the
 +   CD-ROM extensions that occurred in DOS 4.00
 +SeeAlso: AX=1500h"GRAPHICS"
 +----------2FAD00-----------------------------
 +INT 2F U - DOS 3.3+ DISPLAY.SYS internal - INSTALLATION CHECK
 + AX = AD00h
 +Return: AL = FFh if installed
 +     BX = ??? (0100h in MS-DOS 3.30, PCDOS 4.01)
 +Note: DOS 5.0 DISPLAY.SYS chains to previous handler if AL is not one of the
 +   subfunctions listed here
 +----------2FAD01-----------------------------
 +INT 2F U - DOS 3.3+ DISPLAY.SYS internal - SET ???
 + AX = AD01h
 + BX = ???
 +Return: ???
 + CF set on error
 +----------2FAD02-----------------------------
 +INT 2F U - DOS 3.3+ DISPLAY.SYS internal - GET ???
 + AX = AD02h
 +Return: BX = ??? (value set with AX=AD01h)
 +----------2FAD03-----------------------------
 +INT 2F U - DOS 3.3+ DISPLAY.SYS internal - GET ???
 + AX = AD03h
 + ES:DI -> user buffer
 + CX = size of buffer
 +Return: CF set if buffer too small
 + CF clear if successful
 +----------2FAD04-----------------------------
 +INT 2F U - DOS 4.x only DISPLAY.SYS internal - ???
 + AX = AD04h
 + ???
 +Return: ???
 +----------2FAD10-----------------------------
 +INT 2F U - DOS 4+ DISPLAY.SYS internal - INSTALLATION CHECK???
 + AX = AD10h
 + ???
 +Return: AX = FFFFh
 + BX = ??? (0100h in PCDOS 4.01)
 +----------2FAD40-----------------------------
 +INT 2F - DOS 4.0 - ???
 + AX = AD40h
 + DX = ???
 + ???
 +Return: ???
 +Note: called by PCDOS 4.01 PRINT.COM
 +----------2FAD80-----------------------------
 +INT 2F - DOS 3.3+ KEYB.COM internal - INSTALLATION CHECK
 + AX = AD80h
 +Return: AL = FFh if installed
 +     BX = version number (BH = major, BL = minor)
 +     ES:DI -> internal data (see below)
 +Note: MSDOS 3.30, PCDOS 4.01, and MSDOS 5.00 all report version 1.00.
 +
 +Format of KEYB internal data:
 +Offset Size Description
 + 00h DWORD original INT 09
 + 04h DWORD original INT 2F
 + 08h  6 BYTEs ???
 + 0Eh WORD flags
 + 10h BYTE ???
 + 11h BYTE ???
 + 12h  4 BYTEs ???
 + 16h  2 BYTEs country ID letters
 + 18h WORD current code page
 +---DOS 3.3---
 + 1Ah WORD pointer to first item in list of code page tables???
 + 1Ch WORD pointer to ??? item in list of code page tables
 + 1Eh  2 BYTEs ???
 + 20h WORD pointer to key translation data
 + 22h WORD pointer to last item in code page table list (see below)
 + 24h  9 BYTEs ???
 +---DOS 4.01---
 + 1Ah  2 BYTEs ???
 + 1Ch WORD pointer to first item in list of code page tables???
 + 1Eh WORD pointer to ??? item in list of code page tables
 + 20h  2 BYTEs ???
 + 22h WORD pointer to key translation data
 + 24h WORD pointer to last item in code page table list (see below)
 + 26h  9 BYTEs ???
 +
 +Format of code page table list entries:
 +Offset Size Description
 + 00h WORD pointer to next item, FFFFh = last
 + 02h WORD code page
 + 04h  2 BYTEs ???
 +
 +Format of translation data:
 +Offset Size Description
 + 00h WORD size of data in bytes, including this word
 + 02h N-2 BYTEs ???
 +----------2FAD81-----------------------------
 +INT 2F - DOS 3.3+ KEYB.COM - SET KEYBOARD CODE PAGE
 + AX = AD81h
 + BX = code page (see INT 21/AX=6601h)
 +Return: CF set on error
 +     AX = 0001h (code page not available)
 + CF clear if successful
 +Notes: called by DISPLAY.SYS
 + documented for DOS 5+, but undocumented for earlier versions
 +SeeAlso: AX=AD82h
 +----------2FAD82-----------------------------
 +INT 2F - DOS 3.3+ KEYB.COM - SET KEYBOARD MAPPING
 + AX = AD82h
 + BL = new state
 +     00h US keyboard (Control-Alt-F1)
 +     FFh foreign keyboard (Control-Alt-F2)
 +Return: CF set on error (BL not 00h or FFh)
 + CF clear if successful
 +Note: documented for DOS 5+, but undocumented for earlier versions
 +SeeAlso: AX=AD81h,AX=AD83h
 +----------2FAD83-----------------------------
 +INT 2F - DOS 5.0 KEYB.COM - GET KEYBOARD MAPPING
 + AX = AD83h
 +Return: BL = current state
 +     00h US keyboard
 +     FFh foreign keyboard
 +SeeAlso: AX=AD82h
 +----------2FAE00DXFFFF-----------------------
 +INT 2F U - DOS 3.3+ internal - INSTALLABLE COMMAND - INSTALLATION CHECK
 + AX = AE00h
 + DX = FFFFh
 + CH = FFh
 + CL = length of command line tail (4DOS v4.0)
 + DS:BX -> command line buffer (see below)
 + DS:SI -> command name buffer (see below)
 + DI = 0000h (4DOS v4.0)
 +Return: AL = FFh if this command is a TSR extension to COMMAND.COM
 + AL = 00h if the command should be executed as usual
 +Notes: This call provides a mechanism for TSRs to install permanent
 +   extensions to the command repertoire of COMMAND.COM. It appears
 +   that COMMAND.COM makes this call before executing the current
 +   command line, and does not execute it itself if the return is FFh.
 + APPEND hooks this call, to allow subsequent APPEND commands to
 +   execute without re-running APPEND
 +
 +Format of command line buffer:
 +Offset Size Description
 + 00h BYTE max length of command line, as in INT 21/AH=0Ah
 + 01h BYTE count of bytes to follow, excluding terminating 0Dh
 +      N BYTEs command line text, terminated by 0Dh
 +
 +Format of command name buffer:
 +Offset Size Description
 + 00h BYTE length of command name
 + 01h  N BYTEs uppercased command name (blank-padded to 11 chars by 4DOS v4)
 +----------2FAE01DXFFFF-----------------------
 +INT 2F U - DOS 3.3+ internal - INSTALLABLE COMMAND - EXECUTE
 + AX = AE01h
 + DX = FFFFh
 + CH = 00h
 + CL = length of command name (4DOS v4.0)
 + DS:SI -> command name buffer (see AX=AE00h)
 + DS:BX -> command line buffer (see AX=AE00h)
 +Return: DS:SI buffer updated
 +   if length byte is nonzero, the following bytes contain the uppercase
 +   internal command to execute and the command line buffer contains the
 +   command's parameters (the first DS:[SI] bytes are ignored)
 +Notes: this call requests execution of the command which a previous call to
 +   AX=AE00h indicated was resident
 + APPEND hooks this call
 +----------2FB000-----------------------------
 +INT 2F - DOS 3.3+ GRAFTABL.COM - INSTALLATION CHECK
 + AX = B000h
 +Return: AL = 00h not installed, OK to install
 +    = 01h not installed, not OK to install
 +    = FFh installed
 +Notes: called by DISPLAY.SYS
 + documented for DOS 5.0, but undocumented in prior versions
 +SeeAlso: AX=B001h
 +----------2FB001-----------------------------
 +INT 2F - DOS 3.3+ GRAFTABL.COM - GET GRAPHICS FONT TABLE
 + AX = B001h
 + DS:BX -> DWORD buffer for address of 8x8 font table
 +Return: buffer filled
 + AL = FFh
 +Note: PCDOS 3.30/4.01 set the font table offset to 0130h, MSDOS 3.30 to 0030h
 +SeeAlso: AX=B000h
 +----------2FB400-----------------------------
 +INT 2F - IBM PC3270 EMULATION PROG v3 - INSTALLATION CHECK
 + AX = B400h
 +Return: AL = FFh if installed
 +----------2FB401-----------------------------
 +INT 2F - IBM PC3270 EMULATION PROG v3 - GET HOST BUFFER ADDRESS
 + AX = B401h
 +Return: ES -> host screen buffer (PC ASCII format)
 + ES unchanged if communications not started
 +----------2FB402-----------------------------
 +INT 2F - IBM PC3270 EMULATION PROG v3 - ???
 + AX = B402h
 + BX = ???
 +Return: ???
 +----------2FB403-----------------------------
 +INT 2F - IBM PC3270 EMULATION PROG v3 - ???
 + AX = B403h
 + ???
 +Return: ???
 +----------2FB404-----------------------------
 +INT 2F - IBM PC3270 EMULATION PROG v3 - ???
 + AX = B404h
 + ???
 +Return: ???
 +----------2FB405-----------------------------
 +INT 2F - IBM PC3270 EMULATION PROG v3 - ???
 + AX = B405h
 + ???
 +Return: ???
 +----------2FB700-----------------------------
 +INT 2F - APPEND - INSTALLATION CHECK
 + AX = B700h
 +Return: AL = status
 +     00h not installed
 +     FFh installed
 +Note: MSDOS 3.30 APPEND refuses to install itself when run inside TopView or
 +   a TopView-compatible environment
 +----------2FB701-----------------------------
 +INT 2F U - APPEND - ???
 + AX = B701h
 + ???
 +Return: ???
 +Note: MSDOS 3.30 APPEND displays "Incorrect APPEND Version" and aborts caller
 +----------2FB702-----------------------------
 +INT 2F - APPEND - VERSION CHECK
 + AX = B702h
 +Return: AX = FFFFh if not DOS 4.0 APPEND (also if DOS 5.0 APPEND)
 + AL = major version number
 + AH = minor version number, otherwise
 +SeeAlso: AX=B710h
 +----------2FB703-----------------------------
 +INT 2F U - DOS 3.3, DOS 5.0 APPEND - HOOK INT 21
 + AX = B703h
 + ES:DI -> INT 21 handler APPEND should chain to
 +Return: ES:DI -> APPEND's INT 21 handler
 +Note: each invocation of this function toggles a flag which APPEND uses to
 +   determine whether to chain to the user handler or the original
 +   INT 21
 +----------2FB704-----------------------------
 +INT 2F - DOS 3.3+ APPEND - GET APPEND PATH
 + AX = B704h
 +Return: ES:DI -> active APPEND path (128 bytes max)
 +----------2FB706-----------------------------
 +INT 2F - DOS 4+ APPEND - GET APPEND FUNCTION STATE
 + AX = B706h
 +Return: BX = APPEND state
 +     bit 0: set if APPEND enabled
 +     bits 1-11 reserved
 +     bit 12: (DOS 5.0) set if APPEND applies directory search even if a
 + drive has been specified
 +     bit 13: set if /PATH flag active
 +     bit 14: set if /E flag active (environment var APPEND exists)
 +     bit 15: set if /X flag active
 +----------2FB707-----------------------------
 +INT 2F - DOS 4+ APPEND - SET APPEND FUNCTION STATE
 + AX = B707h
 + BX = APPEND state bits (see AX=B706h)
 +----------2FB710-----------------------------
 +INT 2F U - DOS 3.3+ APPEND - GET VERSION INFO
 + AX = B710h
 +Return: AX = current APPEND state (see AX=B706h)
 + BX = ??? (0000h in MSDOS 3.30 and 5.00)
 + CX = ??? (0000h in MSDOS 3.30 and 5.00)
 + DL = major version
 + DH = minor version
 +SeeAlso: AX=B702h
 +----------2FB711-----------------------------
 +INT 2F - DOS 4+ APPEND - SET RETURN FOUND NAME STATE
 + AX = B711h
 +Note: if the next INT 21h call (and ONLY the next) is function 3Dh, 43h, or
 + 6Ch (also 4B03h and 4Eh if /X active), the fully qualified filename is
 + written over top of the filename passed to the INT 21h call.  The
 + application must provide a sufficiently large buffer.  This state is
 + reset after the next INT 21h call processed by APPEND.
 +BUG: DOS 4.0 APPEND reportedly overwrites DS:DX instead of DS:SI for
 +   INT 21/AH=6Ch
 +SeeAlso: INT 21/AH=4Eh
 +----------2FB800-----------------------------
 +INT 2F - network - INSTALLATION CHECK
 + AX = B800h
 +Return: AL = status
 +     00h     not installed
 +     nonzero installed
 +       BX = installed component flags (test in this order!)
 +    bit 6   server
 +    bit 2   messenger
 +    bit 7   receiver
 +    bit 3   redirector
 +----------2FB803-----------------------------
 +INT 2F - network - GET NETWORK EVENT POST HANDLER
 + AX = B803h
 +Return: ES:BX -> event post handler (see AX=B804h)
 +SeeAlso: AX=B804h,AX=B903h
 +----------2FB804-----------------------------
 +INT 2F - network - SET NETWORK EVENT POST HANDLER
 + AX = B804h
 + ES:BX -> new event post handler
 +Notes: used in conjunction with AX=B803h to hook into the network event post
 +   routine
 + The specified handler is called on any network event.  Two events are
 +   defined: message received and critical network error.
 +SeeAlso: AX=B803h,AX=B904h
 +
 +Values post routine is called with:
 + AX = 0000h single block message
 +     DS:SI -> ASCIZ originator name
 +     DS:DI -> ASCIZ destination name
 +     ES:BX -> text header (see below)
 + AX = 0001h start multiple message block
 +     CX = block group ID
 +     DS:SI -> ASCIZ originator name
 +     DS:DI -> ASCIZ destination name
 + AX = 0002h multiple block text
 +     CX = block group ID
 +     ES:BX -> text header (see below)
 + AX = 0003h end multiple block message
 +     CX = block group ID
 + AX = 0004h message aborted due to error
 +     CX = block group ID
 + AX = 0101h server received badly formatted network request
 +     Return: AX = FFFFh (PC LAN will process error)
 + AX = 0102h unexpected network error
 +     ES:BX -> NCB (see INT 5C)
 + AX = 0103h server received INT 24 error
 +     other registers as for INT 24, except AH is in BH
 +     Return: as below, but only 0000h and FFFFh allowed
 +Return: AX = response code
 +     0000h user post routine processed message
 +     0001h PC LAN will process message, but message window not displayed
 +     FFFFh PC LAN will process message
 +
 +Format of text header:
 +Offset Size Description
 + 00h WORD length of text (maximum 512 bytes)
 + 02h  N BYTEs text of message
 +Note: all CRLF sequences in message text are replaced by 14h
 +----------2FB807-----------------------------
 +INT 2F - Network - GET NetBIOS NAME NUMBER OF MACHINE NAME
 + AX = B807h
 +Return: CH = NetBIOS name number of the machine name
 +SeeAlso: INT 21/AX=5E00h
 +----------2FB808-----------------------------
 +INT 2F U - Network - RELINK KEYBOARD HANDLER
 + AX = B908h
 + ES:BX -> INT 09 handler RECEIVER should call after it finishes INT 09
 +Notes: this call replaces the address to which RECEIVER.COM chains on an
 +   INT 09 without preserving the original value. This allows a prior
 +   handler to unlink, but does not allow a new handler to be added
 +   such that RECEIVER gets the INT 09 first unless it completely takes
 +   over INT 09 and never chains.
 + called by DOS 3.2 KEYBxx.COM
 +SeeAlso: AX=B908h
 +----------2FB809-----------------------------
 +INT 2F - LANtastic Network, NetWare Lite - VERSION CHECK
 + AX = B809h
 +Return: AH = major version
 + AL = minor version (decimal)
 +----------2FB900-----------------------------
 +INT 2F - PC Network RECEIVER.COM - INSTALLATION CHECK
 + AX = B900h
 +Return: AL = 00h if not installed
 +      FFh if installed
 +----------2FB901-----------------------------
 +INT 2F - PC Network RECEIVER.COM - GET RECEIVER.COM INT 2F HANDLER ADDRESS
 + AX = B901h
 +Return: AL = ???
 + ES:BX -> RECEIVER.COM INT 2F handler
 +Note: allows more efficient execution by letting the caller bypass any other
 +   INT 2F handlers which have been added since RECEIVER.COM was
 +   installed
 +----------2FB903-----------------------------
 +INT 2F - PC Network RECEIVER.COM - GET RECEIVER.COM POST ADDRESS
 + AX = B903h
 +Return: ES:BX -> POST handler
 +SeeAlso: AX=B803h,AX=B904h
 +----------2FB904-----------------------------
 +INT 2F - PC Network RECEIVER.COM - SET RECEIVER.COM POST ADDRESS
 + AX = B904h
 + ES:BX -> new POST handler
 +SeeAlso: AX=B804h,AX=B903h
 +----------2FB905-----------------------------
 +INT 2F - PC Network RECEIVER.COM - GET FILENAME
 + AX = B905h
 + DS:BX -> 128-byte buffer for filename 1
 + DS:DX -> 128-byte buffer for filename 2
 +Return: buffers filled from RECEIVER.COM internal buffers
 +Note: use of filenames is unknown, but one appears to be for storing messages
 +SeeAlso: AX=B906h
 +----------2FB906-----------------------------
 +INT 2F - PC Network RECEIVER.COM - SET FILENAME
 + AX = B906h
 + DS:BX -> 128-byte buffer for filename 1
 + DS:DX -> 128-byte buffer for filename 2
 +Return: RECEIVER.COM internal buffers filled from user buffers
 +Note: use of filenames is unknown, but one appears to be for storing messages
 +SeeAlso: AX=B905h
 +----------2FB908-----------------------------
 +INT 2F - PC Network RECEIVER.COM - UNLINK KEYBOARD HANDLER
 + AX = B908h
 + ES:BX -> INT 09 handler RECEIVER should call after it finishes INT 09
 +Note: this call replaces the address to which RECEIVER.COM chains on an
 +   INT 09 without preserving the original value. This allows a prior
 +   handler to unlink, but does not allow a new handler to be added
 +   such that RECEIVER gets the INT 09 first.
 +SeeAlso: AX=B808h
 +----------2FBC00-----------------------------
 +INT 2F - Windows 3.0, DOS 5.0 EGA.SYS - INSTALLATION CHECK
 + AX = BC00h
 +Return: AL = 00h not installed, OK to install
 +    = 01h not installed, not OK to install
 +    = FFh installed
 + BX = 5456h ("TV")
 +Note: AH=BCh is the default value, which may be changed by a command line
 +   parameter to any value between 80h and FFh
 +SeeAlso: AX=BC06h,INT 10/AH=FAh"EGA"
 +----------2FBC06-----------------------------
 +INT 2F U - MS Windows 3.0, DOS 5.0 EGA.SYS - GET VERSION INFO
 + AX = BC06h
 +Return: BX = 5456h ("TV")
 + CH = major version
 + CL = minor version
 + DL = revision
 +SeeAlso: AX=BC00h,INT 10/AH=FAh"EGA"
 +----------2FBE00-----------------------------
 +INT 2F - REDVIEW - INSTALLATION CHECK
 + AX = BE00h
 +Return: AL = FFh if installed
 +Note: REDVIEW is a public-domain TSR by Alexandr Novy and Petr Horak which
 +   copies data sent to standard output to standard error when the
 +   former has been redirected to a file, thus allowing the data to
 +   be seen on the screen at the same time it is captured in a file
 +----------2FBF00-----------------------------
 +INT 2F - PC LAN PROGRAM REDIRIFS.EXE internal - INSTALLATION CHECK
 + AX = BF00h
 +Return: AL = FFh if installed
 +----------2FBF01-----------------------------
 +INT 2F U - PC LAN PROGRAM REDIRIFS.EXE internal - ???
 + AX = BF01h
 + ???
 +Return: ???
 +----------2FBF80-----------------------------
 +INT 2F - PC LAN PROG REDIR.SYS internal - SET REDIRIFS ENTRY POINT
 + AX = BF80h
 + ES:DI -> FAR entry point to IFS handler in REDIRIFS
 +Return: AL = FFh if installed
 +     ES:DI -> internal workspace
 +Note: all future IFS calls to REDIR.SYS are passed to the ES:DI entry point
 +----------2FC000-----------------------------
 +INT 2F - Novell ODI Link Support Layer (LSL.COM) - INSTALLATION CHECK
 + AX = C000h
 +Return: AL = FFh
 + ES:BX -> call 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.
 +----------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=C051h
 +----------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
 +----------2FC05B-----------------------------
 +INT 2F U - Explosiv 2.00 - SET ???
 + AX = C05Bh
 + BL = ???
 +----------2FC05C-----------------------------
 +INT 2F U - Explosiv 2.00 - SET ???
 + AX = C05Ch
 + BL = ???
 +----------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 = 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
 +----------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
 +SeeAlso: 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: ???
 +----------2FCBDC-----------------------------
 +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
 +----------2FCBDD-----------------------------
 +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"
 +----------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)
 +Note: HEART.COM is a CPU lock-up/critical indicator utility by Mitch Davis.
 + 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 WORD Table of colors/attributes (see notes).
 + 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/AX=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
 +----------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
 +----------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
 +SeeAlso: AX=DE03h
 +Note: driver should pass this call to previous handler after doing its work
 +----------2FDE03-----------------------------
 +INT 2F - DESQview v2.26+ External Device Interface - DV TERMINATION
 + AX = DE03h
 + BX = mapping context of DESQview
 + DX = handle of DESQview system task
 +SeeAlso: AX=DE02h
 +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
 +----------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
 +
 +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
 +----------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
 +----------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
 +----------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
 +----------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
 +----------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
 +----------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
 +----------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
 +----------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