home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Piper's Pit BBS/FTP: ibm 0000 - 0009
/
ibm0000-0009
/
ibm0003.tar
/
ibm0003
/
SRCR215.ZIP
/
BIOS.LST
< prev
next >
Encoding:
Amiga
Atari
Commodore
DOS
FM Towns/JPY
Macintosh
Macintosh JP
Macintosh to JP
MacRoman (detected)
NeXTSTEP
RISC OS/Acorn
Shift JIS
UTF-8
Wrap
File List
|
1989-11-27
|
253.4 KB
|
6,201 lines
bios.lst BIOS ROM Analysis Sourcer Listing v2.15 27-Nov-89 7:47 pm Page 1
PAGE 59,132
;██████████████████████████████████████████████████████████████████████████
;██ ██
;██ BIOS ██
;██ ██
;██ Created: ██
;██ Version: ██
;██ Passes: 5 Analysis Options on: HQRS ██
;██ ██
;██ ██
;██████████████████████████████████████████████████████████████████████████
= 0074 video_hdw_off equ 74h ; (0000:0074=0F0A4h)
= 0078 disk_parm_off equ 78h ; (0000:0078=522h)
= 007C graph_tbl_off equ 7Ch ; (0000:007C=2A00h)
= 1800 data_2e equ 1800h ; (0000:1800=0C3h)
= 1818 data_3e equ 1818h ; (0000:1818=8Ah)
= 363C data_4e equ 363Ch ; (0000:363C=0)
= F045 data_10e equ 0F045h ; (0040:F045=0A5h)
= F047 data_11e equ 0F047h ; (0040:F047=0E2h)
= F049 data_12e equ 0F049h ; (0040:F049=0A2h)
= F04B data_13e equ 0F04Bh ; (0040:F04B=4)
= F04D data_14e equ 0F04Dh ; (0040:F04D=54h)
= F04F data_15e equ 0F04Fh ; (0040:F04F=0A3h)
= F051 data_16e equ 0F051h ; (0040:F051=4)
= F053 data_17e equ 0F053h ; (0040:F053=5Ch)
= F055 data_18e equ 0F055h ; (0040:F055=0A3h)
= F057 data_19e equ 0F057h ; (0040:F057=1)
= F059 data_20e equ 0F059h ; (0040:F059=0Eh)
= F05B data_21e equ 0F05Bh ; (0040:F05B=0C7h)
= F05D data_22e equ 0F05Dh ; (0040:F05D=56h)
= F05F data_23e equ 0F05Fh ; (0040:F05F=0FFh)
= F061 data_24e equ 0F061h ; (0040:F061=0C7h)
= F063 data_25e equ 0F063h ; (0040:F063=58h)
= 0011 data_26e equ 11h ; (C000:0011=31h)
= 003E data_27e equ 3Eh ; (C000:003E=52h)
= 003F data_28e equ 3Fh ; (C000:003F=41h)
= 0041 data_29e equ 41h ; (C000:0041=49h)
= 0042 data_30e equ 42h ; (C000:0042=53h)
= 0072 data_31e equ 72h ; (C000:0072=0)
= 007C data_32e equ 7Ch ; (C000:007C=0)
= 007D data_33e equ 7Dh ; (C000:007D=0)
= 007E data_34e equ 7Eh ; (C000:007E=0)
= 007F data_35e equ 7Fh ; (C000:007F=0D0h)
= 00E8 data_36e equ 0E8h ; (C000:00E8=0B8h)
;-------------------------------------------------------------- seg_a ----
seg_a segment at 0
0000:0000 0189 vector_0h_off dw 189h ; Divide error
0000:0002 2E3B vector_0h_seg dw 2E3Bh
0000:0004 0C67 vector_1h_off dw 0C67h ; Single Step
0000:0006 0070 vector_1h_seg dw 70h
0000:0008 01A6 vector_2h_off dw 1A6h ; NMI
bios.lst BIOS ROM Analysis Sourcer Listing v2.15 27-Nov-89 7:47 pm Page 2
0000:000A 0070 vector_2h_seg dw 70h
0000:000C 0C67 vector_3h_off dw 0C67h ; Debug
0000:000E 0070 vector_3h_seg dw 70h
0000:0010 0C67 vector_4h_off dw 0C67h ; Overflow
0000:0012 0070 vector_4h_seg dw 70h
0000:0014 FF54 vector_5h_off dw 0FF54h ; Print Screen
0000:0016 F000 vector_5h_seg dw 0F000h
0000:0018 FF33 vector_6h_off dw 0FF33h
0000:001A F000 vector_6h_seg dw 0F000h
0000:001C FF33 vector_7h_off dw 0FF33h
0000:001E F000 vector_7h_seg dw 0F000h
0000:0020 022C vector_8h_off dw 22Ch ; Timer Ticks
0000:0022 0070 vector_8h_seg dw 70h
0000:0024 02A6 vector_9h_off dw 2A6h ; Keyboard
0000:0026 0070 vector_9h_seg dw 70h
0000:0028 0325 vector_Ah_off dw 325h
0000:002A 0070 vector_Ah_seg dw 70h
0000:002C 039F vector_Bh_off dw 39Fh ; Serial
0000:002E 0070 vector_Bh_seg dw 70h
0000:0030 1496 vector_Ch_off dw 1496h ; Serial
0000:0032 0DBF vector_Ch_seg dw 0DBFh
0000:0034 0493 vector_Dh_off dw 493h ; Disk
0000:0036 0070 vector_Dh_seg dw 70h
0000:0038 050D vector_Eh_off dw 50Dh ; Diskette
0000:003A 0070 vector_Eh_seg dw 70h
0000:003C 0C67 vector_Fh_off dw 0C67h ; Bad Interrupt
0000:003E 0070 vector_Fh_seg dw 70h
0000:0040 17B2 vectr_10h_off dw 17B2h ; Video
0000:0042 0DBF vectr_10h_seg dw 0DBFh
0000:0044 F84D vectr_11h_off dw 0F84Dh ; Equipment
0000:0046 F000 vectr_11h_seg dw 0F000h
0000:0048 F841 vectr_12h_off dw 0F841h ; Memory Size
0000:004A F000 vectr_12h_seg dw 0F000h
0000:004C 0212 vectr_13h_off dw 212h ; Disk Services
0000:004E 0D11 vectr_13h_seg dw 0D11h
org 400h
0000:0400 F8 02 00 00 00 00 db 0F8h, 2, 0, 0, 0, 0
0000:0406 00 00 78 03 00 00 db 0, 0, 78h, 3, 0, 0
0000:040C 00 00 00 00 6F 52 db 0, 0, 0, 0, 6Fh, 52h
0000:0412 00 80 02 00 00 00 db 0, 80h, 2, 0, 0, 0
0000:0418 00 00 38 00 38 00 db 0, 0, 38h, 0, 38h, 0
0000:041E 72 13 0D 1C 72 13 db 72h, 13h, 0Dh, 1Ch, 72h, 13h
0000:0424 75 16 6E 31 62 30 db 75h, 16h, 6Eh, 31h, 62h, 30h
0000:042A 69 17 6F 18 73 1F db 69h, 17h, 6Fh, 18h, 73h, 1Fh
0000:0430 70 19 0D 1C 79 15 db 70h, 19h, 0Dh, 1Ch, 79h, 15h
0000:0436 67 22 1B 01 64 20 db 67h, 22h, 1Bh, 1, 64h, 20h
0000:043C 69 17 03 50 DC 00 db 69h, 17h, 3, 50h, 0DCh, 0
0000:0442 0A 05 89 57 01 05 db 0Ah, 5, 89h, 57h, 1, 5
0000:0448 02 03 50 00 A0 10 db 2, 3, 50h, 0, 0A0h, 10h
0000:044E 00 00 4F 18 00 00 db 0, 0, 4Fh, 18h, 0, 0
0000:0454 00 00 00 00 00 00 db 0, 0, 0, 0, 0, 0
0000:045A 00 00 00 00 00 00 db 0, 0, 0, 0, 0, 0
0000:0460 00 20 00 D4 03 29 db 0, 20h, 0, 0D4h, 3, 29h
0000:0466 30 00 00 00 00 00 db 30h, 0, 0, 0, 0, 0
0000:046C B8 CA 13 00 00 00 db 0B8h, 0CAh, 13h, 0, 0, 0
bios.lst BIOS ROM Analysis Sourcer Listing v2.15 27-Nov-89 7:47 pm Page 3
0000:0472 00 00 00 02 5B 50 db 0, 0, 0, 2, 5Bh, 50h
0000:0478 00 00 00 00 01 01 db 0, 0, 0, 0, 1, 1
0000:047E 01 01 1E 00 3E 00 db 1, 1, 1Eh, 0, 3Eh, 0
0000:0484 18 0E 00 60 F9 00 db 18h, 0Eh, 0, 60h, 0F9h, 0
0000:048A 00 93 00 00 00 01 db 0, 93h, 0, 0, 0, 1
0000:0490 74 93 00 00 00 14 db 74h, 93h, 0, 0, 0, 14h
0000:0496 00 00 00 00 00 00 db 0, 0, 0, 0, 0, 0
0000:049C 00 00 00 00 00 00 db 0, 0, 0, 0, 0, 0
0000:04A2 00 00 00 00 00 00 db 0, 0, 0, 0, 0, 0
0000:04A8 63 00 00 C0 00 00 db 63h, 0, 0, 0C0h, 0, 0
0000:04AE 00 00 00 00 00 00 db 0, 0, 0, 0, 0, 0
0000:04B4 00 00 00 00 00 00 db 0, 0, 0, 0, 0, 0
0000:04BA 00 00 db 0, 0
0000:04BC 0014[00] db 20 dup (0)
seg_a ends
;-------------------------------------------------------------- seg_b ----
seg_b segment at 40h
; █▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀█
; █ PRIMARY BIOS DATA AREA █
; █▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄█
0040:0000 02F8 @rs232_port_1 dw 2F8h ; RS-232 port addresses
0040:0002 0000 @rs232_port_2 dw 0
0040:0004 0000 @rs232_port_3 dw 0
0040:0006 0000 @rs232_port_4 dw 0
0040:0008 0378 @prn_port_1 dw 378h ; Printer port addresses
0040:000A 0000 @prn_port_2 dw 0
0040:000C 0000 @prn_port_3 dw 0
0040:000E 0000 BIOS_data_seg dw 0 ; Extended BIOS data (PS/2)or printer
; Printer 4 (PC,XT,AT & compatibles)
0040:0010 526F equip_bits dw 526Fh ; Equipment installed info bits
; 15 14 13 12 11 10 9 8
; \ / game \ /
; # of print port # of RS-232
; ports 0-3 used ports 0-4
; 7 6 5 4 3 2 1 0
; \ / \ / \ / Math |
; # of video mode RAM uP no
; disk- at boot up 00=16K dsk
; ettes 00=EGA 01=32K driv
; 1-4 01=CGA-40 10=48K if 0
; if bit 10=CGA-80 11=64K
; 0 = 1 11=MDA-80 (old PCs)
; Note: bit 13=modem on PC lap-tops
; bit 2=mouse on PS/2
;
; xref F000:E16A, F000:F077
; F000:F3C3, F000:F852
bios.lst BIOS ROM Analysis Sourcer Listing v2.15 27-Nov-89 7:47 pm Page 4
0040:0012 00 init_test_flag db 0 ; Initialization test
0040:0013 0280 main_ram_size dw 280h ; Base memory size 0-1Meg, 1K steps
; xref F000:E2E6, F000:E2FC
; F000:E34A, F000:E4CC
; F000:F846
0040:0015 0000 chan_io_size dw 0 ; Channel i/o size
; █▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀█
; █ KEYBOARD DATA █
; █▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄█
0040:0017 00 keybd_flags_1 db 0 ; Keyboard flag bits
; 7 6 5 4 3 2 1 0
; ins- cap num scrl alt ctl lef rig
; sert --toggles--- --shifts down--
; xref F000:E9A7, F000:E9CE
; F000:EA14, F000:EA77
0040:0018 00 keybd_flags_2 db 0 ; Keyboard flag bits
; 7 6 5 4
; insert caps num scroll
; ------now depressed------
; 3 2 1 0
; pause sys left right
; lock request -alt-down-
;
; xref F000:E9AB, F000:E9C6
; F000:EA56, F000:EA7B
; F000:EBFD, F000:EC07
; F000:EC31
0040:0019 00 keybd_alt_num db 0 ; Alt & digit pad number buffr area
; xref F000:E9D8, F000:E9DF
; F000:EABD, F000:EB3B
; F000:EB8D, F000:EB99
; F000:EBA0
0040:001A 0038 keybd_q_head dw 38h ; Head ptr of circular key queue
; empty if head ptr = tail ptr
; xref F000:E2CE, F000:EA23
; F000:EBF0
0040:001C 0038 keybd_q_tail dw 38h ; Tail ptr of circular key queue
; empty if head ptr = tail ptr
; xref F000:E2D4, F000:EA1A
; F000:EA35, F000:EBF4
0040:001E 1372 1C0D 1372 keybd_queue dw 1372h, 1C0Dh, 1372h ; 15 key queue for keyboard
0040:0024 1675 316E 3062 dw 1675h, 316Eh, 3062h
0040:002A 1769 186F 1F73 dw 1769h, 186Fh, 1F73h
0040:0030 1970 1C0D 1579 dw 1970h, 1C0Dh, 1579h
0040:0036 2267 011B 2064 dw 2267h, 11Bh, 2064h
0040:003C 1769 dw 1769h
; █▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀█
; █ DISK DATA █
; █▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄█
0040:003E 03 dsk_recal_stat db 3 ; Recalibrate floppy drive bits
; 3 2 1 0
bios.lst BIOS ROM Analysis Sourcer Listing v2.15 27-Nov-89 7:47 pm Page 5
; drive-3 drive-2 drive-1 drive-0
; bit 7 = interrupt flag
;
; xref F000:EC87, F000:EEB5
; F000:EEC6, F000:EECD
; F000:EF5F
0040:003F 50 dsk_motor_stat db 50h ; Motor running status & disk write
; bit 7=1 disk write in progress
; bits 6&5 = drive selected 0 to 3
; 3 2 1 0
; drive-3 drive-2 drive-1 drive-0
; --------- 1=motor on-----------
; xref F000:E6D6, F000:EC68
; F000:EC78, F000:ED27
; F000:ED37, F000:ED47
; F000:ED51, F000:ED59
; F000:ED5E, F000:ED62
0040:0040 C1 dsk_motor_tmr db 0C1h ; Motor timer, at 0, turn off motor
; xref F000:E6CE, F000:ED1C
; F000:EDCA, F000:EEFF
0040:0041 00 dsk_ret_code db 0 ; Controller return code
; 00h = ok
; 01h = bad command or parameter
; 02h = can't find address mark
; 03h = can't write, protected dsk
; 04h = sector not found
; 08h = DMA overrun
; 09h = DMA attempt over 64K bound
; 10h = bad CRC on disk read
; 20h = controller failure
; 40h = seek failure
; 80h = timeout, no response
; xref F000:EC8C, F000:ECBF
; F000:ECCC, F000:ECDB
; F000:ED13, F000:EDD4
; F000:EE92, F000:EEC1
; F000:EEEE, F000:EEF6
; F000:EFB7, F000:F823
0040:0042 0A dsk_status_1 db 0Ah ; Status bytes-disk controller chip
; Note: 7 info bytes returned from
; controller are saved here. Refer
; to the NEC uPD 765 chip manual
; for the specific info, depending
; on the previous command issued.
; xref F000:ECA1, F000:EE66
0040:0043 00 dsk_status_2 db 0 ; xref F000:EE7A
0040:0044 86 dsk_status_3 db 86h
0040:0045 58 dsk_status_4 db 58h
0040:0046 01 dsk_status_5 db 1
0040:0047 05 dsk_status_6 db 5
0040:0048 02 dsk_status_7 db 2
; █▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀█
; █ VIDEO DATA █
bios.lst BIOS ROM Analysis Sourcer Listing v2.15 27-Nov-89 7:47 pm Page 6
; █▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄█
0040:0049 03 video_mode db 3 ; Present display mode(see int 10h)
; xref F000:F0F8, F000:F17A
; F000:F243, F000:F32D
; F000:F3F2, F000:F476
; F000:F676, F000:F68A
; F000:F706, F000:F733
; F000:F742, F000:F7A9
; F000:F7B6, F000:F7BD
; F000:F7C3, F000:F7CA
; F000:F7D1
0040:004A 0050 video_columns dw 50h ; Number of columns
; xref F000:F346, F000:F492
; F000:F534, F000:F7AC
; F000:FFB2
0040:004C 10A0 video_buf_siz dw 10A0h ; Video buffer size in bytes
; Note: size may be rounded up to
; the nearest 2K boundary. For
; example, 80x25 mode=4000 bytes,
; but value may be 4096.
; xref F000:F374
0040:004E 0000 video_segment dw 0 ; Segment of active video memory
; MDA=0B000h, CGA=0B800h, etc.
; xref F000:F322, F000:F361
; F000:F5B3, F000:F6F8
0040:0050 184F vid_curs_pos0 dw 184Fh ; Cursor position page 0
; bits 15-8=row, bits 7-0=column
; xref F000:F16A, F000:F230
0040:0052 0000 vid_curs_pos1 dw 0 ; Cursor position page 1
; bits 15-8=row, bits 7-0=column
0040:0054 0000 vid_curs_pos2 dw 0 ; Cursor position page 2
; bits 15-8=row, bits 7-0=column
0040:0056 0000 vid_curs_pos3 dw 0 ; Cursor position page 3
; bits 15-8=row, bits 7-0=column
0040:0058 0000 vid_curs_pos4 dw 0 ; Cursor position page 4
; bits 15-8=row, bits 7-0=column
0040:005A 0000 vid_curs_pos5 dw 0 ; Cursor position page 5
; bits 15-8=row, bits 7-0=column
0040:005C 0000 vid_curs_pos6 dw 0 ; Cursor position page 6
; bits 15-8=row, bits 7-0=column
0040:005E 0000 vid_curs_pos7 dw 0 ; Cursor position page 7
; bits 15-8=row, bits 7-0=column
0040:0060 2000 vid_curs_mode dw 2000h ; Active cursor, start & end lines
; bits 12 to 8 for starting line
; bits 4 to 0 for ending line
; xref F000:F5C8, F000:F5F5
0040:0062 00 video_page db 0 ; Present page
; xref F000:F357, F000:F487
; F000:F5AC, F000:F610
; F000:F7B0, F000:FF80
0040:0063 03D4 @video_port dw 3D4h ; Video controller base I/O address
; xref F000:F09B, F000:F5DE
0040:0065 29 video_mode_reg db 29h ; Hardware mode register bits
; xref F000:F589
bios.lst BIOS ROM Analysis Sourcer Listing v2.15 27-Nov-89 7:47 pm Page 7
0040:0066 30 video_color db 30h ; Color set in CGA modes
; xref F000:F775, F000:F799
; █▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀█
; █ GENERAL DATA █
; █ Note: next 5 bytes also used █
; █ for cassette interface in █
; █ older PCs. █
; █▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄█
0040:0067 0000 @gen_io_ptr dw 0 ; ROM initialization pointer
0040:0069 0000 @gen_io_seg dw 0 ; ROM i/o segment
0040:006B 00 gen_int_occured db 0 ; Unused interrupt occurred
0040:006C CAE9 timer_low dw 0CAE9h ; Timer, low word, cnts every 55 ms
0040:006E 0013 timer_hi dw 13h ; Timer, high word
0040:0070 00 timer_rolled db 0 ; Timer overflowed, non-zero when
; more than 24 hours have elapsed
0040:0071 00 keybd_break db 0 ; Bit 7 set if break key depressed
; xref F000:EBE7
0040:0072 0000 warm_boot_flag dw 0 ; Boot (reset) type
; 1234h=warm boot, no memory test
; 4321h=boot & save memory
; (PS/2 with MCA only)
; xref F000:E0F4, F000:E106
; F000:E118, F000:E2F4
; F000:E32D, F000:E377
; F000:EB74
; █▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀█
; █ HARD DISK DATA █
; █▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄█
0040:0074 00 hdsk_status_1 db 0 ; Hard disk status
; 00h = ok
; 01h = bad command or parameter
; 02h = can't find address mark
; 03h = can't write, protected dsk
; 04h = sector not found
; 05h = reset failure
; 07h = activity failure
; 08h = DMA overrun
; 09h = DMA attempt over 64K bound
; 0Ah = bad sector flag
; 0Bh = removed bad track
; 0Dh = wrong # of sectors, format
; 0Eh = removed control data addr
; mark
; 0Fh = out of limit DMA
; arbitration level
; 10h = bad CRC or ECC, disk read
; 11h = bad ECC corrected data
; 20h = controller failure
; 40h = seek failure
; 80h = timeout, no response
; AAh = not ready
; BBh = error occurred, undefined
; CCh = write error, selected dsk
bios.lst BIOS ROM Analysis Sourcer Listing v2.15 27-Nov-89 7:47 pm Page 8
; E0h = error register = 0
; FFh = disk sense failure
;
0040:0075 02 hdsk_count db 2 ; Number of hard disk drives
0040:0076 5B hdsk_head_ctrl db 5Bh ; Head control (XT only)
0040:0077 50 hdsk_ctrl_port db 50h ; Hard disk control port (XT only)
; █▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀█
; █ I/O PORT TIMER, KEYBOARD DATA █
; █▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄█
0040:0078 00 prn_timeout_1 db 0 ; Countdown timer waits for printer
; to respond (printer 1)
0040:0079 00 prn_timeout_2 db 0 ; Countdown timer waits for printer
; to respond
0040:007A 00 prn_timeout_3 db 0
0040:007B 00 prn_timeout_4 db 0
0040:007C 01 rs232_timeout_1 db 1 ; Countdown timer waits for RS-232
; port to respond (port 1)
; xref F000:FA05
0040:007D 01 rs232_timeout_2 db 1 ; Countdown timer waits for RS-232
; port to respond
0040:007E 01 rs232_timeout_3 db 1
0040:007F 01 rs232_timeout_4 db 1
0040:0080 001E @keybd_begin dw 1Eh ; Ptr to beginning of keybd queue
; xref F000:E2DA
0040:0082 003E @keybd_end dw 3Eh ; Ptr to end of keyboard queue
; xref F000:E2E0
; █▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀█
; █ ADVANCED VIDEO DATA, EGA/VGA █
; █▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄█
0040:0084 18 video_rows db 18h ; Rows of characters on display - 1
0040:0085 000E video_pixels dw 0Eh ; Number of pixels per charactr * 8
0040:0087 60 video_options db 60h ; Display adapter options
; bit 7 = clear RAM
; bits 6,5 = memory on adapter
; 00 - 64K
; 01 - 128K
; 10 - 192K
; 11 - 256K
; bit 4 = unused
; bit 3 = 0 if EGA/VGA active
; bit 2 = wait for display enable
; bit 1 = 1 - mono monitor
; = 0 - color monoitor
; bit 0 = 0 - handle cursor, CGA
0040:0088 F9 video_switches db 0F9h ; Switch setting bits from adapter
; bits 7-4 = feature connector
; bits 3-0 = option switches
0040:0089 00 video_1_reservd db 0 ; Video reserved 1, EGA/VGA control
; bit 7 = 200 line mode
; bits 6,5 = unused
; bit 4 = 400 line mode
; bit 3 = no palette load
; bit 2 = mono monitor
bios.lst BIOS ROM Analysis Sourcer Listing v2.15 27-Nov-89 7:47 pm Page 9
; bit 1 = gray scale
; bit 0 = unused
0040:008A 00 video_2_reservd db 0 ; Video reserved 2
; █▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀█
; █ OTHER FLOPPY & HARD DISK DATA █
; █▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄█
0040:008B 93 dsk_data_rate db 93h ; Last data rate for diskette
; bits 7 & 6 = 00 for 500K bit/sec
; = 01 for 300K bit/sec
; = 10 for 250K bit/sec
; bits 5 & 4 = step rate
0040:008C 00 hdsk_status_2 db 0 ; Hard disk status
0040:008D 00 hdsk_error db 0 ; Hard disk error
0040:008E 00 hdsk_int_flags db 0 ; Set for hard disk interrupt flag
0040:008F 01 hdsk_options db 1 ; Bit 0 = 1 when using 1 controller
; card for both hard disk & floppy
0040:0090 74 hdsk0_media_st db 74h ; Media state for drive 0
0040:0091 93 hdsk1_media_st db 93h ; Media state for drive 1
; 7 6 5 4
; data xfer rate two media
; 00=500K bit/s step known
; 01=300K bit/s
; 10=250K bit/s
; 3 2 1 0
; unused -----state of drive-----
; bits floppy drive state
; 000= 360K in 360K, ?
; 001= 360K in 1.2M, ?
; 010= 1.2M in 1.2M, ?
; 011= 360K in 360K, ok
; 100= 360K in 1.2M, ok
; 101= 1.2M in 1.2M, ok
; 111= state not defined
0040:0092 00 hdsk0_start_st db 0 ; Start state for drive 0
0040:0093 00 hdsk1_start_st db 0 ; Start state for drive 1
0040:0094 00 hdsk0_cylinder db 0 ; Track number for drive 0
0040:0095 14 hdsk1_cylinder db 14h ; Track number for drive 1
; █▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀█
; █ ADVANCED KEYBOARD DATA █
; █▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄█
0040:0096 00 keybd_flags_3 db 0 ; Special keyboard type and mode
; bit 7 Reading ID of keyboard
; 6 last char is 1st ID char
; 5 force num lock
; 4 101/102 key keyboard
; 3 right alt key down
; 2 right ctrl key down
; 1 E0h hidden code last
; 0 E1h hidden code last
;
0040:0097 00 keybd_flags_4 db 0 ; Keyboard Flags (advanced keybd)
; 7 6 5 4 3 2 1 0
bios.lst BIOS ROM Analysis Sourcer Listing v2.15 27-Nov-89 7:47 pm Page 10
; xmit char Resend Ack \ /
; error was ID Rec'd Rec'd LEDs
; █▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀█
; █ REAL-TIME CLOCK & LAN DATA █
; █▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄█
0040:0098 0000 @timer_wait_off dw 0 ; Ptr offset to wait done flag
0040:009A 0000 @timer_wait_seg dw 0 ; Ptr segment to wait done flag
0040:009C 0000 timer_clk_low dw 0 ; Timer low word, 1 microsecond clk
0040:009E 0000 timer_clk_hi dw 0 ; Timer high word
0040:00A0 00 timer_clk_flag db 0 ; Timer flag 00h = post acknowledgd
; 01h = busy
; 80h = posted
0040:00A1 00 lan_1 db 0 ; Local area network bytes (7)
0040:00A2 00 lan_2 db 0
0040:00A3 00 lan_3 db 0
0040:00A4 00 lan_4 db 0
0040:00A5 00 lan_5 db 0
0040:00A6 00 lan_6 db 0
0040:00A7 00 lan_7 db 0
; █▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀█
; █ MORE ADVANCED VIDEO DATA █
; █▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄█
0040:00A8 0063 C000 @video_sav_tbls dd 0C0000063h ; Pointer to a save table of more
; pointers for the video system
; SAVE TABLE
; offset type pointer to
; ────── ──── ────────────────────
; 0 dd Video parameters
; 4 dd Parms save area
; 8 dd Alpha char set
; 0Ch dd Graphics char set
; 10h dd 2nd save ptr table
; 14h dd reserved (0:0)
; 18h dd reserved (0:0)
;
; 2ND SAVE TABLE (from ptr above)
; offset type functions & pointers
; ────── ──── ────────────────────
; 0 dw Bytes in this table
; 2 dd Combination code tbl
; 6 dd 2nd alpha char set
; 0Ah dd user palette tbl
; 0Eh dd reserved (0:0)
; 12h dd reserved (0:0)
; 16h dd reserved (0:0)
0040:00AC 0036[00] db 54 dup (0)
0040:00E2 61 93 00 00 00 00 db 61h, 93h, 0, 0, 0, 0
0040:00E8 0003 data_6 dw 3 ; xref F000:E181, F000:E1E4
0040:00EA 0003[0000] data_7 dw 3 dup (0)
0040:00F0 00 db 0
0040:00F1 00 data_8 db 0 ; xref F000:E1A8
bios.lst BIOS ROM Analysis Sourcer Listing v2.15 27-Nov-89 7:47 pm Page 11
0040:00F2 00 db 0
0040:00F3 00 data_9 db 0 ; xref F000:E1B1
0040:00F4 000D[00] db 13 dup (0)
seg_b ends
;-------------------------------------------------------------- seg_c ----
seg_c segment at 50h
0050:0000 00 prn_scrn_stat db 0 ; Print screen status
; 00h = Print screen ready
; 01h = Print screen in progress
; FFh = Error occurred
0050:0001 00 db 0
seg_c ends
;-------------------------------------------------------------- seg_d ----
seg_d segment para public
assume cs:seg_d , ds:seg_b
org 0E000h
F000:E000 90 90 88 E0 26 E1 db 90h, 90h, 88h, 0E0h, 26h, 0E1h
F000:E006 2E 38 32 35 39 00 db 2Eh, 38h, 32h, 35h, 39h, 0
;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
; SUBROUTINE
;
; Called from: F000:EC4F
;▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
sub_1 proc near
F000:E00C 51 push cx
F000:E00D 53 push bx
F000:E00E 56 push si
F000:E00F E8 001D call sub_2 ; (E02F)
F000:E012 B9 000A mov cx,0Ah
F000:E015 locloop_2: ; xref F000:E01B
F000:E015 BE FEAD mov si,0FEADh
F000:E018 E8 048B call sub_3 ; (E4A6)
F000:E01B E2 F8 loop locloop_2 ; Loop if cx > 0
F000:E01D 5E pop si
F000:E01E E8 0485 call sub_3 ; (E4A6)
F000:E021 5B pop bx
F000:E022 59 pop cx
F000:E023 C3 retn
sub_1 endp
bios.lst BIOS ROM Analysis Sourcer Listing v2.15 27-Nov-89 7:47 pm Page 12
F000:E024 B3 01 B0 FF E6 21 db 0B3h, 1, 0B0h, 0FFh, 0E6h, 21h
F000:E02A B0 20 E6 20 CF db 0B0h, 20h, 0E6h, 20h, 0CFh
;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
; SUBROUTINE
;
; Called from: F000:E00F, E441, E444
;▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
sub_2 proc near
F000:E02F 56 push si
F000:E030 BE FEAA mov si,0FEAAh
F000:E033 E8 0470 call sub_3 ; (E4A6)
F000:E036 5E pop si
F000:E037 C3 retn
sub_2 endp
F000:E038 0023[00] db 35 dup (0)
; ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ System Reset ▒▒▒▒▒
;
; SYSTEM RESET
;
; Reset the computer system. General operation includes a test of
; of the CPU, ROM checksum, and initialization of hardware including:
;
; Memory system
; Timer/Counter (which is also used for RAM refresh)
; Interrupt Controller(s)
; DMA Controller(s)
; Keyboard Controller
; Video Controller & Video RAM
; Floppy Controller
; Hard Disk Controller (if present)
;
; Portions of the hardware may also have specific tests made to
; insure reliable operation. Test failures may display error code
; on the screen if the video subsystem is operational, or generate
; beeps or LED blinks to signify the error.
;
; Note: A soft reset uses the warm_boot_flag to skip the memory
; tests. (i.e. from pressing Ctrl-Alt-Del).
;
; The system checks for installed ROMs by searching memory from
; C000h to the beginning of the BIOS, in 2K chunks. ROM memory is
; identified if it starts with the word AA55h. It is followed a one
; byte field length of the ROM (divided by 512). If ROM is found,
; the BIOS will call the ROM at an offset of 3 from the beginning.
; This feature was not supported in the earliest PC machines.
;
; The last task turns control over to the bootstrap loader (assuming
; the floppy controller is operational)
F000:E05B system_reset proc near ; xref F000:EB7A, EC4C, FFF0
F000:E05B FA cli ; Disable interrupts
bios.lst BIOS ROM Analysis Sourcer Listing v2.15 27-Nov-89 7:47 pm Page 13
F000:E05C B0 99 mov al,99h
F000:E05E E6 63 out 63h,al ; port 63h, 8255 mode reg
F000:E060 33 C0 xor ax,ax ; Zero register
F000:E062 E6 A0 out 0A0h,al ; port 0A0h, initialize, 4 byte
; al = 0, Non-Maskable int
F000:E064 E6 83 out 83h,al ; port 83h, DMA page reg ch 1
F000:E066 B0 FD mov al,0FDh
F000:E068 E6 61 out 61h,al ; port 61h, 8255 B - spkr, etc
F000:E06A B0 01 mov al,1
F000:E06C BA 03B8 mov dx,3B8h
F000:E06F EE out dx,al ; port 3B8h, MDA video control
F000:E070 FE C8 dec al
F000:E072 BA 03D8 mov dx,3D8h
F000:E075 EE out dx,al ; port 3D8h, CGA video control
F000:E076 B8 F000 mov ax,seg_d
F000:E079 8E D0 mov ss,ax
F000:E07B B0 04 mov al,4
F000:E07D E6 08 out 8,al ; port 8, DMA-1 command reg
F000:E07F B8 4054 mov ax,4054h
F000:E082 BA 0041 mov dx,41h
F000:E085 BC E002 mov sp,0E002h
F000:E088 B0 B6 mov al,0B6h
F000:E08A E6 43 out 43h,al ; port 43h, 8253 wrt timr mode
F000:E08C B0 07 mov al,7
F000:E08E E6 42 out 42h,al ; port 42h, 8253 timer 2 spkr
F000:E090 E6 42 out 42h,al ; port 42h, 8253 timer 2 spkr
F000:E092 E4 61 in al,61h ; port 61h, 8255 port B, read
F000:E094 0C 03 or al,3
F000:E096 E6 61 out 61h,al ; port 61h, 8255 B - spkr, etc
F000:E098 BB E812 mov bx,0E812h
F000:E09B loc_3: ; xref F000:E0B9
F000:E09B 43 inc bx
F000:E09C 2E: 8A 07 mov al,cs:[bx]
F000:E09F 8A E0 mov ah,al
F000:E0A1 8B F0 mov si,ax
F000:E0A3 B9 0008 mov cx,8
F000:E0A6 locloop_4: ; xref F000:E0B5
F000:E0A6 8B D1 mov dx,cx
F000:E0A8 4A dec dx
F000:E0A9 EE out dx,al ; port 7, DMA-1 bas&cnt ch 3
F000:E0AA EE out dx,al ; port 7, DMA-1 bas&cnt ch 3
F000:E0AB 33 C0 xor ax,ax ; Zero register
F000:E0AD EC in al,dx ; port 7, DMA-1 bas&cnt ch 3
F000:E0AE 86 E0 xchg ah,al
F000:E0B0 EC in al,dx ; port 7, DMA-1 bas&cnt ch 3
F000:E0B1 3B F0 cmp si,ax
F000:E0B3 74 00 je loc_5 ; Jump if equal
F000:E0B5 loc_5: ; xref F000:E0B3
F000:E0B5 E2 EF loop locloop_4 ; Loop if cx > 0
F000:E0B7 0B F6 or si,si ; Zero ?
F000:E0B9 75 E0 jnz loc_3 ; Jump if not zero
F000:E0BB B0 FF mov al,0FFh
F000:E0BD E6 01 out 1,al ; port 1, DMA-1 bas&cnt ch 0
F000:E0BF E6 01 out 1,al ; port 1, DMA-1 bas&cnt ch 0
F000:E0C1 B0 58 mov al,58h ; 'X'
bios.lst BIOS ROM Analysis Sourcer Listing v2.15 27-Nov-89 7:47 pm Page 14
F000:E0C3 E6 0B out 0Bh,al ; port 0Bh, DMA-1 mode reg
F000:E0C5 B0 00 mov al,0
F000:E0C7 E6 08 out 8,al ; port 8, DMA-1 command reg
F000:E0C9 E6 0A out 0Ah,al ; port 0Ah, DMA-1 mask reg bit
F000:E0CB B8 1254 mov ax,1254h
F000:E0CE E6 43 out 43h,al ; port 43h, 8253 wrt timr mode
F000:E0D0 86 E0 xchg ah,al
F000:E0D2 E6 41 out 41h,al ; port 41h, 8253 timer 1 refsh
F000:E0D4 B9 0003 mov cx,3
F000:E0D7 B0 41 mov al,41h ; 'A'
F000:E0D9 locloop_6: ; xref F000:E0DD
F000:E0D9 E6 0B out 0Bh,al ; port 0Bh, DMA-1 mode reg
F000:E0DB FE C0 inc al
F000:E0DD E2 FA loop locloop_6 ; Loop if cx > 0
F000:E0DF B0 13 mov al,13h
F000:E0E1 E6 20 out 20h,al ; port 20h, 8259-1 int command
F000:E0E3 B0 08 mov al,8
F000:E0E5 E6 21 out 21h,al ; port 21h, 8259-1 int comands
; al = 8, inhibit IRQ3 rs232
F000:E0E7 FE C0 inc al
F000:E0E9 E6 21 out 21h,al ; port 21h, 8259-1 int comands
F000:E0EB B0 FF mov al,0FFh
F000:E0ED E6 21 out 21h,al ; port 21h, 8259-1 int comands
F000:E0EF B8 0040 mov ax,seg_b
F000:E0F2 8E D8 mov ds,ax
F000:E0F4 8B 36 0072 mov si,warm_boot_flag ; (0040:0072=0)
F000:E0F8 2B DB sub bx,bx
F000:E0FA 33 C0 xor ax,ax ; Zero register
F000:E0FC FC cld ; Clear direction
F000:E0FD 2B FF sub di,di
F000:E0FF 33 C9 xor cx,cx ; Zero register
F000:E101 8E C3 mov es,bx
F000:E103 locloop_7: ; xref F000:E104
F000:E103 AA stosb ; Store al to es:[di]
F000:E104 E2 FD loop locloop_7 ; Loop if cx > 0
F000:E106 89 36 0072 mov warm_boot_flag,si ; (0040:0072=0)
F000:E10A E4 61 in al,61h ; port 61h, 8255 port B, read
F000:E10C 24 FC and al,0FCh
F000:E10E E6 61 out 61h,al ; port 61h, 8255 B - spkr, etc
; al = 0, disable parity
F000:E110 81 FE 1234 cmp si,1234h
F000:E114 74 20 je loc_8 ; Jump if equal
F000:E116 33 C0 xor ax,ax ; Zero register
F000:E118 A3 0072 mov warm_boot_flag,ax ; (0040:0072=0)
F000:E11B 8E D8 mov ds,ax
F000:E11D BD 8080 mov bp,8080h
F000:E120 BC E004 mov sp,0E004h
F000:E123 E9 053A jmp loc_92 ; (E660)
F000:E126 72 08 74 0C E4 61 db 72h, 8, 74h, 0Ch, 0E4h, 61h
F000:E12C 0C 03 E6 61 EA 00 db 0Ch, 3, 0E6h, 61h, 0EAh, 0
F000:E132 60 00 F0 F4 db 60h, 0, 0F0h, 0F4h
F000:E136 loc_8: ; xref F000:E114
F000:E136 E4 61 in al,61h ; port 61h, 8255 port B, read
bios.lst BIOS ROM Analysis Sourcer Listing v2.15 27-Nov-89 7:47 pm Page 15
F000:E138 0C 30 or al,30h ; '0'
F000:E13A E6 61 out 61h,al ; port 61h, 8255 B - spkr, etc
F000:E13C BB 0030 mov bx,30h
F000:E13F 8E D3 mov ss,bx
F000:E141 BC 0100 mov sp,100h
F000:E144 E8 1834 call sub_57 ; (F97B)
F000:E147 E8 03F6 call sub_6 ; (E540)
F000:E14A 2B C0 sub ax,ax
F000:E14C E4 61 in al,61h ; port 61h, 8255 port B, read
F000:E14E 24 F7 and al,0F7h
F000:E150 E6 61 out 61h,al ; port 61h, 8255 B - spkr, etc
; al = 0, disable parity
F000:E152 E4 62 in al,62h ; port 62h, 8255 C - sw2, etc.
F000:E154 24 0F and al,0Fh
F000:E156 8A E0 mov ah,al
F000:E158 E4 61 in al,61h ; port 61h, 8255 port B, read
F000:E15A 0C 08 or al,8
F000:E15C E6 61 out 61h,al ; port 61h, 8255 B - spkr, etc
F000:E15E E4 62 in al,62h ; port 62h, 8255 C - sw2, etc.
F000:E160 24 0F and al,0Fh
F000:E162 B1 04 mov cl,4
F000:E164 D2 E0 shl al,cl ; Shift w/zeros fill
F000:E166 0A C4 or al,ah
F000:E168 32 E4 xor ah,ah ; Zero register
F000:E16A A3 0010 mov equip_bits,ax ; (0040:0010=526Fh)
F000:E16D 24 30 and al,30h ; '0'
F000:E16F 86 E0 xchg ah,al
F000:E171 80 FC 10 cmp ah,10h
F000:E174 B0 01 mov al,1
F000:E176 74 09 jz loc_9 ; Jump if zero
F000:E178 80 FC 30 cmp ah,30h ; '0'
F000:E17B B0 00 mov al,0
F000:E17D 74 02 jz loc_9 ; Jump if zero
F000:E17F B0 03 mov al,3
F000:E181 loc_9: ; xref F000:E176, E17D
F000:E181 A3 00E8 mov data_6,ax ; (0040:00E8=3)
F000:E184 80 FC 00 cmp ah,0
F000:E187 75 03 jne loc_10 ; Jump if not equal
F000:E189 E9 009A jmp loc_24 ; (E226)
F000:E18C loc_10: ; xref F000:E187
F000:E18C BB B800 mov bx,0B800h
F000:E18F BA 03D8 mov dx,3D8h
F000:E192 BD 2000 mov bp,2000h
F000:E195 B5 00 mov ch,0
F000:E197 80 3E 00E9 30 cmp byte ptr ds:[0E9h],30h ; (0040:00E9=0) '0'
F000:E19C 75 0A jne loc_11 ; Jump if not equal
F000:E19E B7 B0 mov bh,0B0h
F000:E1A0 BA 03B8 mov dx,3B8h
F000:E1A3 BD 0800 mov bp,800h
F000:E1A6 FE C5 inc ch
F000:E1A8 loc_11: ; xref F000:E19C
F000:E1A8 88 3E 00F1 mov data_8,bh ; (0040:00F1=0)
F000:E1AC 8A CA mov cl,dl
F000:E1AE 80 E9 04 sub cl,4
F000:E1B1 88 0E 00F3 mov data_9,cl ; (0040:00F3=0)
F000:E1B5 32 E4 xor ah,ah ; Zero register
F000:E1B7 CD 10 int 10h ; Video display ah=functn 00h
bios.lst BIOS ROM Analysis Sourcer Listing v2.15 27-Nov-89 7:47 pm Page 16
; set display mode in al
F000:E1B9 8A C5 mov al,ch
F000:E1BB EE out dx,al ; port 3B8h, MDA video control
F000:E1BC 8E C3 mov es,bx
F000:E1BE 2B FF sub di,di
F000:E1C0 8B C7 mov ax,di
F000:E1C2 8B CD mov cx,bp
F000:E1C4 F3/ AB rep stosw ; Rep when cx >0 Store ax to es:[di]
F000:E1C6 1E push ds
F000:E1C7 8E DB mov ds,bx
F000:E1C9 E8 0494 call sub_12 ; (E660)
F000:E1CC 1F pop ds
F000:E1CD 74 15 jz loc_14 ; Jump if zero
F000:E1CF BA 0003 mov dx,3
F000:E1D2 loc_12: ; xref F000:E224
F000:E1D2 53 push bx
F000:E1D3 BB 0003 mov bx,3
F000:E1D6 loc_13: ; xref F000:E1DF
F000:E1D6 52 push dx
F000:E1D7 53 push bx
F000:E1D8 E8 03A1 call sub_7 ; (E57C)
F000:E1DB 5B pop bx
F000:E1DC 5A pop dx
F000:E1DD FE CB dec bl
F000:E1DF 75 F5 jnz loc_13 ; Jump if not zero
F000:E1E1 5B pop bx
F000:E1E2 EB 45 jmp short loc_25 ; (E229)
F000:E1E4 loc_14: ; xref F000:E1CD
F000:E1E4 A0 00E8 mov al,byte ptr data_6 ; (0040:00E8=3)
F000:E1E7 B4 00 mov ah,0
F000:E1E9 CD 10 int 10h ; Video display ah=functn 00h
; set display mode in al
F000:E1EB 80 3E 00E9 30 cmp byte ptr ds:[0E9h],30h ; (0040:00E9=0) '0'
F000:E1F0 BA 03BA mov dx,3BAh
F000:E1F3 74 03 jz loc_15 ; Jump if zero
F000:E1F5 BA 03DA mov dx,3DAh
F000:E1F8 loc_15: ; xref F000:E1F3
F000:E1F8 B3 01 mov bl,1
F000:E1FA loc_16: ; xref F000:E21F
F000:E1FA 81 E1 0000 and cx,0
nop ;*Fixup for MASM (M)
F000:E1FE locloop_17: ; xref F000:E205
F000:E1FE EC in al,dx ; port 3DAh, CGA/EGA vid status
F000:E1FF 22 C3 and al,bl
F000:E201 74 06 jz loc_19 ; Jump if zero
F000:E203 EB 00 jmp short loc_18 ; (E205)
F000:E205 loc_18: ; xref F000:E203
F000:E205 E2 F7 loop locloop_17 ; Loop if cx > 0
F000:E207 EB 18 jmp short loc_23 ; (E221)
F000:E209 loc_19: ; xref F000:E201
F000:E209 81 E1 0000 and cx,0
nop ;*Fixup for MASM (M)
F000:E20D locloop_20: ; xref F000:E214
F000:E20D EC in al,dx ; port 3DAh, CGA/EGA vid status
bios.lst BIOS ROM Analysis Sourcer Listing v2.15 27-Nov-89 7:47 pm Page 17
F000:E20E 22 C3 and al,bl
F000:E210 75 06 jnz loc_22 ; Jump if not zero
F000:E212 EB 00 jmp short loc_21 ; (E214)
F000:E214 loc_21: ; xref F000:E212
F000:E214 E2 F7 loop locloop_20 ; Loop if cx > 0
F000:E216 EB 09 jmp short loc_23 ; (E221)
F000:E218 loc_22: ; xref F000:E210
F000:E218 80 E3 01 and bl,1
F000:E21B 75 0C jnz loc_25 ; Jump if not zero
F000:E21D B3 08 mov bl,8
F000:E21F EB D9 jmp short loc_16 ; (E1FA)
F000:E221 loc_23: ; xref F000:E207, E216
F000:E221 BA 0005 mov dx,5
F000:E224 EB AC jmp short loc_12 ; (E1D2)
F000:E226 loc_24: ; xref F000:E189
F000:E226 E8 0D09 call sub_30 ; (EF32)
F000:E229 loc_25: ; xref F000:E1E2, E21B
F000:E229 BB C000 mov bx,0C000h
F000:E22C BF C800 mov di,0C800h
F000:E22F E8 02DC call sub_5 ; (E50E)
F000:E232 A0 00E8 mov al,ds:data_36e ; (C000:00E8=0B8h)
F000:E235 B4 00 mov ah,0
F000:E237 CD 10 int 10h ; Video display ah=functn 00h
; set display mode in al
F000:E239 81 3E 0072 1234 cmp word ptr ds:data_31e,1234h ; (C000:0072=0)
F000:E23F 75 03 jne loc_26 ; Jump if not equal
F000:E241 EB 07 jmp short loc_27 ; (E24A)
F000:E243 90 db 90h
F000:E244 loc_26: ; xref F000:E23F
F000:E244 BE F9B1 mov si,0F9B1h
F000:E247 E8 025C call sub_3 ; (E4A6)
F000:E24A loc_27: ; xref F000:E241
F000:E24A FA cli ; Disable interrupts
F000:E24B BA 0021 mov dx,21h
F000:E24E E8 03C7 call sub_10 ; (E618)
F000:E251 75 12 jnz loc_28 ; Jump if not zero
F000:E253 FC cld ; Clear direction
F000:E254 33 C0 xor ax,ax ; Zero register
F000:E256 8E C0 mov es,ax
F000:E258 BF 0024 mov di,24h
F000:E25B B8 E024 mov ax,0E024h
F000:E25E AB stosw ; Store ax to es:[di]
F000:E25F B8 F000 mov ax,seg_d
F000:E262 AB stosw ; Store ax to es:[di]
F000:E263 EB 06 jmp short loc_29 ; (E26B)
F000:E265 loc_28: ; xref F000:E251
F000:E265 BE E006 mov si,0E006h
F000:E268 E8 09E4 call sub_22 ; (EC4F)
F000:E26B loc_29: ; xref F000:E263
F000:E26B 33 C9 xor cx,cx ; Zero register
F000:E26D locloop_30: ; xref F000:E26D
F000:E26D E2 FE loop locloop_30 ; Loop if cx > 0
F000:E26F locloop_31: ; xref F000:E26F
bios.lst BIOS ROM Analysis Sourcer Listing v2.15 27-Nov-89 7:47 pm Page 18
F000:E26F E2 FE loop locloop_31 ; Loop if cx > 0
F000:E271 B8 0014 mov ax,14h
F000:E274 BA 0040 mov dx,seg seg_b
F000:E277 E8 03BC call sub_11 ; (E636)
F000:E27A 72 02 jc loc_32 ; Jump if carry Set
F000:E27C EB 06 jmp short loc_33 ; (E284)
F000:E27E loc_32: ; xref F000:E27A
F000:E27E BE F9F3 mov si,0F9F3h
F000:E281 E8 09CB call sub_22 ; (EC4F)
F000:E284 loc_33: ; xref F000:E27C
F000:E284 B0 FF mov al,0FFh
F000:E286 E6 21 out 21h,al ; port 21h, 8259-1 int comands
F000:E288 B8 0036 mov ax,36h
F000:E28B E6 43 out 43h,al ; port 43h, 8253 wrt timr mode
F000:E28D 86 E0 xchg ah,al
F000:E28F E6 40 out 40h,al ; port 40h, 8253 timer 0 clock
F000:E291 E6 40 out 40h,al ; port 40h, 8253 timer 0 clock
F000:E293 33 C9 xor cx,cx ; Zero register
F000:E295 locloop_34: ; xref F000:E295
F000:E295 E2 FE loop locloop_34 ; Loop if cx > 0
F000:E297 locloop_35: ; xref F000:E297
F000:E297 E2 FE loop locloop_35 ; Loop if cx > 0
F000:E299 81 3E 0072 1234 cmp word ptr ds:data_31e,1234h ; (C000:0072=0)
F000:E29F 75 0A jne loc_37 ; Jump if not equal
F000:E2A1 50 push ax
F000:E2A2 B0 14 mov al,14h
F000:E2A4 locloop_36: ; xref F000:E2A4, E2A8
F000:E2A4 E2 FE loop locloop_36 ; Loop if cx > 0
F000:E2A6 FE C8 dec al
F000:E2A8 75 FA jnz locloop_36 ; Jump if not zero
F000:E2AA 58 pop ax
F000:E2AB loc_37: ; xref F000:E29F
F000:E2AB E8 033A call sub_9 ; (E5E8)
F000:E2AE E3 05 jcxz loc_38 ; Jump if cx=0
F000:E2B0 80 FC AA cmp ah,0AAh
F000:E2B3 74 06 je loc_39 ; Jump if equal
F000:E2B5 loc_38: ; xref F000:E2AE
F000:E2B5 BE F9F9 mov si,0F9F9h
F000:E2B8 E8 0994 call sub_22 ; (EC4F)
F000:E2BB loc_39: ; xref F000:E2B3
F000:E2BB FC cld ; Clear direction
F000:E2BC 33 C0 xor ax,ax ; Zero register
F000:E2BE 8E C0 mov es,ax
F000:E2C0 BF 0024 mov di,24h
F000:E2C3 B8 E987 mov ax,0E987h
F000:E2C6 AB stosw ; Store ax to es:[di]
F000:E2C7 B8 F000 mov ax,seg_d
F000:E2CA AB stosw ; Store ax to es:[di]
F000:E2CB E8 16AD call sub_57 ; (F97B)
F000:E2CE C7 06 001A 001E mov keybd_q_head,1Eh ; (0040:001A=38h)
bios.lst BIOS ROM Analysis Sourcer Listing v2.15 27-Nov-89 7:47 pm Page 19
F000:E2D4 C7 06 001C 001E mov keybd_q_tail,1Eh ; (0040:001C=38h)
F000:E2DA C7 06 0080 001E mov @keybd_begin,1Eh ; (0040:0080=1Eh)
F000:E2E0 C7 06 0082 003E mov @keybd_end,3Eh ; (0040:0082=3Eh)
F000:E2E6 C7 06 0013 0040 mov main_ram_size,40h ; (0040:0013=280h)
F000:E2EC BB 1000 mov bx,1000h
F000:E2EF loc_40: ; xref F000:E353
F000:E2EF FB sti ; Enable interrupts
F000:E2F0 B0 FD mov al,0FDh
F000:E2F2 E6 21 out 21h,al ; port 21h, 8259-1 int comands
F000:E2F4 81 3E 0072 1234 cmp warm_boot_flag,1234h ; (0040:0072=0)
F000:E2FA 74 10 je loc_42 ; Jump if equal
F000:E2FC 83 3E 0013 40 cmp main_ram_size,40h ; (0040:0013=280h)
F000:E301 75 06 jne loc_41 ; Jump if not equal
F000:E303 BE F014 mov si,0F014h
F000:E306 E8 019D call sub_3 ; (E4A6)
F000:E309 loc_41: ; xref F000:E301
F000:E309 E8 01AD call sub_4 ; (E4B9)
F000:E30C loc_42: ; xref F000:E2FA
F000:E30C 81 FB A000 cmp bx,0A000h
F000:E310 74 43 je loc_46 ; Jump if equal
F000:E312 33 FF xor di,di ; Zero register
F000:E314 8B C7 mov ax,di
F000:E316 8E C3 mov es,bx
F000:E318 26: C7 05 55AA mov word ptr es:[di],55AAh
F000:E31D EB 00 jmp short loc_43 ; (E31F)
F000:E31F loc_43: ; xref F000:E31D
F000:E31F 26: 81 35 55AA xor word ptr es:[di],55AAh
F000:E324 75 2F jnz loc_46 ; Jump if not zero
F000:E326 FC cld ; Clear direction
F000:E327 B9 4000 mov cx,4000h
F000:E32A locloop_44: ; xref F000:E32B
F000:E32A AB stosw ; Store ax to es:[di]
F000:E32B E2 FD loop locloop_44 ; Loop if cx > 0
F000:E32D 81 3E 0072 1234 cmp warm_boot_flag,1234h ; (0040:0072=0)
F000:E333 74 15 je loc_45 ; Jump if equal
F000:E335 BD 40C0 mov bp,40C0h
F000:E338 FA cli ; Disable interrupts
F000:E339 B0 FF mov al,0FFh
F000:E33B E6 21 out 21h,al ; port 21h, 8259-1 int comands
F000:E33D 53 push bx
F000:E33E 1E push ds
F000:E33F 8E DB mov ds,bx
F000:E341 E8 031C call sub_12 ; (E660)
F000:E344 1F pop ds
F000:E345 5B pop bx
F000:E346 72 0D jc loc_46 ; Jump if carry Set
F000:E348 75 0B jnz loc_46 ; Jump if not zero
F000:E34A loc_45: ; xref F000:E333
F000:E34A 83 06 0013 20 add main_ram_size,20h ; (0040:0013=280h)
F000:E34F 81 C3 0800 add bx,800h
F000:E353 EB 9A jmp short loc_40 ; (E2EF)
F000:E355 loc_46: ; xref F000:E310, E324, E346, E348
F000:E355 E4 61 in al,61h ; port 61h, 8255 port B, read
F000:E357 0C 30 or al,30h ; '0'
F000:E359 E6 61 out 61h,al ; port 61h, 8255 B - spkr, etc
bios.lst BIOS ROM Analysis Sourcer Listing v2.15 27-Nov-89 7:47 pm Page 20
F000:E35B BE F9F0 mov si,0F9F0h
F000:E35E E8 0145 call sub_3 ; (E4A6)
F000:E361 33 C9 xor cx,cx ; Zero register
F000:E363 locloop_47: ; xref F000:E363
F000:E363 E2 FE loop locloop_47 ; Loop if cx > 0
F000:E365 locloop_48: ; xref F000:E365
F000:E365 E2 FE loop locloop_48 ; Loop if cx > 0
F000:E367 BB C800 mov bx,0C800h
F000:E36A BF F600 mov di,0F600h
F000:E36D E8 019E call sub_5 ; (E50E)
F000:E370 1E push ds
F000:E371 50 push ax
F000:E372 B8 0040 mov ax,seg_b
F000:E375 8E D8 mov ds,ax
F000:E377 C7 06 0072 0000 mov warm_boot_flag,0 ; (0040:0072=0)
F000:E37D 58 pop ax
F000:E37E 1F pop ds
F000:E37F FB sti ; Enable interrupts
F000:E380 B0 BC mov al,0BCh
F000:E382 E6 21 out 21h,al ; port 21h, 8259-1 int comands
F000:E384 B4 00 mov ah,0
F000:E386 8A D4 mov dl,ah
F000:E388 80 0E 003F C1 or byte ptr ds:data_28e,0C1h ; (C000:003F=41h)
F000:E38D CD 13 int 13h ; Disk dl=drive #: ah=func a0h
; reset disk, al=return status
F000:E38F F6 C4 FF test ah,0FFh
F000:E392 75 2C jnz loc_51 ; Jump if not zero
F000:E394 BA 03F2 mov dx,3F2h
F000:E397 B0 1C mov al,1Ch
F000:E399 EE out dx,al ; port 3F2h, dsk0 contrl output
F000:E39A 33 C9 xor cx,cx ; Zero register
F000:E39C locloop_49: ; xref F000:E39C
F000:E39C E2 FE loop locloop_49 ; Loop if cx > 0
F000:E39E locloop_50: ; xref F000:E39E
F000:E39E E2 FE loop locloop_50 ; Loop if cx > 0
F000:E3A0 33 D2 xor dx,dx ; Zero register
F000:E3A2 B5 27 mov ch,27h ; '''
F000:E3A4 88 16 003E mov ds:data_27e,dl ; (C000:003E=52h)
F000:E3A8 80 0E 003F 01 or byte ptr ds:data_28e,1 ; (C000:003F=41h)
F000:E3AD E8 14C6 call sub_56 ; (F876)
F000:E3B0 72 0E jc loc_51 ; Jump if carry Set
F000:E3B2 B5 14 mov ch,14h
F000:E3B4 E8 14BF call sub_56 ; (F876)
F000:E3B7 72 07 jc loc_51 ; Jump if carry Set
F000:E3B9 B5 00 mov ch,0
F000:E3BB E8 14B8 call sub_56 ; (F876)
F000:E3BE 73 06 jnc loc_52 ; Jump if carry=0
F000:E3C0 loc_51: ; xref F000:E392, E3B0, E3B7
F000:E3C0 BE F9FF mov si,0F9FFh
bios.lst BIOS ROM Analysis Sourcer Listing v2.15 27-Nov-89 7:47 pm Page 21
F000:E3C3 E8 0889 call sub_22 ; (EC4F)
F000:E3C6 loc_52: ; xref F000:E3BE
F000:E3C6 B0 0C mov al,0Ch
F000:E3C8 BA 03F2 mov dx,3F2h
F000:E3CB EE out dx,al ; port 3F2h, dsk0 contrl output
F000:E3CC BD E817 mov bp,0E817h
F000:E3CF 33 DB xor bx,bx ; Zero register
F000:E3D1 loc_53: ; xref F000:E3EF
F000:E3D1 2E: 8B 56 00 mov dx,cs:[bp]
F000:E3D5 0B D2 or dx,dx ; Zero ?
F000:E3D7 74 18 jz loc_55 ; Jump if zero
F000:E3D9 B0 55 mov al,55h ; 'U'
F000:E3DB EE out dx,al ; port 3BCh, MDA printer-1 data
F000:E3DC 06 push es
F000:E3DD EC in al,dx ; port 3BCh, MDA printer-1 data
F000:E3DE 07 pop es
F000:E3DF 3C 55 cmp al,55h ; 'U'
F000:E3E1 E8 0234 call sub_10 ; (E618)
F000:E3E4 75 07 jnz loc_54 ; Jump if not zero
F000:E3E6 89 97 0008 mov [bx+8],dx
nop ;*Fixup for MASM (M)
F000:E3EA 80 C3 02 add bl,2
F000:E3ED loc_54: ; xref F000:E3E4
F000:E3ED 45 inc bp
F000:E3EE 45 inc bp
F000:E3EF EB E0 jmp short loc_53 ; (E3D1)
F000:E3F1 loc_55: ; xref F000:E3D7
F000:E3F1 D0 CB ror bl,1 ; Rotate
F000:E3F3 D0 CB ror bl,1 ; Rotate
F000:E3F5 D0 CB ror bl,1 ; Rotate
F000:E3F7 08 1E 0011 or ds:data_26e,bl ; (C000:0011=31h)
F000:E3FB BA 0201 mov dx,201h
F000:E3FE EC in al,dx ; port 201h
F000:E3FF A8 0F test al,0Fh
F000:E401 75 05 jnz loc_56 ; Jump if not zero
F000:E403 80 0E 0011 10 or byte ptr ds:data_26e,10h ; (C000:0011=31h)
F000:E408 loc_56: ; xref F000:E401
F000:E408 33 DB xor bx,bx ; Zero register
F000:E40A C6 06 007C 01 mov byte ptr ds:data_32e,1 ; (C000:007C=0)
F000:E40F C6 06 007D 01 mov byte ptr ds:data_33e,1 ; (C000:007D=0)
F000:E414 C6 06 007E 01 mov byte ptr ds:data_34e,1 ; (C000:007E=0)
F000:E419 C6 06 007F 01 mov byte ptr ds:data_35e,1 ; (C000:007F=0D0h)
F000:E41E B9 0002 mov cx,2
F000:E421 BA 03FA mov dx,3FAh
F000:E424 locloop_57: ; xref F000:E437
F000:E424 EC in al,dx ; port 3FAh, RS232-1 int identy
F000:E425 80 EA 02 sub dl,2
F000:E428 A8 F8 test al,0F8h
F000:E42A 75 07 jnz loc_58 ; Jump if not zero
F000:E42C 89 97 0000 mov [bx+0],dx
nop ;*Fixup for MASM (M)
F000:E430 80 C3 02 add bl,2
F000:E433 loc_58: ; xref F000:E42A
F000:E433 81 EA 00FE sub dx,0FEh
F000:E437 E2 EB loop locloop_57 ; Loop if cx > 0
bios.lst BIOS ROM Analysis Sourcer Listing v2.15 27-Nov-89 7:47 pm Page 22
F000:E439 08 1E 0011 or ds:data_26e,bl ; (C000:0011=31h)
F000:E43D B0 80 mov al,80h
F000:E43F E6 A0 out 0A0h,al ; port 0A0h, initialize, 4 byte
; al = 80h, enable NMI
F000:E441 E8 FBEB call sub_2 ; (E02F)
F000:E444 E8 FBE8 call sub_2 ; (E02F)
F000:E447 B0 BC mov al,0BCh
F000:E449 E6 21 out 21h,al ; port 21h, 8259-1 int comands
F000:E44B 06 push es
F000:E44C 57 push di
F000:E44D 33 FF xor di,di ; Zero register
F000:E44F 8E C7 mov es,di
F000:E451 26: C7 45 62 F600 mov word ptr es:[di+62h],0F600h
F000:E457 5F pop di
F000:E458 07 pop es
F000:E459 B0 B6 mov al,0B6h
F000:E45B E6 43 out 43h,al ; port 43h, 8253 wrt timr mode
F000:E45D B0 04 mov al,4
F000:E45F E6 42 out 42h,al ; port 42h, 8253 timer 2 spkr
F000:E461 E6 42 out 42h,al ; port 42h, 8253 timer 2 spkr
F000:E463 BA 4002 mov dx,4002h
F000:E466 E8 0113 call sub_7 ; (E57C)
F000:E469 E4 61 in al,61h ; port 61h, 8255 port B, read
F000:E46B 8A E0 mov ah,al
F000:E46D 24 F7 and al,0F7h
F000:E46F E6 61 out 61h,al ; port 61h, 8255 B - spkr, etc
F000:E471 EB 00 jmp short loc_59 ; (E473)
F000:E473 loc_59: ; xref F000:E471
F000:E473 E4 62 in al,62h ; port 62h, 8255 C - sw2, etc.
F000:E475 A8 01 test al,1
F000:E477 75 03 jnz loc_60 ; Jump if not zero
F000:E479 E9 07C8 jmp loc_180 ; (EC44)
F000:E47C loc_60: ; xref F000:E477
F000:E47C 8A C4 mov al,ah
F000:E47E E6 61 out 61h,al ; port 61h, 8255 B - spkr, etc
F000:E480 B1 02 mov cl,2
F000:E482 loc_61: ; xref F000:E4A4
F000:E482 51 push cx
F000:E483 CD 19 int 19h ; Bootstrap loader
F000:E485 59 pop cx
F000:E486 FE C9 dec cl
F000:E488 75 02 jnz loc_62 ; Jump if not zero
F000:E48A CD 18 int 18h ; ROM basic
F000:E48C loc_62: ; xref F000:E488
F000:E48C 51 push cx
F000:E48D BE EFD7 mov si,0EFD7h
F000:E490 E8 0013 call sub_3 ; (E4A6)
F000:E493 loc_63: ; xref F000:E497
F000:E493 B4 01 mov ah,1
F000:E495 CD 16 int 16h ; Keyboard i/o ah=function 01h
; get status, if zf=0 al=char
F000:E497 74 FA jz loc_63 ; Jump if zero
F000:E499 B4 00 mov ah,0
F000:E49B CD 16 int 16h ; Keyboard i/o ah=function 00h
; get keybd char in al, ah=scan
F000:E49D 33 DB xor bx,bx ; Zero register
F000:E49F B4 0E mov ah,0Eh
bios.lst BIOS ROM Analysis Sourcer Listing v2.15 27-Nov-89 7:47 pm Page 23
F000:E4A1 CD 10 int 10h ; Video display ah=functn 0Eh
; write char al, teletype mode
F000:E4A3 59 pop cx
F000:E4A4 EB DC jmp short loc_61 ; (E482)
system_reset endp
;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
; SUBROUTINE
;
; Called from: F000:E018, E01E, E033, E247, E306, E35E, E490
; E568, E723
;▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
sub_3 proc near
F000:E4A6 53 push bx
F000:E4A7 loc_64: ; xref F000:E4B5
F000:E4A7 B4 0E mov ah,0Eh
F000:E4A9 33 DB xor bx,bx ; Zero register
F000:E4AB 2E: 8A 04 mov al,cs:[si]
F000:E4AE 0A C0 or al,al ; Zero ?
F000:E4B0 74 05 jz loc_65 ; Jump if zero
F000:E4B2 CD 10 int 10h ; Video display ah=functn 0Eh
; write char al, teletype mode
F000:E4B4 46 inc si
F000:E4B5 EB F0 jmp short loc_64 ; (E4A7)
F000:E4B7 loc_65: ; xref F000:E4B0
F000:E4B7 5B pop bx
F000:E4B8 C3 retn
sub_3 endp
;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
; SUBROUTINE
;
; Called from: F000:E309
;▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
sub_4 proc near
F000:E4B9 56 push si
F000:E4BA 52 push dx
F000:E4BB 51 push cx
F000:E4BC 53 push bx
F000:E4BD 50 push ax
F000:E4BE 33 DB xor bx,bx ; Zero register
F000:E4C0 B4 03 mov ah,3
F000:E4C2 CD 10 int 10h ; Video display ah=functn 03h
; get cursor loc in dx, mode cx
F000:E4C4 33 DB xor bx,bx ; Zero register
F000:E4C6 B2 0D mov dl,0Dh
F000:E4C8 B4 02 mov ah,2
F000:E4CA CD 10 int 10h ; Video display ah=functn 02h
; set cursor location in dx
F000:E4CC A1 0013 mov ax,main_ram_size ; (0040:0013=280h)
F000:E4CF BE 000A mov si,0Ah
F000:E4D2 B9 0004 mov cx,4
bios.lst BIOS ROM Analysis Sourcer Listing v2.15 27-Nov-89 7:47 pm Page 24
F000:E4D5 locloop_66: ; xref F000:E4E3
F000:E4D5 33 D2 xor dx,dx ; Zero register
F000:E4D7 F7 F6 div si ; ax,dx rem=dx:ax/reg
F000:E4D9 D1 C3 rol bx,1 ; Rotate
F000:E4DB D1 C3 rol bx,1 ; Rotate
F000:E4DD D1 C3 rol bx,1 ; Rotate
F000:E4DF D1 C3 rol bx,1 ; Rotate
F000:E4E1 0B DA or bx,dx
F000:E4E3 E2 F0 loop locloop_66 ; Loop if cx > 0
F000:E4E5 B9 0003 mov cx,3
F000:E4E8 8B C3 mov ax,bx
F000:E4EA locloop_67: ; xref F000:E4FE
F000:E4EA D1 C8 ror ax,1 ; Rotate
F000:E4EC D1 C8 ror ax,1 ; Rotate
F000:E4EE D1 C8 ror ax,1 ; Rotate
F000:E4F0 D1 C8 ror ax,1 ; Rotate
F000:E4F2 50 push ax
F000:E4F3 24 0F and al,0Fh
F000:E4F5 0C 30 or al,30h ; '0'
F000:E4F7 33 DB xor bx,bx ; Zero register
F000:E4F9 B4 0E mov ah,0Eh
F000:E4FB CD 10 int 10h ; Video display ah=functn 0Eh
; write char al, teletype mode
F000:E4FD 58 pop ax
F000:E4FE E2 EA loop locloop_67 ; Loop if cx > 0
F000:E500 33 DB xor bx,bx ; Zero register
F000:E502 B0 4B mov al,4Bh ; 'K'
F000:E504 B4 0E mov ah,0Eh
F000:E506 CD 10 int 10h ; Video display ah=functn 0Eh
; write char al, teletype mode
F000:E508 58 pop ax
F000:E509 5B pop bx
F000:E50A 59 pop cx
F000:E50B 5A pop dx
F000:E50C 5E pop si
F000:E50D C3 retn
sub_4 endp
;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
; SUBROUTINE
;
; Called from: F000:E22F, E36D
;▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
sub_5 proc near
F000:E50E 1E push ds
F000:E50F loc_68: ; xref F000:E53C
F000:E50F 8E DB mov ds,bx
F000:E511 33 F6 xor si,si ; Zero register
F000:E513 81 3C AA55 cmp word ptr [si],0AA55h
F000:E517 B8 0080 mov ax,80h
F000:E51A 75 1C jnz loc_69 ; Jump if not zero
F000:E51C E8 19BC call sub_60 ; (FEDB)
bios.lst BIOS ROM Analysis Sourcer Listing v2.15 27-Nov-89 7:47 pm Page 25
F000:E51F 0E push cs
F000:E520 B8 E52A mov ax,0E52Ah
F000:E523 50 push ax
F000:E524 53 push bx
F000:E525 B8 0003 mov ax,3
F000:E528 50 push ax
F000:E529 CB retf ; Return far
F000:E52A E8 FB 0A 8E DB 33 db 0E8h, 0FBh, 0Ah, 8Eh, 0DBh, 33h
F000:E530 C0 8A 44 02 B1 05 db 0C0h, 8Ah, 44h, 2, 0B1h, 5
F000:E536 D3 C0 db 0D3h, 0C0h
F000:E538 loc_69: ; xref F000:E51A
F000:E538 03 D8 add bx,ax
F000:E53A 3B DF cmp bx,di
F000:E53C 72 D1 jb loc_68 ; Jump if below
F000:E53E 1F pop ds
F000:E53F C3 retn
sub_5 endp
;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
; SUBROUTINE
;
; Called from: F000:E147
;▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
sub_6 proc near
F000:E540 1E push ds
F000:E541 B9 0020 mov cx,20h
F000:E544 2B FF sub di,di
F000:E546 8E C7 mov es,di
F000:E548 BE FEF3 mov si,0FEF3h
F000:E54B 0E push cs
F000:E54C 58 pop ax
F000:E54D 8E D8 mov ds,ax
F000:E54F locloop_70: ; xref F000:E551
F000:E54F A5 movsw ; Mov [si] to es:[di]
F000:E550 AB stosw ; Store ax to es:[di]
F000:E551 E2 FC loop locloop_70 ; Loop if cx > 0
F000:E553 1F pop ds
F000:E554 C3 retn
sub_6 endp
; ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ int 2 ▒▒▒▒▒▒▒
;
; NON-MASKABLE HARDWARE INTERRUPT
;
; This function is called in the event of a memory parity error or may
; occur in the event of other hardware problems or failures (depends on
; the specific manufacturer's hardware). Displays the appropriate
; error message and halts the processor.
F000:E555 int_2_NMI proc near
F000:E555 50 push ax
bios.lst BIOS ROM Analysis Sourcer Listing v2.15 27-Nov-89 7:47 pm Page 26
F000:E556 E4 62 in al,62h ; port 62h, 8255 C - sw2, etc.
F000:E558 A8 80 test al,80h
F000:E55A 74 05 jz loc_71 ; Jump if zero
F000:E55C BE FEC0 mov si,0FEC0h
F000:E55F EB 07 jmp short loc_72 ; (E568)
F000:E561 loc_71: ; xref F000:E55A
F000:E561 A8 40 test al,40h ; '@'
F000:E563 74 15 jz loc_74 ; Jump if zero
F000:E565 BE FEB5 mov si,0FEB5h
F000:E568 loc_72: ; xref F000:E55F
F000:E568 E8 FF3B call sub_3 ; (E4A6)
F000:E56B FA cli ; Disable interrupts
F000:E56C B9 000A mov cx,0Ah
F000:E56F locloop_73: ; xref F000:E577
F000:E56F 51 push cx
F000:E570 BA 0007 mov dx,7
F000:E573 E8 0006 call sub_7 ; (E57C)
F000:E576 59 pop cx
F000:E577 E2 F6 loop locloop_73 ; Loop if cx > 0
F000:E579 F4 hlt ; Halt processor
F000:E57A loc_74: ; xref F000:E563
F000:E57A 58 pop ax
F000:E57B CF iret ; Interrupt return
int_2_NMI endp
;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
; SUBROUTINE
;
; Called from: F000:E1D8, E466, E573
;▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
sub_7 proc near
F000:E57C 53 push bx
F000:E57D 51 push cx
F000:E57E 52 push dx
F000:E57F 2B C9 sub cx,cx
F000:E581 8A EE mov ch,dh
F000:E583 9C pushf ; Push flags
F000:E584 FA cli ; Disable interrupts
F000:E585 D0 EA shr dl,1 ; Shift w/zeros fill
F000:E587 73 07 jnc loc_76 ; Jump if carry=0
F000:E589 B3 05 mov bl,5
F000:E58B E8 0014 call sub_8 ; (E5A2)
F000:E58E locloop_75: ; xref F000:E58E
F000:E58E E2 FE loop locloop_75 ; Loop if cx > 0
F000:E590 loc_76: ; xref F000:E587
F000:E590 B3 01 mov bl,1
F000:E592 loc_77: ; xref F000:E59B
F000:E592 8A EE mov ch,dh
F000:E594 E8 000B call sub_8 ; (E5A2)
F000:E597 locloop_78: ; xref F000:E597
bios.lst BIOS ROM Analysis Sourcer Listing v2.15 27-Nov-89 7:47 pm Page 27
F000:E597 E2 FE loop locloop_78 ; Loop if cx > 0
F000:E599 FE CA dec dl
F000:E59B 75 F5 jnz loc_77 ; Jump if not zero
F000:E59D 9D popf ; Pop flags
F000:E59E 5A pop dx
F000:E59F 59 pop cx
F000:E5A0 5B pop bx
F000:E5A1 C3 retn
sub_7 endp
;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
; SUBROUTINE
;
; Called from: F000:E58B, E594, EA2E, EC3E, F4CD
;▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
sub_8 proc near
F000:E5A2 50 push ax
F000:E5A3 51 push cx
F000:E5A4 53 push bx
F000:E5A5 52 push dx
F000:E5A6 56 push si
F000:E5A7 E4 61 in al,61h ; port 61h, 8255 port B, read
F000:E5A9 8A E0 mov ah,al
F000:E5AB 32 F6 xor dh,dh ; Zero register
F000:E5AD 0C 03 or al,3
F000:E5AF E6 61 out 61h,al ; port 61h, 8255 B - spkr, etc
F000:E5B1 BE E5E4 mov si,0E5E4h
F000:E5B4 2E: 8A 14 mov dl,cs:[si]
F000:E5B7 46 inc si
F000:E5B8 2E: 8A 04 mov al,cs:[si]
F000:E5BB EE out dx,al ; port 43h, 8253 wrt timr mode
F000:E5BC FE CA dec dl
F000:E5BE B9 0002 mov cx,2
F000:E5C1 locloop_79: ; xref F000:E5C6
F000:E5C1 46 inc si
F000:E5C2 2E: 8A 04 mov al,cs:[si]
F000:E5C5 EE out dx,al ; port 42h, 8253 timer 2 spkr
F000:E5C6 E2 F9 loop locloop_79 ; Loop if cx > 0
F000:E5C8 B9 C000 mov cx,0C000h
F000:E5CB 81 FB 4401 cmp bx,4401h
F000:E5CF 75 03 jne locloop_80 ; Jump if not equal
F000:E5D1 B9 1000 mov cx,1000h
F000:E5D4 locloop_80: ; xref F000:E5CF, E5D4, E5D8
F000:E5D4 E2 FE loop locloop_80 ; Loop if cx > 0
F000:E5D6 FE CB dec bl
F000:E5D8 75 FA jnz locloop_80 ; Jump if not zero
F000:E5DA 86 C4 xchg al,ah
F000:E5DC E6 61 out 61h,al ; port 61h, 8255 B - spkr, etc
; al = 0, disable parity
F000:E5DE 5E pop si
bios.lst BIOS ROM Analysis Sourcer Listing v2.15 27-Nov-89 7:47 pm Page 28
F000:E5DF 5A pop dx
F000:E5E0 5B pop bx
F000:E5E1 59 pop cx
F000:E5E2 58 pop ax
F000:E5E3 C3 retn
sub_8 endp
F000:E5E4 43 B6 30 05 db 43h, 0B6h, 30h, 5
;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
; SUBROUTINE
;
; Called from: F000:E2AB
;▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
sub_9 proc near
F000:E5E8 B0 08 mov al,8
F000:E5EA E6 61 out 61h,al ; port 61h, 8255 B - spkr, etc
F000:E5EC B9 5C30 mov cx,5C30h
F000:E5EF locloop_81: ; xref F000:E5EF
F000:E5EF E2 FE loop locloop_81 ; Loop if cx > 0
F000:E5F1 B0 C8 mov al,0C8h
F000:E5F3 E6 61 out 61h,al ; port 61h, 8255 B - spkr, etc
F000:E5F5 B0 48 mov al,48h ; 'H'
F000:E5F7 E6 61 out 61h,al ; port 61h, 8255 B - spkr, etc
F000:E5F9 B0 FD mov al,0FDh
F000:E5FB E6 21 out 21h,al ; port 21h, 8259-1 int comands
F000:E5FD FB sti ; Enable interrupts
F000:E5FE 32 DB xor bl,bl ; Zero register
F000:E600 33 C9 xor cx,cx ; Zero register
F000:E602 locloop_82: ; xref F000:E609
F000:E602 F6 C3 FF test bl,0FFh
F000:E605 75 04 jnz loc_84 ; Jump if not zero
F000:E607 EB 00 jmp short loc_83 ; (E609)
F000:E609 loc_83: ; xref F000:E607
F000:E609 E2 F7 loop locloop_82 ; Loop if cx > 0
F000:E60B loc_84: ; xref F000:E605
F000:E60B E4 60 in al,60h ; port 60h, keybd scan or sw1
F000:E60D 8A E0 mov ah,al
F000:E60F B0 C8 mov al,0C8h
F000:E611 E6 61 out 61h,al ; port 61h, 8255 B - spkr, etc
F000:E613 B0 48 mov al,48h ; 'H'
F000:E615 E6 61 out 61h,al ; port 61h, 8255 B - spkr, etc
F000:E617 C3 retn
sub_9 endp
;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
; SUBROUTINE
;
; Called from: F000:E24E, E3E1
;▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
bios.lst BIOS ROM Analysis Sourcer Listing v2.15 27-Nov-89 7:47 pm Page 29
sub_10 proc near
F000:E618 53 push bx
F000:E619 50 push ax
F000:E61A BB E813 mov bx,0E813h
F000:E61D loc_85: ; xref F000:E631
F000:E61D 2E: 8A 27 mov ah,cs:[bx]
F000:E620 8A C4 mov al,ah
F000:E622 EE out dx,al ; port 21h, 8259-1 int comands
F000:E623 90 nop
F000:E624 90 nop
F000:E625 32 C0 xor al,al ; Zero register
F000:E627 EC in al,dx ; port 21h, 8259-1 int IMR
F000:E628 32 C4 xor al,ah
F000:E62A 75 07 jnz loc_86 ; Jump if not zero
F000:E62C 43 inc bx
F000:E62D FE C4 inc ah
F000:E62F 0A E4 or ah,ah ; Zero ?
F000:E631 75 EA jnz loc_85 ; Jump if not zero
F000:E633 loc_86: ; xref F000:E62A
F000:E633 58 pop ax
F000:E634 5B pop bx
F000:E635 C3 retn
sub_10 endp
;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
; SUBROUTINE
;
; Called from: F000:E277
;▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
sub_11 proc near
F000:E636 E6 43 out 43h,al ; port 43h, 8253 wrt timr mode
F000:E638 32 C9 xor cl,cl ; Zero register
F000:E63A 8A F9 mov bh,cl
F000:E63C 8A C1 mov al,cl
F000:E63E EE out dx,al ; port 40h, 8253 timer 0 clock
F000:E63F B3 02 mov bl,2
F000:E641 loc_87: ; xref F000:E654
F000:E641 2B C9 sub cx,cx
F000:E643 locloop_88: ; xref F000:E650
F000:E643 8A C4 mov al,ah
F000:E645 E6 43 out 43h,al ; port 43h, 8253 wrt timr mode
; al = 0, timer 0 count mode
F000:E647 90 nop
F000:E648 EC in al,dx ; port 40h, 8253 timer 0 clock
F000:E649 0A F8 or bh,al
F000:E64B 80 FF FF cmp bh,0FFh
F000:E64E 74 0E je loc_90 ; Jump if equal
F000:E650 E2 F1 loop locloop_88 ; Loop if cx > 0
F000:E652 FE CB dec bl
F000:E654 75 EB jnz loc_87 ; Jump if not zero
F000:E656 EB 01 jmp short loc_89 ; (E659)
F000:E658 90 db 90h
F000:E659 loc_89: ; xref F000:E656
bios.lst BIOS ROM Analysis Sourcer Listing v2.15 27-Nov-89 7:47 pm Page 30
F000:E659 F9 stc ; Set carry flag
F000:E65A EB 03 jmp short loc_ret_91 ; (E65F)
F000:E65C 90 C3 db 90h, 0C3h
F000:E65E loc_90: ; xref F000:E64E
F000:E65E F8 clc ; Clear carry flag
F000:E65F loc_ret_91: ; xref F000:E65A
F000:E65F C3 retn
sub_11 endp
;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
; SUBROUTINE
;
; Called from: F000:E1C9, E341
;▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
sub_12 proc near
F000:E660 loc_92: ; xref F000:E123
F000:E660 8C C3 mov bx,es
F000:E662 FC cld ; Clear direction
F000:E663 8C D8 mov ax,ds
F000:E665 8E C0 mov es,ax
F000:E667 E4 61 in al,61h ; port 61h, 8255 port B, read
F000:E669 24 CF and al,0CFh
F000:E66B E6 61 out 61h,al ; port 61h, 8255 B - spkr, etc
; al = 0, disable parity
F000:E66D B8 5551 mov ax,5551h
F000:E670 loc_93: ; xref F000:E689
F000:E670 8B CD mov cx,bp
F000:E672 32 C9 xor cl,cl ; Zero register
F000:E674 8B D1 mov dx,cx
F000:E676 33 FF xor di,di ; Zero register
F000:E678 F3/ AB rep stosw ; Rep when cx >0 Store ax to es:[di]
F000:E67A 8B CA mov cx,dx
F000:E67C 33 FF xor di,di ; Zero register
F000:E67E F3/ AF repe scasw ; Rep zf=1+cx >0 Scan es:[di] for ax
F000:E680 F8 clc ; Clear carry flag
F000:E681 75 1E jnz loc_95 ; Jump if not zero
F000:E683 35 FFFF xor ax,0FFFFh
F000:E686 3D 5551 cmp ax,5551h
F000:E689 75 E5 jne loc_93 ; Jump if not equal
F000:E68B 8B CA mov cx,dx
F000:E68D 33 C0 xor ax,ax ; Zero register
F000:E68F 33 FF xor di,di ; Zero register
F000:E691 F3/ AB rep stosw ; Rep when cx >0 Store ax to es:[di]
F000:E693 E4 62 in al,62h ; port 62h, 8255 C - sw2, etc.
F000:E695 8B CD mov cx,bp
F000:E697 22 C1 and al,cl
F000:E699 75 03 jnz loc_94 ; Jump if not zero
F000:E69B 8E C3 mov es,bx
F000:E69D C3 retn
F000:E69E loc_94: ; xref F000:E699
F000:E69E 32 C0 xor al,al ; Zero register
F000:E6A0 F9 stc ; Set carry flag
F000:E6A1 loc_95: ; xref F000:E681
F000:E6A1 8E C3 mov es,bx
bios.lst BIOS ROM Analysis Sourcer Listing v2.15 27-Nov-89 7:47 pm Page 31
F000:E6A3 C3 retn
sub_12 endp
; ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ int 8 ▒▒▒▒▒▒▒
;
; TIMER TICKS (called by hardware 8259-1, IRQ 0)
;
; This is the primary timer used to control the clock and other key
; system resources. It is called indirectly by channel A of the 8253
; timer every 18.2 milliseconds. Every timer tick also calls int 1Ch
; for user needs (int 1Ch points to an iret instruction unless changed
; by a resident program). The timer interrupt is given the highest
; maskable interrupt priority upon power up.
;
; The main timing functions of int 8 include increment of a 32-bit
; time since powered on counter, timer_hi and timer_low, and after 24
; hours since powered on, timer_rolled is incremented.
;
; The last task of int 8 is turning off the floppy drive motor after
; 2 seconds of non-use. The counter dsk_motor_tmr is decremented upon
; each occurrence of int 8. When the count reaches zero, the motor is
; set off, and the motor running flags are cleared in dsk_motor_stat.
F000:E6A4 int_8_timer proc near ; xref F000:FF03
F000:E6A4 FB sti ; Enable interrupts
F000:E6A5 1E push ds
F000:E6A6 50 push ax
F000:E6A7 52 push dx
F000:E6A8 E8 12D0 call sub_57 ; (F97B)
F000:E6AB 56 push si
F000:E6AC BE 006C mov si,6Ch
F000:E6AF FF 04 inc word ptr [si]
F000:E6B1 75 03 jnz loc_96 ; Jump if not zero
F000:E6B3 FF 44 02 inc word ptr [si+2]
F000:E6B6 loc_96: ; xref F000:E6B1
F000:E6B6 83 7C 02 18 cmp word ptr [si+2],18h
F000:E6BA 7C 11 jl loc_97 ; Jump if <
F000:E6BC 81 3C 00B0 cmp word ptr [si],0B0h
F000:E6C0 75 0B jne loc_97 ; Jump if not equal
F000:E6C2 33 C0 xor ax,ax ; Zero register
F000:E6C4 89 04 mov [si],ax
F000:E6C6 89 44 02 mov [si+2],ax
F000:E6C9 C6 44 04 01 mov byte ptr [si+4],1
F000:E6CD loc_97: ; xref F000:E6BA, E6C0
F000:E6CD 5E pop si
F000:E6CE FE 0E 0040 dec dsk_motor_tmr ; (0040:0040=96h)
F000:E6D2 75 0C jnz loc_98 ; Jump if not zero
F000:E6D4 B0 F0 mov al,0F0h
F000:E6D6 20 06 003F and dsk_motor_stat,al ; (0040:003F=50h)
F000:E6DA 34 FC xor al,0FCh
F000:E6DC BA 03F2 mov dx,3F2h
F000:E6DF EE out dx,al ; port 3F2h, dsk0 contrl output
F000:E6E0 loc_98: ; xref F000:E6D2
F000:E6E0 CD 1C int 1Ch ; Timer break (call each 18.2ms)
F000:E6E2 E8 133C call sub_59 ; (FA21)
bios.lst BIOS ROM Analysis Sourcer Listing v2.15 27-Nov-89 7:47 pm Page 32
F000:E6E5 5A pop dx
F000:E6E6 58 pop ax
F000:E6E7 1F pop ds
F000:E6E8 CF iret ; Interrupt return
int_8_timer endp
F000:E6E9 0009[00] db 9 dup (0)
; ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ int 19h ▒▒▒▒▒
;
; BOOTSTRAP LOADER
;
; Floppy drive a: attempts a read from the first sector of the disk.
; If read properly (i.e a boot disk is in drive a:), control is
; transferred to the loaded program. The boot sector at track 0,
; sector 1 is transfered to memory at 0:7C00h. dh = drive which
; was used (0=A:). Control is passed to 0:7C00h.
F000:E6F2 int_19h_bootup proc near ; xref F000:FF25
F000:E6F2 FB sti ; Enable interrupts
F000:E6F3 E8 1285 call sub_57 ; (F97B)
F000:E6F6 BD 0003 mov bp,3
F000:E6F9 loc_99: ; xref F000:E711
F000:E6F9 33 C0 xor ax,ax ; Zero register
F000:E6FB CD 13 int 13h ; Disk dl=drive #: ah=func a0h
; reset disk, al=return status
F000:E6FD 72 11 jc loc_100 ; Jump if carry Set
F000:E6FF 33 D2 xor dx,dx ; Zero register
F000:E701 8E C2 mov es,dx
F000:E703 BB 7C00 mov bx,7C00h
F000:E706 B9 0001 mov cx,1
F000:E709 B8 0201 mov ax,201h
F000:E70C CD 13 int 13h ; Disk dl=drive #: ah=func a2h
; read sectors to memory es:bx
F000:E70E 73 07 jnc loc_101 ; Jump if carry=0
F000:E710 loc_100: ; xref F000:E6FD
F000:E710 4D dec bp
F000:E711 75 E6 jnz loc_99 ; Jump if not zero
F000:E713 F9 stc ; Set carry flag
F000:E714 CA 0002 retf 2 ; Return far
int_19h_bootup endp
F000:E717 loc_101: ; xref F000:E70E
F000:E717 33 DB xor bx,bx ; Zero register
F000:E719 53 push bx
F000:E71A BB 7C00 mov bx,7C00h
F000:E71D 53 push bx
F000:E71E CB retf ; Return far
;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
; SUBROUTINE
;
; Called from: F000:EC52
;▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
sub_13 proc near
bios.lst BIOS ROM Analysis Sourcer Listing v2.15 27-Nov-89 7:47 pm Page 33
F000:E71F 56 push si
F000:E720 BE FECF mov si,0FECFh
F000:E723 E8 FD80 call sub_3 ; (E4A6)
F000:E726 5E pop si
F000:E727 C3 retn
sub_13 endp
F000:E728 00 db 0
; █▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀█
; █ Baud Rate Table █
; █ █
; █ Table of hex divsors for █
; █ the serial ports. Table █
; █ divisors for bauds 110 to █
; █ 19,200. █
; █▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄█
F000:E729 0417 baud_rate_tbl dw 417h ; 110 Baud rate divisor
F000:E72B 0300 baud_150 dw 300h
F000:E72D 0180 baud_300 dw 180h
F000:E72F 00C0 baud_600 dw 0C0h
F000:E731 0060 baud_1200 dw 60h
F000:E733 0030 baud_2400 dw 30h
F000:E735 0018 baud_4800 dw 18h
F000:E737 000C baud_9600 dw 0Ch
; ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ int 14h ▒▒▒▒▒
;
; RS-232 SERIAL PORTS SERVICES
;
; Call with: ah = sub-function number
; dx = communications number, com1 = 0
;
; Returns: ah = line status, bit 0 = Data ready
; bit 1 = Overrun error
; bit 2 = Parity error
; bit 3 = CRC framing error
; bit 4 = Break detect
; bit 5 = Xmit buffer register empty
; bit 6 = Xmit shift out register empty
; bit 7 = No response, ignore bits 0-6
;
; al = modem status, bit 0 = Change in Clear To Send
; bit 1 = Change in Data Set Ready
; bit 2 = Falling edge ring detect
; bit 3 = Change in receive detect line
; bit 4 = Clear to Send (CTS)
; bit 5 = Data Set Ready (DTS)
; bit 6 = Ring detected
; bit 7 = Receive detect line
;
; Functions:
; ah = 0 Reset the specified port
; Call with: al serial port register values
; bits 7 6 5 4 3 2 1 0
bios.lst BIOS ROM Analysis Sourcer Listing v2.15 27-Nov-89 7:47 pm Page 34
; --baud-rate-- -Parity- Stop --Word--
; 000 = 110 bits bit size
; 001 = 150 (bits)
; 010 = 300 00 = off 0=1
; 011 = 600 01 = odd 1=2 10 = 7
; 100 = 1200 10 = off 11 = 8
; 101 = 2400 11 = even
; 110 = 4800
; 111 = 9600
; ah = 1 Transmit a character
; Call with: al = character to send (not changed on exit)
; ah = 2 Received a character
; Returns: al = character received
; ah = 3 Get status
; ah = 4 Advanced Initialization (not supported on all systems)
; Call with: al = 0/1 no break/break
; bh = Parity, 0 = none 3 = stick odd
; 1 = odd 4 = stick even
; 2 = even
; bl = 0/1 Stop bits set to 1/2
; ch = Word size, 0 = 5 bits 2 = 7 bits
; 1 = 6 bits 3 = 8 bits
;
; cl = Baud rate, 0 = 110 5 = 2400
; 1 = 150 6 = 4800
; 2 = 300 7 = 9600
; 3 = 600 8 = 19200
; 4 = 1200
; ah = 5 Advanced port control (not supported on all systems)
; al = 0 Get modem register
; Returns: bl bit 0 = Data Terminal Ready (DTR)
; bit 1 = Request To Send (RTS)
; bit 2 = Out 1
; bit 3 = Out 2
; bit 4 = Loop modem
; al = 1 Set modem register
; Call with: bl = value for register (see above)
F000:E739 int_14h_RS232 proc near ; xref F000:FF1B
F000:E739 80 FC 03 cmp ah,3
F000:E73C 7E 01 jle loc_102 ; Jump if < or =
F000:E73E CF iret ; Interrupt return
int_14h_RS232 endp
F000:E73F loc_102: ; xref F000:E73C
F000:E73F E8 1799 call sub_60 ; (FEDB)
F000:E742 E8 1236 call sub_57 ; (F97B)
F000:E745 8B FA mov di,dx
F000:E747 03 D2 add dx,dx
F000:E749 BB 0000 mov bx,0
F000:E74C 03 DA add bx,dx
F000:E74E 8B 17 mov dx,[bx]
F000:E750 8A D8 mov bl,al
F000:E752 83 FA 00 cmp dx,0
F000:E755 75 03 jne loc_103 ; Jump if not equal
F000:E757 E9 009E jmp loc_110 ; (E7F8)
F000:E75A loc_103: ; xref F000:E755
bios.lst BIOS ROM Analysis Sourcer Listing v2.15 27-Nov-89 7:47 pm Page 35
F000:E75A 80 FC 00 cmp ah,0
F000:E75D 75 48 jne loc_105 ; Jump if not equal
F000:E75F 83 C2 03 add dx,3
F000:E762 86 E0 xchg ah,al
F000:E764 0C 80 or al,80h
F000:E766 EE out dx,al ; port 2FBh, RS232-2 line cntrl
F000:E767 33 C9 xor cx,cx ; Zero register
F000:E769 0A EC or ch,ah
F000:E76B 80 C9 04 or cl,4
F000:E76E 80 E5 E0 and ch,0E0h
F000:E771 D2 ED shr ch,cl ; Shift w/zeros fill
F000:E773 80 E1 00 and cl,0
F000:E776 86 E9 xchg ch,cl
F000:E778 BB E729 mov bx,0E729h
F000:E77B 83 EA 03 sub dx,3
F000:E77E 03 D9 add bx,cx
F000:E780 1E push ds
F000:E781 0E push cs
F000:E782 1F pop ds
F000:E783 8A 07 mov al,[bx]
F000:E785 EE out dx,al ; port 2F8h, RS232-2 xmit buffr
F000:E786 83 C2 01 add dx,1
F000:E789 43 inc bx
F000:E78A 8A 07 mov al,[bx]
F000:E78C EE out dx,al ; port 2F9h, RS232-2 int enable
F000:E78D 1F pop ds
F000:E78E 80 E4 1F and ah,1Fh
F000:E791 42 inc dx
F000:E792 42 inc dx
F000:E793 86 E0 xchg ah,al
F000:E795 EE out dx,al ; port 2FBh, RS232-2 line cntrl
F000:E796 24 00 and al,0
F000:E798 83 EA 02 sub dx,2
F000:E79B EE out dx,al ; port 2F9h, RS232-2 int enable
; al = 0, all interrupts off
F000:E79C loc_104: ; xref F000:E7F6
F000:E79C 83 C2 04 add dx,4
F000:E79F EC in al,dx ; port 2FDh, RS232-2 line stat
F000:E7A0 86 E0 xchg ah,al
F000:E7A2 42 inc dx
F000:E7A3 EC in al,dx ; port 2FEh, RS232-2 modem stat
F000:E7A4 EB 52 jmp short loc_110 ; (E7F8)
F000:E7A6 90 db 90h
F000:E7A7 loc_105: ; xref F000:E75D
F000:E7A7 80 FC 01 cmp ah,1
F000:E7AA 75 23 jne loc_108 ; Jump if not equal
F000:E7AC B9 3003 mov cx,3003h
F000:E7AF E8 004A call sub_14 ; (E7FC)
F000:E7B2 72 44 jc loc_110 ; Jump if carry Set
F000:E7B4 83 EA 01 sub dx,1
F000:E7B7 B5 20 mov ch,20h ; ' '
F000:E7B9 86 D8 xchg bl,al
F000:E7BB E8 1247 call sub_58 ; (FA05)
F000:E7BE 86 D8 xchg bl,al
F000:E7C0 73 06 jnc loc_107 ; Jump if carry=0
F000:E7C2 loc_106: ; xref F000:E7E4
F000:E7C2 80 CC 80 or ah,80h
bios.lst BIOS ROM Analysis Sourcer Listing v2.15 27-Nov-89 7:47 pm Page 36
F000:E7C5 EB 31 jmp short loc_110 ; (E7F8)
F000:E7C7 90 db 90h
F000:E7C8 loc_107: ; xref F000:E7C0
F000:E7C8 83 EA 05 sub dx,5
F000:E7CB EE out dx,al ; port 2F8h, RS232-2 xmit buffr
F000:E7CC EB 2A jmp short loc_110 ; (E7F8)
F000:E7CE 90 db 90h
F000:E7CF loc_108: ; xref F000:E7AA
F000:E7CF 80 FC 02 cmp ah,2
F000:E7D2 75 1C jne loc_109 ; Jump if not equal
F000:E7D4 B9 2001 mov cx,2001h
F000:E7D7 E8 0022 call sub_14 ; (E7FC)
F000:E7DA 72 1C jc loc_110 ; Jump if carry Set
F000:E7DC 83 EA 01 sub dx,1
F000:E7DF B5 01 mov ch,1
F000:E7E1 E8 1221 call sub_58 ; (FA05)
F000:E7E4 72 DC jc loc_106 ; Jump if carry Set
F000:E7E6 83 EA 05 sub dx,5
F000:E7E9 EC in al,dx ; port 2F2h
F000:E7EA 80 E4 1E and ah,1Eh
F000:E7ED EB 09 jmp short loc_110 ; (E7F8)
F000:E7EF 90 db 90h
F000:E7F0 loc_109: ; xref F000:E7D2
F000:E7F0 83 C2 01 add dx,1
F000:E7F3 80 FC 03 cmp ah,3
F000:E7F6 74 A4 je loc_104 ; Jump if equal
F000:E7F8 loc_110: ; xref F000:E757, E7A4, E7B2, E7C5
; E7CC, E7DA, E7ED
F000:E7F8 E8 082D call sub_32 ; (F028)
F000:E7FB CF iret ; Interrupt return
;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
; SUBROUTINE
;
; Called from: F000:E7AF, E7D7
;▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
sub_14 proc near
F000:E7FC 86 D8 xchg bl,al
F000:E7FE 8A C1 mov al,cl
F000:E800 83 C2 04 add dx,4
F000:E803 EE out dx,al ; port 302h
F000:E804 83 C2 02 add dx,2
F000:E807 E8 11FB call sub_58 ; (FA05)
F000:E80A 86 D8 xchg bl,al
F000:E80C 73 04 jnc loc_ret_111 ; Jump if carry=0
F000:E80E 80 CC 80 or ah,80h
F000:E811 F9 stc ; Set carry flag
F000:E812 loc_ret_111: ; xref F000:E80C
F000:E812 C3 retn
sub_14 endp
F000:E813 00 01 FF 00 BC 03 db 0, 1, 0FFh, 0, 0BCh, 3
F000:E819 78 03 78 02 C0 00 db 78h, 3, 78h, 2, 0C0h, 0
F000:E81F 00 00 52 40 47 AE db 0, 0, 52h, 40h, 47h, 0AEh
F000:E825 42 10 00 00 00 00 db 42h, 10h, 0, 0, 0, 0
bios.lst BIOS ROM Analysis Sourcer Listing v2.15 27-Nov-89 7:47 pm Page 37
F000:E82B 00 00 00 db 0, 0, 0
; ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ int 16h ▒▒▒▒▒
;
; KEYBOARD SERVICES
;
; Call with: ah = sub-function number
;
; Functions:
; ah = 0 Get a key, and wait until one is available if none are
; in the queue.
; Returns: ah = keyboard scan code
; al = ASCII character, or 0 if non-ASCII
; ah = 1 Get key status
; Returns: zero flag = 0 if a valid key is in the queue
; ah = keyboard scan code
; al = ASCII character, or 0 if non-ASCII
; zero flag = 1 if no keys in the queue
; ah = 2 Get shift status register
; Returns: al = bits 7 6 5 4 3 2 1 0
; right left ctrl alt scrl num cap insrt
; -------shifts------ ------toggles-------
; 1 = down 1 = on
; ah = 3 Set repeating character rate (not supported in all systems)
; Call with: al = 5
; bh = start delay, 0 = 250 ms 2 = 750 ms
; 1 = 500 ms 3 = 1000 ms
; bl = speed in characters per second - values
; range from 0 = 30 cps, to 1Fh = 2 cps
; ah = 5 Load keyboard queue (not supported in all systems)
; Call with: ch/cl = scan code/character to load into the queue
; Returns: al = 0 if ok, 1 if keyboard queue is full
;
; **** Support for extended keyboard functions ****
; ah = 10h Get a key (similar to ah = 0, not supported in all systems)
; ah = 11h Get key status (similar to ah = 1, not supported in all systems)
; ah = 12h Get shift info (similar to ah = 2, not supported in all systems)
F000:E82E int_16h_keybd proc near ; xref F000:FF1F
F000:E82E E8 16AA call sub_60 ; (FEDB)
F000:E831 E8 1147 call sub_57 ; (F97B)
F000:E834 BB 001A mov bx,1Ah
F000:E837 80 FC 00 cmp ah,0
F000:E83A 77 1B ja loc_115 ; Jump if above
F000:E83C loc_112: ; xref F000:E842
F000:E83C FB sti ; Enable interrupts
F000:E83D 0B C9 or cx,cx ; Zero ?
F000:E83F E8 0024 call sub_15 ; (E866)
F000:E842 74 F8 jz loc_112 ; Jump if zero
F000:E844 E8 0028 call sub_16 ; (E86F)
F000:E847 89 37 mov [bx],si
F000:E849 loc_113: ; xref F000:E85D, E864
F000:E849 E8 07DC call sub_32 ; (F028)
F000:E84C CF iret ; Interrupt return
int_16h_keybd endp
bios.lst BIOS ROM Analysis Sourcer Listing v2.15 27-Nov-89 7:47 pm Page 38
F000:E84D loc_114: ; xref F000:E859
F000:E84D E8 0016 call sub_15 ; (E866)
F000:E850 FB sti ; Enable interrupts
F000:E851 E8 07D4 call sub_32 ; (F028)
F000:E854 CA 0002 retf 2 ; Return far
F000:E857 loc_115: ; xref F000:E83A
F000:E857 FE CC dec ah
F000:E859 74 F2 jz loc_114 ; Jump if zero
F000:E85B FE CC dec ah
F000:E85D 75 EA jnz loc_113 ; Jump if not zero
F000:E85F BB 0017 mov bx,17h
F000:E862 8A 07 mov al,[bx]
F000:E864 EB E3 jmp short loc_113 ; (E849)
;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
; SUBROUTINE
;
; Called from: F000:E83F, E84D
;▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
sub_15 proc near
F000:E866 FA cli ; Disable interrupts
F000:E867 8B 37 mov si,[bx]
F000:E869 3B 77 02 cmp si,[bx+2]
F000:E86C 8B 04 mov ax,[si]
F000:E86E C3 retn
sub_15 endp
;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
; SUBROUTINE
;
; Called from: F000:E844, EA20
;▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
sub_16 proc near
F000:E86F 81 FE 003C cmp si,3Ch
nop ;*Fixup for MASM (M)
F000:E873 74 04 je loc_116 ; Jump if equal
F000:E875 83 C6 02 add si,2
F000:E878 C3 retn
F000:E879 loc_116: ; xref F000:E873
F000:E879 BE 001E mov si,1Eh
F000:E87C C3 retn
sub_16 endp
F000:E87D 36 2A 1D 38 46 45 db 36h, 2Ah, 1Dh, 38h, 46h, 45h
F000:E883 3A 52 1B 1B db 3Ah, 52h, 1Bh, 1Bh
F000:E887 21 31 40 32 23 33 db '!1@2#3$'
F000:E88D 24
F000:E88E 34 25 35 5E 36 26 db '4%5^6&7*8(9)0_-+='
F000:E894 37 2A 38 28 39 29
F000:E89A 30 5F 2D 2B 3D
F000:E89F 08 08 00 db 8, 8, 0
F000:E8A2 09 51 71 57 77 45 db 9, 'QqWwEeRrTtYyUuIiOoPp{[}]', 0Dh
F000:E8A8 65 52 72 54 74 59
F000:E8AE 79 55 75 49 69 4F
bios.lst BIOS ROM Analysis Sourcer Listing v2.15 27-Nov-89 7:47 pm Page 39
F000:E8B4 6F 50 70 7B 5B 7D
F000:E8BA 5D 0D
F000:E8BC 0D db 0Dh
F000:E8BD FF FF db 0FFh, 0FFh
F000:E8BF 41 61 53 73 44 64 db 'AaSsDdFfGgHhJjKkLl:;"', 27h, '~`'
F000:E8C5 46 66 47 67 48 68
F000:E8CB 4A 6A 4B 6B 4C 6C
F000:E8D1 3A 3B 22 27 7E 60
F000:E8D7 FF FF db 0FFh, 0FFh
F000:E8D9 7C 5C 5A 7A 58 78 db '|\ZzXxCcVvBbNnMm<,>.?/'
F000:E8DF 43 63 56 76 42 62
F000:E8E5 4E 6E 4D 6D 3C 2C
F000:E8EB 3E 2E 3F 2F
F000:E8EF FF FF 00 2A 1B FF db 0FFh, 0FFh, 0, 2Ah, 1Bh, 0FFh
F000:E8F5 00 FF FF FF 1E FF db 0, 0FFh, 0FFh, 0FFh, 1Eh, 0FFh
F000:E8FB FF FF FF 1F FF 7F db 0FFh, 0FFh, 0FFh, 1Fh, 0FFh, 7Fh
F000:E901 FF 11 17 05 12 14 db 0FFh, 11h, 17h, 5, 12h, 14h
F000:E907 19 15 09 0F 10 1B db 19h, 15h, 9, 0Fh, 10h, 1Bh
F000:E90D 1D 0A FF 01 13 04 db 1Dh, 0Ah, 0FFh, 1, 13h, 4
F000:E913 06 07 08 0A 0B 0C db 6, 7, 8, 0Ah, 0Bh, 0Ch
F000:E919 FF FF FF FF 1C 1A db 0FFh, 0FFh, 0FFh, 0FFh, 1Ch, 1Ah
F000:E91F 18 03 16 02 0E 0D db 18h, 3, 16h, 2, 0Eh, 0Dh
F000:E925 07 db 7
F000:E926 loc_117: ; xref F000:E93C
F000:E926 08 09 or [bx+di],cl
F000:E928 FF 04 inc word ptr [si]
F000:E92A 05 FF06 add ax,0FF06h
F000:E92D 01 02 add [bp+si],ax
F000:E92F 03 00 add ax,[bx+si]
F000:E931 FF 77 84 push word ptr [bx-7Ch]
F000:E934 73 74 ;* jnc loc_126 ;*Jump if carry=0
F000:E934 73 74 db 73h, 74h
F000:E936 75 76 ;* jnz loc_127 ;*Jump if not zero
F000:E936 75 76 db 75h, 76h
F000:E938 FF B3 BE01 push word ptr [bp+di-41FFh]
F000:E93C 7D E8 jge loc_117 ; Jump if > or =
F000:E93E B9 0008 mov cx,8
F000:E941 locloop_118: ; xref F000:E949
F000:E941 2E: 3A 04 cmp al,cs:[si]
F000:E944 74 05 je loc_ret_119 ; Jump if equal
F000:E946 D0 E3 shl bl,1 ; Shift w/zeros fill
F000:E948 46 inc si
F000:E949 E2 F6 loop locloop_118 ; Loop if cx > 0
F000:E94B loc_ret_119: ; xref F000:E944
F000:E94B C3 retn
;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
; SUBROUTINE
;
; Called from: F000:EA8F, EBC0
;▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
sub_18 proc near
F000:E94C F8 clc ; Clear carry flag
bios.lst BIOS ROM Analysis Sourcer Listing v2.15 27-Nov-89 7:47 pm Page 40
F000:E94D 8A CA mov cl,dl
F000:E94F 0A C9 or cl,cl ; Zero ?
F000:E951 74 11 jz loc_ret_122 ; Jump if zero
F000:E953 22 CD and cl,ch
F000:E955 74 07 jz loc_120 ; Jump if zero
F000:E957 F6 C2 03 test dl,3
F000:E95A 75 08 jnz loc_ret_122 ; Jump if not zero
F000:E95C EB 05 jmp short loc_121 ; (E963)
F000:E95E loc_120: ; xref F000:E955
F000:E95E F6 C2 03 test dl,3
F000:E961 74 01 jz loc_ret_122 ; Jump if zero
F000:E963 loc_121: ; xref F000:E95C
F000:E963 F9 stc ; Set carry flag
F000:E964 loc_ret_122: ; xref F000:E951, E95A, E961
F000:E964 C3 retn
sub_18 endp
;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
; SUBROUTINE
;
; Called from: F000:EAAD, EADD, EAFB
;▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
sub_19 proc near
F000:E965 BB E885 mov bx,0E885h
F000:E968 32 ED xor ch,ch ; Zero register
F000:E96A 3C 0F cmp al,0Fh
F000:E96C 76 14 jbe loc_123 ; Jump if below or =
F000:E96E 3C 32 cmp al,32h ; '2'
F000:E970 77 10 ja loc_123 ; Jump if above
F000:E972 3C 1A cmp al,1Ah
F000:E974 72 0E jb loc_ret_124 ; Jump if below
F000:E976 3C 2C cmp al,2Ch ; ','
F000:E978 73 0A jae loc_ret_124 ; Jump if above or =
F000:E97A 3C 1E cmp al,1Eh
F000:E97C 72 04 jb loc_123 ; Jump if below
F000:E97E 3C 26 cmp al,26h ; '&'
F000:E980 76 02 jbe loc_ret_124 ; Jump if below or =
F000:E982 loc_123: ; xref F000:E96C, E970, E97C
F000:E982 FE C5 inc ch
F000:E984 loc_ret_124: ; xref F000:E974, E978, E980
F000:E984 C3 retn
sub_19 endp
F000:E985 00 00 db 0, 0
; ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ int 9 ▒▒▒▒▒▒▒
;
; KEYBOARD I/O (called by hardware 8259-1, IRQ 1)
;
; When any key is pressed on the keyboard, the hardware calls this
; interrupt to service the pressed key or key combination. The
; hardware provides the key pressed in a non-ASCII scan code format
bios.lst BIOS ROM Analysis Sourcer Listing v2.15 27-Nov-89 7:47 pm Page 41
; read at i/o port 60h. The servicer acknowledges receipt of the key
; by toggling bit 7 of port 61h. (Port 61h should be read first, then
; bit 7 ored on, output to port 61h, then anded off, and resent to
; port 61h).
;
; The read key is decoded to yield an ASCII character, special function
; key (such as F1) or a control function like Left Shift Key down.
; The converted ASCII character is placed into the next available
; position in the circular queue keybd_queue to keybd_q_end. It is
; put in the position indicated by keydb_q_tail when it will not
; cause the loss of earlier entered data. The value keybd_q_head
; points to the oldest key pressed in the buffer which has not been
; removed from the queue (the normal process uses int 16h to remove
; keys from the queue and return the key value to the int 16h caller).
;
; The 16 word queue holds up to 16 keys. If keybd_q_head equals the
; keybd_q_tail, the queue is empty. Valid keys in the queue comprise
; the upper byte scan code and the lower byte ASCII character. If the
; key pressed has no ASCII equivalent (i.e F1 to F12), the lower byte
; is zero.
;
; Toggle and shift keys are not placed in the buffer, but appear in 2
; status registers keybd_flags_1 and keybd_flags_2.
;
; Special key combinations will cause other events to occur:
; Ctrl-Alt_Del - Reset computer by jumping to power_on_reset
; Print screen - Call int_5_prn_scrn to print the current screen
; Ctrl-Break - Call int_1Bh control break key processor (DOS)
; Pause - Wait until an ASCII key is pressed, without
; placing the key in the queue
F000:E987 int_9_keyboard proc near ; xref F000:FF05
F000:E987 E8 1551 call sub_60 ; (FEDB)
F000:E98A 50 push ax
F000:E98B E4 60 in al,60h ; port 60h, keybd scan or sw1
F000:E98D 50 push ax
F000:E98E E4 61 in al,61h ; port 61h, 8255 port B, read
F000:E990 8A E0 mov ah,al
F000:E992 0C 80 or al,80h
F000:E994 E6 61 out 61h,al ; port 61h, 8255 B - spkr, etc
F000:E996 8A C4 mov al,ah
F000:E998 E6 61 out 61h,al ; port 61h, 8255 B - spkr, etc
; al = 0, disable parity
F000:E99A 58 pop ax
F000:E99B 3C FF cmp al,0FFh
F000:E99D 72 05 jb loc_125 ; Jump if below
F000:E99F B5 00 mov ch,0
F000:E9A1 E9 0087 jmp loc_131 ; (EA2B)
F000:E9A4 loc_125: ; xref F000:E99D
F000:E9A4 E8 0FD4 call sub_57 ; (F97B)
F000:E9A7 8A 16 0017 mov dl,keybd_flags_1 ; (0040:0017=0)
F000:E9AB 8A 36 0018 mov dh,keybd_flags_2 ; (0040:0018=0)
F000:E9AF FC cld ; Clear direction
F000:E9B0 A8 80 test al,80h
F000:E9B2 74 50 jz loc_129 ; Jump if zero
F000:E9B4 24 7F and al,7Fh
F000:E9B6 E8 FF80 ;* call sub_17 ;*(E939)
bios.lst BIOS ROM Analysis Sourcer Listing v2.15 27-Nov-89 7:47 pm Page 42
F000:E9B6 E8 80 FF db 0E8h, 80h, 0FFh
F000:E9B9 0A DB or bl,bl ; Zero ?
F000:E9BB 74 7C jz loc_133 ; Jump if zero
F000:E9BD F6 C3 0F test bl,0Fh
F000:E9C0 F6 D3 not bl
F000:E9C2 75 08 jnz loc_128 ; Jump if not zero
F000:E9C4 22 F3 and dh,bl
F000:E9C6 88 36 0018 mov keybd_flags_2,dh ; (0040:0018=0)
F000:E9CA EB 6D jmp short loc_133 ; (EA39)
F000:E9CC loc_128: ; xref F000:E9C2
F000:E9CC 22 D3 and dl,bl
F000:E9CE 88 16 0017 mov keybd_flags_1,dl ; (0040:0017=0)
F000:E9D2 3C 38 cmp al,38h ; '8'
F000:E9D4 75 63 jne loc_133 ; Jump if not equal
F000:E9D6 33 C0 xor ax,ax ; Zero register
F000:E9D8 A0 0019 mov al,keybd_alt_num ; (0040:0019=0)
F000:E9DB 0A C0 or al,al ; Zero ?
F000:E9DD 74 5A jz loc_133 ; Jump if zero
F000:E9DF C6 06 0019 00 mov keybd_alt_num,0 ; (0040:0019=0)
F000:E9E4 8A C8 mov cl,al
F000:E9E6 80 E1 DF and cl,0DFh
F000:E9E9 80 F9 40 cmp cl,40h ; '@'
F000:E9EC 76 2C jbe loc_130 ; Jump if below or =
F000:E9EE 80 F9 5B cmp cl,5Bh ; '['
F000:E9F1 73 27 jae loc_130 ; Jump if above or =
F000:E9F3 F6 C2 40 test dl,40h ; '@'
F000:E9F6 74 22 jz loc_130 ; Jump if zero
F000:E9F8 24 DF and al,0DFh
F000:E9FA F6 C2 03 test dl,3
F000:E9FD 74 1B jz loc_130 ; Jump if zero
F000:E9FF 34 20 xor al,20h ; ' '
F000:EA01 EB 17 jmp short loc_130 ; (EA1A)
F000:EA03 90 db 90h
F000:EA04 loc_129: ; xref F000:E9B2
F000:EA04 8A E0 mov ah,al
F000:EA06 E8 FF30 ;* call sub_17 ;*(E939)
F000:EA06 E8 30 FF db 0E8h, 30h, 0FFh
F000:EA09 0A DB or bl,bl ; Zero ?
F000:EA0B 74 4F jz loc_138 ; Jump if zero
F000:EA0D F6 C3 0F test bl,0Fh
F000:EA10 74 2F jz loc_135 ; Jump if zero
F000:EA12 0A D3 or dl,bl
F000:EA14 88 16 0017 mov keybd_flags_1,dl ; (0040:0017=0)
F000:EA18 EB 1F jmp short loc_133 ; (EA39)
F000:EA1A loc_130: ; xref F000:E9EC, E9F1, E9F6, E9FD
; EA01, EA86, EA99, EAAA
; EB0D, EBB8
F000:EA1A 8B 36 001C mov si,keybd_q_tail ; (0040:001C=38h)
F000:EA1E 8B FE mov di,si
F000:EA20 E8 FE4C call sub_16 ; (E86F)
F000:EA23 3B 36 001A cmp si,keybd_q_head ; (0040:001A=38h)
F000:EA27 75 0A jne loc_132 ; Jump if not equal
F000:EA29 B5 80 mov ch,80h
F000:EA2B loc_131: ; xref F000:E9A1
F000:EA2B BB 4401 mov bx,4401h
F000:EA2E E8 FB71 call sub_8 ; (E5A2)
F000:EA31 EB 06 jmp short loc_133 ; (EA39)
bios.lst BIOS ROM Analysis Sourcer Listing v2.15 27-Nov-89 7:47 pm Page 43
F000:EA33 loc_132: ; xref F000:EA27
F000:EA33 89 05 mov [di],ax
F000:EA35 89 36 001C mov keybd_q_tail,si ; (0040:001C=38h)
F000:EA39 loc_133: ; xref F000:E9BB, E9CA, E9D4, E9DD
; EA18, EA31, EA51, EA5A
; EA6E, EA82, EAA6, EAB6
; EB92, EBBB
F000:EA39 E8 0FE5 call sub_59 ; (FA21)
F000:EA3C loc_134: ; xref F000:EB19, EC0E
F000:EA3C 58 pop ax
F000:EA3D E8 05E8 call sub_32 ; (F028)
F000:EA40 CF iret ; Interrupt return
int_9_keyboard endp
F000:EA41 loc_135: ; xref F000:EA10
F000:EA41 F6 C2 04 test dl,4
F000:EA44 74 21 jz loc_139 ; Jump if zero
F000:EA46 loc_136: ; xref F000:EA8B
F000:EA46 F6 C6 08 test dh,8
F000:EA49 74 51 jz loc_142 ; Jump if zero
F000:EA4B E8 01E3 call sub_21 ; (EC31)
F000:EA4E F6 C3 20 test bl,20h ; ' '
F000:EA51 75 E6 jnz loc_133 ; Jump if not zero
F000:EA53 loc_137: ; xref F000:EA62
F000:EA53 80 E6 F7 and dh,0F7h
F000:EA56 88 36 0018 mov keybd_flags_2,dh ; (0040:0018=0)
F000:EA5A EB DD jmp short loc_133 ; (EA39)
F000:EA5C loc_138: ; xref F000:EA0B
F000:EA5C E8 01D2 call sub_21 ; (EC31)
F000:EA5F F6 C6 08 test dh,8
F000:EA62 75 EF jnz loc_137 ; Jump if not zero
F000:EA64 EB 36 jmp short loc_142 ; (EA9C)
F000:EA66 90 db 90h
F000:EA67 loc_139: ; xref F000:EA44
F000:EA67 F6 C3 80 test bl,80h
F000:EA6A 75 1C jnz loc_141 ; Jump if not zero
F000:EA6C loc_140: ; xref F000:EA92
F000:EA6C 84 F3 test dh,bl
F000:EA6E 75 C9 jnz loc_133 ; Jump if not zero
F000:EA70 E8 01BE call sub_21 ; (EC31)
F000:EA73 32 D3 xor dl,bl
F000:EA75 0A F3 or dh,bl
F000:EA77 88 16 0017 mov keybd_flags_1,dl ; (0040:0017=0)
F000:EA7B 88 36 0018 mov keybd_flags_2,dh ; (0040:0018=0)
F000:EA7F F6 C3 80 test bl,80h
F000:EA82 74 B5 jz loc_133 ; Jump if zero
F000:EA84 32 C0 xor al,al ; Zero register
F000:EA86 EB 92 jmp short loc_130 ; (EA1A)
F000:EA88 loc_141: ; xref F000:EA6A
F000:EA88 F6 C2 08 test dl,8
F000:EA8B 75 B9 jnz loc_136 ; Jump if not zero
F000:EA8D B5 20 mov ch,20h ; ' '
F000:EA8F E8 FEBA call sub_18 ; (E94C)
F000:EA92 73 D8 jnc loc_140 ; Jump if carry=0
F000:EA94 B0 30 mov al,30h ; '0'
F000:EA96 E8 0198 call sub_21 ; (EC31)
F000:EA99 E9 FF7E jmp loc_130 ; (EA1A)
bios.lst BIOS ROM Analysis Sourcer Listing v2.15 27-Nov-89 7:47 pm Page 44
F000:EA9C loc_142: ; xref F000:EA49, EA64
F000:EA9C 3C 3A cmp al,3Ah ; ':'
F000:EA9E 77 4D ja loc_146 ; Jump if above
F000:EAA0 3C 37 cmp al,37h ; '7'
F000:EAA2 76 14 jbe loc_144 ; Jump if below or =
F000:EAA4 3C 39 cmp al,39h ; '9'
F000:EAA6 75 91 jne loc_133 ; Jump if not equal
F000:EAA8 2C 19 sub al,19h
F000:EAAA E9 FF6D jmp loc_130 ; (EA1A)
F000:EAAD loc_143: ; xref F000:EAC5, EACA
F000:EAAD E8 FEB5 call sub_19 ; (E965)
F000:EAB0 32 C0 xor al,al ; Zero register
F000:EAB2 0A ED or ch,ch ; Zero ?
F000:EAB4 74 57 jz loc_150 ; Jump if zero
F000:EAB6 EB 81 jmp short loc_133 ; (EA39)
F000:EAB8 loc_144: ; xref F000:EAA2
F000:EAB8 F6 C2 08 test dl,8
F000:EABB 74 16 jz loc_145 ; Jump if zero
F000:EABD C6 06 0019 00 mov keybd_alt_num,0 ; (0040:0019=0)
F000:EAC2 80 FC 0D cmp ah,0Dh
F000:EAC5 77 E6 ja loc_143 ; Jump if above
F000:EAC7 80 FC 01 cmp ah,1
F000:EACA 76 E1 jbe loc_143 ; Jump if below or =
F000:EACC 32 C0 xor al,al ; Zero register
F000:EACE 80 C4 76 add ah,76h ; 'v'
F000:EAD1 EB 3A jmp short loc_150 ; (EB0D)
F000:EAD3 loc_145: ; xref F000:EABB
F000:EAD3 F6 C2 04 test dl,4
F000:EAD6 75 44 jnz loc_153 ; Jump if not zero
F000:EAD8 F6 C2 03 test dl,3
F000:EADB 75 16 jnz loc_147 ; Jump if not zero
F000:EADD E8 FE85 call sub_19 ; (E965)
F000:EAE0 0A ED or ch,ch ; Zero ?
F000:EAE2 75 26 jnz loc_149 ; Jump if not zero
F000:EAE4 F6 C2 40 test dl,40h ; '@'
F000:EAE7 75 21 jnz loc_149 ; Jump if not zero
F000:EAE9 FE C5 inc ch
F000:EAEB EB 1D jmp short loc_149 ; (EB0A)
F000:EAED loc_146: ; xref F000:EA9E
F000:EAED 3C 45 cmp al,45h ; 'E'
F000:EAEF 73 6C jae loc_161 ; Jump if above or =
F000:EAF1 EB 46 jmp short loc_157 ; (EB39)
F000:EAF3 loc_147: ; xref F000:EADB
F000:EAF3 3C 37 cmp al,37h ; '7'
F000:EAF5 74 1D je loc_152 ; Jump if equal
F000:EAF7 3C 0F cmp al,0Fh
F000:EAF9 74 15 je loc_151 ; Jump if equal
F000:EAFB E8 FE67 call sub_19 ; (E965)
F000:EAFE 0A ED or ch,ch ; Zero ?
F000:EB00 75 05 jnz loc_148 ; Jump if not zero
F000:EB02 F6 C2 40 test dl,40h ; '@'
F000:EB05 74 03 jz loc_149 ; Jump if zero
F000:EB07 loc_148: ; xref F000:EB00
F000:EB07 80 F5 01 xor ch,1
F000:EB0A loc_149: ; xref F000:EAE2, EAE7, EAEB, EB05
F000:EB0A E8 011B call sub_20 ; (EC28)
F000:EB0D loc_150: ; xref F000:EAB4, EAD1, EB12, EB37
bios.lst BIOS ROM Analysis Sourcer Listing v2.15 27-Nov-89 7:47 pm Page 45
; EB41, EB4B
F000:EB0D E9 FF0A jmp loc_130 ; (EA1A)
F000:EB10 loc_151: ; xref F000:EAF9
F000:EB10 32 C0 xor al,al ; Zero register
F000:EB12 EB F9 jmp short loc_150 ; (EB0D)
F000:EB14 loc_152: ; xref F000:EAF5
F000:EB14 E8 0F0A call sub_59 ; (FA21)
F000:EB17 CD 05 int 5 ; Print screen (status at 50:0h)
F000:EB19 E9 FF20 jmp loc_134 ; (EA3C)
F000:EB1C loc_153: ; xref F000:EAD6
F000:EB1C EB 04 jmp short loc_155 ; (EB22)
F000:EB1E 90 nop
F000:EB1F loc_154: ; xref F000:EB32
F000:EB1F EB 71 jmp short loc_164 ; (EB92)
F000:EB21 90 db 90h
F000:EB22 loc_155: ; xref F000:EB1C
F000:EB22 3C 32 cmp al,32h ; '2'
F000:EB24 77 0A ja loc_156 ; Jump if above
F000:EB26 FE C8 dec al
F000:EB28 BB E8F3 mov bx,0E8F3h
F000:EB2B 2E: D7 xlat cs:[bx] ; al=[al+[bx]] table
F000:EB2D E9 00AA jmp loc_174 ; (EBDA)
F000:EB30 loc_156: ; xref F000:EB24
F000:EB30 3C 37 cmp al,37h ; '7'
F000:EB32 75 EB jne loc_154 ; Jump if not equal
F000:EB34 05 3AC9 add ax,3AC9h
F000:EB37 EB D4 jmp short loc_150 ; (EB0D)
F000:EB39 loc_157: ; xref F000:EAF1
F000:EB39 32 C0 xor al,al ; Zero register
F000:EB3B A2 0019 mov keybd_alt_num,al ; (0040:0019=0)
F000:EB3E F6 C2 0F test dl,0Fh
F000:EB41 74 CA jz loc_150 ; Jump if zero
F000:EB43 F6 C2 08 test dl,8
F000:EB46 74 05 jz loc_158 ; Jump if zero
F000:EB48 80 C4 2D add ah,2Dh ; '-'
F000:EB4B EB C0 jmp short loc_150 ; (EB0D)
F000:EB4D loc_158: ; xref F000:EB46
F000:EB4D F6 C2 04 test dl,4
F000:EB50 74 05 jz loc_159 ; Jump if zero
F000:EB52 80 C4 23 add ah,23h ; '#'
F000:EB55 EB 03 jmp short loc_160 ; (EB5A)
F000:EB57 loc_159: ; xref F000:EB50
F000:EB57 80 C4 19 add ah,19h
F000:EB5A loc_160: ; xref F000:EB55
F000:EB5A EB 5C jmp short loc_169 ; (EBB8)
F000:EB5C 90 db 90h
F000:EB5D loc_161: ; xref F000:EAEF
F000:EB5D 2C 47 sub al,47h ; 'G'
F000:EB5F 3C 03 cmp al,3
F000:EB61 75 03 jne loc_162 ; Jump if not equal
F000:EB63 E9 0EC0 jmp loc_385 ; (FA26)
F000:EB66 loc_162: ; xref F000:EB61, FA54
F000:EB66 3C 0C cmp al,0Ch
F000:EB68 75 15 jne loc_163 ; Jump if not equal
F000:EB6A 8A EA mov ch,dl
F000:EB6C 80 E5 0C and ch,0Ch
F000:EB6F 80 ED 0C sub ch,0Ch
bios.lst BIOS ROM Analysis Sourcer Listing v2.15 27-Nov-89 7:47 pm Page 46
F000:EB72 75 0B jnz loc_163 ; Jump if not zero
F000:EB74 C7 06 0072 1234 mov warm_boot_flag,1234h ; (0040:0072=0)
F000:EB7A EA F000:E05B jmp far ptr system_reset ; (E05B)
F000:EB7F loc_163: ; xref F000:EB68, EB72
F000:EB7F F6 C2 08 test dl,8
F000:EB82 74 21 jz loc_167 ; Jump if zero
F000:EB84 BB E925 mov bx,0E925h
F000:EB87 2E: D7 xlat cs:[bx] ; al=[al+[bx]] table
F000:EB89 3C FF cmp al,0FFh
F000:EB8B 75 08 jne loc_165 ; Jump if not equal
F000:EB8D C6 06 0019 00 mov keybd_alt_num,0 ; (0040:0019=0)
F000:EB92 loc_164: ; xref F000:EB1F, EBA3, EBDC
F000:EB92 E9 FEA4 jmp loc_133 ; (EA39)
F000:EB95 loc_165: ; xref F000:EB8B
F000:EB95 8A C8 mov cl,al
F000:EB97 B4 0A mov ah,0Ah
F000:EB99 A0 0019 mov al,keybd_alt_num ; (0040:0019=0)
F000:EB9C F6 E4 mul ah ; ax = reg * al
F000:EB9E 02 C1 add al,cl
F000:EBA0 A2 0019 mov keybd_alt_num,al ; (0040:0019=0)
F000:EBA3 loc_166: ; xref F000:EC1B
F000:EBA3 EB ED jmp short loc_164 ; (EB92)
F000:EBA5 loc_167: ; xref F000:EB82
F000:EBA5 F6 C2 04 test dl,4
F000:EBA8 75 67 jnz loc_178 ; Jump if not zero
F000:EBAA 3C 03 cmp al,3
F000:EBAC 75 04 jne loc_168 ; Jump if not equal
F000:EBAE B0 2D mov al,2Dh ; '-'
F000:EBB0 EB 06 jmp short loc_169 ; (EBB8)
F000:EBB2 loc_168: ; xref F000:EBAC
F000:EBB2 3C 07 cmp al,7
F000:EBB4 75 08 jne loc_171 ; Jump if not equal
F000:EBB6 B0 2B mov al,2Bh ; '+'
F000:EBB8 loc_169: ; xref F000:EB5A, EBB0, EBCB, EBD3
; EBE1, EBE5, EBF8
F000:EBB8 E9 FE5F jmp loc_130 ; (EA1A)
F000:EBBB loc_170: ; xref F000:EBC7
F000:EBBB E9 FE7B jmp loc_133 ; (EA39)
F000:EBBE loc_171: ; xref F000:EBB4
F000:EBBE B5 20 mov ch,20h ; ' '
F000:EBC0 E8 FD89 call sub_18 ; (E94C)
F000:EBC3 72 08 jc loc_172 ; Jump if carry Set
F000:EBC5 3C 05 cmp al,5
F000:EBC7 74 F2 je loc_170 ; Jump if equal
F000:EBC9 32 C0 xor al,al ; Zero register
F000:EBCB EB EB jmp short loc_169 ; (EBB8)
F000:EBCD loc_172: ; xref F000:EBC3
F000:EBCD 3C 0C cmp al,0Ch
F000:EBCF 75 04 jne loc_173 ; Jump if not equal
F000:EBD1 B0 2E mov al,2Eh ; '.'
F000:EBD3 EB E3 jmp short loc_169 ; (EBB8)
F000:EBD5 loc_173: ; xref F000:EBCF
F000:EBD5 BB E925 mov bx,0E925h
F000:EBD8 2E: D7 xlat cs:[bx] ; al=[al+[bx]] table
F000:EBDA loc_174: ; xref F000:EB2D, EC26
F000:EBDA 0A C0 or al,al ; Zero ?
F000:EBDC 78 B4 js loc_164 ; Jump if sign=1
bios.lst BIOS ROM Analysis Sourcer Listing v2.15 27-Nov-89 7:47 pm Page 47
F000:EBDE F6 C2 04 test dl,4
F000:EBE1 75 D5 jnz loc_169 ; Jump if not zero
F000:EBE3 04 30 add al,30h ; '0'
F000:EBE5 EB D1 jmp short loc_169 ; (EBB8)
F000:EBE7 loc_175: ; xref F000:EC17
F000:EBE7 C6 06 0071 01 mov keybd_break,1 ; (0040:0071=0)
F000:EBEC CD 1B int 1Bh ; Keyboard break (cntrl-break)
F000:EBEE 33 C0 xor ax,ax ; Zero register
F000:EBF0 8B 36 001A mov si,keybd_q_head ; (0040:001A=38h)
F000:EBF4 89 36 001C mov keybd_q_tail,si ; (0040:001C=38h)
F000:EBF8 EB BE jmp short loc_169 ; (EBB8)
F000:EBFA loc_176: ; xref F000:EC13
F000:EBFA 80 C6 08 add dh,8
F000:EBFD 88 36 0018 mov keybd_flags_2,dh ; (0040:0018=0)
F000:EC01 E8 0E1D call sub_59 ; (FA21)
F000:EC04 E8 097D call sub_45 ; (F584)
F000:EC07 loc_177: ; xref F000:EC0C
F000:EC07 F6 06 0018 08 test keybd_flags_2,8 ; (0040:0018=0)
F000:EC0C 75 F9 jnz loc_177 ; Jump if not zero
F000:EC0E E9 FE2B jmp loc_134 ; (EA3C)
F000:EC11 loc_178: ; xref F000:EBA8
F000:EC11 3C FE cmp al,0FEh
F000:EC13 74 E5 je loc_176 ; Jump if equal
F000:EC15 3C FF cmp al,0FFh
F000:EC17 74 CE je loc_175 ; Jump if equal
F000:EC19 D0 E8 shr al,1 ; Shift w/zeros fill
F000:EC1B 72 86 jc loc_166 ; Jump if carry Set
F000:EC1D BB E932 mov bx,0E932h
F000:EC20 2E: D7 xlat cs:[bx] ; al=[al+[bx]] table
F000:EC22 8A E0 mov ah,al
F000:EC24 32 C0 xor al,al ; Zero register
F000:EC26 EB B2 jmp short loc_174 ; (EBDA)
;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
; SUBROUTINE
;
; Called from: F000:EB0A
;▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
sub_20 proc near
F000:EC28 FE C8 dec al
F000:EC2A D0 E0 shl al,1 ; Shift w/zeros fill
F000:EC2C 02 C5 add al,ch
F000:EC2E 2E: D7 xlat cs:[bx] ; al=[al+[bx]] table
F000:EC30 C3 retn
sub_20 endp
;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
; SUBROUTINE
;
; Called from: F000:EA4B, EA5C, EA70, EA96
;▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
sub_21 proc near
F000:EC31 F6 06 0018 01 test keybd_flags_2,1 ; (0040:0018=0)
F000:EC36 74 0B jz loc_ret_179 ; Jump if zero
bios.lst BIOS ROM Analysis Sourcer Listing v2.15 27-Nov-89 7:47 pm Page 48
F000:EC38 53 push bx
F000:EC39 51 push cx
F000:EC3A B5 10 mov ch,10h
F000:EC3C B3 01 mov bl,1
F000:EC3E E8 F961 call sub_8 ; (E5A2)
F000:EC41 59 pop cx
F000:EC42 5B pop bx
F000:EC43 loc_ret_179: ; xref F000:EC36
F000:EC43 C3 retn
sub_21 endp
F000:EC44 loc_180: ; xref F000:E479
F000:EC44 E4 61 in al,61h ; port 61h, 8255 port B, read
F000:EC46 0C 04 or al,4
F000:EC48 EB 00 jmp short loc_181 ; (EC4A)
F000:EC4A loc_181: ; xref F000:EC48
F000:EC4A E6 61 out 61h,al ; port 61h, 8255 B - spkr, etc
F000:EC4C E9 F40C jmp system_reset ; (E05B)
;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
; SUBROUTINE
;
; Called from: F000:E268, E281, E2B8, E3C3
;▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
sub_22 proc near
F000:EC4F E8 F3BA call sub_1 ; (E00C)
F000:EC52 E8 FACA call sub_13 ; (E71F)
F000:EC55 C3 retn
sub_22 endp
F000:EC56 00 00 00 db 0, 0, 0
; ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ int 13h ▒▒▒▒▒
;
; FLOPPY DISK SERVICES
;
; Note: Floppy disk services may be vectored to this routine from int 40h
; on newer systems with hard disk support inside the BIOS.
;
; Call with: ah = sub-function number
; dl = drive number (unless otherwise noted), drive a: = 0
;
; Returns: carry = 0 if function ok
; ah = status (unless otherwise noted)
; ah = 0 Function ok
; ah = 1 Invalid value passed or unsupported function
; ah = 2 Can not locate address mark
; ah = 3 Floppy write protected
; ah = 4 Sector not found
; ah = 6 Floppy changed line on (1.2 meg drives)
; ah = 8 DMA overrun occurred
; ah = 9 DMA attempted across 64K byte boundary
; ah = 0Ch Media type not found
; ah = 10h CRC read error
bios.lst BIOS ROM Analysis Sourcer Listing v2.15 27-Nov-89 7:47 pm Page 49
; ah = 20h Floppy controller failure
; ah = 40h Seek operation failed
; ah = 80h Floppy drive not ready
;
; Functions:
; ah = 0 Floppy disk controller reset
; ah = 1 Get last status
; ah = 2 Read sectors
; Call with: al = number of sectors to read
; ch/cl = starting track/starting sector
; dh = head number, head 0 = 0
; es:bx = ptr to buffer where to put data
; ah = 3 Write sectors
; Call with: al = number of sectors to write
; ch/cl = starting track/starting sector
; dh = head number, head 0 = 0
; es:bx = ptr to buffer where to get data
; Return: al = number of sectors written
; ah = 4 Verify sectors
; Call with: al = number of sectors to compare
; ch/cl = starting track/starting sector
; dh = head number, head 0 = 0
; es:bx = ptr to buffer where to compare data
; Return: al = number of sectors checked
; ah = 5 Format track
; Call with: al = number of sectors to format
; ch/cl = starting track/starting sector
; dh = head number, head 0 = 0
; es:bx = ptr to table of address fields
; ah = 8 Get drive information (not supported by all systems)
; Returns: ax/bh = 0 size dia. size dia.
; bl = drive type: 1=360K 5.25 3=720K 3.5
; 2=1.2M 5.25 4=1.4M 3.5
; cx bits 7&6, 15-8 = number of tracks, 0=1 track
; bits 5-0 = number of sectors per track
; dh/dl = # of heads/number of floppy drives
; es:di = ptr to floppy parameter table
; ah = 15h Get drive type (not supported by all systems)
; Returns: ah = 0 no drive
; ah = 1/2 floppy changed line not/is available
; ah = 16h Get changed floppy status (not supported by all systems)
; Returns: ah = 0 floppy in drive, carry = 0
; ah = 1 bad drive number, carry = 1
; ah = 6 floppy out of drive, carry = 1
; ah = 80h drive not ready, carry = 1
; ah = 17h Specify media type for a drive
; Call with: al = 1 use a 320/360K floppy in 360k drive
; al = 2 use a 360K floppy in a 1.2M drive
; al = 3 use a 1.2M floppy in a 1.2M drive
; al = 4 use a 720K disk in a 720K drive
; ah = 18h Prepare for format (not supported by all systems)
; Call with: cx bits 7&6, 15-8 = number of tracks, 0=1 track
; bits 5-0 = number of sectors per track
; Returns: es:di = ptr to floppy parameter table
F000:EC59 int_13h_floppy proc near ; xref F000:FF19
F000:EC59 FB sti ; Enable interrupts
bios.lst BIOS ROM Analysis Sourcer Listing v2.15 27-Nov-89 7:47 pm Page 50
F000:EC5A E8 127E call sub_60 ; (FEDB)
F000:EC5D BF 0040 mov di,seg seg_b
F000:EC60 8E DF mov ds,di
F000:EC62 52 push dx
F000:EC63 52 push dx
F000:EC64 51 push cx
F000:EC65 50 push ax
F000:EC66 8B EC mov bp,sp
F000:EC68 80 0E 003F C0 or dsk_motor_stat,0C0h ; (0040:003F=50h)
F000:EC6D 2A C0 sub al,al
F000:EC6F BA 03F2 mov dx,3F2h
F000:EC72 80 FC 00 cmp ah,0
F000:EC75 75 50 jne loc_184 ; Jump if not equal
F000:EC77 FA cli ; Disable interrupts
F000:EC78 02 06 003F add al,dsk_motor_stat ; (0040:003F=50h)
F000:EC7C 24 BF and al,0BFh
F000:EC7E D0 C0 rol al,1 ; Rotate
F000:EC80 D0 C0 rol al,1 ; Rotate
F000:EC82 D0 C0 rol al,1 ; Rotate
F000:EC84 D0 C0 rol al,1 ; Rotate
F000:EC86 EE out dx,al ; port 3F2h, dsk0 contrl output
F000:EC87 80 26 003E 00 and dsk_recal_stat,0 ; (0040:003E=3)
F000:EC8C 80 26 0041 00 and dsk_ret_code,0 ; (0040:0041=0)
F000:EC91 04 04 add al,4
F000:EC93 C6 46 07 02 mov byte ptr [bp+7],2
F000:EC97 EE out dx,al ; port 3F2h, dsk0 contrl output
F000:EC98 FB sti ; Enable interrupts
F000:EC99 E8 0214 call sub_25 ; (EEB0)
F000:EC9C 73 03 jnc loc_182 ; Jump if carry=0
F000:EC9E E9 0122 jmp loc_199 ; (EDC3)
F000:ECA1 loc_182: ; xref F000:EC9C
F000:ECA1 80 3E 0042 C0 cmp dsk_status_1,0C0h ; (0040:0042=0Ah)
F000:ECA6 75 17 jne loc_183 ; Jump if not equal
F000:ECA8 E8 025D call sub_28 ; (EF08)
F000:ECAB 26: 8A 45 01 mov al,es:[di+1]
F000:ECAF 50 push ax
F000:ECB0 26: 8A 05 mov al,es:[di]
F000:ECB3 50 push ax
F000:ECB4 B8 0003 mov ax,3
F000:ECB7 50 push ax
F000:ECB8 50 push ax
F000:ECB9 E8 0BA1 call sub_55 ; (F85D)
F000:ECBC E9 0104 jmp loc_199 ; (EDC3)
F000:ECBF loc_183: ; xref F000:ECA6
F000:ECBF 80 06 0041 20 add dsk_ret_code,20h ; (0040:0041=0) ' '
F000:ECC4 E9 00FC jmp loc_199 ; (EDC3)
F000:ECC7 loc_184: ; xref F000:EC75
F000:ECC7 80 FC 01 cmp ah,1
F000:ECCA 75 07 jne loc_185 ; Jump if not equal
F000:ECCC 02 06 0041 add al,dsk_ret_code ; (0040:0041=0)
F000:ECD0 E9 00F0 jmp loc_199 ; (EDC3)
F000:ECD3 loc_185: ; xref F000:ECCA
F000:ECD3 8A C4 mov al,ah
F000:ECD5 C6 46 01 46 mov byte ptr [bp+1],46h ; 'F'
F000:ECD9 B4 E6 mov ah,0E6h
F000:ECDB 80 26 0041 00 and dsk_ret_code,0 ; (0040:0041=0)
F000:ECE0 F6 46 04 FC test byte ptr [bp+4],0FCh
bios.lst BIOS ROM Analysis Sourcer Listing v2.15 27-Nov-89 7:47 pm Page 51
F000:ECE4 75 2D jnz loc_189 ; Jump if not zero
F000:ECE6 3C 02 cmp al,2
F000:ECE8 75 03 jne loc_186 ; Jump if not equal
F000:ECEA EB 2F jmp short loc_190 ; (ED1B)
F000:ECEC 90 db 90h
F000:ECED loc_186: ; xref F000:ECE8
F000:ECED 3C 04 cmp al,4
F000:ECEF 75 07 jne loc_187 ; Jump if not equal
F000:ECF1 80 6E 01 04 sub byte ptr [bp+1],4
F000:ECF5 EB 24 jmp short loc_190 ; (ED1B)
F000:ECF7 90 db 90h
F000:ECF8 loc_187: ; xref F000:ECEF
F000:ECF8 3C 03 cmp al,3
F000:ECFA 75 0A jne loc_188 ; Jump if not equal
F000:ECFC 80 46 01 04 add byte ptr [bp+1],4
F000:ED00 80 EC 21 sub ah,21h ; '!'
F000:ED03 EB 16 jmp short loc_190 ; (ED1B)
F000:ED05 90 db 90h
F000:ED06 loc_188: ; xref F000:ECFA
F000:ED06 3C 05 cmp al,5
F000:ED08 75 09 jne loc_189 ; Jump if not equal
F000:ED0A 80 46 01 04 add byte ptr [bp+1],4
F000:ED0E B4 4D mov ah,4Dh ; 'M'
F000:ED10 EB 09 jmp short loc_190 ; (ED1B)
F000:ED12 90 db 90h
F000:ED13 loc_189: ; xref F000:ECE4, ED08
F000:ED13 80 06 0041 01 add dsk_ret_code,1 ; (0040:0041=0)
F000:ED18 E9 00A8 jmp loc_199 ; (EDC3)
F000:ED1B loc_190: ; xref F000:ECEA, ECF5, ED03, ED10
F000:ED1B 50 push ax
F000:ED1C 80 26 0040 00 and dsk_motor_tmr,0 ; (0040:0040=8Bh)
F000:ED21 80 7E 04 00 cmp byte ptr [bp+4],0
F000:ED25 75 0A jne loc_191 ; Jump if not equal
F000:ED27 80 26 003F C1 and dsk_motor_stat,0C1h ; (0040:003F=50h)
F000:ED2C B0 01 mov al,1
F000:ED2E EB 28 jmp short loc_194 ; (ED58)
F000:ED30 90 db 90h
F000:ED31 loc_191: ; xref F000:ED25
F000:ED31 80 7E 04 01 cmp byte ptr [bp+4],1
F000:ED35 75 0A jne loc_192 ; Jump if not equal
F000:ED37 80 26 003F C2 and dsk_motor_stat,0C2h ; (0040:003F=50h)
F000:ED3C B0 12 mov al,12h
F000:ED3E EB 18 jmp short loc_194 ; (ED58)
F000:ED40 90 db 90h
F000:ED41 loc_192: ; xref F000:ED35
F000:ED41 80 7E 04 02 cmp byte ptr [bp+4],2
F000:ED45 75 0A jne loc_193 ; Jump if not equal
F000:ED47 80 26 003F C4 and dsk_motor_stat,0C4h ; (0040:003F=50h)
F000:ED4C B0 24 mov al,24h ; '$'
F000:ED4E EB 08 jmp short loc_194 ; (ED58)
F000:ED50 90 db 90h
F000:ED51 loc_193: ; xref F000:ED45
F000:ED51 80 26 003F C8 and dsk_motor_stat,0C8h ; (0040:003F=50h)
F000:ED56 B0 38 mov al,38h ; '8'
F000:ED58 loc_194: ; xref F000:ED2E, ED3E, ED4E
F000:ED58 FA cli ; Disable interrupts
F000:ED59 84 06 003F test al,dsk_motor_stat ; (0040:003F=50h)
bios.lst BIOS ROM Analysis Sourcer Listing v2.15 27-Nov-89 7:47 pm Page 52
F000:ED5D 9C pushf ; Push flags
F000:ED5E 08 06 003F or dsk_motor_stat,al ; (0040:003F=50h)
F000:ED62 A0 003F mov al,dsk_motor_stat ; (0040:003F=50h)
F000:ED65 D0 C0 rol al,1 ; Rotate
F000:ED67 D0 C0 rol al,1 ; Rotate
F000:ED69 D0 C0 rol al,1 ; Rotate
F000:ED6B D0 C0 rol al,1 ; Rotate
F000:ED6D EE out dx,al ; port 3F2h, dsk0 contrl output
F000:ED6E 9D popf ; Pop flags
F000:ED6F FB sti ; Enable interrupts
F000:ED70 75 3D jnz loc_197 ; Jump if not zero
F000:ED72 06 push es
F000:ED73 E8 0192 call sub_28 ; (EF08)
F000:ED76 26: 8A 65 0A mov ah,es:[di+0Ah]
F000:ED7A 07 pop es
F000:ED7B 22 E4 and ah,ah
F000:ED7D 74 30 jz loc_197 ; Jump if zero
F000:ED7F BE 25E4 mov si,25E4h
F000:ED82 loc_195: ; xref F000:ED8D
F000:ED82 4E dec si
F000:ED83 74 2A jz loc_197 ; Jump if zero
F000:ED85 E8 0176 call sub_27 ; (EEFE)
F000:ED88 80 7E 06 F9 cmp byte ptr [bp+6],0F9h
F000:ED8C F8 clc ; Clear carry flag
F000:ED8D 75 F3 jnz loc_195 ; Jump if not zero
F000:ED8F E8 0A45 call sub_54 ; (F7D7)
F000:ED92 72 29 jc loc_198 ; Jump if carry Set
F000:ED94 8A 56 04 mov dl,[bp+4]
F000:ED97 8A 6E 03 mov ch,[bp+3]
F000:ED9A E8 0AD9 call sub_56 ; (F876)
F000:ED9D 72 1E jc loc_198 ; Jump if carry Set
F000:ED9F loc_196: ; xref F000:EDAA
F000:ED9F 4E dec si
F000:EDA0 74 1B jz loc_198 ; Jump if zero
F000:EDA2 E8 0159 call sub_27 ; (EEFE)
F000:EDA5 80 7E 06 F4 cmp byte ptr [bp+6],0F4h
F000:EDA9 F8 clc ; Clear carry flag
F000:EDAA 75 F3 jnz loc_196 ; Jump if not zero
F000:EDAC EB 0F jmp short loc_198 ; (EDBD)
F000:EDAE 90 db 90h
F000:EDAF loc_197: ; xref F000:ED70, ED7D, ED83
F000:EDAF E8 0A25 call sub_54 ; (F7D7)
F000:EDB2 72 09 jc loc_198 ; Jump if carry Set
F000:EDB4 8A 56 04 mov dl,[bp+4]
F000:EDB7 8A 6E 03 mov ch,[bp+3]
F000:EDBA E8 0AB9 call sub_56 ; (F876)
F000:EDBD loc_198: ; xref F000:ED92, ED9D, EDA0, EDAC
; EDB2
F000:EDBD 58 pop ax
F000:EDBE 72 03 jc loc_199 ; Jump if carry Set
F000:EDC0 E8 0025 call sub_23 ; (EDE8)
F000:EDC3 loc_199: ; xref F000:EC9E, ECBC, ECC4, ECD0
; ED18, EDBE
F000:EDC3 E8 0142 call sub_28 ; (EF08)
F000:EDC6 26: 8A 65 02 mov ah,es:[di+2]
F000:EDCA 88 26 0040 mov dsk_motor_tmr,ah ; (0040:0040=72h)
F000:EDCE 80 66 07 00 and byte ptr [bp+7],0
bios.lst BIOS ROM Analysis Sourcer Listing v2.15 27-Nov-89 7:47 pm Page 53
F000:EDD2 2A E4 sub ah,ah
F000:EDD4 02 26 0041 add ah,dsk_ret_code ; (0040:0041=0)
F000:EDD8 F6 C4 FF test ah,0FFh
F000:EDDB 74 01 jz loc_200 ; Jump if zero
F000:EDDD F9 stc ; Set carry flag
F000:EDDE loc_200: ; xref F000:EDDB
F000:EDDE 5E pop si
F000:EDDF 5E pop si
F000:EDE0 5E pop si
F000:EDE1 5E pop si
F000:EDE2 E8 0243 call sub_32 ; (F028)
F000:EDE5 CA 0002 retf 2 ; Return far
int_13h_floppy endp
;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
; SUBROUTINE
;
; Called from: F000:EDC0
;▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
sub_23 proc near
F000:EDE8 C6 46 07 07 mov byte ptr [bp+7],7
F000:EDEC 8A C4 mov al,ah
F000:EDEE 8A 4E 04 mov cl,[bp+4]
F000:EDF1 80 E1 FB and cl,0FBh
F000:EDF4 F6 46 05 01 test byte ptr [bp+5],1
F000:EDF8 74 03 jz loc_201 ; Jump if zero
F000:EDFA 80 C9 04 or cl,4
F000:EDFD loc_201: ; xref F000:EDF8
F000:EDFD 80 EC 4D sub ah,4Dh ; 'M'
F000:EE00 E8 0105 call sub_28 ; (EF08)
F000:EE03 75 1D jnz loc_202 ; Jump if not zero
F000:EE05 26: 8A 5D 08 mov bl,es:[di+8]
F000:EE09 53 push bx
F000:EE0A 26: 8A 5D 07 mov bl,es:[di+7]
F000:EE0E 53 push bx
F000:EE0F 26: 8A 5D 04 mov bl,es:[di+4]
F000:EE13 53 push bx
F000:EE14 26: 8A 5D 03 mov bl,es:[di+3]
F000:EE18 53 push bx
F000:EE19 51 push cx
F000:EE1A 50 push ax
F000:EE1B B8 0006 mov ax,6
F000:EE1E 50 push ax
F000:EE1F EB 30 jmp short loc_203 ; (EE51)
F000:EE21 90 db 90h
F000:EE22 loc_202: ; xref F000:EE03
F000:EE22 8A 5E 02 mov bl,[bp+2]
F000:EE25 53 push bx
F000:EE26 8A 5E 05 mov bl,[bp+5]
F000:EE29 53 push bx
F000:EE2A 8A 5E 03 mov bl,[bp+3]
F000:EE2D 53 push bx
F000:EE2E 51 push cx
F000:EE2F 50 push ax
F000:EE30 BB 0005 mov bx,5
bios.lst BIOS ROM Analysis Sourcer Listing v2.15 27-Nov-89 7:47 pm Page 54
F000:EE33 53 push bx
F000:EE34 E8 0A26 call sub_55 ; (F85D)
F000:EE37 72 28 jc loc_204 ; Jump if carry Set
F000:EE39 26: 8A 5D 06 mov bl,es:[di+6]
F000:EE3D 53 push bx
F000:EE3E 26: 8A 5D 05 mov bl,es:[di+5]
F000:EE42 53 push bx
F000:EE43 26: 8A 5D 04 mov bl,es:[di+4]
F000:EE47 53 push bx
F000:EE48 26: 8A 5D 03 mov bl,es:[di+3]
F000:EE4C 53 push bx
F000:EE4D BB 0004 mov bx,4
F000:EE50 53 push bx
F000:EE51 loc_203: ; xref F000:EE1F
F000:EE51 E8 0A09 call sub_55 ; (F85D)
F000:EE54 72 0B jc loc_204 ; Jump if carry Set
F000:EE56 E8 0057 call sub_25 ; (EEB0)
F000:EE59 72 06 jc loc_204 ; Jump if carry Set
F000:EE5B E8 0007 call sub_24 ; (EE65)
F000:EE5E EB 04 jmp short loc_ret_205 ; (EE64)
F000:EE60 90 db 90h
F000:EE61 loc_204: ; xref F000:EE37, EE54, EE59
F000:EE61 E8 00B2 call sub_29 ; (EF16)
F000:EE64 loc_ret_205: ; xref F000:EE5E
F000:EE64 C3 retn
sub_23 endp
;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
; SUBROUTINE
;
; Called from: F000:EE5B
;▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
sub_24 proc near
F000:EE65 56 push si
F000:EE66 8A 26 0042 mov ah,dsk_status_1 ; (0040:0042=0Ah)
F000:EE6A F6 C4 C0 test ah,0C0h
F000:EE6D 75 03 jnz loc_206 ; Jump if not zero
F000:EE6F EB 25 jmp short loc_212 ; (EE96)
F000:EE71 90 db 90h
F000:EE72 loc_206: ; xref F000:EE6D
F000:EE72 80 E4 80 and ah,80h
F000:EE75 74 03 jz loc_207 ; Jump if zero
F000:EE77 EB 17 jmp short loc_210 ; (EE90)
F000:EE79 90 db 90h
F000:EE7A loc_207: ; xref F000:EE75
F000:EE7A A0 0043 mov al,dsk_status_2 ; (0040:0043=2)
F000:EE7D BE F020 mov si,0F020h
F000:EE80 B9 0008 mov cx,8
F000:EE83 locloop_208: ; xref F000:EE88
F000:EE83 D0 E0 shl al,1 ; Shift w/zeros fill
F000:EE85 72 03 jc loc_209 ; Jump if carry Set
F000:EE87 46 inc si
F000:EE88 E2 F9 loop locloop_208 ; Loop if cx > 0
bios.lst BIOS ROM Analysis Sourcer Listing v2.15 27-Nov-89 7:47 pm Page 55
F000:EE8A loc_209: ; xref F000:EE85
F000:EE8A 2E: 8A 24 mov ah,cs:[si]
F000:EE8D EB 03 jmp short loc_211 ; (EE92)
F000:EE8F 90 db 90h
F000:EE90 loc_210: ; xref F000:EE77
F000:EE90 B4 20 mov ah,20h ; ' '
F000:EE92 loc_211: ; xref F000:EE8D
F000:EE92 00 26 0041 add dsk_ret_code,ah ; (0040:0041=0)
F000:EE96 loc_212: ; xref F000:EE6F
F000:EE96 E8 006F call sub_28 ; (EF08)
F000:EE99 26: 8A 45 04 mov al,es:[di+4]
F000:EE9D 04 01 add al,1
F000:EE9F BE 0047 mov si,47h
F000:EEA2 8A 64 FE mov ah,[si-2]
F000:EEA5 3A 66 03 cmp ah,[bp+3]
F000:EEA8 75 01 jne loc_213 ; Jump if not equal
F000:EEAA AC lodsb ; String [si] to al
F000:EEAB loc_213: ; xref F000:EEA8
F000:EEAB 2A 46 02 sub al,[bp+2]
F000:EEAE 5E pop si
F000:EEAF C3 retn
sub_24 endp
;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
; SUBROUTINE
;
; Called from: F000:EC99, EE56, F8B2, F8D5
;▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
sub_25 proc near
F000:EEB0 B8 FFFF mov ax,0FFFFh
F000:EEB3 loc_214: ; xref F000:EEBF
F000:EEB3 90 nop
F000:EEB4 90 nop
F000:EEB5 F6 06 003E 80 test dsk_recal_stat,80h ; (0040:003E=3)
F000:EEBA 75 11 jnz loc_216 ; Jump if not zero
F000:EEBC 2D 0001 sub ax,1
F000:EEBF 75 F2 jnz loc_214 ; Jump if not zero
F000:EEC1 80 06 0041 80 add dsk_ret_code,80h ; (0040:0041=0)
F000:EEC6 80 26 003E 7F and dsk_recal_stat,7Fh ; (0040:003E=3)
F000:EECB F9 stc ; Set carry flag
F000:EECC loc_ret_215: ; xref F000:EED5
F000:EECC C3 retn
F000:EECD loc_216: ; xref F000:EEBA
F000:EECD 80 26 003E 7F and dsk_recal_stat,7Fh ; (0040:003E=3)
F000:EED2 E8 0096 call sub_31 ; (EF6B)
F000:EED5 EB F5 jmp short loc_ret_215 ; (EECC)
sub_25 endp
;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
; SUBROUTINE
;
; Called from: F000:EF9A, F861
bios.lst BIOS ROM Analysis Sourcer Listing v2.15 27-Nov-89 7:47 pm Page 56
;▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
sub_26 proc near
F000:EED7 53 push bx
F000:EED8 BA 03F4 mov dx,3F4h
F000:EEDB BB 0000 mov bx,0
F000:EEDE loc_217: ; xref F000:EEE8
F000:EEDE EC in al,dx ; port 3F4h, dsk0 cntrlr status
F000:EEDF 24 C0 and al,0C0h
F000:EEE1 3A C4 cmp al,ah
F000:EEE3 74 17 je loc_220 ; Jump if equal
F000:EEE5 83 EB 01 sub bx,1
F000:EEE8 75 F4 jnz loc_217 ; Jump if not zero
F000:EEEA A8 80 test al,80h
F000:EEEC 74 08 jz loc_218 ; Jump if zero
F000:EEEE 80 06 0041 20 add dsk_ret_code,20h ; (0040:0041=0) ' '
F000:EEF3 EB 06 jmp short loc_219 ; (EEFB)
F000:EEF5 90 db 90h
F000:EEF6 loc_218: ; xref F000:EEEC
F000:EEF6 80 06 0041 80 add dsk_ret_code,80h ; (0040:0041=0)
F000:EEFB loc_219: ; xref F000:EEF3
F000:EEFB F9 stc ; Set carry flag
F000:EEFC loc_220: ; xref F000:EEE3
F000:EEFC 5B pop bx
F000:EEFD C3 retn
sub_26 endp
;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
; SUBROUTINE
;
; Called from: F000:ED85, EDA2
;▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
sub_27 proc near
F000:EEFE 53 push bx
F000:EEFF 8A 1E 0040 mov bl,dsk_motor_tmr ; (0040:0040=3Fh)
F000:EF03 88 5E 06 mov [bp+6],bl
F000:EF06 5B pop bx
F000:EF07 C3 retn
sub_27 endp
;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
; SUBROUTINE
;
; Called from: F000:ECA8, ED73, EDC3, EE00, EE96, F804, F8EC
;▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
sub_28 proc near
F000:EF08 1E push ds
F000:EF09 52 push dx
F000:EF0A BA 0000 mov dx,0
F000:EF0D 8E DA mov ds,dx
F000:EF0F C4 3E 0078 les di,dword ptr ds:disk_parm_off ; (0000:0078=522h) Load 32 bit ptr
F000:EF13 5A pop dx
F000:EF14 1F pop ds
bios.lst BIOS ROM Analysis Sourcer Listing v2.15 27-Nov-89 7:47 pm Page 57
F000:EF15 C3 retn
sub_28 endp
;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
; SUBROUTINE
;
; Called from: F000:EE61, F907
;▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
sub_29 proc near
F000:EF16 B9 0200 mov cx,200h
F000:EF19 locloop_221: ; xref F000:EF25
F000:EF19 BA 03F5 mov dx,3F5h
F000:EF1C EC in al,dx ; port 3F5h, dsk0 controlr data
F000:EF1D 4A dec dx
F000:EF1E EC in al,dx ; port 3F4h, dsk0 cntrlr status
F000:EF1F 24 C0 and al,0C0h
F000:EF21 3C 80 cmp al,80h
F000:EF23 74 02 je loc_222 ; Jump if equal
F000:EF25 E2 F2 loop locloop_221 ; Loop if cx > 0
F000:EF27 loc_222: ; xref F000:EF23
F000:EF27 F9 stc ; Set carry flag
F000:EF28 C3 retn
sub_29 endp
F000:EF29 loc_223: ; xref F000:EF9D, EFBC, EFBF
F000:EF29 58 pop ax
F000:EF2A 5A pop dx
F000:EF2B 59 pop cx
F000:EF2C 5B pop bx
F000:EF2D 8A 66 06 mov ah,[bp+6]
F000:EF30 1F pop ds
F000:EF31 C3 retn
;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
; SUBROUTINE
;
; Called from: F000:E226
;▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
sub_30 proc near
F000:EF32 1E push ds
F000:EF33 33 C0 xor ax,ax ; Zero register
F000:EF35 8E D8 mov ds,ax
F000:EF37 BB 0040 mov bx,seg seg_b
F000:EF3A C7 07 FF53 mov word ptr [bx],0FF53h
F000:EF3E 0E push cs
F000:EF3F 58 pop ax
F000:EF40 89 47 02 mov [bx+2],ax
F000:EF43 1F pop ds
F000:EF44 C3 retn
sub_30 endp
F000:EF45 0012[00] db 18 dup (0)
bios.lst BIOS ROM Analysis Sourcer Listing v2.15 27-Nov-89 7:47 pm Page 58
; ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ int 0Eh ▒▒▒▒▒
;
; FLOPPY DISK CONTROLLER (called by hardware 8259-1, IRQ 6)
F000:EF57 int_0Eh_floppy proc near ; xref F000:FF0F
F000:EF57 FB sti ; Enable interrupts
F000:EF58 50 push ax
F000:EF59 1E push ds
F000:EF5A B8 0040 mov ax,seg_b
F000:EF5D 8E D8 mov ds,ax
F000:EF5F 80 0E 003E 80 or dsk_recal_stat,80h ; (0040:003E=3)
F000:EF64 B0 20 mov al,20h ; ' '
F000:EF66 E6 20 out 20h,al ; port 20h, 8259-1 int command
; al = 20h, end of interrupt
F000:EF68 1F pop ds
F000:EF69 58 pop ax
F000:EF6A CF iret ; Interrupt return
int_0Eh_floppy endp
;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
; SUBROUTINE
;
; Called from: F000:EED2
;▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
sub_31 proc near
F000:EF6B 1E push ds
F000:EF6C 53 push bx
F000:EF6D 51 push cx
F000:EF6E BB 0040 mov bx,seg seg_b
F000:EF71 8E DB mov ds,bx
F000:EF73 52 push dx
F000:EF74 88 66 06 mov [bp+6],ah
F000:EF77 50 push ax
F000:EF78 F6 46 07 FF test byte ptr [bp+7],0FFh
F000:EF7C 74 41 jz loc_227 ; Jump if zero
F000:EF7E 80 7E 07 02 cmp byte ptr [bp+7],2
F000:EF82 75 0B jne loc_224 ; Jump if not equal
F000:EF84 BB 0008 mov bx,8
F000:EF87 53 push bx
F000:EF88 BB 0001 mov bx,1
F000:EF8B 53 push bx
F000:EF8C E8 08CE call sub_55 ; (F85D)
F000:EF8F loc_224: ; xref F000:EF82
F000:EF8F FC cld ; Clear direction
F000:EF90 BB 0042 mov bx,42h
F000:EF93 B5 00 mov ch,0
F000:EF95 8A 4E 07 mov cl,[bp+7]
F000:EF98 locloop_225: ; xref F000:EFA8
F000:EF98 B4 C0 mov ah,0C0h
F000:EF9A E8 FF3A call sub_26 ; (EED7)
F000:EF9D 72 8A jc loc_223 ; Jump if carry Set
F000:EF9F BA 03F5 mov dx,3F5h
bios.lst BIOS ROM Analysis Sourcer Listing v2.15 27-Nov-89 7:47 pm Page 59
F000:EFA2 EC in al,dx ; port 3F5h, dsk0 controlr data
F000:EFA3 88 07 mov [bx],al
F000:EFA5 83 C3 01 add bx,1
F000:EFA8 E2 EE loop locloop_225 ; Loop if cx > 0
F000:EFAA B9 0020 mov cx,20h
F000:EFAD BA 03F4 mov dx,3F4h
F000:EFB0 locloop_226: ; xref F000:EFB5
F000:EFB0 EC in al,dx ; port 3F4h, dsk0 cntrlr status
F000:EFB1 24 10 and al,10h
F000:EFB3 74 0A jz loc_227 ; Jump if zero
F000:EFB5 E2 F9 loop locloop_226 ; Loop if cx > 0
F000:EFB7 80 06 0041 20 add dsk_ret_code,20h ; (0040:0041=0) ' '
F000:EFBC E9 FF6A jmp loc_223 ; (EF29)
F000:EFBF loc_227: ; xref F000:EF7C, EFB3
F000:EFBF E9 FF67 jmp loc_223 ; (EF29)
sub_31 endp
F000:EFC2 00 00 00 00 00 db 0, 0, 0, 0, 0
; █▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀█
; █ Floppy Disk Parameters █
; █▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄█
F000:EFC7 DF dsk_info_1 db 0DFh ; hi nibble = stepping rate in ms
; lo nibble = head unload time, ms
; xref F000:FF2F
F000:EFC8 02 dsk_info_2 db 2 ; 2nd info byte bit 0 = 0 for DMA
F000:EFC9 24 dsk_motor_delay db 24h ; Delay after use for motor off
F000:EFCA 02 dsk_sectr_bytes db 2 ; Bytes per sector 0 = 128 bytes
; 1 = 256 bytes
; 2 = 512 bytes
; 3 = 1024 bytes
F000:EFCB 08 dsk_sector_trac db 8 ; Number of sectors per track
F000:EFCC 2A dsk_head_gap db 2Ah ; Gap Length
F000:EFCD FF dsk_data_length db 0FFh ; Data Length
F000:EFCE 50 dsk_format_gap db 50h ; Format Gap Length
F000:EFCF F6 dsk_format_byte db 0F6h ; Format write byte
F000:EFD0 0F dsk_settlg_time db 0Fh ; Head load time, in milliseconds
F000:EFD1 03 dsk_startup_tim db 3 ; Motor startup wait time * .125ms
F000:EFD2 EA 0B F9 00 F0 db 0EAh, 0Bh, 0F9h, 0, 0F0h
F000:EFD7 0D 0A 0A 2A 20 42 db 0Dh, 0Ah, 0Ah, '* Boot record not'
F000:EFDD 6F 6F 74 20 72 65
F000:EFE3 63 6F 72 64 20 6E
F000:EFE9 6F 74
F000:EFEB 20 66 6F 75 6E 64 db ' found *', 0Dh, 0Ah, '* Strike a'
F000:EFF1 20 2A 0D 0A 2A 20
F000:EFF7 53 74 72 69 6B 65
F000:EFFD 20 61
F000:EFFF 6E 79 20 6B 65 79 db 'ny key to reboot - '
F000:F005 20 74 6F 20 72 65
F000:F00B 62 6F 6F 74 20 2D
F000:F011 20
F000:F012 07 00 db 7, 0
F000:F014 52 41 4D 20 54 45 db 'RAM TEST ..'
bios.lst BIOS ROM Analysis Sourcer Listing v2.15 27-Nov-89 7:47 pm Page 60
F000:F01A 53 54 20 2E 2E
F000:F01F 00 04 00 10 08 00 db 0, 4, 0, 10h, 8, 0
F000:F025 04 03 02 db 4, 3, 2
;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
; SUBROUTINE
;
; Called from: F000:E7F8, E849, E851, EA3D, EDE2, F483, F5FF
; F771, F7A0
;▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
sub_32 proc near
F000:F028 5E pop si
F000:F029 8B FC mov di,sp
F000:F02B 36: 89 75 10 mov ss:[di+10h],si
F000:F02F 07 pop es
F000:F030 1F pop ds
F000:F031 5D pop bp
F000:F032 5E pop si
F000:F033 5F pop di
F000:F034 5A pop dx
F000:F035 59 pop cx
F000:F036 5B pop bx
F000:F037 C3 retn
sub_32 endp
;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
; SUBROUTINE
;
; Called from: F000:F457, F5E4, F5EB
;▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
sub_33 proc near
F000:F038 50 push ax
F000:F039 8A E3 mov ah,bl
F000:F03B EF out dx,ax ; port 3B4h, MDA/EGA reg index
; al = 0, horiz char total
F000:F03C 58 pop ax
F000:F03D C3 retn
sub_33 endp
F000:F03E 0007[00] db 7 dup (0)
F000:F045 B2 F3 C6 F5 05 F6 db 0B2h, 0F3h, 0C6h, 0F5h, 5, 0F6h
F000:F04B F0 F5 C8 F6 A7 F5 db 0F0h, 0F5h, 0C8h, 0F6h, 0A7h, 0F5h
F000:F051 FE F4 09 F5 2A F6 db 0FEh, 0F4h, 9, 0F5h, 2Ah, 0F6h
F000:F057 D4 F2 DE F2 75 F7 db 0D4h, 0F2h, 0DEh, 0F2h, 75h, 0F7h
F000:F05D 54 F6 51 F6 87 F4 db 54h, 0F6h, 51h, 0F6h, 87h, 0F4h
F000:F063 A0 F7 db 0A0h, 0F7h
; ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ int 10h ▒▒▒▒▒
;
; VIDEO DISPLAY SERVICES
;
; Called with: ah = primary function number
;
bios.lst BIOS ROM Analysis Sourcer Listing v2.15 27-Nov-89 7:47 pm Page 61
; Returns: (unless otherwise indicated)
; ax - altered (some systems may not alter ax)
;
; Functions:
; ah = 0 Set video display mode in al.
; ah = 1 Set cursor size
; Call with: ch = top line, 0-32
; cl = bottom line, 0-32
; ah = 2 Set cursor location
; Call with: bh = page number, 0 = 1st page
; dh = row (0 for top row)
; dl = column (0 for leftmost)
; ah = 3 Get cursor location
; Call with: bh = page number, 0 = 1st page
; Returns: ch/cl = cursor size (top & bottom)
; dh/dl = row and column of cursor
; ah = 4 Get light pen location
; Returns: ah = 0 not on/unsupported & bx,cx,dx changed
; 1 status valid
; bx = pixel column
; cx = horizontal line number
; dh/dl = row and column
; ah = 5 Set Page number al, 0 = 1st page
; ah = 6 Up scroll screen
; Call with: al = # bottom lines to clear, set 0 for all
; bh = attribute to fill cleared lines
; ch/cl = row/column of top left scroll corner
; dh/dl = row/column of bottom right scroll corner
; ah = 7 Down scroll screen
; Call with: al = # top lines to clear, set 0 for all
; bh = attribute to fill cleared lines
; ch/cl = row/column of top left scroll corner
; dh/dl = row/column of bottom right scroll corner
; ah = 8 Get character & attribute at cursor
; Call with: bh = page number, 0 = 1st page
; Returns: ah/al = attribute/character
; ah = 9 Write character & attribute at cursor (graphics modes)
; Call with: al = character
; bh = page number, 0 = 1st page
; bl = attribute, bit 7 = 1 to xor with old color
; cx = Number of same characters to write
; ah = 0Ah Write character at cursor (graphics modes)
; Call with: al = character
; bh = page number, 0 = 1st page
; cx = Number of same characters to write
; ah = 0Bh Set colors (typically in low res modes)
; Call with: bh = 0, bl = color low res background, border
; bh = 1, bl = 0/1 for low res color group 0/1
; ah = 0Ch Write graphics dot
; Call with: al = color, bit 7 = 1 to xor bit with old color
; cx/dx = pixel row/pixel column
; ah = 0Dh Read graphics dot
; Call with: cx/dx = pixel row/pixel column
; ah = 0Eh Write in ASCII mode (cr, lf, bell, and bs as operators)
; Call with: al/bl = character/color
; ah = 0Fh Get video info
; Returns: ah = columns active
bios.lst BIOS ROM Analysis Sourcer Listing v2.15 27-Nov-89 7:47 pm Page 62
; al = active video mode
; bh = active page, 0 = 1st page
; ah = 10h Colors (EGA/VGA) Called with al = subfunction
; al = 1 bl = color register (0-15) bh = color to set
; al = 2 es:dx = ptr to change all 16 colors & overscan #
; al = 3 bl = color high bit as: 0-intensity, 1-blink
; For VGA equipped systems only
; al = 7 bl = color register to get in bh
; al = 8 bh = returned overscan value
; al = 9 es:dx = ptr where to put all 16 colors & overscan
; al = 10h bx = color register to set; ch/cl/dl = grn/blu/red
; al = 12h es:dx = ptr to change color registers
; bx = 1st register to set, cx = # of registers
; al = 13h bl = 0, set color page mode in bh
; bl = 1, set page; bh = page number
; al = 15h bx = color reg to read; ch/cl/dl = grn/blu/red
; al = 17h es:dx = ptr where to load color regs
; bx = 1st register to get, cx = # of registers
; al = 1Ah get color page info; bl = mode; bh = page #
; ah = 11h Reset mode with new character set (leave memory as-is)
; al = 0 Character set load
; es:bp = ptr to table of chars
; bl/bh = which block/bytes per char
; cx/dx = # of characters/where to start in block
; al = 1 bl = block to load the mono character set
; al = 2 bl = block to load the double wide character set
; al = 3 bl = block select related to attribute
; al = 4 bl = block to load the 8 by 16 set (VGA)
; al = 10h - 14h same as 0 - 4, must occur after setting mode
; al = 20h es:bp = ptr to table of char, using int 1Fh ptr
; al = 21h es:bp = ptr to table of char, using int 43h ptr
; bl = 0-dl=# rows; 1-14 rows; 2-25 rows; 3-43 rows
; cx = number of bytes per character in table
; al = 22h use 8 by 14 char set, bl=rows (see al=21h)
; al = 23h use double wide char set, bl=rows (see al=21h)
; al = 24h use 8 by 16 char set, bl=rows (see al=21h)
; Get table pointer and info
; al = 30h es:bp = ptr returned; cx=bytes per char; dl=rows
; bh = 0, get int 1Fh bh = 4, get double wide
; bh = 1, get int 43h bh = 5, get mono 9 by 14
; bh = 2, get 8 by 14 bh = 6, get 8 by 16 (VGA)
; bh = 3, get double wide bh = 7, get 9 by 16 (VGA)
; ah = 12h Miscellaneous functions, bl = sub-function
; bl = 10h Get info, bh = 0-now color, 1-now mono
; ch/cl = info bits/switches
; bl = 20h Set print screen to work with EGA/VGA
; Functions for VGA only (bl = 30-34h return al = 12h)
; bl = 30h Set # of scan lines, 0-200, 1-350, 2-400
; activates after mode change
; bl = 31h ax = 0/1 allow/prevent palette load with new mode
; bl = 32h al = 0/1 video off/on
; bl = 33h al = 0/1 gray scale summing off/on
; bl = 34h al = 0/1 scale cursor size to font off/on
; bl = 35h switch between adapter and motherboard video
; al = 0, adapter off, es:dx = save state area
; al = 1, motherboard on
; al = 2, active video off, es:dx = save area
bios.lst BIOS ROM Analysis Sourcer Listing v2.15 27-Nov-89 7:47 pm Page 63
; al = 3, inactive video on, es:dx = save area
; bl = 36h al = 0/1 screen off/on
; ah = 13h Write character string (cr, lf, bell, and bs as operators)
; Call with: al = 0/1 write characters, cursor not/is moved
; bl = attribute of all characters
; = 2/3 write characters, cursor not/is moved
; string alternates character & attribute
; bh = page number, 0 = 1st page
; cx = number of characters
; dh/dl = row and column to start
; es:bp = ptr to character string
; ah = 14h LCD display support, al = sub-function
; al = 0, es:di = ptr to font table to load
; bl/bh = which block/bytes per char
; cx/dx = # of characters/where to start in block
; al = 1, bl = block # of ROM font to load
; al = 2, bl = how to support high intensity
; ah = 15h LCD info table ptr returned in es:di
; ax = 0 there is no alternate adapter
; ax = 5140h LCD is the alternate
; ax = 5153h CGA is alternate
; ax = 5151h MDA is alternate
;
; **** VGA SUPPORT ONLY ****
; ah = 1Ah Get/Set types of displays which are operating
; al = 0, get displays, returns al = 1Ah
; bl = in use display code
; bh = alternate display code
; al = 1, set codes, returns al = 1Ah
; bl = in use display code
; bh = alternate display code
; codes: 0 = no display
; 1 = mono display
; 2 = CGA
; 4 = EGA, color
; 5 = EGA, mono
; 6 = PGA
; 7 = VGA, mono (PS/2 MCA only)
; 8 = VGA, color (PS/2 MCA only)
; Bh = VGA, mono (PS/2 non MCA)
; Ch = VGA, color (PS/2 non MCA)
; FFh = display type not known
; ah = 1Bh Get video system information
; call with: bx = 0
; es:di = ptr to buffer where to put info
; ah = 1Ch Video system save & restore, al = sub-function
; call with: al = 0, get buffer size
; = 1, save system, buffer at es:bx
; = 2, restore system, buffer at es:bx
; cx bit 0 = 1 for hardware registers
; bit 1 = 1 for software states
; bit 2 = 1 for colors & DAC registers
F000:F065 int_10h_video proc near ; xref F000:FF13
F000:F065 80 FC 0F cmp ah,0Fh
F000:F068 76 01 jbe loc_228 ; Jump if below or =
F000:F06A CF iret ; Interrupt return
bios.lst BIOS ROM Analysis Sourcer Listing v2.15 27-Nov-89 7:47 pm Page 64
int_10h_video endp
F000:F06B loc_228: ; xref F000:F068
F000:F06B E8 0E6D call sub_60 ; (FEDB)
F000:F06E 8B F8 mov di,ax
F000:F070 BE F045 mov si,0F045h
F000:F073 E8 0905 call sub_57 ; (F97B)
F000:F076 51 push cx
F000:F077 8B 0E 0010 mov cx,equip_bits ; (0040:0010=526Fh)
F000:F07B 80 E1 30 and cl,30h ; '0'
F000:F07E 80 F9 30 cmp cl,30h ; '0'
F000:F081 B9 B800 mov cx,0B800h
F000:F084 75 03 jnz loc_229 ; Jump if not zero
F000:F086 80 ED 08 sub ch,8
F000:F089 loc_229: ; xref F000:F084
F000:F089 51 push cx
F000:F08A 07 pop es
F000:F08B B1 07 mov cl,7
F000:F08D D3 E8 shr ax,cl ; Shift w/zeros fill
F000:F08F 25 01FE and ax,1FEh
F000:F092 8B E8 mov bp,ax
F000:F094 8B C7 mov ax,di
F000:F096 59 pop cx
F000:F097 FC cld ; Clear direction
F000:F098 2E: FF 22 jmp word ptr cs:[bp+si] ;*16 entries
;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
; SUBROUTINE
;
; Called from: F000:F2F4, F63B, F779
;▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
sub_34 proc near
F000:F09B 8B 16 0063 mov dx,@video_port ; (0040:0063=3D4h)
F000:F09F 80 C2 06 add dl,6
F000:F0A2 C3 retn
sub_34 endp
F000:F0A3 00 db 0
; █▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀█
; █ Video Hardware Registers █
; █▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄█
F000:F0A4 38 28 2D 0A 1F 06 video_hdwr_tbl1 db 38h, 28h, 2Dh, 0Ah, 1Fh, 6 ; mode CGA 40 columns x 25 lines
; xref F000:FF2D
F000:F0AA 19 1C 02 07 06 07 db 19h, 1Ch, 2, 7, 6, 7
F000:F0B0 00 00 00 00 db 0, 0, 0, 0
F000:F0B4 71 50 5A 0A 1F 06 video_hdrw_tbl2 db 71h, 50h, 5Ah, 0Ah, 1Fh, 6 ; mode CGA 80 columns x 25 lines
F000:F0BA 19 1C 02 07 06 07 db 19h, 1Ch, 2, 7, 6, 7
F000:F0C0 00 00 00 00 db 0, 0, 0, 0
F000:F0C4 38 28 2D 0A 7F 06 video_hdwr_tbl3 db 38h, 28h, 2Dh, 0Ah, 7Fh, 6 ; mode CGA graphics
F000:F0CA 64 70 02 01 06 07 db 64h, 70h, 2, 1, 6, 7
F000:F0D0 00 00 00 00 db 0, 0, 0, 0
F000:F0D4 61 50 52 0F 19 06 video_hdwr_tbl4 db 61h, 50h, 52h, 0Fh, 19h, 6 ; mode MDA 80 columns x 25 lines
F000:F0DA 19 19 02 0D 0B 0C db 19h, 19h, 2, 0Dh, 0Bh, 0Ch
F000:F0E0 00 00 00 00 db 0, 0, 0, 0
bios.lst BIOS ROM Analysis Sourcer Listing v2.15 27-Nov-89 7:47 pm Page 65
F000:F0E4 2C 28 2D 29 2A 2E video_hdwr_mode db 2Ch, 28h, 2Dh, 29h, 2Ah, 2Eh ; Video hardware modes (0-7)
F000:F0EA 1E 29 db 1Eh, 29h
F000:F0EC loc_230: ; xref F000:F525
F000:F0EC 33 ED xor bp,bp ; Zero register
F000:F0EE 8B F5 mov si,bp
F000:F0F0 9D popf ; Pop flags
F000:F0F1 9C pushf ; Push flags
F000:F0F2 72 04 jc loc_231 ; Jump if carry Set
F000:F0F4 45 inc bp
F000:F0F5 BE 00F0 mov si,0F0h
F000:F0F8 loc_231: ; xref F000:F0F2
F000:F0F8 80 3E 0049 06 cmp video_mode,6 ; (0040:0049=3)
F000:F0FD 74 04 je loc_232 ; Jump if equal
F000:F0FF 02 D2 add dl,dl
F000:F101 03 FD add di,bp
F000:F103 loc_232: ; xref F000:F0FD
F000:F103 03 FE add di,si
F000:F105 BD 0050 mov bp,seg seg_c
F000:F108 9D popf ; Pop flags
F000:F109 72 02 jc loc_233 ; Jump if carry Set
F000:F10B F7 DD neg bp
F000:F10D loc_233: ; xref F000:F109
F000:F10D 06 push es
F000:F10E 1F pop ds
F000:F10F 32 ED xor ch,ch ; Zero register
F000:F111 58 pop ax
F000:F112 86 FB xchg bh,bl
F000:F114 53 push bx
F000:F115 02 C0 add al,al
F000:F117 02 C0 add al,al
F000:F119 50 push ax
F000:F11A 8B DD mov bx,bp
F000:F11C F6 EB imul bl ; ax = reg * al
F000:F11E 57 push di
F000:F11F 5E pop si
F000:F120 03 F0 add si,ax
F000:F122 58 pop ax
F000:F123 02 F6 add dh,dh
F000:F125 02 F6 add dh,dh
F000:F127 A8 FF test al,0FFh
F000:F129 74 10 jz loc_235 ; Jump if zero
F000:F12B 2A F0 sub dh,al
F000:F12D 86 C6 xchg al,dh
F000:F12F 74 0A jz loc_235 ; Jump if zero
F000:F131 loc_234: ; xref F000:F139
F000:F131 F9 stc ; Set carry flag
F000:F132 E8 024B call sub_43 ; (F380)
F000:F135 03 F5 add si,bp
F000:F137 FE C8 dec al
F000:F139 7F F6 jg loc_234 ; Jump if >
F000:F13B loc_235: ; xref F000:F129, F12F
F000:F13B 58 pop ax
F000:F13C loc_236: ; xref F000:F142
F000:F13C F8 clc ; Clear carry flag
F000:F13D E8 0240 call sub_43 ; (F380)
F000:F140 FE CE dec dh
F000:F142 7F F8 jg loc_236 ; Jump if >
bios.lst BIOS ROM Analysis Sourcer Listing v2.15 27-Nov-89 7:47 pm Page 66
F000:F144 E9 033C jmp loc_296 ; (F483)
F000:F147 loc_237: ; xref F000:F2EA
F000:F147 56 push si
F000:F148 8A EB mov ch,bl
F000:F14A 8B D8 mov bx,ax
F000:F14C 80 FB 80 cmp bl,80h
F000:F14F 73 07 jae loc_238 ; Jump if above or =
F000:F151 BE FA6E mov si,0FA6Eh
F000:F154 8C CD mov bp,cs
F000:F156 EB 10 jmp short loc_239 ; (F168)
F000:F158 loc_238: ; xref F000:F14F
F000:F158 80 E3 7F and bl,7Fh
F000:F15B 33 D2 xor dx,dx ; Zero register
F000:F15D 52 push dx
F000:F15E 1F pop ds
F000:F15F C5 36 007C lds si,dword ptr ds:graph_tbl_off ; (0000:007C=2A00h) Load 32 bit ptr
F000:F163 8C DD mov bp,ds
F000:F165 E8 0813 call sub_57 ; (F97B)
F000:F168 loc_239: ; xref F000:F156
F000:F168 32 E4 xor ah,ah ; Zero register
F000:F16A A1 0050 mov ax,vid_curs_pos0 ; (0040:0050=184Fh)
F000:F16D E8 01B1 call sub_40 ; (F321)
F000:F170 B1 03 mov cl,3
F000:F172 32 FF xor bh,bh ; Zero register
F000:F174 D3 E3 shl bx,cl ; Shift w/zeros fill
F000:F176 8B F8 mov di,ax
F000:F178 03 F3 add si,bx
F000:F17A 80 3E 0049 06 cmp video_mode,6 ; (0040:0049=3)
F000:F17F 8E DD mov ds,bp
F000:F181 BD 2000 mov bp,2000h
F000:F184 8A DD mov bl,ch
F000:F186 B9 0004 mov cx,4
F000:F189 8B D7 mov dx,di
F000:F18B 74 3A jz locloop_244 ; Jump if zero
F000:F18D 8A EB mov ch,bl
F000:F18F 33 C0 xor ax,ax ; Zero register
F000:F191 D0 EB shr bl,1 ; Shift w/zeros fill
F000:F193 73 03 jnc loc_240 ; Jump if carry=0
F000:F195 0D 5555 or ax,5555h
F000:F198 loc_240: ; xref F000:F193
F000:F198 D0 EB shr bl,1 ; Shift w/zeros fill
F000:F19A 73 03 jnc loc_241 ; Jump if carry=0
F000:F19C 0D AAAA or ax,0AAAAh
F000:F19F loc_241: ; xref F000:F19A
F000:F19F 8B D8 mov bx,ax
F000:F1A1 loc_242: ; xref F000:F1B2, F1C5
F000:F1A1 E8 005F call sub_38 ; (F203)
F000:F1A4 03 FD add di,bp
F000:F1A6 46 inc si
F000:F1A7 E8 0059 call sub_38 ; (F203)
F000:F1AA 2B FD sub di,bp
F000:F1AC 4E dec si
F000:F1AD E8 0048 call sub_36 ; (F1F8)
F000:F1B0 FE C9 dec cl
F000:F1B2 75 ED jnz loc_242 ; Jump if not zero
F000:F1B4 59 pop cx
F000:F1B5 49 dec cx
bios.lst BIOS ROM Analysis Sourcer Listing v2.15 27-Nov-89 7:47 pm Page 67
F000:F1B6 77 03 ja loc_243 ; Jump if above
F000:F1B8 E9 02C8 jmp loc_296 ; (F483)
F000:F1BB loc_243: ; xref F000:F1B6
F000:F1BB E8 0034 call sub_35 ; (F1F2)
F000:F1BE 47 inc di
F000:F1BF E8 003D call sub_37 ; (F1FF)
F000:F1C2 51 push cx
F000:F1C3 B1 04 mov cl,4
F000:F1C5 EB DA jmp short loc_242 ; (F1A1)
F000:F1C7 locloop_244: ; xref F000:F18B, F1DD, F1F0
F000:F1C7 8B 04 mov ax,[si]
F000:F1C9 80 FB 00 cmp bl,0
F000:F1CC 7D 06 jge loc_245 ; Jump if > or =
F000:F1CE 26: 32 05 xor al,es:[di]
F000:F1D1 26: 32 23 xor ah,es:[bp+di]
F000:F1D4 loc_245: ; xref F000:F1CC
F000:F1D4 26: 88 05 mov es:[di],al
F000:F1D7 26: 88 23 mov es:[bp+di],ah
F000:F1DA E8 001B call sub_36 ; (F1F8)
F000:F1DD E2 E8 loop locloop_244 ; Loop if cx > 0
F000:F1DF 59 pop cx
F000:F1E0 49 dec cx
F000:F1E1 77 03 ja loc_246 ; Jump if above
F000:F1E3 E9 029D jmp loc_296 ; (F483)
F000:F1E6 loc_246: ; xref F000:F1E1
F000:F1E6 51 push cx
F000:F1E7 B9 0004 mov cx,4
F000:F1EA E8 0005 call sub_35 ; (F1F2)
F000:F1ED E8 000F call sub_37 ; (F1FF)
F000:F1F0 EB D5 jmp short locloop_244 ; (F1C7)
;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
; SUBROUTINE
;
; Called from: F000:F1BB, F1EA
;▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
sub_35 proc near
F000:F1F2 83 EE 08 sub si,8
F000:F1F5 8B FA mov di,dx
F000:F1F7 C3 retn
sub_35 endp
;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
; SUBROUTINE
;
; Called from: F000:F1AD, F1DA, F266
;▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
sub_36 proc near
F000:F1F8 83 C6 02 add si,2
F000:F1FB 83 C7 50 add di,50h
F000:F1FE C3 retn
sub_36 endp
bios.lst BIOS ROM Analysis Sourcer Listing v2.15 27-Nov-89 7:47 pm Page 68
;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
; SUBROUTINE
;
; Called from: F000:F1BF, F1ED
;▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
sub_37 proc near
F000:F1FF 47 inc di
F000:F200 8B D7 mov dx,di
F000:F202 C3 retn
sub_37 endp
;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
; SUBROUTINE
;
; Called from: F000:F1A1, F1A7
;▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
sub_38 proc near
F000:F203 55 push bp
F000:F204 53 push bx
F000:F205 8A 04 mov al,[si]
F000:F207 BB 0003 mov bx,3
F000:F20A 33 ED xor bp,bp ; Zero register
F000:F20C loc_247: ; xref F000:F21A
F000:F20C A8 FF test al,0FFh
F000:F20E 74 0C jz loc_249 ; Jump if zero
F000:F210 D0 E8 shr al,1 ; Shift w/zeros fill
F000:F212 73 02 jnc loc_248 ; Jump if carry=0
F000:F214 0B EB or bp,bx
F000:F216 loc_248: ; xref F000:F212
F000:F216 D1 E3 shl bx,1 ; Shift w/zeros fill
F000:F218 D1 E3 shl bx,1 ; Shift w/zeros fill
F000:F21A EB F0 jmp short loc_247 ; (F20C)
F000:F21C loc_249: ; xref F000:F20E
F000:F21C 8B C5 mov ax,bp
F000:F21E 5B pop bx
F000:F21F 5D pop bp
F000:F220 23 C3 and ax,bx
F000:F222 86 E0 xchg ah,al
F000:F224 80 FD 00 cmp ch,0
F000:F227 7D 03 jge loc_250 ; Jump if > or =
F000:F229 26: 33 05 xor ax,es:[di]
F000:F22C loc_250: ; xref F000:F227
F000:F22C 26: 89 05 mov es:[di],ax
F000:F22F C3 retn
sub_38 endp
F000:F230 loc_251: ; xref F000:F62F
F000:F230 A1 0050 mov ax,vid_curs_pos0 ; (0040:0050=184Fh)
F000:F233 E8 00EB call sub_40 ; (F321)
F000:F236 8C C2 mov dx,es
F000:F238 83 EC 08 sub sp,8
F000:F23B 8B F4 mov si,sp
bios.lst BIOS ROM Analysis Sourcer Listing v2.15 27-Nov-89 7:47 pm Page 69
F000:F23D B9 0004 mov cx,4
F000:F240 BD 2000 mov bp,2000h
F000:F243 80 3E 0049 06 cmp video_mode,6 ; (0040:0049=3)
F000:F248 8E DA mov ds,dx
F000:F24A 8B F8 mov di,ax
F000:F24C 74 10 jz locloop_253 ; Jump if zero
F000:F24E locloop_252: ; xref F000:F259
F000:F24E 33 ED xor bp,bp ; Zero register
F000:F250 E8 005B call sub_39 ; (F2AE)
F000:F253 E8 0058 call sub_39 ; (F2AE)
F000:F256 83 C7 50 add di,50h
F000:F259 E2 F3 loop locloop_252 ; Loop if cx > 0
F000:F25B EB 0E jmp short loc_254 ; (F26B)
F000:F25D 90 db 90h
F000:F25E locloop_253: ; xref F000:F24C, F269
F000:F25E 8A 05 mov al,[di]
F000:F260 3E: 8A 23 mov ah,ds:[bp+di]
F000:F263 36: 89 04 mov ss:[si],ax
F000:F266 E8 FF8F call sub_36 ; (F1F8)
F000:F269 E2 F3 loop locloop_253 ; Loop if cx > 0
F000:F26B loc_254: ; xref F000:F25B
F000:F26B 0E push cs
F000:F26C 1F pop ds
F000:F26D BF FA6E mov di,0FA6Eh
F000:F270 83 EF 08 sub di,8
F000:F273 B0 00 mov al,0
F000:F275 8B F4 mov si,sp
F000:F277 loc_255: ; xref F000:F296, F29A, F2A8
F000:F277 83 C7 08 add di,8
F000:F27A 33 DB xor bx,bx ; Zero register
F000:F27C B4 08 mov ah,8
F000:F27E loc_256: ; xref F000:F288
F000:F27E 36: 8A 10 mov dl,ss:[bx+si]
F000:F281 3A 11 cmp dl,[bx+di]
F000:F283 75 0B jne loc_258 ; Jump if not equal
F000:F285 43 inc bx
F000:F286 FE CC dec ah
F000:F288 75 F4 jnz loc_256 ; Jump if not zero
F000:F28A loc_257: ; xref F000:F294, F2AC
F000:F28A 83 C4 08 add sp,8
F000:F28D E9 01F3 jmp loc_296 ; (F483)
F000:F290 loc_258: ; xref F000:F283
F000:F290 FE C0 inc al
F000:F292 3C 00 cmp al,0
F000:F294 74 F4 je loc_257 ; Jump if equal
F000:F296 7F DF jg loc_255 ; Jump if >
F000:F298 A8 7F test al,7Fh
F000:F29A 75 DB jnz loc_255 ; Jump if not zero
F000:F29C 33 FF xor di,di ; Zero register
F000:F29E 8E DF mov ds,di
F000:F2A0 C5 3E 007C lds di,dword ptr ds:graph_tbl_off ; (0000:007C=2A00h) Load 32 bit ptr
F000:F2A4 8C DA mov dx,ds
F000:F2A6 0B D7 or dx,di
bios.lst BIOS ROM Analysis Sourcer Listing v2.15 27-Nov-89 7:47 pm Page 70
F000:F2A8 75 CD jnz loc_255 ; Jump if not zero
F000:F2AA 32 C0 xor al,al ; Zero register
F000:F2AC EB DC jmp short loc_257 ; (F28A)
;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
; SUBROUTINE
;
; Called from: F000:F250, F253
;▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
sub_39 proc near
F000:F2AE 3E: 8B 03 mov ax,ds:[bp+di]
F000:F2B1 86 C4 xchg al,ah
F000:F2B3 32 D2 xor dl,dl ; Zero register
F000:F2B5 B3 01 mov bl,1
F000:F2B7 loc_259: ; xref F000:F2CA
F000:F2B7 A9 FFFF test ax,0FFFFh
F000:F2BA 74 10 jz loc_262 ; Jump if zero
F000:F2BC D1 E8 shr ax,1 ; Shift w/zeros fill
F000:F2BE 73 02 jnc loc_260 ; Jump if carry=0
F000:F2C0 0A D3 or dl,bl
F000:F2C2 loc_260: ; xref F000:F2BE
F000:F2C2 D1 E8 shr ax,1 ; Shift w/zeros fill
F000:F2C4 73 02 jnc loc_261 ; Jump if carry=0
F000:F2C6 0A D3 or dl,bl
F000:F2C8 loc_261: ; xref F000:F2C4
F000:F2C8 D0 E3 shl bl,1 ; Shift w/zeros fill
F000:F2CA EB EB jmp short loc_259 ; (F2B7)
F000:F2CC loc_262: ; xref F000:F2BA
F000:F2CC 36: 88 14 mov ss:[si],dl
F000:F2CF 46 inc si
F000:F2D0 BD 2000 mov bp,2000h
F000:F2D3 C3 retn
sub_39 endp
;───── Indexed Entry Point ────────────────────────────────────────────────
F000:F2D4 loc_263: ; xref F000:F099
F000:F2D4 E3 48 jcxz loc_273 ; Jump if cx=0
F000:F2D6 8A E3 mov ah,bl
F000:F2D8 51 push cx
F000:F2D9 B9 0101 mov cx,101h
F000:F2DC EB 06 jmp short loc_265 ; (F2E4)
;───── Indexed Entry Point ────────────────────────────────────────────────
F000:F2DE loc_264: ; xref F000:F099
F000:F2DE E3 3E jcxz loc_273 ; Jump if cx=0
F000:F2E0 51 push cx
F000:F2E1 B9 0001 mov cx,1
F000:F2E4 loc_265: ; xref F000:F2DC
F000:F2E4 5E pop si
F000:F2E5 E8 04DB call sub_53 ; (F7C3)
F000:F2E8 75 03 jnz loc_266 ; Jump if not zero
F000:F2EA E9 FE5A jmp loc_237 ; (F147)
F000:F2ED loc_266: ; xref F000:F2E8
bios.lst BIOS ROM Analysis Sourcer Listing v2.15 27-Nov-89 7:47 pm Page 71
F000:F2ED E8 005E call sub_41 ; (F34E)
F000:F2F0 8B FB mov di,bx
F000:F2F2 8A D8 mov bl,al
F000:F2F4 E8 FDA4 call sub_34 ; (F09B)
F000:F2F7 loc_267: ; xref F000:F31C
F000:F2F7 22 E9 and ch,cl
F000:F2F9 74 10 jz loc_270 ; Jump if zero
F000:F2FB loc_268: ; xref F000:F2FE
F000:F2FB EC in al,dx ; port 0, DMA-1 bas&add ch 0
F000:F2FC 22 C1 and al,cl
F000:F2FE 75 FB jnz loc_268 ; Jump if not zero
F000:F300 FA cli ; Disable interrupts
F000:F301 loc_269: ; xref F000:F304
F000:F301 EC in al,dx ; port 0, DMA-1 bas&add ch 0
F000:F302 22 C1 and al,cl
F000:F304 74 FB jz loc_269 ; Jump if zero
F000:F306 8A C3 mov al,bl
F000:F308 AB stosw ; Store ax to es:[di]
F000:F309 EB 0F jmp short loc_272 ; (F31A)
F000:F30B loc_270: ; xref F000:F2F9, F30E
F000:F30B EC in al,dx ; port 0, DMA-1 bas&add ch 0
F000:F30C 22 C1 and al,cl
F000:F30E 75 FB jnz loc_270 ; Jump if not zero
F000:F310 FA cli ; Disable interrupts
F000:F311 loc_271: ; xref F000:F314
F000:F311 EC in al,dx ; port 0, DMA-1 bas&add ch 0
F000:F312 22 C1 and al,cl
F000:F314 74 FB jz loc_271 ; Jump if zero
F000:F316 8A C3 mov al,bl
F000:F318 AA stosb ; Store al to es:[di]
F000:F319 47 inc di
F000:F31A loc_272: ; xref F000:F309
F000:F31A FB sti ; Enable interrupts
F000:F31B 4E dec si
F000:F31C 7F D9 jg loc_267 ; Jump if >
F000:F31E loc_273: ; xref F000:F2D4, F2DE
F000:F31E E9 0162 jmp loc_296 ; (F483)
;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
; SUBROUTINE
;
; Called from: F000:F16D, F233, F354, F51B, F5D4
;▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
sub_40 proc near
F000:F321 51 push cx
F000:F322 8B 0E 004E mov cx,video_segment ; (0040:004E=0)
F000:F326 E8 049A call sub_53 ; (F7C3)
F000:F329 75 0F jnz loc_275 ; Jump if not zero
F000:F32B D0 E4 shl ah,1 ; Shift w/zeros fill
F000:F32D 80 3E 0049 06 cmp video_mode,6 ; (0040:0049=3)
F000:F332 75 04 jne loc_274 ; Jump if not equal
F000:F334 D0 E4 shl ah,1 ; Shift w/zeros fill
F000:F336 EB 0A jmp short loc_276 ; (F342)
F000:F338 loc_274: ; xref F000:F332
F000:F338 D0 E4 shl ah,1 ; Shift w/zeros fill
F000:F33A loc_275: ; xref F000:F329
bios.lst BIOS ROM Analysis Sourcer Listing v2.15 27-Nov-89 7:47 pm Page 72
F000:F33A D0 E4 shl ah,1 ; Shift w/zeros fill
F000:F33C D0 E0 shl al,1 ; Shift w/zeros fill
F000:F33E 73 02 jnc loc_276 ; Jump if carry=0
F000:F340 FE C5 inc ch
F000:F342 loc_276: ; xref F000:F336, F33E
F000:F342 8A C8 mov cl,al
F000:F344 86 E0 xchg ah,al
F000:F346 F6 26 004A mul byte ptr video_columns ; (0040:004A=50h) ax = data * al
F000:F34A 03 C1 add ax,cx
F000:F34C 59 pop cx
F000:F34D C3 retn
sub_40 endp
;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
; SUBROUTINE
;
; Called from: F000:F2ED, F638
;▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
sub_41 proc near
F000:F34E 50 push ax
F000:F34F E8 02CA call sub_50 ; (F61C)
F000:F352 8B 05 mov ax,[di]
F000:F354 E8 FFCA call sub_40 ; (F321)
F000:F357 3A 3E 0062 cmp bh,video_page ; (0040:0062=0)
F000:F35B 75 04 jne loc_277 ; Jump if not equal
F000:F35D 33 DB xor bx,bx ; Zero register
F000:F35F EB 07 jmp short loc_278 ; (F368)
F000:F361 loc_277: ; xref F000:F35B
F000:F361 2B 06 004E sub ax,video_segment ; (0040:004E=0)
F000:F365 E8 0004 call sub_42 ; (F36C)
F000:F368 loc_278: ; xref F000:F35F
F000:F368 03 D8 add bx,ax
F000:F36A 58 pop ax
F000:F36B C3 retn
sub_41 endp
;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
; SUBROUTINE
;
; Called from: F000:F365, F5B0
;▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
sub_42 proc near
F000:F36C 51 push cx
F000:F36D 33 C9 xor cx,cx ; Zero register
F000:F36F 80 FF 00 cmp bh,0
F000:F372 74 08 je loc_280 ; Jump if equal
F000:F374 loc_279: ; xref F000:F37A
F000:F374 03 0E 004C add cx,video_buf_siz ; (0040:004C=10A0h)
F000:F378 FE CF dec bh
F000:F37A 75 F8 jnz loc_279 ; Jump if not zero
F000:F37C loc_280: ; xref F000:F372
F000:F37C 8B D9 mov bx,cx
F000:F37E 59 pop cx
bios.lst BIOS ROM Analysis Sourcer Listing v2.15 27-Nov-89 7:47 pm Page 73
F000:F37F C3 retn
sub_42 endp
;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
; SUBROUTINE
;
; Called from: F000:F132, F13D
;▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
sub_43 proc near
F000:F380 8A CA mov cl,dl
F000:F382 53 push bx
F000:F383 55 push bp
F000:F384 BB 2000 mov bx,2000h
F000:F387 8B EF mov bp,di
F000:F389 72 0D jc loc_282 ; Jump if carry Set
F000:F38B loc_281: ; xref F000:F396
F000:F38B F3/ AA rep stosb ; Rep when cx >0 Store al to es:[di]
F000:F38D 72 1C jc loc_285 ; Jump if carry Set
F000:F38F 8B FD mov di,bp
F000:F391 03 FB add di,bx
F000:F393 8A CA mov cl,dl
F000:F395 F9 stc ; Set carry flag
F000:F396 EB F3 jmp short loc_281 ; (F38B)
F000:F398 loc_282: ; xref F000:F389
F000:F398 56 push si
F000:F399 56 push si
F000:F39A loc_283: ; xref F000:F3A8
F000:F39A F3/ A4 rep movsb ; Rep when cx >0 Mov [si] to es:[di]
F000:F39C 73 0C jnc loc_284 ; Jump if carry=0
F000:F39E 5E pop si
F000:F39F 8B FD mov di,bp
F000:F3A1 03 FB add di,bx
F000:F3A3 03 F3 add si,bx
F000:F3A5 8A CA mov cl,dl
F000:F3A7 F8 clc ; Clear carry flag
F000:F3A8 EB F0 jmp short loc_283 ; (F39A)
F000:F3AA loc_284: ; xref F000:F39C
F000:F3AA 5E pop si
F000:F3AB loc_285: ; xref F000:F38D
F000:F3AB 8B FD mov di,bp
F000:F3AD 5D pop bp
F000:F3AE 5B pop bx
F000:F3AF 03 FD add di,bp
F000:F3B1 C3 retn
sub_43 endp
;───── Indexed Entry Point ────────────────────────────────────────────────
F000:F3B2 loc_286: ; xref F000:F099
F000:F3B2 BF 0067 mov di,67h
F000:F3B5 B9 001E mov cx,1Eh
F000:F3B8 locloop_287: ; xref F000:F3BC
F000:F3B8 4F dec di
bios.lst BIOS ROM Analysis Sourcer Listing v2.15 27-Nov-89 7:47 pm Page 74
F000:F3B9 C6 05 00 mov byte ptr [di],0
F000:F3BC E2 FA loop locloop_287 ; Loop if cx > 0
F000:F3BE C7 45 17 0607 mov word ptr [di+17h],607h
F000:F3C3 8B 16 0010 mov dx,equip_bits ; (0040:0010=526Fh)
F000:F3C7 80 E2 30 and dl,30h ; '0'
F000:F3CA 80 FA 30 cmp dl,30h ; '0'
F000:F3CD BA 03D4 mov dx,3D4h
F000:F3D0 75 08 jnz loc_288 ; Jump if not zero
F000:F3D2 80 EA 20 sub dl,20h ; ' '
F000:F3D5 B8 0107 mov ax,107h
F000:F3D8 EB 09 jmp short loc_289 ; (F3E3)
F000:F3DA loc_288: ; xref F000:F3D0
F000:F3DA 32 E4 xor ah,ah ; Zero register
F000:F3DC 3C 06 cmp al,6
F000:F3DE 76 03 jbe loc_289 ; Jump if below or =
F000:F3E0 E9 00A0 jmp loc_296 ; (F483)
F000:F3E3 loc_289: ; xref F000:F3D8, F3DE
F000:F3E3 89 55 1A mov [di+1Ah],dx
F000:F3E6 88 05 mov [di],al
F000:F3E8 86 E0 xchg ah,al
F000:F3EA 52 push dx
F000:F3EB 83 C2 04 add dx,4
F000:F3EE EE out dx,al ; port 3B8h, MDA video control
F000:F3EF BA 0028 mov dx,28h
F000:F3F2 A0 0049 mov al,video_mode ; (0040:0049=3)
F000:F3F5 3C 01 cmp al,1
F000:F3F7 76 0B jbe loc_291 ; Jump if below or =
F000:F3F9 3C 03 cmp al,3
F000:F3FB 76 04 jbe loc_290 ; Jump if below or =
F000:F3FD 3C 05 cmp al,5
F000:F3FF 76 03 jbe loc_291 ; Jump if below or =
F000:F401 loc_290: ; xref F000:F3FB
F000:F401 80 C2 28 add dl,28h ; '('
F000:F404 loc_291: ; xref F000:F3F7, F3FF
F000:F404 89 55 01 mov [di+1],dx
F000:F407 33 DB xor bx,bx ; Zero register
F000:F409 B9 2000 mov cx,2000h
F000:F40C BE 0720 mov si,720h
F000:F40F BA 0800 mov dx,800h
F000:F412 3C 01 cmp al,1
F000:F414 76 20 jbe loc_292 ; Jump if below or =
F000:F416 83 C3 10 add bx,10h
F000:F419 D1 E2 shl dx,1 ; Shift w/zeros fill
F000:F41B 3C 03 cmp al,3
F000:F41D 76 17 jbe loc_292 ; Jump if below or =
F000:F41F 83 C3 10 add bx,10h
F000:F422 D1 E2 shl dx,1 ; Shift w/zeros fill
F000:F424 D1 E2 shl dx,1 ; Shift w/zeros fill
F000:F426 33 F6 xor si,si ; Zero register
F000:F428 3C 06 cmp al,6
F000:F42A 76 0A jbe loc_292 ; Jump if below or =
F000:F42C 83 C3 10 add bx,10h
F000:F42F 81 E9 1800 sub cx,1800h
F000:F433 BE 0720 mov si,720h
F000:F436 loc_292: ; xref F000:F414, F41D, F42A
F000:F436 89 55 03 mov [di+3],dx
bios.lst BIOS ROM Analysis Sourcer Listing v2.15 27-Nov-89 7:47 pm Page 75
F000:F439 5A pop dx
F000:F43A 1E push ds
F000:F43B 33 ED xor bp,bp ; Zero register
F000:F43D 55 push bp
F000:F43E 1F pop ds
F000:F43F locloop_293: ; xref F000:F446
F000:F43F 26: 89 76 00 mov es:[bp],si
F000:F443 83 C5 02 add bp,2
F000:F446 E2 F7 loop locloop_293 ; Loop if cx > 0
F000:F448 C5 2E 0074 lds bp,dword ptr ds:video_hdw_off ; (0000:0074=0F0A4h) Load 32 bit ptr
F000:F44C 03 EB add bp,bx
F000:F44E B9 0010 mov cx,10h
F000:F451 32 C0 xor al,al ; Zero register
F000:F453 locloop_294: ; xref F000:F45D
F000:F453 3E: 8A 5E 00 mov bl,ds:[bp]
F000:F457 E8 FBDE call sub_33 ; (F038)
F000:F45A 45 inc bp
F000:F45B FE C0 inc al
F000:F45D E2 F4 loop locloop_294 ; Loop if cx > 0
F000:F45F 1F pop ds
F000:F460 86 E0 xchg ah,al
F000:F462 32 E4 xor ah,ah ; Zero register
F000:F464 83 C2 04 add dx,4
F000:F467 BE F0E4 mov si,0F0E4h
F000:F46A 03 F0 add si,ax
F000:F46C 2E: 8A 04 mov al,cs:[si]
F000:F46F EE out dx,al ; port 3B8h, MDA video control
F000:F470 88 45 1C mov [di+1Ch],al
F000:F473 42 inc dx
F000:F474 B0 1F mov al,1Fh
F000:F476 80 3E 0049 06 cmp video_mode,6 ; (0040:0049=3)
F000:F47B 74 02 je loc_295 ; Jump if equal
F000:F47D 04 11 add al,11h
F000:F47F loc_295: ; xref F000:F47B
F000:F47F EE out dx,al ; port 3B9h, CGA color(port3D9)
F000:F480 88 45 1D mov [di+1Dh],al
F000:F483 loc_296: ; xref F000:F144, F1B8, F1E3, F28D
; F31E, F3E0, F4C3, F506
; F570, F5C3, F5D1, F608
; F635, F6A4, F6C5, F79D
; FFDB
F000:F483 E8 FBA2 call sub_32 ; (F028)
F000:F486 CF iret ; Interrupt return
;───── Indexed Entry Point ────────────────────────────────────────────────
F000:F487 loc_297: ; xref F000:F099
F000:F487 8A 3E 0062 mov bh,video_page ; (0040:0062=0)
F000:F48B 8B E8 mov bp,ax
F000:F48D E8 018C call sub_50 ; (F61C)
F000:F490 8B 15 mov dx,[di]
F000:F492 8A 0E 004A mov cl,byte ptr video_columns ; (0040:004A=50h)
F000:F496 B5 18 mov ch,18h
bios.lst BIOS ROM Analysis Sourcer Listing v2.15 27-Nov-89 7:47 pm Page 76
F000:F498 8B F1 mov si,cx
F000:F49A B4 0A mov ah,0Ah
F000:F49C 3C 0D cmp al,0Dh
F000:F49E 75 04 jne loc_298 ; Jump if not equal
F000:F4A0 32 D2 xor dl,dl ; Zero register
F000:F4A2 EB 1A jmp short loc_301 ; (F4BE)
F000:F4A4 loc_298: ; xref F000:F49E
F000:F4A4 3C 0A cmp al,0Ah
F000:F4A6 75 08 jne loc_300 ; Jump if not equal
F000:F4A8 loc_299: ; xref F000:F4DF
F000:F4A8 3A F5 cmp dh,ch
F000:F4AA 74 35 je loc_305 ; Jump if equal
F000:F4AC FE C6 inc dh
F000:F4AE EB 0E jmp short loc_301 ; (F4BE)
F000:F4B0 loc_300: ; xref F000:F4A6
F000:F4B0 B9 0002 mov cx,2
F000:F4B3 3C 08 cmp al,8
F000:F4B5 75 0E jne loc_303 ; Jump if not equal
F000:F4B7 F6 C2 FF test dl,0FFh
F000:F4BA 74 02 jz loc_301 ; Jump if zero
F000:F4BC FE CA dec dl
F000:F4BE loc_301: ; xref F000:F4A2, F4AE, F4BA, F4DB
F000:F4BE E8 014A call sub_49 ; (F60B)
F000:F4C1 loc_302: ; xref F000:F4D0, F4FC
F000:F4C1 8B C5 mov ax,bp
F000:F4C3 EB BE jmp short loc_296 ; (F483)
F000:F4C5 loc_303: ; xref F000:F4B5
F000:F4C5 3C 07 cmp al,7
F000:F4C7 75 09 jne loc_304 ; Jump if not equal
F000:F4C9 33 C9 xor cx,cx ; Zero register
F000:F4CB B3 03 mov bl,3
F000:F4CD E8 F0D2 call sub_8 ; (E5A2)
F000:F4D0 EB EF jmp short loc_302 ; (F4C1)
F000:F4D2 loc_304: ; xref F000:F4C7
F000:F4D2 49 dec cx
F000:F4D3 CD 10 int 10h ; Video display ah=functn 00h
; set display mode in al
F000:F4D5 8B CE mov cx,si
F000:F4D7 FE C2 inc dl
F000:F4D9 3A D1 cmp dl,cl
F000:F4DB 75 E1 jne loc_301 ; Jump if not equal
F000:F4DD 32 D2 xor dl,dl ; Zero register
F000:F4DF EB C7 jmp short loc_299 ; (F4A8)
F000:F4E1 loc_305: ; xref F000:F4AA
F000:F4E1 E8 0127 call sub_49 ; (F60B)
F000:F4E4 32 FF xor bh,bh ; Zero register
F000:F4E6 E8 02DA call sub_53 ; (F7C3)
F000:F4E9 74 07 jz loc_306 ; Jump if zero
F000:F4EB 1E push ds
F000:F4EC E8 0149 call sub_51 ; (F638)
F000:F4EF 1F pop ds
F000:F4F0 8A FC mov bh,ah
F000:F4F2 loc_306: ; xref F000:F4E9
F000:F4F2 4E dec si
F000:F4F3 B8 0601 mov ax,601h
F000:F4F6 8B D6 mov dx,si
F000:F4F8 33 C9 xor cx,cx ; Zero register
bios.lst BIOS ROM Analysis Sourcer Listing v2.15 27-Nov-89 7:47 pm Page 77
F000:F4FA CD 10 int 10h ; Video display ah=functn 06h
; scroll up, al=lines
F000:F4FC EB C3 jmp short loc_302 ; (F4C1)
;───── Indexed Entry Point ────────────────────────────────────────────────
F000:F4FE loc_307: ; xref F000:F099
F000:F4FE F9 stc ; Set carry flag
F000:F4FF 50 push ax
F000:F500 8B C1 mov ax,cx
F000:F502 EB 0A jmp short loc_310 ; (F50E)
F000:F504 loc_308: ; xref F000:F511, F515
F000:F504 9D popf ; Pop flags
F000:F505 58 pop ax
F000:F506 E9 FF7A jmp loc_296 ; (F483)
;───── Indexed Entry Point ────────────────────────────────────────────────
F000:F509 loc_309: ; xref F000:F099
F000:F509 FD std ; Set direction flag
F000:F50A F8 clc ; Clear carry flag
F000:F50B 50 push ax
F000:F50C 8B C2 mov ax,dx
F000:F50E loc_310: ; xref F000:F502
F000:F50E 9C pushf ; Push flags
F000:F50F 2A F5 sub dh,ch
F000:F511 7C F1 jl loc_308 ; Jump if <
F000:F513 2A D1 sub dl,cl
F000:F515 72 ED jc loc_308 ; Jump if carry Set
F000:F517 81 C2 0101 add dx,101h
F000:F51B E8 FE03 call sub_40 ; (F321)
F000:F51E 50 push ax
F000:F51F 5F pop di
F000:F520 E8 02A0 call sub_53 ; (F7C3)
F000:F523 75 03 jnz loc_311 ; Jump if not zero
F000:F525 E9 FBC4 jmp loc_230 ; (F0EC)
F000:F528 loc_311: ; xref F000:F523
F000:F528 50 push ax
F000:F529 5E pop si
F000:F52A 9D popf ; Pop flags
F000:F52B 58 pop ax
F000:F52C B3 20 mov bl,20h ; ' '
F000:F52E 8B EB mov bp,bx
F000:F530 50 push ax
F000:F531 9C pushf ; Push flags
F000:F532 D0 E0 shl al,1 ; Shift w/zeros fill
F000:F534 8B 1E 004A mov bx,video_columns ; (0040:004A=50h)
F000:F538 F6 E3 mul bl ; ax = reg * al
F000:F53A D1 E3 shl bx,1 ; Shift w/zeros fill
F000:F53C 9D popf ; Pop flags
F000:F53D 72 04 jc loc_312 ; Jump if carry Set
F000:F53F F7 D8 neg ax
F000:F541 F7 DB neg bx
F000:F543 loc_312: ; xref F000:F53D
F000:F543 03 F0 add si,ax
F000:F545 E8 0049 call sub_46 ; (F591)
F000:F548 58 pop ax
bios.lst BIOS ROM Analysis Sourcer Listing v2.15 27-Nov-89 7:47 pm Page 78
F000:F549 1E push ds
F000:F54A 06 push es
F000:F54B 1F pop ds
F000:F54C 2A ED sub ch,ch
F000:F54E A8 FF test al,0FFh
F000:F550 74 10 jz loc_314 ; Jump if zero
F000:F552 2A F0 sub dh,al
F000:F554 86 C6 xchg al,dh
F000:F556 74 0A jz loc_314 ; Jump if zero
F000:F558 loc_313: ; xref F000:F560
F000:F558 F9 stc ; Set carry flag
F000:F559 E8 0017 call sub_44 ; (F573)
F000:F55C 03 F3 add si,bx
F000:F55E FE C8 dec al
F000:F560 7F F6 jg loc_313 ; Jump if >
F000:F562 loc_314: ; xref F000:F550, F556
F000:F562 8B C5 mov ax,bp
F000:F564 loc_315: ; xref F000:F56A
F000:F564 F8 clc ; Clear carry flag
F000:F565 E8 000B call sub_44 ; (F573)
F000:F568 FE CE dec dh
F000:F56A 7F F8 jg loc_315 ; Jump if >
F000:F56C 1F pop ds
F000:F56D E8 0014 call sub_45 ; (F584)
F000:F570 E9 FF10 jmp loc_296 ; (F483)
;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
; SUBROUTINE
;
; Called from: F000:F559, F565
;▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
sub_44 proc near
F000:F573 8A CA mov cl,dl
F000:F575 57 push di
F000:F576 56 push si
F000:F577 72 04 jc loc_316 ; Jump if carry Set
F000:F579 F3/ AB rep stosw ; Rep when cx >0 Store ax to es:[di]
F000:F57B EB 02 jmp short loc_317 ; (F57F)
F000:F57D loc_316: ; xref F000:F577
F000:F57D F3/ A5 rep movsw ; Rep when cx >0 Mov [si] to es:[di]
F000:F57F loc_317: ; xref F000:F57B
F000:F57F 5E pop si
F000:F580 5F pop di
F000:F581 03 FB add di,bx
F000:F583 C3 retn
sub_44 endp
;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
; SUBROUTINE
;
; Called from: F000:EC04, F56D
;▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
sub_45 proc near
F000:F584 E8 022F call sub_52 ; (F7B6)
bios.lst BIOS ROM Analysis Sourcer Listing v2.15 27-Nov-89 7:47 pm Page 79
F000:F587 75 07 jnz loc_ret_318 ; Jump if not zero
F000:F589 A0 0065 mov al,video_mode_reg ; (0040:0065=29h)
F000:F58C BA 03D8 mov dx,3D8h
F000:F58F EE out dx,al ; port 3D8h, CGA video control
F000:F590 loc_ret_318: ; xref F000:F587
F000:F590 C3 retn
sub_45 endp
;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
; SUBROUTINE
;
; Called from: F000:F545
;▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
sub_46 proc near
F000:F591 E8 0222 call sub_52 ; (F7B6)
F000:F594 75 10 jnz loc_ret_320 ; Jump if not zero
F000:F596 52 push dx
F000:F597 BA 03DA mov dx,3DAh
F000:F59A loc_319: ; xref F000:F59D
F000:F59A EC in al,dx ; port 3DAh, CGA/EGA vid status
F000:F59B 24 08 and al,8
F000:F59D 74 FB jz loc_319 ; Jump if zero
F000:F59F 80 EA 02 sub dl,2
F000:F5A2 B0 21 mov al,21h ; '!'
F000:F5A4 EE out dx,al ; port 3D8h, CGA video control
F000:F5A5 5A pop dx
F000:F5A6 loc_ret_320: ; xref F000:F594
F000:F5A6 C3 retn
sub_46 endp
;───── Indexed Entry Point ────────────────────────────────────────────────
F000:F5A7 loc_321: ; xref F000:F099
F000:F5A7 8A F8 mov bh,al
F000:F5A9 E8 0070 call sub_50 ; (F61C)
F000:F5AC 88 3E 0062 mov video_page,bh ; (0040:0062=0)
F000:F5B0 E8 FDB9 call sub_42 ; (F36C)
F000:F5B3 89 1E 004E mov video_segment,bx ; (0040:004E=0)
F000:F5B7 D1 EB shr bx,1 ; Shift w/zeros fill
F000:F5B9 B0 0C mov al,0Ch
F000:F5BB E8 001F call sub_48 ; (F5DD)
F000:F5BE 8B 05 mov ax,[di]
F000:F5C0 E8 0011 call sub_47 ; (F5D4)
F000:F5C3 E9 FEBD jmp loc_296 ; (F483)
;───── Indexed Entry Point ────────────────────────────────────────────────
F000:F5C6 loc_322: ; xref F000:F099
F000:F5C6 8B D9 mov bx,cx
F000:F5C8 89 1E 0060 mov vid_curs_mode,bx ; (0040:0060=2000h)
F000:F5CC B0 0A mov al,0Ah
F000:F5CE E8 000C call sub_48 ; (F5DD)
bios.lst BIOS ROM Analysis Sourcer Listing v2.15 27-Nov-89 7:47 pm Page 80
F000:F5D1 E9 FEAF jmp loc_296 ; (F483)
;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
; SUBROUTINE
;
; Called from: F000:F5C0, F618
;▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
sub_47 proc near
F000:F5D4 E8 FD4A call sub_40 ; (F321)
F000:F5D7 8B D8 mov bx,ax
F000:F5D9 D1 FB sar bx,1 ; Shift w/sign fill
F000:F5DB B0 0E mov al,0Eh
;▀▀▀▀ External Entry into Subroutine ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
;
; Called from: F000:F5BB, F5CE
sub_48:
F000:F5DD 52 push dx
F000:F5DE 8B 16 0063 mov dx,@video_port ; (0040:0063=3D4h)
F000:F5E2 86 FB xchg bh,bl
F000:F5E4 E8 FA51 call sub_33 ; (F038)
F000:F5E7 FE C0 inc al
F000:F5E9 86 FB xchg bh,bl
F000:F5EB E8 FA4A call sub_33 ; (F038)
F000:F5EE 5A pop dx
F000:F5EF C3 retn
sub_47 endp
;───── Indexed Entry Point ────────────────────────────────────────────────
F000:F5F0 loc_323: ; xref F000:F099
F000:F5F0 E8 0029 call sub_50 ; (F61C)
F000:F5F3 8B 05 mov ax,[di]
F000:F5F5 8B 0E 0060 mov cx,vid_curs_mode ; (0040:0060=2000h)
F000:F5F9 8B FC mov di,sp
F000:F5FB 36: 89 4D 0C mov ss:[di+0Ch],cx
F000:F5FF E8 FA26 call sub_32 ; (F028)
F000:F602 8B D0 mov dx,ax
F000:F604 CF iret ; Interrupt return
;───── Indexed Entry Point ────────────────────────────────────────────────
F000:F605 loc_324: ; xref F000:F099
F000:F605 E8 0003 call sub_49 ; (F60B)
F000:F608 E9 FE78 jmp loc_296 ; (F483)
;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
; SUBROUTINE
;
; Called from: F000:F4BE, F4E1, F605
;▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
sub_49 proc near
F000:F60B E8 000E call sub_50 ; (F61C)
bios.lst BIOS ROM Analysis Sourcer Listing v2.15 27-Nov-89 7:47 pm Page 81
F000:F60E 89 15 mov [di],dx
F000:F610 38 3E 0062 cmp video_page,bh ; (0040:0062=0)
F000:F614 75 05 jne loc_ret_325 ; Jump if not equal
F000:F616 8B C2 mov ax,dx
F000:F618 E8 FFB9 call sub_47 ; (F5D4)
F000:F61B loc_ret_325: ; xref F000:F614
F000:F61B C3 retn
sub_49 endp
;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
; SUBROUTINE
;
; Called from: F000:F34F, F48D, F5A9, F5F0, F60B, FF84
;▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
sub_50 proc near
F000:F61C 53 push bx
F000:F61D 86 FB xchg bh,bl
F000:F61F 32 FF xor bh,bh ; Zero register
F000:F621 D1 E3 shl bx,1 ; Shift w/zeros fill
F000:F623 BF 0050 mov di,seg seg_c
F000:F626 03 FB add di,bx
F000:F628 5B pop bx
F000:F629 C3 retn
sub_50 endp
;───── Indexed Entry Point ────────────────────────────────────────────────
F000:F62A loc_326: ; xref F000:F099
F000:F62A E8 0196 call sub_53 ; (F7C3)
F000:F62D 75 03 jnz loc_327 ; Jump if not zero
F000:F62F E9 FBFE jmp loc_251 ; (F230)
F000:F632 loc_327: ; xref F000:F62D
F000:F632 E8 0003 call sub_51 ; (F638)
F000:F635 E9 FE4B jmp loc_296 ; (F483)
;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
; SUBROUTINE
;
; Called from: F000:F4EC, F632
;▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
sub_51 proc near
F000:F638 E8 FD13 call sub_41 ; (F34E)
F000:F63B E8 FA5D call sub_34 ; (F09B)
F000:F63E 06 push es
F000:F63F 1F pop ds
F000:F640 B1 01 mov cl,1
F000:F642 FA cli ; Disable interrupts
F000:F643 loc_328: ; xref F000:F646
F000:F643 EC in al,dx ; port 300h
F000:F644 22 C1 and al,cl
F000:F646 75 FB jnz loc_328 ; Jump if not zero
F000:F648 loc_329: ; xref F000:F64B
bios.lst BIOS ROM Analysis Sourcer Listing v2.15 27-Nov-89 7:47 pm Page 82
F000:F648 EC in al,dx ; port 300h
F000:F649 22 C1 and al,cl
F000:F64B 74 FB jz loc_329 ; Jump if zero
F000:F64D 8B 07 mov ax,[bx]
F000:F64F FB sti ; Enable interrupts
F000:F650 C3 retn
sub_51 endp
;───── Indexed Entry Point ────────────────────────────────────────────────
F000:F651 loc_330: ; xref F000:F099
F000:F651 F9 stc ; Set carry flag
F000:F652 EB 01 jmp short loc_332 ; (F655)
;───── Indexed Entry Point ────────────────────────────────────────────────
F000:F654 loc_331: ; xref F000:F099
F000:F654 F8 clc ; Clear carry flag
F000:F655 loc_332: ; xref F000:F652
F000:F655 9C pushf ; Push flags
F000:F656 8B E8 mov bp,ax
F000:F658 8A C2 mov al,dl
F000:F65A D0 E8 shr al,1 ; Shift w/zeros fill
F000:F65C B4 50 mov ah,50h ; 'P'
F000:F65E F6 E4 mul ah ; ax = reg * al
F000:F660 8B F8 mov di,ax
F000:F662 D0 CA ror dl,1 ; Rotate
F000:F664 73 04 jnc loc_333 ; Jump if carry=0
F000:F666 81 C7 2000 add di,2000h
F000:F66A loc_333: ; xref F000:F664
F000:F66A 8B D1 mov dx,cx
F000:F66C BB 0302 mov bx,302h
F000:F66F 80 E1 07 and cl,7
F000:F672 D1 EA shr dx,1 ; Shift w/zeros fill
F000:F674 D1 EA shr dx,1 ; Shift w/zeros fill
F000:F676 80 3E 0049 06 cmp video_mode,6 ; (0040:0049=3)
F000:F67B 75 08 jne loc_334 ; Jump if not equal
F000:F67D D1 EA shr dx,1 ; Shift w/zeros fill
F000:F67F 81 EB 0201 sub bx,201h
F000:F683 EB 03 jmp short loc_335 ; (F688)
F000:F685 loc_334: ; xref F000:F67B
F000:F685 80 E1 F3 and cl,0F3h
F000:F688 loc_335: ; xref F000:F683
F000:F688 03 FA add di,dx
F000:F68A 80 3E 0049 06 cmp video_mode,6 ; (0040:0049=3)
F000:F68F 74 04 je loc_336 ; Jump if equal
F000:F691 D0 E1 shl cl,1 ; Shift w/zeros fill
F000:F693 FE C1 inc cl
F000:F695 loc_336: ; xref F000:F68F
F000:F695 80 F1 07 xor cl,7
F000:F698 D2 E7 shl bh,cl ; Shift w/zeros fill
F000:F69A 9D popf ; Pop flags
F000:F69B 73 0A jnc loc_337 ; Jump if carry=0
F000:F69D 26: 8A 05 mov al,es:[di]
F000:F6A0 22 C7 and al,bh
F000:F6A2 D2 E8 shr al,cl ; Shift w/zeros fill
bios.lst BIOS ROM Analysis Sourcer Listing v2.15 27-Nov-89 7:47 pm Page 83
F000:F6A4 E9 FDDC jmp loc_296 ; (F483)
F000:F6A7 loc_337: ; xref F000:F69B
F000:F6A7 8B C5 mov ax,bp
F000:F6A9 D2 E0 shl al,cl ; Shift w/zeros fill
F000:F6AB 22 C7 and al,bh
F000:F6AD 8A C8 mov cl,al
F000:F6AF 26: 8A 1D mov bl,es:[di]
F000:F6B2 8B C5 mov ax,bp
F000:F6B4 A8 80 test al,80h
F000:F6B6 74 04 jz loc_338 ; Jump if zero
F000:F6B8 32 CB xor cl,bl
F000:F6BA EB 06 jmp short loc_339 ; (F6C2)
F000:F6BC loc_338: ; xref F000:F6B6
F000:F6BC F6 D7 not bh
F000:F6BE 22 DF and bl,bh
F000:F6C0 0A CB or cl,bl
F000:F6C2 loc_339: ; xref F000:F6BA
F000:F6C2 26: 88 0D mov es:[di],cl
F000:F6C5 E9 FDBB jmp loc_296 ; (F483)
;───── Indexed Entry Point ────────────────────────────────────────────────
F000:F6C8 loc_340: ; xref F000:F099
F000:F6C8 BA 03DA mov dx,3DAh
F000:F6CB 8B F2 mov si,dx
F000:F6CD 32 E4 xor ah,ah ; Zero register
F000:F6CF EC in al,dx ; port 3DAh, CGA/EGA vid status
F000:F6D0 24 06 and al,6
F000:F6D2 75 03 jnz loc_341 ; Jump if not zero
F000:F6D4 E9 008C jmp loc_350 ; (F763)
F000:F6D7 loc_341: ; xref F000:F6D2
F000:F6D7 3C 02 cmp al,2
F000:F6D9 74 03 je loc_342 ; Jump if equal
F000:F6DB E9 007F jmp loc_349 ; (F75D)
F000:F6DE loc_342: ; xref F000:F6D9
F000:F6DE B9 1011 mov cx,1011h
F000:F6E1 B3 D5 mov bl,0D5h
F000:F6E3 83 EA 06 sub dx,6
F000:F6E6 8A C5 mov al,ch
F000:F6E8 EE out dx,al ; port 3D4h, CGA/EGA reg index
; al = 10h, light pen high
F000:F6E9 86 D3 xchg dl,bl
F000:F6EB EC in al,dx ; port 3D5h, CGA/EGA indxd data
F000:F6EC 8A F8 mov bh,al
F000:F6EE 86 D3 xchg dl,bl
F000:F6F0 8A C1 mov al,cl
F000:F6F2 EE out dx,al ; port 3D4h, CGA/EGA reg index
; al = 11h, light pen low
F000:F6F3 86 D3 xchg dl,bl
F000:F6F5 EC in al,dx ; port 3D5h, CGA/EGA indxd data
F000:F6F6 8A D8 mov bl,al
F000:F6F8 8B 16 004E mov dx,video_segment ; (0040:004E=0)
F000:F6FC D1 EA shr dx,1 ; Shift w/zeros fill
F000:F6FE 83 C2 04 add dx,4
F000:F701 E8 00BF call sub_53 ; (F7C3)
F000:F704 74 0A jz loc_343 ; Jump if zero
F000:F706 80 3E 0049 01 cmp video_mode,1 ; (0040:0049=3)
bios.lst BIOS ROM Analysis Sourcer Listing v2.15 27-Nov-89 7:47 pm Page 84
F000:F70B 76 03 jbe loc_343 ; Jump if below or =
F000:F70D 83 C2 02 add dx,2
F000:F710 loc_343: ; xref F000:F704, F70B
F000:F710 2B DA sub bx,dx
F000:F712 79 02 jns loc_344 ; Jump if not sign
F000:F714 33 DB xor bx,bx ; Zero register
F000:F716 loc_344: ; xref F000:F712
F000:F716 B9 2803 mov cx,2803h
F000:F719 93 xchg ax,bx
F000:F71A F6 F5 div ch ; al, ah rem = ax/reg
F000:F71C 8A E8 mov ch,al
F000:F71E 02 ED add ch,ch
F000:F720 E8 00A0 call sub_53 ; (F7C3)
F000:F723 75 1D jnz loc_346 ; Jump if not zero
F000:F725 8A D4 mov dl,ah
F000:F727 8A F0 mov dh,al
F000:F729 86 C4 xchg al,ah
F000:F72B 32 E4 xor ah,ah ; Zero register
F000:F72D D3 E0 shl ax,cl ; Shift w/zeros fill
F000:F72F FE C9 dec cl
F000:F731 D2 EE shr dh,cl ; Shift w/zeros fill
F000:F733 80 3E 0049 06 cmp video_mode,6 ; (0040:0049=3)
F000:F738 75 04 jne loc_345 ; Jump if not equal
F000:F73A D0 E2 shl dl,1 ; Shift w/zeros fill
F000:F73C D1 E0 shl ax,1 ; Shift w/zeros fill
F000:F73E loc_345: ; xref F000:F738
F000:F73E 8B D8 mov bx,ax
F000:F740 EB 19 jmp short loc_348 ; (F75B)
F000:F742 loc_346: ; xref F000:F723
F000:F742 80 3E 0049 01 cmp video_mode,1 ; (0040:0049=3)
F000:F747 76 02 jbe loc_347 ; Jump if below or =
F000:F749 D1 E8 shr ax,1 ; Shift w/zeros fill
F000:F74B loc_347: ; xref F000:F747
F000:F74B 8B D0 mov dx,ax
F000:F74D 86 F2 xchg dh,dl
F000:F74F 86 E0 xchg ah,al
F000:F751 32 E4 xor ah,ah ; Zero register
F000:F753 D3 E0 shl ax,cl ; Shift w/zeros fill
F000:F755 8B D8 mov bx,ax
F000:F757 8A EE mov ch,dh
F000:F759 D2 E5 shl ch,cl ; Shift w/zeros fill
F000:F75B loc_348: ; xref F000:F740
F000:F75B B4 01 mov ah,1
F000:F75D loc_349: ; xref F000:F6DB
F000:F75D 87 F2 xchg si,dx
F000:F75F 42 inc dx
F000:F760 EE out dx,al ; port 3DBh, CGA light pen clr
F000:F761 87 F2 xchg si,dx
F000:F763 loc_350: ; xref F000:F6D4
F000:F763 8B FC mov di,sp
F000:F765 36: 89 5D 0E mov ss:[di+0Eh],bx
F000:F769 36: 89 4D 0C mov ss:[di+0Ch],cx
F000:F76D 36: 89 55 0A mov ss:[di+0Ah],dx
F000:F771 E8 F8B4 call sub_32 ; (F028)
F000:F774 CF iret ; Interrupt return
;───── Indexed Entry Point ────────────────────────────────────────────────
bios.lst BIOS ROM Analysis Sourcer Listing v2.15 27-Nov-89 7:47 pm Page 85
F000:F775 loc_351: ; xref F000:F099
F000:F775 8A 0E 0066 mov cl,video_color ; (0040:0066=30h)
F000:F779 E8 F91F call sub_34 ; (F09B)
F000:F77C 4A dec dx
F000:F77D 22 FF and bh,bh
F000:F77F 74 0D jz loc_352 ; Jump if zero
F000:F781 80 E1 1F and cl,1Fh
F000:F784 80 E3 01 and bl,1
F000:F787 74 0D jz loc_353 ; Jump if zero
F000:F789 80 C9 20 or cl,20h ; ' '
F000:F78C EB 08 jmp short loc_353 ; (F796)
F000:F78E loc_352: ; xref F000:F77F
F000:F78E 80 E3 DF and bl,0DFh
F000:F791 80 E1 20 and cl,20h ; ' '
F000:F794 0A CB or cl,bl
F000:F796 loc_353: ; xref F000:F787, F78C
F000:F796 8A C1 mov al,cl
F000:F798 EE out dx,al ; port 0FFFFh
F000:F799 88 0E 0066 mov video_color,cl ; (0040:0066=30h)
F000:F79D E9 FCE3 jmp loc_296 ; (F483)
;───── Indexed Entry Point ────────────────────────────────────────────────
F000:F7A0 loc_354: ; xref F000:F099
F000:F7A0 E8 F885 call sub_32 ; (F028)
F000:F7A3 1E push ds
F000:F7A4 B8 0040 mov ax,seg_b
F000:F7A7 8E D8 mov ds,ax
F000:F7A9 A0 0049 mov al,video_mode ; (0040:0049=3)
F000:F7AC 8A 26 004A mov ah,byte ptr video_columns ; (0040:004A=50h)
F000:F7B0 8A 3E 0062 mov bh,video_page ; (0040:0062=0)
F000:F7B4 1F pop ds
F000:F7B5 CF iret ; Interrupt return
;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
; SUBROUTINE
;
; Called from: F000:F584, F591
;▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
sub_52 proc near
F000:F7B6 80 3E 0049 02 cmp video_mode,2 ; (0040:0049=3)
F000:F7BB 74 05 je loc_ret_355 ; Jump if equal
F000:F7BD 80 3E 0049 03 cmp video_mode,3 ; (0040:0049=3)
F000:F7C2 loc_ret_355: ; xref F000:F7BB
F000:F7C2 C3 retn
sub_52 endp
;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
; SUBROUTINE
;
; Called from: F000:F2E5, F326, F4E6, F520, F62A, F701, F720
;▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
bios.lst BIOS ROM Analysis Sourcer Listing v2.15 27-Nov-89 7:47 pm Page 86
sub_53 proc near
F000:F7C3 80 3E 0049 04 cmp video_mode,4 ; (0040:0049=3)
F000:F7C8 74 0C je loc_ret_356 ; Jump if equal
F000:F7CA 80 3E 0049 05 cmp video_mode,5 ; (0040:0049=3)
F000:F7CF 74 05 je loc_ret_356 ; Jump if equal
F000:F7D1 80 3E 0049 06 cmp video_mode,6 ; (0040:0049=3)
F000:F7D6 loc_ret_356: ; xref F000:F7C8, F7CF
F000:F7D6 C3 retn
sub_53 endp
;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
; SUBROUTINE
;
; Called from: F000:ED8F, EDAF
;▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
sub_54 proc near
F000:F7D7 8A 46 01 mov al,[bp+1]
F000:F7DA E6 0B out 0Bh,al ; port 0Bh, DMA-1 mode reg
F000:F7DC 06 push es
F000:F7DD 58 pop ax
F000:F7DE 8A F4 mov dh,ah
F000:F7E0 B9 0004 mov cx,4
F000:F7E3 locloop_357: ; xref F000:F7E7
F000:F7E3 D0 EE shr dh,1 ; Shift w/zeros fill
F000:F7E5 D1 E0 shl ax,1 ; Shift w/zeros fill
F000:F7E7 E2 FA loop locloop_357 ; Loop if cx > 0
F000:F7E9 03 C3 add ax,bx
F000:F7EB 73 02 jnc loc_358 ; Jump if carry=0
F000:F7ED FE C6 inc dh
F000:F7EF loc_358: ; xref F000:F7EB
F000:F7EF 86 C6 xchg al,dh
F000:F7F1 E6 81 out 81h,al ; port 81h, DMA page reg ch 2
F000:F7F3 86 C6 xchg al,dh
F000:F7F5 E6 0C out 0Ch,al ; port 0Ch, DMA-1 clr byte ptr
F000:F7F7 E6 04 out 4,al ; port 4, DMA-1 bas&add ch 2
F000:F7F9 86 C4 xchg al,ah
F000:F7FB E6 04 out 4,al ; port 4, DMA-1 bas&add ch 2
F000:F7FD 86 C4 xchg al,ah
F000:F7FF 32 F6 xor dh,dh ; Zero register
F000:F801 8A 56 00 mov dl,[bp]
F000:F804 E8 F701 call sub_28 ; (EF08)
F000:F807 26: 8A 4D 03 mov cl,es:[di+3]
F000:F80B 80 C1 07 add cl,7
F000:F80E D3 E2 shl dx,cl ; Shift w/zeros fill
F000:F810 4A dec dx
F000:F811 03 C2 add ax,dx
F000:F813 92 xchg ax,dx
F000:F814 72 0D jc loc_359 ; Jump if carry Set
F000:F816 E6 05 out 5,al ; port 5, DMA-1 bas&cnt ch 2
F000:F818 86 C4 xchg al,ah
F000:F81A E6 05 out 5,al ; port 5, DMA-1 bas&cnt ch 2
F000:F81C B0 02 mov al,2
bios.lst BIOS ROM Analysis Sourcer Listing v2.15 27-Nov-89 7:47 pm Page 87
F000:F81E E6 0A out 0Ah,al ; port 0Ah, DMA-1 mask reg bit
F000:F820 EB 09 jmp short loc_ret_360 ; (F82B)
F000:F822 90 db 90h
F000:F823 loc_359: ; xref F000:F814
F000:F823 80 06 0041 09 add dsk_ret_code,9 ; (0040:0041=0)
F000:F828 2A C0 sub al,al
F000:F82A F9 stc ; Set carry flag
F000:F82B loc_ret_360: ; xref F000:F820
F000:F82B C3 retn
sub_54 endp
F000:F82C 0015[00] db 21 dup (0)
; ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ int 12h ▒▒▒▒▒
;
; SYSTEM MEMORY SIZE
;
; Returns: ax = number of contiguous 1K bytes blocks of memory
; from 0 to 640 K.
;
; Regs used: ax
F000:F841 int_12h_memsiz proc near ; xref F000:FF17
F000:F841 FB sti ; Enable interrupts
F000:F842 1E push ds
F000:F843 E8 0135 call sub_57 ; (F97B)
F000:F846 A1 0013 mov ax,main_ram_size ; (0040:0013=280h)
F000:F849 1F pop ds
F000:F84A CF iret ; Interrupt return
int_12h_memsiz endp
F000:F84B 00 00 db 0, 0
; ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ int 11h ▒▒▒▒▒
;
; EQUIPMENT INSTALLED
;
; Returns: ax = equip_install word
;
; 15 14 13 12 11 10 9 8
; \ / game \ /
; # of printer port # of RS-232
; ports 0-3 used ports 0-4
;
; 7 6 5 4 3 2 1 0
; \ / \ / \ / Math |
; # of video mode RAM uP no
; floppy at boot up 00=16K floppy
; drives 00=EGA 01=32K drive
; 1-4 01=CGA-40 10=48K if 0
; if bit 10=CGA-80 11=64K
; 0 = 1 11=MDA-80 (old PCs)
;
; Note: bit 13 = modem on PC lap-tops
bios.lst BIOS ROM Analysis Sourcer Listing v2.15 27-Nov-89 7:47 pm Page 88
; bit 2 = mouse on PS/2
;
; Regs used: ax
F000:F84D int_11h_equip proc near ; xref F000:FF15
F000:F84D FB sti ; Enable interrupts
F000:F84E 1E push ds
F000:F84F E8 0129 call sub_57 ; (F97B)
F000:F852 A1 0010 mov ax,equip_bits ; (0040:0010=526Fh)
F000:F855 1F pop ds
F000:F856 CF iret ; Interrupt return
int_11h_equip endp
F000:F857 00 00 db 0, 0
; ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ int 15h ▒▒▒▒▒
;
; GENERAL SERVICES
;
; On old PCs this function is only used for cassette servicing.
; Additional functions have been added for advanced features with
; newer equipment.
;
; Called with: ah = function code
;
; Returns: CF = 0 if successful
; CF = 1 if failure or function not supported
;
; Functions:
; ah = 0 Cassette motor set on
; ah = 1 Cassette motor set off
; ah = 2 Read cx bytes from cassette, es:bx = ptr to load area
; ah = 3 Write cx bytes to cassette, es:bx = ptr to read area
; ah = 0Fh Disk format hook, called from disk format routines
; after a cylinder access completed. Called with:
; al = 1-undergoing surface analysis, 2-if formating
; ah = 21h Error log (PS 2), al = 0 to read, al = 1 to write
;
; *** LAP TOP MACHINES ONLY - 40h to 44h ***
; ah = 40h Systems info in cx, bx - al = 0 to read, 1 to write
; for modem info in bx - al = 2 to read, 3 to write
; ah = 41h Wait for an event, dx = i/o port to read or use es:di
; as ptr to user event. al = type of event 0-4,11-14
; bh = event mask, bl = # of 55ms counts to timeout
; ah = 42h Power off, al = 0 or 1 for mode of power off
; ah = 43h Get system status in al
; 7 6 5 4 3 2 1 0
; low extrn bad pwr up modem ports LCD
; battery pwr time alarm on on missing
; ah = 44h Modem power, al = 0 turn off, al = 1 turn on
;
; *** FUNCTIONS IN RECENT BIOS VERSIONS ONLY ***
; ah = 4Fh Keyboard input hook, called every keystroke with
; al = scan code. CF = 1 to change or use the scan
; code in al. CF = 0 to ignore the key.
; ah = 80h Open device number bx, in process number cx.
bios.lst BIOS ROM Analysis Sourcer Listing v2.15 27-Nov-89 7:47 pm Page 89
; ah = 81h Close device number bx, in process number cx.
; ah = 82h Terminate device number bx
; ah = 83h Wait for timeout, and set bit 15 at ptr es:bx when
; timed out. al = 0 to set wait period cx:dx uSec,
; al = 1 to stop timeout timer.
; ah = 84h Game port read, dx = 0 to read switches into al
; high nibble, dx = 1 to read linear position
; (Unit 1: ax = x, bx = y Unit 2: cx = x, dx = y)
; ah = 85h Get system request key state, al = 0 down, al = 1 up
; ah = 86h Wait cx:dx microseconds before return
; ah = 87h Transfer cx words to/from memory above 1 meg
; es:si ptr to table with source & destination ptrs:
; es:si -> zeros db 16dup(0)
; src_seg_limit dw ? ; 1-64K bytes
; scr_ptr_low dw ? ; 0-64K range
; scr_ptr_high db ? ; 0-16 Meg range
; scr_rights db 93h ; r/w access
; scr_zero dw 0
; dst_seg_limit dw ? ; 1-64K bytes
; dst_ptr_low dw ? ; 0-64K range
; dst_ptr_high db ? ; 0-16 Meg range
; dst_rights db 93h ; r/w access
; dst_zero dw 0
; zeros2 db 16dup(0)
; Notes:
; cx = 32K words max xfer, ptr_low & ptr_high form
; a 24 bit physical address (do not use a segment)
; Return codes: al = 0 if ok, al = 1 parity error
; al = 2 other errors, al = 3 gate addr line 20 bad
; ah = 88h Get extended memory size (above 1 Meg boundary)
; ax = (number of bytes / 1024)
; ah = 89h Go to protected mode of operation. es:si ptr to table
; comprised of 8 groups of 8 byte ptr sub-arrays. Each.
; group is formed from 8 bytes as follows:
; seg_limit dw ? ; 1-64K bytes
; ptr_low dw ? ; 0-64K range
; ptr_high db ? ; 0-16 Meg range
; rights db 93h ; read/write access
; zero dw 0 ; set to zero
; Ptr_low & high form a 24 bit physical address.
;
; The 8 groups are as follows:
; es:si -> Group_1 Set to all zero
; Group_2 ptr to beginning of Group_1
; Group_3 ptr to Interrupt Descript Table IDT
; Group_4 ptr to present DS segment
; Group_5 ptr to present ES segment
; Group_6 ptr to present SS segment
; Group_7 ptr to present CS segment
; Group_8 ptr where to jump to when done
; Also: bh & bl set as offset from beginning of IDT to
; spot where 1st & 2nd set of 8 hardware interrupts begin.
; Returns ah = 0 if ok, regs changed: ax,bp,ds,es,ss,cs
; ah = 90h Device busy - used to signal DOS when it must wait.
; Type 0 Disk timeout 0FCh Hard disk timeout
; codes 1 Floppy timeout (PS 2 only)
; (al) 2 Keyboard no timeout 0FDh Floppy motor timeout
bios.lst BIOS ROM Analysis Sourcer Listing v2.15 27-Nov-89 7:47 pm Page 90
; 3 Mouse timeout 0FEh Printer timeout
; 80h Local area network (es:bx = network cntrl block
; Returns CF = 0 if failure, 1 if minimum wait time occurred
; ah = 91h Interrupt done - used to signal DOS when hardware done
; al = type code (Device busy type codes)
; ah = C0h Get ROM system information table ptr in es:bx. See data
; area starting at byte "sys_info_size".
;
; *** PS 2 & COMPATIBLES ONLY - C1h to C4h ***
; ah = C1h Get Extended BIOS data area segment in es
; ah = C2h Mouse support (BIOS). Sub-function code in al
; al = 0 if bh = 0 mouse off, bh = 1 mouse on
; al = 1 reset mouse & parameters, returns bh = 0
; bl altered on return
; al = 2 Set number of updates per second in bh,
; bh = 0 - 10 updates/sec 4 - 80 updates/sec
; 1 - 20 updates/sec 5 - 100 updates/sec
; 2 - 40 updates/sec 6 - 200 updates/sec
; 3 - 60 updates/sec
; al = 3 Set resolution in counts per millimeter:
; bh = 0 - 1 cnts per mm 2 - 4 cnts per mm
; 1 - 2 cnts per mm 3 - 8 cnts per mm
; al = 4 Get device type, bh = 0
; al = 5 Initialize pointing device interface data size
; bh = size 1 to 8 (1 to 8 bytes)
; al = 6 Additional sub-functions in bh:
; bh = 0 Get status, cl = cnts per mm (see al=3)
; dl = updates/sec in hex, bl = status:
; bit 6 = mode (0=stream, 1=remote)
; 5 = 0 disabled, 1 enabled
; 4 = scaling (0=1:1, 1=2:1)
; 2 = Left button pressed
; 0 = right button pressed
; bh = 1 Set scaling to 1:1
; bh = 2 Set scaling to 2:1
; al = 7 Set location to "call far" when data available
; in es:bx
; Return code for all sub-functions in al:
; al = 0 successful 3 interface error
; 1 bad function call 4 resend
; 2 invalid input 5 no far call installed
; ah = C3h Watchdog timer mode al = 0 disable, al = 1 enable,
; bx = set counter value 1 to FFh
; ah = C4h Bus option select (POS) subfunction in al,
; al = 0 Get base POS adapter register address in dx
; 1 Enable setup for slot bl
; 2 Adapter enable
F000:F859 int_15h_servics proc near ; xref F000:FF1D
F000:F859 F9 stc ; Set carry flag
F000:F85A CA 0002 retf 2 ; Return far
int_15h_servics endp
;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
; SUBROUTINE
;
bios.lst BIOS ROM Analysis Sourcer Listing v2.15 27-Nov-89 7:47 pm Page 91
; Called from: F000:ECB9, EE34, EE51, EF8C, F8AD, F8D0
;▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
sub_55 proc near
F000:F85D 5B pop bx
F000:F85E 59 pop cx
F000:F85F locloop_361: ; xref F000:F86B
F000:F85F B4 80 mov ah,80h
F000:F861 E8 F673 call sub_26 ; (EED7)
F000:F864 72 0A jc locloop_362 ; Jump if carry Set
F000:F866 58 pop ax
F000:F867 BA 03F5 mov dx,3F5h
F000:F86A EE out dx,al ; port 3F5h, dsk0 controlr data
F000:F86B E2 F2 loop locloop_361 ; Loop if cx > 0
F000:F86D EB 05 jmp short loc_363 ; (F874)
F000:F86F 90 db 90h
F000:F870 locloop_362: ; xref F000:F864, F871
F000:F870 58 pop ax
F000:F871 E2 FD loop locloop_362 ; Loop if cx > 0
F000:F873 F9 stc ; Set carry flag
F000:F874 loc_363: ; xref F000:F86D
F000:F874 53 push bx
F000:F875 C3 retn
sub_55 endp
;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
; SUBROUTINE
;
; Called from: F000:E3AD, E3B4, E3BB, ED9A, EDBA
;▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
sub_56 proc near
F000:F876 B0 01 mov al,1
F000:F878 88 56 04 mov [bp+4],dl
F000:F87B 88 6E 03 mov [bp+3],ch
F000:F87E C6 46 07 02 mov byte ptr [bp+7],2
F000:F882 80 FA 00 cmp dl,0
F000:F885 74 10 je loc_364 ; Jump if equal
F000:F887 B0 02 mov al,2
F000:F889 80 FA 01 cmp dl,1
F000:F88C 74 09 je loc_364 ; Jump if equal
F000:F88E B0 04 mov al,4
F000:F890 80 FA 02 cmp dl,2
F000:F893 74 02 je loc_364 ; Jump if equal
F000:F895 B0 08 mov al,8
F000:F897 loc_364: ; xref F000:F885, F88C, F893
F000:F897 84 06 003E test al,ds:data_27e ; (C000:003E=52h)
F000:F89B 75 23 jnz loc_365 ; Jump if not zero
F000:F89D 08 06 003E or ds:data_27e,al ; (C000:003E=52h)
F000:F8A1 8A 5E 04 mov bl,[bp+4]
F000:F8A4 53 push bx
F000:F8A5 BB 0007 mov bx,7
bios.lst BIOS ROM Analysis Sourcer Listing v2.15 27-Nov-89 7:47 pm Page 92
F000:F8A8 53 push bx
F000:F8A9 BB 0002 mov bx,2
F000:F8AC 53 push bx
F000:F8AD E8 FFAD call sub_55 ; (F85D)
F000:F8B0 72 55 jc loc_370 ; Jump if carry Set
F000:F8B2 E8 F5FB call sub_25 ; (EEB0)
F000:F8B5 72 50 jc loc_370 ; Jump if carry Set
F000:F8B7 A0 0042 mov al,ds:data_30e ; (C000:0042=53h)
F000:F8BA 24 60 and al,60h ; '`'
F000:F8BC 3C 60 cmp al,60h ; '`'
F000:F8BE 74 23 je loc_366 ; Jump if equal
F000:F8C0 loc_365: ; xref F000:F89B
F000:F8C0 8A 5E 03 mov bl,[bp+3]
F000:F8C3 53 push bx
F000:F8C4 8A 5E 04 mov bl,[bp+4]
F000:F8C7 53 push bx
F000:F8C8 BB 000F mov bx,0Fh
F000:F8CB 53 push bx
F000:F8CC BB 0003 mov bx,3
F000:F8CF 53 push bx
F000:F8D0 E8 FF8A call sub_55 ; (F85D)
F000:F8D3 72 32 jc loc_370 ; Jump if carry Set
F000:F8D5 E8 F5D8 call sub_25 ; (EEB0)
F000:F8D8 72 2D jc loc_370 ; Jump if carry Set
F000:F8DA A0 0042 mov al,ds:data_30e ; (C000:0042=53h)
F000:F8DD 24 60 and al,60h ; '`'
F000:F8DF 3C 60 cmp al,60h ; '`'
F000:F8E1 75 09 jne loc_367 ; Jump if not equal
F000:F8E3 loc_366: ; xref F000:F8BE
F000:F8E3 80 0E 0041 40 or byte ptr ds:data_29e,40h ; (C000:0041=49h) '@'
F000:F8E8 F9 stc ; Set carry flag
F000:F8E9 EB 1C jmp short loc_370 ; (F907)
F000:F8EB 90 db 90h
F000:F8EC loc_367: ; xref F000:F8E1
F000:F8EC E8 F619 call sub_28 ; (EF08)
F000:F8EF 26: 8A 4D 09 mov cl,es:[di+9]
F000:F8F3 B5 00 mov ch,0
F000:F8F5 80 F9 00 cmp cl,0
F000:F8F8 74 10 je loc_ret_371 ; Jump if equal
F000:F8FA locloop_368: ; xref F000:F901
F000:F8FA BB 00E4 mov bx,0E4h
F000:F8FD loc_369: ; xref F000:F8FF
F000:F8FD 4B dec bx
F000:F8FE 90 nop
F000:F8FF 75 FC jnz loc_369 ; Jump if not zero
F000:F901 E2 F7 loop locloop_368 ; Loop if cx > 0
F000:F903 F8 clc ; Clear carry flag
F000:F904 EB 04 jmp short loc_ret_371 ; (F90A)
F000:F906 90 db 90h
F000:F907 loc_370: ; xref F000:F8B0, F8B5, F8D3, F8D8
; F8E9
F000:F907 E8 F60C call sub_29 ; (EF16)
F000:F90A loc_ret_371: ; xref F000:F8F8, F904
F000:F90A C3 retn
bios.lst BIOS ROM Analysis Sourcer Listing v2.15 27-Nov-89 7:47 pm Page 93
sub_56 endp
; ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ int 17h ▒▒▒▒▒
;
; PRINTER SERVICES
;
; Call with: ah = function code
; dx = printer number 0-2 (some systems allow 0-3)
;
; Returns: ah = status bits
; 7 6 5 4 3 2 1 0
; not acknow- no select I/O unused no
; busy ledge paper error response
; __________from printer__________
;
; Functions:
; ah = 0 Send character to printer, al = character
; ah = 1 Printer port initialization
; ah = 2 Get printer status in ah
F000:F90B int_17h_printer proc near ; xref F000:FF21
F000:F90B FB sti ; Enable interrupts
F000:F90C 52 push dx
F000:F90D 56 push si
F000:F90E 53 push bx
F000:F90F 51 push cx
F000:F910 1E push ds
F000:F911 80 FC 02 cmp ah,2
F000:F914 77 20 ja loc_372 ; Jump if above
F000:F916 E8 0062 call sub_57 ; (F97B)
F000:F919 8B DA mov bx,dx
F000:F91B 03 DB add bx,bx
F000:F91D 8B 97 0008 mov dx,[bx+8]
nop ;*Fixup for MASM (M)
F000:F921 23 D2 and dx,dx
F000:F923 74 11 jz loc_372 ; Jump if zero
F000:F925 50 push ax
F000:F926 8A C4 mov al,ah
F000:F928 32 E4 xor ah,ah ; Zero register
F000:F92A 03 C0 add ax,ax
F000:F92C 8B F0 mov si,ax
F000:F92E 58 pop ax
F000:F92F 8A E0 mov ah,al
F000:F931 2E: FF A4 F975 jmp word ptr cs:data_47[si] ;*(F000:F975=0F93Ch) 3 entries
F000:F936 loc_372: ; xref F000:F914, F923, F956
F000:F936 1F pop ds
F000:F937 59 pop cx
F000:F938 5B pop bx
F000:F939 5E pop si
F000:F93A 5A pop dx
F000:F93B CF iret ; Interrupt return
int_17h_printer endp
;───── Indexed Entry Point ────────────────────────────────────────────────
bios.lst BIOS ROM Analysis Sourcer Listing v2.15 27-Nov-89 7:47 pm Page 94
F000:F93C loc_373: ; xref F000:F932, F975
F000:F93C EE out dx,al ; port 378h, printer-2 data
F000:F93D 8A 7F 78 mov bh,[bx+78h]
F000:F940 42 inc dx
F000:F941 loc_374: ; xref F000:F94C
F000:F941 33 C9 xor cx,cx ; Zero register
F000:F943 locloop_375: ; xref F000:F948
F000:F943 EC in al,dx ; port 379h, printer-2 status
F000:F944 22 C0 and al,al
F000:F946 78 10 js loc_377 ; Jump if sign=1
F000:F948 E2 F9 loop locloop_375 ; Loop if cx > 0
F000:F94A FE CF dec bh
F000:F94C 75 F3 jnz loc_374 ; Jump if not zero
F000:F94E 0C 01 or al,1
F000:F950 24 F9 and al,0F9h
F000:F952 loc_376: ; xref F000:F966
F000:F952 34 48 xor al,48h ; 'H'
F000:F954 86 E0 xchg ah,al
F000:F956 EB DE jmp short loc_372 ; (F936)
F000:F958 loc_377: ; xref F000:F946
F000:F958 42 inc dx
F000:F959 B0 0D mov al,0Dh
F000:F95B EE out dx,al ; port 37Ah, printer-2 control
; al = 0Dh, strobe on
F000:F95C loc_378: ; xref F000:F973
F000:F95C B0 0C mov al,0Ch
F000:F95E EE out dx,al ; port 37Ah, printer-2 control
; al = 0Ch, init & strobe off
F000:F95F 83 EA 02 sub dx,2
;───── Indexed Entry Point ────────────────────────────────────────────────
F000:F962 loc_379: ; xref F000:F932, F979
F000:F962 42 inc dx
F000:F963 EC in al,dx ; port 379h, printer-2 status
F000:F964 24 F8 and al,0F8h
F000:F966 EB EA jmp short loc_376 ; (F952)
;───── Indexed Entry Point ────────────────────────────────────────────────
F000:F968 loc_380: ; xref F000:F932, F977
F000:F968 83 C2 02 add dx,2
F000:F96B B0 08 mov al,8
F000:F96D EE out dx,al ; port 37Ah, printer-2 control
; al = 8, initialize printer
F000:F96E B9 05DC mov cx,5DCh
F000:F971 locloop_381: ; xref F000:F971
F000:F971 E2 FE loop locloop_381 ; Loop if cx > 0
F000:F973 EB E7 jmp short loc_378 ; (F95C)
F000:F975 F93C data_47 dw offset loc_373 ; Data table (indexed access)
; xref F000:F932
F000:F977 F968 data_48 dw offset loc_380 ; xref F000:F932
bios.lst BIOS ROM Analysis Sourcer Listing v2.15 27-Nov-89 7:47 pm Page 95
F000:F979 F962 data_49 dw offset loc_379 ; xref F000:F932
;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
; SUBROUTINE
;
; Called from: F000:E144, E2CB, E6A8, E6F3, E742, E831, E9A4
; F073, F165, F843, F84F, F916, FE74, FF7D
;▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
sub_57 proc near
F000:F97B 53 push bx
F000:F97C BB 0040 mov bx,seg seg_b
F000:F97F 8E DB mov ds,bx
F000:F981 5B pop bx
F000:F982 C3 retn
sub_57 endp
F000:F983 002E[00] db 46 dup (0)
F000:F9B1 0D 0A 0A 43 4F 4D db 0Dh, 0Ah, 0Ah, 'COMPUADD COMPUTER'
F000:F9B7 50 55 41 44 44 20
F000:F9BD 43 4F 4D 50 55 54
F000:F9C3 45 52
F000:F9C5 20 27 38 38 20 20 db ' ', 27h, '88 ', 0Dh, 0Ah, 0Dh
F000:F9CB 20 20 20 20 0D 0A
F000:F9D1 0D
F000:F9D2 0A 44 54 4B 2F 45 db 0Ah, 'DTK/ERSO/BIOS 2.38 (C) 1986'
F000:F9D8 52 53 4F 2F 42 49
F000:F9DE 4F 53 20 32 2E 33
F000:F9E4 38 20 28 43 29 20
F000:F9EA 31 39 38 36
F000:F9EE 0D 0A 0D 0A db 0Dh, 0Ah, 0Dh, 0Ah
F000:F9F2 00 2E 38 32 35 33 db 0, 2Eh, 38h, 32h, 35h, 33h
F000:F9F8 00 2E 4B 2D 42 20 db 0, 2Eh, 4Bh, 2Dh, 42h, 20h
F000:F9FE 00 2E 44 69 73 6B db 0, 2Eh, 44h, 69h, 73h, 6Bh
F000:FA04 00 db 0
;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
; SUBROUTINE
;
; Called from: F000:E7BB, E7E1, E807
;▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
sub_58 proc near
F000:FA05 8A BD 007C mov bh,rs232_timeout_1[di] ; (0040:007C=1)
F000:FA09 81 E6 0000 and si,0
nop ;*Fixup for MASM (M)
F000:FA0D loc_382: ; xref F000:FA1E
F000:FA0D 4E dec si
F000:FA0E 75 05 jnz loc_383 ; Jump if not zero
F000:FA10 FE CF dec bh
F000:FA12 F9 stc ; Set carry flag
F000:FA13 74 0B jz loc_ret_384 ; Jump if zero
F000:FA15 loc_383: ; xref F000:FA0E
F000:FA15 EC in al,dx ; port 2FDh, RS232-2 line stat
F000:FA16 86 E0 xchg ah,al
F000:FA18 8A C4 mov al,ah
F000:FA1A 22 C5 and al,ch
bios.lst BIOS ROM Analysis Sourcer Listing v2.15 27-Nov-89 7:47 pm Page 96
F000:FA1C 3A E8 cmp ch,al
F000:FA1E 75 ED jne loc_382 ; Jump if not equal
F000:FA20 loc_ret_384: ; xref F000:FA13
F000:FA20 C3 retn
sub_58 endp
;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
; SUBROUTINE
;
; Called from: F000:E6E2, EA39, EB14, EC01
;▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
sub_59 proc near
F000:FA21 B0 20 mov al,20h ; ' '
F000:FA23 E6 20 out 20h,al ; port 20h, 8259-1 int command
; al = 20h, end of interrupt
F000:FA25 C3 retn
sub_59 endp
F000:FA26 loc_385: ; xref F000:EB63
F000:FA26 50 push ax
F000:FA27 51 push cx
F000:FA28 52 push dx
F000:FA29 53 push bx
F000:FA2A 8A EA mov ch,dl
F000:FA2C 80 E5 0C and ch,0Ch
F000:FA2F 80 ED 0C sub ch,0Ch
F000:FA32 75 1C jnz loc_388 ; Jump if not zero
F000:FA34 E4 61 in al,61h ; port 61h, 8255 port B, read
F000:FA36 A8 04 test al,4
F000:FA38 75 07 jnz loc_386 ; Jump if not zero
F000:FA3A 0C 04 or al,4
F000:FA3C B9 0005 mov cx,5
F000:FA3F EB 05 jmp short loc_387 ; (FA46)
F000:FA41 loc_386: ; xref F000:FA38
F000:FA41 24 FB and al,0FBh
F000:FA43 B9 0607 mov cx,607h
F000:FA46 loc_387: ; xref F000:FA3F
F000:FA46 E6 61 out 61h,al ; port 61h, 8255 B - spkr, etc
; al = 0, disable parity
F000:FA48 32 C0 xor al,al ; Zero register
F000:FA4A B4 01 mov ah,1
F000:FA4C CD 10 int 10h ; Video display ah=functn 01h
; set cursor mode in cx
F000:FA4E E6 C0 out 0C0h,al ; port 0C0h, DMA-2 bas&add ch 0
F000:FA50 loc_388: ; xref F000:FA32
F000:FA50 5B pop bx
F000:FA51 5A pop dx
F000:FA52 59 pop cx
F000:FA53 58 pop ax
F000:FA54 E9 F10F jmp loc_162 ; (EB66)
; ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ unused ▒▒▒▒▒
;
bios.lst BIOS ROM Analysis Sourcer Listing v2.15 27-Nov-89 7:47 pm Page 97
; Unused interrupt vector termination
;
; This routine processes invalid and unused interrupt requests. The
; hardware IRQ number is loaded into gen_int_occured, and the interrupt
; cleared. For software calls to an unused interrupt, a value 0FFh is
; loaded into gen_int_occured, and the routine returns to the caller
; without changing registers.
;
; Alternatively, some systems simply return (iret).
F000:FA57 int_unused proc near ; xref F000:FF07, FF09, FF0B, FF0D
; FF11
F000:FA57 50 push ax
F000:FA58 52 push dx
F000:FA59 BA 0020 mov dx,20h
F000:FA5C E8 04D5 call sub_61 ; (FF34)
F000:FA5F 5A pop dx
F000:FA60 58 pop ax
F000:FA61 CF iret ; Interrupt return
int_unused endp
F000:FA62 000C[00] db 12 dup (0)
F000:FA6E 00 00 00 00 00 00 video_char_tbl db 0, 0, 0, 0, 0, 0 ; Video characters in graphic modes
F000:FA74 00 00 7E 81 A5 81 db 0, 0, 7Eh, 81h, 0A5h, 81h
F000:FA7A A5 BD 81 7E 7E FF db 0A5h, 0BDh, 81h, 7Eh, 7Eh, 0FFh
F000:FA80 DB FF DB C3 FF 7E db 0DBh, 0FFh, 0DBh, 0C3h, 0FFh, 7Eh
F000:FA86 36 7F 7F 7F 3E 1C db 36h, 7Fh, 7Fh, 7Fh, 3Eh, 1Ch
F000:FA8C 08 00 08 1C 3E 7F db 8, 0, 8, 1Ch, 3Eh, 7Fh
F000:FA92 3E 1C 08 00 1C 3E db 3Eh, 1Ch, 8, 0, 1Ch, 3Eh
F000:FA98 1C 7F 7F 3E 1C 3E db 1Ch, 7Fh, 7Fh, 3Eh, 1Ch, 3Eh
F000:FA9E 08 08 1C 3E 7F 3E db 8, 8, 1Ch, 3Eh, 7Fh, 3Eh
F000:FAA4 1C 3E 00 00 18 3C db 1Ch, 3Eh, 0, 0, 18h, 3Ch
F000:FAAA 3C 18 00 00 FF FF db 3Ch, 18h, 0, 0, 0FFh, 0FFh
F000:FAB0 E7 C3 C3 E7 FF FF db 0E7h, 0C3h, 0C3h, 0E7h, 0FFh, 0FFh
F000:FAB6 00 3C 66 42 42 66 db 0, 3Ch, 66h, 42h, 42h, 66h
F000:FABC 3C 00 FF C3 99 BD db 3Ch, 0, 0FFh, 0C3h, 99h, 0BDh
F000:FAC2 BD 99 C3 FF 1F 07 db 0BDh, 99h, 0C3h, 0FFh, 1Fh, 7
F000:FAC8 0F 79 CC CC CC 78 db 0Fh, 79h, 0CCh, 0CCh, 0CCh, 78h
F000:FACE 3C 66 66 66 3C 18 db 3Ch, 66h, 66h, 66h, 3Ch, 18h
F000:FAD4 7E 18 1C 1E 19 1B db 7Eh, 18h, 1Ch, 1Eh, 19h, 1Bh
F000:FADA 3A 70 F0 E0 7F 63 db 3Ah, 70h, 0F0h, 0E0h, 7Fh, 63h
F000:FAE0 7F 63 E3 E7 C7 06 db 7Fh, 63h, 0E3h, 0E7h, 0C7h, 6
F000:FAE6 99 5A 3C E7 E7 3C db 99h, 5Ah, 3Ch, 0E7h, 0E7h, 3Ch
F000:FAEC 5A 99 40 70 7C 7F db 5Ah, 99h, 40h, 70h, 7Ch, 7Fh
F000:FAF2 7C 70 40 00 01 07 db 7Ch, 70h, 40h, 0, 1, 7
F000:FAF8 1F 7F 1F 07 01 00 db 1Fh, 7Fh, 1Fh, 7, 1, 0
F000:FAFE 18 3C 7E 18 18 7E db 18h, 3Ch, 7Eh, 18h, 18h, 7Eh
F000:FB04 3C 18 66 66 66 66 db 3Ch, 18h, 66h, 66h, 66h, 66h
F000:FB0A 66 00 66 00 7F DB db 66h, 0, 66h, 0, 7Fh, 0DBh
F000:FB10 DB 7B 1B 1B 19 00 db 0DBh, 7Bh, 1Bh, 1Bh, 19h, 0
F000:FB16 1E 31 1C 36 36 1C db 1Eh, 31h, 1Ch, 36h, 36h, 1Ch
F000:FB1C 46 3C 00 00 00 7E db 46h, 3Ch, 0, 0, 0, 7Eh
F000:FB22 7E 7E 00 00 18 3C db 7Eh, 7Eh, 0, 0, 18h, 3Ch
F000:FB28 7E 18 7E 3C 18 FF db 7Eh, 18h, 7Eh, 3Ch, 18h, 0FFh
F000:FB2E 0C 1E 3F 0C 0C 0C db 0Ch, 1Eh, 3Fh, 0Ch, 0Ch, 0Ch
F000:FB34 0C 00 0C 0C 0C 0C db 0Ch, 0, 0Ch, 0Ch, 0Ch, 0Ch
F000:FB3A 3F 1E 0C 00 00 0C db 3Fh, 1Eh, 0Ch, 0, 0, 0Ch
bios.lst BIOS ROM Analysis Sourcer Listing v2.15 27-Nov-89 7:47 pm Page 98
F000:FB40 06 7F 06 0C 00 00 db 6, 7Fh, 6, 0Ch, 0, 0
F000:FB46 00 18 30 7F 30 18 db 0, 18h, 30h, 7Fh, 30h, 18h
F000:FB4C 00 00 00 00 60 60 db 0, 0, 0, 0, 60h, 60h
F000:FB52 60 7F 00 00 00 00 db 60h, 7Fh, 0, 0, 0, 0
F000:FB58 24 66 FF 66 24 00 db 24h, 66h, 0FFh, 66h, 24h, 0
F000:FB5E 00 00 18 3C 7F FF db 0, 0, 18h, 3Ch, 7Fh, 0FFh
F000:FB64 FF 00 00 00 FF FF db 0FFh, 0, 0, 0, 0FFh, 0FFh
F000:FB6A 7E 3C 18 00 00 00 db 7Eh, 3Ch, 18h, 0, 0, 0
F000:FB70 00 00 00 00 00 00 db 0, 0, 0, 0, 0, 0
F000:FB76 18 3C 3C 18 18 00 db 18h, 3Ch, 3Ch, 18h, 18h, 0
F000:FB7C 18 00 36 36 36 00 db 18h, 0, 36h, 36h, 36h, 0
F000:FB82 00 00 00 00 36 36 db 0, 0, 0, 0, 36h, 36h
F000:FB88 7F 36 7F 36 36 00 db 7Fh, 36h, 7Fh, 36h, 36h, 0
F000:FB8E 0C 3F 68 3E 0B 7E db 0Ch, 3Fh, 68h, 3Eh, 0Bh, 7Eh
F000:FB94 18 08 62 66 0C 18 db 18h, 8, 62h, 66h, 0Ch, 18h
F000:FB9A 30 66 46 00 1C 36 db 30h, 66h, 46h, 0, 1Ch, 36h
F000:FBA0 1C 18 3D 66 3D 00 db 1Ch, 18h, 3Dh, 66h, 3Dh, 0
F000:FBA6 18 18 30 00 00 00 db 18h, 18h, 30h, 0, 0, 0
F000:FBAC 00 00 0C 18 30 30 db 0, 0, 0Ch, 18h, 30h, 30h
F000:FBB2 30 18 0C 00 30 18 db 30h, 18h, 0Ch, 0, 30h, 18h
F000:FBB8 0C 0C 0C 18 30 00 db 0Ch, 0Ch, 0Ch, 18h, 30h, 0
F000:FBBE 00 42 3C 7E 3C 42 db 0, 42h, 3Ch, 7Eh, 3Ch, 42h
F000:FBC4 00 00 00 18 18 7E db 0, 0, 0, 18h, 18h, 7Eh
F000:FBCA 18 18 00 00 00 00 db 18h, 18h, 0, 0, 0, 0
F000:FBD0 00 00 00 18 18 30 db 0, 0, 0, 18h, 18h, 30h
F000:FBD6 00 00 00 7E 00 00 db 0, 0, 0, 7Eh, 0, 0
F000:FBDC 00 00 00 00 00 00 db 0, 0, 0, 0, 0, 0
F000:FBE2 00 18 18 00 03 06 db 0, 18h, 18h, 0, 3, 6
F000:FBE8 0C 18 30 60 40 00 db 0Ch, 18h, 30h, 60h, 40h, 0
F000:FBEE 3E 67 6F 7B 73 63 db 3Eh, 67h, 6Fh, 7Bh, 73h, 63h
F000:FBF4 3E 00 0C 1C 0C 0C db 3Eh, 0, 0Ch, 1Ch, 0Ch, 0Ch
F000:FBFA 0C 0C 3F 00 3C 66 db 0Ch, 0Ch, 3Fh, 0, 3Ch, 66h
F000:FC00 06 1C 30 66 7E 00 db 6, 1Ch, 30h, 66h, 7Eh, 0
F000:FC06 3C 66 06 1C 06 66 db 3Ch, 66h, 6, 1Ch, 6, 66h
F000:FC0C 3C 00 0E 1E 36 66 db 3Ch, 0, 0Eh, 1Eh, 36h, 66h
F000:FC12 7F 06 06 00 7E 60 db 7Fh, 6, 6, 0, 7Eh, 60h
F000:FC18 7C 06 06 66 3C 00 db 7Ch, 6, 6, 66h, 3Ch, 0
F000:FC1E 3C 66 60 7C 66 66 db 3Ch, 66h, 60h, 7Ch, 66h, 66h
F000:FC24 3C 00 7E 66 06 0C db 3Ch, 0, 7Eh, 66h, 6, 0Ch
F000:FC2A 18 18 18 00 3C 66 db 18h, 18h, 18h, 0, 3Ch, 66h
F000:FC30 66 3C 66 66 3C 00 db 66h, 3Ch, 66h, 66h, 3Ch, 0
F000:FC36 3C 66 66 3E 06 66 db 3Ch, 66h, 66h, 3Eh, 6, 66h
F000:FC3C 3C 00 00 18 18 00 db 3Ch, 0, 0, 18h, 18h, 0
F000:FC42 00 18 18 00 00 18 db 0, 18h, 18h, 0, 0, 18h
F000:FC48 18 00 00 18 18 30 db 18h, 0, 0, 18h, 18h, 30h
F000:FC4E 0C 18 30 60 30 18 db 0Ch, 18h, 30h, 60h, 30h, 18h
F000:FC54 0C 00 00 00 7E 00 db 0Ch, 0, 0, 0, 7Eh, 0
F000:FC5A 7E 00 00 00 30 18 db 7Eh, 0, 0, 0, 30h, 18h
F000:FC60 0C 06 0C 18 30 00 db 0Ch, 6, 0Ch, 18h, 30h, 0
F000:FC66 3C 66 66 0C 18 00 db 3Ch, 66h, 66h, 0Ch, 18h, 0
F000:FC6C 18 00 3E 63 6F 6B db 18h, 0, 3Eh, 63h, 6Fh, 6Bh
F000:FC72 6F 60 3E 00 18 3C db 6Fh, 60h, 3Eh, 0, 18h, 3Ch
F000:FC78 66 66 7E 66 66 00 db 66h, 66h, 7Eh, 66h, 66h, 0
F000:FC7E 7E 33 33 3E 33 33 db 7Eh, 33h, 33h, 3Eh, 33h, 33h
F000:FC84 7E 00 1F 33 60 60 db 7Eh, 0, 1Fh, 33h, 60h, 60h
F000:FC8A 60 33 1E 00 7C 36 db 60h, 33h, 1Eh, 0, 7Ch, 36h
F000:FC90 33 33 33 36 7C 00 db 33h, 33h, 33h, 36h, 7Ch, 0
bios.lst BIOS ROM Analysis Sourcer Listing v2.15 27-Nov-89 7:47 pm Page 99
F000:FC96 7F 31 34 3C 34 31 db 7Fh, 31h, 34h, 3Ch, 34h, 31h
F000:FC9C 7F 00 7F 31 34 3C db 7Fh, 0, 7Fh, 31h, 34h, 3Ch
F000:FCA2 34 30 78 00 1F 33 db 34h, 30h, 78h, 0, 1Fh, 33h
F000:FCA8 60 60 67 33 1F 00 db 60h, 60h, 67h, 33h, 1Fh, 0
F000:FCAE 66 66 66 7E 66 66 db 66h, 66h, 66h, 7Eh, 66h, 66h
F000:FCB4 66 00 3C 18 18 18 db 66h, 0, 3Ch, 18h, 18h, 18h
F000:FCBA 18 18 3C 00 0F 06 db 18h, 18h, 3Ch, 0, 0Fh, 6
F000:FCC0 06 06 66 66 3C 00 db 6, 6, 66h, 66h, 3Ch, 0
F000:FCC6 7B 33 36 3C 36 33 db 7Bh, 33h, 36h, 3Ch, 36h, 33h
F000:FCCC 7B 00 78 30 30 30 db 7Bh, 0, 78h, 30h, 30h, 30h
F000:FCD2 31 33 7F 00 63 77 db 31h, 33h, 7Fh, 0, 63h, 77h
F000:FCD8 7F 7F 6B 63 63 00 db 7Fh, 7Fh, 6Bh, 63h, 63h, 0
F000:FCDE 63 73 7B 6F 67 63 db 63h, 73h, 7Bh, 6Fh, 67h, 63h
F000:FCE4 63 00 3E 63 63 63 db 63h, 0, 3Eh, 63h, 63h, 63h
F000:FCEA 63 63 3E 00 7E 33 db 63h, 63h, 3Eh, 0, 7Eh, 33h
F000:FCF0 33 3E 30 30 78 00 db 33h, 3Eh, 30h, 30h, 78h, 0
F000:FCF6 3C 66 66 66 66 3C db 3Ch, 66h, 66h, 66h, 66h, 3Ch
F000:FCFC 0F 00 7E 33 33 3E db 0Fh, 0, 7Eh, 33h, 33h, 3Eh
F000:FD02 3C 36 73 00 3C 66 db 3Ch, 36h, 73h, 0, 3Ch, 66h
F000:FD08 60 3C 06 66 3C 00 db 60h, 3Ch, 6, 66h, 3Ch, 0
F000:FD0E 7E 5A 18 18 18 18 db 7Eh, 5Ah, 18h, 18h, 18h, 18h
F000:FD14 3C 00 66 66 66 66 db 3Ch, 0, 66h, 66h, 66h, 66h
F000:FD1A 66 66 3C 00 66 66 db 66h, 66h, 3Ch, 0, 66h, 66h
F000:FD20 66 66 66 3C 18 00 db 66h, 66h, 66h, 3Ch, 18h, 0
F000:FD26 63 63 63 6B 7F 77 db 63h, 63h, 63h, 6Bh, 7Fh, 77h
F000:FD2C 22 00 63 63 36 1C db 22h, 0, 63h, 63h, 36h, 1Ch
F000:FD32 36 63 63 00 66 66 db 36h, 63h, 63h, 0, 66h, 66h
F000:FD38 66 3C 18 18 3C 00 db 66h, 3Ch, 18h, 18h, 3Ch, 0
F000:FD3E 7F 63 46 0C 19 33 db 7Fh, 63h, 46h, 0Ch, 19h, 33h
F000:FD44 7F 00 3C 30 30 30 db 7Fh, 0, 3Ch, 30h, 30h, 30h
F000:FD4A 30 30 3C 00 60 30 db 30h, 30h, 3Ch, 0, 60h, 30h
F000:FD50 18 0C 06 03 01 00 db 18h, 0Ch, 6, 3, 1, 0
F000:FD56 3C 0C 0C 0C 0C 0C db 3Ch, 0Ch, 0Ch, 0Ch, 0Ch, 0Ch
F000:FD5C 3C 00 08 1C 36 63 db 3Ch, 0, 8, 1Ch, 36h, 63h
F000:FD62 00 00 00 00 00 00 db 0, 0, 0, 0, 0, 0
F000:FD68 00 00 00 00 00 FF db 0, 0, 0, 0, 0, 0FFh
F000:FD6E 18 18 0C 00 00 00 db 18h, 18h, 0Ch, 0, 0, 0
F000:FD74 00 00 00 00 3C 06 db 0, 0, 0, 0, 3Ch, 6
F000:FD7A 3E 26 3B 00 70 30 db 3Eh, 26h, 3Bh, 0, 70h, 30h
F000:FD80 30 3E 33 33 3E 00 db 30h, 3Eh, 33h, 33h, 3Eh, 0
F000:FD86 00 00 3C 66 60 62 db 0, 0, 3Ch, 66h, 60h, 62h
F000:FD8C 3C 00 0E 06 06 3E db 3Ch, 0, 0Eh, 6, 6, 3Eh
F000:FD92 66 66 3E 00 00 00 db 66h, 66h, 3Eh, 0, 0, 0
F000:FD98 3C 66 7E 60 3C 00 db 3Ch, 66h, 7Eh, 60h, 3Ch, 0
F000:FD9E 1C 36 30 78 30 30 db 1Ch, 36h, 30h, 78h, 30h, 30h
F000:FDA4 78 00 00 00 3E 66 db 78h, 0, 0, 0, 3Eh, 66h
F000:FDAA 66 3E 06 7C 70 30 db 66h, 3Eh, 6, 7Ch, 70h, 30h
F000:FDB0 36 3F 33 33 73 00 db 36h, 3Fh, 33h, 33h, 73h, 0
F000:FDB6 18 00 38 18 18 18 db 18h, 0, 38h, 18h, 18h, 18h
F000:FDBC 3C 00 06 00 06 06 db 3Ch, 0, 6, 0, 6, 6
F000:FDC2 06 66 66 3C 70 30 db 6, 66h, 66h, 3Ch, 70h, 30h
F000:FDC8 33 36 3C 36 73 00 db 33h, 36h, 3Ch, 36h, 73h, 0
F000:FDCE 38 18 18 18 18 18 db 38h, 18h, 18h, 18h, 18h, 18h
F000:FDD4 3C 00 00 00 66 7F db 3Ch, 0, 0, 0, 66h, 7Fh
F000:FDDA 6B 6B 63 00 00 00 db 6Bh, 6Bh, 63h, 0, 0, 0
F000:FDE0 7C 7E 66 66 66 00 db 7Ch, 7Eh, 66h, 66h, 66h, 0
F000:FDE6 00 00 3C 66 66 66 db 0, 0, 3Ch, 66h, 66h, 66h
bios.lst BIOS ROM Analysis Sourcer Listing v2.15 27-Nov-89 7:47 pm Page 100
F000:FDEC 3C 00 00 00 7E 33 db 3Ch, 0, 0, 0, 7Eh, 33h
F000:FDF2 33 3E 30 78 00 00 db 33h, 3Eh, 30h, 78h, 0, 0
F000:FDF8 3E 66 66 3E 06 0F db 3Eh, 66h, 66h, 3Eh, 6, 0Fh
F000:FDFE 00 00 6F 3B 30 30 db 0, 0, 6Fh, 3Bh, 30h, 30h
F000:FE04 78 00 00 00 3E 60 db 78h, 0, 0, 0, 3Eh, 60h
F000:FE0A 3C 06 7C 00 18 18 db 3Ch, 6, 7Ch, 0, 18h, 18h
F000:FE10 7E 18 18 1B 0E 00 db 7Eh, 18h, 18h, 1Bh, 0Eh, 0
F000:FE16 00 00 66 66 66 66 db 0, 0, 66h, 66h, 66h, 66h
F000:FE1C 3B 00 00 00 66 66 db 3Bh, 0, 0, 0, 66h, 66h
F000:FE22 66 3C 18 00 00 00 db 66h, 3Ch, 18h, 0, 0, 0
F000:FE28 63 63 6B 7F 36 00 db 63h, 63h, 6Bh, 7Fh, 36h, 0
F000:FE2E 00 00 63 36 1C 36 db 0, 0, 63h, 36h, 1Ch, 36h
F000:FE34 63 00 00 00 E6 66 db 63h, 0, 0, 0, 0E6h, 66h
F000:FE3A 66 3E 06 7C 00 00 db 66h, 3Eh, 6, 7Ch, 0, 0
F000:FE40 7E 4C 18 32 7E 00 db 7Eh, 4Ch, 18h, 32h, 7Eh, 0
F000:FE46 0E 18 18 70 18 18 db 0Eh, 18h, 18h, 70h, 18h, 18h
F000:FE4C 0E 00 18 18 18 00 db 0Eh, 0, 18h, 18h, 18h, 0
F000:FE52 18 18 18 00 70 18 db 18h, 18h, 18h, 0, 70h, 18h
F000:FE58 18 0E 18 18 70 00 db 18h, 0Eh, 18h, 18h, 70h, 0
F000:FE5E 31 49 46 00 00 00 db 31h, 49h, 46h, 0, 0, 0
F000:FE64 00 00 00 D8 1C 36 db 0, 0, 0, 0D8h, 1Ch, 36h
F000:FE6A 63 63 7F 00 db 63h, 63h, 7Fh, 0
; ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ int 1Ah ▒▒▒▒▒
;
; REAL-TIME CLOCK SERVICES
;
; Call with: ah = sub-function number
;
; Functions:
; ah = 0 Get system timer (increments every 54.92 ms from int 8)
; Returns: al = # of 24 hour periods since read/powered up
; cx:dx = 32 bit count
; ah = 1 Get system timer & reset 24 hour counter
; Returns: cx:dx = 32 bit count
;
; **** System must have CMOS clock for services 2-0Bh ****
; ah = 2 Get time in BCD format
; Returns: ch/cl = hours/minutes
; dh = seconds
; dl = 0/1 if daylight savings time operation off/on
; carry flag = 0 if clock ok, 1 if stopped
; ah = 3 Set time in BCD format
; Call with: ch/cl = hours/minutes
; dh = seconds
; dl = 0/1 if daylight savings time operation off/on
; ah = 4 Get date in BCD format
; Returns: cx = four digit year
; dh/dl = month/day
; carry flag = 0 if clock ok, 1 if stopped
; ah = 5 Set date in BCD format
; Call with: cx = four digit year
; dh/dl = month/day
; ah = 6 Set 24 hour alarm (alarm vectors to int 4Ah)
; Call with: ch/cl = hours/minutes
; dh = seconds
bios.lst BIOS ROM Analysis Sourcer Listing v2.15 27-Nov-89 7:47 pm Page 101
; ah = 7 Clear alarm
; ah = 9 Get alarm time & status
; Returns: ch/cl = hours/minutes
; dh = seconds
; dl = 0/1 alarm off/on
; ah = 0Ah Get days counter
; Returns: cx = number of days since 1-Jan-80
; ah = 0Bh Set days counter
; Call with: cx = number of days since 1-Jan-80
F000:FE6E int_1Ah_RTC proc near ; xref F000:FF27
F000:FE6E 80 FC 02 cmp ah,2
F000:FE71 73 28 jae loc_ret_399 ; Jump if above or =
F000:FE73 1E push ds
F000:FE74 E8 FB04 call sub_57 ; (F97B)
F000:FE77 56 push si
F000:FE78 BE 006C mov si,6Ch
F000:FE7B 80 FC 00 cmp ah,0
F000:FE7E FA cli ; Disable interrupts
F000:FE7F 75 0E jnz loc_397 ; Jump if not zero
F000:FE81 8B 14 mov dx,[si]
F000:FE83 8B 4C 02 mov cx,[si+2]
F000:FE86 8A 44 04 mov al,[si+4]
F000:FE89 C6 44 04 00 mov byte ptr [si+4],0
F000:FE8D EB 09 jmp short loc_398 ; (FE98)
F000:FE8F loc_397: ; xref F000:FE7F
F000:FE8F 89 14 mov [si],dx
F000:FE91 89 4C 02 mov [si+2],cx
F000:FE94 C6 44 04 00 mov byte ptr [si+4],0
F000:FE98 loc_398: ; xref F000:FE8D
F000:FE98 FB sti ; Enable interrupts
F000:FE99 5E pop si
F000:FE9A 1F pop ds
F000:FE9B loc_ret_399: ; xref F000:FE71
F000:FE9B CF iret ; Interrupt return
int_1Ah_RTC endp
F000:FE9C 0009[00] db 9 dup (0)
F000:FEA5 EA A4 E6 00 F0 0D db 0EAh, 0A4h, 0E6h, 0, 0F0h, 0Dh
F000:FEAB 0A 00 20 00 00 00 db 0Ah, 0, 20h, 0, 0, 0
F000:FEB1 00 40 DE db 0, 40h, 0DEh
F000:FEB4 37 50 2D 43 4B 20 db '7P-CK 2(IO)'
F000:FEBA 32 28 49 4F 29
F000:FEBF 00 db 0
F000:FEC0 50 2D 43 4B 20 31 db 'P-CK 1(M)'
F000:FEC6 28 4D 29
F000:FEC9 00 db 0
F000:FECA 20 50 2D 43 4B 20 db ' P-CK Error !'
F000:FED0 45 72 72 6F 72 20
F000:FED6 21
F000:FED7 07 0A 0D 00 db 7, 0Ah, 0Dh, 0
;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
; SUBROUTINE
;
; Called from: F000:E51C, E73F, E82E, E987, EC5A, F06B, FF54
bios.lst BIOS ROM Analysis Sourcer Listing v2.15 27-Nov-89 7:47 pm Page 102
;▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
sub_60 proc near
F000:FEDB FB sti ; Enable interrupts
F000:FEDC 53 push bx
F000:FEDD 51 push cx
F000:FEDE 52 push dx
F000:FEDF 57 push di
F000:FEE0 56 push si
F000:FEE1 55 push bp
F000:FEE2 1E push ds
F000:FEE3 06 push es
F000:FEE4 8B FC mov di,sp
F000:FEE6 36: 8B 75 10 mov si,ss:[di+10h]
F000:FEEA 56 push si
F000:FEEB C3 retn
sub_60 endp
F000:FEEC 0007[00] db 7 dup (0)
F000:FEF3 33 FF 33 FF 55 E5 db 33h, 0FFh, 33h, 0FFh, 55h, 0E5h
F000:FEF9 33 FF 33 FF 54 FF db 33h, 0FFh, 33h, 0FFh, 54h, 0FFh
F000:FEFF 33 FF 33 FF db 33h, 0FFh, 33h, 0FFh
F000:FF03 E6A4 int_vec_table dw offset int_8_timer ; Initial interrupt vectors
F000:FF05 E987 dw offset int_9_keyboard
F000:FF07 FA57 dw offset int_unused
F000:FF09 FA57 dw offset int_unused
F000:FF0B FA57 dw offset int_unused
F000:FF0D FA57 dw offset int_unused
F000:FF0F EF57 dw offset int_0Eh_floppy
F000:FF11 FA57 dw offset int_unused
F000:FF13 F065 dw offset int_10h_video
F000:FF15 F84D dw offset int_11h_equip
F000:FF17 F841 dw offset int_12h_memsiz
F000:FF19 EC59 dw offset int_13h_floppy
F000:FF1B E739 dw offset int_14h_RS232
F000:FF1D F859 dw offset int_15h_servics
F000:FF1F E82E dw offset int_16h_keybd
F000:FF21 F90B dw offset int_17h_printer
F000:FF23 0000 dw 0
F000:FF25 E6F2 dw offset int_19h_bootup
F000:FF27 FE6E dw offset int_1Ah_RTC
F000:FF29 FF33 dw offset int_return
F000:FF2B FF33 dw offset int_return
F000:FF2D F0A4 int_data_table dw offset video_hdwr_tbl1
F000:FF2F EFC7 dw offset dsk_info_1
F000:FF31 FF33 video_ptr dw 0FF33h
;██████████████████████████████████████████████████████████████████████████
;
; External Entry Point
;
;██████████████████████████████████████████████████████████████████████████
F000:FF33 int_return proc near ; xref F000:FF29, FF2B
F000:FF33 CF iret ; Interrupt return
int_return endp
bios.lst BIOS ROM Analysis Sourcer Listing v2.15 27-Nov-89 7:47 pm Page 103
;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
; SUBROUTINE
;
; Called from: F000:FA5C
;▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
sub_61 proc near
F000:FF34 B0 0B mov al,0Bh
F000:FF36 EE out dx,al ; port 20h, 8259-1 int command
F000:FF37 25 0000 and ax,0
F000:FF3A 50 push ax
F000:FF3B 58 pop ax
F000:FF3C EC in al,dx ; port 20h, 8259-1 int IRR/ISR
F000:FF3D 02 E0 add ah,al
F000:FF3F 50 push ax
F000:FF40 58 pop ax
F000:FF41 42 inc dx
F000:FF42 EC in al,dx ; port 21h, 8259-1 int IMR
F000:FF43 0A C4 or al,ah
F000:FF45 50 push ax
F000:FF46 58 pop ax
F000:FF47 EE out dx,al ; port 21h, 8259-1 int comands
F000:FF48 4A dec dx
F000:FF49 90 nop
F000:FF4A B0 20 mov al,20h ; ' '
F000:FF4C EE out dx,al ; port 20h, 8259-1 int command
; al = 20h, end of interrupt
F000:FF4D C3 retn
sub_61 endp
F000:FF4E 00 00 00 00 00 CF db 0, 0, 0, 0, 0, 0CFh
; ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ int 5 ▒▒▒▒▒▒▒
;
; PRINT SCREEN
;
; Send the present active display screen contents to the printer if
; the printer is idle and not out of paper. The status of the print
; screen function is in prn_screen_stat at 0050:0000. Control-Break
; will terminate an active print screen operation.
F000:FF54 int_5_prn_scrn proc near
F000:FF54 E8 FF84 call sub_60 ; (FEDB)
F000:FF57 BB 0050 mov bx,seg seg_c
F000:FF5A 8E C3 mov es,bx
F000:FF5C BD 0000 mov bp,0
F000:FF5F 26: F6 46 00 80 test byte ptr es:[bp],80h
F000:FF64 75 07 jnz loc_400 ; Jump if not zero
F000:FF66 26: 80 7E 00 00 cmp byte ptr es:[bp],0
F000:FF6B 75 6E jne loc_405 ; Jump if not equal
F000:FF6D loc_400: ; xref F000:FF64
F000:FF6D 26: C6 46 00 01 mov byte ptr es:[bp],1
F000:FF72 50 push ax
F000:FF73 B0 0A mov al,0Ah
F000:FF75 E8 0066 call sub_62 ; (FFDE)
bios.lst BIOS ROM Analysis Sourcer Listing v2.15 27-Nov-89 7:47 pm Page 104
F000:FF78 B0 0D mov al,0Dh
F000:FF7A E8 0061 call sub_62 ; (FFDE)
F000:FF7D E8 F9FB call sub_57 ; (F97B)
F000:FF80 8A 3E 0062 mov bh,video_page ; (0040:0062=0)
F000:FF84 E8 F695 call sub_50 ; (F61C)
F000:FF87 32 ED xor ch,ch ; Zero register
F000:FF89 8B 3D mov di,[di]
F000:FF8B BA 0000 mov dx,0
F000:FF8E loc_401: ; xref F000:FFB6, FFCE
F000:FF8E 8B F2 mov si,dx
F000:FF90 B4 02 mov ah,2
F000:FF92 CD 10 int 10h ; Video display ah=functn 02h
; set cursor location in dx
F000:FF94 B4 08 mov ah,8
F000:FF96 CD 10 int 10h ; Video display ah=functn 08h
; get char al & attrib ah @curs
F000:FF98 B4 00 mov ah,0
F000:FF9A 3C 00 cmp al,0
F000:FF9C 75 02 jne loc_402 ; Jump if not equal
F000:FF9E B0 20 mov al,20h ; ' '
F000:FFA0 loc_402: ; xref F000:FF9C
F000:FFA0 E8 003B call sub_62 ; (FFDE)
F000:FFA3 F6 C4 29 test ah,29h ; ')'
F000:FFA6 74 05 jz loc_403 ; Jump if zero
F000:FFA8 FE CD dec ch
F000:FFAA EB 24 jmp short loc_404 ; (FFD0)
F000:FFAC 90 db 90h
F000:FFAD loc_403: ; xref F000:FFA6
F000:FFAD 8B D6 mov dx,si
F000:FFAF 80 C2 01 add dl,1
F000:FFB2 3A 16 004A cmp dl,byte ptr video_columns ; (0040:004A=50h)
F000:FFB6 75 D6 jne loc_401 ; Jump if not equal
F000:FFB8 B2 00 mov dl,0
F000:FFBA 8B F2 mov si,dx
F000:FFBC B0 0A mov al,0Ah
F000:FFBE E8 001D call sub_62 ; (FFDE)
F000:FFC1 B0 0D mov al,0Dh
F000:FFC3 E8 0018 call sub_62 ; (FFDE)
F000:FFC6 8B D6 mov dx,si
F000:FFC8 80 C6 01 add dh,1
F000:FFCB 80 FE 19 cmp dh,19h
F000:FFCE 75 BE jne loc_401 ; Jump if not equal
F000:FFD0 loc_404: ; xref F000:FFAA
F000:FFD0 8B D7 mov dx,di
F000:FFD2 B4 02 mov ah,2
F000:FFD4 CD 10 int 10h ; Video display ah=functn 02h
; set cursor location in dx
F000:FFD6 58 pop ax
F000:FFD7 26: 88 6E 00 mov es:[bp],ch
F000:FFDB loc_405: ; xref F000:FF6B
F000:FFDB E9 F4A5 jmp loc_296 ; (F483)
int_5_prn_scrn endp
;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
; SUBROUTINE
;
bios.lst BIOS ROM Analysis Sourcer Listing v2.15 27-Nov-89 7:47 pm Page 105
; Called from: F000:FF75, FF7A, FFA0, FFBE, FFC3
;▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
sub_62 proc near
F000:FFDE B4 00 mov ah,0
F000:FFE0 BA 0000 mov dx,0
F000:FFE3 CD 17 int 17h ; Printer dx=prn#, ah=func 10h
; print char in al
F000:FFE5 C3 retn
sub_62 endp
F000:FFE6 000A[90] db 10 dup (90h)
; ══════ BIOS EXTERNAL ENTRY POINT ═══════════════════════════════════════
F000:FFF0 power_on_reset:
F000:FFF0 EA F000:E05B jmp far ptr system_reset ; (E05B)
F000:FFF5 30 31 2F 30 31 2F rom_versn_date db '01/01/81T' ; BIOS version date code
F000:FFFB 38 31 54
F000:FFFE FE model_type db 0FEh ; Model FFh = PC
; FEh = 1st XT
; FBh = later XTs
; FCh = AT type (286/386)
; FAh = models 25/30
; F9h = IBM lap-tops
; F8h = models 70/80 (80386)
F000:FFFF 26 model_sub_type db 26h
seg_d ends
end
bios.lst BIOS ROM Analysis Sourcer Listing v2.15 27-Nov-89 7:47 pm Page 106
▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ CROSS REFERENCE - KEY ENTRY POINTS ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
seg:off type label
---- ---- ---- ---------------
F000:E05B near system_reset
F000:E555 near int_2_NMI
F000:E6A4 near int_8_timer
F000:E6F2 near int_19h_bootup
F000:E739 near int_14h_RS232
F000:E82E near int_16h_keybd
F000:E987 near int_9_keyboard
F000:EC59 near int_13h_floppy
F000:EF57 near int_0Eh_floppy
F000:F065 near int_10h_video
F000:F841 near int_12h_memsiz
F000:F84D near int_11h_equip
F000:F859 near int_15h_servics
F000:F90B near int_17h_printer
F000:FA57 near int_unused
F000:FE6E near int_1Ah_RTC
F000:FF33 near int_return
F000:FF54 near int_5_prn_scrn
F000:FFF0 extn power_on_reset
F600:0000 near int_18h_basic