home *** CD-ROM | disk | FTP | other *** search
/ The Unsorted BBS Collection / thegreatunsorted.tar / thegreatunsorted / programming / asm_programming / BIOS.REM < prev    next >
Text File  |  1993-04-27  |  81KB  |  1,686 lines

  1.  
  2.  
  3.                    ===========================================
  4.                        SOURCER REMARKS FILE - BIOS REMARKS
  5.                    ===========================================
  6.  
  7.  
  8.  :::::::::::::::::::::::::::::::: DATA REMARKS ::::::::::::::::::::::::::::::::
  9.  
  10.     --------- Data Remarks -----------  -------- comments ignored here --------
  11.  
  12. 001 █▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀█
  13.     █    PRIMARY BIOS DATA AREA     █
  14.     █▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄█
  15.     RS-232 port addresses                     rs232_1
  16. 002 Printer port addresses                    prn_1
  17. 003 Equipment installed info bits             equip_install
  18.      15  14  13   12   11  10   9   8
  19.      \    /      game  \       /
  20.      # of print  port  # of RS-232
  21.      ports 0-3   used   ports 0-4
  22.  
  23.      7   6    5    4    3   2   1   0
  24.      \   /    \    /    \   / Math  |
  25.      # of   video mode  RAM    uP  no
  26.      disk-  at boot up  00=16K    dsk
  27.      ettes  00=EGA/VGA  01=32K   driv
  28.       1-4   01=CGA-40   10=48K   if 0
  29.      if bit 10=CGA-80   11=64K
  30.      0 = 1  11=MDA-80   (old PCs)
  31.  
  32.     Note: bit 13=modem on PC lap-tops
  33.           bit 2=mouse on MCA & others
  34.       
  35. 004 Manufacturing Test Byte                   manufactr_test
  36.      bit 0 = 1 while in test mode
  37.      MCA systems use other bits
  38.        during POST operations
  39. 005 Base memory size 0-1Meg, 1K steps         main_ram_size
  40. 006 Manufacturing test error codes            error_codes
  41. 007 █▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀█
  42.     █         KEYBOARD DATA         █
  43.     █▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄█
  44.     Keyboard flag bits                        keybd_flags_1
  45.       7   6   5   4    3   2   1   0
  46.     ins- cap num scrl alt ctl lef rig
  47.     sert --toggles--- --shifts down--
  48.  
  49. 008 Keyboard flag bits                        keybd_flags_2
  50.        7     6     5     4     
  51.     insert  caps  num  scroll
  52.     ------now depressed------
  53.  
  54.        3     2     1     0
  55.      pause  sys   left right
  56.      lock request -alt-down-
  57.        
  58. 009 Alt & digit pad number buffr area         keybd_alt_num
  59. 00A Head ptr of circular key queue            keybd_q_head
  60.       empty if head ptr = tail ptr
  61. 00B Tail ptr of circular key queue            keybd_q_tail
  62.       empty if head ptr = tail ptr
  63. 00C 15 key queue for keyboard                 keybd_queue
  64. 00D                                           unused
  65. 00E █▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀█
  66.     █          DISK DATA            █
  67.     █▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄█
  68.      Recalibrate floppy drive bits             dsk_seek_stat
  69.         3       2       1       0
  70.      drive-3 drive-2 drive-1 drive-0
  71.  
  72.      bit 7 = interrupt flag
  73.      
  74. 00F Motor running status & disk write         dsk_motor_stat
  75.      bit 7=1 disk write in progress
  76.      bits 6&5 = drive selected 0 to 3
  77.         3       2       1       0
  78.      drive-3 drive-2 drive-1 drive-0
  79.      --------- 1=motor on-----------
  80.  
  81. 010 Motor timer, at 0, turn off motor         dsk_motor_tmr
  82. 011 Controller return code                    dsk_ret_code
  83.      00h = ok
  84.      01h = bad command or parameter
  85.      02h = can't find address mark
  86.      03h = can't write, protected dsk
  87.      04h = sector not found
  88.      08h = DMA overrun
  89.      09h = DMA attempt over 64K bound
  90.      10h = bad CRC on disk read
  91.      20h = controller failure
  92.      40h = seek failure
  93.      80h = timeout, no response
  94.  
  95. 012 Status bytes-disk controller chip         dsk_ctrl_stat
  96.      Note: 7 info bytes returned from
  97.      controller are saved here. Refer
  98.      to the NEC uPD 765 chip manual
  99.      for the specific info, depending
  100.      on the previous command issued.
  101. 013                                           unused
  102. 014 █▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀█
  103.     █          VIDEO DATA           █
  104.     █▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄█
  105.     Present display mode(see int 10h)         video_mode
  106. 015 Number of columns                         video_columns
  107. 016 Video buffer size in bytes                video_buf_size
  108.       Note: size may be rounded up to
  109.       the nearest 2K boundary.  For
  110.       example, 80x25 mode=4000 bytes,
  111.       but value may be 4096.
  112. 017 Video page offset of the active           video_pag_off
  113.       page, from start of current 
  114.       video segment.
  115. 018 Cursor position page 0                   video_cur_pos0
  116.       bits 15-8=row, bits 7-0=column
  117. 019 Cursor position page 1                   video_cur_pos1
  118.       bits 15-8=row, bits 7-0=column
  119. 01A Cursor position page 2                   video_cur_pos2
  120.       bits 15-8=row, bits 7-0=column
  121. 01B Cursor position page 3                   video_cur_pos3
  122.       bits 15-8=row, bits 7-0=column
  123. 01C Cursor position page 4                   video_cur_pos4
  124.       bits 15-8=row, bits 7-0=column
  125. 01D Cursor position page 5                   video_cur_pos5
  126.       bits 15-8=row, bits 7-0=column
  127. 01E Cursor position page 6                   video_cur_pos6
  128.       bits 15-8=row, bits 7-0=column
  129. 01F Cursor position page 7                   video_cur_pos7
  130.       bits 15-8=row, bits 7-0=column
  131.  
  132. 020 Active cursor, start & end lines         video_cur_mode
  133.       bits 12 to 8 for starting line
  134.       bits 4  to 0 for ending line
  135. 021 Present page                             video_page
  136. 022 Video controller base I/O address        video_port
  137. 023 Hardware mode register bits              video_mode_reg
  138. 024 Color set in CGA modes                   video_color
  139. 025 █▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀█
  140.     █         GENERAL DATA          █
  141.     █ Note: next 5 bytes also used  █
  142.     █    for cassette interface in  █
  143.     █    the original PC.           █
  144.     █▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄█
  145.     General use offset pointer               @gen_use_ptr
  146. 026 General use segment                      gen_use_seg
  147. 027 Unused interrupt occurred                gen_int_occurd
  148.       value holds the IRQ bit 7-0 of
  149.       the interrupt that occurred
  150. 028 Timer, low word, cnts every 55 ms        timer_low
  151. 029 Timer, high word                         timer_hi
  152. 02A Timer overflowed, set to 1 when          timer_rolled
  153.      more than 24 hours have elapsed
  154. 02B Bit 7 set if break key depressed         keybd_break
  155. 02C Boot (reset) type                        gen_warm_boot
  156.       1234h=warm boot, no memory test       
  157.       4321h=boot & save memory
  158.             (PS/2 with MCA only)
  159. 02D █▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀█
  160.     █        HARD DISK DATA         █
  161.     █▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄█
  162.     Hard disk status                         hdsk_status_1
  163.      00h = ok
  164.      01h = bad command or parameter
  165.      02h = can't find address mark
  166.      03h = can't write, protected dsk
  167.      04h = sector not found
  168.      05h = reset failure
  169.      07h = activity failure
  170.      08h = DMA overrun
  171.      09h = DMA attempt over 64K bound
  172.      0Ah = bad sector flag
  173.      0Bh = removed bad track
  174.      0Dh = wrong # of sectors, format
  175.      0Eh = removed control data addr
  176.             mark
  177.      0Fh = out of limit DMA
  178.             arbitration level
  179.      10h = bad CRC or ECC, disk read
  180.      11h = bad ECC corrected data
  181.      20h = controller failure
  182.      40h = seek failure
  183.      80h = timeout, no response
  184.      AAh = not ready
  185.      BBh = error occurred, undefined
  186.      CCh = write error, selected dsk
  187.      E0h = error register = 0
  188.      FFh = disk sense failure
  189.        
  190. 02E Number of hard disk drives               hdsk_count
  191. 02F Head control (XT only)                   hdsk_head_ctrl
  192. 030 Hard disk control port (XT only)         hdsk_ctrl_port
  193. 031 █▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀█
  194.     █ I/O PORT TIMER, KEYBOARD DATA █
  195.     █▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄█
  196.     Countdown timer waits for printer        prn_timeout_1
  197.       to respond (printer 1)
  198. 032 Countdown timer waits for printer        prn_timeout_2
  199.       to respond 
  200. 033 Countdown timer waits for RS-232         rs232_timout_1
  201.       port to respond (port 1)        
  202. 034 Countdown timer waits for RS-232         rs232_timout_2
  203.       port to respond                  
  204. 035 Ptr to beginning of keybd queue          @keybd_begin
  205. 036 Ptr to end of keyboard queue             @keybd_end
  206. 037 █▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀█
  207.     █  ADVANCED VIDEO DATA, EGA/VGA █
  208.     █▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄█
  209.     Rows of characters on display - 1        video_rows
  210. 038 Number of pixels per charactr * 8        video_pixels
  211. 039 Display adapter options                  video_options
  212.       bit 7 = clear RAM
  213.       bits 6,5 = memory on adapter
  214.                   00 - 64K
  215.                   01 - 128K
  216.                   10 - 192K
  217.                   11 - 256K
  218.       bit 4 = unused
  219.       bit 3 = 0 if EGA/VGA active
  220.       bit 2 = wait for display enable
  221.       bit 1 = 1 - mono monitor
  222.             = 0 - color monitor
  223.       bit 0 = 0 - handle cursor, CGA
  224. 03A Switch setting bits from adapter         video_switches
  225.       bits 7-4 = feature connector
  226.       bits 3-0 = option switches
  227. 03B Video save area 1-EGA/VGA control        video_1_save
  228.       bit 7 = 200 line mode
  229.       bits 6,5 = unused
  230.       bit 4 = 400 line mode
  231.       bit 3 = no palette load
  232.       bit 2 = mono monitor
  233.       bit 1 = gray scale
  234.       bit 0 = unused
  235. 03C Video save area 2                        video_2_save
  236. 03D █▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀█
  237.     █ OTHER FLOPPY & HARD DISK DATA █
  238.     █▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄█
  239.     Last data rate for diskette              dsk_data_rate
  240.      bits 7 & 6 = 00 for 500K bit/sec
  241.                 = 01 for 300K bit/sec
  242.                 = 10 for 250K bit/sec
  243.                 = 11 for 1M bit/sec
  244.      bits 5 & 4 = step rate
  245.     Rate at start of operation
  246.      bits 3 & 2 = 00 for 500K bit/sec
  247.                 = 01 for 300K bit/sec
  248.                 = 10 for 250K bit/sec
  249.                 = 11 for 1M bit/sec
  250. 03E Hard disk status                         hdsk_status_2
  251. 03F Hard disk error                          hdsk_error
  252. 040 When the hard disk controller's          hdsk_complete
  253.      task is complete, this byte is
  254.      set to FFh (from interrupt 76h)
  255. 041 Diskette controller information          dsk_options
  256.      bit 6 = 1 Drv 1 type determined
  257.          5 = 1 Drv 1 is multi-rate
  258.          4 = 1 Drv 1 change detect
  259.          2 = 1 Drv 0 type determined
  260.          1 = 1 Drv 0 is multi-rate
  261.          0 = 1 Drv 0 change detect
  262. 042 Media state for diskette drive 0         dsk_media_st0
  263.         7      6      5      4
  264.      data xfer rate  two   media
  265.       00=500K bit/s  step  known
  266.       01=300K bit/s
  267.       10=250K bit/s
  268.       11=1M bit/sec
  269.         3      2      1      0
  270.      unused  -----state of drive-----
  271.              bits floppy  drive state
  272.              000=  360K in 360K, ?
  273.              001=  360K in 1.2M, ?
  274.              010=  1.2M in 1.2M, ?
  275.              011=  360K in 360K, ok
  276.              100=  360K in 1.2M, ok
  277.              101=  1.2M in 1.2M, ok
  278.              111=  720K in 720K, ok
  279.                or 1.44M in 1.44M
  280.             (state not used for 2.88)
  281. 043 Media state for diskette drive 1         dsk_media_st1
  282.      (see dsk_media_st0)
  283. 044 Starting state for drive 0               dsk_start_st0
  284. 045 Starting state for drive 1               dsk_start_st1
  285. 046 Current track number for drive 0         dsk_track_0
  286. 047 Current track number for drive 1         dsk_track_1
  287. 048 █▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀█
  288.     █    ADVANCED KEYBOARD DATA     █
  289.     █▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄█
  290.     Special keyboard type and mode           keybd_flags_3
  291.      bit 7 Reading ID of keyboard
  292.          6 last char is 1st ID char
  293.          5 force num lock
  294.          4 101/102 key keyboard
  295.          3 right alt key down
  296.          2 right ctrl key down
  297.          1 E0h hidden code last
  298.          0 E1h hidden code last
  299.        
  300. 049 Keyboard Flags (advanced keybd)          keybd_flags_4
  301.       7      6       5     4  3 2 1 0
  302.     xmit   char   Resend  Ack   \   /
  303.     error was ID  Rec'd  Rec'd   LEDs
  304.  
  305. 04A █▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀█
  306.     █  REAL-TIME CLOCK & LAN DATA   █
  307.     █▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄█
  308.     Ptr offset to wait done flag             @timer_wait_off
  309. 04B Ptr segment to wait done flag            @timer_wait_seg
  310. 04C Timer low word, 1 microsecond clk        timer_clk_low
  311. 04D Timer high word                          timer_clk_hi
  312. 04E Timer flag 00h = post acknowledgd        timer_clk_flag
  313.                01h = busy
  314.                80h = posted
  315. 04F Local area network bytes (7)             lan_1
  316. 050                                          unused
  317. 051 █▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀█
  318.     █   MORE ADVANCED VIDEO DATA    █
  319.     █▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄█
  320.     Pointer to a save table of more          @video_sav_tbl
  321.     pointers for the video system 
  322.                SAVE TABLE
  323.      offset type    pointer to
  324.      ────── ──── ────────────────────
  325.        0     dd  Video parameters
  326.        4     dd  Parms save area
  327.        8     dd  Alpha char set
  328.       0Ch    dd  Graphics char set
  329.       10h    dd  2nd save ptr table
  330.       14h    dd  reserved (0:0)
  331.       18h    dd  reserved (0:0)
  332.      
  333.      2ND SAVE TABLE (from ptr above)
  334.      offset type functions & pointers
  335.      ────── ──── ────────────────────
  336.        0     dw  Bytes in this table
  337.        2     dd  Combination code tbl
  338.        6     dd  2nd alpha char set
  339.       0Ah    dd  user palette tbl
  340.       0Eh    dd  reserved (0:0)
  341.       12h    dd  reserved (0:0)
  342.       16h    dd  reserved (0:0)
  343.  
  344. 052 unused
  345. 053 unused
  346. 054 unused
  347. 055 unused
  348. 056 Days since 1-Jan-1980 counter
  349. 057 Print screen status                      prn_scrn_stat
  350.        00h = Print screen ready
  351.        01h = Print screen in progress
  352.        FFh = Error occurred
  353. 058                                          unused
  354. 059                                          unused
  355. 05A                                          unused
  356. 05B                                          unused
  357. 05C                                          unused
  358. 05D █▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀█
  359.     █     Floppy Disk Parameters    █
  360.     █▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄█
  361.      hi nibble = stepping rate in ms
  362.      lo nibble = head unload time, ms
  363. 05E  2nd info byte bit 0 = 0 for DMA
  364. 05F  Delay after use for motor off
  365. 060  Bytes per sector (2 = 512 bytes) 
  366. 061  Number of sectors per track
  367.        9   = 360K/720K
  368.        0Fh = 1.2M
  369.        12h = 1.44M
  370.        24h = 2.88M
  371. 062  Gap Length
  372. 063  Data Length (0FFh=unused)
  373. 064  Format Gap Length
  374. 065  Format write byte
  375. 066  Head load time, in milliseconds
  376. 067  Motor startup wait time * .125ms
  377. 068 █▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀█
  378.     █    Video Hardware Registers   █
  379.     █▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄█
  380.       mode CGA 40 columns x 25 lines
  381. 069   mode CGA 80 columns x 25 lines
  382. 06A   mode CGA graphics
  383. 06B   mode MDA 80 columns x 25 lines
  384. 06C Video buffer bytes CGA 40x25
  385. 06D Video buffer bytes CGA 80x25
  386. 06E Video buffer bytes CGA Graphics
  387. 06F Video buffer bytes CGA Graphics
  388. 070 Video columns per modes 0-7
  389. 071 Video hardware modes (0-7)
  390. 072 █▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀█        dsk_info_table
  391.     █ Hard Disk Information Tables  █
  392.     █                               █
  393.     █   Each sub-table contains a   █
  394.     █   a set of 16 bytes for each  █
  395.     █   particular disk type.       █
  396.     █                               █
  397.     █   Type number specified may   █
  398.     █   differ with manufactures    █
  399.     █   specification.  The hard    █
  400.     █   disk table shown here       █
  401.     █   assumes the first entry     █
  402.     █   is type 0.                  █
  403.     █▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄█
  404.      Number of cylinders, hdsk_type_0
  405. 073  Number of heads
  406. 074  Low write current cyl begin *
  407. 075  Write pre-compensation cylinder
  408. 076  Error correction burst length *
  409. 077  Miscellaneous bit functions:
  410.        bits 0-2 disk option, XT only*
  411.             0-2 unused, all others
  412.             3 = 1 if > 8 heads
  413.             4   unused
  414.             5 = 1 for bad map at last
  415.                  cylinder + 1
  416.             6 or 7 = 1 no retries
  417. 078  Normal timeout *
  418. 079  Format timeout *
  419. 07A  Check timeout  *
  420. 07B  Parking cylinder number
  421. 07C  Number of sectors per track
  422. 07D  Unused
  423.         * indicates XT machines only
  424. 07E Unused
  425. 07F Video characters in graphic modes        video_char_table
  426. 080 Characters, EGA  8x14 font
  427. 081 Characters, EGA  8x8 font (0-7F)
  428. 082 Characters, EGA  8x8 font (80-FF)
  429. 083 Character changes, EGA  8x14 font
  430. 084 Characters, VGA  8x16 font
  431. 085 Character changes, VGA  9x16 font
  432. 086 Video VGA parameter table ptr
  433. 087 Initial interrupt vectors                int_vec_table
  434. 088 BIOS version date code                   rom_versn_date
  435. 089 Model  FFh = PC                          model_type
  436.            FEh = 1st XT
  437.            FBh = later XTs
  438.            FCh = AT type (286 & later)
  439.            FAh = models 25/30
  440.            F9h = IBM lap-tops
  441.            F8h = models 70/80 (80386)
  442. 08A Extended BIOS data (PS/2)or printer 4    BIOS_data_seg
  443.       Printer 4 (PC,XT,AT & compatibles)
  444. 08B █▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀█        VGA_parm_tbl
  445.     █   Video VGA Parameter Tables  █
  446.     █                               █
  447.     █   64 byte sub-table per mode  █
  448.     █  offset/size     function     █
  449.     █  -- --------  --------------  █
  450.     █   0  1 byte   # of columns    █
  451.     █   1  1 byte   # of rows       █
  452.     █   2  1 byte   # bytes/char    █
  453.     █   3  1 word   # bytes/page    █
  454.     █   5  5 bytes  sequencer regs  █
  455.     █  10 25 bytes  display regs    █
  456.     █  35 20 bytes  attribute regs  █
  457.     █  55  9 bytes  graphics regs   █
  458.     █▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄█
  459. 08C █▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀█        baud_rate_tbl
  460.     █        Baud Rate Table        █
  461.     █                               █
  462.     █   Table of hex divisors for   █
  463.     █   the serial ports.   Table   █
  464.     █   divisors for bauds 110 to   █
  465.     █   9600, and 19,200 on some.   █
  466.     █▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄█
  467.     110 Baud rate divisor
  468. 08D █▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀█        Config_tbl_size
  469.     █   System Configuration Table  █
  470.     █▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄█
  471.     Size of table in bytes
  472. 08E Model type
  473.       0F8h = PS/2 model 70-80 types
  474.       0FCh = PS/2 model 50-60 types
  475.              also most 80286-80486
  476.              & Pentium compatibles
  477.       0FAh = 8088/86 model 25-30 type
  478. 08F Sub-Model type 
  479. 090 BIOS revision number
  480. 091 Feature information
  481.       bit 7=1, hard disk uses DMA 3
  482.       bit 6=1, dual interrupt chips
  483.       bit 5=1, has real-time-clock
  484.       bit 4=1, int 15h, ah=4Fh is
  485.                supported (keyboard)
  486.       bit 3=1, external wait support
  487.       bit 2=1, has extended BIOS RAM
  488.       bit 1=1, micro-channel
  489.       bit 0=1, unused
  490. 092 Information bytes (future use)
  491. 093 █▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀█ 
  492.     █       Interrupt Vectors       █
  493.     █▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄█
  494.     Divide error
  495. 094 Single Step
  496. 095 NMI
  497. 096 Debug
  498. 097 Overflow
  499. 098 Print Screen
  500. 099 Timer Ticks
  501. 09A Keyboard
  502. 09B Serial
  503. 09C Serial
  504. 09D Disk
  505. 09E Diskette
  506. 09F Bad Interrupt
  507. 0A0 Video
  508. 0A1 Equipment
  509. 0A2 Memory Size
  510. 0A3 Disk Services
  511. 0A4 General Services
  512. 0A5 ROM Basic
  513. 0A6 █▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀█ 
  514.     █         ROM BEGINNING         █
  515.     █▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄█
  516.     ROM signature word
  517. 0A7 Number of 512 byte pages
  518. 0A8 unused
  519. 0A9 █▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀█ 
  520.     █     FONT - 8 wide, 14 high    █
  521.     █▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄█
  522.     Video character font
  523. 0AA █▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀█ 
  524.     █     FONT - 8 wide, 8 high     █
  525.     █▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄█
  526.     Video characters 0-127
  527. 0AB █▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀█ 
  528.     █     FONT - 8 wide, 8 high     █
  529.     █▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄█
  530.     Video characters 128-255
  531. 0AC █▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀█ 
  532.     █     FONT - 9 wide, 14 high    █
  533.     █                               █
  534.     █  First byte indicates the     █
  535.     █    character to replace       █
  536.     █  Followed by 14 bytes of data █
  537.     █    (the 9th bit is provided   █
  538.     █    by the EGA/VGA adapter     █
  539.     █▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄█
  540.     Video character font
  541. 0AD █▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀█ 
  542.     █     FONT - 8 wide, 16 high    █
  543.     █▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄█
  544.     Video character font
  545. 0AE █▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀█ 
  546.     █     FONT - 9 wide, 16 high    █
  547.     █                               █
  548.     █  First byte indicates the     █
  549.     █    character to replace       █
  550.     █  Followed by 16 bytes of data █
  551.     █    (the 9th bit is provided   █
  552.     █    by the EGA/VGA adapter     █
  553.     █▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄█
  554.     Video character font
  555. 0AF █▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀█ 
  556.     █       VIDEO MODE TABLES       █
  557.     █                               █
  558.     █ Note: The following structure █
  559.     █       is based on most EGA/   █
  560.     █       VGA adapters.  Since    █
  561.     █       they are used only      █
  562.     █       internally the table    █
  563.     █       may not follow the      █
  564.     █       standard shown.         █
  565.     █                               █
  566.     █  EGA Cards - Mode order       █
  567.     █       0-0Fh, 10h normal       █
  568.     █       0Fh, 10h  16K RAM EGA   █
  569.     █       0-3, high res emulate   █
  570.     █  VGA Cards - Mode order       █
  571.     █       0-Fh, 10-13h normal     █
  572.     █       0-3, high res emulate   █
  573.     █                               █
  574.     █  THIS IS A GUIDELINE AND MAY  █
  575.     █  VARY DEPENDING ON THE CARD   █
  576.     █▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄█
  577.     Number of columns on display
  578. 0B0 Number of rows on display
  579. 0B1 Pixels per character
  580. 0B2 Bytes per page
  581. 0B3 Sequencer register values
  582. 0B4 Miscellaneous register value
  583. 0B5 CRT controller register values
  584. 0B6 Attribute register values
  585. 0B7 Graphics register values
  586. 0B8 System boot 
  587. 0B9 Key Scan-Code Translate Table
  588. end
  589.  
  590.  
  591.  
  592.  :::::::::::::::::::::::::::::: LOCATION REMARKS ::::::::::::::::::::::::::::::
  593.  
  594.     ----------------------- Location Reference Remarks ------------------------
  595.  
  596. 01
  597.     ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ int 1 ▒▒▒▒▒▒▒
  598.      
  599.        SINGLE STEP
  600.  
  601.  
  602. 02
  603.     ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ int 2 ▒▒▒▒▒▒▒
  604.      
  605.       NON-MASKABLE HARDWARE INTERRUPT
  606.      
  607.          This function is called in the event of a memory parity error or may
  608.          occur in the event of other hardware problems or failures (depends on
  609.          the specific manufacturer's hardware).  Displays the appropriate
  610.          error message and halts the processor.
  611.  
  612. 03
  613.     ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ int 3 ▒▒▒▒▒▒▒
  614.      
  615.       DEBUG BREAKPOINT
  616.  
  617. 04
  618.     ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ int 4 ▒▒▒▒▒▒▒
  619.      
  620.       OVERFLOW
  621.  
  622. 05
  623.     ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ int 5 ▒▒▒▒▒▒▒
  624.      
  625.       PRINT SCREEN
  626.      
  627.          Send the present active display screen contents to the printer if
  628.          the printer is idle and not out of paper.  The status of the print
  629.          screen function is in prn_screen_stat at 0050:0000.  Control-Break
  630.          will terminate an active print screen operation.
  631.  
  632. 06
  633.     ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ int 6 ▒▒▒▒▒▒▒
  634.      
  635.       BAD OPCODE DETECTED
  636.  
  637. 07
  638.  
  639. 08
  640.     ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ int 8 ▒▒▒▒▒▒▒
  641.      
  642.       TIMER TICKS  (called by hardware 8259-1, IRQ 0)
  643.           
  644.          This is the primary timer used to control the clock and other key
  645.          system resources.  It is called indirectly by channel A of the 8253
  646.          timer every 18.2 milliseconds.  Every timer tick also calls int 1Ch
  647.          for user needs (int 1Ch points to an iret instruction unless changed
  648.          by a resident program).  The timer interrupt is given the highest
  649.          maskable interrupt priority upon power up.
  650.      
  651.          The main timing functions of int 8 include increment of a 32-bit
  652.          time since powered on counter, timer_hi and timer_low, and after 24
  653.          hours since powered on, timer_rolled is incremented.
  654.      
  655.          The last task of int 8 is turning off the floppy drive motor after
  656.          2 seconds of non-use.  The counter dsk_motor_tmr is decremented upon
  657.          each occurrence of int 8.  When the count reaches zero, the motor is
  658.          set off, and the motor running flags are cleared in dsk_motor_stat.
  659.  
  660. 09
  661.     ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ int 9 ▒▒▒▒▒▒▒
  662.      
  663.       KEYBOARD I/O  (called by hardware 8259-1, IRQ 1)
  664.      
  665.          When any key is pressed on the keyboard, the hardware calls this
  666.          interrupt to service the pressed key or key combination.   The
  667.          hardware provides the key pressed in a non-ASCII scan code format
  668.          read at i/o port 60h.  The servicer acknowledges receipt of the key
  669.          by toggling bit 7 of port 61h.  (Port 61h should be read first, then
  670.          bit 7 ored on, output to port 61h, then anded off, and resent to
  671.          port 61h).
  672.      
  673.          The read key is decoded to yield an ASCII character, special function
  674.          key (such as F1) or a control function like Left Shift Key down.
  675.          The converted ASCII character is placed into the next available
  676.          position in the circular queue keybd_queue to keybd_q_end.  It is
  677.          put in the position indicated by keydb_q_tail when it will not
  678.          cause the loss of earlier entered data.  The value keybd_q_head
  679.          points to the oldest key pressed in the buffer which has not been
  680.          removed from the queue (the normal process uses int 16h to remove
  681.          keys from the queue and return the key value to the int 16h caller).
  682.      
  683.          The 16 word queue holds up to 16 keys.  If keybd_q_head equals the
  684.          keybd_q_tail, the queue is empty.  Valid keys in the queue comprise
  685.          the upper byte scan code and the lower byte ASCII character.  If the
  686.          key pressed has no ASCII equivalent (i.e F1 to F12), the lower byte
  687.          is zero.
  688.      
  689.          Toggle and shift keys are not placed in the buffer, but appear in 2
  690.          status registers keybd_flags_1 and keybd_flags_2.
  691.      
  692.          Special key combinations will cause other events to occur:
  693.             Ctrl-Alt_Del  -  Reset computer by jumping to power_on_reset
  694.             Print screen  -  Call int_5_prn_scrn to print the current screen
  695.             Ctrl-Break    -  Call int_1Bh control break key processor (DOS)
  696.             Pause         -  Wait until an ASCII key is pressed, without
  697.                                placing the key in the queue
  698.             Ctrl-Num Lock -  Wait until an ASCII key is pressed, without
  699.                                placing the key in the queue
  700.             Ctrl-Prt Scn  -  Toggle keyboard echo to printer
  701.             Sys Req       -  Issue an interrupt 15h, ax=8500h when pressed, 
  702.                                and  interrupt 15h, ax=8501h when released
  703.             Alt-Keypad    -  Convert decimal and insert into the BIOS 
  704.                                keyboard buffer
  705.             Shift keys    -  Save the new shift state (Ctrl, Alt, Shift, 
  706.                                Insert, Caps Lock, Num Lock, Scroll Lock)
  707.  
  708. 0A
  709.     ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ int 0Ah ▒▒▒▒▒
  710.      
  711.       General Adapter Use (called by hardware 8259-1, IRQ 2 - see below)
  712.      
  713.          On systems equipped with 2 interrupt controller chips (8259), IRQ 2
  714.          is used to support the second interrupt controller.  In this case,
  715.          int 71h (IRQ 9) is used to replace IRQ 2.  Hardware calls to int 71h
  716.          are redirected to this interrupt to maintain compatibility.
  717.  
  718. 0B
  719.     ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ int 0Bh ▒▒▒▒▒
  720.      
  721.       RS-232 SERIAL HANDLER (called by hardware 8259-1, IRQ 3)
  722.      
  723.          Called by the secondary serial port chip.
  724.  
  725. 0C
  726.     ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ int 0Ch ▒▒▒▒▒
  727.      
  728.       RS-232 SERIAL HANDLER (called by hardware 8259-1, IRQ 4)
  729.      
  730.          Called by the primary serial port chip.
  731.  
  732. 0D
  733.     ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ int 0Dh ▒▒▒▒▒
  734.      
  735.       XT HARD DISK CONTROLLER (called by hardware 8259-1, IRQ 5)
  736.  
  737. 0E
  738.     ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ int 0Eh ▒▒▒▒▒
  739.      
  740.       FLOPPY DISK CONTROLLER (called by hardware 8259-1, IRQ 6)
  741.  
  742. 0F
  743.     ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ int 0Fh ▒▒▒▒▒
  744.      
  745.       PRINTER CONTROLLER (called by hardware 8259-1, IRQ 7)
  746.      
  747.          This interrupt is normally avoided.  If a bad interrupt occurs,
  748.          it will vector to this spot (when caused by a misprogrammed 8259
  749.          interrupt controller)
  750.  
  751. 10
  752.     ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ int 10h ▒▒▒▒▒
  753.      
  754.       VIDEO DISPLAY SERVICES
  755.      
  756.          Called with:  ah = primary function number
  757.      
  758.          Returns: (unless otherwise indicated)
  759.                        ax - altered (some systems may not alter ax)
  760.      
  761.          Functions:
  762.            ah = 0     Set video display mode in al.
  763.            ah = 1     Set cursor size
  764.                         Call with:  ch = top line, 0-32
  765.                                     cl = bottom line, 0-32
  766.            ah = 2     Set cursor location
  767.                         Call with:  bh = page number, 0 = 1st page
  768.                                     dh = row (0 for top row)
  769.                                     dl = column (0 for leftmost)
  770.            ah = 3     Get cursor location
  771.                         Call with:  bh = page number, 0 = 1st page
  772.                         Returns:    ch/cl = cursor size (top & bottom)
  773.                                     dh/dl = row and column of cursor
  774.            ah = 4     Get light pen location
  775.                         Returns:    ah = 0 not on/unsupported & bx,cx,dx changed
  776.                                          1 status valid
  777.                                     bx = pixel column
  778.                                     cx = horizontal line number
  779.                                     dh/dl = row and column
  780.            ah = 5     Set Page number al, 0 = 1st page
  781.            ah = 6     Up scroll screen
  782.                         Call with:  al = # bottom lines to clear, set 0 for all
  783.                                     bh = attribute to fill cleared lines
  784.                                     ch/cl = row/column of top left scroll corner
  785.                                     dh/dl = row/column of bottom right scroll corner
  786.            ah = 7     Down scroll screen
  787.                         Call with:  al = # top lines to clear, set 0 for all
  788.                                     bh = attribute to fill cleared lines
  789.                                     ch/cl = row/column of top left scroll corner
  790.                                     dh/dl = row/column of bottom right scroll corner
  791.            ah = 8     Get character & attribute at cursor
  792.                         Call with:  bh = page number, 0 = 1st page
  793.                         Returns:    ah/al = attribute/character
  794.            ah = 9     Write character & attribute at cursor (graphics modes)
  795.                         Call with:  al = character
  796.                                     bh = page number, 0 = 1st page
  797.                                     bl = attribute, bit 7 = 1 to xor with old color
  798.                                     cx = Number of same characters to write
  799.            ah = 0Ah   Write character at cursor (graphics modes)
  800.                         Call with:  al = character
  801.                                     bh = page number, 0 = 1st page
  802.                                     cx = Number of same characters to write
  803.            ah = 0Bh   Set colors (typically in low res modes)
  804.                         Call with:  bh = 0, bl = color low res background, border
  805.                                     bh = 1, bl = 0/1 for low res color group 0/1
  806.            ah = 0Ch   Write graphics dot
  807.                         Call with:  al = color, bit 7 = 1 to xor bit with old color
  808.                                     cx/dx = pixel row/pixel column
  809.            ah = 0Dh   Read graphics dot
  810.                         Call with:  cx/dx = pixel row/pixel column
  811.            ah = 0Eh   Write in ASCII mode (cr, lf, bell, and bs as operators)
  812.                         Call with:  al/bl = character/color
  813.            ah = 0Fh   Get video info
  814.                         Returns:    ah = columns active
  815.                                     al = active video mode
  816.                                     bh = active page, 0 = 1st page
  817.            ah = 10h   Colors  (EGA/VGA)   Called with al = subfunction
  818.                         al = 1    bl = color register (0-15)  bh = color to set
  819.                         al = 2    es:dx = ptr to change all 16 colors & overscan #
  820.                         al = 3    bl = color high bit as: 0-intensity, 1-blink
  821.                       For VGA equipped systems only
  822.                         al = 7    bl = color register to get in bh
  823.                         al = 8    bh = returned overscan value
  824.                         al = 9    es:dx = ptr where to put all 16 colors & overscan
  825.                         al = 10h  bx = color register to set; ch/cl/dl = grn/blu/red
  826.                         al = 12h  es:dx = ptr to change color registers
  827.                                   bx = 1st register to set, cx = # of registers
  828.                         al = 13h  bl = 0, set color page mode in bh
  829.                                   bl = 1, set page;  bh = page number
  830.                         al = 15h  bx = color reg to read; ch/cl/dl = grn/blu/red
  831.                         al = 17h  es:dx = ptr where to load color regs
  832.                                   bx = 1st register to get, cx = # of registers
  833.                         al = 1Ah  get color page info; bl = mode; bh = page #
  834.            ah = 11h   Reset mode with new character set (leave memory as-is)
  835.                         al = 0    Character set load
  836.                                   es:bp = ptr to table of chars
  837.                                   bl/bh = which block/bytes per char
  838.                                   cx/dx = # of characters/where to start in block
  839.                         al = 1    bl = block to load the mono character set
  840.                         al = 2    bl = block to load the double wide character set
  841.                         al = 3    bl = block select related to attribute
  842.                         al = 4    bl = block to load the 8 by 16 set (VGA)
  843.                         al = 10h - 14h same as 0 - 4, must occur after setting mode
  844.                         al = 20h  es:bp = ptr to table of char, using int 1Fh ptr
  845.                         al = 21h  es:bp = ptr to table of char, using int 43h ptr
  846.                                   bl = 0-dl=# rows; 1-14 rows; 2-25 rows; 3-43 rows
  847.                                   cx = number of bytes per character in table
  848.                         al = 22h  use 8 by 14 char set, bl=rows (see al=21h)
  849.                         al = 23h  use double wide char set, bl=rows (see al=21h)
  850.                         al = 24h  use 8 by 16 char set, bl=rows (see al=21h)
  851.                       Get table pointer and info
  852.                         al = 30h  es:bp = ptr returned; cx=bytes per char; dl=rows
  853.                                   bh = 0, get int 1Fh      bh = 4, get double wide
  854.                                   bh = 1, get int 43h      bh = 5, get mono 9 by 14
  855.                                   bh = 2, get 8 by 14      bh = 6, get 8 by 16 (VGA)
  856.                                   bh = 3, get double wide  bh = 7, get 9 by 16 (VGA)
  857.            ah = 12h   Miscellaneous functions, bl = sub-function
  858.                         bl = 10h  Get info,  bh = 0-now color, 1-now mono
  859.                                   ch/cl = info bits/switches
  860.                         bl = 20h  Set print screen to work with EGA/VGA
  861.                       Functions for VGA only (bl = 30-34h return al = 12h)
  862.                         bl = 30h  Set # of scan lines, 0-200, 1-350, 2-400
  863.                                     activates after mode change
  864.                         bl = 31h  ax = 0/1  allow/prevent palette load with new mode
  865.                         bl = 32h  al = 0/1  video off/on
  866.                         bl = 33h  al = 0/1  gray scale summing off/on
  867.                         bl = 34h  al = 0/1  scale cursor size to font off/on
  868.                         bl = 35h  switch between adapter and motherboard video
  869.                                   al = 0, adapter off, es:dx = save state area
  870.                                   al = 1, motherboard on
  871.                                   al = 2, active video off, es:dx = save area
  872.                                   al = 3, inactive video on, es:dx = save area
  873.                         bl = 36h  al = 0/1  screen off/on
  874.            ah = 13h   Write character string (cr, lf, bell, and bs as operators)
  875.                         Call with:  al = 0/1 write characters, cursor not/is moved
  876.                                           bl = attribute of all characters
  877.                                        = 2/3 write characters, cursor not/is moved
  878.                                           string alternates character & attribute
  879.                                     bh = page number, 0 = 1st page
  880.                                     cx = number of characters
  881.                                     dh/dl = row and column to start
  882.                                     es:bp = ptr to character string
  883.            ah = 14h   LCD display support, al = sub-function
  884.                          al = 0,    es:di = ptr to font table to load
  885.                                     bl/bh = which block/bytes per char
  886.                                     cx/dx = # of characters/where to start in block
  887.                          al = 1,    bl = block # of ROM font to load
  888.                          al = 2,    bl = how to support high intensity
  889.            ah = 15h   LCD info table ptr returned in es:di
  890.                          ax = 0      there is no alternate adapter
  891.                          ax = 5140h  LCD is the alternate
  892.                          ax = 5153h  CGA is alternate
  893.                          ax = 5151h  MDA is alternate
  894.      
  895.                               **** VGA SUPPORT ONLY ****
  896.            ah = 1Ah   Get/Set types of displays which are operating
  897.                          al = 0, get displays, returns al = 1Ah
  898.                                  bl = in use display code
  899.                                  bh = alternate display code
  900.                          al = 1, set codes, returns al = 1Ah
  901.                                  bl = in use display code
  902.                                  bh = alternate display code
  903.                          codes:   0 = no display
  904.                                   1 = mono display
  905.                                   2 = CGA
  906.                                   4 = EGA, color
  907.                                   5 = EGA, mono
  908.                                   6 = PGA
  909.                                   7 = VGA, mono  (PS/2 MCA only)
  910.                                   8 = VGA, color (PS/2 MCA only)
  911.                                  Bh = VGA, mono  (PS/2 non MCA)
  912.                                  Ch = VGA, color (PS/2 non MCA)
  913.                                 FFh = display type not known
  914.            ah = 1Bh   Get video system information
  915.                          call with:  bx = 0
  916.                                      es:di = ptr to buffer where to put info
  917.            ah = 1Ch   Video system save & restore, al = sub-function
  918.                          call with:  al = 0, get buffer size
  919.                                         = 1, save system, buffer at es:bx
  920.                                         = 2, restore system, buffer at es:bx
  921.                                      cx bit 0 = 1 for hardware registers
  922.                                         bit 1 = 1 for software states
  923.                                         bit 2 = 1 for colors & DAC registers
  924.  
  925. 11
  926.     ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ int 11h ▒▒▒▒▒
  927.      
  928.       EQUIPMENT INSTALLED
  929.      
  930.          Returns:   ax = equip_install word
  931.      
  932.                          15   14   13   12   11   10    9    8
  933.                           \    /       game  \          /
  934.                          # of printer  port   # of RS-232
  935.                           ports 0-3    used    ports 0-4
  936.      
  937.                           7    6    5    4    3    2    1    0
  938.                           \    /    \    /    \    /  Math   |
  939.                            # of   video mode   RAM     uP    no
  940.                           floppy  at boot up  00=16K       floppy
  941.                           drives  00=EGA      01=32K       drive
  942.                             1-4   01=CGA-40   10=48K       if 0
  943.                           if bit  10=CGA-80   11=64K
  944.                            0 = 1  11=MDA-80   (old PCs)
  945.       
  946.                          Note: bit 13 = modem on some PC lap-tops
  947.                                bit  2 = mouse on MCA and some others
  948.          
  949.          Regs used: ax
  950.  
  951. 12
  952.     ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ int 12h ▒▒▒▒▒
  953.      
  954.       SYSTEM MEMORY SIZE
  955.      
  956.          Returns:   ax = number of contiguous 1K bytes blocks of memory
  957.                          from 0 to 640 K.
  958.      
  959.          Regs used: ax
  960.  
  961. 13
  962.     ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ int 13h ▒▒▒▒▒
  963.      
  964.       FLOPPY DISK SERVICES
  965.      
  966.          Note: Floppy disk services may be vectored to this routine from int 40h
  967.                on newer systems with hard disk support inside the BIOS.
  968.      
  969.          Call with: ah = sub-function number
  970.                     dl = drive number (unless otherwise noted), drive a: = 0
  971.      
  972.          Returns:   carry = 0 if function ok
  973.                     ah = status (unless otherwise noted)
  974.                       ah = 0    Function ok
  975.                       ah = 1    Invalid value passed or unsupported function
  976.                       ah = 2    Can not locate address mark
  977.                       ah = 3    Floppy write protected
  978.                       ah = 4    Sector not found
  979.                       ah = 6    Floppy changed line on (1.2 meg drives)
  980.                       ah = 8    DMA overrun occurred
  981.                       ah = 9    DMA attempted across 64K byte boundary
  982.                       ah = 0Ch  Media type not found
  983.                       ah = 10h  CRC read error
  984.                       ah = 20h  Floppy controller failure
  985.                       ah = 40h  Seek operation failed
  986.                       ah = 80h  Floppy drive not ready
  987.      
  988.          Functions:
  989.            ah = 0     Floppy disk controller reset
  990.            ah = 1     Get last status
  991.            ah = 2     Read sectors
  992.                         Call with:  al = number of sectors to read
  993.                                     ch/cl = starting track/starting sector
  994.                                     dh = head number, head 0 = 0
  995.                                     es:bx = ptr to buffer where to put data
  996.            ah = 3     Write sectors
  997.                         Call with:  al = number of sectors to write
  998.                                     ch/cl = starting track/starting sector
  999.                                     dh = head number, head 0 = 0
  1000.                                     es:bx = ptr to buffer where to get data
  1001.                         Return:     al = number of sectors written
  1002.            ah = 4     Verify sectors
  1003.                         Call with:  al = number of sectors to compare
  1004.                                     ch/cl = starting track/starting sector
  1005.                                     dh = head number, head 0 = 0
  1006.                                     es:bx = ptr to buffer where to compare data
  1007.                         Return:     al = number of sectors checked
  1008.            ah = 5     Format track
  1009.                         Call with:  al = number of sectors to format
  1010.                                     ch/cl = starting track/starting sector
  1011.                                     dh = head number, head 0 = 0
  1012.                                     es:bx = ptr to table of address fields
  1013.            ah = 8     Get drive information (not supported by all systems)
  1014.                         Returns:    ax/bh = 0          size dia.     size dia.
  1015.                                     bl = drive type: 1=360K 5.25   3=720K 3.5
  1016.                                                      2=1.2M 5.25   4=1.4M 3.5
  1017.                                     cx bits 7&6, 15-8 = number of tracks, 0=1 track
  1018.                                        bits 5-0 = number of sectors per track
  1019.                                     dh/dl = # of heads/number of floppy drives
  1020.                                     es:di = ptr to floppy parameter table
  1021.            ah = 15h   Get drive type (not supported by all systems)
  1022.                         Returns:    ah = 0 no drive
  1023.                                     ah = 1/2  floppy changed line not/is available
  1024.            ah = 16h   Get changed floppy status (not supported by all systems)
  1025.                         Returns:    ah = 0   floppy in drive,     carry = 0
  1026.                                     ah = 1   bad drive number,    carry = 1
  1027.                                     ah = 6   floppy out of drive, carry = 1
  1028.                                     ah = 80h drive not ready,     carry = 1
  1029.            ah = 17h   Specify media type for a drive
  1030.                         Call with:  al = 1  use a 320/360K floppy in 360k drive
  1031.                                     al = 2  use a 360K floppy in a 1.2M drive
  1032.                                     al = 3  use a 1.2M floppy in a 1.2M drive
  1033.                                     al = 4  use a 720K disk in a 720K drive
  1034.            ah = 18h   Prepare for format (not supported by all systems)
  1035.                         Call with:  cx bits 7&6, 15-8 = number of tracks, 0=1 track
  1036.                                        bits 5-0 = number of sectors per track
  1037.                         Returns:    es:di = ptr to floppy parameter table
  1038.  
  1039. 14
  1040.     ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ int 14h ▒▒▒▒▒
  1041.      
  1042.       RS-232 SERIAL PORTS SERVICES
  1043.      
  1044.          Call with: ah = sub-function number
  1045.                     dx = communications number, com1 = 0
  1046.      
  1047.          Returns:   ah = line status,  bit 0 = Data ready
  1048.                                        bit 1 = Overrun error
  1049.                                        bit 2 = Parity error
  1050.                                        bit 3 = CRC framing error
  1051.                                        bit 4 = Break detect
  1052.                                        bit 5 = Xmit buffer register empty
  1053.                                        bit 6 = Xmit shift out register empty
  1054.                                        bit 7 = No response, ignore bits 0-6
  1055.      
  1056.                     al = modem status, bit 0 = Change in Clear To Send
  1057.                                        bit 1 = Change in Data Set Ready
  1058.                                        bit 2 = Falling edge ring detect
  1059.                                        bit 3 = Change in receive detect line
  1060.                                        bit 4 = Clear to Send (CTS)
  1061.                                        bit 5 = Data Set Ready (DTS)
  1062.                                        bit 6 = Ring detected
  1063.                                        bit 7 = Receive detect line
  1064.      
  1065.          Functions:
  1066.            ah = 0     Reset the specified port
  1067.                         Call with:  al serial port register values
  1068.                                        bits  7    6    5    4    3    2    1    0
  1069.                                             --baud-rate--  -Parity- Stop  --Word--
  1070.                                              000 =  110      bits    bit    size
  1071.                                              001 =  150                    (bits)
  1072.                                              010 =  300    00 = off  0=1
  1073.                                              011 =  600    01 = odd  1=2   10 = 7
  1074.                                              100 = 1200    10 = off        11 = 8
  1075.                                              101 = 2400    11 = even
  1076.                                              110 = 4800
  1077.                                              111 = 9600
  1078.           ah = 1      Transmit a character
  1079.                         Call with:  al = character to send (not changed on exit)
  1080.           ah = 2      Received a character
  1081.                         Returns:    al = character received
  1082.           ah = 3      Get status
  1083.           ah = 4      Advanced Initialization (not supported on all systems)
  1084.                         Call with:  al = 0/1  no break/break
  1085.                                     bh = Parity,    0 = none     3 = stick odd
  1086.                                                     1 = odd      4 = stick even
  1087.                                                     2 = even
  1088.                                     bl = 0/1 Stop bits set to 1/2
  1089.                                     ch = Word size, 0 = 5 bits   2 = 7 bits
  1090.                                                     1 = 6 bits   3 = 8 bits
  1091.      
  1092.                                     cl = Baud rate, 0 =  110     5 =  2400
  1093.                                                     1 =  150     6 =  4800
  1094.                                                     2 =  300     7 =  9600
  1095.                                                     3 =  600     8 = 19200
  1096.                                                     4 = 1200
  1097.            ah = 5     Advanced port control (not supported on all systems)
  1098.                         al = 0  Get modem register
  1099.                                   Returns: bl bit 0 = Data Terminal Ready (DTR)
  1100.                                               bit 1 = Request To Send (RTS)
  1101.                                               bit 2 = Out 1
  1102.                                               bit 3 = Out 2
  1103.                                               bit 4 = Loop modem
  1104.                         al = 1  Set modem register
  1105.                                   Call with:  bl = value for register (see above)
  1106.  
  1107. 15
  1108.     ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ int 15h ▒▒▒▒▒
  1109.      
  1110.       GENERAL SERVICES
  1111.      
  1112.          On old PCs this function is only used for cassette servicing.
  1113.          Additional functions have been added for advanced features with
  1114.          newer equipment.
  1115.      
  1116.          Called with: ah = function code
  1117.      
  1118.          Returns:     CF = 0 if successful
  1119.                       CF = 1 if failure or function not supported
  1120.      
  1121.          Functions:
  1122.            ah = 0     Cassette motor set on
  1123.            ah = 1     Cassette motor set off
  1124.            ah = 2     Read cx bytes from cassette, es:bx = ptr to load area
  1125.            ah = 3     Write cx bytes to cassette,  es:bx = ptr to read area
  1126.            ah = 0Fh   Disk format hook, called from disk format routines
  1127.                         after a cylinder access completed.  Called with:
  1128.                         al = 1-undergoing surface analysis, 2-if formatting
  1129.            ah = 21h   Error log (PS 2), al = 0 to read, al = 1 to write
  1130.      
  1131.                            ***  LAPTOP MACHINES ONLY - 40h to 44h  ***
  1132.            ah = 40h   Systems info in cx, bx - al = 0 to read, 1 to write
  1133.                         for modem info in bx - al = 2 to read, 3 to write
  1134.            ah = 41h   Wait for an event, dx = i/o port to read or use es:di
  1135.                         as ptr to user event.  al = type of event 0-4,11-14
  1136.                         bh = event mask, bl = # of 55ms counts to timeout
  1137.            ah = 42h   Power off, al = 0 or 1 for mode of power off
  1138.            ah = 43h   Get system status in al
  1139.                             7     6     5     4       3     2     1    0
  1140.                           low   extrn  bad  pwr up  modem  ports      LCD
  1141.                         battery  pwr  time  alarm    on     on      missing
  1142.            ah = 44h   Modem power, al = 0 turn off,  al = 1 turn on
  1143.      
  1144.                          *** FUNCTIONS IN RECENT BIOS VERSIONS ONLY ***
  1145.            ah = 4Fh   Keyboard input hook, called every keystroke with
  1146.                         al = scan code.  CF = 1 to change or use the scan
  1147.                         code in al.  CF = 0 to ignore the key.
  1148.            ah = 80h   Open device number bx, in process number cx.
  1149.            ah = 81h   Close device number bx, in process number cx.
  1150.            ah = 82h   Terminate device number bx
  1151.            ah = 83h   Wait for timeout, and set bit 15 at ptr es:bx when
  1152.                         timed out.  al = 0 to set wait period cx:dx uSec,
  1153.                         al = 1 to stop timeout timer.
  1154.            ah = 84h   Game port read, dx = 0 to read switches into al
  1155.                         high nibble,  dx = 1 to read linear position
  1156.                         (Unit 1: ax = x, bx = y   Unit 2: cx = x, dx = y)
  1157.            ah = 85h   Get system request key state, al = 0 down, al = 1 up
  1158.            ah = 86h   Wait cx:dx microseconds before return
  1159.            ah = 87h   Transfer cx words to/from memory above 1 meg
  1160.                         es:si ptr to table with source & destination ptrs:
  1161.                         es:si -> zeros          db  16 dup(0)
  1162.                                  src_seg_limit  dw  ?        ; 1-64K bytes
  1163.                                  scr_ptr_low    dw  ?        ; 0-64K range
  1164.                                  scr_ptr_high   db  ?        ; 0-16 Meg range
  1165.                                  scr_rights     db  93h      ; r/w access
  1166.                                  scr_zero       dw  0
  1167.                                  dst_seg_limit  dw  ?        ; 1-64K bytes
  1168.                                  dst_ptr_low    dw  ?        ; 0-64K range
  1169.                                  dst_ptr_high   db  ?        ; 0-16 Meg range
  1170.                                  dst_rights     db  93h      ; r/w access
  1171.                                  dst_zero       dw  0
  1172.                                  zeros2         db  16dup(0)
  1173.                         Notes:
  1174.                           cx = 32K words max xfer, ptr_low & ptr_high form
  1175.                           a 24 bit physical address (do not use a segment)
  1176.                         Return codes: al = 0 if ok, al = 1 parity error
  1177.                           al = 2 other errors, al = 3 gate addr line 20 bad
  1178.            ah = 88h   Get extended memory size (above 1 Meg boundary)
  1179.                         ax = (number of bytes / 1024)
  1180.            ah = 89h   Go to protected mode of operation. es:si ptr to table
  1181.                         comprised of 8 groups of 8 byte ptr sub-arrays.  Each.
  1182.                         group is formed from 8 bytes as follows:
  1183.                             seg_limit    dw  ?     ; 1-64K bytes
  1184.                             ptr_low      dw  ?     ; 0-64K range
  1185.                             ptr_high     db  ?     ; 0-16 Meg range
  1186.                             rights       db  93h   ; read/write access
  1187.                             zero         dw  0     ; set to zero
  1188.                         Ptr_low & high form a 24 bit physical address.
  1189.      
  1190.                         The 8 groups are as follows:
  1191.                           es:si ->  Group_1   Set to all zero
  1192.                                     Group_2   ptr to beginning of Group_1
  1193.                                     Group_3   ptr to Interrupt Descript Table IDT
  1194.                                     Group_4   ptr to present DS segment
  1195.                                     Group_5   ptr to present ES segment
  1196.                                     Group_6   ptr to present SS segment
  1197.                                     Group_7   ptr to present CS segment
  1198.                                     Group_8   ptr where to jump to when done
  1199.                         Also: bh & bl set as offset from beginning of IDT to
  1200.                           spot where 1st & 2nd set of 8 hardware interrupts begin.
  1201.                         Returns ah = 0 if ok, regs changed: ax,bp,ds,es,ss,cs
  1202.            ah = 90h   Device busy - used to signal DOS when it must wait.
  1203.                         Type   0  Disk timeout          0FCh  Hard disk timeout
  1204.                         codes  1  Floppy timeout                (PS 2 only)
  1205.                         (al)   2  Keyboard no timeout   0FDh  Floppy motor timeout
  1206.                                3  Mouse timeout         0FEh  Printer timeout
  1207.                              80h  Local area network (es:bx = network cntrl block
  1208.                         Returns CF = 0 if failure, 1 if minimum wait time occurred
  1209.            ah = 91h   Interrupt done - used to signal DOS when hardware done
  1210.                         al = type code (Device busy type codes)
  1211.            ah = C0h   Get ROM system information table ptr in es:bx.  See data
  1212.                         area starting at byte "sys_info_size".
  1213.      
  1214.                          *** PS 2 & COMPATIBLES ONLY - C1h to C4h ***
  1215.            ah = C1h   Get Extended BIOS data area segment in es
  1216.            ah = C2h   Mouse support (BIOS).  Sub-function code in al
  1217.                           al = 0  if bh = 0 mouse off, bh = 1 mouse on
  1218.                           al = 1  reset mouse & parameters, returns bh = 0
  1219.                                     bl altered on return
  1220.                           al = 2  Set number of updates per second in bh,
  1221.                                     bh = 0 - 10 updates/sec  4 - 80  updates/sec
  1222.                                          1 - 20 updates/sec  5 - 100 updates/sec
  1223.                                          2 - 40 updates/sec  6 - 200 updates/sec
  1224.                                          3 - 60 updates/sec
  1225.                           al = 3  Set resolution in counts per millimeter:
  1226.                                     bh = 0 - 1 cnts per mm   2 - 4 cnts per mm
  1227.                                          1 - 2 cnts per mm   3 - 8 cnts per mm
  1228.                           al = 4  Get device type, bh = 0
  1229.                           al = 5  Initialize pointing device interface data size
  1230.                                     bh = size 1 to 8 (1 to 8 bytes)
  1231.                           al = 6  Additional sub-functions in bh:
  1232.                                     bh = 0  Get status, cl = cnts per mm (see al=3)
  1233.                                             dl = updates/sec in hex, bl = status:
  1234.                                                  bit 6 = mode (0=stream, 1=remote)
  1235.                                                      5 = 0 disabled, 1 enabled
  1236.                                                      4 = scaling (0=1:1, 1=2:1)
  1237.                                                      2 = Left button pressed
  1238.                                                      0 = right button pressed
  1239.                                     bh = 1  Set scaling to 1:1
  1240.                                     bh = 2  Set scaling to 2:1
  1241.                           al = 7  Set location to "call far" when data available
  1242.                                      in es:bx
  1243.                         Return code for all sub-functions in al:
  1244.                           al = 0  successful             3  interface error
  1245.                                1  bad function call      4  resend
  1246.                                2  invalid input          5  no far call installed
  1247.            ah = C3h   Watchdog timer mode al = 0 disable, al = 1 enable,
  1248.                         bx = set counter value 1 to FFh
  1249.            ah = C4h   Bus option select (POS) subfunction in al,
  1250.                         al = 0  Get base POS adapter register address in dx
  1251.                              1  Enable setup for slot bl
  1252.                              2  Adapter enable
  1253.  
  1254. 16
  1255.     ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ int 16h ▒▒▒▒▒
  1256.      
  1257.       KEYBOARD SERVICES
  1258.      
  1259.          Call with:   ah = sub-function number
  1260.      
  1261.          Functions:
  1262.            ah = 0     Get a key, and wait until one is available if none are
  1263.                         in the queue.
  1264.                         Returns:    ah = keyboard scan code
  1265.                                     al = ASCII character, or 0 if non-ASCII
  1266.            ah = 1     Get key status
  1267.                         Returns:    zero flag = 0 if a valid key is in the queue
  1268.                                         ah = keyboard scan code
  1269.                                         al = ASCII character, or 0 if non-ASCII
  1270.                                     zero flag = 1 if no keys in the queue
  1271.            ah = 2     Get shift status register
  1272.                         Returns:    al = bits  7    6    5    4    3    2    1    0
  1273.                                              right left ctrl alt scrl  num  cap insrt
  1274.                                              -------shifts------ ------toggles-------
  1275.                                                    1 = down            1 = on
  1276.            ah = 3     Set repeating character rate (not supported in all systems)
  1277.                         Call with:  al = 5
  1278.                                     bh = start delay, 0 = 250 ms    2 =  750 ms
  1279.                                                       1 = 500 ms    3 = 1000 ms
  1280.                                     bl = speed in characters per second - values
  1281.                                            range from 0 = 30 cps, to 1Fh = 2 cps
  1282.            ah = 5     Load keyboard queue (not supported in all systems)
  1283.                         Call with:  ch/cl = scan code/character to load into the queue
  1284.                         Returns:    al = 0 if ok, 1 if keyboard queue is full
  1285.      
  1286.                            **** Support for extended keyboard functions ****
  1287.            ah = 10h   Get a key (similar to ah = 0, not supported in all systems)
  1288.            ah = 11h   Get key status (similar to ah = 1, not supported in all systems)
  1289.            ah = 12h   Get shift info (similar to ah = 2, not supported in all systems)
  1290.  
  1291. 17
  1292.     ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ int 17h ▒▒▒▒▒
  1293.      
  1294.       PRINTER SERVICES
  1295.      
  1296.          Call with:  ah = function code
  1297.                      dx = printer number 0-2 (some systems allow 0-3)
  1298.      
  1299.          Returns:    ah = status bits
  1300.                            7      6      5      4      3     2  1     0
  1301.                           not  acknow-  no   select   I/O   unused   no
  1302.                           busy  ledge  paper         error        response
  1303.                           __________from printer__________
  1304.      
  1305.          Functions:
  1306.            ah = 0   Send character to printer, al = character
  1307.            ah = 1   Printer port initialization
  1308.            ah = 2   Get printer status in ah
  1309.  
  1310. 18
  1311.     ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ int 18h ▒▒▒▒▒
  1312.      
  1313.       ROM BASIC
  1314.  
  1315. 19
  1316.     ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ int 19h ▒▒▒▒▒
  1317.      
  1318.       BOOTSTRAP LOADER
  1319.      
  1320.          Floppy drive a: attempts a read from the first sector of the disk.
  1321.          If read properly (i.e a boot disk is in drive a:), control is
  1322.          transferred to the loaded program.  The boot sector at track 0,
  1323.          sector 1 is transferred to memory at 0:7C00h.  dh = drive which
  1324.          was used (0=A:).  Control is passed to 0:7C00h.
  1325.  
  1326. 1A
  1327.     ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ int 1Ah ▒▒▒▒▒
  1328.      
  1329.       REAL-TIME CLOCK SERVICES
  1330.      
  1331.          Call with:   ah = sub-function number
  1332.      
  1333.          Functions:
  1334.            ah = 0     Get system timer (increments every 54.92 ms from int 8)
  1335.                         Returns:    al = # of 24 hour periods since read/powered up
  1336.                                     cx:dx = 32 bit count
  1337.            ah = 1     Get system timer & reset 24 hour counter
  1338.                         Returns:    cx:dx = 32 bit count
  1339.  
  1340.                         This subfunction should NEVER be used by an application.
  1341.                         It is intended for the operating system only.  Use
  1342.                         by an application running at midnight will cause the
  1343.                         operating system clock to lose a day!
  1344.  
  1345.                         **** System must have CMOS clock for services 2-0Bh ****
  1346.            ah = 2     Get time in BCD format
  1347.                         Returns:    ch/cl = hours/minutes
  1348.                                     dh = seconds
  1349.                                     dl = 0/1 if daylight savings time operation off/on
  1350.                                     carry flag = 0 if clock ok, 1 if stopped
  1351.            ah = 3     Set time in BCD format
  1352.                         Call with:  ch/cl = hours/minutes
  1353.                                     dh = seconds
  1354.                                     dl = 0/1 if daylight savings time operation off/on
  1355.            ah = 4     Get date in BCD format
  1356.                         Returns:    cx = four digit year
  1357.                                     dh/dl = month/day
  1358.                                     carry flag = 0 if clock ok, 1 if stopped
  1359.            ah = 5     Set date in BCD format
  1360.                         Call with:  cx = four digit year
  1361.                                     dh/dl = month/day
  1362.            ah = 6     Set 24 hour alarm (alarm vectors to int 4Ah)
  1363.                         Call with:  ch/cl = hours/minutes
  1364.                                     dh = seconds
  1365.            ah = 7     Clear alarm
  1366.            ah = 9     Get alarm time & status
  1367.                         Returns:    ch/cl = hours/minutes
  1368.                                     dh = seconds
  1369.                                     dl = 0/1 alarm off/on
  1370.            ah = 0Ah   Get days counter
  1371.                         Returns:    cx = number of days since 1-Jan-80
  1372.            ah = 0Bh   Set days counter
  1373.                         Call with:  cx = number of days since 1-Jan-80
  1374.  
  1375. 1B
  1376.     ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ int 1Bh ▒▒▒▒▒
  1377.      
  1378.       KEYBOARD BREAK (when Control-Break pressed)
  1379.  
  1380. 1C
  1381.     ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ int 1Ch ▒▒▒▒▒
  1382.      
  1383.       TIMER TICKS - Called every 18.2 ms
  1384.  
  1385. 1D
  1386.     ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ int 40h ▒▒▒▒▒
  1387.      
  1388.       FLOPPY DISK SERVICES
  1389.  
  1390. 1E
  1391.     ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ int 70h ▒▒▒▒▒
  1392.      
  1393.       REAL-TIME CLOCK  (called by hardware 8259-2, IRQ 8)
  1394.      
  1395.          This interrupt services the real-time clock hardware.  The hardware
  1396.          supports 2 modes of operation, an interrupt at a specific 24 hour
  1397.          interval (i.e 9:42 am), or repeatedly every 0.976 ms (1,024 Khz).
  1398.          Both modes can operate at the same time if needed.
  1399.      
  1400.          In the 24 hour alarm mode, the interrupt is vectored here by hardware
  1401.          and interrupt 4Ah is called to alert the application program of the
  1402.          alarm.  Int 4Ah is not handled by the BIOS other than to return, and
  1403.          is normally revectored by a particular application using the alarm.
  1404.      
  1405.          When repeating interrupt mode is active, the 32-bit microsecond
  1406.          counter consisting of timer_clk_low and timer_clk_hi is decremented
  1407.          by 976 us on every interrupt.  When the timer reaches zero, the
  1408.          byte pointed to by the offset @timer_wait_off and segment
  1409.          @timer_wait_seg is set to 80h (this pointer is set by an application
  1410.          program through int 1Ah function ah=6).
  1411.  
  1412. 1F
  1413.     ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ int 71h ▒▒▒▒▒
  1414.      
  1415.       For General Adapter Use (called by hardware 8259-2, IRQ 9)
  1416.      
  1417.          The BIOS calls interrupt 0Ah to simulate IRQ 2, which is no longer
  1418.          available on AT+ systems.  Since IRQ 9 is the same physical
  1419.          line as the IRQ 2 line on the PC, it is recommended an adapter use
  1420.          interrupt Ah to handle IRQ 9.  This maintains full compatibility
  1421.          will all platforms.
  1422.  
  1423. 20
  1424.     ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ int 72h ▒▒▒▒▒
  1425.      
  1426.       For General Adapter Use (called by hardware 8259-2, IRQ 10)
  1427.  
  1428. 21
  1429.     ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ int 73h ▒▒▒▒▒
  1430.      
  1431.       For General Adapter Use (called by hardware 8259-2, IRQ 11)
  1432.  
  1433. 22
  1434.     ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ int 74h ▒▒▒▒▒
  1435.      
  1436.       For General Adapter Use (called by hardware 8259-2, IRQ 12)
  1437.  
  1438. 23
  1439.     ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ int 75h ▒▒▒▒▒
  1440.      
  1441.       MATH COPROCESSOR (called by hardware 8259-2 IRQ 13)
  1442.      
  1443.          The external math coprocessor invokes this interrupt.  Int 75h 
  1444.          calls the non-maskable interrupt int 2 to flag an error occurred
  1445.          with the current math operation.  This is done to maintain full
  1446.          compatibility with the original PC/XT which had the coprocessor
  1447.          connected to interrupt 2 (NMI).
  1448.  
  1449.          In normal operation, the program using the math coprocessor is 
  1450.          responsible for hooking interrupt 2h and handling the error.
  1451.          If it does not hook interrupt 2h, the BIOS will usually halt
  1452.          the system.
  1453.  
  1454. 24
  1455.     ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ int 76h ▒▒▒▒▒
  1456.      
  1457.       HARD DISK CONTROLLER (called by hardware 8259-2 IRQ 14)
  1458.      
  1459.          When the hard disk controller has completed its task, it signals
  1460.          completion though hardware activation of int 76h.  The status in
  1461.          hdsk_int_flags is set to "done", a value of 0FFh.  Interrupt 15,
  1462.          function 91h may also be called to signal the interrupt is done.
  1463.  
  1464. 25
  1465.     ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ int 77h ▒▒▒▒▒
  1466.      
  1467.       For General Adapter Use (called by hardware 8259-2 IRQ 15)
  1468.  
  1469. 26
  1470.     ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ int 13h ▒▒▒▒▒
  1471.      
  1472.       HARD DISK SERVICES
  1473.      
  1474.          Call with: ah = sub-function number 
  1475.                     dl = drive number (unless otherwise noted) 80h or 81h
  1476.                            for fixed disk 0 or 1.
  1477.      
  1478.          Returns:   carry = 0 if function ok
  1479.                     ah = status (unless otherwise noted)
  1480.                       ah = 0    Function ok
  1481.                       ah = 1    Invalid value passed or unsupported function
  1482.                       ah = 2    Can not locate address mark
  1483.                       ah = 3    Write protected
  1484.                       ah = 4    Sector not found
  1485.                       ah = 5    Reset failure
  1486.                       ah = 7    Parameter activity failed
  1487.                       ah = 8    DMA overrun occurred
  1488.                       ah = 9    DMA attempted across 64K byte boundary
  1489.                       ah = 0Ah  Sector flag bad
  1490.                       ah = 0Bh  Cylinder bad
  1491.                       ah = 0Dh  Wrong # of sectors (format)
  1492.                       ah = 0Eh  Detected control data address mark
  1493.                       ah = 0Fh  DMA arbitration level has invalid range
  1494.                       ah = 10h  CRC or EDC (Error Detect & Correct) has an
  1495.                                   unresolvable error
  1496.                       ah = 11h  Data corrected by EDC
  1497.                       ah = 20h  Disk controller failure
  1498.                       ah = 40h  Seek operation failed
  1499.                       ah = 80h  Hard disk not ready
  1500.                       ah = BBh  Error not defined
  1501.                       ah = CCh  Write error
  1502.                       ah = E0h  Error register is zero
  1503.                       ah = FFh  Disk sense error
  1504.                     If dl bit 7 was set to 1 on entry:
  1505.                       cx bits 7&6, 15-8 = highest cylinder number
  1506.                          bits 0-5 = highest sector number
  1507.                       dh = highest head number
  1508.                       dl = number of hard disks (1 or 2)
  1509.      
  1510.          Functions:
  1511.            ah = 0     Hard disk controller reset
  1512.            ah = 1     Get last status
  1513.            ah = 2     Read sectors
  1514.                         Call with:  al = number of sectors to read
  1515.                                     cx bits 7&6, 15-8 = cylinder number
  1516.                                        bits 0-5 = sector number
  1517.                                     dh = head number, head 0 = 0
  1518.                                     es:bx = ptr to buffer where to put data
  1519.            ah = 3     Write sectors
  1520.                         Call with:  al = number of sectors to write
  1521.                                     cx bits 7&6, 15-8 = cylinder number
  1522.                                        bits 0-5 = sector number
  1523.                                     dh = head number, head 0 = 0
  1524.                                     es:bx = ptr to buffer where to get data
  1525.            ah = 4     Verify sectors
  1526.                         Call with:  al = number of sectors to compare
  1527.                                     cx bits 7&6, 15-8 = cylinder number
  1528.                                        bits 0-5 = sector number
  1529.                                     dh = head number, head 0 = 0
  1530.            ah = 5     Format cylinder (non-ESDI type disks)
  1531.                         Call with:  cx bits 7&6, 15-8 = cylinder number
  1532.                                     dh = head number, head 0 = 0
  1533.                                     es:bx = ptr to bad sector map (non XT)
  1534.                                     al = interleave number (XT only)
  1535.            ah = 6     Format cylinder & set bad sector flags (XT only)
  1536.                         Call with:  al = interleave number
  1537.                                     cx bits 7&6, 15-8 = cylinder number
  1538.                                     dh = head number, head 0 = 0
  1539.            ah = 7     Format drive, begin at specific cylinder (XT only)
  1540.                         Call with:  al = interleave number
  1541.                                     cx bits 7&6, 15-8 = cylinder number
  1542.                                     dh = head number, head 0 = 0
  1543.            ah = 8     Get drive parameters
  1544.                         Returns:    cx bits 7&6, 15-8 = max cylinder number
  1545.                                        bits 0-5 = max sector number
  1546.                                     dh = max head number, head 0 = 0
  1547.            ah = 9     Set parameters for drive (ignored for ESDI drives)
  1548.                         Call with   dh = 80h to use int 41h ptr, drive 0
  1549.                                     dh = 81h to use int 46h ptr, drive 1
  1550.            ah = 0Ch   Disk seek
  1551.                         Call with:  cx bits 7&6, 15-8 = cylinder number
  1552.                                     dh = head number, head 0 = 0
  1553.            ah = 0Dh   Secondary Disk Reset
  1554.            ah = 10h   Check if drive is ready
  1555.            ah = 11h   Recalibrate drive
  1556.            ah = 15h   Get drive type (all but XT systems)
  1557.                         Returns:    ah = 0 no drive (cx & dx = 0)
  1558.                                     ah = 3 hard disk
  1559.                                     cx:dx = size of disk in 512 byte blocks
  1560.                                     al = 4  use a 720K disk in a 720K drive
  1561.            ah = 19h   Park disk heads (PS/2 systems only)
  1562.            ah = 1Ah   Format hard disk (ESDI only)
  1563.                         Call with:  al = number of blocks in defect table (0=none)
  1564.                                     cl bit 0 = 1 when no primary defect map
  1565.                                        bit 1 = 1 when no secondary defect map
  1566.                                        bit 2 = 1 allow logging found surface errors
  1567.                                                    in the secondary defect map
  1568.                                        bit 3 = 1 Do extended surface analysis
  1569.                                        bit 4 = 1 interrupt after each cyldr format
  1570.  
  1571. 27
  1572.     ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ unused ▒▒▒▒▒
  1573.      
  1574.       Unused interrupt vector termination
  1575.      
  1576.          This routine processes invalid and unused interrupt requests.  The
  1577.          hardware IRQ number is loaded into gen_int_occured, and the interrupt
  1578.          cleared.  For software calls to an unused interrupt, a value 0FFh is
  1579.          loaded into gen_int_occured, and the routine returns to the caller
  1580.          without changing registers.
  1581.      
  1582.          Alternatively, some systems simply return (iret).
  1583.  
  1584. 28
  1585.     ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ int 18h ▒▒▒▒▒
  1586.      
  1587.       ROM BASIC
  1588.      
  1589.          Note: ROM basic points to F600 segment, and has been adjusted to
  1590.                segment F000 to process in-line with the balance of the
  1591.                BIOS code.  Internal data references may shift to segment
  1592.                F600 depending on implementation.
  1593.  
  1594. 29
  1595.     ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ System Reset ▒▒▒▒▒
  1596.      
  1597.       SYSTEM RESET
  1598.      
  1599.          Reset the computer system.  General operation includes a test of
  1600.          of the CPU, ROM checksum, and initialization of hardware including:
  1601.      
  1602.             Memory system
  1603.             Timer/Counter (which is also used for RAM refresh)
  1604.             Interrupt Controller(s)
  1605.             DMA Controller(s)
  1606.             Keyboard Controller
  1607.             Video Controller & Video RAM
  1608.             Floppy Controller
  1609.             Hard Disk Controller (if present)
  1610.      
  1611.          Portions of the hardware may also have specific tests made to
  1612.          insure reliable operation.  Test failures may display error code
  1613.          on the screen if the video subsystem is operational, or generate
  1614.          beeps or LED blinks to signify the error.
  1615.            
  1616.          Note: A soft reset uses the warm_boot_flag to skip the memory
  1617.                tests. (i.e. from pressing Ctrl-Alt-Del).
  1618.      
  1619.          The system checks for installed ROMs by searching memory from
  1620.          C000h to the beginning of the BIOS, in 2K chunks.  ROM memory is
  1621.          identified if it starts with the word AA55h.  It is followed a one
  1622.          byte field length of the ROM (divided by 512).  If ROM is found,
  1623.          the BIOS will call the ROM at an offset of 3 from the beginning.
  1624.          This feature was not supported in the earliest PC machines.
  1625.      
  1626.          The last task turns control over to the bootstrap loader (assuming
  1627.          the floppy controller is operational)
  1628.  
  1629. 2A
  1630.     ══════ BIOS EXTERNAL ENTRY POINT ═══════════════════════════════════════
  1631.  
  1632. 2B
  1633.     ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ BIOS Setup ▒▒▒▒▒▒▒
  1634.      
  1635.       BIOS SETUP ROUTINES
  1636.       
  1637.          When a special key combination is pressed, this setup routine is
  1638.          run to allow changing CMOS BIOS values.  Typical key combinations
  1639.          include CTRL-ALT-ESC, CTRL-ALT-S, or others to start the setup.
  1640.           
  1641.          Once invoked, it may issue a system reset to let other application
  1642.          software, other BIOS routines, and TSR's to configure the system
  1643.          with the new information.
  1644.           
  1645.          Typical options include:
  1646.         
  1647.                 Present time and date
  1648.                 Floppy disk settings
  1649.                 Hard disk table selection
  1650.                 Video display
  1651.                 Memory size
  1652.                 Speed of clock and/or bus
  1653.  
  1654. 2C
  1655.     ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ INTERRUPT ▒▒▒▒▒
  1656.      
  1657. 2D  
  1658.     ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ BIOS Initialization ▒▒▒▒▒▒▒
  1659.       
  1660.       This portion is called when the main computer BIOS passes control to
  1661.       allow this BIOS to perform it's one-time start up code.  
  1662.      
  1663. 2E
  1664.     ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ Exception Handler ▒▒▒▒▒
  1665.      
  1666.       Protected Mode Exception Handler
  1667.      
  1668.          When the BIOS goes into protected mode, the exception vectors will
  1669.          point to this handler.  The usual process is to initiate a system 
  1670.          reset, since no interrupts should occur during this process.
  1671.  
  1672. end
  1673.  
  1674.  
  1675.  ::::::::::::::::::::::::::::: SUBROUTINE REMARKS :::::::::::::::::::::::::::::
  1676.  
  1677.     ---------------------- Subroutine Reference Remarks -----------------------
  1678. end
  1679.  
  1680.  
  1681.         NOTES:  1)  Entries must be in consecutive sequential order.
  1682.                 2)  Remark characters ";" are automatically inserted.
  1683.                 3)  Up to 64,000 characters per remark, 32M maximum file size.
  1684.  
  1685.  
  1686.