home *** CD-ROM | disk | FTP | other *** search
/ Liren Large Software Subsidy 15 / 15.iso / s / s140 / 1.img / BIOS.REM < prev    next >
Encoding:
Text File  |  1989-05-12  |  64.5 KB  |  1,313 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.      \   /    \    /    \   / 8087  |
  25.      # of   video mode  RAM   -287 no
  26.      disk-  at boot up  00=16K    dsk
  27.      ettes  00=EGA      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. 004 Initialization test                       init_test_flag
  33. 005 Base memory size 0-1Meg, 1K steps         main_ram_size
  34. 006 Channel i/o size                          chan_io_size
  35. 007 █▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀█
  36.     █         KEYBOARD DATA         █
  37.     █▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄█
  38.     Keyboard flag bits                        keybd_flags_1
  39.       7   6   5   4    3   2   1   0
  40.     ins- cap num scrl alt ctl lef rig
  41.     sert --toggles--- --shifts down--
  42.  
  43. 008 Keyboard flag bits                        keybd_flags_2
  44.        7    6    5    4     3   2 1 0
  45.     insert caps num scrll  hold
  46.     ----now depressed---- toggle
  47.  
  48. 009 Alt & digit pad number buffr area         keybd_alt_num
  49. 00A Head ptr of circular key queue            keybd_q_head
  50. 00B Tail ptr of circular key queue            keybd_q_tail
  51. 00C 15 key queue (head=tail if empty)         keybd_queue
  52. 00D                                           unused
  53. 00E █▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀█
  54.     █          DISK DATA            █
  55.     █▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄█
  56.     Recalibrate floppy drive bits             dsk_seek_stat
  57.         3       2       1       0
  58.      drive-3 drive-2 drive-1 drive-0
  59.  
  60. 00F Motor running status & disk write         dsk_motor_stat
  61.         3       2       1       0
  62.      drive-3 drive-2 drive-1 drive-0
  63.      bit 7 = disk write in progress
  64.  
  65. 010 Motor timer, at 0, turn off motor         dsk_motor_tmr
  66. 011 Controller return code                    dsk_ret_code
  67.      01h = bad command
  68.      02h = can't find address mark
  69.      03h = can't write, protected dsk
  70.      04h = sector not found
  71.      08h = DMA overrun
  72.      09h = DMA attempt over 64K bound
  73.      10h = bad CRC on disk read
  74.      20h = controller failure
  75.      40h = seek failure
  76.      80h = timeout, no response
  77.  
  78. 012 Status bytes-disk controller chip         dsk_ctrl_stat
  79.      Note: 7 info bytes returned from
  80.      controller are saved here. Refer
  81.      to the NEC uPD 765 chip manual
  82.      for the specific info, depending
  83.      on the previous command issued.
  84. 013                                           unused
  85. 014 █▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀█
  86.     █          VIDEO DATA           █
  87.     █▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄█
  88.     Present display mode(see int 10h)         video_mode
  89. 015 Number of columns                         video_columns
  90. 016 Video buffer size in bytes                video_buf_size
  91. 017 Segment of active video memory            video_segment
  92.       MDA=0B000h, CGA=0B800h, etc.
  93.  
  94. 018 Cursor position page 0 │  bits           video_cur_pos0
  95. 019 Cursor position page 1 │  15-8           video_cur_pos1
  96. 01A Cursor position page 2 │ for row         video_cur_pos2
  97. 01B Cursor position page 3 │                 video_cur_pos3
  98. 01C Cursor position page 4 │  bits           video_cur_pos4
  99. 01D Cursor position page 5 │ 7-0 for         video_cur_pos5
  100. 01E Cursor position page 6 │ column #        video_cur_pos6
  101. 01F Cursor position page 7 │                 video_cur_pos7
  102.  
  103. 020 Active cursor, start & end lines         video_cur_mode
  104.       bits 12 to 8 for starting line
  105.       bits 4  to 0 for ending line
  106. 021 Present page                             video_page
  107. 022 Video controller base i/o address        video_port
  108. 023 Hardware mode register bits              video_mode_reg
  109. 024 Color set in CGA modes                   video_color
  110. 025 █▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀█
  111.     █         GENERAL DATA          █
  112.     █ Note: next 5 bytes also used  █
  113.     █    for cassette inferface in  █
  114.     █    older PCs.                 █
  115.     █▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄█
  116.     ROM initialization pointer               @gen_io_ptr
  117. 026 ROM i/o segment                          gen_io_seg
  118. 027 Unused interrupt occured                 gen_int_occurd
  119. 028 Timer, low word, cnts every 55 ms        timer_low
  120. 029 Timer, high word                         timer_hi
  121. 02A Timer overflowed since read last         timer_rolled
  122. 02B Bit 7 set if break key depressed         keybd_break
  123. 02C Set to 1234h to for warm boot            gen_warm_boot
  124. 02D █▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀█
  125.     █        HARD DISK DATA         █
  126.     █▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄█
  127.     Hard disk status                         hdsk_status_1
  128. 02E Number of hard disk drives               hdsk_count
  129. 02F Head control                             hdsk_head_ctrl
  130. 030 Hard disk control port                   hdsk_ctrl_port
  131. 031 █▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀█
  132.     █ I/O PORT TIMER, KEYBOARD DATA █
  133.     █▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄█
  134.     Countdown timers wait for printer        prn_timeout_1
  135. 032   to respond (prn ports 1 to 4)          prn_timeout_2
  136. 033 Countdown timers wait for RS-232         rs232_timout_1
  137. 034   ports to respond (ports 1 to 4)        rs232_timout_2
  138. 035 Ptr to begining of keyboard queue        @keybd_begin
  139. 036 Ptr to end of keyboard queue             @keybd_end
  140. 037 █▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀█
  141.     █  ADVANCED VIDEO DATA, EGA/VGA █
  142.     █▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄█
  143.     Rows of characters on display - 1        video_rows
  144. 038 Number of pixels per charactr * 8        video_pixels
  145. 039 Display adapter options                  video_options
  146.       bit 3 = 0 if EGA card active
  147. 03A Switch setting bits from adapter         video_switches
  148. 03B Video reserved 1                         video_1_resv
  149. 03C Video reserved 2                         video_2_resv
  150. 03D █▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀█
  151.     █ OTHER FLOPPY & HARD DISK DATA █
  152.     █▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄█
  153.     Last data rate for diskette              dsk_data_rate
  154. 03E Hard disk status                         hdsk_status_2
  155. 03F Hard disk error                          hdsk_error
  156. 040 Set for hard disk interrupt flag         hdsk_int_flag
  157. 041 Bit 0 = 1 when using 1 controller        hdsk_options
  158.      card for both hard disk & floppy
  159. 042 Media state for drive 0                  hdsk_media_st0
  160. 043 Media state for drive 1                  hdsk_media_st1
  161.         7      6      5      4
  162.      data xfer rate  two   media
  163.       00=500K bit/s  step  known
  164.       01=300K bit/s
  165.       10=250K bit/s
  166.         3      2      1      0
  167.      unused  -----state of drive-----
  168.              bits floppy  drive state
  169.              000=  360K in 360K, ?
  170.              001=  360K in 1.2M, ?
  171.              010=  1.2M in 1.2M, ?
  172.              011=  360K in 360K, ok
  173.              100=  360K in 1.2M, ok
  174.              101=  1.2M in 1.2M, ok
  175.              111=  state not defined
  176.  
  177. 044 Start state for drive 0                  hdsk_start_st0
  178. 045 Start state for drive 1                  hdsk_start_st1
  179. 046 Track number for drive 0                 hdsk_track_0
  180. 047 Track number for drive 1                 hdsk_track_1
  181. 048 █▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀█
  182.     █    ADVANCED KEYBOARD DATA     █
  183.     █▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄█
  184.     Special keyboard support                 keybd_flags_3
  185. 049 Keyboard Flags (advanced keybd)          keybd_flags_4
  186.       7      6       5     4  3 2 1 0
  187.     xmit   char   Resend  Ack   \   /
  188.     error was ID  Rec'd  Rec'd   LEDs
  189.  
  190. 04A █▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀█
  191.     █  REAL TIME CLOCK & LAN DATA   █
  192.     █▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄█
  193.     Ptr offset to wait done flag             @timer_wait_off
  194. 04B Ptr segment to wait done flag            @timer_wait_seg
  195. 04C Timer low word, 1 microsecond clk        timer_clk_low
  196. 04D Timer high word                          timer_clk_hi
  197. 04E Timer flag 00h = post acknowledgd        timer_clk_flag
  198.                01h = busy
  199.                80h = posted
  200. 04F Local area network bytes (7)             lan_1
  201. 050                                          unused
  202. 051 █▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀█
  203.     █   MORE ADVANCED VIDEO DATA    █
  204.     █▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄█
  205.     Ptr to advanced display adapters         @video_ptr_ctrl
  206.        parameter control block
  207. 052 Ptr to optional EGA/VGA save area        @video_sav1area
  208. 053 Ptr to optional alpha text table         @video_text_tbl
  209. 054 Ptr to optional graphc char table        @video_grph_tbl
  210. 055 Ptr to optional VGA save area 2          @video_sav2area
  211. 056 Days since 1-Jan-1980 counter
  212. 057 Print screen status                      prn_scrn_stat
  213.        00h = Print screen ready
  214.        01h = Print screen in progess
  215.        FFh = Error occured
  216. 058                                          unused
  217. 059                                          unused
  218. 05A                                          unused
  219. 05B                                          unused
  220. 05C                                          unused
  221. 05D █▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀█
  222.     █     Floppy Disk Parameters    █
  223.     █▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄█
  224.      hi nibble = stepping rate in ms
  225.      lo nibble = head unload time, ms
  226. 05E  2nd info byte bit 0 = 0 for DMA
  227. 05F  Delay after use for motor off
  228. 060  Bytes per sector  0 =  128 bytes
  229.                        1 =  256 bytes
  230.                        2 =  512 bytes
  231.                        3 = 1024 bytes
  232. 061  Number of sectors per track
  233. 062  Gap Length
  234. 063  Data Length
  235. 064  Format Gap Length
  236. 065  Format write byte
  237. 066  Head load time, in milliseconds
  238. 067  Motor startup wait time * .125ms
  239. 068 █▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀█
  240.     █    Video Hardware Registers   █
  241.     █▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄█
  242.       mode CGA 40 columns x 25 lines
  243. 069   mode CGA 80 columns x 25 lines
  244. 06A   mode CGA graphics
  245. 06B   mode MDA 80 columns x 25 lines
  246. 06C Video buffer bytes CGA 40x25
  247. 06D Video buffer bytes CGA 80x25
  248. 06E Video buffer bytes CGA Graphics
  249. 06F Video buffer bytes CGA Graphics
  250. 070 Video columns per modes 0-7
  251. 071 Video hardware modes (0-7)
  252. 072 █▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀█        dsk_info_table
  253.     █ Hard Disk Information Tables  █
  254.     █                               █
  255.     █   Each sub-table contains a   █
  256.     █   a set of 16 bytes for each  █
  257.     █   particular disk type.       █
  258.     █▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄█
  259.      Number of cylinders
  260. 073  Number of heads
  261. 074  Low write current cyl begin *
  262. 075  Write pre-compenstation cylinder
  263. 076  Error correction burst legth *
  264. 077  Miscellaneous bit functions:
  265.        bits 0-2 disk option, XT only*
  266.             0-2 unused, all others
  267.             3 = 1 if > 8 heads
  268.             4   unused
  269.             5 = 1 for bad map at last
  270.                  cylinder + 1
  271.             6 or 7 = 1 no retries
  272. 078  Normal timeout *
  273. 079  Format timeout *
  274. 07A  Check timeout  *
  275. 07B  Parking cylinder number
  276. 07C  Number of sectors per track
  277. 07D  Unused
  278.         * indicates XT machines only
  279. 07E Additional hard disk tables
  280. 07F Video characters in graphics modes       video_char_table
  281. 080 Characters, EGA  8x14 font
  282. 081 Characters, EGA  8x8 font (0-7F)
  283. 082 Characters, EGA  8x8 font (80-FF)
  284. 083 Character changes, EGA  8x14 font
  285. 084 Characters, VGA  8x16 font
  286. 085 Character changes, VGA  9x16 font
  287. 086 Video VGA paramter table ptr
  288. 087 Initial interrupt vectors                int_vec_table
  289. 088 BIOS version date code                   rom_versn_date
  290. 089 Model  FFh = PC                          model_type
  291.            FEh = 1st XT
  292.            FBh = later XTs
  293.            FCh = 80286 systems
  294.            FAh = models 25/30
  295.            F9h = lap-top
  296.            F8h = models 70/80 (80386)
  297. 08A Extended BIOS data/print 4               BIOS_data_seg
  298. 08B █▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀█        VGA_parm_tbl
  299.     █   Video VGA Parameter Tables  █
  300.     █                               █
  301.     █   64 byte sub-table per mode  █
  302.     █  offset/size     function     █
  303.     █  -- --------  --------------  █
  304.     █   0  1 byte   # of columns    █
  305.     █   1  1 byte   # of rows       █
  306.     █   2  1 byte   # bytes/char    █
  307.     █   3  1 word   # bytes/page    █
  308.     █   5  5 bytes  sequencer regs  █
  309.     █  10 25 bytes  display regs    █
  310.     █  35 20 bytes  attribute regs  █
  311.     █  55  9 bytes  graphics regs   █
  312.     █▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄█
  313.  
  314. end
  315.  
  316.  
  317.  
  318.  ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ LOCATION REMARKS ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
  319.  
  320.     ----------------------- Location Reference Remarks ------------------------
  321.  
  322. 01
  323.     ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ int 1 ▒▒▒▒▒▒▒
  324.  
  325.        SINGLE STEP
  326.  
  327.  
  328. 02
  329.     ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ int 2 ▒▒▒▒▒▒▒
  330.  
  331.       NON-MASKABLE HARDWARE INTERRUPT
  332.  
  333.          This function is called in the event of a memory parity error or may
  334.          occur in the event of other hardware problems or failures (depends on
  335.          on the specific manufacturer's hardware).  Displays the appropriate
  336.          error message and halts the processor.
  337.  
  338. 03
  339.     ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ int 3 ▒▒▒▒▒▒▒
  340.  
  341.       DEBUG BREAKPOINT
  342.  
  343. 04
  344.     ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ int 4 ▒▒▒▒▒▒▒
  345.  
  346.       OVERFLOW
  347.  
  348. 05
  349.     ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ int 5 ▒▒▒▒▒▒▒
  350.  
  351.       PRINT SCREEN
  352.  
  353.          Send the present active display screen contents to the printer if
  354.          the printer is idle and not out of paper.  The status of the print
  355.          screen function is in prn_screen_stat at 0050:0000.  Control-Break
  356.          will terminate an active print screen operation.
  357.  
  358. 06
  359.     ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ int 6 ▒▒▒▒▒▒▒
  360.  
  361.       BAD OPCODE DETECTED
  362.  
  363. 07
  364.  
  365. 08
  366.     ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ int 8 ▒▒▒▒▒▒▒
  367.  
  368.       TIMER TICKS  (called by hardware 8259-1, IRQ 0)
  369.  
  370.          This is the primary timer used to control the clock and other key
  371.          system resources.  It is called indirectly by channel A of the 8253
  372.          timer every 18.2 milliseconds.  Every timer tick also calls int 1Ch
  373.          for user needs (int 1Ch points to an iret instruction in less changed
  374.          by a resident program).  The timer interrupt is given the highest
  375.          maskable interrupt priority upon power up.
  376.  
  377.          The main timing functions of int 8 include increment of a 32 bit
  378.          time since powered on counter, timer_hi and timer_low, and after 24
  379.          hours since powered on, timer_rolled is incremented.
  380.  
  381.          The last task of int 8 is turning off the floppy drive motor after
  382.          2 seconds of non-use.  The counter dsk_motor_tmr is decremented upon
  383.          each occurance of int 8.  When the count reaches zero, the motor is
  384.          set off, and the motor running flags are cleared in dsk_motor_stat.
  385.  
  386. 09
  387.     ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ int 9 ▒▒▒▒▒▒▒
  388.  
  389.       KEYBOARD I/O  (called by hardware 8259-1, IRQ 1)
  390.  
  391.          When any key is pressed on the keyboard, the hardware calls this
  392.          interrupt to service the pressed key or key combination.   The
  393.          hardware provides the key pressed in a non-ascii scan code format
  394.          read at i/o port 60h.  The servicer acknowledges receipt of the key
  395.          by toggling bit 7 of port 61h.  (Port 61h should be read first, then
  396.          bit 7 ored on, output to port 61h, then anded off, and resent to
  397.          port 61h).
  398.  
  399.          The read key is decoded to yield an ascii character, special function
  400.          key (such as F1) or a control function like Left Shift Key down.
  401.          The converted ASCII character is placed into the next available
  402.          position in the circular queue keybd_queue to keybd_q_end.  It is
  403.          put in the position indicated by keydb_q_tail when it will not
  404.          cause the loss of earlier entered data.  The value keybd_q_head
  405.          points to the oldest key pressed in the buffer which has not been
  406.          removed from the queue (the normal process uses int 16h to remove
  407.          keys from the queue and return the key value to the int 16h caller).
  408.  
  409.          The 16 word queue holds up to 16 keys.  If keybd_q_head equals the
  410.          keybd_q_tail, the queue is empty.  Valid keys in the queue comprise
  411.          the upper byte scan code and the lower byte ascii character.  If the
  412.          key pressed has no ascii equivalent (i.e F1 to F12), the lower byte
  413.          is zero.
  414.  
  415.          Toggle and shift keys are not placed in the buffer, but appear in 2
  416.          status registers keybd_flags_1 and keybd_flags_2.
  417.  
  418.          Special key combinations will cause other events to occur:
  419.             Ctrl-Alt_Del  -  Reset computer by jumping to power_on_reset
  420.             Print screen  -  Call int_5_prn_scrn to print the current screen
  421.             Cnrl-Break    -  Call int_1Bh control break key processor (DOS)
  422.             Pause         -  Wait until a ascii key is pressed, without
  423.                              placing the key in the queue
  424.  
  425. 0A
  426.     ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ int 0Ah ▒▒▒▒▒
  427.  
  428.       LAN ADAPTER (called by hardware 8259-1, IRQ 2 - see below)
  429.  
  430.          On systems equipped with 2 interrupt controller chips (8259), IRQ 2
  431.          is used to support the second interrupt controller.  In this case,
  432.          int 71h (IRQ 9) is used to replace IRQ 2.  Hardware calls to int 71h
  433.          are redirected to this interrupt to maintain compatibility.
  434.  
  435. 0B
  436.     ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ int 0Bh ▒▒▒▒▒
  437.  
  438.       RS-232 SERIAL HANDLER (called by hardware 8259-1, IRQ 3)
  439.  
  440.          Called by the secondary serial port chip.
  441.  
  442. 0C
  443.     ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ int 0Ch ▒▒▒▒▒
  444.  
  445.       RS-232 SERIAL HANDLER (called by hardware 8259-1, IRQ 4)
  446.  
  447.          Called by the primary serial port chip.
  448.  
  449. 0D
  450.     ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ int 0Dh ▒▒▒▒▒
  451.  
  452.       XT HARD DISK CONTROLLER (called by hardware 8259-1, IRQ 5)
  453.  
  454. 0E
  455.     ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ int 0Eh ▒▒▒▒▒
  456.  
  457.       FLOPPY DISK CONTROLLER (called by hardware 8259-1, IRQ 6)
  458.  
  459. 0F
  460.     ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ int 0Fh ▒▒▒▒▒
  461.  
  462.       PRINTER CONTROLLER (called by hardware 8259-1, IRQ 7)
  463.  
  464.          This interrupt is normally avoided.  If a bad interrupt occurs,
  465.          it will vector to this spot (when caused a misprogramed 8259
  466.          interrupt controller)
  467.  
  468. 10
  469.     ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ int 10h ▒▒▒▒▒
  470.  
  471.       VIDEO DISPLAY SERVICES
  472.  
  473.          Called with:  ah = primary function number
  474.  
  475.          Returns: (unless otherwise indicated)
  476.                        ax - altered (some systems may not alter ax)
  477.  
  478.          Functions:
  479.            ah = 0     Set video display mode in al.
  480.            ah = 1     Set cursor size
  481.                         Call with:  ch = top line, 0-32
  482.                                     cl = bottom line, 0-32
  483.            ah = 2     Set cursor location
  484.                         Call with:  bh = page number, 0 = 1st page
  485.                                     dh = row (0 for top row)
  486.                                     dl = column (0 for left most)
  487.            ah = 3     Get cursor location
  488.                         Call with:  bh = page number, 0 = 1st page
  489.                         Returns:    ch/cl = cursor size (top & bottom)
  490.                                     dh/dl = row and column of cursor
  491.            ah = 4     Get light pen location
  492.                         Returns:    ah = 0 not on/unsupported & bx,cx,dx changed
  493.                                          1 status valid
  494.                                     bx = pixel column
  495.                                     cx = horizontal line number
  496.                                     dh/dl = row and column
  497.            ah = 5     Set Page number al, 0 = 1st page
  498.            ah = 6     Up scroll screen
  499.                         Call with:  al = # bottom lines to clear, set 0 for all
  500.                                     bh = attribute to fill cleared lines
  501.                                     ch/cl = row/column of top left scroll corner
  502.                                     dh/dl = row/column of bottom right scroll corner
  503.            ah = 7     Down scroll screen
  504.                         Call with:  al = # top lines to clear, set 0 for all
  505.                                     bh = attribute to fill cleared lines
  506.                                     ch/cl = row/column of top left scroll corner
  507.                                     dh/dl = row/column of bottom right scroll corner
  508.            ah = 8     Get character & attribute at cursor
  509.                         Call with:  bh = page number, 0 = 1st page
  510.                         Returns:    ah/al = attribute/character
  511.            ah = 9     Write character & attribute at cursor (graphics modes)
  512.                         Call with:  al = character
  513.                                     bh = page number, 0 = 1st page
  514.                                     bl = attribute, bit 7 = 1 to xor with old color
  515.                                     cx = Number of same characters to write
  516.            ah = 0Ah   Write character at cursor (graphics modes)
  517.                         Call with:  al = character
  518.                                     bh = page number, 0 = 1st page
  519.                                     cx = Number of same characters to write
  520.            ah = 0Bh   Set colors (typically in low res modes)
  521.                         Call with:  bh = 0, bl = color low res background, border
  522.                                     bh = 1, bl = 0/1 for low res color group 0/1
  523.            ah = 0Ch   Write graphics dot
  524.                         Call with:  al = color, bit 7 = 1 to xor bit with old color
  525.                                     cx/dx = pixel row/pixel column
  526.            ah = 0Dh   Read graphics dot
  527.                         Call with:  cx/dx = pixel row/pixel column
  528.            ah = 0Eh   Write in ascii mode (cr, lf, bell, and bs as operators)
  529.                         Call with:  al/bl = character/color
  530.            ah = 0Fh   Get video info
  531.                         Returns:    ah = columns active
  532.                                     al = active video mode
  533.                                     bh = active page, 0 = 1st page
  534.            ah = 10h   Colors  (EGA/VGA)   Called with al = subfunction
  535.                         al = 1    bl = color register (0-15)  bh = color to set
  536.                         al = 2    es:dx = ptr to change all 16 colors & overscan #
  537.                         al = 3    bl = color high bit as: 0-intensity, 1-blink
  538.                       For VGA equipped systems only
  539.                         al = 7    bl = color register to get in bh
  540.                         al = 8    bh = returned overscan value
  541.                         al = 9    es:dx = ptr where to put all 16 colors & overscan
  542.                         al = 10h  bx = color register to set; ch/cl/dl = grn/blu/red
  543.                         al = 12h  es:dx = ptr to change color registers
  544.                                   bx = 1st register to set, cx = # of registers
  545.                         al = 13h  bl = 0, set color page mode in bh
  546.                                   bl = 1, set page;  bh = page number
  547.                         al = 15h  bx = color reg to read; ch/cl/dl = grn/blu/red
  548.                         al = 17h  es:dx = ptr where to load color regs
  549.                                   bx = 1st register to get, cx = # of registers
  550.                         al = 1Ah  get color page info; bl = mode; bh = page #
  551.            ah = 11h   Reset mode with new character set (leave memory as-is)
  552.                         al = 0    Character set load
  553.                                   es:bp = ptr to table of chars
  554.                                   bl/bh = which block/bytes per char
  555.                                   cx/dx = # of characters/where to start in block
  556.                         al = 1    bl = block to load the mono character set
  557.                         al = 2    bl = block to load the double wide character set
  558.                         al = 3    bl = block select related to attribute
  559.                         al = 4    bl = block to load the 8 by 16 set (VGA)
  560.                         al = 10h - 14h same as 0 - 4, must occur after setting mode
  561.                         al = 20h  es:bp = ptr to table of char, using int 1Fh ptr
  562.                         al = 21h  es:bp = ptr to table of char, using int 43h ptr
  563.                                   bl = 0-dl=# rows; 1-14 rows; 2-25 rows; 3-43 rows
  564.                                   cx = number of bytes per character in table
  565.                         al = 22h  use 8 by 14 char set, bl=rows (see al=21h)
  566.                         al = 23h  use double wide char set, bl=rows (see al=21h)
  567.                         al = 24h  use 8 by 16 char set, bl=rows (see al=21h)
  568.                       Get table pointer and info
  569.                         al = 30h  es:bp = ptr returned; cx=bytes per char; dl=rows
  570.                                   bh = 0, get int 1Fh      bh = 4, get double wide
  571.                                   bh = 1, get int 43h      bh = 5, get mono 9 by 14
  572.                                   bh = 2, get 8 by 14      bh = 6, get 8 by 16 (VGA)
  573.                                   bh = 3, get double wide  bh = 7, get 9 by 16 (VGA)
  574.            ah = 12h   Miscellaneous functions, bl = sub-function
  575.                         bl = 10h  Get info,  bh = 0-now color, 1-now mono
  576.                                   ch/cl = info bits/switches
  577.                         bl = 20h  Set print screen to work with EGA/VGA
  578.                       Functions for VGA only (bl = 30-34h return al = 12h)
  579.                         bl = 30h  Set # of scan lines, 0-200, 1-350, 2-400
  580.                                     activates after mode change
  581.                         bl = 31h  ax = 0/1  allow/prevent palette load with new mode
  582.                         bl = 32h  al = 0/1  video off/on
  583.                         bl = 33h  al = 0/1  gray scale summing off/on
  584.                         bl = 34h  al = 0/1  scale cursor size to font off/on
  585.                         bl = 35h  switch between adapter and motherboard video
  586.                                   al = 0, adapter off, es:dx = save state area
  587.                                   al = 1, motherboard on
  588.                                   al = 2, active video off, es:dx = save area
  589.                                   al = 3, inactive video on, es:dx = save area
  590.                         bl = 36h  al = 0/1  screen off/on
  591.            ah = 13h   Write character string (cr, lf, bell, and bs as operators)
  592.                         Call with:  al = 0/1 write characters, cursor not/is moved
  593.                                           bl = attribute of all characters
  594.                                        = 2/3 write characters, cursor not/is moved
  595.                                           string alternates character & attribute
  596.                                     bh = page number, 0 = 1st page
  597.                                     cx = number of characters
  598.                                     dh/dl = row and column to start
  599.                                     es:bp = ptr to character string
  600.            ah = 14h   LCD display support, al = sub-function
  601.                          al = 0,    es:di = ptr to font table to load
  602.                                     bl/bh = which block/bytes per char
  603.                                     cx/dx = # of characters/where to start in block
  604.                          al = 1,    bl = block # of ROM font to load
  605.                          al = 2,    bl = how to support high intensity
  606.            ah = 15h   LCD info table ptr returned in es:di, ax has display type
  607.  
  608.                               **** VGA SUPPORT ONLY ****
  609.            ah = 16h   Get/Set types of displays which are operating
  610.                          al = 0, returns - bx = display(s) used, al = 1Ah
  611.                          al = 1, set     - bx = display(s) used, returns al = 1Ah
  612.            ah = 1Bh   Get video system information
  613.                          call with:  bx = 0
  614.                                      es:di = ptr to buffer where to put info
  615.            ah = 1Ch   Video system save & restore, al = sub-function
  616.                          call with:  al = 0, get buffer size
  617.                                         = 1, save system, buffer at es:bx
  618.                                         = 2, restore system, buffer at es:bx
  619.                                      cx bit 0 = 1 for hardware registers
  620.                                         bit 1 = 1 for software states
  621.                                         bit 2 = 1 for colors & DAC registers
  622.  
  623. 11
  624.     ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ int 11h ▒▒▒▒▒
  625.  
  626.       EQUIPMENT INSTALLED
  627.  
  628.          Returns:   ax = equip_install word
  629.  
  630.                          15   14   13   12   11   10    9    8
  631.                           \        /   game  \          /
  632.                          # of printer  port   # of RS-232
  633.                           ports 0-4    used    ports 0-4
  634.  
  635.                           7    6    5    4    3    2    1    0
  636.                           \    /    \    /    \    /  8087   |
  637.                            # of   video mode   RAM   80287   no
  638.                           floppy  at boot up  00=16K       floppy
  639.                           drives  00=EGA      01=32K       drive
  640.                             1-4   01=CGA-40   10=48K       if 0
  641.                           if bit  10=CGA-80   11=64K
  642.                            0 = 1  11=MDA-80   (old PCs)
  643.  
  644.          Regs used: ax
  645.  
  646. 12
  647.     ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ int 12h ▒▒▒▒▒
  648.  
  649.       SYSTEM MEMORY SIZE
  650.  
  651.          Returns:   ax = number of contiguous 1K bytes blocks of memory
  652.                          from 0 to 640 K.
  653.  
  654.          Regs used: ax
  655.  
  656. 13
  657.     ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ int 13h ▒▒▒▒▒
  658.  
  659.       FLOPPY DISK SERVICES
  660.  
  661.          Note: Floppy disk services may be vectored to this routine from int 40h
  662.                on newer systems with hard disk support inside the BIOS.
  663.  
  664.          Call with: ah = sub-function number
  665.                     dl = drive number (in less otherwise noted), drive a: = 0
  666.  
  667.          Returns:   carry = 0 if function ok
  668.                     ah = status (unless otherwise noted)
  669.                       ah = 0    Function ok
  670.                       ah = 1    Invalid value passed or unsupported function
  671.                       ah = 2    Can not locate address mark
  672.                       ah = 3    Floppy write protected
  673.                       ah = 4    Sector not found
  674.                       ah = 6    Floppy changed line on (1.2 meg drives)
  675.                       ah = 8    DMA overrun occured
  676.                       ah = 9    DMA attempted across 64K byte boundry
  677.                       ah = 0Ch  Media type not found
  678.                       ah = 10h  CRC read error
  679.                       ah = 20h  Floppy controller failure
  680.                       ah = 40h  Seek operation failed
  681.                       ah = 80h  Floppy drive not ready
  682.  
  683.          Functions:
  684.            ah = 0     Floppy disk controller reset
  685.            ah = 1     Get last status
  686.            ah = 2     Read sectors
  687.                         Call with:  al = number of sectors to read
  688.                                     ch/cl = starting track/starting sector
  689.                                     dh = head number, head 0 = 0
  690.                                     es:bx = ptr to buffer where to put data
  691.            ah = 3     Write sectors
  692.                         Call with:  al = number of sectors to write
  693.                                     ch/cl = starting track/starting sector
  694.                                     dh = head number, head 0 = 0
  695.                                     es:bx = ptr to buffer where to get data
  696.                         Return:     al = number of sectors written
  697.            ah = 4     Verify sectors
  698.                         Call with:  al = number of sectors to compare
  699.                                     ch/cl = starting track/starting sector
  700.                                     dh = head number, head 0 = 0
  701.                                     es:bx = ptr to buffer where to compare data
  702.                         Return:     al = number of sectors checked
  703.            ah = 5     Format track
  704.                         Call with:  al = number of sectors to format
  705.                                     ch/cl = starting track/starting sector
  706.                                     dh = head number, head 0 = 0
  707.                                     es:bx = ptr to table of address fields
  708.            ah = 8     Get drive information (not supported by all systems)
  709.                         Returns:    ax/bh = 0          size dia.     size dia.
  710.                                     bl = drive type: 1=360K 5.25   3=720K 3.5
  711.                                                      2=1.2M 5.25   4=1.4M 3.5
  712.                                     cx bits 7&6, 15-8 = number of tracks, 0=1 track
  713.                                        bits 5-0 = number of sectors per track
  714.                                     dh/dl = # of heads/number of floppy drives
  715.                                     es:di = ptr to floppy parameter table
  716.            ah = 15h   Get drive type (not supported by all systems)
  717.                         Returns:    ah = 0 no drive
  718.                                     ah = 1/2  floppy changed line not/is available
  719.            ah = 16h   Get changed floppy status (not supported by all systems)
  720.                         Returns:    ah = 0   floppy in drive,     carry = 0
  721.                                     ah = 1   bad drive number,    carry = 1
  722.                                     ah = 6   floppy out of drive, carry = 1
  723.                                     ah = 80h drive not ready,     carry = 1
  724.            ah = 17h   Specify media type for a drive
  725.                         Call with:  al = 1  use a 320/360K floppy in 360k drive
  726.                                     al = 2  use a 360K floppy in a 1.2M drive
  727.                                     al = 3  use a 1.2M floppy in a 1.2M drive
  728.                                     al = 4  use a 720K disk in a 720K drive
  729.            ah = 18h   Prepare for format (not supported by all systems)
  730.                         Call with:  cx bits 7&6, 15-8 = number of tracks, 0=1 track
  731.                                        bits 5-0 = number of sectors per track
  732.                         Returns:    es:di = ptr to floppy parameter table
  733.  
  734. 14
  735.     ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ int 14h ▒▒▒▒▒
  736.  
  737.       RS-232 SERIAL PORTS SERVICES
  738.  
  739.          Call with: ah = sub-function number
  740.                     dx = communications number, com1 = 0
  741.  
  742.          Returns:   ah = line status,  bit 0 = Data ready
  743.                                        bit 1 = Overrun error
  744.                                        bit 2 = Parity error
  745.                                        bit 3 = CRC framing error
  746.                                        bit 4 = Break detect
  747.                                        bit 5 = Xmit buffer register empty
  748.                                        bit 6 = Xmit shift out register empty
  749.                                        bit 7 = No response, ignore bits 0-6
  750.  
  751.                     al = modem status, bit 0 = Change in Clear To Send
  752.                                        bit 1 = Change in Data Set Ready
  753.                                        bit 2 = Falling edge ring detect
  754.                                        bit 3 = Change in recieve detect line
  755.                                        bit 4 = Clear to Send (CTS)
  756.                                        bit 5 = Data Set Ready (DTS)
  757.                                        bit 6 = Ring detected
  758.                                        bit 7 = Receive detect line
  759.  
  760.          Functions:
  761.            ah = 0     Reset the specified port
  762.                         Call with:  al serial port register values
  763.                                        bits  7    6    5    4    3    2    1    0
  764.                                             --baud-rate--  -Parity- Stop  --Word--
  765.                                              000 =  110      bits    bit    size
  766.                                              001 =  150                    (bits)
  767.                                              010 =  300    00 = off  0=1
  768.                                              011 =  600    01 = odd  1=2   10 = 7
  769.                                              100 = 1200    10 = off        11 = 8
  770.                                              101 = 2400    11 = even
  771.                                              110 = 4800
  772.                                              111 = 9600
  773.           ah = 1      Transmit a character
  774.                         Call with:  al = character to send (not changed on exit)
  775.           ah = 2      Received a character
  776.                         Returns:    al = character received
  777.           ah = 3      Get status
  778.           ah = 4      Advanced Initialization (not supported on all systems)
  779.                         Call with:  al = 0/1  no break/break
  780.                                     bh = Parity,    0 = none     3 = stick odd
  781.                                                     1 = odd      4 = stick even
  782.                                                     2 = even
  783.                                     bl = 0/1 Stop bits set to 1/2
  784.                                     ch = Word size, 0 = 5 bits   2 = 7 bits
  785.                                                     1 = 6 bits   3 = 8 bits
  786.  
  787.                                     cl = Baud rate, 0 =  110     5 =  2400
  788.                                                     1 =  150     6 =  4800
  789.                                                     2 =  300     7 =  9600
  790.                                                     3 =  600     8 = 19200
  791.                                                     4 = 1200
  792.            ah = 5     Advanced port control (not supported on all systems)
  793.                         al = 0  Get modem register
  794.                                   Returns: bl bit 0 = Data Terminal Ready (DTR)
  795.                                               bit 1 = Request To Send (RTS)
  796.                                               bit 2 = Out 1
  797.                                               bit 3 = Out 2
  798.                                               bit 4 = Loop modem
  799.                         al = 1  Set modem register
  800.                                   Call with:  bl = value for register (see above)
  801.  
  802. 15
  803.     ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ int 15h ▒▒▒▒▒
  804.  
  805.       GENERAL SERVICES
  806.  
  807.          On old PCs this function is only used for cassette servicing.
  808.          Additional functions have been added for advanced features with
  809.          newer equipment.
  810.  
  811.          Called with: ah = function code
  812.  
  813.          Returns:     CF = 0 if successful
  814.                       CF = 1 if failure or function not supported
  815.  
  816.          Functions:
  817.            ah = 0     Cassette motor set on
  818.            ah = 1     Cassette motor set off
  819.            ah = 2     Read cx bytes from cassette, es:bx = ptr to load area
  820.            ah = 3     Write cx bytes to cassette,  es:bx = ptr to read area
  821.            ah = 0Fh   Disk format hook, called from disk format routines
  822.                         after a cylinder access completed.  Called with:
  823.                         al = 1-undergoing surface analysis, 2-if formating
  824.            ah = 21h   Error log (PS 2), al = 0 to read, al = 1 to write
  825.  
  826.                            ***  LAP TOP MACHINES ONLY - 40h to 43h  ***
  827.            ah = 40h   Systems info in cx, bx - al = 0 to read, 1 to write
  828.                         for modem info in bx - al = 2 to read, 3 to write
  829.            ah = 41h   Wait for an event, dx = i/o port to read or use es:di
  830.                         as ptr to user event.  al = type of event 0-4,11-14
  831.                         bh = event mask, bl = # of 55ms counts to timeout
  832.            ah = 42h   Power off, al = 0 or 1 for mode of power off
  833.            ah = 43h   Get system status in al
  834.                             7     6     5     4       3     2     1    0
  835.                           low   extrn  bad  pwr up  modem  ports      LCD
  836.                          battry  pwr  time  alarm    on     on      missing
  837.            ah = 44h   Modem power, al = 0 turn off,  al = 1 turn on
  838.  
  839.                          *** FUNCTIONS IN RECENT BIOS VERSIONS ONLY ***
  840.            ah = 4Fh   Keyboard input hook, called every keystroke with
  841.                         al = scan code.  CF = 1 to change or use the scan
  842.                         code in al.  CF = 0 to ignore the key.
  843.            ah = 80h   Open device number bx, in process number cx.
  844.            ah = 81h   Close device number bx, in process number cx.
  845.            ah = 82h   Terminate device number bx
  846.            ah = 83h   Wait for timeout, and set bit 15 at ptr es:bx when
  847.                         timed out.  al = 0 to set wait period cx:dx uSec,
  848.                         al = 1 to stop timeout timer.
  849.            ah = 84h   Game port read, dx = 0 to read switches into al
  850.                         high nibble,  dx = 1 to read linear position
  851.                         (Unit 1: ax = x, bx = y   Unit 2: cx = x, dx = y)
  852.            ah = 85h   Get system request key state, al = 0 down, al = 1 up
  853.            ah = 86h   Wait cx:dx microseconds before return
  854.            ah = 87h   Transfer cx words to/from memory above 1 meg
  855.                         es:si ptr to table with source & destination ptrs:
  856.                         es:si -> zeros          db  16dup(0)
  857.                                  src_seg_limit  dw  ?        ; 1-64K bytes
  858.                                  scr_ptr_low    dw  ?        ; 0-64K range
  859.                                  scr_ptr_high   db  ?        ; 0-16 Meg range
  860.                                  scr_rights     db  93h      ; r/w access
  861.                                  scr_zero       dw  0
  862.                                  dst_seg_limit  dw  ?        ; 1-64K bytes
  863.                                  dst_ptr_low    dw  ?        ; 0-64K range
  864.                                  dst_ptr_high   db  ?        ; 0-16 Meg range
  865.                                  dst_rights     db  93h      ; r/w access
  866.                                  dst_zero       dw  0
  867.                                  zeros2         db  16dup(0)
  868.                         Notes:
  869.                           cx = 32K words max xfer, ptr_low & ptr_high form
  870.                           a 24 bit physical address (do not use a segment)
  871.                         Return codes: al = 0 if ok, al = 1 parity error
  872.                           al = 2 other errors, al = 3 gate addr line 20 bad
  873.            ah = 88h   Get extended memory size (above 1 Meg boundry)
  874.                         ax = (number of bytes / 1024)
  875.            ah = 89h   Go to protected mode of operation. es:si ptr to table
  876.                         comprised of 8 groups of 8 byte ptr sub-arrays.  Each.
  877.                         group is formed from 8 bytes as follows:
  878.                             seg_limit    dw  ?     ; 1-64K bytes
  879.                             ptr_low      dw  ?     ; 0-64K range
  880.                             ptr_high     db  ?     ; 0-16 Meg range
  881.                             rights       db  93h   ; read/write access
  882.                             zero         dw  0     ; set to zero
  883.                         Ptr_low & high form a 24 bit physical address.
  884.  
  885.                         The 8 groups are as follows:
  886.                           es:si ->  Group_1   Set to all zero
  887.                                     Group_2   ptr to beginning of Group_1
  888.                                     Group_3   ptr to Interrupt Descript Table IDT
  889.                                     Group_4   ptr to present DS segment
  890.                                     Group_5   ptr to present ES segment
  891.                                     Group_6   ptr to present SS segment
  892.                                     Group_7   ptr to present CS segment
  893.                                     Group_8   ptr where to jump to when done
  894.                         Also: bh & bl set as offset from beginning of IDT to
  895.                           spot where 1st & 2nd set of 8 hardware interruptsbegin.
  896.                         Returns ah = 0 if ok, regs changed: ax,bp,ds,es,ss,cs
  897.            ah = 90h   Device busy - used to signal DOS when it must wait.
  898.                         Type   0  Disk timeout          0FCh  Hard disk timeout
  899.                         codes  1  Floppy timeout                (PS 2 only)
  900.                         (al)   2  Keyboard no timeout   0FDh  Floppy motor timeout
  901.                                3  Mouse timeout         0FEh  Printer timeout
  902.                              80h  Local area network (es:bx = network cntrl block
  903.                         Returns CF = 0 if failure, 1 if minimum wait time occured
  904.            ah = 91h   Interrupt done - used to signal DOS when hardware done
  905.                         al = type code (Device busy type codes)
  906.            ah = C0h   Get ROM system information table ptr in es:bx.  See data
  907.                         area starting at byte "sys_info_size".
  908.  
  909.                          *** PS 2 & COMPATIBLES ONLY - C1h to C4h ***
  910.            ah = C1h   Get Extended BIOS data area segment in es
  911.            ah = C2h   Mouse support (BIOS).  Sub-function code in al
  912.                           al = 0  if bh = 0 mouse off, bh = 1 mouse on
  913.                           al = 1  reset mouse & parameters, returns bh = 0
  914.                                     bl altered on return
  915.                           al = 2  Set number of updates per second in bh,
  916.                                     bh = 0 - 10 updates/sec  4 - 80  updates/sec
  917.                                          1 - 20 updates/sec  5 - 100 updates/sec
  918.                                          2 - 40 updates/sec  6 - 200 updates/sec
  919.                                          3 - 60 updates/sec
  920.                           al = 3  Set resolution in counts per millimeter:
  921.                                     bh = 0 - 1 cnts per mm   2 - 4 cnts per mm
  922.                                          1 - 2 cnts per mm   3 - 8 cnts per mm
  923.                           al = 4  Get device type, bh = 0
  924.                           al = 5  Initialize pointing device interface data size
  925.                                     bh = size 1 to 8 (1 to 8 bytes)
  926.                           al = 6  Additional sub-functions in bh:
  927.                                     bh = 0  Get status, cl = cnts per mm (see al=3)
  928.                                             dl = updates/sec in hex, bl = status:
  929.                                                  bit 6 = mode (0=stream, 1=remote)
  930.                                                      5 = 0 disabled, 1 enabled
  931.                                                      4 = scaling (0=1:1, 1=2:1)
  932.                                                      2 = Left button pressed
  933.                                                      0 = right button pressed
  934.                                     bh = 1  Set scaling to 1:1
  935.                                     bh = 2  Set scaling to 2:1
  936.                           al = 7  Set location to "call far" when data available
  937.                                      in es:bx
  938.                         Return code for all sub-functions in al:
  939.                           al = 0  successful             3  interface error
  940.                                1  bad function call      4  resend
  941.                                2  invalid input          5  no far call installed
  942.            ah = C3h   Watchdog timer mode al = 0 disable, al = 1 enable,
  943.                         bx = set counter value 1 to FFh
  944.            ah = C4h   Bus option select (POS) subfunction in al,
  945.                         al = 0  Get base POS adapter register address in dx
  946.                              1  Enable setup for slot bl
  947.                              2  Adapter enable
  948.  
  949. 16
  950.     ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ int 16h ▒▒▒▒▒
  951.  
  952.       KEYBOARD SERVICES
  953.  
  954.          Call with:   ah = sub-function number
  955.  
  956.          Functions:
  957.            ah = 0     Get a key, and wait until one is available if none are
  958.                         in the queue.
  959.                         Returns:    ah = keyboard scan code
  960.                                     al = ascii character, or 0 if non-ascii
  961.            ah = 1     Get key status
  962.                         Returns:    zero flag = 0 if a valid key is in the queue
  963.                                         ah = keyboard scan code
  964.                                         al = ascii character, or 0 if non-ascii
  965.                                     zero flag = 1 if no keys in the queue
  966.            ah = 2     Get shift status register
  967.                         Returns:    al = bits  7    6    5    4    3    2    1    0
  968.                                              right left ctrl alt scrl  num  cap insrt
  969.                                              -------shifts------ ------toggles-------
  970.                                                    1 = down            1 = on
  971.            ah = 3     Set repeating character rate (not supported in all systems)
  972.                         Call with:  al = 5
  973.                                     bh = start delay, 0 = 250 ms    2 =  750 ms
  974.                                                       1 = 500 ms    3 = 1000 ms
  975.                                     bl = speed in characters per second - values
  976.                                            range from 0 = 30 cps, to 1Fh = 2 cps
  977.            ah = 5     Load keyboard queue (not supported in all systems)
  978.                         Call with:  ch/cl = scan code/character to load into the queue
  979.                         Returns:    al = 0 if ok, 1 if keyboard queue is full
  980.  
  981.                            **** Support for extended keyboard functions ****
  982.            ah = 10h   Get a key (similar to ah = 0, not supported in all systems)
  983.            ah = 11h   Get key status (similar to ah = 1, not supported in all systems)
  984.            ah = 12h   Get shift info (similar to ah = 2, not supported in all systems)
  985.  
  986. 17
  987.     ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ int 17h ▒▒▒▒▒
  988.  
  989.       PRINTER SERVICES
  990.  
  991.          Call with:  ah = function code
  992.                      dx = printer number 0-2 (some systems allow 0-3)
  993.  
  994.          Returns:    ah = status bits
  995.                            7      6      5      4      3     2  1     0
  996.                           not  acknow-  no   select   I/O   unused   no
  997.                           busy  ledge  paper         error        response
  998.                           __________from printer__________
  999.  
  1000.          Functions:
  1001.            ah = 0   Send character to printer, al = character
  1002.            ah = 1   Printer port initialization
  1003.            ah = 2   Get printer status in ah
  1004.  
  1005. 18
  1006.     ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ int 18h ▒▒▒▒▒
  1007.  
  1008.       ROM BASIC
  1009.  
  1010. 19
  1011.     ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ int 19h ▒▒▒▒▒
  1012.  
  1013.       BOOTSTRAP LOADER
  1014.  
  1015.          Floppy drive a: attempts a read from the first sector of the disk.
  1016.          If read properly (i.e a boot disk is in drive a:), control is
  1017.          transferred to the loaded program.
  1018.  
  1019. 1A
  1020.     ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ int 1Ah ▒▒▒▒▒
  1021.  
  1022.       REAL TIME CLOCK SERVICES
  1023.  
  1024.          Call with:   ah = sub-function number
  1025.  
  1026.          Functions:
  1027.            ah = 0     Get system timer (increments every 54.92 ms from int 8)
  1028.                         Returns:    al = # of 24 hour periods since read/powered up
  1029.                                     cx:dx = 32 bit count
  1030.            ah = 1     Get system timer & reset 24 hour counter
  1031.                         Returns:    cx:dx = 32 bit count
  1032.  
  1033.                         **** System must have CMOS clock for services 2-0Bh ****
  1034.            ah = 2     Get time in BCD format
  1035.                         Returns:    ch/cl = hours/minutes
  1036.                                     dh = seconds
  1037.                                     dl = 0/1 if daylights savings time operation off/on
  1038.                                     carry flag = 0 if clock ok, 1 if stopped
  1039.            ah = 3     Set time in BCD format
  1040.                         Call with:  ch/cl = hours/minutes
  1041.                                     dh = seconds
  1042.                                     dl = 0/1 if daylights savings time operation off/on
  1043.            ah = 4     Get date in BCD format
  1044.                         Returns:    cx = four digit year
  1045.                                     dh/dl = month/day
  1046.                                     carry flag = 0 if clock ok, 1 if stopped
  1047.            ah = 5     Set date in BCD format
  1048.                         Call with:  cx = four digit year
  1049.                                     dh/dl = month/day
  1050.            ah = 6     Set 24 hour alarm (alarm vectors to int 4Ah)
  1051.                         Call with:  ch/cl = hours/minutes
  1052.                                     dh = seconds
  1053.            ah = 7     Clear alarm
  1054.            ah = 9     Get alarm time & status
  1055.                         Returns:    ch/cl = hours/minutes
  1056.                                     dh = seconds
  1057.                                     dl = 0/1 alarm off/on
  1058.            ah = 0Ah   Get days counter
  1059.                         Returns:    cx = number of days since 1-Jan-80
  1060.            ah = 0Bh   Set days counter
  1061.                         Call with:  cx = number of days since 1-Jan-80
  1062.  
  1063. 1B
  1064.     ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ int 1Bh ▒▒▒▒▒
  1065.  
  1066.       KEYBOARD BREAK (when Control-Break pressed)
  1067.  
  1068. 1C
  1069.     ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ int 1Ch ▒▒▒▒▒
  1070.  
  1071.       TIMER TICKS - Called every 18.2 ms
  1072.  
  1073. 1D
  1074.     ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ int 40h ▒▒▒▒▒
  1075.  
  1076.       FLOPPY DISK SERVICES
  1077.  
  1078. 1E
  1079.     ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ int 70h ▒▒▒▒▒
  1080.  
  1081.       REAL TIME CLOCK  (called by hardware 8259-2, IRQ 8)
  1082.  
  1083.          This interrupt services the real time clock hardware.  The hardware
  1084.          supports 2 modes of operation, a interrupt at a specific 24 hour
  1085.          interval (i.e 9:42 am), or repeatedly every 0.976 ms (1,024 Khz).
  1086.          Both modes can operate at the same time if needed.
  1087.  
  1088.          In the 24 hour alarm mode, the interrupt is vectored here by hardware
  1089.          and interrupt 4Ah is called to alert the application program of the
  1090.          alarm.  Int 4Ah is not handled by the BIOS other than to return, and
  1091.          is normally revectored by a particular application using the alarm.
  1092.  
  1093.          When repeating interrupt mode is active, the 32 bit micro-second
  1094.          counter comprised of timer_clk_low and timer_clk_hi are decremented
  1095.          by 976 us on every interrupt.  When the timer reaches zero, the
  1096.          byte pointed to by the offset @timer_wait_off and and segment
  1097.          @timer_wait_seg is set to 80h (this pointer is set by an application
  1098.          program through int 1Ah function ah=6).
  1099.  
  1100. 1F
  1101.     ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ int 71h ▒▒▒▒▒
  1102.  
  1103.       LAN ADAPTER 1  (called by hardware 8259-2, IRQ 9)
  1104.  
  1105.          Calls interrupt 0Ah.
  1106.  
  1107. 20
  1108.     ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ int 72h ▒▒▒▒▒
  1109.  
  1110.       Hardware servicer (called by hardware 8259-2, IRQ 10)
  1111.  
  1112. 21
  1113.     ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ int 73h ▒▒▒▒▒
  1114.  
  1115.       Hardware servicer (called by hardware 8259-2, IRQ 11)
  1116.  
  1117. 22
  1118.     ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ int 74h ▒▒▒▒▒
  1119.  
  1120.       Hardware servicer (called by hardware 8259-2, IRQ 12)
  1121.  
  1122. 23
  1123.     ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ int 75h ▒▒▒▒▒
  1124.  
  1125.       MATH CO-PROCESSOR (called by hardware 8259-2 IRQ 13)
  1126.  
  1127.          The math coprocessor 80287 invokes this interrupt.  Int 75h calls
  1128.          the non-maskable interrupt int 2 to halt the system (80287 is not
  1129.          used if this vector is left pointing here).  Programs which use
  1130.          the 80287 must re-vector this interrupt to use the 80287.
  1131.  
  1132. 24
  1133.     ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ int 76h ▒▒▒▒▒
  1134.  
  1135.       HARD DISK CONTROLLER (called by hardware 8259-2 IRQ 14)
  1136.  
  1137.          When the hard disk controller has completed its task, it signals
  1138.          completion though hardware activation of int 76h.  The status in
  1139.          hdsk_int_flags is set to "done", a value of 0FFh.  Interrupt 15,
  1140.          function 91h may also be called to signal the interrupt is done.
  1141.  
  1142. 25
  1143.     ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ int 77h ▒▒▒▒▒
  1144.  
  1145.       Future servicer (called by hardware 8259-2 IRQ 15)
  1146.  
  1147. 26
  1148.     ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ int 13h ▒▒▒▒▒
  1149.  
  1150.       HARD DISK SERVICES
  1151.  
  1152.          Call with: ah = sub-function number (or with 80h for hard disk)
  1153.                     dl = drive number (in less otherwise noted) 0 or 1
  1154.                           set bit 7 to get return drive parameters
  1155.  
  1156.          Returns:   carry = 0 if function ok
  1157.                     ah = status (unless otherwise noted)
  1158.                       ah = 0    Function ok
  1159.                       ah = 1    Invalid value passed or unsupported function
  1160.                       ah = 2    Can not locate address mark
  1161.                       ah = 3    Write protected
  1162.                       ah = 4    Sector not found
  1163.                       ah = 5    Reset failure
  1164.                       ah = 7    Parameter activity failed
  1165.                       ah = 8    DMA overrun occured
  1166.                       ah = 9    DMA attempted across 64K byte boundry
  1167.                       ah = 0Ah  Sector flag bad
  1168.                       ah = 0Dh  Wrong # of sectors (format)
  1169.                       ah = 0Eh  Detected control data address mark
  1170.                       ah = 0Fh  DMA arbitration level has invalid range
  1171.                       ah = 10h  CRC or EDC (Error Detect & Correct) has an
  1172.                                   unresolvable error
  1173.                       ah = 11h  Data corrected by EDC
  1174.                       ah = 20h  Disk controller failure
  1175.                       ah = 40h  Seek operation failed
  1176.                       ah = 80h  Hard disk not ready
  1177.                       ah = BBh  Error not defined
  1178.                       ah = CCh  Write error
  1179.                       ah = E0h  Error register is zero
  1180.                     If dl bit 7 was set to 1 on entry:
  1181.                       cx bits 7&6, 15-8 = highest cylinder number
  1182.                          bits 0-5 = highest sector number
  1183.                       dh = highest head number
  1184.                       dl = number of hard disks (1 or 2)
  1185.  
  1186.          Functions:
  1187.            ah = 0     Hard disk controller reset
  1188.            ah = 1     Get last status
  1189.            ah = 2     Read sectors
  1190.                         Call with:  al = number of sectors to read
  1191.                                     cx bits 7&6, 15-8 = cylinder number
  1192.                                        bits 0-5 = sector number
  1193.                                     dh = head number, head 0 = 0
  1194.                                     es:bx = ptr to buffer where to put data
  1195.            ah = 3     Write sectors
  1196.                         Call with:  al = number of sectors to write
  1197.                                     cx bits 7&6, 15-8 = cylinder number
  1198.                                        bits 0-5 = sector number
  1199.                                     dh = head number, head 0 = 0
  1200.                                     es:bx = ptr to buffer where to get data
  1201.            ah = 4     Verify sectors
  1202.                         Call with:  al = number of sectors to compare
  1203.                                     cx bits 7&6, 15-8 = cylinder number
  1204.                                        bits 0-5 = sector number
  1205.                                     dh = head number, head 0 = 0
  1206.            ah = 5     Format cylinder
  1207.                         Call with:  cx bits 7&6, 15-8 = cylinder number
  1208.                                     dh = head number, head 0 = 0
  1209.                                     es:bx = ptr to bad sector map
  1210.            ah = 8     Get drive parameters
  1211.                         Returns:    cx bits 7&6, 15-8 = max cylinder number
  1212.                                        bits 0-5 = max sector number
  1213.                                     dh = max head number, head 0 = 0
  1214.            ah = 9     Set parameters for drive
  1215.                         Call with   dh = 80h to use int 41h ptr, drive 0
  1216.                                     dh = 81h to use int 46h ptr, drive 1
  1217.            ah = 0Ch   Disk seek
  1218.                         Call with:  cx bits 7&6, 15-8 = cylinder number
  1219.                                     dh = head number, head 0 = 0
  1220.            ah = 0Dh   Secondary Disk Reset
  1221.            ah = 10h   Check if drive is ready
  1222.            ah = 11h   Recalibrate drive
  1223.            ah = 15h   Get drive type
  1224.                         Returns:    ah = 0 no drive (cx & dx = 0)
  1225.                                     ah = 3 hard disk
  1226.                                     cx:dx = size of disk in 512 byte blocks
  1227.                                     al = 4  use a 720K disk in a 720K drive
  1228.            ah = 19h   Park disk heads
  1229.            ah = 1Ah   Format hard disk (ESDI only)
  1230.                         Call with:  al = number of blocks in defect table (0=none)
  1231.                                     cl bit 0 = 1 when no primary defect map
  1232.                                        bit 1 = 1 when no secondary defect map
  1233.                                        bit 2 = 1 allow logging found surface errors
  1234.                                                    in the seconary defect map
  1235.                                        bit 3 = 1 Do extended surface analysis
  1236.                                        bit 4 = 1 interrupt after each cyldr format
  1237.  
  1238. 27
  1239.     ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ unused ▒▒▒▒▒
  1240.  
  1241.       Unused interrupt vector termination
  1242.  
  1243.          This routine processes invalid and unused interrupt requests.  The
  1244.          hardware IRQ number loaded into gen_int_occured, and the interrupt
  1245.          cleared.  For software calls to an unused interrupt, a value 0FFh is
  1246.          loaded into gen_int_occured, and the routine returns to the caller
  1247.          without changing registers.
  1248.  
  1249.          Alternatively, some systems simply return (iret).
  1250.  
  1251. 28
  1252.     ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ int 18h ▒▒▒▒▒
  1253.  
  1254.       ROM BASIC
  1255.  
  1256.          Note: ROM basic points to F600 segment, and has been adjusted to
  1257.                segment F000 to process in line with the balance of the
  1258.                BIOS code.  Internal data references may shift to segment
  1259.                F600 depending on implementation.
  1260.  
  1261. 29
  1262.     ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ System Reset ▒▒▒▒▒
  1263.  
  1264.       SYSTEM RESET
  1265.  
  1266.          Reset the computer system.  General operation includes a test of
  1267.          of the CPU, ROM checksum, and initialization of hardware including:
  1268.  
  1269.             Memory system
  1270.             Timer/Counter (which is also used for RAM refresh)
  1271.             Interrupt Controller(s)
  1272.             DMA Controller(s)
  1273.             Keyboard Controller
  1274.             Video Controller & Video RAM
  1275.             Floppy Controller
  1276.             Hard Disk Controller (if present)
  1277.  
  1278.          Portions of the hardware may also have specific tests made to
  1279.          insure reliable operation.  Test failures may display error code
  1280.          on the screen if the video subsystem is operational, or generate
  1281.          beeps or LED blinks to signify the error.
  1282.  
  1283.          Note: A soft reset uses the warm_boot_flag to skip the memory
  1284.                tests. (i.e. from pressing Ctrl-Alt-Del).
  1285.  
  1286.          The system checks for installed ROMs by searching memory from
  1287.          C000h to the beginning of the BIOS, in 2K chunks.  ROM memory is
  1288.          identified if it starts with the word AA55h.  It is followed a one
  1289.          byte field length of the ROM (divided by 512).  If ROM is found,
  1290.          the BIOS will call the ROM at an offset of 3 from the beginning.
  1291.          This feature was not supported in the earliest PC machines.
  1292.  
  1293.          The last task turns control over to the bootstrap loader (assuming
  1294.          the floppy controller is operational)
  1295.  
  1296. 2A
  1297.     ══════ BIOS EXTERNAL ENTRY POINT ═══════════════════════════════════════
  1298.  
  1299. end
  1300.  
  1301.  
  1302.  ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ SUBROUTINE REMARKS ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
  1303.  
  1304.     ---------------------- Subroutine Reference Remarks -----------------------
  1305. end
  1306.  
  1307.  
  1308.         NOTES:  1)  Entries must be in consecutive sequential order.
  1309.                 2)  Remark characters ";" are automatically inserted.
  1310.                 3)  Up to 64,000 characters per remark, 32M maximum file size.
  1311.  
  1312.  
  1313.