home *** CD-ROM | disk | FTP | other *** search
/ Frostbyte's 1980s DOS Shareware Collection / floppyshareware.zip / floppyshareware / DOOG / 1216REF.ZIP / CHAPTER.005 < prev    next >
Text File  |  1988-12-16  |  85KB  |  1,866 lines

  1.  
  2.    **  Programmer's  Technical  Reference  for  MSDOS  and  the  IBM  PC **
  3.                         ┌─────────────────────────────┐
  4.                         │ Shareware Version, 12/16/88 │
  5.                         │  Please Register Your Copy  │
  6.                         └─────────────────────────────┘
  7.                        Copyright (c) 1988 Dave Williams
  8.  
  9.  
  10.                             C H A P T E R   F I V E
  11.  
  12.                           Interrupts 22h Through 86h
  13.  
  14.  
  15. Interrupt 22h   Terminate Address
  16. (0:0088h)
  17.  This interrupt transfers control to the far (dword) address at this interrupt
  18. location when an application program terminates. The default address for this
  19. interrupt is 0:0088h through 0:008Bh. This address is copied into the program's
  20. Program Segment Prefix at bytes 0Ah through 0Dh at the time the segment is
  21. created and is restored from the PSP when the program terminates. The calling 
  22. program is normally COMMAND.COM or an application. Do not issue this interrupt
  23. directly, as the EXEC function call does this for you. If an application 
  24. spawns a child process, it must set the Terminate Address prior to issuing the 
  25. EXEC function call, otherwise when the second program terminated it would 
  26. return to the calling program's Terminate Address rather than its own. This 
  27. address may be set with int 21, function 25h.
  28.  
  29.  
  30. Interrupt 23h   Ctrl-Break Exit Address
  31. (0:008Ch)
  32.  If the user enters a Ctrl-Break during STDIN, STDOUT, STDPRN, or STDAUX, int
  33. 23h is executed. If BREAK is on, int 23h is checked on MOST function calls 
  34. (notably 06h). If the user written Ctrl-Break routine saves all registers, it 
  35. may end with a return-from-interrupt instruction (IRET) to continue program 
  36. execution. If the user-written interrupt program returns with a long return, the
  37. carry flag is used to determine whether the program will be aborted. If the 
  38. carry flag is set, the program is aborted, otherwise execution continues (as 
  39. with a return by IRET). If the user-written Ctrl-Break interrupt uses function 
  40. calls 09h or 0Ah, (Display String or Buffered Keyboard Input) then a three-byte
  41. string of 03h-0Dh-0Ah (ETX/CR/LF) is sent to STDOUTt. If execution is continued
  42. with an IRET, I/O continues from the start of the line. When the interrupt
  43. occurs, all registers are set to the value they had when the original function
  44. call to DOS was made. There are no restrictions on what the Ctrl-Break handler 
  45. is allowed to do, including DOS function calls, as long as the registers are
  46. unchanged if an IRET is used. If the program creates a new segment and loads a
  47. second program which itself changes the Ctrl-Break address, the termination of
  48. the second program and return to the first causes the Ctrl-Break address to
  49. be restored from the PSP to the value it had before execution of the second
  50. program.
  51.  
  52.  
  53. Interrupt 24h   Critical Error Handler 
  54. (0:0090h)
  55.  
  56.  When a critical error occurs within DOS, control is transferred to an error 
  57. handler with an int 24h. This may be the standard DOS error handler (ABORT, 
  58. RETRY, IGNORE) or a user-written routine.
  59.  On entry to the error handler, AH will have its bit 7=0 (high order bit) 
  60. if the error was a disk error (probably the most common error), bit 7=1 if
  61. not.
  62.  BP:SI contains the address of a Device Header Control Block from which 
  63. additional information can be retrieved (see below).
  64.  The register is set up for a retry operation and an error code is in the 
  65. lower half of the DI register with the upper half undefined. These are the 
  66. error codes:
  67.  
  68.  The user stack is in effect and contains the following from top to bottom:
  69.  
  70.         IP      DOS registers from issuing int 24h
  71.         CS      int 24h
  72.         flags
  73.         AX      user registers at time of signal
  74.         BX      int 21h request
  75.         CX
  76.         DX
  77.         SI
  78.         DI
  79.         BP
  80.         DS
  81.         ES
  82.         IP      from original int 21h
  83.         CS
  84.         flags
  85.  
  86.  To reroute the critical error handler to a user-writen critical error handler,
  87. the following should be done:
  88.  
  89. Before an int 24h occurs:
  90. 1) The user application initialization code should save the int 24h vector and 
  91.    replace the vector with one pointing to the user error routine.
  92.  
  93. When the int 24h occurs:
  94. 2) When the user error routine received control it should push the flag 
  95.    registers onto the stack and execute a far call to the original int 24h
  96.    vector saved in step 1.
  97. 3) DOS gives the appropriate prompt, and waits for user input (Abort, Retry,
  98.    Ignore, Fail). After the user input, DOS returns control to the user error 
  99.    routine instruction following the far call.
  100. 4) The user error routine can now do any tasks nescessary. To return to the 
  101.    original application at the point the error occurred, the error routine needs
  102.    to execute an IRET instruction. Otherwise, the user error routine should 
  103.    remove the IP, CS, and flag registers from the stack. Control can then be 
  104.    passed to the desired point.
  105.                             
  106.  Int 24h provides the following values in registers on entry to the interrupt 
  107. handler:
  108.  
  109. entry   AH      status byte (bits)
  110.                 7       0       disk I/O hard error
  111.                         1       other error - if block device, bad FAT
  112.                                 - if char device, code in DI
  113.                 6       unused
  114.                 5       0       if IGNORE is not allowed
  115.                         1       if IGNORE is allowed
  116.                 4       0       if RETRY  is not allowed
  117.                         1       if RETRY  is allowed
  118.                 3       0       if FAIL   is not allowed
  119.                         1       if FAIL   is allowed
  120.                 2 \     disk area of error  00 = DOS area  01 = FAT
  121.                 1 /                         10 = root dir  11 = data area
  122.                 0       0       if read operation
  123.                         1       if write operation
  124.         AL      drive number if AH bit 7 = 1, otherwise undefined
  125.                 If it is as hard error on disk (AH bit 7=0), register AL 
  126.                 contains the failing drive number (0=A:, 1=B:, etc.).
  127.         BP:SI   address of a Device Header Control Block for which error
  128.                 occurred block device if high bit of BP:SI+4 = 1
  129.  low byte of DI: error code (note: high byte is undefined)
  130.                error code      description
  131.                 00h             attempt to write on write-protected diskette
  132.                 01h             unknown unit
  133.                 02h             drive not ready
  134.                 03h             unknown command
  135.                 04h             data error (bad CRC)
  136.                 05h             bad request structure length
  137.                 06h             seek error
  138.                 07h             unknown media type
  139.                 08h             sector not found
  140.                 09h             printer out of paper
  141.                 0Ah             write fault
  142.                 0Bh             read fault
  143.                 0Ch             general failure
  144.                 0Fh             invalid disk change (DOS 3.x+)
  145.                 10h     (DOS 3.x) FCB unavailable
  146.                 11h     (DOS 3.x) sharing buffer overflow
  147.  
  148. The handler must return this information:
  149.  
  150.  The registers are set such that if an IRET is executed, DOS responds according
  151. to (AL) as follows:
  152.  AL     00h  ignore the error
  153.         01h  retry the operation
  154.         02h  terminate via int 22h
  155.         03h  fail the system call that is in progress (DOS 3.x+)
  156. note 1) Be careful when choosing to ignore a response because this causes DOS to
  157.         beleive that an operation has completed successfully when it may not 
  158.         have.
  159.      2) If the error was a character device, the contents of AL are invalid.
  160.  
  161.  
  162.  
  163. OTHER ERRORS
  164.  
  165.  If AH bit 7=1, the error occurred on a character device, or was the result of 
  166. a bad memory image of the FAT. The device header passed in BP:SI can be examined
  167. to determine which case exists. If the attribute byte high-order bit indicates
  168. a block device, then the error was a bad FAT. Otherwise, the error is on a 
  169. character device.
  170.  If a character device is involved, the contents of AL are unpredictable, the
  171. error code is in DI as above.
  172.  
  173. Notes:
  174. 1.  Before giving this routine control for disk errors, DOS performs several
  175.     retries. The number of retries varies according to the DOS version.
  176. 2.  For disk errors, this exit is taken only for errors occurring during an 
  177.     int 21h function call. It is not used for errors during an int 25h or 26h.
  178. 3.  This routine is entered in a disabled state.
  179. 4.  All registers must be preserved.
  180. 5.  This interrupt handler should refrain from using DOS function calls. If
  181.     necessary, it may use calls 01h through 12h. Use of any other call destroys 
  182.     the DOS stack and leaves DOS in an unpredictable state.
  183. 6.  The interrupt handler must not change the contents of the device header.
  184. 7.  If the interrupt handler handles errors itself rather than returning to DOS,
  185.     it should restore the application program's registers from the stack, 
  186.     remove all but the last three words on the stack, then issue an IRET. This 
  187.     will return to the program immediately after the int 21h that experienced 
  188.     the error. Note that if this is done DOS will be in an unstable state until
  189.     a function call higher than 12h is issued, therefore not recommended.
  190. 8.  For DOS 3.x, IGNORE requests (AL=0) are converted to FAIL for critical 
  191.     errors that occur on FAT or DIR sectors.
  192. 9.  For DOS 3.10 up, IGNORE requests (AL=0) are converted to FAIL requests
  193.     for network critical errors (50-79).
  194.  
  195. The device header pointed to by BP:SI is as follows:
  196.  
  197. DWORD Pointer to next device (0FFFFh if last device)
  198.  
  199. WORD Attributes:
  200.  
  201. Bit     15      1       if character device.
  202.                         If bit 15 is 1:
  203.                         Bit 0 = 1 if current standard input
  204.                         Bit 1 = 1 if current standard output
  205.                         Bit 2 = 1 if current NULL device
  206.                         Bit 3 = 1 if current CLOCK device
  207.                 0       if block device
  208. Bit 14 is the IOCTL bit
  209. WORD pointer to device driver strategy entry point
  210. WORD pointer to device driver interrupt entry point
  211. 8-BYTE character device named field for block devices. The first byte is the
  212. number of units.
  213.  To tell if the error occurred on a block or character device, look at bit 15
  214. in the attribute field (WORD at BP:SI+4).
  215.  If the name of the character device is desired, look at the eight bytes 
  216. starting at BP:SI+10.
  217.  
  218.  
  219. HANDLING OF INVALID RESPONSES (DOS 3.x)
  220.  
  221.         A) If IGNORE (AL=0) is specified by the user and IGNORE is not allowed
  222.            (bit 5=0), make the response FAIL (AL=3).
  223.         B) If RETRY (AL=1) is specified by the user and RETRY is not allowed
  224.            (bit 4=0), make the response FAIL (AL=3).
  225.         C) If FAIL (AL=3) is specified by the user and FAIL is not allowed (bit
  226.            3=0), make the response ABORT. (AL=2)
  227.  
  228.  
  229.  
  230.  
  231.  
  232. Interrupt 25h   Absolute Disk Read
  233. Interrupt 26h   Absolute Disk Write
  234. (0:0094h, 0:0098h)
  235.   These transfer control directly to the device driver. On return, the original
  236. flags are still on the stack (put there by the INT instruction). This is 
  237. necessary because return information is passed back in the current flags.
  238.   The number of sectors specified is transferred between the given drive and the
  239. transfer address. Logical sector numbers are obtained by numbering each sector
  240. sequentially starting from track 0, head 0, sector 1 (logical sector 0) and 
  241. continuing along the same head, then to the next head until the last sector on 
  242. the last head of the track is counted.  Thus, logical sector 1 is track 0, head
  243. 0, sector 2; logical sector 2 is track 0, head 0, sector 3; and so on. Numbering
  244. then continues wih sector 1 on head 0 of the next track. Note that although the 
  245. sectors are sequentially numbered (for example, sectors 2 and 3 on track 0 in 
  246. the example above), they may not be physically adjacent on disk, due to 
  247. interleaving. Note that the mapping is different from that used by DOS 1.10 for
  248. dual-sided diskettes.
  249.  
  250. The request is as follows:
  251.  
  252. int 25 for Absolute Disk Read,
  253. int 26 for Absolute Disk Write
  254. entry   AL      drive number (0=A:, 1=B:, etc)
  255.         CX      number of sectors to read
  256.         DS:BX   disk transfer address (buffer)
  257.         DX      first relative sector to read - beginning logical sector number
  258. return  CF      set if error
  259.         AL      error code issued to int 24h in low half of DI
  260.         AH      01h     bad command
  261.                 02h     bad address mark
  262.                 03h     write-protected disk
  263.                 04h     requested sector not found
  264.                 08h     DMA failure
  265.                 10h     data error (bad CRC)
  266.                 20h     controller failed
  267.                 40h     seek operation failed
  268.                 80h     attachment failed to respond
  269. note 1) Original flags on stack! Be sure to pop the stack to prevent 
  270.         uncontrolled growth
  271.      2) Ints 25 and 26 will try rereading a disk if they get an error the first
  272.         time.
  273.      3) All registers except the segment registers are destroyed by these calls
  274.  
  275.  
  276. Interrupt 25h   ABSOLUTE DISK READ
  277.                 (except DOS 4.0/Compaq DOS 3.31 >32M partition)
  278. entry   AL      drive number (0=A, 1=B, etc)
  279.         DS:BX   pointer to Disk Transfer Address (buffer)
  280.         CX      number of sectors to read
  281.         DX      first relative sector to read
  282. return  CF      1 if error
  283.                 AL      error code issued to int 24h in low half of DI
  284.                 AH      80h     attachment failed to respond
  285.                         40h     seek operation failed
  286.                         20h     controller failed
  287.                         10h     data error (bad CRC)
  288.                         08h     DMA failure
  289.                         04h     requested sector not found
  290.                         03h     write-protected disk
  291.                         02h     bad address mark
  292.                         01h     bad command
  293. note    Original flags on stack!
  294.  
  295. Interrupt 25h   DOS 4.0/Compaq DOS 3.31 - ABSOLUTE DISK READ
  296.                 (>32M hard-disk partition)
  297. entry   AL      drive number (0=A, 1=B, etc)
  298.         CX      0FFFFh
  299.         DS:BX   Packet address
  300.                 DWORD  sector number
  301.                 WORD   number of sectors to read
  302.                 DWORD  transfer address
  303. return  same as above?
  304. note    Partition is potentially >32Mb (and requires this form of the call) if
  305.         bit 1 of device attribute word in device driver is set
  306.  
  307. Interrupt 26h   ABSOLUTE DISK WRITE
  308.                 (except DOS 4.0/Compaq DOS 3.31 >32M partition)
  309. entry   AL      drive number (0=A, 1=B, etc)
  310.         DS:BX   pointer to Disk Transfer Address (buffer)
  311.         CX      number of sectors to write
  312.         DX      first relative sector to write
  313. return  CF      1 if error
  314.                 AL      error code issued to int 24h in low half of DI
  315.                 AH      same error codes as for int 25h
  316. note    Original flags on stack!
  317.  
  318. Interrupt 26h   DOS 4.0/Compaq DOS 3.31 - ABSOLUTE DISK WRITE
  319.                 (>32M hard disk partitions)
  320. entry   AL      drive number (0=A, 1=B, etc)
  321.         CX      0FFFFh
  322.         DS:BX   Packet address
  323.                 DWORD  sector number
  324.                 WORD   number of sectors to write
  325.                 DWORD  transfer address
  326. return  same as above?
  327. note    Partition is potentially >32M (and requires this form of the call) if
  328.         bit 1 of device attribute word in device driver is set
  329.  
  330.  
  331.  
  332.  
  333. Interrupt 27h   Terminate And Stay Resident
  334. (0:009Ch)       (obsolete)
  335.  This vector is used by programs that are to remain resident when COMMAND.COM
  336. regains control.
  337.  After initializing itself, the program must set DX to its last address plus
  338. one relative to the program's initial DS or ES value (the offset at which other
  339. programs can be loaded), then execute interrupt 27h. DOS then considers the
  340. program as an extension of itself, so the program is not overlaid when other
  341. programs are executed. This is useful for loading programs such as utilities
  342. and interrupt handlers that must remain resident.
  343.  
  344. entry   CS      current program segment
  345.         DX      last program byte + 1
  346. return  none
  347. note 1) This interrupt must not be used by .EXE programs that are loaded into
  348.         the high end of memory.
  349.      2) This interrupt restores the interrupt 22h, 23h, and 24h vectors in the
  350.         same manner as interrupt 20h.  Therefore, it cannot be used to install
  351.         permanently resident Ctrl-Break or critical error handler routines.
  352.      3) The maximum size of memory that can be made resident by this method is 
  353.         64K.
  354.      4) Memory can be more efficiently used if the block containing a copy of 
  355.         the environment is deallocated before terminating. This can be done by 
  356.         loading ES with the segment contained in 2Ch of the PSP, and issuing 
  357.         function call 49h (Free Allocated Memory).
  358.      5) DOS function call 4Ch allows a program to pass a completion code to DOS,
  359.         which can be interpreted with processing (see function call 31h).
  360.      6) Terminate and stay resident programs do not close files.
  361.      7) Int 21, function 31h is the preferred method to cause a program to
  362.         remain resident because this allows return information to be passed and
  363.         allows a program larger than 64K to remain resident.
  364.  
  365.  
  366.  
  367.  
  368. Interrupt 28h   (not documented by Microsoft)
  369.            *    DOS Idle Interrupt
  370. Int 28h has been provided by DOS since release 2.0. The int 28h process is
  371. similar to the "Timer Tick" process provided by BIOS via int 1Ch in that it is
  372. an "outbound" (from DOS) call which an application can "hook onto" to get
  373. service at a particular entry point. DOS normally only issues int 28h when it
  374. recieves a function call (int 21h) from a foreground application with an
  375. argument in the range of 0 thru 12 (0Ch) in the AH register, or when it is
  376. idling waiting for keyboard input. In effect, when DOS issues int 28h, it is
  377. saying to the background task "I'm not doing anything hot right now, if you can
  378. use the time, go ahead." This means that a foreground application which doesn't
  379. do many low-number DOS functions can preempt CPU time easily.
  380.  
  381.  It is possible, if you are careful, to enhance the background priority by
  382. providing more int 28h calls than DOS normally would issue.
  383.  
  384.  When int 28h is being issued it is usually safe to do DOS calls. You won't get
  385. int 28hs if a program is running that doesn't do its keyboard input through
  386. DOS. You should rely on the timer interrupt for these.
  387.  
  388.  It is used primarily by the PRINT.COM routines, but any number of other 
  389. routines can be chained to it by saving the original vector and calling it with
  390. a FAR call (or just JMPing to it) at the end of the new routine.
  391.  
  392.  Int 28h is not called at all when any non-trivial foreground task is running. 
  393. As soon as a foreground program has a file open, int 28h no longer gets called.
  394. Could make a good driver for for a background program that works as long as
  395. there is nothing else going on in the machine.
  396.  
  397.  DOS uses 3 separate internal stacks: one for calls 01h through 0Ch; another
  398. for calls 0Dh and above; and a third for calls 01h through 0Ch when a Critical
  399. Error is in progress. When int 28h is called, any calls above 0Ch can be
  400. executed without destroying the internal stack used by DOS at the time. 
  401.  
  402.  The byte which is pushed on the stack before an int 28h just indicates which
  403. stack area is being used by the current int 21h call. In DOS 3.1, the code
  404. sequence that calls int 28h looks like this:
  405.  
  406.         PUSH    SS:[0304]
  407.         INT     28
  408.         POP     SS:[0304]
  409.  
  410.  The low-order byte of the word pushed contains 1 if the int 21h call currently
  411. in progress is for services 1 through 0Ch, and 0 for service 0 and for 0Dh and
  412. up. Assuming that the last DOS call was not a reentrant one, this tells you
  413. which set of DOS services should be safe to call. 
  414.  
  415.  If the InDOS flag is zero on int 28h, then it was called by someone other than
  416. DOS, and the word on the stack should NOT be examined. 
  417.  
  418.  
  419. entry   no parameters availible
  420. return  none
  421. note 1) The int 28h handler may invoke any int 21h function except functions
  422.         00h through 0Ch (and 50h/51h under DOS 2.x unless DOS CritErr flag is 
  423.         set).
  424.      2) Apparently int 28h is also called during screen writes
  425.      3) Until some program installs its own routine, this interrupt vector
  426.         simply points to an IRET opcode.
  427.      4) Supported in OS/2 1.0's DOS Compatibility Box
  428.  
  429.  
  430.  
  431.  
  432. Interrupt 29h   (not documented by Microsoft)
  433.            *    Internal - Quick Screen Output
  434.  
  435.  This method is extremely fast (much faster than DOS 21h subfunctions 2 and 9, 
  436. for example), and it is portable, even to "non-compatible" MS-DOS computers.
  437.  
  438. entry   AL      character to output to screen
  439. return  unknown
  440. note 1) Documented by Digital Research's DOS Reference as provided with the
  441.         DEC Rainbow
  442.      2) If ANSI.SYS is installed, character output is filtered through it.
  443.      3) Works on the IBM PC and compatibles, Wang PC, HP-150 and Vectra, DEC 
  444.         Rainbow, NEC APC, Texas Instruments PC and others
  445.      4) This interrupt is called from the DOS's output routines if output is 
  446.         going to a device rather than a file, and the device driver's attribute
  447.         word has bit 3 (04h) set to "1".
  448.      5) This call has been tested with MSDOS 2.11, PCDOS 2.1, PCDOS 3.1, PCDOS
  449.         3.2, and PCDOS 3.3.
  450.      6) Used in IBMBIO.COM as a vector to int 10, function 0Eh (write TTY)
  451.         followed by an IRET.
  452.  
  453.  
  454.  
  455.  
  456. Interrupt 2Ah   Microsoft Networks - Session Layer Interrupt
  457.            *    (not documented by Microsoft)
  458.  
  459. entry   AH      00h     check to see if network BIOS installed
  460.                         return  AH      <> 0 if installed
  461.                 01h     execute NETBIOS request
  462.                 02h     set net printer mode
  463.                 03h     get shared-device status (check direct I/O)
  464.                         AL      00h
  465.                         DS:SI   pointer to ASCIIZ disk device name
  466.                         return  CF      0 if allowed
  467.                 04h     execute NETBIOS 
  468.                         AL      0 for error retry
  469.                                 1 for no retry
  470.                         ES:BX   pointer to network control block
  471.                         return  AX      0 for no error
  472.                                 AH      1 if error
  473.                                 AL      error code
  474.                 05h     get network resource information
  475.                         AL      00h
  476.                         return  AX      reserved
  477.                                 BX      number of network names
  478.                                 CX      number of commands
  479.                                 DX      number of sessions
  480.                 06h     Network Print-stream Control
  481.                         note    NETBIOS 1.10
  482.                 20h     unknown
  483.                         note    AL=01h intercepted by DESQview 2.0
  484.                 80h     Begin DOS Critical Section
  485.                         AL      1 to 6
  486.                 81h     End DOS Critical Section
  487.                         AL      1 to 6
  488.                 82h     Server Hook
  489.                         return  unknown
  490.                         note    called by the int 21h function dispatcher
  491.                                 in DOS 3.10+ for function 0 and functions
  492.                                 greater than 0Ch except 59h
  493.                 84h     keyboard busy loop
  494.                         note    similar to DOS's int 28h
  495.  
  496.  
  497. Interrupt 2Bh   (not documented by Microsoft)
  498.            *    Unknown - Internal Routine for DOS (IRET)
  499.               
  500.  
  501. Interrupt 2Ch   (not documented by Microsoft)
  502.            *    Unknown - Internal Routine for DOS (IRET)
  503.               
  504.  
  505. Interrupt 2Dh   (not documented by Microsoft)
  506.            *    Unknown - Internal Routine for DOS (IRET)
  507.               
  508.  
  509. Interrupt 2Eh   (undocumented by Microsoft)  (DOS 2.0+)
  510.            *    Internal Routine for DOS  (Alternate EXEC)
  511.  
  512.   This interrupt passes a command line addressed by DS:SI to COMMAND.COM. The 
  513. command line must be formatted just like the unformatted parameter area of a 
  514. Program Segment Prefix. That is, the first byte must be a count of characters, 
  515. and the second and subsequent bytes must be a command line with parameters, 
  516. terminated by a carriage return character. 
  517.   When executed, int 2Eh will reload the transient part of the command 
  518. interpreter if it is not currently in memory. If called from a program that 
  519. was called from a batch file, it will abort the batch file. If executed from a 
  520. program which has been spawned by the EXEC function, it will abort the whole 
  521. chain and probably lock up the computer. Int 2Eh also destroys all registers 
  522. including the stack pointer.
  523.   Int 2Eh is called from the transient portion of the program to reset the DOS
  524. PSP pointers using the above Functions #81 & #80, and then reenters the 
  525. resident program. 
  526.   When called with a valid command line, the command will be carried out by 
  527. COMMAND.COM just as though you had typed it in at the DOS prompt. Note that the
  528. count does not include the carriage return. This is an elegant way to perform a
  529. SET from an application program against the master environment block for 
  530. example.
  531.  
  532. entry   DS:SI   pointer to an ASCIIZ command line in the form:
  533.                         count byte
  534.                         ASCII string
  535.                         carriage return
  536.                         null byte
  537. note 1) Destroys all registers including stack pointer
  538.      2) Seems to work OK in both DOS 2.x and 3.x
  539.      3) It is reportedly not used by DOS.
  540.      4) As far as known, int 2Eh is not used by DOS 3.1, although it was called
  541.         by COMMAND.COM of PCDOS 3.0, so it appears to be in 3.1 only for the 
  542.         sake of compatibility.
  543.  
  544. Interrupt 2Fh   Multiplex Interrupt
  545.  
  546.  Interrupt 2Fh is the multiplex interrupt. A general interface is defined 
  547. between two processes. It is up to the specific application using interrupt 
  548. 2Fh to define specific functions and parameters.
  549.  This interrupt is becoming more commonly used as the availible interrupt 21 
  550. functions are getting to be in short supply.  Int 2Fh doesn't require any
  551. support from DOS itself for it to be used in application programs. It's not
  552. handled by DOS, but by the programs themselves.
  553.  Every multiplex interrupt handler is assigned a specific multiplex number. 
  554. The multiplex number is specified in the AH register; the AH value tells which
  555. program your request is directed toward. The specific function that the handler
  556. is to perform is placed in the AL register. Other parameters are places in the 
  557. other registers as needed. The handlers are chained into the 2Fh interrupt 
  558. vector and the multiplex number is checked to see if any other application is 
  559. using the same multiplex number. There is no predefined method for assigning a 
  560. multiplex number to a handler. You must just pick one. To avoid a conflict if 
  561. two applications choose the same multiplex number, the multiplex numbers used by
  562. an application should be patchable. In order to check for a previous 
  563. installation of the current application, you can search memory for a unique 
  564. string included in your program. If the value you wanted in AH is taken but 
  565. you don't find the string, then another application has grabbed that location.
  566.  Int 2Fh was not documented under DOS 2.x. There is no reason not to use int 2Fh
  567. as the multiplex interrupt in DOS 2.x. The only problem is that DOS 2.x does not
  568. initialize the int 2Fh vector, so when you try to chain to it like you are 
  569. supposed to, it will crash. If your program checks the vector for being zero
  570. and initializes it itself or doesn't chain in that case, it will work for you 
  571. n 2.x just the same as 3.x. 
  572.  
  573. Function   01h  PRINT.COM
  574.            Register AH identifies which program is to handle the interrupt.
  575.            Values 00h-7Fh are reserved for DOS, not that anyone cares much.
  576.            Values 0C0h-0FFh are reserved for applications.
  577.            Register AL contains the function code if used
  578. entry   AH      01h
  579.                 AL      00h     PRINT  Get Installed State
  580.                         This call must be defined by all int 2Fh handlers. It 
  581.                         is used by the caller of the handler to determine if 
  582.                         the handler is present. On entry, AL=0. On return, AL 
  583.                         contains the installed state as follows:
  584.                 return  AL      0FFh    installed
  585.                                 01h     not installed, not OK to install
  586.                                 00h     not installed, OK to install
  587.  
  588.                         01h     PRINT  Submit File
  589.                         DS:DX   pointer to submit packet 
  590.                                 format  byte    level
  591.                                         dword   pointer to ASCIIZ filename
  592.                 return  CF      set if error
  593.                                 AX      error code
  594.                 note 1) A submit packet contains the level (BYTE) and a pointer
  595.                         to the ASCIIZ string (DWORD in offset:segment form).
  596.                         The ASCIIZ string must contain the drive, path, and
  597.                         filename of the file you want to print. The filename
  598.                         cannot contain global filename characters.
  599.                 return  CF      set if error
  600.                                 AX      error code
  601.  
  602.                         02h     PRINT Cancel File
  603.                         On entry, AL=2 and DS:DX points to the ASCIIZ string for
  604.                         the print file you want to cancel. Global filename 
  605.                         characters are allowed in the filename.
  606.                 DS:DX   pointer to ASCIIZ file name to cancel (wildcards OK)
  607.                 return  CF      set if error
  608.                                 AX      error code
  609.  
  610.                         03h     PRINT remove all files
  611.                 return  CF      set if error
  612.                                 AX      error code
  613.  
  614.                         04h     PRINT hold queue/get status
  615.                         This call holds the jobs in the print queue so that you
  616.                         can scan the queue. Issuing any other code releases the
  617.                         jobs. On entry, AL=4. On return, DX contains the error
  618.                         count. DS:SI points to the print queue. The print queue 
  619.                         consists of a series of filename entries. Each entry is
  620.                         64 bytes long. The first entry in the queue is the file
  621.                         currently being printed. The end of the queue is marked
  622.                         by the entry having a null as the first character.
  623.                return   DX      error count
  624.                         DS:SI   pointer to print queue (null-string terminated
  625.                                 list of 64-byte ASCIIZ filenames)
  626.                         CF      set if error
  627.                                AX       error code
  628.                                         01h     function invalid
  629.                                         02h     file not found
  630.                                         03h     path not found
  631.                                         04h     too many open files
  632.                                         05h     access denied
  633.                                         08h     queue full
  634.                                         09h     spooler busy
  635.                                         0Ch     name too long
  636.                                         0Fh     drive invalid
  637.  
  638.                         05h     PRINT restart queue
  639.                 return  CF      set if error
  640.                                 AX      error code
  641.  
  642.  
  643. Function   05h  DOS 3.x critical error handler
  644. entry   AH      05h
  645.                 AL      00h     installation check
  646.                         return  AL      00h not installed, OK to install
  647.                                         01h not installed, can't install
  648.                                         0FFh installed
  649.                         note    This set of functions allows a user program to
  650.                                 partially or completely override the default
  651.                                 critical error handler in COMMAND.COM
  652.                 AL      01h     handle error - nonzero error code in AL
  653.                         return  CF      clear
  654.                                         ES:DI   pointer to ASCIIZ error message
  655.                                 CF      set     use default error handler
  656.                                 AL      (?)
  657.  
  658.  
  659. Function   06h  ASSIGN 
  660. entry   AH      06h
  661.                         00h     installation check
  662.                         return  AH <> 0 if installed
  663.  
  664.                         01h     get memory segment
  665.                         return  ES      segment of ASSIGN work area
  666.  
  667.  
  668. Function   10h  SHARE
  669. entry   AH      10h
  670.         AL      00h     installation check
  671. return  AL      00h     not installed, OK to install
  672.                 01h     not installed, not OK to install
  673.                 0FFh    installed
  674.  
  675.  
  676. Function   11h  Multiplex - network redirection
  677. entry   AH      11h
  678.         AL      00h     installation check
  679.                         return  AL      00h    not installed, OK to install
  680.                                         01h    not installed, not OK to install
  681.                                         0FFh   installed
  682.                 01h-05h unknown
  683.                 06h     close remote file
  684.                 07h-09h unknown
  685.                 0Ah     unknown
  686.                         stack   word    (?)
  687.                         return  CF      set on error
  688.                 0Bh     unknown
  689.                         stack   word    (?)
  690.                         return  CF      set on error(?)
  691.                 0Ch     unknown
  692.                 0Dh     unknown
  693.                 0Eh     unknown
  694.                         stack   word    (?)
  695.                         return  (?)
  696.                 0Fh-16h unknown
  697.                 17h     unknown
  698.                         stack   word    (?)
  699.                         return  (?)
  700.                 18h     unknown
  701.                         stack   word    (?)
  702.                         return  (?)
  703.                 19h-1Dh unknown
  704.                 1Eh     do redirection
  705.                         stack   word    function to execute
  706.                         return  CF      set on error
  707.                 1Fh     printer setup
  708.                         stack   word    function(?)
  709.                         return  CF      set on error(?)
  710.                 20h-25h unknown
  711.                         stack   word    (?)
  712.                 26h     unknown
  713.  
  714. Function   12h  multiplex, DOS 3.x internal services
  715. entry   AH      12h
  716.         AL      00h     installation check
  717.                         return  AL      0FFh    for compatibility with other
  718.                                                 int 2Fh functions
  719.                 01h     close file (?)
  720.                         stack   word value - unknown
  721.                         return  BX      unknown
  722.                                 CX      unknown
  723.                                 ES:DI   pointer to unknown value
  724.                         note    Can be called only from within DOS
  725.                 02h     get interrupt address
  726.                         stack   word    vector number
  727.                         return  ES:BX pointer to interrupt vector
  728.                                 stack   unchanged
  729.                 03h     get DOS data segment
  730.                         return  DS      segment of IBMDOS.COM file
  731.                 04h     normalize path separator
  732.                         stack   word    character to normalize
  733.                         return  AL      normalized character (forward slash
  734.                                         turned to backslash)
  735.                                 stack   unchanged
  736.                 05h     output character
  737.                         stack   word    character to output
  738.                         return  stack   unchanged
  739.                         note    Can be called only from within DOS
  740.                 06h     invoke critical error
  741.                         return  AL      0-3 for Abort, Retry, Ignore, Fail
  742.                         note    Can be called only from within DOS
  743.                 07h     move disk buffer (?)
  744.                         DS:DI   pointer to disk buffer
  745.                         return  buffer moved to end of buffer list
  746.                         note    Can be called only from within DOS
  747.                 08h     decrement word
  748.                         ES:DI   pointer to word to decrement
  749.                         return  AX      new value of word
  750.                         note    Word pointed to by ES:DI decremented,
  751.                                 skipping zero
  752.                 09h     unknown
  753.                         DS:DI   pointer to disk buffer(?)
  754.                         return  (?)
  755.                         note    Can be called only from within DOS
  756.                 0Ah     unknown
  757.                         note    Can be called only from within DOS
  758.                 0Bh     unknown
  759.                         ES:DI   pointer to system file table entry(?)
  760.                         return  AX      (?)
  761.                         note    Can be called only from within DOS
  762.                 0Ch     unknown
  763.                         note    Can be called only from within DOS
  764.                 0Dh     get date and time
  765.                         return  AX      current date in packed format
  766.                                 DX      current time in packed format
  767.                         note    Can be called only from within DOS
  768.                 0Eh     do something to all disk buffers (?)
  769.                         return  DS:DI   pointer to first disk buffer
  770.                         note    can be called only from within DOS
  771.                 0Fh     unknown
  772.                         DS:DI   pointer to (?)
  773.                         return  DS:DI pointer to (?)
  774.                         note 1) Can be called only from within DOS
  775.                              2) Calls on function 1207h
  776.                 10h     find dirty/clean(?) buffer
  777.                         DS:DI   pointer to first disk buffer
  778.                         return  DS:DI   pointer to first disk buffer which has
  779.                                         (?) flag clear
  780.                                 ZF      clear   if found
  781.                                         set     if not found
  782.                 11h     normalize ASCIIZ filename
  783.                         DS:SI   pointer to ASCIIZ filename to normalize
  784.                         ES:DI   pointer to buffer for normalized filename
  785.                         return  destination buffer filled with uppercase
  786.                                 filename, with slashes turned to backslashes
  787.                 12h     get length of ASCIIZ string
  788.                         ES:DI   pointer to ASCIIZ string
  789.                         return  CX      length of string
  790.                 13h     uppercase character
  791.                         stack   word    character to convert to uppercase
  792.                         return  AL      uppercase character
  793.                                 stack   unchanged
  794.                 14h     compare far pointers
  795.                         DS:SI   first pointer
  796.                         ES:DI   second pointer
  797.                         return  ZF      set if pointers are equal
  798.                                 ZF      clear if not equal
  799.                 15h     unknown
  800.                         DS:DI   pointer to disk buffer
  801.                         stack   word    (?)
  802.                         return  stack unchanged
  803.                         note    Can be called only from within DOS
  804.                 16h     get address of system FCB
  805.                         BX      system file table entry number
  806.                         return  ES:DI pointer to system file table entry
  807.                 17h     set default drive (?)
  808.                         stack   word    drive (0=A:, 1=B:, etc)
  809.                         return  DS:SI   pointer to drive data block for
  810.                                         specified drive
  811.                                 stack   unchanged
  812.                         note    Can be called only from within DOS
  813.                 18h     get something (?)
  814.                         return  DS:SI pointer to (?)
  815.                 19h     unknown
  816.                         stack   word    drive (0=default, 1=A:, etc)
  817.                         return  (?)
  818.                                 stack unchanged
  819.                         note 1) Can be called only from within DOS
  820.                              2) Calls function 1217h
  821.                 1Ah     get file's drive
  822.                         DS:SI   pointer to filename
  823.                         return  AL      drive
  824.                                         (0=default, 1=A:, etc, 0FFh=invalid)
  825.                 1Bh     set something (?)
  826.                         CL      unknown
  827.                         return  AL      (?)
  828.                         note    Can be called only from within DOS
  829.                 1Ch     checksum memory
  830.                         DS:SI   pointer to start of memory to checksum
  831.                         CX      number of bytes
  832.                         DX      initial checksum
  833.                         return  DX      checksum
  834.                         note    Can be called only from within DOS
  835.                 1Dh     unknown
  836.                         DS:SI   pointer to (?)
  837.                         CX      (?)
  838.                         DX      (?)
  839.                         return  AX      (?)
  840.                                 CX      (?)
  841.                                 DX      (?)
  842.                 1Eh     compare filenames
  843.                         DS:SI   pointer to first ASCIIZ filename
  844.                         ES:DI   pointer to second ASCIIZ filename
  845.                         return  ZF      set     if filenames equivalent
  846.                                         clear   if not
  847.                 1Fh     build drive info block
  848.                         stack   word    drive letter
  849.                         return  ES:DI pointer to drive info block
  850.                                       (will be overwritten by next call)
  851.                                 stack unchanged
  852.                         note    Can be called only from within DOS
  853.                 20h     get system file table number
  854.                         BX      file handle
  855.                         return  CF      set on error, error code in AL
  856.                                         AL      06h (invalid file handle)
  857.                                 CF      clear if successful
  858.                                         byte ES:[DI] = system file table entry 
  859.                                             number for file handle
  860.                 21h     unknown
  861.                         DS:SI   pointer to (?)
  862.                         return  (?)
  863.                         note    Can be called only from within DOS
  864.                 22h     unknown
  865.                         SS:SI   pointer to (?)
  866.                         return  nothing(?)
  867.                         note    Can be called only from within DOS
  868.                 23h     check if character device (?)
  869.                         return  DS:SI   pointer to device driver with
  870.                                         same name as (?)
  871.                         note    Can be called only from within DOS
  872.                 24h     delay
  873.                         return  after delay of (?) ms
  874.                         note    Can be called only from within DOS
  875.                 25h     get length of ASCIIZ string
  876.                         DS:SI   pointer to ASCIIZ string
  877.                         return  CX      length of string
  878.  
  879.  
  880. Function   43h  Microsoft Extended Memory Specification (XMS)
  881.  
  882.  
  883. Function 5453h TesSeRact Standard for Ram-Resident Program Communication
  884.  
  885.  
  886. Function   64h  SCRNSAV2.COM
  887. entry   AH      64h
  888.         AL      00h     installation check
  889. return  AL      00h     not installed
  890.                 0FFh    installed
  891. note    SCRNSAV2.COM is a screen saver for PS/2's with VGA by Alan Ballard
  892.  
  893.  
  894. Function  7Ah   Novell NetWare
  895. entry   AH      7Ah
  896.         AL      00h     installation check
  897. note 1) Returns address of entry point for IPX and SPX
  898.      2) Parameters are listed under int 21
  899.  
  900.  
  901. Function  087h  APPEND
  902. entry   AH      087h
  903.         AL      00h     APPEND installation check
  904.                 return  AH <> 0 if installed
  905.                 01h     APPEND - unknown
  906.                 02h     APPEND - version check
  907.  
  908. Function  088h  Microsoft Networks
  909. entry   AH      088h 
  910.         AL      00h     network program installation check
  911.                 return  AH <> 0 if installed
  912.                         BX      installed component flags (test in this order!)
  913.                                 bit 6   server
  914.                                 bit 2   messenger
  915.                                 bit 7   receiver
  916.                                 bit 3   redirector
  917.                 01h     unknown
  918.                 02h     unknown
  919.                 03h     get current POST address
  920.                         return  ES:BX   POST address
  921.                 04h     set new POST address
  922.                         ES:BX   new POST address
  923.                 09h     network version check
  924.  
  925.  
  926. Function  0AAh  VIDCLOCK.COM
  927. entry   AH      0AAh
  928.         AL      00h     installation check
  929. return  AL      00h     not installed
  930.                 0FFh    installed
  931. note    VIDCLOCK.COM is a memory-resident clock by Thomas G. Hanlin III
  932.  
  933.  
  934. Function  0BBh  Network Functions
  935. entry   AH      0BBh
  936.         AL      00h     net command installation check
  937.                 01h, 02h unknown
  938.                 03h     get server POST address
  939.                 04h     get server POST address
  940.  
  941.  
  942. Function  0F7h  AUTOPARK.COM  (PD TSR hard disk parking utility)
  943. entry   AH      0F7h
  944.         AL      00h     installation check
  945.                 return  AL      00h     not installed
  946.                                 0FFh    installed
  947.                 note    AUTOPARK is a TSR HD parker by Alan D. Jones
  948.         01h     set parking delay
  949.                 BX:CX   32 bit count of 55ms timer ticks
  950.  
  951.  
  952.  
  953. MSDOS 2Fh functions 01h (PRINT), 02h (ASSIGN), 10h (SHARE):
  954. return  AX      Error
  955.                 Codes       Description
  956.                 01h     invalid function number
  957.                 02h     file not found
  958.                 03h     path not found
  959.                 04h     too many open files
  960.                 05h     access denied
  961.                 06h     invalid handle
  962.                 08h     queue full
  963.                 09h     busy
  964.                 0Ch     name too long
  965.                 0Fh     invalid drive was specified
  966.         CF      clear (0) if OK
  967.                 set (1) if error - error returned in AX
  968. note 1) The multiplex numbers AH=0h through AH=7Fh are reserved for DOS. 
  969.         Applications should use multiplex numbers 80h through 0FFh.
  970.      2) When in the chain for int 2Fh, if your code calls DOS or if you execute
  971.         with interrupts enabled, your code must be reentrant/recursive.
  972.      3) Important! In versions of DOS prior to 3.0, the int 2Fh vector was
  973.         initialized to zero rather than being pointed into the DOS service area.
  974.         You must initialize this vector manually under DOS 2.x.
  975.  
  976.  
  977.  
  978. ┌─────────────────────────────────────────────────────────────────────────────┐
  979. │ Miscellaneous Interrupts - in numerical order                               │
  980. └─────────────────────────────────────────────────────────────────────────────┘
  981.  
  982. Interrupt 30h   (not a vector!) far jump instruction for CP/M-style calls
  983.  
  984.  
  985. Interrupt 31h   Unknown
  986. note    The CALL 5 entry point does a FAR jump to here
  987.  
  988.  
  989. Interrupt 32h   Unknown
  990.  
  991.  
  992. Interrupt 33h   Used by Microsoft Mouse Driver
  993.                 Function Calls
  994.  
  995. Function Requests
  996.  
  997.         00h     Reset Driver and Read Status
  998.         entry   AH      00h
  999.         return  AH      status
  1000.                         0  hardware/driver not installed
  1001.                        -1  hardware/driver installed
  1002.                 BX      number of buttons
  1003.                        -1       two buttons
  1004.                         0       other than two
  1005.                         3       Mouse Systems mouse
  1006.  
  1007.         01h     Show Mouse Cursor
  1008.         entry   AH      01h
  1009.         return  unknown
  1010.  
  1011.         02h     Hide Mouse Cursor
  1012.         entry   AH      02h
  1013.         return  unknown
  1014.         note    multiple calls to hide the cursor will require multiple calls
  1015.                 to function 01h to unhide it.
  1016.  
  1017.         03h     Return Position and Button Status
  1018.         entry   AH      03h
  1019.         return  BX      button status
  1020.                         bit 0   left button pressed if 1
  1021.                         bit 1   right button pressed if 1
  1022.                         bit 2   middle button pressed if 1 (Mouse Systems mouse)
  1023.                 CX      column
  1024.                 DX      row
  1025.  
  1026.         04h     Position Mouse Cursor
  1027.         entry   AH      04h
  1028.                 CX      column
  1029.                 DX      row
  1030.                 return  unknown
  1031.  
  1032.         05h     Return Button Press Data
  1033.         entry   AH      05h
  1034.                 BX      button
  1035.                         0 left
  1036.                         1 right
  1037.                         2 middle (Mouse Systems mouse)
  1038.         return  AH      button states
  1039.                         bit 0   left button pressed if 1
  1040.                         bit 1   right button pressed if 1
  1041.                         bit 2   middle button pressed if 1 (Mouse Systems mouse)
  1042.                 BX      no. of times specified button pressed since last call
  1043.                 CX      column at time specified button was last pressed
  1044.                 DX      row at time specified button was last pressed
  1045.  
  1046.         06h     Return Button Release Data
  1047.         entry   AH      06h
  1048.                 BX      button
  1049.                         0       left
  1050.                         1       right
  1051.                         2       middle (Mouse Systems mouse)
  1052.         return  AH      button states
  1053.                         bit 0   left button pressed if 1
  1054.                         bit 1   right button pressed if 1
  1055.                         bit 2   middle button pressed if 1 (Mouse Systems mouse)
  1056.                 BX      no. of times specified button released since last call
  1057.                 CX      column at time specified button was last released
  1058.                 DX      row at time specified button was last released
  1059.  
  1060.         07h     Define Horizontal Cursor Range
  1061.         entry   AH      0007h
  1062.                 CX      minimum column
  1063.                 DX      maximum column
  1064.         return  unknown
  1065.  
  1066.         08h     Define Vertical Cursor Range
  1067.         entry   AH      08h
  1068.                 CX      minimum row
  1069.                 DX      maximum row
  1070.                 return  unknown
  1071.  
  1072.         09h     Define Graphics Cursor
  1073.         entry   AH      09h
  1074.                 BX      column of cursor hot spot in bitmap (-16 to 16)
  1075.                 CX      row of cursor hot spot  (-16 to 16)
  1076.                 ES:DX   pointer to bitmap
  1077.                         16 words screen mask
  1078.                         16 words cursor mask
  1079.                 return  unknown
  1080.                 note    Each word defines the sixteen pixels of a row, low bit
  1081.                         rightmost
  1082.  
  1083.         0Ah     Define Text Cursor
  1084.         entry   AH      0Ah
  1085.                 BX      hardware/software text cursor
  1086.                         00h     software
  1087.                                 CX      screen mask
  1088.                                 DX      cursor mask
  1089.                         01h     hardware
  1090.                                 CX      start scan line
  1091.                                 DX      end scan line
  1092.         return  unknown
  1093.         note    When the software cursor is selected, the char/attribute data
  1094.                 at the current screen position is ANDed with the screen mask
  1095.                 and the with the cursor mask
  1096.  
  1097.         0Bh     Read Motion Counters
  1098.         entry   AH      0Bh
  1099.         return  CX      number of mickeys mouse moved horiz. since last call
  1100.                 DX      number of mickeys mouse moved vertically
  1101.         note 1) A mickey is the smallest increment the mouse can sense.
  1102.                 Positive values indicate up/right
  1103.  
  1104.         0Ch     Define Interrupt Subroutine Parameters
  1105.         entry   AH      0Ch
  1106.                 CX      call mask bit
  1107.                         bit 0   call if mouse moves
  1108.                         bit 1   call if left button pressed
  1109.                         bit 2   call if left button released
  1110.                         bit 3   call if right button pressed
  1111.                         bit 4   call if right button released
  1112.                         bit 5   call if middle button pressed (Mouse Systems)
  1113.                         bit 6   call if middle button released (Mouse Systems)
  1114.                 ES:DX  address of FAR routine
  1115.         return  unknown
  1116.         note    when the subroutine is called, it is passed these values:
  1117.                 AH      condition mask (same bit assignments as call mask)
  1118.                 BX      button state
  1119.                 CX      cursor column
  1120.                 DX      cursor row
  1121.                 DI      horizontal mickey count
  1122.                 SI      vertical mickey count
  1123.  
  1124.         0Dh     Light Pen Emulation On
  1125.         entry   AH      0Dh
  1126.         return  unknown
  1127.  
  1128.         0Eh     Light Pen Emulation Off
  1129.         entry   AH      0Eh
  1130.         return  unknown
  1131.  
  1132.         0Fh     Define Mickey/Pixel Ratio
  1133.         entry   AH      0Fh
  1134.                 CX      number of mickeys per 8 pixels horizontally
  1135.                 DX      number of mickeys per 8 pixels vertically
  1136.         return  unknown
  1137.  
  1138.         10h     Define Screen Region for Updating
  1139.         entry   AH      10h
  1140.                 CX,DX   X,Y coordinates of upper left corner
  1141.                 SI,DI   X,Y coordinates of lower right corner
  1142.         return  unknown
  1143.         note    Mouse cursor is hidden during updating, and needs to be
  1144.                 explicitly turned on again
  1145.  
  1146.         11h     not documented by Microsoft
  1147.  
  1148.         12h     Set Large Graphics Cursor Block
  1149.                 AH      12h
  1150.                 BH      cursor width in words
  1151.                 CH      rows in cursor
  1152.                 BL      horizontal hot spot (-16 to 16)
  1153.                 CL      vertical hot spot (-16 to 16)
  1154.                 ES:DX   pointer to bit map of screen and cursor maps
  1155.         return  AH     -1 if successful
  1156.         note    PC Mouse. Not documented by Microsoft
  1157.  
  1158.         13h     Define Double-Speed Threshold
  1159.         entry   AH      13h
  1160.                 DX      threshold speed in mickeys/second,
  1161.                         0 = default of 64/second
  1162.         return  unknown
  1163.         note    If speed exceeds threshold, the cursor's on-screen motion
  1164.                 is doubled
  1165.  
  1166.         14h     Exchange Interrupt Subroutines
  1167.         entry   AH      14h
  1168.         return  unknown
  1169.  
  1170.         15h     Return Drive Storage Requirements
  1171.         entry   AH      15h
  1172.         return  BX      size of buffer needed to store driver state
  1173.  
  1174.         16h     Save Driver State
  1175.         entry   AH      16h
  1176.                 ES:DX   pointer to buffer
  1177.         return  unknown
  1178.  
  1179.         17h     Restore Driver State
  1180.         entry   AH      17h
  1181.                 ES:DX   pointer to buffer containing saved state
  1182.         return  unknown
  1183.  
  1184.         18h-1Ch not documented by Microsoft; unknown
  1185.  
  1186.         1Dh     Define Display Page Number
  1187.         entry   AH      1Dh
  1188.  
  1189.         1Eh     Return Display Page Number
  1190.         entry   AH      1Eh
  1191.         return  unknown
  1192.  
  1193.         42h     PCMouse - Get MSmouse Storage Requirements
  1194.                 AH      42h
  1195.                 return  AX      0FFFFh successful
  1196.                 BX      buffer size in bytes for functions 50h and 52h
  1197.                         00h     MSmouse not installed
  1198.                         42h     functions 42h, 50h, and 52h not supported
  1199.  
  1200.         52h     PCMouse - Save MSmouse State
  1201.         entry   AH      50h
  1202.                 BX      buffer size
  1203.                 ES:DX   pointer to buffer
  1204.                 return  AX      0FFFFh if successful
  1205.  
  1206.         52h     PCMouse - restore MSmouse state
  1207.         entry   AH      52h
  1208.                 BX      buffer size
  1209.                 ES:DX   pointer to buffer
  1210.                 return  AX      0FFFFh if successful
  1211.  
  1212.  
  1213. Int 33: In addition, the following functions are appended to BIOS int 10h and 
  1214.         implemented as the EGA Register Interface Library:
  1215.  
  1216.         0F0h    read one register
  1217.         0F1h    write one register
  1218.         0F2h    read consecutive register range
  1219.         0F3h    write consecutive register range
  1220.         0F4h    read non-consecutive register set
  1221.         0F5h    write non-consecutive register set
  1222.         0F6h    revert to default register values
  1223.         0F7h    define default register values
  1224.         0FAh    get driver status
  1225.  
  1226.  
  1227.  
  1228. Interrupt 34h   Turbo C/Microsoft languages - Floating Point emulation
  1229.                 This interrupt emulates opcode 0D8h
  1230.  
  1231.  
  1232. Interrupt 35h   Turbo C/Microsoft languages - Floating Point emulation
  1233.                 This interrupt emulates opcode 0D9h
  1234.  
  1235.  
  1236. Interrupt 36h   Turbo C/Microsoft languages - Floating Point emulation
  1237.                 This interrupt emulates opcode 0DAh
  1238.  
  1239.  
  1240. Interrupt 37h   Turbo C/Microsoft languages - Floating Point emulation
  1241.                 This interrupt emulates opcode 0DBh
  1242.  
  1243.  
  1244. Interrupt 38h   Turbo C/Microsoft languages - Floating Point emulation
  1245.                 This interrupt emulates opcode 0DCh
  1246.  
  1247.  
  1248. Interrupt 39h   Turbo C/Microsoft languages - Floating Point emulation
  1249.                 This interrupt emulates opcode 0DDh
  1250.  
  1251.  
  1252. Interrupt 3Ah   Turbo C/Microsoft languages - Floating Point emulation
  1253.                 This interrupt emulates opcode 0DEh
  1254.  
  1255.  
  1256. Interrupt 3Bh   Turbo C/Microsoft languages - Floating Point emulation
  1257.                 This interrupt emulates opcode 0DFh
  1258.  
  1259.  
  1260. Interrupt 3Ch   Turbo C/Microsoft languages - Floating Point emulation
  1261.                 This int emulates instructions with an ES segment override
  1262.  
  1263.  
  1264. Interrupt 3Dh   Turbo C/Microsoft languages - Floating Point emulation
  1265.                 This interrupt emulates a standalone FWAIT instruction
  1266.  
  1267.  
  1268. Interrupt 3Eh   Turbo C/Microsoft languages - Floating Point emulation
  1269.  
  1270.  
  1271. Interrupt 3Fh   Overlay manager interrupt (Microsoft LINK.EXE)
  1272.                 Default overlay interrupt; may be changed with LINK switch
  1273.  
  1274.  
  1275. Interrupt 40h   Hard Disk BIOS
  1276.                 Pointer to disk BIOS entry when a hard disk controller is
  1277.                 installed. The BIOS routines use int 30h to revector the
  1278.                 diskette handler (original int 13h) here so int 40 may be used
  1279.                 for hard disk control
  1280.  
  1281.  
  1282. Interrupt 41h   Hard Disk Parameters  (XT,AT,XT2,XT286,PS except ESDI disks)
  1283.                 Pointer to first Hard Disk Parameter Block, normally located 
  1284.                 in the controller card's ROM. This table may be copied to RAM
  1285.                 and changed, and this pointer revectored to the new table.
  1286. note 1) format of parameter table is:
  1287.         dw      cylinders
  1288.         db      heads
  1289.         dw      starting reduced write current cylinder (XT only, 0 for others)
  1290.         db      maximum ECC burst length
  1291.         db      control byte
  1292.                   bits 0-2 drive option (XT only, 0 for others)
  1293.                   bit 3    set if more than 8 heads
  1294.                   bit 4    always 0
  1295.                   bit 5    set if manufacturer's defect map on max cylinder+1
  1296.                   bit 6    disable ECC retries
  1297.                   bit 7    disable access retries
  1298.         db      standard timeout (XT only, 0 for others)
  1299.         db      formatting timeout (XT only, 0 for others)
  1300.         db      timeout for checking drive (XT only, 0 for others)
  1301.         dw      landing zone    (AT, PS/2)
  1302.         db      sectors/track   (AT, PS/2)
  1303.         db      0
  1304.      2) normally vectored to ROM table when system is initialized.
  1305.  
  1306.  
  1307. Interrupt 42h   Pointer to screen BIOS entry  (EGA, VGA, PS/2)
  1308.                 Relocated (by EGA, etc.) video handler (original int 10h).
  1309.                 Revectors int 10 calls to EGA BIOS.
  1310.  
  1311.  
  1312. Interrupt 43h   Pointer to EGA graphics character table. The POST initializes
  1313.                 this vector pointing to the default table located in the EGA
  1314.                 ROM BIOS. (PC-2 and up). Not initialized if EGA not present.
  1315.                 This vector was referred to (mistakenly) as the Video
  1316.                 Parameters table in the original EGA BIOS listings.
  1317.  
  1318.                                    
  1319. Interrupt 44h   Pointer to graphics character table. This table contains the
  1320. (0:0110h)       dot patterns for the first 128 characters in video modes 4,5,
  1321.                 and 6, and all 256 characters in all additional graphics modes.
  1322.                 Not initialized if EGA not present.
  1323.              2) EGA/VGA/CONV/PS - EGA/PCjr fonts, characters 00h to 7Fh
  1324.              3) Novell NetWare - High-Level Language API
  1325.              4) This interrupt is not used by some EGA cards.
  1326.  
  1327.  
  1328. Interrupt 45h   Reserved by IBM  (not initialized)
  1329.  
  1330.  
  1331. Interrupt 46h   Pointer to second hard disk, parameter block (AT, XT/286, PS/2)
  1332.                 (see int 41h) (except ESDI hard disks) (not initialized unless
  1333.                 specific user software calls for it)
  1334.  
  1335.  
  1336. Interrupt 47h   Reserved by IBM  (not initialized)
  1337.  
  1338.  
  1339. Interrupt 48h   Cordless Keyboard Translation (PCjr, XT [never delivered])
  1340. (0:0120h)       This vector points to code to translate the cordless keyboard
  1341.                 scancodes into normal 83-key values. The translated scancodes
  1342.                 are then passed to int 9. (not initialized on PC or AT)
  1343.  
  1344.  
  1345. Interrupt 49h   Non-keyboard Scan Code Translation Table Address (PCjr)
  1346. (0:0124h)       This interrupt is used for operation of non-keyboard devices
  1347.                 on the PCjr, such as the Keystronic Numeric Keypad.
  1348.                 This interrupt has the address of a table used to translate
  1349.                 non-keyboard scancodes (greater than 85 excepting 255). This
  1350.                 interrupt can be revectored by a user application. IBM
  1351.                 recommends that the default table be stored at the beginning
  1352.                 of an application that required revectoring this interrupt, 
  1353.                 and that the default table be restored when the application
  1354.                 terminates. (not initialized on PC or AT)
  1355.  
  1356.                 The PCjr BIOS can interpret scancodes other than those 
  1357.                 generated by the keyboard to allow for expansion. The keyboard
  1358.                 generates scancodes from 01h to 055h, including 0FFh. Any 
  1359.                 scancodes above 55h (56h through 7Eh for make codes and 0D6h
  1360.                 through 0FEh for break codes) are processed in the following
  1361.                 manner:
  1362.                 1) if the incoming make code falls within the range of the
  1363.                    translate table whose address is pointed to by int 49h, it
  1364.                    is translated into the corresponding scancode. Any incoming
  1365.                    break codes above 0D5h are ignored.
  1366.                 2) if the new translated scancode ius less and 56h, it is
  1367.                    processed by the BIOS as a keyboard scancode and the same
  1368.                    data is placed in the BIOS keyboard buffer.
  1369.                 3) if the translated scancode is higher than 55h or the
  1370.                    incoming scancode is outside the range of the translate
  1371.                    table, 40h is added creating a new extended scancode. The
  1372.                    extended scancode is placed in the BIOS keyboard buffer with 
  1373.                    the character code of 00h (NUL). This utilitizes the range
  1374.                    of 96h through 0BEh for scancodes 56h through 7Eh.
  1375.  
  1376.                 The default translate-table maps scancodes 56h through 6Ah to
  1377.                 existing keyboard values. Codes 6Bh theough 0BEh are mapped (by
  1378.                 adding 40h) to extended codes 0ABh through 0FEh since they are
  1379.                 outside the range of the default translate table.
  1380.  
  1381.                 The format of the translate table is:
  1382.                 0       length - the number of nonkeyboard scancodes that are
  1383.                         mapped within the table (from 1 to n)
  1384.                 1 to n  word  high byte 00h (NUL) byte scancode with low order
  1385.                         byte representing the scancode mapped values relative
  1386.                         to their input values within the range of 56h through
  1387.                         7Eh
  1388.  
  1389.                 With this layout, all keyboard scancodes can be intercepted
  1390.                 through int 9h and and nonkeyboard scancodes can be intercepted
  1391.                 through int 48h.
  1392.  
  1393.  
  1394. Interrupt 4Ah   Real-Time Clock Alarm (Convertible, PS/2)
  1395.                 (not initialized on PC or AT)
  1396.                 Invoked by BIOS when real-time clock alarm occurs
  1397.  
  1398.  
  1399. Interrupt 4Bh   Reserved by IBM  (not initialized)
  1400.  
  1401.  
  1402. Interrupt 4Ch   Reserved by IBM  (not initialized)
  1403.  
  1404.  
  1405. Interrupt 4Dh   Reserved by IBM  (not initialized)
  1406.  
  1407.  
  1408. Interrupt 4Eh   Reserved by IBM  (not initialized)
  1409.                 Used instead of int 13h for disk I/O on TI Professional PC
  1410.  
  1411.  
  1412. Interrupt 4Fh   Reserved by IBM  (not initialized)
  1413.  
  1414.  
  1415. Interrupt 50-57 IRQ0-IRQ7 relocated by DesQview
  1416.                 (normally not initialized)
  1417.  
  1418.  
  1419. Interrupt 58h   Reserved by IBM  (not initialized)
  1420.  
  1421.  
  1422. Interrupt 59h   Reserved by IBM  (not initialized)
  1423.                 GSS Computer Graphics Interface (GSS*CGI)
  1424.                 DS:DX   Pointer to block of 5 array pointers
  1425.                 return  CF      0
  1426.                         AX      return code
  1427.                         CF      1
  1428.                         AX      error code
  1429.                 note 1) Int 59 is the means by which GSS*CGI language bindings
  1430.                         communicate with GSS*CGI device drivers and the GSS*CGI
  1431.                         device driver controller.
  1432.                      2) Also used by the IBM Graphic Development Toolkit
  1433.  
  1434.  
  1435. Interrupt 5Ah   Reserved by IBM  (not initialized)
  1436.  
  1437.  
  1438. Interrupt 5Bh   Reserved by IBM  (not initialized)
  1439.  
  1440.  
  1441. Interrupt 5Ah   Cluster Adapter BIOS entry address
  1442.                 (normally not initialized)
  1443.  
  1444.  
  1445. Interrupt 5Bh   Reserved by IBM  (not initialized) (cluster adapter?)
  1446.  
  1447.  
  1448. Interrupt 5Ch   NETBIOS interface entry port
  1449.                 ES:BX   pointer to network control block
  1450. return  AL      error code (0 if none)
  1451. note 1) When the NETBIOS is installed, interrupts 13 and 17 are interrupted by
  1452.         the NETBIOS; interrupt 18 is moved to int 86 and one of int 2 or 3 is 
  1453.         used by NETBIOS. Also, NETBIOS extends the int 15 function 90 and 91h 
  1454.         functions (scheduler functions)
  1455.      2) Normally not initialized.
  1456.      3) TOPS network card uses DMA 1, 3 or none.
  1457.  
  1458.                   
  1459. Interrupt 5Dh   Reserved by IBM  (not initialized)
  1460.  
  1461.  
  1462. Interrupt 5Eh   Reserved by IBM  (not initialized)
  1463.  
  1464.  
  1465. Interrupt 5Fh   Reserved by IBM  (not initialized)
  1466.  
  1467.  
  1468. Interrupt 60h-67h  User Program Interrupts (availible for general use)
  1469.                    Various major programs make standardized use of this group
  1470.                    of interrupts. Details of common use follows
  1471.  
  1472.  
  1473. Interrupt 60h   10-Net Network
  1474.  
  1475. entry   AH      11h     Lock and Wait
  1476.         AL      drive number or 0
  1477.         DX      number of seconds to wait
  1478.         ES:SI   Ethernet address or 0
  1479.         DS:BX   pointer to 31-byte ASCIIZ semaphore name
  1480. return  AL      status
  1481.                 0       successful
  1482.                 1       timeout
  1483.                 2       server not responding
  1484.                 3       invalid semaphore name
  1485.                 4       semaphore list is full
  1486.                 5       invalid drive ID
  1487.                 6       invalid Ethernet address
  1488.                 7       not logged in
  1489.                 8       write to network failed
  1490.                 9       semaphore already logged for this CPU
  1491.  
  1492. entry   AH      12h     Lock
  1493.         AL      drive number or 0 for default
  1494.         ES:SI   Ethernet address or 0
  1495.         DS:BX   pointer to 31-byte ASCIIZ semaphore name
  1496. return  AL      status (see function 11h)
  1497.                 1       semaphore currently logged
  1498. note    Unlike function 11h, this function returns immediately
  1499.  
  1500. entry   AH      13h     Unlock
  1501.         AL      drive number or 0
  1502.         ES:SI   Ethernet address or 0
  1503.         DS:BX   pointer to 31-byte ASCIIZ semaphore name
  1504. return  AL      status (see function 11h)
  1505.                 1       semaphore not logged
  1506.  
  1507.  
  1508. Interrupt 67h   Used by Lotus-Intel-Microsoft Expanded Memory Specification
  1509.         user    and Ashton-Tate/Quadram/AST Enhanced Expanded Memory
  1510.                 specification (See Chapter 10)
  1511.  
  1512.  
  1513. Interrupt 68h   Not Used  (not initialized)
  1514.  
  1515.  
  1516. Interrupt 69h   Not Used  (not initialized)
  1517.  
  1518.  
  1519. Interrupt 6Ah   Not Used  (not initialized)
  1520.  
  1521.  
  1522. Interrupt 6Bh   Not Used  (not initialized)
  1523.  
  1524.  
  1525. Interrupt 6Ch   System Resume Vector (Convertible) (not initialized on PC)
  1526.                 DOS 3.2 Realtime Clock update
  1527.  
  1528.  
  1529. Interrupt 6Dh   Not Used  (not initialized)
  1530.  
  1531.  
  1532. Interrupt 6Eh   Not Used  (not initialized)
  1533.  
  1534.  
  1535. Interrupt 6Fh   Novell NetWare - PCOX API (3270 PC terminal interface)
  1536. Interrupt 6Fh   10-Net Network API
  1537. entry   AH      00h     Login
  1538.         DS:DX   login record
  1539.               8 bytes user name
  1540.               8 bytes password
  1541.              12 bytes name of super-station
  1542.                 return  CL      security level
  1543.                         AX      status
  1544.                                 0000h   good login
  1545.                                 0FF01h  no response from superstation
  1546.                                 0FF02h  network error
  1547.                                 0FF03h  invalid password
  1548.                                 0FF04h  no local buffer
  1549.                                 0FF05h  superstation not available
  1550.                                 0FF06h  node already logged in
  1551.                                 0FF07h  login not valid from this node
  1552.                                 0FF08h  node ID already in use
  1553.                 01h     Logoff
  1554.                 return  CX      number of files closed
  1555.                         AX      status
  1556.                                 0000h   successful
  1557.                                 0FF08h  superstation ID not already logged in
  1558.                 02h     Status of node
  1559.                 DS:DX   pointer to 512-byte record
  1560.                       8 bytes user name (0 if none)
  1561.                         byte  station type
  1562.                               0  workstation
  1563.                               1  superstation
  1564.                               4  logged into multiple superstations
  1565.                      24 bytes list of superstations logged into more than one
  1566.                         superstation
  1567.                      12 bytes node ID
  1568.                         word  message count for this station (send for user
  1569.                               node, receive for superstations)
  1570.                         for superstations only:
  1571.                         word  drives allocated (bit 0=A:, bit 1=B:,...)
  1572.                         byte  user service flag
  1573.                               bit 4: SUBMIT is on
  1574.                                   3: mail waiting for node
  1575.                                   2: calendar waiting for you
  1576.                                   1: news waiting for you
  1577.                                   0: mail waiting for you
  1578.                         byte    printers allocated (bit 0=LPT1,...)
  1579.                         byte    number of unprinted spool files
  1580.                         byte    number of opened files
  1581.                         byte    number of logged on files
  1582.                         byte    primary drive (1=A:)
  1583.                         byte    reserved
  1584.                       n bytes   list of logged on node IDs (each 12 bytes, max
  1585.                                 38 IDs)
  1586.                 return  CF      set on error
  1587.                                 AX      error code
  1588.                                         0FF01h  no response from node
  1589.                                         0FF02h  network error
  1590.                                         0FF04h  no local buffer
  1591.                                         0FF16h  invalid node ID
  1592.                 03h     Get Address of Configuration Table
  1593.                 return  ES:BX   pointer to record (actually starts at [BX-25])
  1594.                                 word    count of dropped Send6F
  1595.                                 word    buffer start address
  1596.                                 word    comm driver base address
  1597.                                 word    send/receive retry count
  1598.                                 byte    number of 550ms loops
  1599.                                 word    UFH address
  1600.                                 word    CDIR address
  1601.                                 word    LTAB address
  1602.                                 word    SFH address
  1603.                                 word    FTAB address
  1604.                                 word    RLTAB address
  1605.                                 word    SMI address
  1606.                                 word    NTAB address
  1607.                       ES:BX     pointer to word address of first CT_DRV
  1608.                                 byte  number of DRV entries
  1609.                               8 bytes login name
  1610.                              12 bytes node ID
  1611.                               6 bytes node address
  1612.                                 byte  flag
  1613.                                 byte    CT_CFLG
  1614.                                         bit 1: sound bell
  1615.                                         bit 0: CHAT permit
  1616.                                 byte    CT_PSFLG
  1617.                                         bit 5: PRINT permit
  1618.                                         bit 4: KB initiated
  1619.                                         bit 3: CHAT called FOXPTRM
  1620.                                         bit 2: SUBMIT active
  1621.                                         bit 1: SUBMIT received
  1622.                                         bit 0: SUBMIT permit
  1623.                                 byte    reserved
  1624.                                 word    receive message count
  1625.                                 word    send message count
  1626.                                 word    retry count
  1627.                                 word    failed count
  1628.                                 word    driver errors
  1629.                                 word    dropped responses/CHATs
  1630.                               9 bytes   list ID/NTAB address (3 entries-LPT1-3?)
  1631.                               6 bytes   AUX ID/NTAB address (2 entries-COM1-2?)
  1632.                                 byte    active CB channel
  1633.                                 byte    received 6F messages on queue
  1634.                               9 bytes   activity counters for channels 1-9
  1635.                 04h     Send
  1636.                         DS:BX   pointer to record
  1637.                              12 bytes   receiving node's ID
  1638.                                 word    length of data at DX
  1639.                         DS:DX   pointer to data (max 1024 bytes)
  1640.                 return  CF      set on error
  1641.                         AX      error code
  1642.                                 0FF01h  timeout
  1643.                                 0FF02h  network error
  1644.                                 0FF04h  no local buffer
  1645.                                 0FF16h  invalid parameter (bad length)
  1646.                 05h     Receive
  1647.                         CX      number of seconds before timeout
  1648.                         DS:DX   pointer to receive buffer
  1649.                              12 bytes   sending node's ID
  1650.                                 word    length of message
  1651.                               n bytes   message (maximum 1024 bytes)
  1652.                 return CF       set on error
  1653.                                 AX      error code
  1654.                                         0FF01h  timeout
  1655.                                         0FF18h  sent message has been dropped
  1656.                 06h     Unknown
  1657.                 07h     Lock Handle
  1658.                         BX      file handle
  1659.                         CX:DX   starting offset in file
  1660.                         SI      record length
  1661.                 return  CF      set on error
  1662.                                 AX      error code
  1663.                                         0FF01h  timeout
  1664.                                         02h     file not found
  1665.                                         0FF17h  record locked by another user
  1666.                 08h     Unlock Handle
  1667.                         BX      file handle
  1668.                         AL      mode
  1669.                                 0       unlock all
  1670.                                 1       unlock record at CX:DX
  1671.                 return  CF      set on error
  1672.                                 AX      error code
  1673.                                         02h     file not found
  1674.                 0Bh     Lock Semaphore, Return Immediately
  1675.                         AL      drive number or 0
  1676.                         ES:SI   Ethernet address or 0
  1677.                         DS:BX   pointer to 31-byte ASCIIZ semaphore name
  1678.                 return  AL      status
  1679.                                 0       successful
  1680.                                 1       semaphore currently locked
  1681.                                 2       server not responding
  1682.                                 3       invalid semaphore name
  1683.                                 4       semaphore list is full
  1684.                                 5       invalid drive ID
  1685.                                 6       invalid Ethernet address
  1686.                                 7       not logged in
  1687.                                 8       write to network failed
  1688.                                 9       semaphore already logged in this CPU
  1689.                 0Ch     unlock semaphore
  1690.                         AL      drive number or 0
  1691.                         ES:SI   Ethernet address or 0
  1692.                         DS:BX   pointer to 31-byte ASCIIZ semaphore name
  1693.                 return  AL      status (see AH=0Bh)
  1694.                                 1 semaphore not locked
  1695.                 0Dh     Who
  1696.                         CX      length of data
  1697.                         DS:DX   pointer to array of records to be filled
  1698.                              12 bytes   node ID
  1699.                                 byte    flag (1=workstation, 2=superstation)
  1700.                 return  CL      number of records returned (responding stations)
  1701.                 0Eh     spool/print
  1702.                 DS:DX   pointer to record
  1703.                         word    0       initiate spool
  1704.                                 1       abort print
  1705.                                 2       close spool
  1706.                                 3       delete spool
  1707.                                 4       print
  1708.                                 5       get report info
  1709.                      11 bytes file name
  1710.                         byte    notification
  1711.                                 bit 6:  do ID page
  1712.                                 bit 5:  no form feed
  1713.                                 bit 3:  notify at print completion
  1714.                                 bit 2:  notify at print start and reply?
  1715.                                 bit 1:  notify at print start
  1716.                                 bit 0:  no notification
  1717.                         byte    days to keep (0FFh=forever)
  1718.                         byte    device (1=LPT1)
  1719.                         word    length of following data area
  1720.                       n bytes   $SCNT records returned if code in first word
  1721.                                 is 05h
  1722.                 return  CF      set on error
  1723.                                 AX      error code
  1724.                                         0FF16h  invalid parameter
  1725.                                         0FF17h  device not mounted
  1726.                                         0FF18h  already spooling to named device
  1727.                 11h     Lock FCB
  1728.                         AL      mode
  1729.                                 0       sequential
  1730.                                 1       random
  1731.                                 2       random block
  1732.                         DS:DX   pointer to FCB
  1733.                 return  CF      set on error
  1734.                                 AX       02h    file not found
  1735.                                          0FF01h timeout
  1736.                                          0FF17h record locked by another user
  1737.                 12h     Unlock FCB
  1738.                         AL      mode
  1739.                                 0       sequential
  1740.                                 1       random
  1741.                                 2       random block
  1742.                         DS:DX   pointer to FCB
  1743.                 return  CF      set on error
  1744.                                 AX      02h     file not found
  1745.  
  1746.  
  1747. Interrupt 70h   IRQ 8, Real Time Clock Interrupt  (AT, XT/286, PS/2)
  1748.  
  1749.  
  1750. Interrupt 71h   IRQ 9, Redirected to IRQ 8 (AT, XT/286, PS/2)
  1751.                 LAN Adapter 1 (rerouted to int 0Ah [IRQ2] by BIOS)
  1752.  
  1753.  
  1754. Interrupt 72h   IRQ 10  (AT, XT/286, PS/2)  Reserved
  1755.  
  1756.  
  1757. Interrupt 73h   IRQ 11  (AT, XT/286, PS/2)  Reserved
  1758.  
  1759.  
  1760. Interrupt 74h   IRQ 12  Mouse Interrupt (PS/2)
  1761.  
  1762.  
  1763. Interrupt 75h   IRQ 13, Coprocessor Error, BIOS Redirect to int 2 (NMI) (AT)
  1764.  
  1765.  
  1766. Interrupt 76h   IRQ 14, Hard Disk Controller (AT, XT/286, PS/2)
  1767.  
  1768.  
  1769. Interrupt 77h   IRQ 15 (AT, XT/286, PS/2)  Reserved
  1770.  
  1771.  
  1772. Interrupt 78h   Not Used
  1773.  
  1774.  
  1775. Interrupt 79h   Not Used
  1776.  
  1777.  
  1778. Interrupt 7Ah   Novell NetWare - LOW-LEVEL API
  1779.  
  1780.  
  1781. Interrupt 7Bh-7Eh  Not Used
  1782.  
  1783.  
  1784. Interrupt 7Fh   unknown
  1785.                 Used by second copy of COMMAND set with SHELL=
  1786.                 Not used by COMMAND /C at DOS prompt
  1787.  
  1788.  
  1789. Interrupt 80h-85h  Reserved by BASIC
  1790. note    interrupts 80h through ECh are apparently unused and not initialized.
  1791.  
  1792.  
  1793. Interrupt 86h   Relocated by NETBIOS int 18
  1794.  
  1795.  
  1796. Interrupt 86h-0F0h  Used by BASIC when BASIC interpreter is running
  1797.  
  1798.  
  1799. Intrerrupt 0E0h CP/M-86 function calls
  1800.  
  1801.                  
  1802. Interrupt 0E4h  Logitech Modula-2 v2.0   MONITOR
  1803. entry   AX      05h     monitor entry 
  1804.                 06h     monitor exit 
  1805.         BX      priority 
  1806.  
  1807.  
  1808. Interrupt 0F0h  unknown
  1809.                 Used by secondary copy of COMMAND when SHELL= set
  1810.                 Not used by COMMAND /C at DOS prompt
  1811.  
  1812.  
  1813. Interrupts 0F1h-0FFh  (absolute addresses 3C4-3FF)
  1814.                       Location of Interprocess Communications Area
  1815.  
  1816.  
  1817. Interrupt 0F8h  Set Shell Interrupt (OEM) 
  1818.                 Set OEM handler for int 21h calls from 0F9h through 0FFh
  1819. entry   AH      0F8h
  1820.         DS:DX   pointer to handler for Functions 0F9h thru 0FFh       
  1821. note 1) To reset these calls, pass DS and DX with 0FFFFh. DOS is set up to 
  1822.         allow ONE handler for all 7 of these calls. Any call to these handlers
  1823.         will result in the carry bit being set and AX will contain 1 if they are
  1824.         not initialized. The handling routine is passed all registers just as 
  1825.         the user set them. The OEM handler routine should be exited through an 
  1826.         IRET.
  1827.      2) 10 ms interval timer (Tandy?)
  1828.  
  1829.  
  1830. Interrupt 0F9h  First of 8 SHELL service codes, reserved for OEM shell (WINDOW);
  1831.                 use like HP Vectra user interface?
  1832.  
  1833.  
  1834. Interrupt 0FAh  USART ready (RS-232C)
  1835.  
  1836.  
  1837. Interrupt 0FBh  USART RS ready (keyboard)
  1838.  
  1839.  
  1840. Interrupt 0FCh  Unknown
  1841.  
  1842.  
  1843. Interrupt 0FDh  reserved for user interrupt
  1844.  
  1845.  
  1846. Interrupt 0FEh  AT/XT286/PS50+ - destroyed by return from protected mode
  1847.  
  1848.  
  1849. Interrupt 0FFh  AT/XT286/PS50+ - destroyed by return from protected mode
  1850.  
  1851.  
  1852.  
  1853.  
  1854.  
  1855.  
  1856.  
  1857.  
  1858.  
  1859.  
  1860.  
  1861.  
  1862.  
  1863.  
  1864.  
  1865.  
  1866.