home *** CD-ROM | disk | FTP | other *** search
/ Collection of Education / collectionofeducationcarat1997.iso / COMPUSCI / DOSREF20.ZIP / CHAPTER.002 < prev    next >
Text File  |  1991-06-17  |  82KB  |  1,340 lines

  1.  
  2.    **  Programmer's  Technical  Reference  for  MSDOS  and  the  IBM  PC **
  3.                         ┌─────────────────────────────┐
  4.                         │ Shareware Version, 06/17/91 │
  5.                         │  Please Register Your Copy  │
  6.                         └─────────────────────────────┘
  7.                     Copyright (c) 1987, 1991 Dave Williams
  8.                  USA copyright TXG 392-616 ALL RIGHTS RESERVED
  9.                      ISBN 1-878830-02-3 (disk-based text)
  10.  
  11.  
  12.                              C H A P T E R   T W O
  13.  
  14.  
  15.  CPU Port Assignments, System Memory Map, BIOS Data Area, Interrupts 00h to 09h
  16.  
  17.  
  18.  
  19.                                 C O N T E N T S
  20.  
  21. Introduction .......................................................... 2**1
  22. System Memory Map ..................................................... 2**2
  23. A Brief Guide to Current Memory Terminology ........................... 2**3
  24. PC Port Assignment .................................................... 2**4
  25. Reserved Memory Locations ............................................. 2**5
  26. Absolute Addresses .................................................... 2**6
  27. The IBM PC System Interrupts (Overview) ............................... 2**7
  28. Quick Chart of Interrupts 00h-0FFh .................................... 2**8
  29. The IBM-PC System Interrupts 00h-0Fh (in detail) ...................... 2**9
  30.  
  31.  
  32.  
  33. Introduction .......................................................... 2**1
  34.  
  35.  For consistency in this reference, all locations and offsets are in
  36. hexadecimal unless otherwise specified. All hex numbers are prefaced with a
  37. leading zero if they begin with an alphabetic character, and are terminated
  38. with a lowercase H (h). The formats vary according to common usage.
  39.  
  40.  
  41.  
  42. System Memory Map ..................................................... 2**2
  43.  
  44.  The IBM PC handles its address space in 64k segments, divided into 16k
  45. fractions and then further as necessary.
  46.  
  47. ┌──────┬─────┬─────┬──────────────────────────────────────────────────────────┐
  48. │start │start│end  │                                                          │
  49. │addr. │addr.│addr.│                          usage                           │
  50. │(dec) │   (hex)   │                                                          │
  51. ├──────┴───────────┴──────────────────────────────────────────────────────────┤
  52. │   *640k RAM Area*                                                           │
  53. ├──────┬───────────┬──────────────────────────────────────────────────────────┤
  54. │ 0k   │           │  start of RAM, first K is interrupt vector table         │
  55. │ 16k  │00000-03FFF│  PC-0 system board RAM ends                              │
  56. │ 32k  │04000-07FFF│                                                          │
  57. │ 48k  │08000-0BFFF│                                                          │
  58. ├──────┼───────────┼──────────────────────────────────────────────────────────┤
  59. │ 64k  │10000-13FFF│  PC-1 system board RAM ends                              │
  60. │ 80k  │14000-17FFF│                                                          │
  61. │ 96k  │18000-1BFFF│                                                          │
  62. │ 112k │1C000-1FFFF│                                                          │
  63. ├──────┼───────────┼──────────────────────────────────────────────────────────┤
  64. │ 128k │20000-23FFF│                                                          │
  65. │ 144k │24000-27FFF│                                                          │
  66. │ 160k │28000-2BFFF│                                                          │
  67. │ 176k │2C000-2FFFF│                                                          │
  68. ├──────┼───────────┼──────────────────────────────────────────────────────────┤
  69. │ 192k │30000-33FFF│                                                          │
  70. │ 208k │34000-37FFF│                                                          │
  71. │ 224k │38000-3BFFF│                                                          │
  72. │ 240k │3C000-3FFFF│                                                          │
  73. ├──────┼───────────┼──────────────────────────────────────────────────────────┤
  74. │ 256k │40000-43FFF│  PC-2 system board RAM ends                              │
  75. │ 272k │44000-47FFF│                                                          │
  76. │ 288k │48000-4BFFF│                                                          │
  77. │ 304k │4C000-4FFFF│                                                          │
  78. ├──────┼───────────┼──────────────────────────────────────────────────────────┤
  79. │ 320k │50000-53FFF│                                                          │
  80. │ 336k │54000-57FFF│                                                          │
  81. │ 352k │58000-5BFFF│                                                          │
  82. │ 368k │5C000-5FFFF│                                                          │
  83. ├──────┼───────────┼──────────────────────────────────────────────────────────┤
  84. │ 384k │60000-63FFF│                                                          │
  85. │ 400k │64000-67FFF│                                                          │
  86. │ 416k │68000-6BFFF│                                                          │
  87. │ 432k │6C000-6FFFF│                                                          │
  88. ├──────┼───────────┼──────────────────────────────────────────────────────────┤
  89. │ 448k │70000-73FFF│                                                          │
  90. │ 464k │74000-77FFF│                                                          │
  91. │ 480k │78000-7BFFF│                                                          │
  92. │ 496k │7C000-7FFFF│                                                          │
  93. ├──────┼───────────┼──────────────────────────────────────────────────────────┤
  94. │ 512k │80000-83FFF│                                                          │
  95. │ 528k │84000-87FFF│                                                          │
  96. │ 544k │88000-8BFFF│  the original IBM PC-1 BIOS limited memory to 544k       │
  97. │ 560k │8C000-8FFFF│                                                          │
  98. ├──────┼───────────┼──────────────────────────────────────────────────────────┤
  99. │ 576k │90000-93FFF│                                                          │
  100. │ 592k │94000-97FFF│                                                          │
  101. │ 609k │98000-9BFFF│                                                          │
  102. │ 624k │9C000-9FFFF│  to 640k (top of RAM address space)                      │
  103. ├──────┴───────────┴──────────────────────────────────────────────────────────┤
  104. │A0000 ***** 64k ***** EGA/VGA starting address                               │
  105. │A0000 ***** 64k ***** Toshiba 1000 DOS ROM (MS-DOS 2.11V)                    │
  106. ├──────┬───────────┬──────────────────────────────────────────────────────────┤
  107. │ 640k │A0000-A95B0│  MCGA 320x200 256 color video buffer                     │
  108. │      │     -AF8C0│  MCGA 640x480 2 color video buffer                       │
  109. │      │     -A3FFF│                                                          │
  110. │ 656k │A4000-A7FFF│                                                          │
  111. │ 672k │A8000-ABFFF│      this 64k segment may be used for contiguous DOS     │
  112. │ 688k │AC000-AFFFF│      RAM with appropriate hardware and software          │
  113. ├──────┴───────────┴──────────────────────────────────────────────────────────┤
  114. │B0000 ***** 64k ***** mono and CGA address                                   │
  115. ├──────┬───────────┬──────────────────────────────────────────────────────────┤
  116. │ 704k │B0000-B3FFF│  4k  monochrome display   | The PCjr and early Tandy 1000│
  117. │ 720k │B4000-B7FFF│                           | BIOS revector direct write to│
  118. │ 736k │B8000-BBFFF│  16k CGA uses             | the B8 area to the Video Gate│
  119. │ 756k │BC000-BFFFF│                           | Array and reserved system RAM│
  120. ├──────┴───────────┴──────────────────────────────────────────────────────────┤
  121. │C0000 ***** 64k *************** expansion ROM                                │
  122. ├──────┬───────────┬──────────────────────────────────────────────────────────┤
  123. │ 768k │C0000-C3FFF│  16k EGA BIOS C000:001E EGA BIOS signature (letters IBM  │
  124. │ 784k │C4000-C5FFF│                                                          │
  125. │      │C6000-C63FF│  256 bytes Professional Graphics Display comm. area      │
  126. │      │C6400-C7FFF│                                                          │
  127. │ 800k │C8000-CBFFF│  16k hard disk controller BIOS, drive 0 default          │
  128. │      │CA000      │      some 2nd floppy (high density) controller BIOS      │
  129. │ 816k │CC000-CDFFF│   8k IBM PC Network NETBIOS                              │
  130. │      │CE000-CFFFF│                                                          │
  131. ├──────┴───────────┴──────────────────────────────────────────────────────────┤
  132. │D0000 ***** 64k ***** expansion ROM                                          │
  133. ├──────┬───────────┬──────────────────────────────────────────────────────────┤
  134. │ 832k │D0000-D7FFF│  32k IBM Cluster Adapter  | PCjr first ROM cartridge     │
  135. │      │      DA000│  voice communications     | address area.                │
  136. │ 848k │D4000-D7FFF│                           | Common expanded memory board │
  137. │ 864k │D8000-DBFFF│                           | paging area.                 │
  138. │ 880k │DC000-DFFFF│                           |                              │
  139. │      │DE000      │  TI Pro default video buffer, 4k in length               │
  140. ├──────┴───────────┴──────────────────────────────────────────────────────────┤
  141. │E0000 ***** 64k ***** expansion ROM                                          │
  142. ├──────┬───────────┬──────────────────────────────────────────────────────────┤
  143. │ 896k │E0000-E3FFF│                           | PCjr second ROM cartridge    │
  144. │ 912k │E4000-E7FFF│                           | address area                 │
  145. │ 928k │E8000-EBFFF│                           |                              │
  146. │ 944k │EC000-EFFFF│                           |    spare ROM sockets on AT   │
  147. ├──────┴───────────┴──────────────────────────────────────────────────────────┤
  148. │F0000 ***** 64k ***** system                                                 │
  149. ├──────┬───────────┬──────────────────────────────────────────────────────────┤
  150. │ 960k │F0000-F3FFF│  reserved by IBM          |    cartridge address         │
  151. │ 976k │F4000-     │                           |    area (PCjr cartridge      │
  152. │      │F6000      │  ROM BASIC Begins         |    BASIC)                    │
  153. │ 992k │F8000-FB000│                           |                              │
  154. │ 1008k│FC000-FFFFF│  ROM BASIC and original   |                              │
  155. │      │           │  BIOS (Compatibility BIOS |                              │
  156. │      │           │  in PS/2)                 |                              │
  157. │ 1024k│      FFFFF│  end of memory (1024k) for 8088 machines                 │
  158. ├──────┼───────────┴─┬────────────────────────────────────────────────────────┤
  159. │ 384k │100000-15FFFF│ 80286/AT extended memory area, 1Mb motherboard         │
  160. │ 15Mb │100000-FFFFFF│ 80286/AT extended memory address space                 │
  161. │ 15Mb │160000-FDFFFF│ Micro Channel RAM expansion (15Mb extended memory)     │
  162. │ 128k │FE0000-FFFFFF│ system board ROM            (PS/2 Advanced BIOS)       │
  163. ├──────┼─────────────┴───┬────────────────────────────────────────────────────┤
  164. │  64k │C0000000-C000FFFF│ Weitek "Abacus" math coprocessor memory-mapped I/O │
  165. └──────┴─────────────────┴────────────────────────────────────────────────────┘
  166.  
  167.  Note that the ROM BIOS has a duplicated address space which causes it to
  168. "appear" both at the end of the 1 megabyte real mode space and at the end of
  169. the 16 megabyte protected mode space. The addresses from 0E0000 to 0FFFFF are
  170. equal to 0FE0000 to 0FFFFFF. This is necessary due to differences in the memory
  171. addressing between Real and Protected Modes.
  172.  
  173.  
  174.  
  175. A Brief Guide to Current Memory Terminology ........................... 2**3
  176.  
  177. LOW MEMORY - 0000h to around 0:5(something), comprising the 80x8x interrupt
  178.              vector table, the BIOS Data Area, DOS Data Area, etc.
  179.  
  180. CONVENTIONAL MEMORY - from the end of low memory to the beginning of the
  181.              "reserved by IBM" A000 segment (640k).
  182.  
  183. HIGH MEMORY - originally noncontiguous RAM stuffed into the "reserved for
  184.              ROM expansion" areas, typically segments D000 and E000. DOS
  185.              normally can't access this memory without a driver of some
  186.              sort, but it's easy to put RAMdisks and stuff in there.
  187.  
  188. CONVENTIONAL MEMORY - extra RAM stuck at A000, assuming the machine already
  189.              has 640k, appears as conventional memory accessible to DOS
  190.              and applications. IBM clones can typically add 64k before
  191.              bumping into a mono card or 96k before hitting a color card.
  192.              This address is part of the EGA/VGA video RAM area and most
  193.              EGA cards don't like system memory at A000.
  194.  
  195. EXPANDED MEMORY - LIM 3.2, LIM 4.0, or EEMS 3.2 bank switched memory. A
  196.              RAM "window" allows an app to save a block of RAM to an expansion
  197.              board. The window size and location varies according to the
  198.              EMS standard being used.
  199.  
  200. EXTENDED MEMORY - this is the "native mode" address space of the 80286 and
  201.              later chips. The "real mode", or 8088 addressing scheme,
  202.              sees RAM as a collection of segments and offsets with a limit
  203.              on segment size. "Protected mode" addressing uses a flat linear
  204.              addressing scheme. 8088 and 80188 chips do not have extended
  205.              memory.
  206.  
  207. HIGH MEMORY - by fiddling a bit with the segment/offset stuff, you can
  208.              get an extra block of addressable 8088-mode memory just over
  209.              the 1 meg address space. Microsoft issued their "HMA" (High
  210.              Memory Area) standard to try to standardize use of this block.
  211.              Though it really is "high" memory, "high" had for many years
  212.              referred to memory between 640k and 1mb. This creates more
  213.              confusion for new programmers.
  214.  
  215. EMS - this is expanded memory as described above
  216.  
  217. XMS - Microsoft is pushing an "Extended Memory Standard" which defines
  218.       a page-switching scheme much like EMS. The only real difference is
  219.       that XMS uses protected-mode RAM instead of a special paged RAM board.
  220.  
  221. XMS - some severely brain-damaged jerk at IBM issued documentation for some
  222.       IBM *EMS* boards referring to the boards as *XMS*. This was a classic
  223.       blunder, and now some IBM-followers are picking up the aberrant
  224.       terminology. This is guaranteed to confuse some people. To make it
  225.       simple, if it needs an expansion board, it is EMS no matter what the
  226.       vendor calls it.
  227.  
  228.  
  229. PC Port Assignment .................................................... 2**4
  230.  
  231.  
  232.  These are functions common across the IBM range. The PCjr, PC-AT, PC
  233. Convertible and PS/2 (both buses) have enhancements. In some cases, the
  234. AT and PS/2 series ignore, duplicate, or reassign ports arbitrarily. If
  235. your code incorporates specific port addresses for video or system board
  236. control it would be wise to have your application determine the machine
  237. type and video adapter and address the ports as required.
  238.  
  239.  hex address                   Function                   Models
  240.                                                 PCjr|PC|XT|AT|CVT|M30|PS2
  241.  
  242.  0000-000F      8237 DMA controller                  PC
  243.  0010-001F      8237 DMA controller                        AT         PS2
  244.  0020-0027      8259A interrupt controller
  245.  0020-002F      IOSGA interrupt function                              PS2
  246.  0020-003F      8259A interrupt controller  (AT)
  247.  0020-0021      interrupt controller 1, 8259A        PC    AT         PS2
  248.  0040-0043      programmable timer 8253              PC
  249.  0040-0047      programmable timers                                   PS2
  250.  0040-005F      8253-5 programmable timers                 AT
  251.                 note 1) 0041 was memory refresh in PCs. Not used in PS/2.
  252.                      2) A few early 80386 machines used static RAM and did
  253.                         not use refresh at all. The PCjr refreshes by the
  254.                         video vertical retrace signal.
  255.  0060-0063      keyboard controller 8255A            PC
  256.  0060-006F      8042 keyboard controller                   AT
  257.  0060           IOSGA keyboard input port                             PS2
  258.  0061           speaker                         PCjr PC XT AT CVT
  259.  0061           IOSGA speaker control                             M30 PS2
  260.  0061           On some clones, setting or clearing bit 2 controls Turbo mode
  261.  0061           Toshiba 1000 - system command
  262.  0062           IOSGA configuration control                       M30 PS2
  263.  0062           Toshiba 1000 - System Status, port C
  264.  0063           SSGA, undocumented                                    PS2
  265.  0063           Toshiba 1000 - mode set
  266.  0064           keyboard auxiliary device                             PS2
  267.  0065-006A      SSGA, undocumented                                    PS2
  268.  006B           SSGA, RAM enable/remap                                PS2
  269.  006C-006F      SSGA, undocumented                                    PS2
  270.  0070           AT CMOS write internal register
  271.  0071           AT CMOS read internal register
  272.  0070-0071      CMOS real-time clock, NMI mask                        PS2
  273.  0070-007F      CMOS real-time clock, NMI mask             AT
  274.  0074-0076      reserved                                              PS2
  275.  0800-008F      SSGA DMA page registers                               PS2
  276.  0080-009F      DMA page registers, 74LS612                AT
  277.  0090           central arbitration control port (Micro Channel)
  278.  0091           card selected feedback           (Micro Channel)
  279.  0092           system control port A            (Micro Channel)
  280.  0093           reserved                         (Micro Channel)
  281.  0094           system board setup               (Micro Channel)
  282.  0096           POS "CD SETUP" selector          (Micro Channel)
  283.  00A0-00A1      Interrupt controller 2, 8259A              AT         PS2
  284.  00A0-00AF      IOSGA NMI mask register                               PS2
  285.  00B0-00BF      realtime clock/calendar, (undocumented)               PS2
  286.  00C0-00DF      reserved                        PCjr PC XT AT CVT M30
  287.  00C0-00CF      DOS ROM register, Toshiba 1000
  288.  00D0-00EF      "special" register, Toshiba 1000
  289.       00C0      0C1 key register, Toshiba 1000
  290.       00C1      keyboard transfer register, Toshiba 1000
  291.       00C2      keyboard receive register, Toshiba 1000
  292.       00C3      keyboard status register, Toshiba 1000
  293.       00C8      DOS ROM page register, Toshiba 1000
  294.       00E0      CPU speed control, Toshiba 1000
  295.       00E1      keyboard status/0E2 key register, Toshiba 1000
  296.       00E2      work register, Toshiba 1000
  297.       00E3      0E4 key register, Toshiba 1000
  298.       00E4      system control register 0, Toshiba 1000
  299.       00E4      Weitek ABACUS NDP - bit 0=1, ABACUS is present
  300.       00E5      0E6 key register, Toshiba 1000
  301.       00E6      system control register 1, Toshiba 1000
  302.       00EE      EMS unit index, Toshiba 1000
  303.       00EF      EMS unit data, Toshiba 1000
  304.  00C0-00DF      DMA controller 2, 8237A-5                  AT         PS2
  305.  00E0-00EF      realtime clock/calendar  (undocumented)           M30 PS2
  306.  00F0-00FF      PS/2 math coprocessor I/O  (Model 50+)  (diskette IO on PCjr)
  307.  0100-0101      PS/2 POS adapter ID response            (Micro Channel)
  308.  0102-0107      PS/2 POS adapter configuration response (Micro Channel)
  309.  01F0-01F8      hard disk                                  AT         PS2
  310.  0200-0201      game-control adapter (joystick)
  311.  0200-020F      game controller                      PC    AT
  312.  0208-0209      Chips & Technology CS8221 chipset default EMS ports
  313.                 alternate addresses: 218h, 258h, 268h, 2A8h, 2B8h, 2E8h
  314.  0208-020F      Toshiba 1000 - EMS unit I/O #1
  315.  020C-020D      reserved by IBM
  316.  0210-0217      expansion box (PC, XT)
  317.  0218-021F      Toshiba 1000 - EMS unit I/O #2
  318.  021F           reserved by IBM
  319.  0258-025F      Toshiba 1000 - EMS unit I/O #3
  320.  0258-0259      LIM EMS 3.1 (not defined in 3.2+)
  321.  0268-026F      Toshiba 1000 - EMS unit I/O #4
  322.  0278-027F      parallel printer port 2                    AT
  323.  0278-027B      parallel printer port 3                               PS2
  324.  02A2           clock chip in early Sperry PCs
  325.  02A8-02AF      Toshiba 1000 - EMS unit I/O #5
  326.  02B8-02BF      Toshiba 1000 - EMS unit I/O #6
  327.  02B0-02DF      EGA (alternate)                       PC   AT
  328.  02C0-02DF      Toshiba 1000 - realtime clock
  329.  02E1           GPIB (adapter 0)                           AT
  330.  02E2-02E3      data acquisition (adapter 0)               AT
  331.  02E8           "industry standard" COM4
  332.  02E8-02EF      Toshiba 1000 - EMS unit I/O #7
  333.  02F8-02FF      serial communications (COM2)          PC   AT         PS2
  334.  0300-031F      prototype card                        PC   AT
  335.  0300-031F      Leading Edge Model D clock            -------------------
  336.  0320-032F      hard disk controller                  PC
  337.  0320           Perstor HD controller, primary        -------------------
  338.  0324           Perstor HD controller, secondary      -------------------
  339.  0340           Sony CD-ROM                           -------------------
  340.  0348-0357      DCA 3278
  341.  0360-0367      PC Network (low address)
  342.  0368-036F      PC Network (high address)                  AT
  343.  0370           Colorado Memory external tape backup control port -------
  344.                 some "second controller" floppy cards -------------------
  345.  0378-037F      parallel printer port                 PC   AT
  346.  0378-037B      parallel printer port                                 PS2
  347.  0380-038F      Eicon Technology Network Adapter (X.25) board (default)
  348.  0380-038F      SDLC, bi-synchronous 2                PC   AT
  349.  0380-0389      BSC communications (alternate)        PC
  350.  0390-039F      Eicon Technology Network Adapter (X.25) board (alternate)
  351.  0390-0393      cluster (adapter 0)                   PC   AT
  352.  03A0-03A9      BSC communications (primary)          PC   AT
  353.  03B0-03BF      monochrome/parallel printer adapter   PC   AT
  354.  03B4-03B5      video subsystem                                       PS2
  355.  03BA           video subsystem                                       PS2
  356.  03BC-03BF      parallel printer port 1                               PS2
  357.  03C0-03CF      Enhanced Graphics Adapter
  358.  03C0-03DA      video subsystem and DAC                               PS2
  359.  03DA           video status register                 AT&T 6300, Olivetti PC
  360.  03D0-03DF      CGA, MCGA, VGA adapter control
  361.  03DE           video mode selector register          AT&T 6300, Olivetti PC
  362.  03E8h          "industry standard" COM3
  363.  03F0-03F7      floppy disk controller                PC   AT         PS2
  364.  03F0           Colorado Memory internal tape backup control port -------
  365.  03F2           DTK high-density XT floppy controller (output only)
  366.  03F5           DTK high-density XT floppy controller
  367.  03F8-03FF      serial communications (COM1)          PC   AT         PS2
  368.  06E2-06E3      data acquisition (adapter 1)               AT
  369.  0790-0793      cluster (adapter 1)                   PC   AT
  370.  0878           Compaq 386SX VGA BIOS relocation           AT
  371.  0AE2-0AE3      data acquisition (adapter 2)               AT
  372.  0B90-0B93      cluster (adapter 2)                   PC   AT
  373.  0EE2-0EE3      data acquisition (adapter 3)               AT
  374.  1390-1393      cluster (adapter 3)                   PC   AT
  375.  22E1           GPIB (adapter 1)
  376.  2390-2393      cluster (adapter 4)                   PC   AT
  377.  4258           LIM EMS 3.1 (not defined in 3.2+)     -------------------
  378.  42E1           GPIB (adapter 2)                           AT
  379.  62E1           GPIB (adapter 3)                           AT
  380.  8258           LIM EMS 3.1 (not defined in 3.2+)     -------------------
  381.  82E1           GPIB (adapter 4)                           AT
  382.  A2E1           GPIB (adapter 5)                           AT
  383.  C258           LIM EMS 3.1 (not defined in 3.2+)     -------------------
  384.  C2E1           GPIB (adapter 6)                           AT
  385.  E2E1           GPIB (adapter 7)                           AT
  386.  
  387. note 1) IOSGA = I/O Support Gate Array
  388.         SSGA = System Support Gate Array
  389.      2) I/O Addresses, hex 000 to 0FF, are reserved for the system board I/O.
  390.         Hex 100 to 3FF are available on the I/O channel.
  391.      3) These are the addresses decoded by the current set of adapter cards.
  392.         IBM may use any of the unlisted addresses for future use.
  393.      4) SDLC Communication and Secondary Binary Synchronous Communications
  394.         cannot be used together because their port addresses overlap.
  395.  
  396.  
  397.  
  398. Reserved Memory Locations ............................................. 2**5
  399.  
  400. ┌──────────────────────────────────────────────────────────────────────────────
  401. │ 000-3FF  - 1k DOS interrupt vector table, 4 byte vectors for ints 00h-0FFh.
  402. │   30:00  - used as a stack area during POST and bootstrap routines. This
  403. │to 3F:FF    stack area may be revectored by an application program.
  404. ├──────────────────────────────────────────────────────────────────────────────
  405. │ ** The BIOS Data Area ** addresses from 400h to 4FFh
  406. ├─────┬───────┬────────────────────────────────────────────────────────────────
  407. │addr.│ size  │                         description
  408. ├─────┼───────┼────────────────────────────────────────────────────────────────
  409. │40:00│  word │ COM1 port address |   These addresses are zeroed out in the
  410. │40:02│  word │ COM2 port address |   OS/2 DOS Compatibility Box if any of
  411. │40:04│  word │ COM3 port address |   the OS/2 COMxx.SYS drivers are loaded.
  412. │40:06│  word │ COM4 port address |
  413. │40:08│  word │ LPT1 port address
  414. │40:0A│  word │ LPT2 port address
  415. │40:0C│  word │ LPT3 port address
  416. │40:0E│  word │ LPT4 port address        (not valid in PS/2 machines)
  417. │40:0E│  word │ PS/2 pointer to 1k extended BIOS Data Area at top of RAM
  418. │40:10│  word │ equipment flag (see int 11h)
  419. └─────┴───────┤ bits:
  420.               │ 0       0       no floppy drive present
  421.               │         1       if floppy drive present (see bits 6&7)
  422.               │ 1       0       no math coprocessor installed
  423.               │         1       if 80x87 installed  (not valid in PCjr)
  424.               │ 2,3     system board RAM   (not used on AT or PS/2)
  425.               │         0,0     16k             0,1     32k
  426.               │         1,0     48k             1,1     64k
  427.               │ 4,5     initial video mode
  428.               │         0,0     no video adapter
  429.               │         0,1     40 column color  (PCjr default)
  430.               │         1,0     80 column color
  431.               │         1,1     MDA
  432.               │ 6,7     number of diskette drives
  433.               │         0,0     1 drive         0,1     2 drives
  434.               │         1,0     3 drives        1,1     4 drives
  435.               │ 8       0       DMA present
  436.               │         1       DMA not present (PCjr, Tandy 1400, Sanyo 55x)
  437.               │ 9,A,B   number of RS232 serial ports
  438.               │ C       game adapter  (joystick)
  439.               │         0       no game adapter
  440.               │         1       if game adapter
  441.               │ D       serial printer (PCjr only)
  442.               │         0       no printer
  443.               │         1       serial printer present
  444.        ┌──────┘ E,F     number of parallel printers installed
  445.        │note 1) The IBM PC and AT store the settings of the system board
  446.        └───┐    switches or CMOS RAM setup information (as obtained by the BIOS
  447.            │    in the Power-On Self Test (POST)) at addresses 40:10h and
  448.            │    40:13h. 00000001b indicates "on", 00000000b is "off".
  449. ┌─────┬────┴──┐
  450. │40:12│  byte │ reserved (PC, AT)
  451. └─────┴───────┤  number of errors detected by infrared keyboard link (PCjr)
  452. ┌─────┬───────┤  POST status (Convertible)
  453. │40:13│  word │ availible memory size in Kbytes (less display RAM in PCjr)
  454. ├─────┼───────┤  this is the value returned by int 12h
  455. │40:15│  word │ reserved
  456. │40:17│  byte │ keyboard flag byte 0 (see int 9h)
  457. └─────┴───────┤ bit 7  insert mode on      3  alt pressed
  458.               │     6  capslock on         2  ctrl pressed
  459.               │     5  numlock on          1  left shift pressed
  460. ┌─────┬───────┤     4  scrollock on        0  right shift pressed
  461. │40:18│  byte │ keyboard flag byte 1 (see int 9h)
  462. └─────┴───────┤ bit 7  insert pressed      3  ctrl-numlock (pause) toggled
  463.               │     6  capslock pressed    2  PCjr keyboard click active
  464.               │     5  numlock pressed     1  PCjr ctrl-alt-capslock held
  465. ┌─────┬───────┤     4  scrollock pressed   0
  466. │40:19│  byte │ storage for alternate keypad entry (not normally used)
  467. │40:1A│  word │ pointer to keyboard buffer head character
  468. │40:1C│  word │ pointer to keyboard buffer tail character
  469. │40:1E│32bytes│ 16 2-byte entries for keyboard circular buffer, read by int 16h
  470. │40:3E│  byte │ drive seek status - if bit=0, next seek will recalibrate by
  471. └─────┴───────┤ repositioning to Track 0.
  472.               │ bit 3  drive D          bit 2  drive C
  473. ┌─────┬───────┤     1  drive B              0  drive A
  474. │40:3F│  byte │ diskette motor status (bit set to indicate condition)
  475. └─────┴───────┤ bit 7  write in progress    3  motor on (floppy 3)
  476.               │     6                       2  motor on (floppy 2)
  477.               │     5                       1  B: motor on (floppy 1)
  478. ┌─────┬───────┤     4                       0  A: motor on (floppy 0)
  479. │40:40│  byte │ motor off counter
  480. │     │       │ starts at 37 and is decremented 1 by each system clock tick.
  481. │     │       │ motor is shut off when count = 0.
  482. │40:41│  byte │ status of last diskette operation     where:
  483. └─────┴───────┤ bit 7 timeout failure                3 DMA overrun
  484.               │     6 seek failure                   2 sector not found
  485.               │     5 controller failure             1 address not found
  486. ┌─────┬───────┤     4 CRC failure                    0 bad command
  487. │40:42│7 bytes│ NEC floppy controller chip status
  488. │40:49│  byte │ Video Control Data Area 1 from 0040:0049 through 0040:0066
  489. └─────┴───────┤ current CRT mode (hex value)
  490.               │    00h 40x25 BW      (CGA)          01h 40x25 color   (CGA)
  491.               │    02h 80x25 BW      (CGA)          03h 80x25 color   (CGA)
  492.               │    04h 320x200 color (CGA)          05h 320x200 BW    (CGA)
  493.               │    06h 640x200 BW    (CGA)          07h monochrome    (MDA)
  494.               │extended video modes (EGA/MCGA/VGA or other)
  495.               │    08h lores,16 color               09h med res,16 color
  496.               │    0Ah hires,4 color                0Bh n/a
  497.               │    0Ch med res,16 color             0Dh hires,16 color
  498. ┌─────┬───────┤    0Eh hires,4 color                0Fh hires,64 color
  499. │40:4A│  word │ number of columns on screen, coded as hex number of columns
  500. └─────┴───────┤ 20 col = 14h  (video mode 8, low res 160x200 CGA graphics)
  501.               │ 40 col = 28h
  502. ┌─────┬───────┤ 80 col = 46h
  503. │40:4C│  word │ screen buffer length in bytes
  504. ├─────┼───────┤(number of bytes used per screen page, varies with video mode)
  505. │40:4E│  word │ current screen buffer starting offset (active page)
  506. │40:50│8 words│ cursor position pages 1-8
  507. └─────┴───────┤ the first byte of each word gives the column (0-19, 39, or 79)
  508. ┌─────┬───────┤ the second byte gives the row (0-24)
  509. │40:60│  byte │ end line for cursor   (normally 1)
  510. │40:61│  byte │ start line for cursor (normally 0)
  511. │40:62│  byte │ current video page being displayed  (0-7)
  512. │40:63│  word │ base port address of 6845 CRT controller or equivalent
  513. ├─────┼───────┤ for active display           3B4h=mono, 3D4h=color
  514. │40:65│  byte │ current setting of the CRT mode register
  515. │40:66│  byte │ current palette mask setting  (CGA)
  516. │40:67│5 bytes│ temporary storage for SS:SP during shutdown (cassette interface)
  517. │40:6C│  word │ timer counter low word
  518. │40:6E│  word │ timer counter high word
  519. │40:69│  byte │ HD_INSTALL (Columbia PCs) (not valid on most clone computers)
  520. └─────┴───────┤ bit  0    0  8 inch external floppy drives
  521.               │           1  5-1/4 external floppy drives
  522.               │      1,2     highest drive address which int 13 will accept
  523.               │              (since the floppy drives are assigned 0-3,subtract
  524.               │              3 to obtain the number of hard disks installed)
  525.               │      4,5     # of hard disks connected to expansion controller
  526.               │      6,7     # of hard disks on motherboard controller
  527.               │              (if bit 6 or 7 = 1, no A: floppy is present and
  528. ┌─────┬───────┤              the maximum number of floppies from int 11 is 3)
  529. │40:70│  byte │ 24 hour timer overflow 1 if timer went past midnight
  530. ├─────┼───────┤ it is reset to 0 each time it is read by int 1Ah
  531. │40:71│  byte │ BIOS break flag (bit 7 = 1 means break key hit)
  532. │40:72│  word │ reset flag
  533. └─────┴───────┤ PCjr keeps 1234h here for softboot when a cartridge is installed
  534.               │ bits 1234h = soft reset, memory check will be bypassed
  535.               │      4321h = preserve memory         (PS/2 only)
  536.               │      5678h = system suspended        (Convertible)
  537.               │      9ABCh = manufacturing test mode (Convertible)
  538. ┌─────┬───────┤      ABCDh = system POST loop mode   (Convertible)
  539. │40:74│  byte │ status of last hard disk operation ; PCjr special disk control
  540. │40:75│  byte │ # of hard disks attached (0-2)     ; PCjr special disk control
  541. │40:76│  byte │ HD control byte; temp holding area for 6th param table entry
  542. │40:77│  byte │ port offset to current hd adapter  ; PCjr special disk control
  543. │40:78│4 bytes│ timeout value for LPT1,LPT2,LPT3,LPT4
  544. │40:7C│4 bytes│ timeout value for COM1,COM2,COM3,COM4 (0-0FFh secs, default 1)
  545. │40:80│  word │ pointer to start of circular keyboard buffer, default 03:1E
  546. │40:82│  word │ pointer to end of circular keyboard buffer, default 03:3E
  547. └─────┴───────┤ note: early Zenith Z183 BIOS set these pointers to zero and
  548. ┌─────┬───────┤       ignored them.
  549. │40:84│  .... │ Video Control Data Area 2, 0040:0084 through 0040:008A
  550. │40:84│  byte │ rows on the screen minus 1 (EGA only)
  551. │40:84│  byte │ PCjr interrupt flag; timer channel 0  (used by POST)
  552. │40:85│  word │ bytes per character (EGA only)
  553. │40:85│2 bytes│ (PCjr only) typamatic character to repeat
  554. │40:86│2 bytes│ (PCjr only) typamatic initial delay
  555. │40:87│  byte │ mode options (EGA only)
  556. └─────┴───────┤ bit 0   0   cursor emulation in effect
  557.               │         1   no cursor emulation
  558.               │     1   0   EGA is connected to a color display
  559.               │         1   EGA is connected to monochrome TTL display
  560.               │     2   0   wait for vertical retrace (CGA active)
  561.               │         1   don't wait for vertical retrace (EGA or MDA active)
  562.               │     3   0   EGA is the active display,
  563.               │         1   "other" display is active.
  564.               │     4       reserved
  565.               │     5,6     EGA memory size
  566.               │             0,0   64k
  567.               │             0,1   128k
  568.               │             1,0   192k
  569.               │             1,1   256k
  570.               │     7   0   don't clear screen on mode changes
  571.               │         1   if the last "set mode" specified not to clear the
  572.               │             video buffer
  573.               │ mode combinations:
  574.               │ bit3  bit1     Meaning
  575.               │   0     0   EGA is active display and is color
  576.               │   0     1   EGA is active display and is monochrome
  577.               │   1     0   EGA is not active, a mono card is active
  578. ┌─────┬───────┤   1     1   EGA is not active, a CGA is active
  579. │40:87│  byte │ (PCjr only) current Fn key code
  580. ├─────┼───────┤             80h bit indicates make/break key code?
  581. │40:88│  byte │ feature bits and switches (EGA only) 0=on, 1=off
  582. └─────┴───────┤ bit 0   switch 1
  583.               │     1   switch 2
  584.               │     2   switch 3
  585.               │     3   switch 4
  586. ┌─────┬───────┤     4-7 feature bits
  587. │40:88│  byte │ (PCjr only) special keyboard status byte
  588. └─────┴───────┤ bit 7 function flag      3 typamatic (0=enable,1=disable)
  589.               │     6 Fn-B break         2 typamatic speed (0=slow,1=fast)
  590.               │     5 Fn pressed         1 extra delay bef.typamatic (0=enable)
  591. ┌─────┬───────┤     4 Fn lock            0 write char, typamatic delay elapsed
  592. │40:89│  byte │ (PCjr) current value of 6845 reg 2 (horizontal synch) used by
  593. └─────┴───────┤ ctrl-alt-cursor screen positioning routine in ROM
  594.               │  (VGA)
  595.               │ bit 0       reserved
  596.               │     1       video summing enabled
  597.               │     2   0   for color monitor attached
  598.               │         1   for mono monitor
  599.               │     3   0   for default palette loading enabled
  600.               │     4   0   for 8x8 text font
  601.               │         1   for 8x16 text font
  602. ┌─────┬───────┤     5-7     reserved
  603. │40:8A│  byte │ (PCjr) CRT/CPU Page Register Image, default 3Fh
  604. └─────┴───────┤ (VGA)  Display Combination Code Index. This is the value
  605.               │  set/returned by function 1Ah of the Video BIOS. This byte
  606.               │  contains an index into the ROM BIOS Display Combination Code
  607.               │  table, which is a list of byte pairs that specify valid
  608.               │  combinations of one or two video subsystems. Video subsystems
  609.               │  are designated by the following values:
  610.               │  00h     no display
  611.               │  01h     MDA with monochrome display
  612.               │  02h     CGA with color display
  613.               │  03h     reserved
  614.               │  04h     EGA with color display
  615.               │  05h     EGA with monochrome display
  616.               │  06h     Professional Graphics Adapter
  617.               │  07h     VGA with analog monochrome display
  618.               │  08h     VGA with analog color display
  619.               │  09h     reserved
  620.               │  0Ah     MCGA with digital color display
  621.               │  0Bh     MCGA with analog monochrome display
  622.               │  0Ch     MCGA with analog color display
  623. ┌─────┬───────┤  0FFh    unrecognized video subsystem
  624. │40:8B│  byte │ last diskette data rate selected
  625. └─────┴───────┤ bit 7,6 starting data transfer rate to use
  626.               │         0,0      500 kb/sec
  627.               │         0,1      300 kb/sec
  628.               │         1,0      250 kb/sec
  629.               │         1,1      reserved
  630.               │     5,4 last step rate selected
  631.               │     3   ending data transfer rate to use
  632.               │     2   reserved
  633.               │     1   reserved
  634.               │     0   1  combination floppy/fixed disk controller detected
  635.               │         0  XT floppy only controller (for 360kb drive) detected
  636.               │                Data Transfer Rates
  637.               │       Kbits/sec     Media   Drive   Sectors/Track
  638.               │         250         360k    360k        9
  639.               │         300         360k    1.2M        9
  640.               │         500         1.2M    1.2M       15
  641.               │         250         720k    720k        9
  642.               │         250         720k    1.4M        9
  643. ┌─────┬───────┤         500         1.4M    1.4M       18
  644. │40:8C│  byte │ hard disk status returned by controller
  645. │40:8D│  byte │ hard disk error returned by controller
  646. │40:8E│  byte │ hard disk interrupt (bit 7=working interrupt)
  647. │40:8F│  byte │ combo_card - status of drives 0 and 1
  648. └─────┴───────┤ bit 7   reserved
  649.               │     6   drive type determined for drive 1
  650.               │     5   drive multiple data rate capability for drive 1
  651.               │         0       no multiple data rate
  652.               │         1       multiple data rate
  653.               │     4   1 then drive 1 has 80 tracks
  654.               │         0 then drive 1 has 40 tracks
  655.               │     3   reserved
  656.               │     2   drive type determined for drive 0
  657.               │     1   drive multiple data rate capability for drive 0
  658.               │         0       no multiple data rate
  659.               │         1       multiple data rate
  660.               │     0   1       the drive 0 has 80 tracks
  661. ┌─────┬───────┤         0       the drive 0 has 40 tracks
  662. │40:90│4 bytes│ media state drive 0, 1, 2, 3
  663. └─────┴───────┤ floppy_media_state
  664.               │ bit 7,6 Data transfer rate
  665.               │         00 - 500 K/sec
  666.               │         01 - 300 K/sec
  667.               │         10 - 250 K/sec
  668.               │         11 - reserved
  669.               │     5   double stepping required
  670.               │     4   media/drive determined
  671.               │     3   reserved
  672.               │     2-0 present state
  673.               │         000  360k in 360k unestablished
  674.               │         001  360k in 1.2M unestablished
  675.               │         010  1.2M in 1.2M unestablished
  676.               │         011  360k in 360k established
  677.               │         100  360k in 1.2M established
  678.               │         101  1.2M in 1.2M established
  679.               │         110  reserved
  680. ┌─────┬───────┤         111  none of the above
  681. │40:94│2 bytes│ track currently seeked to drive 0, 1
  682. │40:96│  byte │ keyboard flag byte 3 (see int 9h)
  683. │40:97│  byte │ keyboard flag byte 2 (see int 9h)
  684. │40:98│ dword │ segment:offset pointer to users wait flag
  685. │40:9C│ dword │ users timeout value in microseconds
  686. │40:A0│  byte │ real time clock wait function in use
  687. └─────┴───────┤ bits 7    wait time elapsed and posted flag
  688.               │      6-1  reserved
  689. ┌─────┬───────┤      0    int 15h, function 86h (WAIT) has occurred
  690. │40:A1│  byte │ LAN A DMA channel flags
  691. │40:A2│2 bytes│ status LAN A 0,1
  692. │40:A4│ dword │ saved hard disk interrupt vector
  693. │40:A8│ dword │ SAVE_PTR: EGA pointer to table of 7 parameters in segment:
  694. └─────┴───────┤           offset format. Format of table:
  695.               │ D_1 dword   pointer to 1472 byte table of 64 video parameters
  696.               │ D_2 dword   reserved
  697.               │ D_3 dword   reserved
  698.               │ D_4 dword   reserved
  699.               │ D_5 dword   reserved for future use
  700.               │ D_6 dword   reserved for future use
  701. ┌─────┬───────┤ D_7 dword   reserved for future use
  702. │40:B0│2 words│ international support                   (Tandy 1000 TX)
  703. │40:B4│  byte │ keyboard NMI control flags              (Convertible)
  704. │40:B4│  byte │ monochrome monitor hookup detect        (Tandy 1000 TX)
  705. │     │       │ 00h not present   0FFh  present
  706. │40:B5│ dword │ keyboard break pending flags            (Convertible)
  707. │40:B5│  byte │ extended equipment detect  (5 bits)     (Tandy 1000 TX)
  708. └─────┴───────┤ bit 0 = 0   drive A is 5¼
  709.               │         1   drive A is 3½
  710.               │     1 = 0   drive A is 5¼
  711.               │         1   drive A is 3½
  712.               │     2 = 0   Tandy 1000 keyboard layout
  713.               │         1   IBM keyboard layout
  714.               │     3 = 0   CPU slow mode
  715.               │         1   CPU fast mode
  716.               │     4 = 0   internal color video support enabled
  717.               │         1   internal color video support disabled, external
  718.               │             video enabled (chg from mb'd to expansion card)
  719.               │     5 = 0   no external monochrome video installed
  720. ┌─────┬───────┤         1   external monochrome video installed
  721. │40:B6│  byte │ extended equipment detect  (1 bit)      (Tandy 1000 TX)
  722. └─────┴───────┤ bit 0 = 0   drive C is 5¼
  723. ┌─────┬───────┤         1   drive C is 3½
  724. │40:B9│  byte │ port 60 single byte queue               (Convertible)
  725. │40:BA│  byte │ scan code of last key                   (Convertible)
  726. │40:BB│  byte │ pointer to NMI buffer head              (Convertible)
  727. │40:BC│  byte │ pointer to NMI buffer tail              (Convertible)
  728. │40:BD│16bytes│ NMI scan code buffer                    (Convertible)
  729. │40:CE│  word │ day counter                             (Convertible and after)
  730. │  to │ -04:8F│               end of BIOS Data Area
  731. ├─────┴───────┴────────────────────────────────────────────────────────────────
  732. │ ** End of BIOS Data Area **
  733. ├─────┬───────┬────────────────────────────────────────────────────────────────
  734. │40:90│-40:EF │ reserved by IBM
  735. │40:F0│16bytes│ Inter-Application Communications Area (for use by applications
  736. │40:FF│       │ to transfer data or parameters to each other)
  737. └─────┴───────┤ 1) Used by Turbo Power's FMARK (mark memory for TSRs).
  738.               │ 2) Used by Norton Utilities' TimeMark to store the time.
  739.               │ 3) Used by BRIEF editor.
  740. ┌─────┬───────┤
  741. │50:00│ byte  │ DOS print screen status flag
  742. └─────┴───────┤        00h    not active or successful completion
  743.               │        01h    print screen in progress
  744. ┌─────┬───────┤        0FFh   error during print screen operation
  745. │50:01│       │ Used by BASIC
  746. │50:02-03     │ PCjr POST and diagnostics work area
  747. │50:04│  byte │ Single drive mode status byte - not used by AT&T DOS 2.11!
  748. └─────┴───────┤         00     logical drive A was last active
  749. ┌─────────────┤         01     logical drive B was last active
  750. │50:05-0E     │ PCjr POST and diagnostics work area
  751. │50:0F│       │ BASIC: SHELL flag (set to 02h if there is a current SHELL)
  752. │50:10│  word │ BASIC: segment address storage (set with DEF SEG)
  753. │50:12│4 bytes│ BASIC: int 1Ch clock interrupt vector segment:offset storage
  754. │50:16│4 bytes│ BASIC: int 23h ctrl-break interrupt segment:offset storage
  755. │50:1A│4 bytes│ BASIC: int 24h disk error int vector segment:offset storage
  756. │50:1B-1F     │ Used by BASIC for dynamic storage
  757. │50:20-21     │ Used by DOS for dynamic storage
  758. │50:22-2C     │ Used by DOS for diskette parameter table. See int 1Eh for values
  759. └─────┴───────┤ In DOS 1.0 this is located in the ROM BIOS, but in DOS 1.1 and
  760.               │ subsequent it is a part of DOS located at 05:22. The first byte
  761.               │ (out of eleven) of the Disk Parameter contains the hexadecimal
  762.               │ value CF in DOS 1.0 and DF in DOS 1.1 and later.
  763.               │ DOS 1.0   24ms
  764. ┌─────────────┤ DOS 1.1   26ms
  765. │50:30-33     │ Used by MODE command
  766. │50:81│       │ number of floppies installed in the system?
  767. │50:82│       │ first hard disk drive?
  768. │50:83│       │ last hard disk drive?
  769. │50:34-FF     │ Unknown - Reserved for DOS
  770. └─────────────┴─────────────────────────────────────────────────────────────────
  771.  
  772.  
  773.  
  774. Absolute Addresses .................................................... 2**6
  775.  
  776. 0008:0047 IO.SYS or IBMBIO.COM IRET instruction. This is the dummy routine that
  777.           interrupts 01h, 03h, and 0Fh are initialized to during POST.
  778. C000:001E EGA BIOS signature (the letters IBM)
  779. F000:FA6E table of characters 00h-7Fh used by int 10h video BIOS
  780.           The first 128 characters are stored here and each occupies 8 bytes.
  781.           The high bit ones are somewhere on the video adapter card.
  782. F000:FFF5 BIOS release date
  783. F000:FFFE PC model identification
  784.  
  785.      ┌─────────────────────────────────────────────────────────────────────┐
  786.      │ ROM BIOS    ┌ model byte                                            │
  787.      │ copyright   │    ┌ submodel byte          machine                   │
  788.      │   date      │    │    ┌ revision                                    │
  789.      ├──────────┼────┼────┼────┼───────────────────────────────────────────┤
  790.      │          │ 00 │ 00 │ 00 │ AT&T 6300, Olivetti PC                    │
  791.      │ 09/02/86 │ FA │ 00 │ 00 │ PS/2 Model 30                             │
  792.      │ 01/10/86 │ FB │ 00 │ 00 │ XT-2 (early)                              │
  793.      │ 01/10/86 │ FB │ 00 │ 01 │ XT Model 089                              │
  794.      │ 05/09/86 │ FB │ 01 │ 02 │ XT-2 (revised)                            │
  795.      │ 01/10/84 │ FC │ -- │ -- │ AT Model 099 (original)                   │
  796.      │ 06/10/85 │ FC │ 00 │ 01 │ AT Model 239 6mHz      (6.6 max governor) │
  797.      │ 11/15/85 │ FC │ 01 │ 00 │ AT Model 339, 339 8mHz (8.6 max governor) │
  798.      │          │ FC │ 01 │ 00 │ Compaq 386/16                             │
  799.      │          │ FC │ 01 │ 03 │ some Phoenix 386 BIOS                     │
  800.      │          │ FC │ 01 │ 81 │ some Phoenix 386 BIOS                     │
  801.      │ 04/21/86 │ FC │ 02 │ 00 │ XT/286                                    │
  802.      │ 02/13/87 │ FC │ 04 │ 00 │ PS/2 Model 50                             │
  803.      │ 02/13/87 │ FC │ 05 │ 00 │ PS/2 Model 60                             │
  804.      │          │ FC │ 00 │    │ 7531/2 Industrial AT                      │
  805.      │          │ FC │ 06 │    │ 7552 "Gearbox"                            │
  806.      │ 04/18/88 │ FC │ 04 │ 03 │ PS/2 50Z                                  │
  807.      │ 01/24/90 │ FC │ 01 │ 00 │ Compaq Deskpro 80386/25e                  │
  808.      │ 10/02/89 │ FC │ 02 │ 00 │ Compaq Deskpro 386s, 386SX, 16mHz         │
  809.      │ 06/01/83 │ FD │ -- │ -- │ PCjr                                      │
  810.      │ 11/08/82 │ FE │ -- │ -- │ XT, Portable PC, XT/370, 3270PC           │
  811.      │ 04/24/81 │ FF │ -- │ -- │ PC-0             (16k motherboard)        │
  812.      │ 10/19/81 │ FF │ -- │ -- │ PC-1             (64k motherboard)        │
  813.      │ 08/16/82 │ FF │ -- │ -- │ PC, XT, XT/370   (256k motherboard)       │
  814.      │ 10/27/82 │ FF │ -- │ -- │ PC, XT, XT/370   (256k motherboard)       │
  815.      │   ? 1987 │ F8 │ 00 │ 00 │ PS/2 Model 80                             │
  816.      │  3/30/87 │ F8 │ 00 │ 00 │ PS/2 Model 80-041  16mHz                  │
  817.      │ 08/28/87 │ F8 │ ?? │ ?? │ PS/2 Model 80-071  16mHz                  │
  818.      │   ? 1987 │ F8 │ 01 │ 00 │ PS/2 Model 80      20mHz                  │
  819.      │ 09/17/87 │ F8 │ 01 │ 01 │ PS/2 Model 80-111  20mHz                  │
  820.      │        ? │ F8 │ 04 │  ? │ PS/2 Model 70-121                         │
  821.      │ 01/18/89 │ F8 │ 0B │ 00 │  PS/2 Model 70 Portable                   │
  822.      │ 04/11/88 │ F8 │ 09 │ 02 │  PS/2 Model 70 desktop                    │
  823.      │ 02/20/89 │ F8 │ 0D │    │  PS/2 Model 70-A21                        │
  824.      │ 09/13/85 │ F9 │ 00 │ 00 │ Convertible                               │
  825.      │          │ 2D │ -- │ -- │ Compaq PC        (4.77mHz original)       │
  826.      │          │ 9A │ -- │ -- │ Compaq Plus      (XT compatible)          │
  827.      └──────────┴────┴────┴────┴───────────────────────────────────────────┘
  828.  
  829.  
  830.  
  831. The IBM PC System Interrupts (Overview) ............................... 2**7
  832.  
  833.  The interrupt table is stored in the very lowest location in memory, starting
  834. at 0000:0000h. The locations are offset from segment 0, i.e. location 0000h has
  835. the address for int 0, etc. The table is 1024 bytes in length and contains 256
  836. four byte vectors from 00h to 0FFh. Each address' location in memory can be
  837. found by multiplying the interrupt number by 4. For example, int 7 could be
  838. found by (7x4=28) or 1Bh (0000:001Bh).
  839.  
  840.  These interrupt vectors normally point to ROM tables or are taken over by DOS
  841. when an application is run. Some applications revector these interrupts to
  842. their own code to change the way the system responds to the user. DOS provides
  843. int 21h function 25h to change interrupts from a high level; altering the
  844. interrupt vector table directly is not recommended, nor would it really get
  845. you anywhere.
  846.  
  847.  
  848. Quick Chart of Interrupts 00h-0FFh .................................... 2**8
  849.  
  850. ┌─────────────────────┬────────────────────────────────────────────────────────┐
  851. │  Interrupt Address  │                                                        │
  852. ├───────┬───────┬─────┘                        Function                        │
  853. │ Number│ (Hex) │ Type                                                         │
  854. ├───────┼───────┼─────┬────────────────────────────────────────────────────────┤
  855. │   0   │ 00-03 │ CPU │  Divide by Zero                                        │
  856. ├───────┼───────┼─────┼────────────────────────────────────────────────────────┤
  857. │   1   │ 04-07 │ CPU │  Single Step                                           │
  858. ├───────┼───────┼─────┼────────────────────────────────────────────────────────┤
  859. │   2   │ 08-0B │ CPU │  Nonmaskable                                           │
  860. ├───────┼───────┼─────┼────────────────────────────────────────────────────────┤
  861. │   3   │ 0C-0F │ CPU │  Breakpoint                                            │
  862. ├───────┼───────┼─────┼────────────────────────────────────────────────────────┤
  863. │   4   │ 10-13 │ CPU │  Overflow                                              │
  864. ├───────┼───────┼─────┼────────────────────────────────────────────────────────┤
  865. │   5   │ 14-17 │ BIOS│  Print Screen                                          │
  866. ├───────┼───────┼─────┼────────────────────────────────────────────────────────┤
  867. │   6   │ 18-1B │ hdw │  Reserved                                              │
  868. ├───────┼───────┼─────┼────────────────────────────────────────────────────────┤
  869. │   7   │ 1C-1F │ hdw │  Reserved                                              │
  870. ├───────┼───────┼─────┼────────────────────────────────────────────────────────┤
  871. │   8   │ 20-23 │ hdw │  Time of Day                                           │
  872. ├───────┼───────┼─────┼────────────────────────────────────────────────────────┤
  873. │   9   │ 24-27 │ hdw │  Keyboard                                              │
  874. ├───────┼───────┼─────┼────────────────────────────────────────────────────────┤
  875. │   A   │ 28-2B │ hdw │  Reserved                                              │
  876. ├───────┼───────┼─────┼────────────────────────────────────────────────────────┤
  877. │   B   │ 2C-2F │ hdw │  Communications (8259)                                 │
  878. ├───────┼───────┼─────┼────────────────────────────────────────────────────────┤
  879. │   C   │ 30-33 │ hdw │  Communications                                        │
  880. ├───────┼───────┼─────┼────────────────────────────────────────────────────────┤
  881. │   D   │ 34-37 │ hdw │  Disk                                                  │
  882. ├───────┼───────┼─────┼────────────────────────────────────────────────────────┤
  883. │   E   │ 38-3B │ hdw │  Diskette                                              │
  884. ├───────┼───────┼─────┼────────────────────────────────────────────────────────┤
  885. │   F   │ 3C-3F │ hdw │  Printer                                               │
  886. ├───────┼───────┼─────┼────────────────────────────────────────────────────────┤
  887. │   10  │ 40-43 │ BIOS│  Video                                                 │
  888. ├───────┼───────┼─────┼────────────────────────────────────────────────────────┤
  889. │   11  │ 44-47 │ BIOS│  Equipment Check                                       │
  890. ├───────┼───────┼─────┼────────────────────────────────────────────────────────┤
  891. │   12  │ 48-4B │ BIOS│  Memory                                                │
  892. ├───────┼───────┼─────┼────────────────────────────────────────────────────────┤
  893. │   13  │ 4C-4F │ BIOS│  Diskette/Disk                                         │
  894. ├───────┼───────┼─────┼────────────────────────────────────────────────────────┤
  895. │   14  │ 50-53 │ BIOS│  Serial Communications                                 │
  896. ├───────┼───────┼─────┼────────────────────────────────────────────────────────┤
  897. │   15  │ 54-57 │ BIOS│  Cassette, System Services                             │
  898. ├───────┼───────┼─────┼────────────────────────────────────────────────────────┤
  899. │   16  │ 58-5B │ BIOS│  Keyboard                                              │
  900. ├───────┼───────┼─────┼────────────────────────────────────────────────────────┤
  901. │   17  │ 5C-5F │ BIOS│  Parallel Printer                                      │
  902. ├───────┼───────┼─────┼────────────────────────────────────────────────────────┤
  903. │   18  │ 60-63 │ BIOS│  ROM BASIC Loader                                      │
  904. ├───────┼───────┼─────┼────────────────────────────────────────────────────────┤
  905. │   19  │ 64-67 │ BIOS│  Bootstrap Loader                                      │
  906. ├───────┼───────┼─────┼────────────────────────────────────────────────────────┤
  907. │   1A  │ 68-6B │ BIOS│  Time of Day                                           │
  908. ├───────┼───────┼─────┼────────────────────────────────────────────────────────┤
  909. │   1B  │ 6C-6F │ BIOS│  Keyboard Break                                        │
  910. ├───────┼───────┼─────┼────────────────────────────────────────────────────────┤
  911. │   1C  │ 70-73 │ BIOS│  Timer Tick                                            │
  912. ├───────┼───────┼─────┼────────────────────────────────────────────────────────┤
  913. │   1D  │ 74-77 │ BIOS│  Video Initialization                                  │
  914. ├───────┼───────┼─────┼────────────────────────────────────────────────────────┤
  915. │   1E  │ 78-7B │ BIOS│  Diskette Parameters                                   │
  916. ├───────┼───────┼─────┼────────────────────────────────────────────────────────┤
  917. │   1F  │ 7C-7F │ BIOS│  Video Graphics Characters, second set                 │
  918. ├───────┼───────┼─────┼────────────────────────────────────────────────────────┤
  919. │   20  │ 80-83 │ DOS │  General Program Termination                           │
  920. ├───────┼───────┼─────┼────────────────────────────────────────────────────────┤
  921. │   21  │ 84-87 │ DOS │  DOS Services Function Request                         │
  922. ├───────┼───────┼─────┼────────────────────────────────────────────────────────┤
  923. │   22  │ 88-8B │ DOS │  Called Program Termination Address                    │
  924. ├───────┼───────┼─────┼────────────────────────────────────────────────────────┤
  925. │   23  │ 8C-8F │ DOS │  Control Break Termination Address                     │
  926. ├───────┼───────┼─────┼────────────────────────────────────────────────────────┤
  927. │   24  │ 90-93 │ DOS │  Critical Error Handler                                │
  928. ├───────┼───────┼─────┼────────────────────────────────────────────────────────┤
  929. │   25  │ 94-97 │ DOS │  Absolute Disk Read                                    │
  930. ├───────┼───────┼─────┼────────────────────────────────────────────────────────┤
  931. │   26  │ 98-9B │ DOS │  Absolute Disk Write                                   │
  932. ├───────┼───────┼─────┼────────────────────────────────────────────────────────┤
  933. │   27  │ 9C-9F │ DOS │  Terminate and Stay Resident                           │
  934. ├───────┼───────┼─────┼────────────────────────────────────────────────────────┤
  935. │ 28-3F │ A0-FF │ DOS │  Reserved for DOS                                      │
  936. └───────┴───────┴─────┼────────────────────────────────────────────────────────┤
  937.                       │ *29h   Fast Screen Write                               │
  938.                       │ *2Ah   Microsoft Networks - Session Layer Interrupt    │
  939.                       │  2Fh   Multiplex Interrupt                             │
  940.                       │ *30h   Far jump instruction for CP/M-style calls       │
  941.                       │  33h   Used by Microsoft Mouse Driver                  │
  942. ┌───────┬───────┬─────┼────────────────────────────────────────────────────────┤
  943. │ 40-43 │100-115│ BIOS│  Reserved for BIOS                                     │
  944. └───────┴───────┴─────┼────────────────────────────────────────────────────────┤
  945.                       │  40h   Hard Disk BIOS                                  │
  946.                       │  41h   Hard Disk Parameters  (except PC1)              │
  947.                       │  42h   Pointer to screen BIOS entry  (EGA, VGA, PS/2)  │
  948.                       │  43h   Pointer to EGA initialization parameter table   │
  949. ┌───────┬───────┬─────┼────────────────────────────────────────────────────────┤
  950. │   44  │116-119│ BIOS│  First 128 Graphics Characters                         │
  951. ├───────┼───────┼─────┼────────────────────────────────────────────────────────┤
  952. │ 45-47 │120-131│ BIOS│  Reserved for BIOS                                     │
  953. └───────┴───────┴─────┼────────────────────────────────────────────────────────┤
  954.                       │  45h   Reserved by IBM  (not initialized)              │
  955.                       │  46h   Pointer to hard disk 2 params (AT, PS/2)        │
  956.                       │  47h   Reserved by IBM  (not initialized)              │
  957. ┌───────┬───────┬─────┼────────────────────────────────────────────────────────┤
  958. │   48  │132-135│ BIOS│  PCjr Cordless Keyboard Translation                    │
  959. ├───────┼───────┼─────┼────────────────────────────────────────────────────────┤
  960. │   49  │136-139│ BIOS│  PCjr Non-Keyboard Scancode Translation Table          │
  961. └───────┴───────┴─────┼────────────────────────────────────────────────────────┤
  962.                       │  4Ah   Real-Time Clock Alarm (Convertible, PS/2)       │
  963. ┌───────┬───────┬─────┼────────────────────────────────────────────────────────┤
  964. │ 50-5F │140-17F│ BIOS│  Reserved for BIOS                                     │
  965. └───────┴───────┴─────┼────────────────────────────────────────────────────────┤
  966.                       │  5Ah   Cluster Adapter BIOS entry address              │
  967.                       │ *5Bh   IBM  (cluster adapter?)                         │
  968.                       │  5Ch   NETBIOS interface entry port                    │
  969. ┌───────┬───────┬─────┴────────────────────────────────────────────────────────┤
  970. │ 60-67 │180-19F│  User Program Interrupts (availible for general use)         │
  971. └───────┴───────┴─────┬────────────────────────────────────────────────────────┤
  972.                       │  60h   10-Net Network                                  │
  973.                       │  67h   Used by LIM & AQA EMS, EEMS                     │
  974. ┌───────┬───────┬─────┴────────────────────────────────────────────────────────┤
  975. │ 68-7F │1A0-1FF│  Reserved by IBM                                             │
  976. └───────┴───────┴─────┬────────────────────────────────────────────────────────┤
  977.                       │  6Ch   System Resume Vector (Convertible)              │
  978.                       │  6Fh   some Novell and 10-Net API functions            │
  979.                       │  70h   IRQ 8, Real Time Clock Interrupt (AT, PS/2)     │
  980.                       │  71h   IRQ 9, LAN Adapter 1                            │
  981.                       │  72h   IRQ 10  (AT, XT/286, PS/2)  Reserved            │
  982.                       │  73h   IRQ 11  (AT, XT/286, PS/2)  Reserved            │
  983.                       │  74h   IRQ 12  Mouse Interrupt (PS/2)                  │
  984.                       │  75h   IRQ 13, Coprocessor Error                       │
  985.                       │  76h   IRQ 14, Hard Disk Controller (AT, PS/2)         │
  986.                       │  77h   IRQ 15 (AT, XT/286, PS/2)  Reserved             │
  987.                       │  7Ch   IBM REXX88PC command language                   │
  988. ┌───────┬───────┬─────┴────────────────────────────────────────────────────────┤
  989. │ 80-85 │200-217│  ROM BASIC                                                   │
  990. ├───────┼───────┼──────────────────────────────────────────────────────────────┤
  991. │ 86-F0 │218-3C3│  Used by BASIC Interpreter When BASIC is running             │
  992. ├───────┼───────┼──────────────────────────────────────────────────────────────┤
  993. │ F1-FF │3C4-3FF│  Reserved by IBM                                             │
  994. └───────┴───────┴──────┬───────────────────────────────────────────────────────┤
  995.                        │ *0F8h  Set Shell Interrupt (OEM)                      │
  996.                        │ *0F9h  OEM SHELL service codes                        │
  997.                        └───────────────────────────────────────────────────────┘
  998.  
  999.  
  1000.  
  1001. The IBM-PC System Interrupts (in detail) .............................. 2**9
  1002.  
  1003. ┌─────────────────────────────────────────────────────────────────────────────┐
  1004. │Interrupt  00h Divide by Zero                                                │
  1005. └─────────────────────────────────────────────────────────────────────────────┘
  1006. (0:0000h) (processor error). Automatically called at end of DIV or IDIV
  1007.           operation that results in error. Normally set by DOS to display an
  1008.           error message and abort the program.
  1009.  
  1010. note    On an 8086/8088, the return address points to the following instruction
  1011.         On an 80286/80386, the return address points to the divide instruction
  1012.  
  1013.  
  1014. ┌─────────────────────────────────────────────────────────────────────────────┐
  1015. │Interrupt  01h Single step                                                   │
  1016. └─────────────────────────────────────────────────────────────────────────────┘
  1017. (0:0004h) Taken after every instruction when CPU Trap Flag indicates
  1018.           single-step mode (bit 8 of FLAGS is 1). This is what makes the "T"
  1019.           command of DEBUG work for single stepping. Is not generated after MOV
  1020.           to segment register or POP of segment register. (unless you have a
  1021.           very early 8088 with the microcode bug).
  1022.  
  1023.  
  1024. ┌─────────────────────────────────────────────────────────────────────────────┐
  1025. │Interrupt  02h Non-maskable interrupt                                        │
  1026. └─────────────────────────────────────────────────────────────────────────────┘
  1027. (0:0008h)       Vector not disabled via CLI. Generated by NMI signal in
  1028.                 hardware. This function is called in the event of a memory
  1029.                 parity error or may occur in the event of other hardware
  1030.                 problems or failures depending on the specific manufacturer's
  1031.                 hardware. Displays the appropriate error message and halts the
  1032.                 processor.
  1033.                  Some AT chip sets apparently use int 02h to signal I/O errors
  1034.                 as well as parity errors.
  1035.  
  1036.                 This signal has various uses:
  1037.         POST parity error:                  all except PCjr and Convertible
  1038.         80x87 coprocessor interrupt:        all except PCjr and Convertible
  1039.         Keyboard interrupt:                 PCjr, Convertible
  1040.         I/O channel check:                  Convertible, PS/2 50+
  1041.         Disk controller power-on request:   Convertible
  1042.         System suspend:                     Convertible
  1043.         Realtime clock:                     Convertible
  1044.         System watchdog timer:              PS/2 50+
  1045.         Timeout interrupt:                  PS/2 50+
  1046.         DMA timer time-out interrupt:       PS/2 50+
  1047.         Infrared keyboard link:             PCjr
  1048.  
  1049.  
  1050. ┌─────────────────────────────────────────────────────────────────────────────┐
  1051. │Interrupt  03h Breakpoint                                                    │
  1052. └─────────────────────────────────────────────────────────────────────────────┘
  1053. (0:000Ch)  Taken when CPU executes the 1-byte int 3 (0CCh). Similar to 8080's
  1054.  
  1055. (internal) RST instruction. Generally used to set breakpoints for DEBUG.
  1056.  
  1057. note 1)  Also used by Turbo Pascal versions 1,2,3 when {$U+} specified.
  1058.      2)  Int 3s are sometimes inserted by the Microsoft Linker in response to
  1059.          an unresolved symbol.
  1060.  
  1061.  
  1062. ┌─────────────────────────────────────────────────────────────────────────────┐
  1063. │Interrupt  04h Divide overflow                                               │
  1064. └─────────────────────────────────────────────────────────────────────────────┘
  1065. (0:0010h)  Generated by INTO instruction if OF flag is set. If flag is not set,
  1066.  
  1067. (internal) INTO is effectively a NOP. Used to trap any arithmetic errors when
  1068.            program is ready to handle them rather than immediately when they
  1069.            occur.
  1070.  
  1071.  
  1072. ┌─────────────────────────────────────────────────────────────────────────────┐
  1073. │Interrupt  05h Print Screen                                                  │
  1074. └─────────────────────────────────────────────────────────────────────────────┘
  1075. (0:0014h)  Service dumps the screen to the printer. Invoked by int 9 for shifted
  1076.            key 55 (PrtSc). Automatically called by keyboard scan when PrtSc key
  1077.            is pressed. Normally executes a routine to print the screen, but may
  1078.            call any routine that can safely be executed from inside the keyboard
  1079.            handler. Status and result byte are at address 0050:0000.
  1080.  
  1081. (internal) BOUND Check Failed (80286+)
  1082.            Generated by BOUND instruction when the value to be tested is less
  1083.            than the indicated lower bound or greater than the indicated upper
  1084.            bound.
  1085.  
  1086. entry   AH      05h
  1087. return  absolute address 50:0
  1088.         00h     print screen has not been called, or upon return from a call
  1089.                 there were no errors
  1090.         01h     print screen is already in progress
  1091.         0FFh    error encountered during printing
  1092. note 1) Uses BIOS services to read the screen.
  1093.      2) Output is directed to LPT1.
  1094.      3) Revectored into GRAPHICS.COM if GRAPHICS.COM is loaded.
  1095.      4) On the Tandy 1000TX this interrupt can be enabled or disabled across
  1096.         the expansion slots via a DIP switch.
  1097.  
  1098.  
  1099. ┌─────────────────────────────────────────────────────────────────────────────┐
  1100. │Interrupt  06h Reserved by IBM                                               │
  1101. └─────────────────────────────────────────────────────────────────────────────┘
  1102. (0:0018h)
  1103.         On the Tandy 1000TX this interrupt can be enabled or disabled across
  1104.         the expansion slots via a DIP switch.
  1105.  
  1106. (internal) Undefined Opcode (80286+)
  1107.  
  1108.  
  1109.  
  1110. ┌─────────────────────────────────────────────────────────────────────────────┐
  1111. │Interrupt  07h Reserved by IBM                                               │
  1112. └─────────────────────────────────────────────────────────────────────────────┘
  1113. (0:00C0h)
  1114.         On the Tandy 1000TX this interrupt can be enabled or disabled across
  1115.         the expansion slots via a DIP switch.
  1116.  
  1117. (internal) No Math Unit Available (80286+)
  1118.  
  1119. note    The 80286 and later can be programmed to generate an int 7 whenever
  1120.         an ESC instruction is encountered. This could be used to emulate an
  1121.         80x87 series coprocessor in software and be transparent to the
  1122.         application software. It could also be used to make a non-Intel
  1123.         floating point processor emulate an 80x87.
  1124.  
  1125.  
  1126.  
  1127. ┌─────────────────────────────────────────────────────────────────────────────┐
  1128. │Interrupt  08h Timer                                                         │
  1129. └─────────────────────────────────────────────────────────────────────────────┘
  1130. (0:0020h)  55ms timer "tick" issued 18.2 times per second.
  1131.  (IRQ0)    8259-1 Interrupt Controller
  1132.            Updates the system time at [0040:006C] (low word) and [0040:006E]
  1133.            (high word) and issues an int 1Ch (timer). (int 1Ch points to an
  1134.            IRET instruction unless changed by a resident program). The timer
  1135.            interrupt is given the highest maskable interrupt priority upon
  1136.            power up.
  1137.  
  1138. (internal) Double Fault (80286+ protected mode) Called when multiple exceptions
  1139.            occur on one instruction, or an exception occurs in an exception
  1140.            handler. If an exception occurs in the double fault handler, the CPU
  1141.            goes into SHUTDOWN mode (which circuitry in the PC/AT converts to a
  1142.            reset).
  1143.  
  1144. entry   AH      08h
  1145. return  absolute addresses:
  1146.         40:6C   number of interrupts since power on (4 bytes)
  1147.         40:70   number of days since power on       (1 byte)
  1148.         40:67   day counter on all products after AT
  1149.         40:40   motor control count - gets decremented and shuts off diskette
  1150.                 motor if zero
  1151.  
  1152.  
  1153.  
  1154. ┌─────────────────────────────────────────────────────────────────────────────┐
  1155. │Interrupt  09h Keyboard                                                      │
  1156. └─────────────────────────────────────────────────────────────────────────────┘
  1157. (0:0024h)  Taken whenever a key is pressed or released. This is normally a scan
  1158.  (IRQ1)    code, but may also be an ACK or NAK of a command on AT-type
  1159.            keyboards. The hardware provides the key pressed in a non-ASCII scan
  1160.            code format read at I/O port 60h. The servicer acknowledges receipt
  1161.            of the key by toggling bit 7 of port 61h. (Port 61h should be read
  1162.            first, then bit 7 ORed on, output to port 61h, then ANDed off, and
  1163.            resent to port 61h).
  1164.  
  1165.             The read key is decoded to yield an ASCII character, special
  1166.            function key (such as F1) or a control function like Left Shift Key.
  1167.            The converted ASCII character is placed into the next available
  1168.            position in the circular queue keyboard. It is put in the position
  1169.            indicated by queue tail when it will not cause the loss of earlier
  1170.            entered data. The queue head points to the oldest key pressed in the
  1171.            buffer which has not been removed from the queue (the normal process
  1172.            uses int 16h to remove keys from the queue and return the key value
  1173.            to the int 16h caller).
  1174.  
  1175.             The 16 word queue holds up to 16 keys. If the queue head equals the
  1176.             queue tail, the queue is empty. Valid keys in the queue comprise
  1177.             the upper byte scan code and the lower byte ASCII character. If the
  1178.             key pressed has no ASCII equivalent (i.e F1 to F12), the lower byte
  1179.             is zero.
  1180.  
  1181.              Toggle and shift keys are not placed in the buffer, but appear in
  1182.            the two status bytes at absolute addr. [0040:0017,18].
  1183.  
  1184.            Special key combinations will cause other events to occur:
  1185.            a) Ctrl-Alt_Del  -  Reset computer by jumping to power_on_reset
  1186.            b) Print screen  -  Call int_5_prn_scrn to print the current screen
  1187.            c) Ctrl-Break    -  Call int_1Bh control break key processor (DOS)
  1188.            d) Pause         -  Wait until an ASCII key is pressed, without
  1189.                                placing the key in the queue
  1190.  
  1191. (internal) Math Unit Protection Fault (80286+ protected mode)
  1192.  
  1193. entry   AH      09h
  1194. return  at absolute memory addresses:
  1195.         40:17   bit
  1196.                 0       right shift key depressed
  1197.                 1       left shift key depressed
  1198.                 2       control key depressed
  1199.                 3       alt key depressed
  1200.                 4       ScrollLock state has been toggled
  1201.                 5       NumLock state has been toggled
  1202.                 6       CapsLock state has been toggled
  1203.                 7       insert state is active
  1204.         40:18   bit
  1205.                 0       left control key depressed
  1206.                 1       left alt key depressed
  1207.                 2       SysReq key depressed
  1208.                 3       Pause key has been toggled
  1209.                 4       ScrollLock key is depressed
  1210.                 5       NumLock key is depressed
  1211.                 6       CapsLock key is depressed
  1212.                 7       Insert key is depressed
  1213.         40:96   bit
  1214.                 0       last code was the E1h hidden code
  1215.                 1       last code was the E0h hidden code
  1216.                 2       right control key down
  1217.                 3       right alt key down
  1218.                 4       101 key Enhanced keyboard installed
  1219.                 5       force NumLock if rd ID & kbx
  1220.                 6       last character was first ID character
  1221.                 7       doing a read ID (must be bit 0)
  1222.         40:97   bit
  1223.                 0       ScrollLock indicator
  1224.                 1       NumLock indicator
  1225.                 2       CapsLock indicator
  1226.                 3       circus system indicator
  1227.                 4       ACK received
  1228.                 5       resend received flag
  1229.                 6       mode indicator update
  1230.                 7       keyboard transmit error flag
  1231.         40:1E   keyboard buffer (20h bytes)
  1232.         40:1C   buffer tail pointer
  1233.         40:72   1234h if ctrl-alt-del pressed on keyboard
  1234.      AL   scan code
  1235. note 1) Int 05h invoked if PrtSc key pressed.
  1236.      2) Int 1Bh invoked if Ctrl-Break key sequence pressed.
  1237.      3) Int 15h, AH=85h invoked on AT and after if SysReq key is pressed.
  1238.      4) Int 15h, AH=4Fh invoked on machines after AT.
  1239.      5) Int 16h, BIOS keyboard functions, uses this interrupt.
  1240.  
  1241.  
  1242. ┌─────────────────────────────────────────────────────────────────────────────┐
  1243. │Interrupt  0Ah  EGA Vertical Retrace                                         │
  1244. └─────────────────────────────────────────────────────────────────────────────┘
  1245. (0:0028h)  used by EGA vertical retrace
  1246.  (IRQ2)    8259-1 Interrupt Controller
  1247. note 1) The TOPS and PCnet adapters use this IRQ line by default.
  1248.      2) On systems equipped with 2 interrupt controller chips (8259), IRQ 2
  1249.         is used to support the second interrupt controller. In this case,
  1250.         int 71h (IRQ 9) is used to replace IRQ 2. Hardware calls to int 71h
  1251.         are redirected to this interrupt to maintain compatibility.
  1252.      3) Many VGA boards to not use this interrupt.
  1253.  
  1254. (internal) Invalid Task State Segment (80286+ protected mode)
  1255.  
  1256.  
  1257.  
  1258. ┌─────────────────────────────────────────────────────────────────────────────┐
  1259. │Interrupt  0Bh  Communications Controller (serial port) hdw. entry           │
  1260. └─────────────────────────────────────────────────────────────────────────────┘
  1261. (0:002Ch)  Serial Port 2 (COM2) 8259-1
  1262.  (IRQ3)
  1263. note 1) IRQ 3 may be used by SDLC (synchronous data-link control) or
  1264.         bisynchronous communications cards instead of a serial port.
  1265.      2) The TOPS and PCnet adapters use this interrupt request line as an
  1266.         alternate.
  1267.      3) On PS/2s, COM2 through COM8 share this IRQ.
  1268.      4) For most serial boards, COM4 shares this IRQ.
  1269.      5) On the Commodore Amiga 2000 with the PC Bridge Board, this interrupt
  1270.         is used for communication between the Amiga system board and the
  1271.         Bridge Board. This was probably the lowest IRQ level they felt safe
  1272.         using, but limits the A2000's use of network cards, etc.
  1273.      6) This interrupt is used by part of the stack-switching code added
  1274.         to DOS 3.2 for use with Local Area Network adapters.
  1275.      7) The PS/2 puts COM3 through COM8 at port addresses above 3FFh (not
  1276.         properly decoded by older PCs) and has all of them sharing IRQ3.
  1277.  
  1278. (internal) Not Present (80286+ protected mode)
  1279.            Generated when loading a segment register if the segment descriptor
  1280.            indicates that the segment is not currently in memory. May be used
  1281.            to implement virtual memory.
  1282.  
  1283.  
  1284. ┌─────────────────────────────────────────────────────────────────────────────┐
  1285. │Interrupt  0Ch  Communications Controller (serial port) Hardware Entry       │
  1286. └─────────────────────────────────────────────────────────────────────────────┘
  1287. (0:0030h)  Serial Port 1 (COM1) or internal modem in PCjr or Convertible
  1288.  (IRQ4)    8259-1
  1289. note 1) IRQ 4 may be used by SDLC (synchronous data-link control) or
  1290.         bisynchronous communications cards instead of a serial port.
  1291.      2) On some PCs, this interrupt is shared by COM3.
  1292.      3) Tandy computers use IRQ4 instead of IRQ5 for the hard disk interrupt.
  1293.      4) Best performance of mice sometimes happens when they are configured
  1294.         for IRQ4 instead of IRQ3, since some mouse drivers may lock system
  1295.         interrupts for long periods.
  1296.  
  1297. (internal) Stack Fault (80286+ protected mode)
  1298.            Generated on stack overflow/underflow. Note that the 80286 will shut
  1299.            down in real mode if SP=1 before a push.
  1300.  
  1301.  
  1302. ┌─────────────────────────────────────────────────────────────────────────────┐
  1303. │Interrupt  0Dh  Hard Disk                                                    │
  1304. └─────────────────────────────────────────────────────────────────────────────┘
  1305. (0:0034h)  Miscelleneous uses
  1306.  (IRQ5)    8259-1
  1307. note 1) Various Tandy 1000 models may use this line for the 60Hhz RAM refresh
  1308.         or as "optional bus interrupt."
  1309.      2) Used by hard disk on IBM XT and most compatibles.
  1310.      3) LPT2 on AT, XT/286, and PS/2
  1311.      4) Dummy CRT vertical retrace on PCjr
  1312.  
  1313. (internal) General Protection Violation (80286+)
  1314.            Called in real mode when an instruction attempts to access a word
  1315.            operand located at offset 0FFFFh or a PUSH MEM or POP MEM
  1316.            instruction contains an invalid bit code in the second byte, or
  1317.            when an instruction exceeds the maximum length allowed (10 bytes
  1318.            for 80286, 15 bytes for 80386)
  1319.  
  1320.  
  1321. ┌─────────────────────────────────────────────────────────────────────────────┐
  1322. │Interrupt  0Eh  Diskette Interrupt                                           │
  1323. └─────────────────────────────────────────────────────────────────────────────┘
  1324. (0:0038h)  Generated by floppy controller on completion of an operation
  1325.  (IRQ6)    (sets bit 8 of 40:3E)
  1326.  
  1327. (internal) Page Fault (80386+ native mode)
  1328.  
  1329.  
  1330. ┌─────────────────────────────────────────────────────────────────────────────┐
  1331. │Interrupt  0Fh  Reserved by IBM                                              │
  1332. └─────────────────────────────────────────────────────────────────────────────┘
  1333. (0:003Ch)  IRQ7 used by 8259 PPI interrupt (LPT1, LPT2)
  1334.  (IRQ7)
  1335. note 1) Generated by the LPT1 printer adapter when printer becomes ready. Many
  1336.         printer adapters do not reliably generate this interrupt.
  1337.      2) This interrupt is normally avoided. If a bad interrupt occurs, it will
  1338.         vector to this spot (when caused by a misprogrammed 8259 PIC)
  1339.  
  1340.