AT&T Personal Computer 6300 Plus - ROM-BIOS Listing
AT&T Personal Computer 6300 Plus - ROM-BIOS Listing
AT&T Personal Computer 6300 Plus - ROM-BIOS Listing
You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
©1986AT&T<br />
All Rights Reserved<br />
Printed in USA<br />
NOTICE<br />
The information in this document is subject to change without notice. AT&T assumes no responsibility<br />
for any errors that may appear in this document.<br />
CDC and WREN are trademarks of Control Data Corporation<br />
IBM is a registered trademark of International Business Machines<br />
Micropolis is a trademark of Micropolis Corporation<br />
MS-DOS is a registered trademark of Microsoft Corporation<br />
Seagate is a registered trademark of Seagate Technology<br />
UNIX is a registered trademark of AT&T
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
Index<br />
CONTENTS<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong>s
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
This manual contains the <strong>ROM</strong> <strong>BIOS</strong> listing for the AT&T <strong>Personal</strong> <strong>Computer</strong> <strong>6300</strong> PLUS. The<br />
Basic Input/Output System (<strong>BIOS</strong>) is located in the Read-Only Memory (<strong>ROM</strong>) on the PC <strong>6300</strong><br />
PLUS motherboard. The <strong>ROM</strong> <strong>BIOS</strong> serves as an interface between the computer system and<br />
the input/output devices connected to the system ports. The information supplied by the <strong>ROM</strong><br />
<strong>BIOS</strong> controls these devices. During normal operation, the <strong>ROM</strong> <strong>BIOS</strong> operates much like a<br />
driver that is resident in the PC <strong>6300</strong> PLUS memory space.<br />
The index that follows the listing lets you quickly locate specific information.<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong> 1-1
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
= 0000<br />
= 0001<br />
= 0000<br />
= 0001<br />
= 0002<br />
= 0004<br />
0000<br />
cooo<br />
cooo<br />
cooo 00<br />
C001 07<br />
C002 E297 R<br />
C004<br />
C004<br />
C004 E8 E548 R<br />
C007 CB<br />
C008 E8 ESSF R<br />
1-2<br />
.LIST ;END LISTING HERE FOR LIST 1 - START FOR LIST 1<br />
Macro Definitions<br />
MASM does not let you code a 'jump intersegment direct' instruction, so<br />
this macro simulates that instruction.<br />
jmpf macro arg1,arg2<br />
db OEAh<br />
dw arg2<br />
dw arg1<br />
endm<br />
''<br />
USAGE: jmpf seg,off<br />
; EQU's to include correct code for varying hardware versions%<br />
BETA equ<br />
G4TOD equ<br />
Oh<br />
01h<br />
; EQU's to help you set rom_id variable for UNIX%<br />
GEN3<br />
TOO<br />
EQU<br />
EQU<br />
NEWFLOP EQU<br />
DMACCEL EQU<br />
0<br />
2<br />
4<br />
Code Declaration<br />
; ; non-zero for a beta test unit asm%<br />
; non-zero for a GEN4 TOO fix%<br />
NORMAL GEN 3 UNIT<br />
GEN 4 TIME OF DAY CHIP INSTALLED<br />
NEW FLOPPY CIRCUITRY INSTALLED<br />
DMA ACCELERATOR INSTALLED<br />
code segment public '<strong>ROM</strong>' ; link code segments first<br />
assume cs:code, ds:nothing, es:nothing, ss:nothing<br />
ORG OCOOOh<br />
flags_data1 proc<br />
chk lo db 0 ; space for checksum of FOOO:COOO to FOOO:DFFF<br />
rom id db TOO or NEWFLOP or DMACCEL ; <strong>ROM</strong> identifier.<br />
;rom id db 0 <strong>ROM</strong> identifier.<br />
rom mt dw mas tab ; offset of mastab in <strong>ROM</strong>.<br />
flags_data1 endp<br />
far calls proc far far call table: the user does a far call to<br />
FOOO:COXX, a near call is done to the proper<br />
routine, and a far return back to the user.<br />
extrn bios install:near ;for w.d. hdu%<br />
extrn wx2 fmt:near for w.d. format in bios%<br />
-<br />
call DString FOOO:C004 (3 bytes per near call)<br />
ret (1 byte per far return)<br />
call DCrLf FOOO:C008<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong>
COOB CB<br />
cooc E8 E56C R<br />
COOF CB<br />
C010 E8 E578 R<br />
C013 CB<br />
C014 E8 E582 R<br />
C017 CB<br />
C018 E8 E589 R<br />
C01B CB<br />
C01C E8 E596 R<br />
C01F CB<br />
C020 E8 ESAB R<br />
C023 CB<br />
C024 E8 ESB3 R<br />
C027 CB<br />
C028 E8 E52A R<br />
C02B CB<br />
C02C E8 E1CO R<br />
C02F CB<br />
C030 E8 E22F R<br />
C033 CB<br />
C034 E8 0000 E<br />
C037 CB<br />
C038 E8 0000 E<br />
C03B CB<br />
C03C 0912 R<br />
C03E 0000<br />
C040 43 4F 50 59 52 49<br />
47 48 54 20 28 43<br />
29 20 20 20<br />
coso 4F 4C 49 56 45 54<br />
C060<br />
C060<br />
54 49 20 31 39 38<br />
34 20 20 20<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
ret<br />
call DColon<br />
ret<br />
call DHexLong<br />
ret<br />
call DHexWord<br />
ret<br />
call DHexByte<br />
ret<br />
call DHexNib<br />
ret<br />
call DNum<br />
ret<br />
call DNumW<br />
ret<br />
call rom checksum<br />
ret<br />
call rtc chk<br />
ret<br />
call memtst<br />
ret<br />
call bios install<br />
ret<br />
call wx2 fmt<br />
ret<br />
dw offset banner m<br />
dw 0<br />
db 'COPYRIGHT (C)<br />
db 'OLIVETTI 1984<br />
far calls endp<br />
code ends<br />
:include flags.asm<br />
C include sysdata.asm<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
Includes of Assembly Modules<br />
NAME DATE ACTION<br />
FOOO:COOC<br />
FOOO:C010<br />
FOOO:C014<br />
FOOO:C018<br />
FOOO:C01C<br />
FOOO:C020<br />
FOOO:C024<br />
FOOO:C028<br />
FOOO:C02C<br />
FOOO:C030<br />
FOOO:C034%<br />
FOOO:C038%<br />
pointer to banner<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
For aligning the copyright message.<br />
(this module)<br />
c ·======================================================================<br />
c<br />
c<br />
Filename: sysdata.src<br />
1-3
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
= 0000<br />
= 0030<br />
= 0040<br />
= BODO<br />
= B800<br />
= FOOD<br />
= 0007<br />
= 0008<br />
= 0000<br />
= OOOA<br />
= 0000<br />
= 0000<br />
= 0001<br />
= 0002<br />
= 0003<br />
= 0004<br />
= 0005<br />
= 0006<br />
= 0007<br />
= 0008<br />
= 0008<br />
= 0009<br />
= OOOA<br />
= OOOB<br />
= oooc<br />
= 0000<br />
= 0000<br />
= OOOE<br />
= OOOF<br />
= 0080<br />
= 0082<br />
= 0081<br />
= 0083<br />
1-4<br />
C This is the port equate and system data definition module.<br />
c (See flags.src for conditional assembly flags ... )<br />
c<br />
c ·======================================================================<br />
c<br />
c --------------------------------------------------------------------c<br />
Global Constants<br />
c --------------------------------------------------------------------c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
absO_seg<br />
stack_seg<br />
data_seg<br />
para_mono<br />
para_graph<br />
code_seg<br />
BEL<br />
BS<br />
CR<br />
LF<br />
NUL<br />
equ OOOOOh<br />
equ 00030h<br />
equ 00040h<br />
equ OBOOOh<br />
equ OB800h<br />
equ OFOOOh<br />
equ 007h<br />
equ 008h<br />
equ OOOh<br />
equ OOAh<br />
equ 0<br />
c .----------------------------------------------------------------------<br />
c PC<strong>6300</strong> PLUS Addresses<br />
c .----------------------------------------------------------------------<br />
c<br />
c .---------------------------------------------------------------------c<br />
i8237A p dma Controller Port Addresses<br />
c .----------------------------------------------------------------------<br />
c dma addr 0 equ DOh 16-bit address register - channel 0 -<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
dma count 0 equ 01h 16-bit count register<br />
- -<br />
refresh<br />
dma addr 1 equ 02h 16-bit address register - channel 1 - not used<br />
dma count 1 equ 03h 16-bit count register<br />
dma addr 2 equ 04h 16-bit address register - channel 2 - FOU<br />
dma count 2 equ 05h 16-bit count register<br />
dma addr 3 equ 06h 16-bit address register - channel 3 - display<br />
dma count 3 equ 07h 16-bit count register<br />
dma status equ 08h 8-bit read status register<br />
dma command equ 08h 8-bit write command register<br />
dma_request equ 09h 4-bit write request register<br />
dma mask bit equ OAh 4-bit (write) set/clear one mask register bit<br />
dma mode equ OBh 6-bit write mode register<br />
dma ff clr equ OCh (write) clear byte pointer flip/flop<br />
dma temp equ DOh 8-bit read temporary register<br />
dma master clr equ DOh (write) master clear command<br />
dma mask clr equ OEh 4-bit (write) clear all mask register bits<br />
-<br />
dma mask write equ OFh 4-bit write all mask register bits at once<br />
dma_segm_O equ 080h RAM refresh - 4x4-bit high nibble segment port<br />
dma_segm_1 equ 082h not used<br />
dma_segm_2 equ 081h FOU<br />
dma_segm_3 equ 083h display TEMP<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong>
= 0004<br />
= DODO<br />
= 0058<br />
= 0041<br />
= 0056<br />
= 0043<br />
= DODO<br />
= 0020<br />
= 0021<br />
= 0013<br />
= 0008<br />
= 0008<br />
= DODD<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
c<br />
c<br />
c .--------------------------------------------------------------------c<br />
i8237A p dma controller constants<br />
c .--------------------------------------------------------------------c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
dma command port:<br />
dma cmd disable equ<br />
dma cmd enable equ<br />
dma mode 0 equ<br />
dma mode 1 equ<br />
dma mode 2 equ<br />
dma mode 3 equ<br />
dma mask bit port:<br />
dma unmask 0 equ<br />
004h<br />
OOOh<br />
058h<br />
041h<br />
056h<br />
043h<br />
ODDh<br />
bit #0: memory-to-memory/-I/0 enable<br />
bit #2: controller disable<br />
bit #3: compressed/-normal timing<br />
bit #4: rotating/-fixed priority<br />
bit #5: extended/-late write selection<br />
bit #6: DREQ active low/-high<br />
bit #7: DACK active high/-low<br />
controller disable (bit #2) command<br />
memory-to-I/O,controller enable,normal<br />
fixed priority, late write, DREQ/-DACK<br />
channel D, read, autoinitialize, inc<br />
rement, single mode for RAM refresh.<br />
channel 1, verify, autoinit disabled,<br />
increment, single mode for not used.<br />
channel 2, write, autoinitialize, inc<br />
rement, single mode for FDU.<br />
channel 3, verify, autoinit disabled,<br />
increment, single mode for display.<br />
bits #0-1: channel select<br />
bit # 2: set/-clr mask bit (off/-on)<br />
turn on channel 0 for RAM refresh.<br />
c .---------------------------------------------------------------------c<br />
i8259A Programmable Interrupt Controller Port Addresses<br />
c .--------------------------------------------------------------------c<br />
c pic o<br />
c pic 1<br />
c<br />
equ<br />
equ<br />
020h<br />
021h<br />
8259A 'control' port (AD= D)<br />
8259A 'data' port (AD = 1)<br />
c .----------------------------------------------------------------------<br />
c i8259A Programmable Interrupt Controller Commands<br />
c .--------------------------------------------------------------------c<br />
C pic icw1<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c pic icw2<br />
C pic icw3<br />
c<br />
C pic_icw4<br />
c<br />
equ 013h ICW1 for both master & slave pic's<br />
equ<br />
equ<br />
008h<br />
008h<br />
equ OODh<br />
bit #0 = 1: ICW4 to follow (w/vector base)<br />
bit #1 = 1: single mode (no slaves or icw3)<br />
bit #2 = 0: call address interval of 8 bytes<br />
(don't care if 8086 mode -- always vectors 4<br />
byte interval)<br />
bit #3 = 0: edge triggered<br />
interrupt vector base address (INTs 08h - OFh)<br />
if cascade mode , and IR3 is a<br />
slave, 8259A is reprogrammed including icw3<br />
bit #0 = 1: 8086 mode<br />
bit #1 = 0: normal end of int<br />
1-5
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
= DOFF<br />
= 0020<br />
= 0060<br />
= 0061<br />
= 0066<br />
= 0040<br />
= 0041<br />
= 0042<br />
= 0043<br />
= 0036<br />
= 0074<br />
= OOB6<br />
= DODO<br />
= 0013<br />
= 0266<br />
1-6<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
pic_off_msk<br />
pic neoi<br />
pic seoi o<br />
pic seoi 1<br />
pic seoi_6<br />
equ<br />
equ<br />
equ<br />
equ<br />
equ<br />
OFFh<br />
020h<br />
060h<br />
061h<br />
066h<br />
bit #2 = 1: specify master for buffered mode<br />
( specifies slave for buffered mode )<br />
bit #3 = 1: buffered mode<br />
bit #4 = 0: not special fully nested<br />
pic interrupt mask bits (all interrupts off)<br />
non-specific end-of-interrupt<br />
specific end-of-interrupt for IRO: i8254 p timer<br />
specific end-of-interrupt for IRO: i8041A kb<br />
specific end-of-interrupt for IR6: fdu<br />
c .---------------------------------------------------------------------c<br />
i8254 p timer Port Addresses<br />
c ----------------------------------------------------------------------<br />
c<br />
c p 8253 0<br />
c p 8253 1<br />
c p 8253 2<br />
C p 8253 ctrl<br />
equ<br />
equ<br />
equ<br />
equ<br />
040h<br />
041h<br />
042h<br />
043h<br />
8254 p timer 0 - rtc interrupt - IRO = INT 08h<br />
8254 p timer 1 -memory refresh p_dma<br />
8254 p timer 2 - tone generator for speaker<br />
8254 p timer control port<br />
c<br />
c .----------------------------------------------------------------------<br />
C i8254 p timer Control Bytes<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
bit #0<br />
bits #1-3<br />
bits #4-5<br />
bits #6-7<br />
-> Binary Code Decimal (BCD) Enable<br />
-> Mode (0-5) 000 Mode 0: Interrupt on Terminal Count<br />
001<br />
x10<br />
x11<br />
100<br />
-> Read/Load Instruction (0-3)<br />
-> Select Counter (0-2)<br />
Mode 1: Programmable One-Shot<br />
Mode 2: Rate Generator<br />
Mode 3: Square Wave Rate Generator<br />
Mode 4: Software Triggered Strobe<br />
101 Mode 5: Hardware Triggered Strobe<br />
·----------------------------------------------------------------------<br />
tOcmd equ 036h 00 11 011 0 -> p 8253 0, lsb 1st, mode 3,<br />
t1cmd equ 074h 01 11 010 0 -> p 8253 1' lsb 1st, mode 2,<br />
t2cmd equ OB6h 10 11 011 0 -> p 8253 2, lsb 1st, mode 3,<br />
c .----------------------------------------------------------------------<br />
C i8254 p timer Counts<br />
c<br />
c<br />
c<br />
c<br />
8254 input is 1.2288 MHz (3.6864/3) or a period of 813.8 nsec = 0.814 usee<br />
Note: PC input is 1.19318 MHz or a period of 838.1 nsec = 0.838 usee<br />
c ·----------------------------------------------------------------------<br />
c tOcount equ 0 = 65,536 -> (1,228,800 Hz)/(65,536) = 18.75 ints/sec<br />
C -> (1,193, 180 Hz)/(65,536) = 18.21 ints/sec<br />
c<br />
C ;t1count equ<br />
c<br />
c t1count equ<br />
c<br />
c<br />
C t2count equ<br />
9<br />
19<br />
614<br />
OLD refresh cycle= 9*(813.8 nsec) = 7.32 usee<br />
REAL refresh cycle = 19*(813.8 nsec) = 15.5 usee<br />
< 15.625 usee minimum required. ( is 18 - safety??)<br />
(1.2288 MHz)/(2*614) = 1.00 kHz tone<br />
no BCD<br />
no BCD<br />
no BCD<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong>
= 0050<br />
= 0052<br />
= 0060<br />
= 0061<br />
= 0064<br />
= 0062<br />
= 0065<br />
= 0066<br />
= 0067<br />
= 0080<br />
= OOAO<br />
= 3F60<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
c<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
c .----------------------------------------------------------------------<br />
c<br />
c<br />
c<br />
Z8530 Serial Communication Controller<br />
(8530 not used in the <strong>6300</strong> PLUS)<br />
C (sec data_x port addresses are indexed from the sec ctl x<br />
C port addresses. See com.scr)<br />
c .--------------------------------------------------------------------c<br />
C sec ctl a<br />
C sec ctl b<br />
equ<br />
equ<br />
050h write to SCC pointer register (0-Fh),<br />
052h then read or write from selected register.<br />
c<br />
c .----------------------------------------------------------------------<br />
C 8041 Keyboard Controller<br />
c .----------------------------------------------------------------------<br />
c p kscan equ 060h<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
p kctrl equ 061h bit #7: reset interrupt pending<br />
bit #6: kb clock reset<br />
bit #5: I/0 channel (NMI) enable<br />
bit #4: RAM parity (NMI) enable<br />
bits #3 & #2: not used<br />
bit #1: speaker data<br />
bit #0: speaker gate to p_8253 2<br />
kb status equ 064h bit #1: input buffer (ok to write byte)<br />
bit #0: output buffer (byte to be read)<br />
c ·---------------------------------------------------------------------c<br />
General Control Ports<br />
c ·----------------------------------------------------------------------<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
ControlC equ<br />
CommControl equ<br />
sys_conf a equ<br />
sys_conf b equ<br />
nmi enable equ<br />
nmi enable port equ<br />
- -<br />
p trapce equ<br />
062h<br />
065h<br />
066h<br />
067h<br />
80h<br />
OAOh<br />
3F60h<br />
bit #7: Ram parity check.<br />
bit #6: I/0 channel parity check.<br />
bit #1: 80287 installed<br />
bit #7: 27128/-27256 <strong>ROM</strong>'s<br />
bit #6 - 0 = use indiginous HDU code.<br />
1 = do not use indiginous HDU code.<br />
bit #5: not used<br />
bit #4 - 0 = 80287 installed<br />
bits #3 - #0, RAM configuration<br />
bits #7 - #6: (number of FDUs)-1<br />
bits #5 - #4: reserved for monitor type<br />
bit #3 Most significant bit for HDU<br />
table entry selection drive 80h<br />
bit #2 Most significant bit for HDU<br />
table entry selection drive 81h<br />
bit #1: - 0 = 48 tpi FDU on Drive 0<br />
- 1 = 96 tpi FDU<br />
bits #0 - 0 = 48 tpi FDU on Drive<br />
- 1 = 96 tpi FDU<br />
trapce port for power on%%<br />
: : reset -- above board fix%%<br />
''<br />
1-7
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
= 0080<br />
= 0040<br />
= 0020<br />
= 0010<br />
= 0009<br />
= 0008<br />
= 0006<br />
= 0004<br />
= 0003<br />
= 0002<br />
= 0001<br />
= oooc<br />
= OOOE<br />
= OOOF<br />
= 0001<br />
= 0000<br />
= 0025<br />
= 03F2<br />
= 03F4<br />
= 03F5<br />
= OOE6<br />
= DOCS<br />
= 004D<br />
1-8<br />
c<br />
c .---------------------------------------------------------------------c<br />
58274A Clock Calendar<br />
c<br />
C (See calendar. src)<br />
c .---------------------------------------------------------------------c<br />
c .---------------------------------------------------------------------c<br />
FDU & HDU Disk Driver Error Codes<br />
c ·----------------------------------------------------------------------<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
time out equ<br />
seek error equ<br />
fdc error equ<br />
-<br />
ere error equ<br />
-<br />
dma_seg_error equ<br />
dma error equ<br />
-<br />
media_change equ<br />
sect not found equ<br />
- -<br />
write protect equ<br />
addr mark error equ<br />
cmd error equ<br />
80h<br />
40h<br />
20h<br />
10h<br />
09h<br />
08h<br />
06h<br />
04h<br />
03h<br />
02h<br />
01h<br />
C ; ; ; ;; ; ;; ; ; ; ; ; ;; ; ; ; ;; ;; ; ; ; ; ; ; FDU EQUATES<br />
Controller constants<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
srt 48 equ 1100b<br />
f srt 96 equ 1110b<br />
f hut<br />
-<br />
f hlt<br />
equ<br />
equ<br />
1111b<br />
f ndma equ 0<br />
f motor wait equ 37<br />
f drive equ [bp+O]<br />
-<br />
f head equ [bp+1]<br />
f numsecs equ [bp+2]<br />
f command equ [bp+3]<br />
-<br />
f bufoff equ [bp+4]<br />
f secnum equ [bp+6]<br />
-<br />
f cyl equ [bp+7]<br />
f real drive equ [bp+8]<br />
Floppy Disk port addresses<br />
f motor port equ 03F2h<br />
f nee status equ 03F4h<br />
f nee data equ 03F5h<br />
Floppy Disk commands<br />
read cmd equ OE6h<br />
-<br />
f write cmd equ OC5h<br />
f format cmd equ 04Dh<br />
48TPI Step Rate Time (6 ms @ 4 Mhz)<br />
96TPI Step Rate Time (4 ms@ 4 Mhz)<br />
Head Unload Time (480 ms@ 4 Mhz)<br />
Head Load Time (4 ms@ 4 Mhz)<br />
Not DMA bit (0 = dma on)<br />
no. of RTC ticks before turning<br />
motor off. (f_motor wait x 55ms)<br />
byte pointer.<br />
byte pointer.<br />
byte pointer.<br />
byte pointer.<br />
word pointer.<br />
byte pointer.<br />
byte pointer.<br />
byte pointer.<br />
drive select port<br />
disk controller status port<br />
disk controller data port<br />
read data<br />
write data<br />
format<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong>
= 0007<br />
= 0008<br />
= 0004<br />
= 0003<br />
= OOOF<br />
= 0201<br />
= 03BC<br />
= 0378<br />
= 0278<br />
= 0304<br />
= 03B4<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
f recal cmd<br />
f snsint cmd<br />
f snsdrv cmd<br />
-<br />
f specify_cmd<br />
f seek cmd<br />
-<br />
equ 007h recalibrate<br />
equ 008h sense interrupt<br />
equ 004h sense drive<br />
equ 003h specify<br />
equ OOFh seek<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
c ·---------------------------------------------------------------------c<br />
Game Card<br />
c .----------------------------------------------------------------------<br />
c<br />
C game_card<br />
c<br />
equ 201h<br />
c .---------------------------------------------------------------------c<br />
Parallel Printer Interface<br />
c<br />
c (prt_stat_x & prt_cmd_x port addresses are indexed from the<br />
C prt_data_x port addresses. See prt.src.)<br />
c .----------------------------------------------------------------------<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
prt_data_a<br />
prt stat a<br />
; prt_cmd_a<br />
prt_data_b<br />
prt_stat b<br />
; prt cmd b<br />
prt data c<br />
prt stat c<br />
; prt_cmd_c<br />
equ 03BCh<br />
equ 03BDh<br />
equ 03BEh<br />
equ 0378h on mother board<br />
equ 0379h<br />
equ 037Ah<br />
equ 0278h<br />
equ 0279h<br />
equ 027Ah<br />
c .---------------------------------------------------------------------c<br />
Color and Monochrome Video Controller<br />
c<br />
C (xxxxx data, xxxxx_mode, xxxxx status, xxxxx LPclear, and<br />
C xxxxx_LPPreset port addresses are indexed from the xxxxx_Pointer<br />
C port addresses for color & display. See vid.src and graph.src.)<br />
c .---------------------------------------------------------------------c<br />
C ; Color Controller.<br />
c<br />
C color pointer equ<br />
c<br />
C ; Monochrome Controller.<br />
c<br />
C v_pointer equ<br />
c<br />
0304h 6845 pointer to internal regs<br />
03B4h ; 6845 pointer to internal regs<br />
c .---------------------------------------------------------------------c<br />
INS8250 Asynchronous Communication Chip<br />
c<br />
C (com_int x, com_lctl x, com_mctl x, com_lstat_x, and<br />
C com mstat_x port addresses are indexed from the com_data_x<br />
C port addresses. See com.src.)<br />
c .---------------------------------------------------------------------c<br />
1-9
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
006C ????????<br />
0070 ????????<br />
0074 ????????<br />
0078 ????????<br />
007C ????????<br />
0080<br />
0000<br />
0000<br />
0000<br />
0000 04 [<br />
0008 04 [<br />
0010 ????<br />
0012 ??<br />
0013 ????<br />
0015 02<br />
0017 ??<br />
0018 ??<br />
0019 ??<br />
001A ????<br />
001C ????<br />
001E 10<br />
1-12<br />
????<br />
????<br />
??<br />
????<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
int1Blocn<br />
int1Clocn<br />
int1Dlocn<br />
int1Elocn<br />
int1Flocn<br />
absO ends<br />
dd<br />
dd<br />
dd<br />
dd<br />
dd<br />
? kb break pointer<br />
? p timer break pointer<br />
? display parameter pointer<br />
? disk parameter pointer<br />
? graphics character extensions pointer<br />
c .--------------------------------------------------------------------c<br />
RAM stack<br />
c .--------------------------------------------------------------------c<br />
C stack ram<br />
c<br />
C stack ram<br />
c<br />
segment public 'RAM' at stack seg<br />
ends<br />
c .---------------------------------------------------------------------c<br />
System Data Area<br />
c .----------------------------------------------------------------------<br />
c<br />
C data segment public 'RAM' ; at data_seg<br />
c assume cs:nothing, ds:nothing, es:nothing, ss:nothing<br />
c<br />
c .---------------------------------------------------------------------c<br />
Data Area<br />
c .----------------------------------------------------------------------<br />
c<br />
c <strong>ROM</strong> Bios Data Area<br />
c<br />
C rs232 addr<br />
c<br />
c<br />
c<br />
C printer_addr<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
switch bits<br />
mfg_tst<br />
memory_size<br />
mfg err_ flag<br />
-<br />
dw 4 dup (?)<br />
dw 4 dup (?)<br />
dw ?<br />
db ?<br />
dw ?<br />
db 2 dup (?)<br />
Keyboard Data Area<br />
kb flag db ?<br />
kb flag 1 db ?<br />
alt input db ?<br />
buffer head dw ?<br />
buffer tail dw ?<br />
kb buffer dw 16 dup (?)<br />
0040:0000 addresses of rs232 adapters<br />
0040:0008 addresses of printers<br />
0040:0010 state of DIP switches<br />
0040:0012 initialization flag<br />
0040:0013 memory size in kbytes<br />
0040:0015 error codes for manufacturing<br />
0040:0017 keyboard shift flag status byte<br />
0040:0018 second byte of keyboard status<br />
0040:0019 alternate keypad entry<br />
0040:001A keyboard output pointer offset<br />
0040:001C keyboard input pointer offset<br />
0040:001E room for 15 entries: head =<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong>
OOA2 ????????<br />
OOA6 ????????<br />
OOAA DC [<br />
OOC2 04 [<br />
OOCA ????<br />
oocc ????<br />
OOCE ????<br />
DODO<br />
OOD2 ??<br />
OOD3<br />
0000<br />
0000<br />
0000<br />
????<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
????<br />
c<br />
C osmerge1<br />
c<br />
c<br />
C osmerge2<br />
c<br />
dd<br />
dd<br />
?<br />
?<br />
40:A2,A3 - offset return to UNIX%<br />
40:A4,A5 - segment return to UNIX%<br />
40:A6,A7,A8,A9 - extension%<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
c .----------------------------------------------------------------------<br />
( Protected mode data space%<br />
c .----------------------------------------------------------------------<br />
(<br />
c gdt<br />
c<br />
c<br />
c<br />
???? c<br />
C gdtalias<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
dw<br />
dw<br />
12 dup (?) : space for gdt AA-C1<br />
4 dup (?) : gdt alias C2-C9<br />
seg fail dw ? segment fail protected mode RAM test<br />
CA-CB<br />
off fail dw ? offset fail protected mode RAM test<br />
cc-co<br />
dwrite dw ? data written for p-mode RAM test<br />
CE-CF<br />
dread dw ? data read for p-mode RAM test<br />
DO-D1<br />
addr db ? addr space<br />
data ends<br />
c .----------------------------------------------------------------------<br />
[ Video RAM<br />
c .----------------------------------------------------------------------<br />
[<br />
C v ram segment public 'RAM' at para mono<br />
c<br />
C v ram ends<br />
code<br />
.LIST<br />
Filename: hdisk.asm<br />
This module includes the Western Digital Hard Disk<br />
controller code, wd hdu.asm and wd fmt.asm.<br />
Beta Release - 12/14/84 (path)<br />
segment common '<strong>ROM</strong>'<br />
assume cs:code, ds:nothing, es:nothing, ss:nothing<br />
1-15
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
B831<br />
= 0021<br />
= 0013<br />
= 0001<br />
= 0002<br />
= 0009<br />
= 004C<br />
= 0007<br />
= 0011<br />
= 0012<br />
B840<br />
B840<br />
B840<br />
B841<br />
B843<br />
B845<br />
B848<br />
B84A<br />
1-16<br />
50<br />
8C C8<br />
8E D8<br />
BA B8E2 R<br />
B4 09<br />
CD 21<br />
C include wd fmt.asm<br />
C SUBTTL Format Winchester Disk<br />
C PAGE 62,132<br />
C Version 07 was integrated to our working version that resides on the<br />
C motherboard<br />
C Version 03<br />
c Bill Bailey 84/06/12 - 84/06/13<br />
C Version 02<br />
C Bob Hossley 84/04/10 - 84/04/12<br />
C Version 01<br />
c Bob Hossley 83/09/16 - 83/09/16<br />
c<br />
c<br />
c<br />
Call: JMP WX2 FMT<br />
C<br />
c<br />
Purpose: Format the specified drive with the specified interleave.<br />
C Entry:<br />
C (AH) = Relative number of target drive. Drive 80h + d is the target.<br />
C<br />
c<br />
(AL) =Interleave factor.<br />
C<br />
c<br />
c<br />
Exit: Job terminated.<br />
C CODE SEGMENT COMMON '<strong>ROM</strong>'<br />
c<br />
C ASSUME CS:CODE,DS:CODE<br />
c<br />
C Interrupt Vectors<br />
C IVFC EQU 21H<br />
C IVDBC EQU 13H<br />
c<br />
C ; Function call numbers<br />
C FCKBIN EQU 1<br />
C FCDISB EQU 2<br />
C FCPRSTR EQU<br />
C FCTEND EQU<br />
c<br />
9<br />
04CH<br />
C ; Disk <strong>BIOS</strong> command codes<br />
C CCFD EQU 7<br />
C CCREC EQU 11H<br />
C CCRT EQU 12H<br />
c<br />
c<br />
c<br />
ORG<br />
OB840H<br />
C PUBLIC WX2 FMT<br />
C WX2 FMT PROC NEAR<br />
C ASSUME CS:CODE,DS:CODE<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
PUSH<br />
MDV<br />
MOV<br />
MDV<br />
MOV<br />
INT<br />
AX<br />
AX,CS<br />
DS,AX<br />
DX,OFFSET MI<br />
AH,FCPRSTR<br />
IVFC<br />
;function call interrupt number<br />
:Disk <strong>BIOS</strong> call<br />
;keyboard input<br />
;display byte<br />
;print string<br />
;terminate<br />
;format drive<br />
;recal<br />
;ram test<br />
;drive offset & interleave factor<br />
;code segment pointer<br />
:init. data segment pointer<br />
;pointer to hello message<br />
;print string<br />
;function call<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong>
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
B84C 58 c POP AX :Relative drive # & interleave factor<br />
B84D OA CO c OR AL,AL ;test for 0, change to 03H<br />
B84F 75 02 c JNZ SHORT NOCHG ;jmp if parameters specified<br />
B851 BO 03 c MDV AL,3 :drive C, interleave of 3<br />
B853 c NOCHG:<br />
B853 80 E4 07 c AND AH,07H ;mask drive number to 0 -- 7.<br />
B856 50 c PUSH AX :Save<br />
c ''' ''<br />
ADD AH, 'C' ;generate drive letter<br />
B857 80 C4 30 c ADD AH, '0' ;generate drive letter<br />
B85A 8A 04 c MDV DL,AH ;character to display<br />
B85C B4 02 c MDV AH,FCDISB ;display byte function call #<br />
B85E CD 21 c INT IVFC :Function call<br />
B860 BA B99F R c MDV DX,OFFSET MINT ;pointer to interleave message<br />
B863 B4 09 c MDV AH,FCPRSTR ;print string<br />
B865 CD 21 c INT IVFC ;function call<br />
B867 58 c POP AX ;Relative drive # & interleave factor<br />
B868 50 c PUSH AX ;Save<br />
B869 E8 B8C7 R c CALL OS BY HEX :display (AL) as two hex digits<br />
c<br />
-<br />
;Operator response<br />
B86C B4 01 c MDV AH,FCKBIN :keyboard input function call #<br />
B86E CD 21 c INT IVFC ;function call<br />
B870 3C 79 c CMP AL, 'y' ;" y" input?<br />
B872 74 DC c JE ZFMT ;br if yes.<br />
B874 3C 59 c CMP AL, 'Y' ;" Y" input?<br />
B876 74 08 c JE ZFMT ;br if yes.<br />
B878 58 c POP AX<br />
B879 BA B9EO R c MDV DX,OFFSET MNOD ; pointer to " Nothing Done Exit"<br />
B87C 2A FF c SUB BH,BH ;no error code<br />
B87E EB 30 c JMP SHORT ZNX2 ;terminate<br />
B880 c ZFMT:<br />
B880 58 c POP AX<br />
c .-------c<br />
do a ram test command to mess up the sector buffer<br />
c .-------c<br />
B881 8A 04 c MDV DL,AH ;so bios will do hard disk stuff<br />
B883 80 C2 8D c ADD DL,080H<br />
B886 8A E2 c MDV AH,DL ;save drive number in final form<br />
B888 50 c PUSH AX<br />
B889 B4 12 c MDV AH,CCRT ;command<br />
B88B CD 13 c INT IVDBC ;call disk bios<br />
B88D 8A FC c MDV BH,AH ;save error code<br />
B88F 72 1A c JC ERR ;if error<br />
c .-------c<br />
format the drive<br />
c .-------c<br />
B891 58 c POP AX :(AL) =interleave factor<br />
B892 50 c PUSH AX<br />
B893 2A F6 c SUB DH,DH ;zero head number<br />
B895 B9 0001 c MDV CX,1 ;sector 1. cylinder 0<br />
B898 B4 07 c MDV AH,CCFD :format drive command code<br />
B89A CD 13 c INT IVDBC ; call disk <strong>BIOS</strong><br />
B89C 8A FC c MDV BH,AH ;save completion code<br />
B89E 72 DB c JC ERR ;jump if error<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
1-17
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
c<br />
c<br />
c : recal before exiting<br />
c<br />
B8AO B9 0001 c MDV CX,1 ;sector 1, cylinder 0<br />
B8A3 B4 11 c MDV AH,CCREC ;recal command code<br />
B8A5 CD 13 c INT IVDBC ; call disk <strong>BIOS</strong><br />
B8A7 8A FC c MDV BH,AH :save completion code<br />
B8A9 73 OF c JNC ZNX ;jump if no error<br />
B8AB 58 c ERR: POP AX<br />
B8AC BA B9C5 R c MDV DX,OFFSET MEC ;pointer to message<br />
B8AF B4 09 c MDV AH,FCPRSTR ;print string<br />
B8B1 CD 21 c INT IVFC :function call<br />
B8B3 8A C7 c MDV AL,BH ;error code<br />
B8B5 E8 B8C7 R c CALL OS BY HEX :display in hex<br />
B8B8 EB 07 c JMP SHORT ZTEND ;terminate<br />
c .-------c<br />
B8BA c ZNX:<br />
B8BA BA B9B1 R c MOV DX,OFFSET MSUC ;pointer to message<br />
B8BD c ZNX2:<br />
B8BD B4 09 c MOV AH,FCPRSTR ;print string<br />
B8BF CD 21 c INT IVFC :function call<br />
B8C1 c ZTEND:<br />
B8C1 8A C7 c MOV AL,BH ;completion code=return code<br />
B8C3 B4 4C c MOV AH,FCTEND ;terminate<br />
B8C5 CD 21 c INT IVFC :function call<br />
B8C7 c WX2 FMT ENDP<br />
c .--------c<br />
c Call: CALL OS BY HEX<br />
c return<br />
c<br />
c Entry: (AL) = byte to display<br />
c<br />
c Exit: AX, CL, DL changed.<br />
c<br />
B8C7 c OS BY HEX PROC NEAR<br />
B8C7 50 c PUSH AX ;save in stack<br />
B8C8 B1 04 c MDV CL,4 ;shift count<br />
B8CA 02 E8 c SHR AL,CL ;align MS 4 bits<br />
B8CC E8 B8D3 R c CALL ZHEX ;convert to hex<br />
B8CF 58 c POP AX ;byte to display<br />
B8DO EB 01 90 c JMP ZHEX ;convert to hex, display, & exit<br />
B8D3 c OS BY HEX ENDP<br />
c<br />
c Call: CALL ZHEX<br />
c return<br />
c<br />
c Entry: (AL) bits 0 - 3 = Nibble to display<br />
c<br />
c Exit: AX, DL changed.<br />
c<br />
B8D3 c ZHEX PROC NEAR<br />
B8D3 24 OF c AND AL,OFH ;mask to 4 bits<br />
1-18 <strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong>
B8D5 04 90 c ADD AL,90H<br />
B8D7 27 c DAA<br />
B8D8 14 40 c ADC AL,40H<br />
B8DA 27 c DAA<br />
B8DB 8A DO c MDV DL,AL ;hex digit to display<br />
B800 B4 02 c MDV AH,FCDISB ;display byte function call #<br />
B8DF CD 21 c INT IVFC ;Function call<br />
B8E1 C3 c RET<br />
B8E2 c ZHEX ENDP<br />
c<br />
c<br />
B8E2 57 58 32 20 46 6F c MI DB 'WX2 Format Revision 3.0 (C) Copyright Western '<br />
72 60 61 74 20 52 c<br />
65 76 69 73 69 6F c<br />
6E 20 33 2E 30 20 c<br />
28 43 29 20 43 6F c<br />
70 79 72 69 67 68 c<br />
74 20 57 65 73 74 c<br />
65 72 6E 20 c<br />
B910 44 69 67 69 74 61 c DB 'Digital Corp. 1984' ,ODH,OAH<br />
6C 20 43 6F 72 70 c<br />
2E 20 31 39 38 34 c<br />
DO OA c<br />
B924 20 20 2D 28 41 48 c DB (AH) =Relative drive number (0- 7)' ,ODH,DAH<br />
29 20 30 20 52 65 c<br />
6C 61 74 69 76 65 c<br />
20 64 72 69 76 65 c<br />
20 6E 75 60 62 65 c<br />
72 20 28 30 20 20 c<br />
20 37 29 DO OA c<br />
B94D 20 20 20 28 41 4C c DB (AL) =Interleave factor (3 is standard)' ,ODH,DAH<br />
29 20 3D 20 49 6E c<br />
74 65 72 6C 65 61 c<br />
76 65 20 66 61 63 c<br />
74 6F 72 20 28 33 c<br />
20 69 73 20 73 74 c<br />
61 6E 64 61 72 64 c<br />
29 DO OA c<br />
B97A 50 72 65 73 73 20 c DB 'Press " y" to begin formatting drive $'<br />
22 79 22 20 74 6F c<br />
2D 62 65 67 69 6E c<br />
2D 66 6F 72 60 61 c<br />
74 74 69 6E 67 20 c<br />
64 72 69 76 65 20 c<br />
24 c<br />
B99F 20 77 69 74 68 20 c MINT DB · with interleave $'<br />
69 6E 74 65 72 6C c<br />
65 61 76 65 20 24 c<br />
B9B1 DO OA 46 6F 72 60 c MSUC DB DDH,DAH, 'Format Successful$'<br />
61 74 20 53 75 63 c<br />
63 65 73 73 66 75 c<br />
6C 24 c<br />
B9C5 DO OA 45 72 72 6F c MEC DB DDH,DAH, 'Error---completion code $'<br />
72 20 20 20 63 6F c<br />
60 70 6C 65 74 69 c<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong> 1-19
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
6F 6E 20 63 6F 64 c<br />
65 20 24 c<br />
B9EO DO OA 4E 6F 74 6S c MNOD DB ODH,OAH, 'Nothing Done Exit$'<br />
69 6E 67 20 44 6F c<br />
6E 65 20 45 7S 69 c<br />
74 24 c<br />
B9F4 3S 35 2F 30 31 2F c DB " SS/01/29" :release date<br />
32 39 c<br />
B9FC c CODE ENDS<br />
c END<br />
CD60 code segment public '<strong>ROM</strong>'<br />
assume cs:code, ds:nothing, es:nothing, ss:nothing<br />
C060 font lo Sx16 label byte : 204S bytes<br />
c include fontlo16.asm<br />
C060 c fontlo16 proc near System Font Table for M24<br />
c<br />
C060 DO DO DO 00 DO DO c DB OOOh,OOOh,OOOh,OOOh,OOOh,OOOh,OOOh,OOOh<br />
00 00 c<br />
C06S 00 00 00 00 DO DO c DB OOOh,OOOh,OOOh,OOOh,OOOh,OOOh,OOOh,OOOh 0<br />
00 00 c<br />
COlO DO 00 7E S1 AS S1 c DB OOOh,OOOh,07eh,OS1h,Oa5h,OS1h,OS1h,Obdh<br />
S1 BD c<br />
C07S 99 S1 7E 00 00 00 c DB 099h,OS1h,07eh,OOOh,OOOh,OOOh,OOOh,OOOh<br />
00 00 c<br />
coso 00 00 7E FF DB FF c DB OOOh,OOOh,07eh,Offh,Odbh,Offh,Offh,Oc3h<br />
FF C3 c<br />
COSS E7 FF 7E 00 00 00 c DB Oe7h,Offh,07eh,DOOh,OOOh,OOOh,OOOh,OOOh 2<br />
00 00 c<br />
C090 00 00 00 36 7F 7F c DB OOOh,OOOh,OOOh,036h,07fh,07fh,07fh,07fh<br />
7F 7F c<br />
C09S 3E 1C OS 00 00 00 c DB 03eh,01ch,OOSh,OOOh,OOOh,OOOh,OOOh,OOOh 3<br />
00 00 c<br />
COAO 00 00 00 OS 1C 3E c DB OOOh,OOOh,OOOh,OOSh,01ch,03eh,07fh,03eh<br />
7F 3E c<br />
COAS 1C OS 00 00 00 00 c DB 01ch,OOSh,OOOh,OOOh,OOOh,OOOh,OOOh,OOOh 4<br />
00 00 c<br />
COBO 00 00 1S 3C 3C E7 c DB OOOh,OOOh,01Sh,03ch,03ch,Oe7h,Oe7h,Oe7h<br />
E7 E7 c<br />
COBS 1S 1S 3C 00 00 DO c DB 01Sh,01Sh,03ch,OOOh,OOOh,OOOh,OOOh,OOOh 5<br />
00 00 c<br />
coco DO 00 1S 3C 7E FF c DB OOOh,OOOh,01Sh,03ch,07eh,Offh,Offh,07eh<br />
FF 7E c<br />
cocs 1S 1S 3C 00 00 00 c DB 01Sh,01Sh,03ch,OOOh,OOOh,OOOh,OOOh,OOOh 6<br />
00 00 c<br />
CODO 00 00 00 00 00 1S c DB OOOh,OOOh,OOOh,OOOh,OOOh,01Sh,03ch,03ch<br />
3C 3C c<br />
coos 1S 00 DO 00 00 00 c DB 01Sh,OOOh,OOOh,OOOh,OOOh,OOOh,OOOh,OOOh 7<br />
DO 00 c<br />
COED FF FF FF FF FF E7 c DB Offh,Offh,Offh,Offh,Offh,Oe7h,Oc3h,Oc3h<br />
C3 C3 c<br />
COES E7 FF FF FF FF FF c DB Oe7h,Offh,Offh,Offh,Offh,Offh,Offh,Offh s<br />
FF FF c<br />
COFO 00 00 00 DO 3C 24 c DB OOOh,OOOh,OOOh,OOOh,03ch,024h,042h,042h<br />
1-20<br />
42 42 c<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong>
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
18 18 c<br />
C1D8 7E 3C 18 FF 00 00 c DB 07eh,03ch,018h,Offh,OOOh,OOOh,OOOh,OOOh 17<br />
00 00 c<br />
C1EO 00 00 18 3C 7E 18 c DB OOOh,OOOh,018h,03ch,07eh,018h,018h,018h<br />
18 18 c<br />
C1E8 18 18 18 00 00 00 c DB 018h,018h,018h,OOOh,OOOh,OOOh,OOOh,OOOh 18<br />
00 00 c<br />
C1FO 00 00 18 18 18 18 c DB OOOh,OOOh,018h,018h,018h,018h,018h,018h<br />
18 18 c<br />
C1F8 7E 3C 18 00 00 00 c DB 07eh,03ch,018h,OOOh,OOOh,OOOh,OOOh,OOOh 19<br />
00 00 c<br />
C200 00 00 00 00 oc 06 c DB OOOh,OOOh,OOOh,OOOh,OOch,006h,07fh,006h<br />
7F 06 c<br />
C208 DC 00 00 00 00 00 c DB OOch,OOOh,OOOh,OOOh,OOOh,OOOh,OOOh,OOOh 1a<br />
00 00 c<br />
C210 00 00 00 00 18 30 c DB OOOh,OOOh,OOOh,OOOh,018h,030h,07fh,030h<br />
7F 30 c<br />
C218 18 00 00 00 00 00 c DB 018h,OOOh,OOOh,OOOh,OOOh,OOOh,OOOh,OOOh 1b<br />
00 00 c<br />
C220 00 00 00 00 60 60 c DB OOOh,OOOh,OOOh,OOOh,060h,060h,060h,060h<br />
60 60 c<br />
C228 7F 7F 00 00 00 00 c DB 07fh,07fh,OOOh,OOOh,OOOh,OOOh,OOOh,OOOh 1c<br />
00 00 c<br />
C230 00 00 00 00 24 42 c DB OOOh,OOOh,OOOh,OOOh,024h,042h,Offh,042h<br />
FF 42 c<br />
C238 24 00 00 00 00 00 c DB 024h,OOOh,OOOh,OOOh,OOOh,OOOh,OOOh,OOOh 1d<br />
00 00 c<br />
C240 00 00 00 00 00 00 c DB OOOh,OOOh,OOOh,OOOh,OOOh,OOOh,OOOh,018h<br />
00 18 c<br />
C248 3C 7E FF 00 00 00 c DB 03ch,07eh,Offh,OOOh,OOOh,OOOh,OOOh,OOOh 1e<br />
00 00 c<br />
C250 00 00 00 00 00 FF c DB OOOh,OOOh,OOOh,OOOh,OOOh,Offh,07eh,03ch<br />
7E 3C c<br />
C258 18 00 00 00 00 00 c DB 018h,OOOh,OOOh,OOOh,OOOh,OOOh,OOOh,OOOh 1f<br />
00 00 c<br />
C260 00 00 00 00 00 00 c DB OOOh,OOOh,OOOh,OOOh,OOOh,OOOh,OOOh,OOOh<br />
00 00 c<br />
C268 00 00 00 00 00 00 c DB OOOh,OOOh,OOOh,OOOh,OOOh,OOOh,OOOh,OOOh , 20<br />
00 00 c<br />
C270 00 00 18 3C 3C 3C c DB OOOh,OOOh,018h,03ch,03ch,03ch,018h,018h<br />
18 18 c<br />
C278 00 18 18 00 00 00 c DB OOOh,018h,018h,OOOh,OOOh,OOOh,OOOh,OOOh ; ' I ' 21<br />
00 00 c<br />
C280 00 66 66 66 24 00 c DB 000h,066h,066h,066h,024h,OOOh,OOOh,OOOh<br />
00 00 c<br />
C288 00 00 00 00 00 00 c DB OOOh,OOOh,OOOh,OOOh,OOOh,OOOh,OOOh,OOOh 22<br />
00 00 c<br />
C290 00 00 36 36 7F 36 c DB OOOh,OOOh,036h,036h,07fh,036h,036h,036h<br />
36 36 c<br />
C298 7F 36 36 00 00 00 c DB 07fh,036h,036h,OOOh,OOOh,OOOh,OOOh,OOOh . , #, 23<br />
00 00 c<br />
C2AO 08 08 3E 63 60 60 c DB 008h,008h,03eh,063h,060h,060h,03eh,003h<br />
3E 03 c<br />
C2A8 03 63 3E 08 08 00 c DB 003h,063h,03eh,008h,008h,OOOh,OOOh,OOOh ; , $, 24<br />
1-22<br />
00 00 c<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong>
C2BO 00 00 00 51 53 06 c DB OOOh,OOOh,OOOh,061h,063h,006h,OOch,018h<br />
DC 18 c<br />
C2B8 30 53 43 00 00 00 c DB 030h,063h,043h,OOOh,OOOh.OOOh,OOOh,OOOh ; '%' 25<br />
00 00 c<br />
C2CO 00 00 1C 36 36 1C c DB OOOh,OOOh,01ch,036h,036h,01ch,03bh,06eh<br />
3B 6E c<br />
C2C8 56 56 3B 00 00 00 c DB 066h,066h,03bh,OOOh,OOOh,OOOh,OOOh,OOOh ; '&' 26<br />
00 00 c<br />
C2DO 00 30 30 30 50 00 c DB 000h,030h,030h,030h,060h,OOOh,OOOh,OOOh<br />
00 00 c<br />
C2D8 00 00 00 00 00 00 c DB OOOh,OOOh,OOOh,OOOh,OOOh,OOOh,OOOh,OOOh 27<br />
00 00 c<br />
C2EO 00 00 DC 18 30 30 c DB OOOh,OOOh,OOch,018h,030h,030h,030h,030h<br />
30 30 c<br />
C2E8 30 18 DC 00 00 00 c DB 030h,018h,OOch,OOOh,OOOh,OOOh,OOOh,OOOh ; '(' 28<br />
00 00 c<br />
C2FO 00 00 30 18 DC DC c DB OOOh,OOOh,030h,018h,OOch,OOch,OOch,OOch<br />
DC DC c<br />
C2F8 DC 18 30 00 00 00 c DB OOch,018h,030h,OOOh,OOOh,OOOh,OOOh,OOOh ; ')' 29<br />
00 00 c<br />
C300 00 00 DO DO 56 3C c DB OOOh,OOOh,OOOh,OOOh,066h,03ch,07eh,03ch<br />
7E 3C c<br />
C308 56 00 00 00 00 00 c DB 066h,OOOh,OOOh,OOOh,OOOh,OOOh,OOOh,OOOh . '*' 2a<br />
00 00 c<br />
C310 00 00 00 00 18 18 c DB OOOh,OOOh,OOOh,OOOh,018h,018h,07eh,018h<br />
7E 18 c<br />
C318 18 00 00 00 00 00 c DB 018h,OOOh,OOOh,OOOh,OOOh,OOOh,OOOh,OOOh . '+' 2b<br />
00 00 c<br />
C320 00 00 00 00 00 00 c DB OOOh,OOOh,OOOh,OOOh,OOOh,OOOh,OOOh,OOOh<br />
00 00 c<br />
C328 18 18 18 30 00 00 c DB 018h,018h,018h,030h,OOOh,OOOh,OOOh,OOOh ' ' 2c<br />
00 00 c<br />
C330 00 00 00 00 00 00 c DB OOOh,OOOh,OOOh,OOOh,OOOh,OOOh,07eh,OOOh<br />
7E 00 c<br />
C338 00 00 00 00 00 00 c DB OOOh,OOOh,OOOh,OOOh,OOOh,OOOh,OOOh,OOOh - 2d<br />
00 00 c<br />
C340 00 00 00 00 00 00 c DB OOOh,OOOh,OOOh,OOOh,OOOh,OOOh,OOOh,OOOh<br />
00 00 c<br />
C348 00 18 18 00 00 00 c DB OOOh,018h,018h,OOOh,OOOh,OOOh,OOOh,OOOh . ' 2e<br />
00 00 c<br />
C350 00 00 01 03 06 DC c DB OOOh,OOOh,001h,003h,006h,OOch,018h,030h<br />
18 30 c<br />
C358 50 40 00 00 00 00 c DB 060h,040h,OOOh,OOOh,OOOh,OOOh,OOOh,OOOh ; 'I' 2f<br />
00 00 c<br />
C360 00 00 3E 53 57 6F c DB OOOh,OOOh,03eh,063h,067h,06fh,07bh,073h<br />
7B 73 c<br />
C368 53 53 3E 00 00 00 c DB 063h,063h,03eh,OOOh,OOOh,OOOh,OOOh,OOOh ; '0' 30<br />
00 00 c<br />
C370 00 00 DC 1C 3C DC c DB OOOh,OOOh,OOch,01ch,03ch,OOch,OOch,OOch<br />
DC DC c<br />
C378 DC DC 3F 00 00 00 c DB OOch,OOch,03fh,OOOh,OOOh,OOOh,OOOh,OOOh ; '1' 31<br />
00 00 c<br />
C380 00 00 3E 53 03 06 c DB OOOh,OOOh,03eh,063h,003h,006h,OOch,018h<br />
DC 18 c<br />
C388 30 53 7F 00 DO 00 c DB 030h,063h,07fh,OOOh,OOOh,OOOh,OOOh,OOOh ; '2' 32<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
1-23
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
6F 67 c<br />
C548 63 63 63 00 00 00 c DB 063h,063h,063h,OOOh,OOOh,OOOh,OOOh,OOOh ; 'N' 4e<br />
00 00 c<br />
C550 00 00 1C 36 63 63 c DB OOOh,OOOh,01ch,036h,063h,063h,063h,063h<br />
63 63 c<br />
C558 63 36 1C 00 00 00 c DB 063h,036h,01ch,OOOh,OOOh,OOOh,OOOh,OOOh ; '0' 4f<br />
00 00 c<br />
C560 00 00 7E 33 33 33 c DB OOOh,OOOh,07eh,033h,033h,033h,03eh,030h<br />
3E 30 c<br />
C568 30 30 78 00 00 00 c DB 030h,030h,078h,OOOh,OOOh,OOOh,OOOh,OOOh ; 'P' 50<br />
00 00 c<br />
C570 00 00 1C 36 63 63 c DB OOOh,OOOh,01ch,036h,063h,063h,063h,063h<br />
63 63 c<br />
C578 6B 3E 1C 06 03 00 c DB 06bh,03eh,01ch,006h,003h,OOOh,OOOh,OOOh ; 'Q' 51<br />
00 00 c<br />
C580 00 00 7E 33 33 33 c DB OOOh,OOOh,07eh,033h,033h,033h,03eh,036h<br />
3E 36 c<br />
C588 33 33 73 00 00 00 c DB 033h,033h,073h,OOOh,OOOh,OOOh,OOOh,OOOh ; 'R' 52<br />
00 00 c<br />
C590 00 00 3E 63 63 30 c DB OOOh,OOOh,03eh,063h,063h,030h,01ch,006h<br />
1C 06 c<br />
C598 63 63 3E 00 00 00 c DB 063h,063h,03eh,OOOh,OOOh,OOOh,OOOh,OOOh ; 's. 53<br />
00 00 c<br />
CSAO 00 00 7E SA 18 18 c DB OOOh,OOOh,07eh,05ah,018h,018h,018h,018h<br />
18 18 c<br />
C5A8 18 18 3C 00 00 00 c DB 018h,018h,03ch,OOOh,OOOh,OOOh,OOOh,OOOh ; 'T' 54<br />
00 00 c<br />
CSBO 00 00 63 63 63 63 c DB OOOh,OOOh,063h,063h,063h,063h,063h,063h<br />
63 63 c<br />
C5B8 63 63 3E 00 00 00 c DB 063h,063h,03eh,OOOh,OOOh,OOOh,OOOh,OOOh ; 'U' 55<br />
00 00 c<br />
csco 00 00 63 63 63 63 c DB OOOh,OOOh,063h,063h,063h,063h,063h,063h<br />
63 63 c<br />
C5C8 36 1C 08 00 00 00 c DB 036h,01ch,008h,OOOh,OOOh,OOOh,OOOh,OOOh ; 'v' 56<br />
00 00 c<br />
CSDO 00 00 63 63 63 63 c DB OOOh,OOOh,063h,063h,063h,063h,063h,06bh<br />
63 6B c<br />
C5D8 6B 7F 36 00 00 00 c DB 06bh,07fh,036h,OOOh,OOOh,OOOh,OOOh,OOOh ; 'W' 57<br />
00 00 c<br />
CSEO 00 00 63 63 63 36 c DB OOOh,OOOh,063h,063h,063h,036h,01ch,036h<br />
1C 36 c<br />
C5E8 63 63 63 00 00 00 c DB 063h,063h,063h,OOOh,OOOh,OOOh,OOOh,OOOh ; 'X' 58<br />
00 00 c<br />
CSFO 00 00 66 66 66 66 c DB OOOh,OOOh,066h,066h,066h,066h,066h,03ch<br />
66 3C c<br />
C5F8 18 18 3C 00 00 00 c DB 018h,018h,03ch,OOOh,OOOh,OOOh,OOOh,OOOh ; 'Y' 59<br />
00 00 c<br />
C600 00 00 7F 63 06 OC c DB OOOh,OOOh,07fh,063h,006h,OOch,018h,030h<br />
18 30 c<br />
C608 60 63 7F 00 00 00 c DB 060h,063h,07fh,OOOh,OOOh,OOOh,OOOh,OOOh ; 'Z' Sa<br />
00 00 c<br />
C610 00 00 3C 30 30 30 c DB OOOh,OOOh,03ch.030h,030h,030h,030h,030h<br />
30 30 c<br />
C618 30 30 3C 00 00 00 c DB 030h,030h,03ch,OOOh,OOOh,OOOh,OOOh,OOOh ; '[' Sb<br />
00 00 c<br />
1-26 <strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong>
C620 DO DO 40 60 30 18 c DB OOOh,OOOh,040h,060h,030h,018h,OOch,006h<br />
DC 06 c<br />
C628 03 01 DO DO DO 00 c DB 003h,OD1h,OOOh,OOOh,OOOh,OOOh,OOOh,OOOh ; ·' Sc<br />
DO DO c<br />
C630 00 DO 3C DC DC DC c DB OOOh,OOOh,03ch,OOch,OOch,OOch,OOch,OOch<br />
DC DC c<br />
C638 DC DC 3C DO DO DO c DB OOch,OOch,03ch,OOOh,OOOh,OOOh,OOOh,OOOh ; ']' Sd<br />
00 00 c<br />
C640 08 1C 36 63 DO 00 c DB 008h,01ch,036h,063h,OOOh,OOOh,OOOh,OOOh<br />
DO DO c<br />
C648 DO DO DO 00 DO DO c DB OOOh,OOOh,OOOh,OOOh,OOOh,OOOh,OOOh,OOOh Se<br />
00 DO c<br />
C650 00 DO DO DO DO 00 c DB OOOh,OOOh,OOOh,OOOh,OOOh,OOOh,OOOh,OOOh<br />
DO DO c<br />
C658 DO DO DO DO DO DO c DB OOOh,OOOh,OOOh,OOOh,OOOh,OOOh,07fh,OOOh Sf<br />
7F DO c<br />
C660 18 18 DC DO DO DO c DB 018h,018h,OOch,OOOh,OOOh,OOOh,OOOh,OOOh<br />
00 DO c<br />
C668 DO DO DO DO DO DO c DB OOOh,OOOh,OOOh,OOOh,OOOh,OOOh,OOOh,OOOh ''' 60<br />
DO DO c<br />
C670 DO DO 00 DO 00 3C c DB OOOh,OOOh,OOOh,OOOh,OOOh,03ch,006h,03eh<br />
06 3E c<br />
C678 66 66 3B 00 DO DO c DB 066h,066h,03bh,OOOh,OOOh,OOOh,OOOh,OOOh ; ·a· 61<br />
DO DO c<br />
C680 DO DO 70 30 30 3E c DB OOOh,OOOh,070h,030h,030h,03eh,033h,033h<br />
33 33 c<br />
C688 33 33 6E DO 00 DO c DB 033h,033h,06eh,OOOh,OOOh,OOOh,OOOh,OOOh ; 'b' 62<br />
00 DO c<br />
C690 DO DO DO DO DO 3E c DB OOOh,OOOh,OOOh,OOOh,OOOh,03eh,063h,060h<br />
63 60 c<br />
C698 60 63 3E 00 00 00 c DB 060h,063h,03eh,OOOh,OOOh,OOOh,OOOh,OOOh ; 'c · 63<br />
00 00 c<br />
C6AO 00 00 DE 06 06 3E c DB OOOh,OOOh,OOeh,006h,006h,03eh,066h,066h<br />
66 66 c<br />
C6A8 66 66 3B 00 00 00 c DB 066h,066h,03bh,OOOh,OOOh,OOOh,OOOh,OOOh ; 'd' 64<br />
00 DO c<br />
C6BO 00 00 00 00 00 3E c DB OOOh,OOOh,OOOh,OOOh,OOOh,03eh,063h,07fh<br />
63 7F c<br />
C6B8 60 63 3E 00 00 00 c DB 060h,063h,03eh,OOOh,OOOh,OOOh,OOOh,OOOh ; 'e · 65<br />
00 00 c<br />
C6CO 00 00 1E 33 30 7C c DB OOOh,OOOh,01eh,033h,030h,07ch,030h,030h<br />
30 30 c<br />
C6C8 30 30 78 00 00 00 c DB 030h,030h,078h,OOOh,OOOh,OOOh,OOOh,OOOh ; 'f' 66<br />
00 00 c<br />
C6DO 00 00 00 00 00 3B c DB OOOh,OOOh,OOOh,OOOh,OOOh,03bh,066h,066h<br />
66 66 c<br />
C6D8 66 66 3E 06 66 3C c DB 066h,066h,03eh,006h,066h,03ch,OOOh,OOOh ; 'g' 67<br />
00 00 c<br />
C6EO 00 00 70 30 30 36 c DB OOOh,OOOh,070h,030h,030h,036h,03bh,033h<br />
3B 33 c<br />
C6E8 33 33 73 00 00 00 c DB 033h,033h,073h,OOOh,OOOh,OOOh,OOOh,OOOh ; 'h' 68<br />
00 00 c<br />
C6FO 00 00 DC DC 00 1C c DB OOOh,OOOh,OOch,OOch,OOOh,01ch,OOch,OOch<br />
DC DC c<br />
C6F8 OC OC 1E 00 00 00 c DB OOch,OOch,01eh,OOOh,OOOh,OOOh,OOOh,OOOh ; 'i' 69<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong> 1-27
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
00 00 c<br />
C700 00 00 DC DC 00 1C c DB OOOh,OOOh,OOch,OOch,OOOh,01ch,OOch,OOch<br />
DC DC c<br />
C708 DC DC DC DC CC 78 c DB OOch,OOch,OOch.OOch.Occh.078h,OOOh,OOOh ; · j · 6a<br />
00 00 c<br />
C710 00 00 70 30 30 33 c DB OOOh,OOOh,070h,030h,030h,033h,036h,03ch<br />
36 3C c<br />
C718 36 33 73 00 00 00 c DB 036h,033h,073h,OOOh,OOOh,OOOh,OOOh,OOOh ; 'k. 6b<br />
00 00 c<br />
C720 00 00 1C DC DC DC c DB OOOh,OOOh,01ch,OOch,OOch,OOch.OOch,OOch<br />
DC DC c<br />
C728 DC DC 1E 00 00 00 c DB OOch,OOch,01eh,OOOh,OOOh,OOOh,OOOh,OOOh ; 'l' 6c<br />
00 00 c<br />
C730 00 00 00 00 00 66 c DB OOOh,OOOh,OOOh,OOOh,OOOh,066h,07fh,06bh<br />
7F 6B c<br />
C738 6B 6B 6B 00 00 00 c DB 06bh,06bh,06bh,OOOh,OOOh,OOOh,OOOh,OOOh ; ·m· 6d<br />
00 00 c<br />
C740 00 00 00 00 00 6E c DB OOOh,OOOh,OOOh,OOOh,OOOh,06eh.033h,033h<br />
33 33 c<br />
C748 33 33 33 00 00 00 c DB 033h,033h,033h,OOOh,OOOh,OOOh,OOOh,OOOh ; · n · 6e<br />
00 00 c<br />
C750 00 00 00 00 00 3E c DB OOOh,OOOh,OOOh,OOOh,OOOh,03eh,063h,063h<br />
63 63 c<br />
C758 63 63 3E 00 00 00 c DB 063h,063h,03eh,OOOh,OOOh,OOOh,OOOh,OOOh ; ·a· 6f<br />
00 00 c<br />
C760 00 00 00 00 00 6E c DB OOOh,OOOh,OOOh,OOOh,OOOh,06eh,033h.033h<br />
33 33 c<br />
C768 33 33 3E 30 30 78 c DB 033h,033h.03eh,030h,030h,078h,OOOh.OOOh ; . p. 70<br />
00 00 c<br />
C770 00 00 00 00 00 3B c DB OOOh,OOOh,OOOh,OOOh,OOOh,03bh,066h.066h<br />
66 66 c<br />
C778 66 66 3E 06 06 OF c DB 066h,066h,03eh,006h,006h,OOfh,OOOh,OOOh ; . q. 71<br />
00 00 c<br />
C780 00 00 00 00 00 6E c DB OOOh,OOOh,OOOh,OOOh,OOOh,06eh,033h,030h<br />
33 30 c<br />
C788 30 30 78 00 00 00 c DB 030h.030h,078h,OOOh,OOOh,OOOh,OOOh,OOOh ; · r' 72<br />
00 00 c<br />
C790 00 00 00 00 00 3E c DB OOOh,OOOh,OOOh,OOOh,OOOh,03eh,063h,038h<br />
63 38 c<br />
C798 OE 63 3E 00 00 00 c DB OOeh.063h,03eh,OOOh,OOOh,OOOh,OOOh,OOOh ; . s. 73<br />
00 00 c<br />
C7AO 00 00 00 08 18 7E c DB OOOh,OOOh,OOOh,008h,018h,07eh,018h,018h<br />
18 18 c<br />
C7A8 18 1B DE 00 00 00 c DB 018h,01bh,OOeh,OOOh,OOOh,OOOh,OOOh,OOOh ; , t. 74<br />
00 00 c<br />
C7BO 00 00 00 00 00 66 c DB OOOh,OOOh,OOOh,OOOh,OOOh,066h,066h,066h<br />
66 66 c<br />
C7B8 66 66 3B 00 00 00 c DB 066h,066h,03bh,OOOh,OOOh,OOOh,OOOh,OOOh ; ·u · 75<br />
00 00 c<br />
C7CO 00 00 00 00 00 63 c DB OOOh,OOOh,OOOh,OOOh,OOOh,063h,063h.063h<br />
63 63 c<br />
C7C8 36 1C 08 00 00 00 c DB 036h,01ch,008h,OOOh,OOOh,OOOh,OOOh,OOOh ; . v. 76<br />
00 00 c<br />
C7DO 00 00 00 00 00 63 c DB OOOh,OOOh,OOOh,OOOh,OOOh,063h,063h,06bh<br />
63 6B c<br />
1-28<br />
ms"'""""'""""""""'=<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong>
C7D8 6B 7F 36 00 00 00 c DB 06bh,07fh,036h,OOOh,OOOh,OOOh,OOOh,OOOh ; 'w' 77<br />
00 00 c<br />
C?EO 00 00 00 00 DO 63 c DB OOOh,OOOh,OOOh,OOOh,OOOh,063h,036h,01ch<br />
36 1C c<br />
C7E8 1C 36 63 00 00 00 c DB 01ch,036h,063h,OOOh,OOOh,OOOh,OOOh,OOOh ; 'x' 78<br />
DO 00 c<br />
C?FO 00 00 00 00 00 63 c DB OOOh,OOOh,OOOh,OOOh,OOOh,063h,066h,066h<br />
66 66 c<br />
C7F8 66 66 3E 06 66 3C c DB 066h,066h,03eh,006h,066h,03ch,OOOh,OOOh ; 'y' 79<br />
00 00 c<br />
C800 DO 00 00 00 00 7F c DB OOOh,OOOh,OOOh,OOOh,OOOh,07fh,066h,OOch<br />
66 DC c<br />
C808 18 33 7F 00 00 00 c DB 018h,033h,07fh,OOOh,OOOh,OOOh,OOOh,OOOh ; 'z' ?a<br />
00 00 c<br />
C810 00 00 DE 18 18 18 c DB OOOh,OOOh,OOeh,018h,018h,018h,070h,018h<br />
70 18 c<br />
C818 18 18 DE 00 00 00 c DB 018h,018h,OOeh,OOOh,OOOh,OOOh,OOOh,OOOh ; ' {' 7b<br />
00 00 c<br />
C820 00 00 18 18 18 18 c DB OOOh,OOOh,018h,018h,018h,018h,OOOh,018h<br />
00 18 c<br />
C828 18 18 18 00 00 00 c DB 018h,018h,018h,OOOh,OOOh,OOOh,OOOh,OOOh ; 'I' 7c<br />
00 00 c<br />
C830 00 00 70 18 18 18 c DB OOOh,OOOh,070h,018h,018h,018h,OOeh,018h<br />
OE 18 c<br />
C838 18 18 70 00 00 00 c DB 018h,018h,070h,OOOh,OOOh,OOOh,OOOh,OOOh ; , } ' 7d<br />
00 00 c<br />
C840 00 00 3B 6E 00 00 c DB OOOh,OOOh,03bh,06eh,OOOh,OOOh,OOOh,OOOh<br />
00 00 c<br />
C848 00 00 00 00 00 00 c DB OOOh,OOOh,OOOh,OOOh,OOOh,OOOh,OOOh,OOOh<br />
,-, 7e<br />
00 00 c<br />
C850 00 00 00 00 08 1C c DB OOOh,OOOh,OOOh,OOOh,008h,01ch,036h,063h<br />
36 63 c<br />
C858 63 7F 00 00 00 00 c DB 063h,07fh,OOOh,OOOh,OOOh,OOOh,OOOh,OOOh " 7f<br />
00 00 c<br />
c ;End of font matrix<br />
c<br />
C860 c fontlo16 endp<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
-<br />
C860 font hi 8x8 label byte 1024 bytes<br />
c include fonthi8.asm<br />
C860 c fonthi8 proc near<br />
c SystemFont ; (m24) 8 x 8 font table for m24<br />
c<br />
C860 3C 66 60 66 3C DC c DB 03ch,066h,060h,066h,03ch,OOch,006h,03ch 80<br />
06 3C c<br />
C868 00 66 00 66 66 66 c DB OOOh,066h,OOOh,066h,066h,066h,03fh,OOOh 81<br />
3F DO c<br />
C870 DE 00 3C 66 7E 60 c DB OOeh,OOOh,03ch,066h,07eh,060h,03ch,OOOh 82<br />
3C DO c<br />
C878 7E C3 3C 06 3E 66 c DB 07eh,Oc3h,03ch,006h,03eh,066h,03fh,OOOh 83<br />
3F 00 c<br />
C880 66 00 3C 06 3E 66 c DB 066h,OOOh,03ch,006h,03eh,066h,03fh,OOOh 84<br />
3F 00 c<br />
C888 70 00 3C 06 3E 66 c DB 070h,OOOh,03ch,006h,03eh,066h,03fh,OOOh 85<br />
3F 00 c<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
1-29
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
C890 18 18 3C 06 3E 66 c DB 018h,018h,03ch,006h,03eh,066h,03fh,OOOh 86<br />
3F 00 c<br />
C898 00 00 3C 60 60 3C c DB OOOh,OOOh,03ch,060h,060h,03ch,006h,01ch 87<br />
06 1C c<br />
C8AO 7E C3 3C 66 7E 60 c DB 07eh,Oc3h,03ch,066h,07eh,060h,03ch,OOOh 88<br />
3C DO c<br />
C8A8 66 00 3C 66 7E 60 c DB 066h,OOOh,03ch,066h,07eh,060h,03ch,OOOh 89<br />
3C 00 c<br />
C8BO 70 00 3C 66 7E 60 c DB 070h,OOOh,03ch,066h,07eh,060h,03ch,OOOh 8a<br />
3C 00 c<br />
C8B8 66 00 38 18 18 18 c DB 066h,OOOh,038h,018h,018h,018h,03ch,OOOh 8b<br />
3C 00 c<br />
C8CO 7C C6 38 18 18 18 c DB 07ch,Oc6h,038h,018h,018h,018h,03ch,OOOh 8c<br />
3C 00 c<br />
C8C8 70 00 38 18 18 18 c DB 070h,OOOh,038h,018h,018h,018h,03ch,OOOh 8d<br />
3C 00 c<br />
C8DO 63 1C 36 63 7F 63 c DB 063h,01ch,036h,063h,07fh,063h,063h,OOOh 8e<br />
63 00 c<br />
C8D8 18 18 00 3C 66 7E c DB 018h,018h,OOOh,03ch,066h,07eh,066h,OOOh 8f<br />
66 DO c<br />
C8EO OE 00 7E 30 3C 30 c DB OOeh,OOOh,07eh,030h,03ch,030h,07eh,OOOh 90<br />
7E 00 c<br />
C8E8 DO 00 7F OC 7F CC c DB OOOh,OOOh,07fh,OOch,07fh,Occh,07fh,OOOh 91<br />
7F 00 c<br />
C8FO 1F 36 66 7F 66 66 c DB 01fh,036h,066h,07fh,066h,066h,067h,OOOh 92<br />
67 00 c<br />
C8F8 3C 66 00 3C 66 66 c DB 03ch,066h,OOOh,03ch,066h,066h,03ch,OOOh 93<br />
3C 00 c<br />
C900 00 66 00 3C 66 66 c DB OOOh,066h,OOOh,03ch,066h,066h,03ch,OOOh 94<br />
3C 00 c<br />
C908 DO 70 00 3C 66 66 c DB OOOh,070h,OOOh,03ch,066h,066h,03ch,OOOh 95<br />
3C 00 c<br />
C910 3C 66 00 66 66 66 c DB 03ch,066h,OOOh,066h,066h,066h,03fh,OOOh 96<br />
3F 00 c<br />
C918 00 70 00 66 66 66 c DB OOOh,070h,OOOh,066h,066h,066h,03fh,OOOh 97<br />
3F 00 c<br />
C920 00 66 00 66 66 3E c DB OOOh,066h,OOOh,066h,066h,03eh,006h,07ch 98<br />
06 7C c<br />
C928 C3 18 3C 66 66 3C c DB Oc3h,018h,03ch,066h,066h,03ch,018h,OOOh 99<br />
18 00 c<br />
C930 66 00 66 66 66 66 c DB 066h,OOOh,066h,066h,066h,066h,03ch,OOOh 9a<br />
3C 00 c<br />
c ;#ifdef NORDIC<br />
c DB OOOh,OOOh,OOOh,03ch,06eh,076h,03ch,OOOh 9b<br />
c DB 01ch,036h,032h,078h,030h,073h,07eh,OOOh 9c<br />
c DB 07ch,Oc6h,Oceh,Odeh,Of6h,Oe6h,07ch,OOOh 9d<br />
c DB Of0h,060h,066h,060h,062h,066h,Ofeh,OOOh 9e<br />
c DB 070h,030h,030h,036h,030h,030h,078h,OOOh 9f<br />
c ;#else NORDIC<br />
c ;#ifdef PORTUGAL<br />
c DB 007h,OOOh,01ch,036h,063h,07fh,063h,OOOh 9b<br />
c DB 01ch,036h,032h,078h,030h,073h,07eh,OOOh 9c<br />
c DB 070h,OOOh,01ch,036h,063h,07fh,063h,OOOh 9d<br />
c DB 018h,024h,07eh,030h,D3ch,030h,03eh,OOOh 9e<br />
c DB 03eh,063h,01ch,036h,063h,036h,01ch,OOOh 9f<br />
1-30 <strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong>
c ;#else PORTUGAL<br />
c DB 018h,018h,07eh,Oc0h,Oc0h,07eh,018h,018h 9b<br />
c DB 01ch,036h,032h,078h,030h,073h,07eh,OOOh 9c<br />
c DB 066h,066h,03ch,07eh,018h,07eh,018h,018h 9d<br />
c DB Of8h,Occh,Occh,Ofah,Oc6h,Ocfh,Oc6h,Oc7h 9e<br />
c DB OOeh,01bh,018h,D3ch,018h,018h,Od8h,070h 9f<br />
c ;#endif PORTUGAL<br />
c ;#endif NORDIC<br />
c DB OOeh,OOOh,03ch,006h,03eh,066h,03fh,OOOh aD<br />
c DB 01ch,OOOh,038h,018h,018h,018h,03ch,OOOh a1<br />
c DB OOOh,OOeh,OOOh,03ch,066h,066h,03ch,OOOh a2<br />
c DB OOOh,OOeh,OOOh,066h,066h,066h,03fh,OOOh a3<br />
c DB OOOh,07ch,OOOh,07ch,066h,066h,066h,OOOh a4<br />
c DB 07eh,OOOh,066h,076h,07eh,06eh,066h,OOOh aS<br />
c ;#ifdef NORDIC<br />
c DB OOOh,07eh,OOOh,D3ch,066h,066h,03ch,OOOh a6<br />
c DB 07eh,OOOh,01ch,036h,063h,036h,01ch,OOOh a7<br />
c DB 018h,OOOh,018h,030h,060h,066h,03ch,OOOh a8<br />
c DB 07eh,OOOh,03ch,006h,03eh,066h,03fh,OOOh a9<br />
c DB 07eh,OOOh,03ch,066h,07eh,066h,066h,OOOh a a<br />
c DB 010h,038h,06ch,06ch,038h,034h,058h,OOOh ab<br />
c DB OcOh,OcOh,OOOh,Of8h,Occh,Occh,Occh,OOOh ac<br />
c DB 018h,018h,OOOh,018h,018h,018h,018h,OOOh ad<br />
c DB 07ch,018h,030h,098h,070h,OOOh,OOOh,OOOh ae<br />
c DB 000h,Oc6h,07ch,Oc6h,Oc6h,07ch,Oc6h,OOOh af<br />
c ;#else NORDIC<br />
c ;#ifdef PORTUGAL<br />
c DB OOOh,07eh,OOOh,03ch,066h,066h,03ch,OOOh a6<br />
c DB 07eh,OOOh,D1ch,036h,063h,036h,01ch,OOOh a7<br />
c DB 018h,OOOh,018h,030h,060h,066h,03ch,OOOh a8<br />
c DB 07eh,OOOh,03ch,006h,03eh,066h,03fh,OOOh a9<br />
c DB 07eh,OOOh,03ch,066h,07eh,066h,066h,OOOh a a<br />
c DB 007h,OOOh,063h,063h,063h,063h,03eh,OOOh ab<br />
c DB OOeh,OOOh,03ch,018h,018h,018h,03ch,OOOh ac<br />
c DB 018h,018h,OOOh,018h,018h,018h,018h,OOOh ad<br />
c DB 07ch,018h,030h,098h,070h,OOOh,OOOh,OOOh ae<br />
c DB 007h,OOOh,01ch,036h,063h,036h,01ch,OOOh af<br />
c ;#else PORTUGAL<br />
c DB 03ch,06ch,06ch,03eh,OOOh,07eh,OOOh,OOOh a6<br />
c DB 038h,06ch,06ch,038h,OOOh,07ch,OOOh,OOOh a7<br />
c DB 018h,OOOh,018h,030h,060h,066h,03ch,OOOh a8<br />
c DB OOOh,OOOh,OOOh,07eh,060h,060h,OOOh,OOOh a9<br />
c DB OOOh,OOOh,OOOh,07eh,006h,006h,OOOh,OOOh a a<br />
c DB Oc3h,Oc6h,Occh,Odeh,033h,066h,Occh,OOfh ab<br />
c DB Oc3h,Oc6h,Occh,Odbh,037h,06fh,Ocfh,003h ac<br />
c DB 018h,018h,OOOh,018h,018h,018h,018h,OOOh ad<br />
c DB 000h,033h,066h,Occh,066h,033h,OOOh,OOOh ae<br />
c DB 000h,Occh,066h,033h,066h,Occh,OOOh,OOOh af<br />
c ;#endif PORTUGAL<br />
c ;#endif NORDIC<br />
C938 22 88 22 88 22 88 c DB 022h,088h,022h,088h,022h,088h,022h,088h bO<br />
22 88 c<br />
C940 55 AA 55 AA 55 AA c DB 055h,Oaah,055h,Oaah,055h,Oaah,055h,Oaah b1<br />
55 AA c<br />
C948 DB 77 DB EE DB 77 c DB Odbh,077h,Odbh,Oeeh,Odbh,077h,Odbh,Oeeh b2<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
1-31
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
DB EE c<br />
C950 18 18 18 18 18 18 c DB 018h,018h,018h,018h,018h,018h,018h,018h b3<br />
18 18 c<br />
C958 18 18 18 18 F8 18 c DB 018h,018h,018h,018h,Of8h,018h,018h,018h b4<br />
18 18 c<br />
C960 18 18 F8 18 F8 18 c DB 018h,018h,Of8h,D18h,Of8h,018h,018h,018h b5<br />
18 18 c<br />
C968 36 36 36 36 F6 36 c DB 036h,036h,036h,036h,Of6h,036h,D36h,036h b6<br />
36 36 c<br />
C970 DO DO DO DO FE 36 c DB OOOh,DODh,OOOh,ODOh,Ofeh,036h,036h,036h b7<br />
36 36 c<br />
C978 DO DO F8 18 F8 18 c DB OOOh,OOOh,Of8h,018h,Of8h,018h,018h,018h b8<br />
18 18 c<br />
C980 36 36 F6 06 F6 36 c DB 036h,036h,Of6h,OD6h,Of6h,036h,D36h,036h b9<br />
36 36 c<br />
C988 36 36 36 36 36 36 c DB 036h,036h,036h,036h,036h,036h,036h,036h ba<br />
36 36 c<br />
C990 00 DO FE 06 F6 36 c DB OOOh,OOOh,Ofeh,OD6h,Of6h,036h,036h,036h bb<br />
36 36 c<br />
C998 36 36 F6 06 FE DO c DB 036h,036h,Of6h,006h,Ofeh,OOOh,OOOh,OOOh be<br />
DO 00 c<br />
C9AO 36 36 36 36 FE 00 c DB 036h,036h,036h,D36h,Ofeh,OOOh,ODOh,OOOh bd<br />
DO 00 c<br />
C9A8 18 18 F8 18 F8 DO c DB 018h,018h,Of8h,018h,Of8h,OOOh,OOOh,OOOh be<br />
00 DO c<br />
C9BO 00 DO DO DO F8 18 c DB OOOh,DOOh,OOOh,DDOh,Of8h,018h,018h,018h bf<br />
18 18 c<br />
C9B8 18 18 18 18 1F DO c DB 018h,D18h,018h,018h,01fh,OODh,OODh,OOOh cO<br />
00 DO c<br />
C9CO 18 18 18 18 FF DO c DB 018h,018h,018h,018h,Dffh,OOOh,ODOh,OOOh c1<br />
00 DO c<br />
C9C8 00 DO DO DO FF 18 c DB OOOh,OOOh,OOOh,OOOh,Offh,018h,018h,018h c2<br />
18 18 c<br />
C9DO 18 18 18 18 1F 18 c DB 018h,018h,018h,018h,D1fh,018h,018h,018h c3<br />
18 18 c<br />
C9D8 DO 00 DO DO FF DO c DB DDOh,OOOh,ODOh,DOOh,Offh,OOOh,OOOh,OOOh c4<br />
00 00 c<br />
C9EO 18 18 18 18 FF 18 c DB 018h,018h,018h,018h,Offh,018h,018h,018h c5<br />
18 18 c<br />
C9E8 18 18 1F 18 1F 18 c DB 018h,018h,01fh,D18h,01fh,018h,018h,018h c6<br />
18 18 c<br />
C9FO 36 36 36 36 37 36 c DB 036h,036h,036h,036h,037h,036h,036h,036h c7<br />
36 36 c<br />
C9F8 36 36 37 30 3F 00 c DB 036h,036h,037h,030h,03fh,OOOh,OOOh,OOOh c8<br />
00 00 c<br />
CAOO DO 00 3F 30 37 36 c DB OOOh,DOOh,03fh,030h,037h,036h,036h,036h c9<br />
36 36 c<br />
CA08 36 36 F7 00 FF 00 c DB 036h,036h,Of7h,OOOh,Offh,OOOh,ODDh,OOOh ca<br />
00 00 c<br />
CA10 00 00 FF 00 F7 36 c DB OOOh,OOOh,Offh,OOOh,Of7h,036h,036h,036h cb<br />
36 36 c<br />
CA18 36 36 37 30 37 36 c DB 036h,036h,037h,030h,037h,036h,036h,036h cc<br />
36 36 c<br />
CA20 00 00 FF 00 FF 00 c DB OOOh,OOOh,Offh,OOOh,Offh,OOOh,OOOh,OOOh cd<br />
00 00 c<br />
1-32 <strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong>
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
1C 00 c<br />
CB08 1C 36 63 63 36 36 c DB 01ch,036h,063h,063h,036h,036h,077h,OOOh ea<br />
77 00 c<br />
CB10 OE 18 OC 3E 66 66 c DB OOeh,018h,OOch,03eh,066h,066h,03ch,OOOh eb<br />
3C 00 c<br />
CB18 00 00 7E DB DB 7E c DB OOOh,OOOh,07eh,Odbh,Odbh,07eh,OOOh,OOOh ec<br />
00 00 c<br />
CB20 06 DC 7E DB DB 7E c DB 006h,OOch,07eh,Odbh,Odbh,07eh,060h,OcOh ed<br />
60 co c<br />
CB28 1C 60 CO FC CO 60 c DB 01ch,060h,Oc0h,Ofch,Oc0h,060h,01ch,OOOh ee<br />
1C 00 c<br />
CB30 3C 66 66 66 66 66 c DB 03ch,066h,066h,066h,066h,066h,066h,ODOh ef<br />
66 00 c<br />
CB38 DO 7E DO 7E 00 7E c DB OOOh,07eh,OOOh,07eh,OOOh,07eh,OOOh,OOOh fO<br />
00 00 c<br />
CB40 18 18 7E 18 18 00 c DB 018h,018h,07eh,018h,018h,OOOh,07eh,ODOh f1<br />
7E 00 c<br />
CB48 30 18 oc 18 30 00 c DB 030h,018h,OOch,018h,030h,OOOh,07eh,OOOh f2<br />
7E DO c<br />
CBSO DC 18 30 18 OC 00 c DB 00ch,018h,030h,018h,ODch,OOOh,07eh,ODOh f3<br />
7E 00 c<br />
CB58 OE 1B 1B 18 18 18 c DB OOeh,01bh,01bh,018h,018h,018h,018h,D18h f4<br />
18 18 c<br />
CB60 18 18 18 18 18 D8 c DB 018h,018h,018h,018h,018h,Od8h,Od8h,070h f5<br />
D8 70 c<br />
CB68 18 18 00 7E 00 18 c DB 018h,018h,ODOh,07eh,OOOh,018h,018h,OOOh f6<br />
18 00 c<br />
CB70 00 76 DC 00 76 DC c DB OOOh,076h,Odch,OOOh,076h,Odch,OOOh,OOOh f7<br />
00 00 c<br />
CB78 38 6C 6C 38 00 00 c DB 038h,06ch,06ch,038h,ODOh,OOOh,OOOh,OOOh f8<br />
00 00 c<br />
CB80 DO 00 00 18 18 00 c DB OOOh,OOOh,OOOh,018h,018h,OOOh,OODh,ODOh f9<br />
00 00 c<br />
CB88 00 00 00 00 18 00 c DB OOOh,OOOh,OOOh,OOOh,018h,OOOh,OOOh,OOOh fa<br />
00 00 c<br />
CB90 OF OC OC OC EC 6C c DB OOfh,OOch,OOch,OOch,Oech,06ch,03ch,01ch fb<br />
3C 1C c<br />
CB98 78 6C 6C 6C 6C 00 c DB 078h,06ch,06ch,06ch,06ch,OOOh,OOOh,OOOh fc<br />
00 00 c<br />
CBAO 70 18 30 60 78 00 c DB 070h,018h,030h,060h,078h,OOOh,OOOh,OOOh fd<br />
00 00 c<br />
CBA8 00 00 3C 3C 3C 3C c DB OOOh,OOOh,03ch,03ch,03ch,03ch,OOOh,OOOh fe<br />
00 00 c<br />
CBBO DO 00 00 00 00 00 c DB OOOh,ODOh,OOOh,OOOh,OOOh,OOOh,OOOh,OOOh ff<br />
00 00 c<br />
c End of font matrix<br />
c<br />
CBB8 c fonthi8 endp<br />
CBB8 code ends<br />
c include kbdata,asm<br />
c ·======================================================================<br />
c Filename: kb,data: USA-ASCII<br />
c<br />
c This module includes the keyboard scan code translation data<br />
1-34 <strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong>
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
CBBF<br />
CBBF 1B1B<br />
CBC1 1B1B<br />
CBC3 1B 1B<br />
CBC5 COCO<br />
CBC7 3131<br />
CBC9 2121<br />
CBCB COCO<br />
CBCO 7800<br />
CBCF 3232<br />
CB01 2240<br />
CB03 COCC<br />
CB05 7900<br />
CB07 3333<br />
CB09 2323<br />
CBOB COCO<br />
CBOO 7AOO<br />
CBOF 3434<br />
CBE1 2424<br />
CBE3 COCO<br />
CBE5 7BOO<br />
CBE7 3535<br />
CBE9 2525<br />
CBEB COCO<br />
CBEO 7COO<br />
CBEF 3636<br />
CBF1 265E<br />
CBF3 C01E<br />
CBF5 7000<br />
CBF7 3737<br />
CBF9 2726<br />
CBFB COCO<br />
CBFO 7EOO<br />
CBFF 3838<br />
CC01 282A<br />
CC03 COCO<br />
CC05 7FOO<br />
CC07 3939<br />
CC09 2928<br />
CCOB COCO<br />
CCOD 8000<br />
CCOF 3030<br />
CC11 5F29<br />
CC13 1FCD<br />
CC15 8100<br />
CC17 2020<br />
CC19 305F<br />
CC1B C01F<br />
1-36<br />
c<br />
c .--------------------------------------------------------------------c<br />
c<br />
c .--------------------------------------------------------------------c<br />
Alphabetic (Migratory) I AT&T !Other I<br />
C kb data table label byte<br />
c<br />
C dw<br />
C dw<br />
C dw<br />
C dw<br />
C dw<br />
C dw<br />
c dw<br />
C dw<br />
C dw<br />
C dw<br />
C dw<br />
C dw<br />
C dw<br />
C dw<br />
C dw<br />
C dw<br />
C dw<br />
C dw<br />
C dw<br />
C dw<br />
C dw<br />
C dw<br />
C dw<br />
C dw<br />
C dw<br />
c dw<br />
C dw<br />
C dw<br />
C dw<br />
C dw<br />
C dw<br />
C dw<br />
C dw<br />
C dw<br />
C dw<br />
C dw<br />
C dw<br />
C dw<br />
C dw<br />
c dw<br />
C dw<br />
C dw<br />
C dw<br />
C dw<br />
C dw<br />
C dw<br />
C dw<br />
(1Bh) * 100h + (1Bh)<br />
(1Bh) * 100h + (1Bh)<br />
(1Bh) * 100h + (1Bh)<br />
kNONE * 100h + kNONE<br />
(31h) * 100h + (31h)<br />
(21h) * 100h + (21h)<br />
kNONE * 100h + kNONE<br />
7800h<br />
(32h) * 100h + (32h)<br />
(22h) * 100h + (40h)<br />
kNONE * 100h + kbnul<br />
7900h<br />
(33h) * 100h + (33h)<br />
(23h) * 100h + (23h)<br />
kNONE * 100h + kNONE<br />
7A00h<br />
(34h) * 100h + (34h)<br />
(24h) * 100h + (24h)<br />
kNONE * 100h + kNONE<br />
7BOOh<br />
(35h) * 100h + (35h)<br />
(25h) * 100h + (25h)<br />
kNONE * 100h + kNONE<br />
7COOh<br />
(36h) * 100h + (36h)<br />
(26h) * 100h + (5Eh)<br />
kNONE * 100h + (1Eh)<br />
7000h<br />
(37h) * 100h + (37h)<br />
(27h) * 100h + (26h)<br />
kNONE * 100h + kNONE<br />
7EOOh<br />
(38h) * 100h + (38h)<br />
(28h) * 100h + (2Ah)<br />
kNONE * 100h + kNONE<br />
7F00h<br />
(39h) * 100h + (39h)<br />
(29h) * 100h + (28h)<br />
kNONE * 100h + kNONE<br />
8000h<br />
(30h) * 100h + (30h)<br />
(5Fh) * 100h + (29h)<br />
(1Fh) * 100h + kNONE<br />
8100h<br />
(20h) * 100h + (20h)<br />
(3Dh) * 100h + (5Fh)<br />
kNONE * 100h + (1Fh)<br />
01 01h<br />
02 02h<br />
03 03h<br />
04 04h<br />
05 05h<br />
06 06h<br />
07 07h<br />
08 08h<br />
09 09h<br />
10 OAh<br />
11 OBh<br />
12 OCh<br />
I KB I KBs I<br />
ESC ESC<br />
ESC ESC<br />
ESC ESC<br />
None None<br />
None None<br />
X120<br />
2 2<br />
@<br />
(BASE)<br />
(SHIFT)<br />
(CTL)<br />
(ALT)<br />
None NUL=X03(A©)<br />
X121<br />
3 3<br />
# #<br />
None None<br />
X122<br />
4 4<br />
$ $<br />
None None<br />
X123<br />
5 5<br />
% %<br />
None None<br />
X124<br />
6 6<br />
&<br />
None RS (AA)<br />
X125<br />
7 7<br />
&<br />
None None<br />
X126<br />
8<br />
(<br />
8<br />
None None<br />
X127<br />
9 9<br />
) (<br />
None None<br />
X128<br />
0 0<br />
)<br />
US (A_) None<br />
X129<br />
None US (A )<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong>
CC10 8200<br />
CC1F 5E30<br />
CC21 7E28<br />
CC23 1ECO<br />
CC2S 8300<br />
CC27 0808<br />
CC29 0808<br />
CC28 7F7F<br />
CC20 COCO<br />
CC2F 0909<br />
CC31 OFOO<br />
CC33 COCO<br />
CC3S COCO<br />
CC37 7171<br />
CC39 S1S1<br />
CC3B 1111<br />
CC30 1000<br />
CC3F 7777<br />
CC41 S757<br />
CC43 1717<br />
CC4S 1100<br />
CC47 6S6S<br />
CC49 4S4S<br />
CC4B OSOS<br />
CC4D 1200<br />
CC4F 7272<br />
CC51 52S2<br />
CC53 1212<br />
cess 1300<br />
CCS7 7474<br />
CCS9 S4S4<br />
cess 1414<br />
CCSD 1400<br />
CCSF 7979<br />
CC61 S9S9<br />
CC63 1919<br />
CC6S 1500<br />
CC67 757S<br />
CC69 5S5S<br />
CC68 1515<br />
CC60 1600<br />
CC6F 6969<br />
CC71 4949<br />
CC73 0909<br />
CC75 1700<br />
CC77 6F6F<br />
CC79 4F4F<br />
CC78 OFOF<br />
CC7D 1800<br />
CC7F 7070<br />
CC81 SOSO<br />
CC83 1010<br />
cess 1900<br />
CC87 40SB<br />
CC89 6078<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
C dw<br />
c dw<br />
C dw<br />
C dw<br />
C dw<br />
C dw<br />
c dw<br />
C dw<br />
C dw<br />
C dw<br />
c dw<br />
c dw<br />
C dw<br />
C dw<br />
C dw<br />
C dw<br />
C dw<br />
C dw<br />
C dw<br />
C dw<br />
C dw<br />
C dw<br />
C dw<br />
c dw<br />
C dw<br />
C dw<br />
C dw<br />
c dw<br />
C dw<br />
C dw<br />
C dw<br />
C dw<br />
C dw<br />
C dw<br />
C dw<br />
C dw<br />
C dw<br />
C dw<br />
C dw<br />
C dw<br />
C dw<br />
C dw<br />
C dw<br />
C dw<br />
C dw<br />
c dw<br />
C dw<br />
C dw<br />
C dw<br />
c dw<br />
C dw<br />
C dw<br />
C dw<br />
C dw<br />
C dw<br />
8200h<br />
(SEh) * 100h + (3Dh)<br />
(7Eh) * 100h + (2Bh)<br />
(1Eh) * 100h + kNONE<br />
8300h<br />
(08h) * 100h + (08h)<br />
(08h) * 100h + (08h)<br />
(7Fh) * 100h + (7Fh)<br />
kNONE * 100h + kNONE<br />
(09h) * 100h + (09h)<br />
OFOOh<br />
kNONE * 100h + kNONE<br />
kNONE * 100h + kNONE<br />
(71h) * 100h + (71h)<br />
(S1h) * 100h + (S1h)<br />
(11h) * 100h + (11h)<br />
1000h<br />
(77h) * 100h + (77h)<br />
(S7h) * 100h + (S7h)<br />
(17h) * 100h + (17h)<br />
1100h<br />
(6Sh) * 100h + (6Sh)<br />
(45h) * 100h + (4Sh)<br />
(OSh) * 100h + (OSh)<br />
1200h<br />
(72h) * 100h + (72h)<br />
(S2h) * 100h + (S2h)<br />
(12h) * 100h + (12h)<br />
1300h<br />
(74h) * 100h + (74h)<br />
(54h) * 100h + (S4h)<br />
(14h) * 100h + (14h)<br />
1400h<br />
(79h) * 100h + (79h)<br />
(S9h) * 100h + (S9h)<br />
(19h) * 100h + (19h)<br />
1500h<br />
(75h) * 100h + (75h)<br />
(S5h) * 100h + (S5h)<br />
(15h) * 100h + (15h)<br />
1600h<br />
(69h) * 100h + (69h)<br />
(49h) * 100h + (49h)<br />
(09h) * 100h + (09h)<br />
1700h<br />
(6Fh) * 100h + (6Fh)<br />
(4Fh) * 100h + (4Fh)<br />
(OFh) * 10Dh + (OFh)<br />
1800h<br />
(70h) * 100h + (70h)<br />
(SOh) * 100h + (SOh)<br />
(10h) * 100h + (10h)<br />
1900h<br />
(40h) * 100h + (SBh)<br />
(60h) * 100h + (7Bh)<br />
13 DOh<br />
14 OEh<br />
1S OFh<br />
16 1Dh<br />
17 11h<br />
18 12h<br />
19 13h<br />
20 14h<br />
21 1Sh<br />
22 16h<br />
23 17h<br />
24 18h<br />
2S 19h<br />
26 1Ah<br />
X130<br />
+<br />
RS (M) None<br />
X131<br />
BS BS<br />
BS BS<br />
DEL DEL<br />
None None<br />
HT HT<br />
RHT=X1S<br />
None None<br />
None None<br />
q q<br />
Q Q<br />
DCWQ) OCWQ)<br />
X16<br />
w w<br />
w w<br />
ETB(AW) ETB(AW)<br />
X17<br />
e e<br />
E E<br />
ENQ(AE) ENQ(AE)<br />
X18<br />
r<br />
R R<br />
DC2(AR) DC2(AR)<br />
X19<br />
t t<br />
T T<br />
OC4p) OC4p)<br />
xzo<br />
y y<br />
y y<br />
EM n) EM n)<br />
X21<br />
u u<br />
u u<br />
NAK(AU) NAK(AU)<br />
X22<br />
i i<br />
I I<br />
HT n) HT n)<br />
X23<br />
0 0<br />
0 0<br />
SI (AO) SI (AO)<br />
X24<br />
p p<br />
p p<br />
DLE(AP) DLE(AP)<br />
X2S<br />
@<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
1-37
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
CC8B CC1B<br />
CC80 COCO<br />
CC8F 5B50<br />
CC91 7B70<br />
CC93 1B10<br />
CC95 COCO<br />
CC97 0000<br />
CC99 0000<br />
CC9B OAOA<br />
CC90 COCO<br />
CC9F C5C5<br />
CCA1 C5C5<br />
CCA3 C5C5<br />
CCA5 C5C5<br />
CCA7 6161<br />
CCA9 4141<br />
CCAB 0101<br />
CCAO 1EOO<br />
CCAF 7373<br />
CCB1 5353<br />
CCB3 1313<br />
CCB5 1FOO<br />
CCB7 6464<br />
CCB9 4444<br />
CCBB 0404<br />
CCBO 2000<br />
CCBF 6666<br />
CCC1 4646<br />
CCC3 0606<br />
CCC5 2100<br />
CCC7 6767<br />
CCC9 4747<br />
CCCB 0707<br />
CCCO 2200<br />
CCCF 6868<br />
CC01 4848<br />
CC03 0808<br />
CC05 2300<br />
CC07 6A6A<br />
CC09 4A4A<br />
CCOB OAOA<br />
CCOO 2400<br />
CCOF 6B6B<br />
CCE1 4B4B<br />
CCE3 OBOB<br />
CCE5 2500<br />
CCE7 6C6C<br />
CCE9 4C4C<br />
CCEB OCOC<br />
CCEO 2600<br />
CCEF 3B3B<br />
CCF1 2B3A<br />
CCF3 COCO<br />
CCF5 COCO<br />
CCF7 3A27<br />
1-38<br />
C dw<br />
C dw<br />
c dw<br />
c dw<br />
C dw<br />
c dw<br />
c dw<br />
c dw<br />
c dw<br />
c dw<br />
C dw<br />
c dw<br />
c dw<br />
c dw<br />
C dw<br />
C dw<br />
C dw<br />
c dw<br />
c dw<br />
C dw<br />
C dw<br />
C dw<br />
C dw<br />
C dw<br />
C dw<br />
C dw<br />
C dw<br />
C dw<br />
C dw<br />
C dw<br />
C dw<br />
C dw<br />
C dw<br />
c dw<br />
C dw<br />
C dw<br />
c dw<br />
c dw<br />
c dw<br />
C dw<br />
C dw<br />
C dw<br />
C dw<br />
C dw<br />
C dw<br />
C dw<br />
C dw<br />
C dw<br />
C dw<br />
C dw<br />
C dw<br />
C dw<br />
C dw<br />
C dw<br />
C dw<br />
kbnu1 * 100h + (1Bh)<br />
kNONE * 100h + kNONE<br />
(5Bh) * 100h + (SOh)<br />
(7Bh) * 100h + (70h)<br />
(1Bh) * 100h + (10h)<br />
kNONE * 100h + kNONE<br />
(OOh) * 100h + (OOh)<br />
(OOh) * 100h + (OOh)<br />
(OAh) * 100h + (OAh)<br />
kNONE * 100h + kNONE<br />
kbct1 * 100h + kbct1<br />
kbct1 * 100h + kbct1<br />
kbct1 * 100h + kbct1<br />
kbct1 * 100h + kbct1<br />
(61h) * 100h + (61h)<br />
(41h) * 100h + (41h)<br />
(01h) * 100h + (01h)<br />
1EOOh<br />
(73h) * 100h + (73h)<br />
(53h) * 100h + (53h)<br />
(13h) * 100h + (13h)<br />
1FOOh<br />
(64h) * 100h + (64h)<br />
(44h) * 100h + (44h)<br />
(04h) * 100h + (04h)<br />
2000h<br />
(66h) * 100h + (66h)<br />
(46h) * 100h + (46h)<br />
(06h) * 100h + (06h)<br />
2100h<br />
(67h) * 100h + (67h)<br />
(47h) * 100h + (47h)<br />
(07h) * 100h + (07h)<br />
2200h<br />
(68h) * 100h + (68h)<br />
(48h) * 100h + (48h)<br />
(08h) * 100h + (08h)<br />
2300h<br />
(6Ah) * 100h + (6Ah)<br />
(4Ah) * 100h + (4Ah)<br />
(OAh) * 100h + (OAh)<br />
2400h<br />
(6Bh) * 100h + (6Bh)<br />
(4Bh) * 100h + (4Bh)<br />
(OBh) * 100h + (OBh)<br />
2500h<br />
(6Ch) * 100h + (6Ch)<br />
(4Ch) * 100h + (4Ch)<br />
(OCh) * 100h + (OCh)<br />
2600h<br />
(3Bh) * 100h + (3Bh)<br />
(2Bh) * 100h + (3Ah)<br />
kNONE * 100h + kNONE<br />
kNONE * 100h + kNONE<br />
(3Ah) * 100h + (27h)<br />
27 1Bh<br />
28 1Ch<br />
29 10h<br />
30 1Eh<br />
31 1Fh<br />
32 20h<br />
33 21h<br />
34 22h<br />
35 23h<br />
36 24h<br />
37 25h<br />
38 26h<br />
39 27h<br />
40 28h<br />
NUL=X03(A@) ESC(A[)<br />
None None<br />
l }<br />
ESCC[) GS n)<br />
None None<br />
CR CR<br />
CR CR<br />
LF LF<br />
None None<br />
Ctr1 Ctr1<br />
Ctr1 Ctr1<br />
Ctr1 Ctr1<br />
Ctr1 Ctr1<br />
a a<br />
A A<br />
SOH(AA) SOH(AA)<br />
X30<br />
s s<br />
s s<br />
oc3cAs) oc3n)<br />
X31<br />
d d<br />
0 0<br />
EOT(AO) EOT(AO)<br />
X32<br />
F F<br />
ACKp) ACK(AF)<br />
X33<br />
g g<br />
G G<br />
BEL(AG) BEL(AG)<br />
X34<br />
h h<br />
H H<br />
BS (AH) BS (AH)<br />
X35<br />
j j<br />
j j<br />
LF (AJ) LF (AJ)<br />
X36<br />
k k<br />
K K<br />
VT (AK) VT (AK)<br />
X37<br />
1 1<br />
L L<br />
FF (AL) FF CAL)<br />
X38<br />
+<br />
None None<br />
None None<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong>
CCF9 2A22<br />
CCFB COCO<br />
CCFO COCO<br />
CCFF 5060<br />
C001 707E<br />
C003 10CO<br />
coos coco<br />
C007 C6C6<br />
C009 C6C6<br />
COOB C6C6<br />
COOO C6C6<br />
cooF sese<br />
C011 7C7C<br />
C013 1C1C<br />
C015 COCO<br />
C017 7A7A<br />
C019 SASA<br />
C01B 1A 1A<br />
C010 2COO<br />
C01F 7878<br />
C021 5858<br />
C023 1818<br />
C025 2000<br />
C027 6363<br />
C029 4343<br />
C02B 0303<br />
C020 2EOO<br />
C02F 7676<br />
C031 5656<br />
C033 1616<br />
C035 2FOO<br />
C037 6262<br />
C039 4242<br />
C03B 0202<br />
C030 3000<br />
C03F 6E6E<br />
C041 4E4E<br />
C043 OEOE<br />
C045 3100<br />
C047 6060<br />
C049 4040<br />
C04B 0000<br />
C040 3200<br />
C04F 2C2C<br />
C051 3C3C<br />
C053 COCO<br />
coss coco<br />
C057 2E2E<br />
C059 3E3E<br />
COSB COCO<br />
coso coco<br />
COSF 2F2F<br />
C061 3F3F<br />
C063 COCO<br />
C065 COCO<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
C dw<br />
C dw<br />
C dw<br />
C dw<br />
C dw<br />
C dw<br />
C dw<br />
C dw<br />
C dw<br />
c dw<br />
c dw<br />
C dw<br />
C dw<br />
C dw<br />
C dw<br />
C dw<br />
C dw<br />
C dw<br />
C dw<br />
C dw<br />
C dw<br />
C dw<br />
C dw<br />
C dw<br />
C dw<br />
c dw<br />
C dw<br />
C dw<br />
C dw<br />
C dw<br />
C dw<br />
c dw<br />
c dw<br />
c dw<br />
C dw<br />
C dw<br />
C dw<br />
C dw<br />
C dw<br />
C dw<br />
C dw<br />
C dw<br />
C dw<br />
C dw<br />
C dw<br />
C dw<br />
C dw<br />
C dw<br />
C dw<br />
C dw<br />
c dw<br />
C dw<br />
C dw<br />
C dw<br />
C dw<br />
(2Ah) * 100h + (22h)<br />
kNONE * 100h + kNONE<br />
kNONE * 100h + kNONE<br />
(SOh) * 100h + (60h)<br />
(70h) * 100h + (7Eh)<br />
(10h) * 100h + kNONE<br />
kNONE * 100h + kNONE<br />
kblsh * 10Dh + kblsh<br />
kblsh * 100h + kblsh<br />
kblsh * 100h + kblsh<br />
kblsh * 10Dh + kblsh<br />
(SCh) * 100h + (SCh)<br />
(7Ch) * 100h + (7Ch)<br />
(1Ch) * 100h + (1Ch)<br />
kNONE * 100h + kNONE<br />
(7Ah) * 100h + (7Ah)<br />
(SAh) * 100h + (SAh)<br />
(1Ah) * 100h + (1Ah)<br />
2COOh<br />
(78h) * 100h + (78h)<br />
(58h) * 100h + (58h)<br />
(18h) * 100h + (18h)<br />
2000h<br />
(63h) * 100h + (63h)<br />
(43h) * 100h + (43h)<br />
(03h) * 100h + (03h)<br />
2EOOh<br />
(76h) * 100h + (76h)<br />
(56h) * 100h + (56h)<br />
(16h) * 100h + (16h)<br />
2FOOh<br />
(62h) * 100h + (62h)<br />
(42h) * 100h + (42h)<br />
(02h) * 100h + (02h)<br />
3000h<br />
(6Eh) * 100h + (6Eh)<br />
(4Eh) * 100h + (4Eh)<br />
(OEh) * 100h + (OEh)<br />
3100h<br />
(60h) * 100h + (60h)<br />
(40h) * 100h + (40h)<br />
(DOh) * 100h + (DOh)<br />
3200h<br />
(2Ch) * 100h + (2Ch)<br />
(3Ch) * 100h + (3Ch)<br />
kNONE * 100h + kNONE<br />
kNONE * 100h + kNONE<br />
(2Eh) * 100h + (2Eh)<br />
(3Eh) * 100h + (3Eh)<br />
kNONE * 100h + kNONE<br />
kNONE * 100h + kNONE<br />
(2Fh) * 100h + (2Fh)<br />
(3Fh) * 100h + (3Fh)<br />
kNONE * 100h + kNONE<br />
kNONE * 100h + kNONE<br />
41 29h<br />
42 2Ah<br />
43 2Bh<br />
44 2Ch<br />
45 20h<br />
46 2Eh<br />
47 2Fh<br />
48 30h<br />
49 31h<br />
50 32h<br />
51 33h<br />
52 34h<br />
53 35h<br />
*<br />
None None<br />
None None<br />
GS n) None<br />
None None<br />
LShft LShft<br />
LShft LShft<br />
LShft LShft<br />
LShft LShft<br />
\ \<br />
I I<br />
FS n FS n<br />
None None<br />
z z<br />
z z<br />
SUB(AZ) SUBn)<br />
X44<br />
X X<br />
X X<br />
CANn) CAN(AX)<br />
X45<br />
c c<br />
c c<br />
ETXCC) ETXCC)<br />
X46<br />
v v<br />
v v<br />
SYNn) SYNCV)<br />
X47<br />
b b<br />
B B<br />
STX(AB) STX(AB)<br />
X48<br />
n n<br />
N N<br />
SQ (AN) SQ (AN)<br />
X49<br />
m m<br />
M M<br />
CR (AM) CR CM)<br />
xso<br />
< <<br />
None None<br />
None None<br />
> ><br />
None None<br />
None None<br />
I I<br />
? ?<br />
None None<br />
None None<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
1-39
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
C067 C7C7<br />
C069 C7C7<br />
COBB C7C7<br />
C060 C7C7<br />
C06F 2A2A<br />
C071 CBCB<br />
C073 7200<br />
C075 COCO<br />
C077 C4C4<br />
C079 C4C4<br />
C07B C4C4<br />
C070 C4C4<br />
C07F 2020<br />
C081 2020<br />
C083 2020<br />
C085 2020<br />
C087 C1C1<br />
C089 C1C1<br />
C08B C1C1<br />
COSO C1C1<br />
C08F 3BOO<br />
C091 5400<br />
C093 SEOO<br />
C095 6800<br />
C097 3COO<br />
C099 5500<br />
C09B SFOO<br />
C090 6900<br />
C09F 3000<br />
COA1 5600<br />
COA3 6000<br />
COAS 6AOO<br />
COA7 3EOO<br />
COA9 5700<br />
COAB 6100<br />
COAO 6BOO<br />
COAF 3FOO<br />
COB1 5800<br />
COB3 6200<br />
COBS 6COO<br />
COB7 4000<br />
COB9 5900<br />
COBB <strong>6300</strong><br />
COBO 6000<br />
COBF 4100<br />
COC1 SAOO<br />
COC3 6400<br />
COCS 6EOO<br />
COC7 4200<br />
1-40<br />
c<br />
c .----------------------------------------------------------------------<br />
c Alphabetic (Non-Migratory)<br />
c<br />
I AT&T IOther I<br />
I KB I KBs I<br />
c .----------------------------------------------------------------------<br />
c<br />
C dw<br />
C dw<br />
C dw<br />
C dw<br />
C dw<br />
C dw<br />
C dw<br />
C dw<br />
C dw<br />
C dw<br />
C dw<br />
C dw<br />
C dw<br />
C dw<br />
c dw<br />
C dw<br />
C dw<br />
C dw<br />
C dw<br />
C dw<br />
C dw<br />
C dw<br />
C dw<br />
C dw<br />
C dw<br />
C dw<br />
C dw<br />
C dw<br />
C dw<br />
C dw<br />
C dw<br />
C dw<br />
c dw<br />
C dw<br />
C dw<br />
C dw<br />
C dw<br />
C dw<br />
C dw<br />
C dw<br />
C dw<br />
C dw<br />
C dw<br />
C dw<br />
C dw<br />
C dw<br />
C dw<br />
C dw<br />
C dw<br />
kbrsh * 100h + kbrsh<br />
kbrsh * 100h + kbrsh<br />
kbrsh * 100h + kbrsh<br />
kbrsh * 100h + kbrsh<br />
(2Ah) * 100h + (2Ah)<br />
kbprt * 100h + kbprt<br />
7200h<br />
kNONE * 100h + kNONE<br />
kbalt * 100h + kbalt<br />
kbalt * 100h + kbalt<br />
kbalt * 100h + kbalt<br />
kbalt * 100h + kbalt<br />
(20h) * 100h + (20h)<br />
(20h) * 100h + (20h)<br />
(20h) * 100h + (20h)<br />
(20h) * 100h + (20h)<br />
kbcap * 100h + kbcap<br />
kbcap * 100h + kbcap<br />
kbcap * 100h + kbcap<br />
kbcap * 100h + kbcap<br />
3BOOh<br />
5400h<br />
SEOOh<br />
6800h<br />
3COOh<br />
5500h<br />
SFOOh<br />
6900h<br />
3000h<br />
5600h<br />
6000h<br />
6AOOh<br />
3EOOh<br />
5700h<br />
6100h<br />
6BOOh<br />
3FOOh<br />
5800h<br />
6200h<br />
6COOh<br />
4000h<br />
5900h<br />
<strong>6300</strong>h<br />
6000h<br />
4100h<br />
SAOOh<br />
6400h<br />
6EOOh<br />
4200h<br />
54 36h<br />
55 37h<br />
56 38h<br />
57 39h<br />
58 3Ah<br />
59 3Bh<br />
60 3Ch<br />
61 30h<br />
62 3Eh<br />
63 3Fh<br />
64 40h<br />
65 41h<br />
66 42h<br />
RShft RShft<br />
RShft RShft<br />
RShft RShft<br />
RShft RShft<br />
PrtSc PrtSc<br />
X114<br />
None None<br />
ALT ALT<br />
AL T ALT<br />
ALT ALT<br />
ALT ALT<br />
SP SP<br />
SP SP<br />
SP SP<br />
SP SP<br />
Caplk Caplk<br />
Caplk Caplk<br />
Caplk Caplk<br />
Caplk Caplk<br />
F01=X59<br />
F11=X84<br />
F21=X94<br />
F31=X104<br />
F02=X60<br />
F12=X85<br />
F22=X95<br />
F32=X105<br />
F03=X61<br />
F13=X86<br />
F23=X96<br />
F33=X106<br />
F04=X62<br />
F14=X87<br />
F24=X97<br />
F34=X107<br />
F05=X63<br />
F15=X88<br />
F25=X98<br />
F35=X108<br />
F06=X64<br />
F16=X89<br />
F26=X99<br />
F36=X109<br />
F07=X65<br />
F17=X90<br />
F27=X100<br />
F37=X110<br />
F08=X66<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong>
CDC9 SBOO<br />
CDCB 6500<br />
COCO 6FOO<br />
CDCF 4300<br />
CDD1 SCOO<br />
CDD3 6600<br />
coos 7000<br />
CDD7 4400<br />
CDD9 5000<br />
CDDB 6700<br />
CDDD 7100<br />
CDDF C2C2<br />
CDE1 C2C2<br />
CDE3 CACA<br />
CDES C2C2<br />
CDE7 C3C3<br />
CDE9 C3C3<br />
CDEB C9C9<br />
COED C3C3<br />
CDEF 4700<br />
CDF1 3737<br />
CDF3 7700<br />
CDFS DODO<br />
CDF7 4800<br />
CDF9 3838<br />
CDFB COCO<br />
CDFD CFCF<br />
CDFF 4900<br />
CE01 3939<br />
CE03 8400<br />
CEOS CECE<br />
CE07 2020<br />
CE09 2020<br />
CEOB COCO<br />
CEOD COCO<br />
CEOF 4BOO<br />
CE11 3434<br />
CE13 7300<br />
CE15 0303<br />
CE17 COCO<br />
CE19 3535<br />
CE1B COCO<br />
CE1D 0202<br />
CE1F 4000<br />
CE21 3636<br />
CE23 7400<br />
CE25 0101<br />
CE27 2B2B<br />
CE29 2B2B<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
C dw<br />
C dw<br />
C dw<br />
C dw<br />
C dw<br />
c dw<br />
C dw<br />
C dw<br />
C dw<br />
c dw<br />
C dw<br />
C dw<br />
C dw<br />
dw<br />
dw<br />
dw<br />
dw<br />
dw<br />
dw<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
SBOOh<br />
6500h<br />
6FOOh<br />
4300h<br />
SCOOh<br />
6600h<br />
7000h<br />
4400h<br />
SDOOh<br />
6700h<br />
7100h<br />
kbnum * 100h + kbnum<br />
kbnum * 100h + kbnum<br />
pause * 100h + pause<br />
kbnum * 100h + kbnum<br />
kbscr * 100h + kbscr<br />
kbscr * 100h + kbscr<br />
kbbrk * 100h + kbbrk<br />
kbscr * 100h + kbscr<br />
67 43h<br />
68 44h<br />
69 4Sh<br />
70 46h<br />
F18=X91<br />
F28=X101<br />
F38=X111<br />
F09=X67<br />
F19=X92<br />
F29=X102<br />
F39=X112<br />
F10=X68<br />
F20=X93<br />
F30=X103<br />
F40=X113<br />
Numlk Numlk<br />
Numlk Numlk<br />
Pause<br />
Numlk<br />
Scrlk<br />
Scrlk<br />
Break<br />
Scrlk<br />
Pause<br />
Numlk<br />
Scrlk<br />
Scrlk<br />
Break<br />
Scrlk<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
c ·--------------------------------------------------------------------c<br />
Numeric Keypad I AT&T IOther I<br />
c<br />
I KB I KBs I<br />
c .--------------------------------------------------------------------c<br />
C dw<br />
4700h<br />
71 47h Home=X71<br />
C dw (37h) * 100h + (37h)<br />
7 7<br />
C dw<br />
7700h<br />
X119<br />
C dw kdec7 * 100h + kdec7<br />
XDec7 XDec7<br />
C dw<br />
4800h<br />
72 48h Up =X72<br />
C dw (38h) * 100h + (38h)<br />
8 8<br />
C dw kNONE * 100h + kNONE<br />
None None<br />
C dw kdec8 * 100h + kdec8<br />
XDec8 XDec8<br />
C dw<br />
4900h<br />
73 49h PgUp=X73<br />
C dw (39h) * 100h + (39h)<br />
9 9<br />
C dw<br />
8400h<br />
X132<br />
C dw kdec9 * 100h + kdec9<br />
XDec9 XDec9<br />
C dw (2Dh) * 100h + (2Dh) 74 4Ah<br />
C dw (2Dh) * 100h + (2Dh)<br />
C dw kNONE * 100h + kNONE<br />
None None<br />
C dw kNONE * 100h + kNONE<br />
None None<br />
C dw<br />
4BOOh<br />
75 4Bh Left=X75<br />
C dw (34h) * 100h + (34h)<br />
4 4<br />
C dw<br />
7300h<br />
X115<br />
C dw kdec4 * 100h + kdec4<br />
XDec4 XDec4<br />
C dw kNONE * 100h + kNONE 76 4Ch None None<br />
C dw (3Sh) * 100h + (35h)<br />
5 5<br />
C dw kNONE * 100h + kNONE<br />
None None<br />
C dw kdecS * 100h + kdecS<br />
XDec5 XDec5<br />
C dw<br />
4000h<br />
77 4Dh Rght=X77<br />
C dw (36h) * 100h + (36h)<br />
6 6<br />
C dw<br />
7400h<br />
X116<br />
C dw kdec6 * 100h + kdec6<br />
XDec6 XDec6<br />
C dw (2Bh) * 100h + (2Bh) 78 4Eh + +<br />
C dw (2Bh) * 100h + (2Bh)<br />
+ +<br />
1-41
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
CE2B COCO<br />
CE20 COCO<br />
CE2F 4FOO<br />
CE31 3131<br />
CE33 7SOO<br />
CE3S 0606<br />
CE37 SOOO<br />
CE39 3232<br />
CE3B COCO<br />
CE3D OSDS<br />
CE3F S100<br />
CE41 3333<br />
CE43 7600<br />
CE4S 0404<br />
CE47 COCO<br />
CE49 3030<br />
CE4B COCO<br />
CE4D 0707<br />
CE4F S300<br />
CES1 2E2E<br />
CES3 C8C8<br />
CESS C8C8<br />
CES7 0808<br />
CES9 0808<br />
CESB COCO<br />
CESD COCO<br />
CESF CBCB<br />
CE61 CBCB<br />
CE63 7200<br />
CE6S COCO<br />
CE67 CACA<br />
CE69 CACA<br />
CE6B CACA<br />
CE6D CACA<br />
CE6F DODD<br />
CE71 0000<br />
CE73 DADA<br />
CE7S COCO<br />
CE77 4800<br />
CE79 7300<br />
CE7B 7300<br />
CE7D 7300<br />
CE7F SOOO<br />
CE81 SOOO<br />
CE83 SOOO<br />
CE8S SOOO<br />
CE87 4000<br />
CE89 7400<br />
CESB 7400<br />
1-42<br />
C dw<br />
C dw<br />
C dw<br />
C dw<br />
C dw<br />
c dw<br />
C dw<br />
C dw<br />
C dw<br />
C dw<br />
C dw<br />
C dw<br />
c dw<br />
C dw<br />
C dw<br />
C dw<br />
C dw<br />
C dw<br />
C dw<br />
C dw<br />
C dw<br />
C dw<br />
kNONE * 100h + kNONE<br />
kNDNE * 10Dh + kNDNE<br />
4FDOh<br />
(31h) * 1DDh + (31h)<br />
7SDOh<br />
kdec1 * 100h + kdec1<br />
SOOOh<br />
(32h) * 100h + (32h)<br />
kNONE * 100h + kNDNE<br />
kdec2 * 100h + kdec2<br />
S100h<br />
(33h) * 100h + (33h)<br />
7600h<br />
kdec3 * 100h + kdec3<br />
kbins * 100h + kbins<br />
(30h) * 100h + (30h)<br />
kNONE * 100h + kNONE<br />
kdecO * 100h + kdecO<br />
S3DOh<br />
(2Eh) * 100h + (2Eh)<br />
kbres * 10Dh + kbres<br />
kbres * 100h + kbres<br />
79 4Fh<br />
80 SOh<br />
81 S1h<br />
82 S2h<br />
83 S3h<br />
None None<br />
None None<br />
End =X79<br />
1 1<br />
X117<br />
XOec1 XDec1<br />
Down=X80<br />
2 2<br />
None None<br />
XOec2 XDec2<br />
Pg0n=X81<br />
3 3<br />
X118<br />
XDec3 XOec3<br />
INS=X82 INS=X82<br />
0 0<br />
None None<br />
XDecO XDecO<br />
DEL =X83<br />
Reset Reset<br />
Reset Reset<br />
c<br />
c .--------------------------------------------------------------------c<br />
c<br />
c .--------------------------------------------------------------------c<br />
C dw<br />
C dw<br />
c dw<br />
C dw<br />
C dw<br />
C dw<br />
C dw<br />
c dw<br />
C dw<br />
C dw<br />
C dw<br />
C dw<br />
c dw<br />
C dw<br />
C dw<br />
c dw<br />
c dw<br />
C dw<br />
c dw<br />
c dw<br />
c dw<br />
C dw<br />
C dw<br />
C dw<br />
C dw<br />
C dw<br />
C dw<br />
Function Keypad I AT&T IDtherl<br />
kdblD * 100h + kdblO<br />
kdblO * 10Dh + kdblO<br />
kNDNE * 100h + kNDNE<br />
kNDNE * 100h + kNDNE<br />
kbprt * 100h + kbprt<br />
kbprt * 100h + kbprt<br />
7200h<br />
kNONE * 100h + kNONE<br />
pause * 1DOh + pause<br />
pause * 100h + pause<br />
pause * 100h + pause<br />
pause * 100h + pause<br />
(DOh) * 1DOh + (ODh)<br />
(DOh) * 100h + (ODh)<br />
(OAh) * 100h + (OAh)<br />
kNONE * 1DOh + kNONE<br />
4BOOh<br />
7300h<br />
7300h<br />
7300h<br />
SOOOh<br />
SDOOh<br />
SOOOh<br />
SOOOh<br />
4000h<br />
7400h<br />
7400h<br />
84 S4h<br />
8S SSh<br />
86 S6h<br />
87 S7h<br />
88 S8h<br />
89 S9h<br />
9D SAh<br />
I KB I KBs I<br />
00 DO<br />
00 00<br />
None None<br />
None None<br />
PrtSc PrtSc<br />
Prtsc PrtSc<br />
X114<br />
None None<br />
Pause Pause<br />
Pause Pause<br />
Pause Pause<br />
Pause Pause<br />
CR CR<br />
CR CR<br />
LF LF<br />
None None<br />
Left=X7S<br />
Rev Word = X11S<br />
Rev Word = X11S<br />
Rev Word = X11S<br />
Down=X80<br />
Down=X80<br />
Down=X80<br />
Oown=X80<br />
Rght=X77<br />
Adv Word = X116<br />
Adv Word = X116<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong>
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
B9FC<br />
CEF8<br />
= 0001<br />
= DOFF<br />
= OOBB<br />
1-44<br />
c<br />
C include wd hdu.asm<br />
c<br />
C TITLE WX2<strong>BIOS</strong> Version 8 85/04/02<br />
C SUBTTL <strong>BIOS</strong> for Western Digital Winchester Controllers<br />
C PAGE 62, 132<br />
C Integrated Verion F to our existing <strong>BIOS</strong>. 04/07/85<br />
C From Dave Joan, Western Digital,<br />
C (1) <strong>BIOS</strong> polling status at end of rest pulse caused 5 to 9 us pulses<br />
C on all drive lines due to 1015 ports not lbeing set up. A delay of<br />
C at least 3 milliseconds between reset and polling was added to the<br />
C reset command routine.<br />
C (2) Install sets up registers AL,DH,CX in case System <strong>BIOS</strong> did not.<br />
c<br />
C Ported Version E to our version of the WX2<strong>BIOS</strong>. I have added enhancements<br />
C like: 1) deglitching the interrupt service routine; 2) inserting time outs<br />
C around the wait for interrupt loop<br />
C Version E<br />
C Dave Joan 85/02/07<br />
C Version 8 (begun from NLS<strong>BIOS</strong> version 1)<br />
C Bob Hossley 83/10/10 - 83/10/10<br />
C Exact copy of NLS<strong>BIOS</strong> version<br />
C Version 1<br />
C Bob Hossley 83/10/06 - 83/10/06<br />
C 83/10/06 Reset code refined work with SHD artwork revision 1, 2, or 3<br />
C Version 0 (begun from WX2<strong>BIOS</strong> version 6)<br />
C Bob Hossley 83/10/05 - 83/10/06<br />
C Bill Bailey 83/10/04 - 83/10/04<br />
c<br />
c .---------------------------------------------------------------------------c<br />
C Basic (i.e. Fundamental) Input/Output System for the Western Digital<br />
C WX2 Winchester Controller board<br />
c<br />
C This <strong>BIOS</strong> provides access to 5 1/4 inch fixed disks via a<br />
C controller compatible with the IBM fixed disk controller.<br />
c<br />
C The <strong>BIOS</strong> routines are meant to be entered only via software<br />
C interrupts. Addresses in these listings should never be referenced.<br />
C Applications which reference absolute addresses in the code segment<br />
C violate the structure and design of this <strong>BIOS</strong>.<br />
c<br />
c .----------------------------------------------------------------------------<br />
c<br />
C code<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
segment common '<strong>ROM</strong>'<br />
assume cs:code, ds:nothing, es:nothing, ss:nothing<br />
public bios_install<br />
public i13 ih<br />
ORG OCEF8H<br />
DMACC EQU 01h ; non zero for dma accelerator code<br />
c Error Codes Returned by <strong>BIOS</strong><br />
c<br />
C ec stat<br />
C ec undef<br />
EQU<br />
EQU<br />
OFFh<br />
OBBh<br />
;Read status failed<br />
;Undefined error<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong>
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
= 0008<br />
= OOOA<br />
= OOOB<br />
= oooc<br />
= 0000<br />
= OOOE<br />
= OOOF<br />
= ODED<br />
= OOE3<br />
= OOE4<br />
= DOES<br />
= OOE6<br />
= DODO<br />
= 0004<br />
= 0005<br />
= 0020<br />
= 0002<br />
= 0000<br />
= 0002<br />
= 0003<br />
= 0005<br />
= 0007<br />
= 0008<br />
= 0009<br />
= OOOA<br />
= OOOB<br />
= DODO<br />
= 0002<br />
= 0004<br />
= 0006<br />
= 0008<br />
= OOOA<br />
= oooc<br />
1-46<br />
C de rd<br />
C de wr<br />
C de seek<br />
C de par set<br />
C de ecc rd<br />
C de buff rd<br />
C de buff wr<br />
C dc_diag_ram<br />
C dc_diag_drv<br />
C dc_diag_ctlr<br />
C de rdl<br />
C de wrl<br />
c<br />
EQU<br />
EQU<br />
EQU<br />
EQU<br />
EQU<br />
EQU<br />
EQU<br />
EQU<br />
EQU<br />
EQU<br />
EQU<br />
EQU<br />
8<br />
OAH<br />
OBH<br />
OCH<br />
DOH<br />
OEH<br />
OFH<br />
OEOH<br />
OE3H<br />
OE4H<br />
OESH<br />
OE6H<br />
C ; Command Control Block offsets<br />
C ccb cmd equ 0<br />
C ccb blks equ 4<br />
C ccb opt equ 5<br />
c<br />
C ; Bits in Byte 1 of the ccb<br />
c<br />
C ccb drv b equ 20h<br />
c<br />
c<br />
;READ SECTORS<br />
; WRITE SECTORS<br />
;SEEK<br />
;SET DRIVE PARAMETERS<br />
;READ ERROR BURST LENGTH<br />
;READ SECTOR BUFFER<br />
;WRITE SECTOR BUFFER<br />
;RAM DIAGNOSTIC<br />
;DRIVE DIAGNOSTIC<br />
;CONTROLLER DIAGNOSTIC<br />
;READ LONG<br />
; WRITE LONG<br />
;command code<br />
;number of blocks or interleave factor<br />
;option byte<br />
;drive bit<br />
C CCB option byte<br />
c Bit<br />
c<br />
c<br />
c<br />
0, 1, 2<br />
3, 4, 5<br />
6<br />
Step option<br />
Reserved for future use<br />
0 --> Stable ECC required before correction<br />
c<br />
1 --> Immediate ECC correction<br />
7 0 --> Retries allowed<br />
C 1 --> No retries allowed<br />
c<br />
C Command Completion byte<br />
c<br />
C cc er equ 2 ;error flag bit: 0 --> no error<br />
c<br />
C ; offsets in a winchester parameter subtable<br />
C wst cyl equ 0 ;2-byte number of cylinders<br />
C wst heads equ 2<br />
;1-byte number of heads<br />
C wst re wr equ 3<br />
;2-byte starting reduced write cylinder<br />
C wst wr pre equ 5<br />
;2-byte starting write pre-camp cyl<br />
C wst er bur equ 7<br />
;1-byte max. error burst length<br />
C wst opt equ 8<br />
;1-byte option byte for CCB<br />
C wst sto equ 9<br />
;1-byte standard time out parameter%<br />
C wst fto equ 10<br />
;1-byte format drive time out parameter%<br />
C wst ddto equ 11<br />
;1-byte drive diagnostic time out parameter%<br />
c<br />
C ; Activation Record Descriptions<br />
c<br />
C a1 es<br />
C a1 ds<br />
c al si<br />
C a1 di<br />
C a1 bp<br />
C a1 dx<br />
C a1 ex<br />
equ<br />
equ<br />
equ<br />
equ<br />
equ<br />
equ<br />
equ<br />
0<br />
2<br />
4<br />
6<br />
8<br />
10<br />
12<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong>
= OOOE<br />
= 0010<br />
= 0013<br />
= 0018<br />
= 0040<br />
= 0165<br />
= 019A<br />
= 01BE<br />
= 0584<br />
= 0004<br />
= 0002<br />
= 0008<br />
= 0080<br />
= 0200<br />
= 0000<br />
= 0020<br />
= 0082<br />
= 0063<br />
= 0320<br />
= 0004<br />
= 0067<br />
= 0000<br />
= 0001<br />
= 0002<br />
= 0000<br />
= 0001<br />
= 0002<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
C a·J bx<br />
c<br />
equ 14<br />
C ; Interrupt vector numbers<br />
C ivn dis char equ 10h<br />
C i vn be<br />
C ivn basic<br />
C ivn be dette<br />
c<br />
C ; Timer Values<br />
equ<br />
equ<br />
equ<br />
c ti 0 1 equ<br />
c<br />
C ti kb reset equ<br />
c<br />
C ti fin equ<br />
c<br />
C ti be reset<br />
c<br />
c<br />
equ<br />
C ; Miscellaneous symbols<br />
c<br />
C ctlr mx equ<br />
C drv ctlr<br />
c drv total<br />
C dnwin<br />
C sec size<br />
c<br />
13h<br />
18h<br />
40h<br />
446d-89d<br />
446d-36d<br />
446d<br />
1412d<br />
4<br />
EQU<br />
EQU ctlr mx*drv ctlr ;total number of drives possible<br />
equ<br />
equ<br />
C Hardware specific<br />
C Port Addresses<br />
C p dma EQU<br />
C p int EQU<br />
C p dma latch EQU<br />
c<br />
C p dmacc<br />
c<br />
C p wx2<br />
c<br />
C wx2 l<br />
c<br />
C SW b<br />
c<br />
EQU<br />
EQU<br />
equ<br />
equ<br />
2<br />
80h<br />
512<br />
values<br />
0<br />
20H<br />
082H<br />
63H<br />
0320H<br />
4<br />
67H<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
;call to screen bios<br />
:call to diskette or winchester bios<br />
:enter <strong>ROM</strong> resident BASIC<br />
:time to wait after drive 0 is found<br />
:usable = 89 * .056 = 5 seconds<br />
:initial timer counter for kb reset<br />
: 36 * .056 = 2 seconds<br />
:final timer counter<br />
; .056 seconds per count<br />
;delay loop count for 3 ms minimum.<br />
: based on 17 eye X . 125 us = 1 loop<br />
:maximum number of wx2 controllers<br />
:number of drives per controller<br />
:least significant winchester drive #<br />
:number of bytes per sector<br />
;base address for DMA chip registers<br />
:8259 control port<br />
:4-bit latch for bits 16 - 19 of DMA<br />
:address<br />
;port for dma accelerator %<br />
;predictor sector size and sample enable%<br />
;Base address for WX2 ports<br />
;number of ports per WX2 controller<br />
:mother board switch%<br />
C Offsets from base address for one WX2 controller<br />
C Read Use<br />
C wx2 r data equ 0 ; data from WX2 to host<br />
C wx2 r status<br />
c<br />
c<br />
c<br />
c<br />
c wx2 _r _con fig<br />
c<br />
C Write Use<br />
c wx2 w data<br />
C wx2 w reset<br />
C wx2 w select<br />
c<br />
equ<br />
equ<br />
equ<br />
equ<br />
equ<br />
2<br />
0<br />
1<br />
2<br />
:WX2 status<br />
;Caution: subroutine wx2 req requires that<br />
; wx2 r data + 1 = wx2 r status<br />
:Caution: subroutine ccb send requires that<br />
;wx2 r stat = wx2 w select -1<br />
:configuration switches<br />
:data from host to WX2<br />
:reset WX2 controller<br />
;select WX2 controller<br />
;Caution: subroutine ccb send requires that<br />
1-47
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
= 0003<br />
= oooc<br />
= 0008<br />
= 0004<br />
= 0002<br />
= 0001<br />
= 0020<br />
= 0010<br />
= oooc<br />
= 0003<br />
= 0001<br />
= 0002<br />
= 0006<br />
= 0007<br />
= 0008<br />
= OOOB<br />
= 0009<br />
= OOOA<br />
= OOOF<br />
= oooc<br />
= OOOD<br />
= 0008<br />
= 0007<br />
= OOOB<br />
1-48<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
wx2 w msk equ<br />
--<br />
wx2_lrg offset equ<br />
; Bits in wx2 r status<br />
--<br />
wx2_stat_busy EQU<br />
wx2 stat cd EQU<br />
wx2 stat io EQU<br />
wx2 stat req EQU<br />
wx2 stat int equ<br />
wx2 stat drq equ<br />
- -<br />
- -<br />
C Bits in wx2_r_config<br />
C wx2 config_O equ 00001100b<br />
C wx2 config 1<br />
c<br />
3<br />
12<br />
00001000B<br />
00000100B<br />
00000010B<br />
00000001B<br />
00100000b<br />
00010000b<br />
equ 00000011b<br />
; wx2 w msk = wx2 w select +1<br />
;mask register<br />
; largest port offset for hard disk controller%<br />
Busy<br />
command/data<br />
input/output<br />
request (start state machine)<br />
;interrupt<br />
;dma data request<br />
c Bits in wx2 w msk (bits 2 - 7 are don't cares)<br />
;switch field for drive 0<br />
;switch field for drive 1<br />
C wx2 msk dma equ 01b ; dma mask bit<br />
c<br />
c<br />
C wx2 msk int<br />
c<br />
c<br />
c<br />
c<br />
equ 10b<br />
; 0 --> dma to host disabled<br />
; 1 --> dma to host enabled<br />
;interrupt mask bit<br />
0 --> interrupt to host disabled<br />
; 1 --> interrupt to host enabled<br />
C Offsets from the DMA base address<br />
C Write<br />
C For each channel there is a 16-bit address register and a 16-bit<br />
c byte count register. For channel i (i = 0, 1, 2, 3) the address<br />
c register is at address i*2 and the byte count register is at address<br />
C (i*2) + 1.<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
dma w addr equ 3*2<br />
dma w cnt equ 3*2+1<br />
dma w cmd equ 8<br />
dma w mode equ 11<br />
dma w req equ 9<br />
--<br />
dma w mask b equ 10<br />
-<br />
dma w mask equ 15<br />
--<br />
dma_w_byte equ 12<br />
dma w clr equ 13<br />
--<br />
Read<br />
dma r status equ 8<br />
; Commands for DMA controller<br />
END IF<br />
IF DMACC<br />
Commands for mode register<br />
dma mode wr EQU 00000111B<br />
-<br />
dma mode rd EQU 00001011B<br />
-<br />
;channel 3 address register (16-bits)<br />
;channel 3 byte count register (16-bits<br />
;command register (8 bits)<br />
;mode register (6 bits)<br />
;request register (4 bits)<br />
;write single mask register bit<br />
;mask register (4 bits)<br />
;clear pointer to register byte<br />
;0 --> bits 0 - 7 of register<br />
;1 -->bits 8- 15 of register<br />
;master clear<br />
;status register (8 bits)<br />
;bits 6, 7 = 01 --> DEMAND mode select%<br />
;bits 2, 3 = 01 --> write transfer%<br />
; bits 0, 1 = 11 --> Channel 3 select%<br />
;bits 6, 7 = 01 --> DEMAND mode select%<br />
;bits 2, 3 = 10 --> read transfer%<br />
;bits 0, 1 = 11 --> Channel 3 select%<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong>
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
7COO<br />
= 0040<br />
0000<br />
0042<br />
0042<br />
0042<br />
006C<br />
006C ????<br />
0072<br />
0072 ????<br />
0074<br />
0074 ??<br />
0075 ??<br />
0076 ??<br />
0077 ??<br />
0078<br />
1-50<br />
c<br />
C intvec ENDS<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
RAM Workspace<br />
.---------------------------------------.<br />
' .<br />
W2RAM EQU 40H<br />
wdram SEGMENT AT 40H<br />
ORG 42H<br />
ram ccb LABEL<br />
ram stat LABEL<br />
ORG 06CH<br />
ram time ow<br />
ORG 72H<br />
ram kb reset ow<br />
ORG 74H<br />
ram cc DB<br />
-<br />
ram drv cnt DB<br />
ram opt DB<br />
ram po DB<br />
wdram ENDS<br />
BYTE<br />
BYTE<br />
?<br />
?<br />
?<br />
?<br />
?<br />
?<br />
: needed for masm%<br />
;%<br />
:6-byte Command Control Block<br />
:4-bytes of controller status<br />
:Timer low word<br />
:1234H if keyboard reset underway<br />
;completion code<br />
;Number of drives on WX2 controller 0<br />
;spare - was temp for option byte<br />
;spare - port offset temp<br />
c ·**********************************************************************<br />
c<br />
C ;COde<br />
c<br />
c<br />
c<br />
c<br />
segment<br />
org<br />
db<br />
db<br />
0<br />
55h,Oaah<br />
16<br />
:<strong>BIOS</strong> header<br />
;number of 512 blocks in the block of<br />
C :host memory allocated to this <strong>BIOS</strong>.<br />
C :If the <strong>BIOS</strong> <strong>ROM</strong> used is smaller, then<br />
C ;it appears several times in the host<br />
C :memory<br />
c ·========================================<br />
c<br />
c Call: call <strong>ROM</strong>-base-address + 3<br />
C return<br />
c<br />
C Install Winchester <strong>BIOS</strong> into the interrupt vector system.<br />
c<br />
C Entry: No entry parameters.<br />
c<br />
c Exit: No exit parameters.<br />
c<br />
C The message " Not Ready" is displayed if there are no usable winchester<br />
c disks.<br />
c<br />
c<br />
c<br />
assume cs:code ;call to initialize is required to<br />
;establish cs<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong>
CEF8 E9 CFB4 R<br />
CEFB 28 43 29 20 43 6F<br />
CF29<br />
CF29 CF<br />
CF2A 02<br />
CF2B 25<br />
CF2C 02<br />
CF2D 08<br />
CF2E 2A<br />
CF2F FF<br />
CF30 50<br />
CF31 F6<br />
CF32 19<br />
CF33 04<br />
70 79 72 69 67 68<br />
74 20 31 39 38 33<br />
20 57 65 73 74 65<br />
72 6E 20 44 69 67<br />
69 74 61 6C 20 43<br />
6F 72 70 6F 72 61<br />
74 69 6F 6E<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
c<br />
c<br />
jmp near ptr bios install ;entry for power-up initialize<br />
c .;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;<br />
c<br />
C Call JMP <strong>ROM</strong> base address +5<br />
C Purpose: format the specified drive with the specified interleave.<br />
c<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
C Entry:<br />
C (AH) ; Relative number of target drive. Drive SOh+ d is the target.<br />
C (AL) ; Interleave factor.<br />
c<br />
C Exit: Job terminated.<br />
c<br />
c jmp wx2 fmt :format entry<br />
c --------<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
db<br />
p tbl dett:<br />
DB<br />
DB<br />
DB<br />
DB<br />
DB<br />
DB<br />
DB<br />
DB<br />
DB<br />
DB<br />
DB<br />
'(C) Copyright 1983 Western Digital Corporation·<br />
11001111B<br />
2<br />
25h<br />
2<br />
8<br />
02AH<br />
OFFH<br />
050H<br />
OF6H<br />
25<br />
Winchester Parameter Table<br />
Offset<br />
0 - 15 subtable 0<br />
16 - 31 subtable 1<br />
32 - 47 subtable 2<br />
48 - 63 subtable 3<br />
64 - 79 subtable 4%<br />
80 - 95 subtable 5%<br />
96 - 111 subtable 6%<br />
112 - 127 subtable 7%<br />
4<br />
:srt;C, HD unload ; F<br />
:HD load; 1, mode; DMA<br />
;Wait after open til motor off<br />
:512 bytes per sector<br />
:EDT<br />
;gap length<br />
:DTL<br />
;gap length for format<br />
:fill byte for format<br />
:head settle time in milliseconds<br />
;motor start time (1/8 seconds)<br />
The configuration switches accessible via port wx2 r config specify<br />
the subtable to be used for each drive. Each drive has two switches<br />
which determine a 2-bit field in port wx2_r_config which specifies<br />
the subtable number for the drive.<br />
Two auxliary switches have been added to expand the parameter table.%<br />
1-51
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
CF34<br />
CF34 0132<br />
CF36 04<br />
CF37 0132<br />
CF39 0000<br />
CF3B DB<br />
CF3C OS<br />
CF3D DC<br />
CF3E B4<br />
CF3F 28<br />
CF40 00 00 00 00<br />
CF44 02B9<br />
CF46 OS<br />
CF47 02B9<br />
CF49 0000<br />
CF4B DB<br />
CF4C 05<br />
CF4D 10<br />
CF4E DO<br />
CF4F 60<br />
CFSO 00 00 00 00<br />
CFS4 0280<br />
CFS6 04<br />
CFS7 0100<br />
CF59 0100<br />
CFSB DB<br />
CFSC 05<br />
1-:)2<br />
C Bits 3 and 2 (OCH) on the mother board (port 067H) are read for one%<br />
C extra bit per drive; bit 3 for drive 0, bit 2 for drive 1.%<br />
c<br />
c Winchester Parameter Subtable<br />
c<br />
Offset Byte Length<br />
0<br />
2 Number of cylinders<br />
2<br />
Number of heads<br />
3 2 Starting reduced write current cylinder<br />
s<br />
2 Starting write precompensation cylinder<br />
7<br />
Max. correctable error burst length<br />
8<br />
CCB option byte<br />
9<br />
Standard time out value<br />
10<br />
Format time out value<br />
11<br />
Check drive time out value<br />
12<br />
4 Reserved for future use<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
C p tbl win:<br />
C Table Entry 0 - 10Mb<br />
C This is the 10Mb drive supported as the default drive in the PC<strong>6300</strong><br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
ow<br />
DB<br />
ow<br />
ow<br />
DB<br />
DB<br />
DB<br />
DB<br />
DB<br />
DB<br />
03060<br />
04<br />
03060<br />
0<br />
OBH<br />
s<br />
OCH<br />
OB4H<br />
28H<br />
0,0,0,0<br />
c Table Entry 1 - 30Mb<br />
C CDC Wren Hard Disk Drive<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
ow<br />
DB<br />
ow<br />
ow<br />
DB<br />
DB<br />
DB<br />
DB<br />
DB<br />
DB<br />
06970<br />
OS<br />
06970<br />
0<br />
OBH<br />
s<br />
10H<br />
ODOH<br />
60H<br />
0,0,0,0<br />
C Table Entry 2 - 20Mb<br />
C CMI CM6426 Hard Disk Drive<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
ow<br />
DB<br />
ow<br />
ow<br />
DB<br />
DB<br />
06400<br />
04<br />
02S6D<br />
02S6D<br />
OBH<br />
s<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong>
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
CF9C 05<br />
CF9D 25<br />
CF9E FF<br />
CF9F AD<br />
CFAO 00 00 00 00<br />
CFA4 0264<br />
CFA6 04<br />
CFA7 0265<br />
CFA9 0100<br />
CFAB DB<br />
CFAC 05<br />
CFAD DC<br />
CFAE B4<br />
CFAF 28<br />
CFBO 00 00 00 00<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
DB<br />
DB<br />
DB<br />
DB<br />
DB<br />
5<br />
25H<br />
OFFH<br />
OAOH<br />
0,0,0,0<br />
C Default table 7 - 20 Mb<br />
C Seagate ST225 Hard Disk Drive or Miniscribe 3425 Hard Disk Drive<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
ow<br />
DB<br />
ow<br />
ow<br />
DB<br />
DB<br />
DB<br />
DB<br />
DB<br />
DB<br />
06120<br />
04<br />
06130<br />
2560<br />
OBH<br />
5<br />
OCH<br />
OB4H<br />
28H<br />
0,0,0,0<br />
CFB4 C bios install proc<br />
CFB4 33 CO<br />
CFB6 8E 08<br />
CFB8 FA<br />
CFB9 C4 06 004C R<br />
c<br />
c<br />
CFBD A3 0100 R<br />
CFCO 8C 06 0102 R C<br />
xor<br />
ax.ax<br />
ds,ax<br />
C assume ds: intvec<br />
c<br />
mov<br />
near<br />
:zero<br />
;initialize data segment register<br />
c Set interrupt vectors to install <strong>BIOS</strong> into operating system<br />
c<br />
c<br />
c<br />
c<br />
c<br />
CFC4 C7 06 004C R 0170 R C<br />
CFCA 8C DE 004E R C<br />
CFCE C7 06 0064 R ODED R C<br />
CFD4 8C DE 0066 R C<br />
CFD8 C7 06 0034 R 0161 R C<br />
CFDE 8C DE 0036 R C<br />
CFE2 C7 06 0104 R CF34 R C<br />
CFE8 8C DE 0106 R<br />
CFEC FB<br />
CFED B8 0040<br />
CFFO 8E 08<br />
CFF2 C6 06 0075 R 00<br />
CFF7 B8 019A<br />
CFFA 81 3E 0072 R 1234<br />
0000 74 02<br />
1-54<br />
c<br />
c<br />
c<br />
C assume<br />
c<br />
c<br />
c<br />
eli<br />
les<br />
mov<br />
mov<br />
mov<br />
mov<br />
mov<br />
mov<br />
mov<br />
mov<br />
mov<br />
mov<br />
sti<br />
ds:wdram<br />
;disable interrupts<br />
ax,iv be :20-bit pointer to entry for<br />
;call to diskette bios<br />
word ptr iv be dett.ax ;initialize new pointer<br />
word ptr iv_bc_dett+2,es<br />
word ptr iv bc.offset i13 ih<br />
- -<br />
:20-bit pointer to entry for<br />
word ptr iv bc+2,cs ;call to winchester <strong>BIOS</strong><br />
word ptr iv_boot,offset i19_boot_sys :20-bit pointer to boot system code<br />
word ptr iv boot+2,cs<br />
word ptr iv int,offset id ih :20-bit pointer to disk interrupt<br />
word ptr iv int+2,cs ;handler<br />
- -<br />
word ptr iv_p_tbl_win,offset p_tbl_win :20-bit pointer to winchester<br />
word ptr iv p tbl win+2,cs ;parameter table<br />
;enable interrupts<br />
mov ax,W2RAM :ram segment address<br />
mov ds,ax<br />
;establish segment<br />
C If a power-up boot is in progress. then wait up to 25 seconds for the<br />
C first winchester drive to spin up.<br />
c<br />
c<br />
c<br />
c<br />
c<br />
mov<br />
mov<br />
cmp<br />
je<br />
ram drv cnt,OO<br />
ax,ti kb reset<br />
ram kb reset, 1234h<br />
kb reset<br />
;clear number of drives<br />
;initial timer value for keyboard reset<br />
;keyboard reset?<br />
;jump if yes<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong>
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
D002 33 co c xor ax.ax ;clear for long delay while disk<br />
c ;Spins up after power on<br />
D004 c kb reset:<br />
D004 A3 006C R c mov ram time.ax :initialize timer counter<br />
c<br />
D007 FA c eli :disable interrupts<br />
DOOS E4 21 c in al,p int+int ocw1 ;read interrupt mask register<br />
DOOA 24 FE c and al.not int ocw1 mD ;enable interrupts on channel 0<br />
DOOC E6 21 c out p int+int ocw1.al :set interrupt mask register<br />
- -<br />
c :This starts the timer.<br />
DDOE FB c sti :enable interrupts<br />
c<br />
c Count the usable winchester drives. To speed this counting. if a<br />
c controller is unusable, then testing of its second drive is skipped.<br />
c A drive is usable if and only if its controller resets. runs its<br />
c controller diagnostic. recalibrates the drive. and executes test<br />
c drive ready all without error.<br />
c<br />
DOOF B2 SO c mov dl,dnwin :base winchester drive number<br />
D011 c ctlr ini t:<br />
c<br />
-<br />
c These 3 lines set up regs for Test Drive Ready in case host didn't. V.F.<br />
D011 B9 0001 c mov cx,1 : cylinder D. sector 1<br />
D014 SA FS c mov dh.ch :head # of zero<br />
D016 SA C1 c mov al.cl ;sector count of<br />
c<br />
D01S B4 DO c mov ah,bc reset :bios call code<br />
D01A CD 13 c int ivn be ;call disk bios<br />
D01C 72 2F c jc nxt ctlr ;jump if error<br />
c<br />
D01E B4 14 c mov ah,bc diag ctlr ;bios call code<br />
D020 CD 13 c int ivn be ;call disk bios<br />
DD22 72 29 c jc nxt ctlr ;jump if error<br />
c<br />
D024 c trdyO: ;wait for disk reset%<br />
D024 B4 10 c mov ah,bc tst_rdy ;bios call code%<br />
D026 CD 13 c int ivn be ;call disk bios%<br />
D02S 73 OS c jnc drv ;jump if drive ready%<br />
D02A S1 3E 006C R 0222 c cmp ram time,222h ; 30 sec Time-out?%<br />
D0 3D 72 F2 c jb trdyD ;jump if no time-out yet%<br />
D032 c drv:<br />
D032 33 co c xor ax.ax<br />
c<br />
D034 A3 006C R c mov ram time.ax ;clear timer value%<br />
D037 B4 11 c mov ah,bc recal ;bios call code<br />
D039 CD 13 c int ivn be ;call disk bios<br />
D03B 72 50 c jc nxt drv ;jump if error<br />
c<br />
D0 3D c tst_drv_rdy:<br />
D0 3D B4 10 c mov ah,bc tst_rdy :bios call code<br />
D03F CD 13 c int ivn be ; call disk bios<br />
D041 73 33 c jnc drv rdy ;jump if drive ready<br />
D043 S1 3E 006C R 01BE c cmp ram time.ti fin :Time-out?<br />
D049 72 F2 c jb tst_drv_rdy ;jump if no time-out yet<br />
c<br />
-<br />
-<br />
-<br />
-<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong> 1-55
DOBO CD 10 c int ivn dis char ;call screen bios<br />
DOB2 E2 F8 c loop dis char :do next character<br />
c<br />
DOB4 BD OOOF c mov bp. 1Sd ;set error exit flag<br />
DOB7 EB 2B 90 c jmp h exit :jmp to exit%<br />
DOBA c wins usable:<br />
c<br />
-<br />
DOBA AD 007S R c mov al.byte ptr ds:ram_drv_cnt :hold num of drives%<br />
DOBD 1E c push ds<br />
DOBE DE c push cs<br />
DOBF 1F c pop ds ;ds for string prints%<br />
DOCO FC c cld<br />
DOC1 B3 01 c mov bl.1 ;choose foregnd color%<br />
DOC3 OA CO c or al,al :set flags%<br />
DOCS 7S 09 c jnz nzdrvs ;cant if 0 drives%<br />
DOC7 B9 OOOF c mov cx,habss ;msg size%<br />
DOCA BE 0067 R c mov si. offset habs :msg ptr%<br />
DOCD EB 00 90 c jmp hmsg<br />
DODO c nzdrvs:<br />
DODO 04 30 c add al. ·o · : HEX drives = ASCII number%<br />
0002 B4 DE c mov ah,bc v w :video cmd tty%<br />
0004 co 10 c int ivn dis char ;print number of drives%<br />
- -<br />
0006 B9 0009 c mov cx,hgoods ;msg size%<br />
0009 BE DOSE R c mov si,offset hgood :msg ptr%<br />
DODC c hmsg:<br />
DODC AC c lodsb ;al=ds:si si++%<br />
DODD B4 DE c mov ah.bc v w ;Video cmd.tty%<br />
DODF CD 10 c int ivn dis char ;print char%<br />
DOE1 E2 F9 c loop hmsg ;print string%<br />
DOE3 1F c pop ds :restore OS%<br />
DOE4 c h exit:<br />
c<br />
DOE4 FA c eli :disable interrupts<br />
DOES E4 21 c in al,p int+int ocw1 ;read interrupt mask register<br />
-<br />
- -<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
DOE7 DC 01 c or al.int ocw1 mo :disable interrupts on channel 0<br />
DOE9 E6 21 c out p int+int ocw1.al :set interrupt mask register<br />
- -<br />
c :This stops the timer.<br />
DOEB FB c sti ;enable interrupts<br />
DOEC C3 c ret :exit to system bios initialize<br />
ODED c bios install endp<br />
c<br />
-<br />
c page +<br />
c ·========================================<br />
c<br />
c Call: int 19h<br />
c<br />
c Boot the operating system from diskette A or from the first usable<br />
c winchester drive.<br />
c<br />
c Entry: No entry parameters.<br />
c<br />
c Normal Exit: Jump to the start of the bootstrap sector read from disk.<br />
c<br />
c Error Exit: int 18h -- <strong>ROM</strong> resident BASIC entered.<br />
c The <strong>ROM</strong> resident BASIC is entered if the system can't be booted.<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong> 1-57
ODED<br />
ODED 33 CO<br />
DOEF 8E D8<br />
DOF1 8E CO<br />
c<br />
c Attempt to reset drive 0 (a diskette) and then to read sector 1.<br />
C cylinder 0, head 0. If this read is successful, then jump to the start<br />
c of this sector in memory. Retry the preceding three times.<br />
c<br />
c Beginning with drive 80h (the first winchester) and ending with<br />
C drive 87h (the last possible winchester) do the following: Attempt to<br />
C reset the drive and then to read sector 1. cylinder 0. head 0. If this<br />
C read is successful and the last word of this sector contains AA55h, then<br />
c jump to the start of this sector in memory.<br />
c<br />
c Enter the <strong>ROM</strong> resident BASIC by executing int 18h.<br />
c<br />
C i19_boot_sys:<br />
c<br />
c<br />
c<br />
c<br />
c<br />
xor ax. ax<br />
mov ds.ax<br />
mov es.ax<br />
assume ds:intvec,es:intvec<br />
:zero<br />
;establish pointer to intvec segment<br />
;establish pointer for disk buffer<br />
C Install pointers to the default diskette parameter table and the<br />
c default winchester parameter table.<br />
c<br />
DOF3 FA C eli ;disable interrupts<br />
DOF4 (7 06 0078 R CF29 R C<br />
DOFA 8C DE 007A R C<br />
DOFE C7 06 0104 R CF34 R C<br />
D104 8C DE 0106 R C<br />
D108 FB C<br />
D109 B9 0003<br />
D10C 33 D2<br />
D10E<br />
D10E B8 0000<br />
D111 CD 40<br />
D113 72 OF<br />
D115 BB 7COO R<br />
D118 B8 0201<br />
D11B 51<br />
D11C B9 0001<br />
D11F CD 40<br />
D121 59<br />
D122 73 34<br />
D124<br />
D124 80 FC 80<br />
D127 74 02<br />
D129 E2 E3<br />
D12B<br />
D12B B8 0000<br />
1-58<br />
c<br />
mov<br />
mov<br />
mov<br />
mov<br />
sti<br />
word ptr iv_p_tbl_dett,offset p_tbl_dett ;20-bit pointer to diskette<br />
word ptr iv p tbl dett+2,cs ;parameter table<br />
word ptr iv p tbl win,offset p tbl win ;20-bit pointer to winchester<br />
-- - - -<br />
word ptr iv p tbl win+2,cs ;parameter table<br />
;enable interrupts<br />
c Attempt to boot from diskette 0 up to 3 times. A time-out error<br />
c immediately ends the attempt to boot from diskette.<br />
c<br />
c<br />
c<br />
c<br />
mov<br />
xor<br />
C dett boot:<br />
C mov<br />
C int<br />
C jc<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
mov<br />
mov<br />
push<br />
mov<br />
int<br />
pop<br />
jnc<br />
C dett boot nxt:<br />
c<br />
c<br />
c<br />
c<br />
cmp<br />
je<br />
loop<br />
C dett boot end:<br />
c mov<br />
cx,3<br />
dx,dx<br />
ax,bc reset*256<br />
ivn be dette<br />
dett boot nxt<br />
bx,offset iv boot buf<br />
ax,bc rd*256+1<br />
ex<br />
ex. 1<br />
ivn be dette<br />
ex<br />
boot succ<br />
ah,ec time<br />
dett boot end<br />
dett boot<br />
ax,bc reset*256<br />
;number of times to retry diskette<br />
:zero drive & head numbers<br />
:(AH) =bios call#, (AL) =block count<br />
;call diskette bios<br />
;jump if error<br />
;address of sector buffer<br />
;read one sector<br />
;save retry count<br />
;sector number<br />
;call diskette bios<br />
;restore retry count<br />
;jump if no error<br />
;time-out?<br />
; jump if yes.<br />
;jump if try again<br />
:(AH) =bios call#, (AL) =block count<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong>
D12E CD 40<br />
0130 B2 80<br />
0132 B9 0008<br />
0135<br />
0135 B4 00<br />
0137 CD 13<br />
0139 72 17<br />
D13B BB ?COO R<br />
D13E B8 0201<br />
0141 51<br />
0142 B9 0001<br />
0145 CD 13<br />
0147 59<br />
0148 72 08<br />
D14A 81 3E 7DFE R AA55<br />
0150 74 06<br />
0152<br />
0152 FE C2<br />
0154 E2 OF<br />
0156 CD 18<br />
0158<br />
0158 2E: FF 2E 0150 R<br />
0150<br />
0150 7COO R<br />
D15F 0000<br />
0161<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
c int ivn be dette :call diskette bios<br />
C ;ignore error if any<br />
c<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
C Boot from the first possible winchester drive. Only one attempt is made<br />
C to boot from each drive. A valid boot sector must have AA55 in its last<br />
C word.<br />
c<br />
c<br />
c<br />
c<br />
C win boot:<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
mov<br />
mov<br />
mov<br />
int<br />
jc<br />
mov<br />
mov<br />
push<br />
mov<br />
int<br />
pop<br />
jc<br />
cmp<br />
je<br />
c win boot nxt:<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
inc<br />
loop<br />
int<br />
boot SUCC:<br />
brec:<br />
jmp<br />
jmp<br />
dw<br />
dw<br />
dl,dnwin<br />
cx.drv total<br />
ah,bc reset<br />
ivn be<br />
win boot nxt<br />
bx,offset iv boot buf<br />
ax,bc rd*256+1<br />
ex<br />
ex, 1<br />
ivn be<br />
ex<br />
win boot nxt<br />
:least significant winchester drive #<br />
;max. number of winchester drives<br />
:bios command code<br />
:call disk bios<br />
:jump if error<br />
;address of sector buffer<br />
,read one sector<br />
:save drive count<br />
,sector number<br />
,call disk bios<br />
:restore drive count<br />
;jump if error<br />
word ptr iv boot buf+sec size-2.Daa55h ;valid boot sector?<br />
- - -<br />
boot succ :jump if yes.<br />
dl<br />
win boot<br />
ivn basic<br />
iv boot buf<br />
dword ptr cs: [brec]<br />
offset iv boot buf<br />
0000<br />
c ·========================================<br />
c<br />
c<br />
c<br />
c<br />
Call: int Odh<br />
return<br />
c Winchester interrupt handler<br />
c<br />
C Entry: No entry parameters<br />
c<br />
c Exit: No registers changed.<br />
c<br />
c<br />
c<br />
c id ih:<br />
;update drive number<br />
;jump if more drives to try<br />
:can't boot from disk. enter<br />
:<strong>ROM</strong> resident BASIC<br />
:jump to boot sector read from disk<br />
;jump to boot sector read from disk%<br />
;%<br />
;%<br />
1-59
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
0161 50<br />
0162 BO DB<br />
0164 E6 20<br />
0166 90<br />
0167 E4 20<br />
0169 A8 20<br />
016B 74 DE<br />
0160 BO 20<br />
016F E6 20<br />
0171 BO 07<br />
0173 E6 OA<br />
0175 E4 21<br />
0177 DC 20<br />
0179 E6 21<br />
017B<br />
017B 58<br />
017C CF<br />
0170<br />
0170 FB<br />
1-60<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
bogus:<br />
push<br />
ax :save register<br />
mov al,Obh set up to<br />
out p int+int w ocw2,al read the in service register of 8259<br />
nop seperate by nop<br />
in<br />
test<br />
al,p int+int w ocw2<br />
- --<br />
al,20h<br />
read in service register<br />
if hard disk not in service zf=1<br />
jz bogus if zf=1 then bogus interrupt(exception)<br />
send eoi right away%<br />
mov al,int ocw2 eoi :end of interrupt bit<br />
out p int+int w ocw2,al :end of interrupt to 8259<br />
mov al,dma mask b s or dma mask b 3 ;set channel 3 mask bit<br />
- - -out<br />
p dma+dma w mask b,al ;set bit to disable channel 3<br />
- -- -<br />
in al,p int+int ocw1 :read interrupt mask<br />
or al,int ocw1 m5 :set mask register bit to disable<br />
out p int+int ocw1,al :channel 5 which is used by the wx2<br />
- -<br />
pop ax ;restore register<br />
iret ;long return & restore<br />
c ·========================================<br />
c<br />
c<br />
c<br />
c<br />
Call: int 13h<br />
return<br />
C Function call to disk <strong>BIOS</strong>.<br />
c<br />
C Entry: (AH) =Command code<br />
C (AL) = Sector count or interleave factor<br />
C (ES:BX) = Address of buffer<br />
C (CL) bits 0- 5 =Sector number: 1, 2, 3,<br />
C (CL) bits 6, 7 = Bits 8, 9 of cylinder number<br />
C (CH) = Bits 0 - 7 of cylinder number<br />
flags<br />
C (DL) =Drive number. 0- 7f are diskettes. 80h and up are winchesters<br />
c (OH) = Head number<br />
c<br />
C Exit: (CF) = 0 --> no error<br />
c<br />
c<br />
1 --> error<br />
(AH) = Completion code. 0 --> no error<br />
C<br />
c<br />
(AL) = Error burst length if (AH) = 11h. Else, changed.<br />
C Read parameters:<br />
C (DL) = Number of usable drives at install time<br />
C (DH) = Maximum head number<br />
C (CL) Bits 0 - 5 = 17d --- Maximum sector number<br />
C (CL) bits 6, 7 = Bits 8, 9 of Maximum cylinder number<br />
C<br />
c<br />
(CH) = Bits 0 - 7 of maximum cylinder number<br />
C i13 ih proc far<br />
C<br />
c<br />
assume ds:nothing,es:nothing<br />
c sti ;enable interrupts<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong>
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
D1ED 8A EA c mov ch.dl :drive #<br />
D1EF 80 E5 01 c and ch.01 ;mask to bit 0<br />
D1F2 B1 05 c mov cl,5 ; shift count<br />
D1F4 D2 E5 c shl ch.cl ;align drive bit for ccb<br />
D1F6 OA EE c or ch.dh ;combine with head number<br />
D1F8 88 2E 0043 R c mov ram ccb+1.ch ;Set into command control block<br />
c<br />
c ;Calculate the offset from p wx2 for drive:<br />
c Drive # Offset<br />
c 80, 81 0<br />
c 82, 83 4<br />
c 84, 85 8<br />
c 86, 87 12d<br />
D1FC 80 EA 80 c sub dl,dnwin ;origin to 0<br />
D1FF 81 E2 OOFE c and dx,OFEh<br />
D203 DO E2 c shl dl,1<br />
D205 86 F2 c mov si,dx ;save controller port offset<br />
c<br />
c *** D version added next 7 lines to set correct step rate ***<br />
D207 50 c push ax ;save command & # sectors<br />
D208 06 c push es ;save buffer address<br />
D209 E8 D4DA R c call subtable ;determine subtable to use<br />
D20C 26: 8A 47 08 c mov al.es:wst_opt[bx] ;option byte from subtable<br />
D210 A2 0047 R c mov ram ccb+ccb opt,al ;set into ccb. sets step rate<br />
- -<br />
D213 07 c pop es<br />
D214 58 c pop ax<br />
c<br />
c Table lookups indexed by the function call code<br />
c<br />
D215 8A C4 c mov al.ah :<strong>BIOS</strong> command code<br />
D217 BB D254 R c mov bx.offset de tbl ;pointer to table of controller<br />
c ;command codes<br />
D21A 2E: D7 c xlat CS:dC tbl ;translate bios command code<br />
D21C A2 0042 R c mov ram ccb+ccb cmd.al ;command code into ccb<br />
- -<br />
c<br />
D21F 8A DC c mov bl,ah ;bios command code<br />
D221 32 FF c xor bh,bh ;zero high byte<br />
D223 DO E3 c sal bl,1 ;multiply by 2<br />
D225 2E: FF A7 D22A R c jmp cs:br tbl[bx] ;branch to command specific routine<br />
c<br />
c<br />
D22A c br tbl label word<br />
D22A D269 R c dw i13 reset<br />
D22C D312 R c dw i13 cc<br />
-<br />
D22E D33A R c dw i13 rd<br />
D230 D317 R c dw i13 wr<br />
D232 D399 R c dw dma no ;4 --- verify<br />
D234 D399 R c dw dma no ;5 --- format track<br />
D236 D399 R c dw dma no ;6 --- format bad track<br />
D238 D399 R c dw dma no ;7 --- format drive<br />
-<br />
D23A D2EB R c dw i13 par rd<br />
D23C D28B R c dw i13 par wr<br />
D23E D31B R c dw i13 rdl<br />
D240 D32C R c dw i13 wrl<br />
D242 D399 R c dw dma no :12 -- seek<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong> 1-63
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
0244 0269 R c dw i13 reset :13 --same as D<br />
-<br />
0246 0330 R c dw i13 buff rd<br />
0248 0336 R c dw i13 buff wr<br />
024A 0399 R c dw dma no :16 --test drive ready<br />
024C 0399 R c dw dma no ;17 -- recalibrate<br />
024E 0399 R c dw dma no :18 --RAM diagnostic<br />
0250 0399 R c dw dma no :19 --drive diagnostic<br />
0252 0399 R c dw dma no :20 -- controller diagnostic<br />
c<br />
0254 c de tbl label byte<br />
0254 DC c db de par set :reset sets parameters<br />
0255 DO c db 0 :return completion code<br />
0256 08 c db de rd<br />
0257 DA c db de wr<br />
0258 OS c db de vr<br />
-<br />
0259 06 c db de ft<br />
025A 07 c db de fbt<br />
025B 04 c db de fd<br />
025C DO c db 0 ;read parameters<br />
0250 DC c db de par set<br />
025E ES c db de rdl<br />
025F E6 c db de wrl<br />
0260 DB c db de seek<br />
0261 DC c db de par set :reset also sets parameters<br />
0262 DE c db de buff rd<br />
0263 OF c db de buff wr<br />
-<br />
-<br />
0264 DO c db de tst rdy<br />
0265 01 c db de recal<br />
-<br />
0266 ED c db dc_diag_ram<br />
0267 E3 c db de diag_drv<br />
0268 E4 c db de_ diag_ ctlr<br />
c .-------c<br />
page<br />
c Call: call i13 reset<br />
c return<br />
c<br />
c Purpose: Reset the target winchester controller.<br />
c<br />
c Entry: (si) = Offset to port base for target controller<br />
c<br />
c Exit: (ah) = Completion code<br />
c<br />
c<br />
0269 c i13 reset:<br />
0269 E8 0519 R c call wx2 reset :calculate address of reset port to use<br />
026C EE c out dx,al :reset wx2 controller<br />
0260 B9 0584 c mov ex,ti be reset :loop count for 3 ms on fastest 80286 V.F.<br />
0270 c re_dly:<br />
0270 E2 FE c loop re_dly ;Wait longer then 1 4 ms reset pulse<br />
0272 B4 DA c mov ah, 10 :msb of loop count<br />
0274 c re w:<br />
0274 42 c inc dx :control port<br />
0275 EE c out dx,al ;select the controller<br />
0276 4A c dec dx :status port<br />
0277 EC c in al,dx :read status<br />
1-64<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong>
0278 A8 30<br />
027A 75 DC<br />
027C 24 00<br />
027E 34 00<br />
0280 74 09<br />
0282 E2 FO<br />
0284 FE CC<br />
0286 75 EC<br />
0288<br />
0288 B4 05<br />
028A<br />
028A C3<br />
028B<br />
028B C6 06 0043 R 00<br />
0290 E8 029A R<br />
0293 72 F5<br />
0295 C6 06 0043 R 20<br />
029A<br />
029A BO FC<br />
029C E8 047A R<br />
029F 72 E9<br />
02A1 E8 040A R<br />
02A4 BF 0001<br />
02A7 E8 020E R<br />
02AA BF 0000<br />
02AO E8 020E R<br />
02BO BF 0002<br />
02B3 E8 020E R<br />
02B6 BF 0004<br />
02B9 E8 020E R<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
test<br />
jnz<br />
and<br />
xor<br />
jz<br />
loop<br />
dec<br />
jnz<br />
C ctlr missing,<br />
C mov<br />
C ret near:<br />
C ret<br />
c<br />
c<br />
c<br />
c<br />
c<br />
Call:<br />
al,wx2 stat int or wx2 stat drq<br />
- - -<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
ctlr_missing ;jump if the controller is missing<br />
al,wx2 stat busy or wx2 stat cd or wx2 stat req<br />
al,wx2_stat busy or wx2 stat cd or wx2 stat req<br />
i13 par wr<br />
re w<br />
ah<br />
re w<br />
ah,ec reset<br />
call i13 par wr<br />
return<br />
c Purpose: Set parameters<br />
c<br />
;jump if reset successful and the<br />
,controller is trying to read ccb<br />
:jump if no rollover<br />
,update msb of counter<br />
:jump if success still possible<br />
:error code<br />
:exit<br />
C Entry: (si) =Offset to port base for target controller<br />
c<br />
c Exit: (ah) = Completion code<br />
C *** As of A3 version, step rate selection is not part of Set Parameters<br />
C *** command. Step rate is moved to CCB from subtable on every command.<br />
c<br />
C i13 par wr:<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
C par wr:<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
mov<br />
call<br />
jc<br />
mov<br />
mov<br />
call<br />
jc<br />
call<br />
ram ccb+1,0<br />
par wr<br />
ret near<br />
ram ccb+1,ccb drv b<br />
- - -<br />
:drive 0 is 1st target<br />
:set parameters for 1 drive<br />
:jump if error<br />
:set drive bit<br />
al,not(wx2_msk dma or wx2 msk int) ,no dma & no interrupt<br />
ccb send :send CCB to target controller<br />
ret near :jump if error<br />
subtable :determine subtable to use<br />
C Send 8-byte parameter block to the target controller.<br />
C Note that the bytes are sent MSB first, then LSB<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
mov<br />
call<br />
mov<br />
call<br />
mov<br />
call<br />
mov<br />
call<br />
di,wst_cyl+1<br />
send_byte<br />
di,wst_cyl+O<br />
send byte<br />
di,wst heads<br />
send_byte<br />
di,wst re wr+1<br />
send_byte<br />
:offset to byte to send<br />
:send msb of number of cylinders<br />
:LSB of number of cylinders<br />
:send 1 byte<br />
:number of heads<br />
;send 1 byte<br />
:MSB of reduced write current cyl<br />
;send 1 byte<br />
1-65
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
c<br />
02BC BF 0003 c mov di.wst re wr+O :LSB of reduced write current cyl<br />
02BF E8 020E R c call send_byte ;send 1 byte<br />
c<br />
02C2 BF 0006 c mov di,wst wr pre+1 :MSB of write precomp. cyl<br />
02C5 E8 020E R c call send_byte ;send 1 byte<br />
c<br />
02C8 BF 0005 c mov di,wst wr pre+O :LSB of write precomp cyl<br />
02CB E8 020E R c call send_byte ;send 1 byte<br />
c<br />
02CE BF 0007 c mov di,wst er bur :maximum burst length<br />
0201 E8 020E R c call send_byte ;send 1 byte<br />
c<br />
0204 E8 04AC R c call wx2 cc :receive command completion byte<br />
0207 72 02 c jc par wr erx ;jump if error prevented reception<br />
0209 74 02 c jz ret near 1 :jump if no error on command<br />
c<br />
020B c par wr erx:<br />
020B B4 07 c mov ah,ec init :error code<br />
0200 c ret near 1:<br />
-<br />
0200 C3 c ret :exit<br />
c<br />
c<br />
020E- c send byte:<br />
020E E8 04C9 R c call wx2 req ;wait for data request<br />
02E1 72 05 c jc send err ;jump if error<br />
02E3 26: SA 01 c mov al,es: [bx+di) :byte to send<br />
02E6 EE c out dx,al ;send to wx2<br />
02E7 C3 c ret :exit<br />
c<br />
c<br />
02E8 c send err:<br />
02E8 58 c pop ax :throw away near return<br />
02E9 EB FO c jmp par_wr_erx :error exit from write parameters<br />
c<br />
c ·========================================<br />
c<br />
c Call: call i13 par rd<br />
c return<br />
c<br />
c Read parameters<br />
c<br />
c Entry: (si.) = offset to port base for target controller<br />
c<br />
c Exit: (OL) = Number of usable drives at install time<br />
c (OH) = Maximum head number<br />
c (CL) Bits 0 - 5 = 17d --- Maximum sector number<br />
c (CL) bits 6, 7 = Bits 8, 9 of Maximum cylinder number<br />
c (CH) = Bits 0 - 7 of maximum cylinder number<br />
c<br />
02EB c i13 par rd:<br />
02EB E8 040A R c call subtable :determine subtable to use<br />
02EE 26: 8B 07 c mov ax,es:wst_cyl[bx) :number of cylinders<br />
02F1 20 0002 c sub ax,2 :max. cylinder number<br />
c ;The last cylinder is reserved.<br />
1-66 <strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong>
D33A<br />
D33A 80 07<br />
D33C<br />
033C SA 16 0046 R<br />
0340<br />
0340 50<br />
0341 80 00<br />
0343 E6 63<br />
0345 58<br />
0346 BF 0200<br />
0349<br />
0349 FA<br />
D34A E6 DB<br />
D34C 90<br />
0340 90<br />
D34E E6 DC<br />
0350 8C CO<br />
0352 81 04<br />
0354 03 co<br />
0356 SA E8<br />
0358 24 FO<br />
D35A 03 46 DE<br />
0350 80 OS 00<br />
0360 E6 06<br />
0362 86 EO<br />
0364 E6 06<br />
0366 86 cs<br />
0368 SA CC<br />
D36A 24 OF<br />
D36C E6 82<br />
D36E 88 C7<br />
0370 32 F6<br />
0372 F7 E2<br />
0374 20 0001<br />
0377 80 DA 00<br />
D37A E6 07<br />
D37C 86 C4<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
C Entry: (si) = Offset to port base for target controller<br />
c<br />
C Exit: (ah) = Completion code<br />
c<br />
c i13 rd:<br />
C mov<br />
C io norm:<br />
C mov<br />
C sec size norm:<br />
C IF DMACC<br />
C push<br />
C mov<br />
C out<br />
c pop<br />
C ENDIF<br />
C mov<br />
c<br />
al,dma mode wr<br />
dl,ram ccb+ccb blks<br />
ax<br />
al,dmanorm<br />
p dmacc,al<br />
ax<br />
- -<br />
di,sec size<br />
C Prepare the DMA chip<br />
c<br />
C dma start:<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
eli<br />
out<br />
nop<br />
nop<br />
out<br />
p_dma+dma_w_mode,al<br />
p_dma+dma w byte,al<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
;byte to set dma chip to write to host<br />
;number of blocks to transfer<br />
;norm sector dma%<br />
;tell dma ace that this is a norm sector%<br />
;numbr of bytes per sector<br />
C Calculate the 20-bit address of the DMA base address<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
mov<br />
mov<br />
rol<br />
mov<br />
and<br />
add<br />
a de<br />
out<br />
xchg<br />
out<br />
xchg<br />
mov<br />
and<br />
out<br />
ax,es<br />
cl,4<br />
ax,cl<br />
ch,al<br />
al, OfOh<br />
ax,a1 bx[bp]<br />
ch,O<br />
p dma+dma w addr,al<br />
ah,al<br />
p dma+dma w addr,al<br />
al,ch<br />
cl,ah<br />
al,Ofh<br />
p dma latch,al<br />
- --<br />
:disable interrupts<br />
:set read or wr-ite to host<br />
: Can't handle back to%<br />
: back writes to dma controller %<br />
;clear pointer to register byte<br />
,segment reg for i/o buffer<br />
,count for shift<br />
:multiply by 16<br />
:bits 16 - 19 in bits 0 - 3<br />
;clear bits 0 - 3 of address<br />
:combine 16-bit offset with seg base<br />
:add carry into MS bits<br />
,set bits 0 -7 of dma address<br />
:bits 8 - 15 to al<br />
;set bits 8 - 15 of dma address<br />
:bits 16 - 19 of dma address to al<br />
:bits 0 - 15 of addr in ex now<br />
:mask to 4 bits<br />
:set 4-bit latch for highest address<br />
:bits<br />
C Calculate the number of bytes to be DMAed minus 1.<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
mov<br />
xor<br />
mul<br />
sub<br />
sbb<br />
out<br />
xchg<br />
ax,di<br />
dh,dh<br />
dx<br />
ax, 1<br />
dl, 0<br />
p dma+dma w cnt,al<br />
al,ah<br />
:block size in bytes<br />
:clear upper byte<br />
;number of bytes to dma: (ax) LSW<br />
:(dx) is MSW<br />
;byte offset to last byte to be trans<br />
:bits 16 - 23 of byte offset.<br />
: and set ZF<br />
;set bits 0 - 7 of byte count<br />
:bits 8 - 15 of count to al<br />
1-69
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
037E E6 07<br />
0380 F8<br />
0381 75 13<br />
0383 86 EO<br />
0385 03 C1<br />
0387 72 00<br />
0389 80 03<br />
0388 E8 047A R<br />
038E 72 08<br />
0390 80 03<br />
0392 E6 OA<br />
0394 E8 OA<br />
0396<br />
0396 84 09<br />
0398<br />
0398 C3<br />
0399<br />
0399 80 02<br />
0398 E8 047A R<br />
039E 72 F8<br />
03AO<br />
03AO FA<br />
03A1 E4 21<br />
03A3 24 OF<br />
03A5 E6 21<br />
1-70<br />
c<br />
c<br />
c<br />
c<br />
out<br />
sti<br />
p dma+dma w cnt.al ;set bits 8 - 15 of byte count<br />
:enable interrupts<br />
C Check for DMA spanning 64k absolute address boundary<br />
C :Are bits 16 - 23 of byte offset O?<br />
C : note: If the block count is 0,<br />
C then (dl) = ff.<br />
jnz<br />
ah,al<br />
:byte offset to last byte transferred<br />
ax,cx<br />
:transferred.<br />
jc<br />
C :boundary<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
xchg<br />
add<br />
dma 64k<br />
dma 64k<br />
C Start winchester controller and DMA controller.<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
C dma 64k:<br />
mov<br />
call<br />
jc<br />
mov<br />
out<br />
jmp<br />
C mov<br />
C ret near 3:<br />
c ret<br />
C page<br />
;jump if dma more than 64kb<br />
:lsw of address of last byte<br />
;jump if dma crosses absolute 64k<br />
al,wx2 msk dma or wx2 msk int :dma & interrupt enable<br />
- - - -<br />
ccb send ;send ccb to wx2<br />
ret near 3 :jump if error<br />
al,dma mask b 3 ;clear bit 3 of mask register<br />
p dma+dma w mask b,al :enable channel 3<br />
short wx2 wait<br />
- -- -<br />
ah,ec dma 64k ;completion error code<br />
c ·========================================<br />
c<br />
c<br />
c<br />
c<br />
Call: call i13 dma no<br />
return<br />
;exit<br />
C Purpose: Execute a command involving the winchester controller<br />
C but not involving DMA.<br />
c<br />
C Entry: (si) = Offset to port base for target controller<br />
c<br />
c<br />
c<br />
Exit:<br />
C dma no:<br />
c<br />
c<br />
c<br />
c<br />
mov<br />
call<br />
jc<br />
(ah) = Completion code<br />
al,wx2 msk int<br />
ccb send<br />
ret near 3<br />
;enable interrupt by wx2<br />
;send ccb to wx2<br />
:jump if error<br />
C Wait for the winchester interrupt in a polling loop<br />
c<br />
C wx2 wait:<br />
c<br />
c<br />
c<br />
c<br />
eli<br />
in<br />
and<br />
out<br />
al,p int+int ocw1<br />
al,not int ocw1 m5<br />
p int+int ocw1,al<br />
;disable interrupts<br />
:read interrupt mask<br />
:enable channel 5 interrupts<br />
;set interrupt mask<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong>
D3A7 FB<br />
D3A8 53<br />
D3A9 51<br />
D3AA 06<br />
D3AB E8 D4DA R<br />
D3AE 33 CO<br />
D3BO AD 0042 R<br />
D3B3 30 OOE3<br />
D3B6 74 DC<br />
D3B8 30 0004<br />
D3BB 74 DE<br />
D3BD 26: 8A 47 09<br />
D3C1 EB DC 90<br />
D3C4<br />
D3C4 26: 8A 47 DB<br />
D3C8 EB 05 90<br />
D3CB<br />
D3CB 26: 8A 47 OA<br />
D3CF<br />
D3CF 33 DB<br />
0301 8A 08<br />
0303 B9 0002<br />
0306 03 E3<br />
0308<br />
0308 33 C9<br />
D3DA E8 0519 R<br />
0300<br />
0300 EC<br />
D3DE A8 20<br />
D3EO 75 OF<br />
D3E2 A8 08<br />
D3E4 74 05<br />
D3E6<br />
D3E6 E2 F5<br />
D3E8 4B<br />
D3E9 75 ED<br />
D3EB<br />
D3EB 07<br />
D3EC 59<br />
D3ED 5B<br />
D3EE<br />
D3EE E9 D48B R<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
C drv_diag:<br />
c<br />
c<br />
sti<br />
push<br />
push<br />
push<br />
call<br />
xor<br />
mov<br />
cmp<br />
jz<br />
cmp<br />
jz<br />
mov<br />
jmp<br />
mov<br />
jmp<br />
C drv format:<br />
c<br />
c<br />
C continue:<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
mov<br />
xor<br />
mov<br />
mov<br />
shl<br />
mov<br />
C wait more:<br />
C xor<br />
C call<br />
C int wait:<br />
c in<br />
C test<br />
C jnz<br />
c test<br />
C jz<br />
c<br />
C fall,<br />
C loop<br />
C dec<br />
C jnz<br />
C ret time k:<br />
c<br />
c<br />
c<br />
pop<br />
pop<br />
pop<br />
c ret_time_j:<br />
C jmp<br />
c<br />
c<br />
bx<br />
ex<br />
es<br />
subtable<br />
ax.ax<br />
al.ram ccb+ccb cmd<br />
- -<br />
ax,dc_diag drv<br />
drv_diag<br />
ax,dc fd<br />
drv format<br />
al,es:[bx+wst sto]<br />
continue<br />
al,es:[bx+wst ddto]<br />
continue<br />
al,es:[bx+wst_fto]<br />
bx,bx<br />
bl,al<br />
cx,2<br />
bx,cl<br />
ram cc,O<br />
cx,cx<br />
wx2 stat<br />
al,dx<br />
al,wx2 stat int<br />
wx2 int<br />
al,wx2 stat_busy<br />
ret time k<br />
int wait<br />
bx<br />
wait more<br />
es<br />
ex<br />
bx<br />
ret time<br />
:enable interrupts<br />
;%<br />
;save these registers%<br />
;just in case%<br />
;%<br />
which parameter table is being used%<br />
clear ax%<br />
which command was it?%<br />
was it a drive diagnostic command?%<br />
if so jump%<br />
was it a format drive command?%<br />
if so jump%<br />
if we're here so it must be%<br />
a standard command%<br />
continue with this dirty deed%<br />
get the drive diagnostic time out value%<br />
get on with it%<br />
get the format drive time out value%<br />
; clear bx%<br />
; put time out value into bx%<br />
::; ::changed%%%%<br />
;%<br />
we are soooo fast we should%<br />
make this number bigger, MUCH%<br />
clear ram cc %<br />
;clear ex%<br />
;calc. address of target port<br />
:read wx2 status<br />
:interrupt?<br />
;jump if yes.<br />
;busy?<br />
;jump if not busy.%<br />
;%<br />
;%<br />
;%<br />
;%<br />
;%<br />
;%<br />
;%<br />
;return time-out error<br />
1-71
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
D3F1<br />
D3F1 07<br />
D3F2 59<br />
D3F3 SB<br />
D3F4 E8 D51E R<br />
D3F7 80 FC<br />
D3F9 EE<br />
D3FA E8 D4AC R<br />
D3FD 72 EF<br />
D3FF 74 97<br />
0401 C6 06 0042 R 03<br />
0406 BO FC<br />
D40S E8 D47A R<br />
0408 72 6A<br />
0400 BF 0042 R<br />
0410 SC OS<br />
0412 SE CO<br />
0414 89 0004<br />
0417 FC<br />
D41S<br />
D41S ES D4C9 R<br />
0418 72 SA<br />
0410 EC<br />
D41E AA<br />
D41F E2 F7<br />
0421 ES D4AC R<br />
0424 72 51<br />
0426 75 4F<br />
D42S SA 2E 0042 R<br />
D42C SA DO<br />
D42E 81 E3 0030<br />
0432 81 03<br />
0434 02 E8<br />
0436 SA ES<br />
D43S SO E4 OF<br />
0438 2E: 3A A7 0523 R<br />
0440 73 32<br />
0442 43<br />
0443 2E: 8A 9F 0523 R<br />
0448 02 DC<br />
1-72<br />
C wx2 int:<br />
c pop<br />
c pop<br />
C pop<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
call<br />
mov<br />
out<br />
call<br />
jc<br />
jz<br />
es<br />
ex<br />
bx<br />
;%<br />
;%<br />
;%<br />
wx2 msk<br />
;calc. address of target msk<br />
al.not (wx2_msk_dma or wx2_msk int) :disable dma &<br />
dx,al<br />
:interrupts<br />
wx2 cc<br />
;read completion code from wx2<br />
ret_time_j<br />
;jump if error prevented cc reception<br />
ret near 3<br />
;jump if no error<br />
C The controller reported an error. Read status to obtain more error<br />
C information.<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
mov<br />
mov<br />
call<br />
jc<br />
ram ccb+ccb cmd,dc stat rd :Read status command<br />
- - - -<br />
al.not (wx2_msk_dma or wx2_msk_int) ;no dma or interrupt<br />
ccb send<br />
stat err<br />
:by wx2<br />
;send command to wx2<br />
;jmp if error<br />
C Read the 4-bytes of error status from the controller.<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
mov<br />
mov<br />
mov<br />
mov<br />
cld<br />
C stat loop:<br />
C call<br />
jc<br />
in<br />
stosb<br />
loop<br />
call<br />
jc<br />
jnz<br />
di,offset ram stat<br />
ax,ds<br />
es.ax<br />
cx,4<br />
wx2 req<br />
stat err<br />
al,dx<br />
stat loop<br />
wx2 cc<br />
stat err<br />
stat err<br />
:offset to 4-byte area for status<br />
;ram segment<br />
;set es for stosb instruction<br />
;number of status bytes<br />
:clear direction --> inc di<br />
;wait for request<br />
;jump if error<br />
:read status byte<br />
;save status byte<br />
;jump if more status to read<br />
:receive command completion byte<br />
;jump if error prevented reception<br />
;jump if error on command<br />
C Translate the controller error code into a <strong>BIOS</strong> error code<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
mov<br />
mov<br />
and<br />
mov<br />
shr<br />
mov<br />
and<br />
cmp<br />
jnc<br />
inc<br />
mov<br />
add<br />
ch,ram stat<br />
bl,ch<br />
bx.30h<br />
cl, 3<br />
bl,cl<br />
;error code<br />
;mask to error type field<br />
;shift count<br />
:type times 2<br />
ah,ch ;error code<br />
ah,Ofh ;mask to error in type field<br />
ah.cs:[bx]+offset er_master_tbl :number of error codes in type<br />
undef<br />
;jump if out of range<br />
bx<br />
;update table address<br />
bl,cs:[bx]+offset er_master_tbl ;offset to subtable<br />
bl,ah ;error code subfield<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong>
044A 2E: 8A A7 0523 R c mov ah.cs:(bx]+offset er_master_tbl ,completion code<br />
044F 80 FO 18 c cmp ch,erc corr ;correctable ECC error?<br />
0452 75 22 c jne ret near 5 ;jump if no<br />
c<br />
c ECC error corrected ---> Read the error burst length<br />
c<br />
0454 8A FC c mov bh,ah ;save completion code<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
0456 C6 06 0042 R 00 c mov ram ccb+ccb cmd,dc ecc rd ;read error burst length<br />
0458 BO FC c mov al,not (wx2_msk_dma or wx2_msk_int) ;no dma or interrupt<br />
- - - -<br />
c ;by wx2<br />
0450 E8 047A R c call ccb send ;send command to wx2<br />
0460 72 15 c jc stat err ;jmp if error<br />
0462 E8 04C9 R c call wx2 req ;wait for request<br />
0465 72 10 c jc stat err ;jump if error<br />
0467 EC c in al,dx :read error burst length<br />
0468 8A 08 c mov bl,al ,save<br />
046A E8 04AC R c call wx2 cc ;receive completion byte<br />
-<br />
-<br />
-<br />
0460 72 08 c jc stat err ;jump if error prevented reception<br />
046F 75 06 c jnz stat err ;jump if error on command<br />
0471 88 C3 c mov ax,bx ;completion code & error burst length<br />
0473 C3 c ret ;exit<br />
c<br />
c<br />
0474 c undef:<br />
0474 84 BB c mov ah,ec undef ;undefined error code<br />
0476 c ret near 5:<br />
0476 C3 c ret ,exit<br />
c<br />
c .-------c<br />
0477 c stat err:<br />
0477 84 FF c mov ah,ec stat ;read status failed<br />
0479 C3 c ret ;exit<br />
c<br />
c ========================================<br />
c<br />
c Call: call ccb send<br />
c return<br />
c<br />
c Send the Command Control Block to the wx2 controller<br />
c<br />
c Entry: (al) = byte to set into wx2 mask port<br />
c (ram_ccb + 0, 1, 2, 3, 4, 5) = ccb to send to wx2<br />
c (si) = offset to port base for target controller<br />
c<br />
c Exit: (CF) = 0 -->no error. 1 --> error<br />
c (AH) = Error completion code, if error<br />
c Changed: ax, ex, dx, di<br />
c Unchanged: bx, bp, si<br />
c<br />
047A c ccb send:<br />
047A E8 051E R c call wx2 msk :calculate address of target mask port<br />
-<br />
0470 EE c out dx.al ;set wx2 mask port<br />
-<br />
047E 4A c dec dx ;address of target select port<br />
047F EE c out dx,al ;select wx2<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong> 1-73
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
048D 4A c<br />
0481 B9 D258 c<br />
c<br />
c<br />
0484 c<br />
0484 EC c<br />
0485 AS D8 c<br />
0487 75 D6 c<br />
0489 E2 F9 c<br />
c<br />
048B c<br />
0486 B4 8D c<br />
0480 F9 c<br />
048E c<br />
048E C3 c<br />
c<br />
c<br />
048F c<br />
048F BF DD42 R c<br />
0492 B9 DDD6 c<br />
0495 FC c<br />
c<br />
0496 c<br />
0496 E8 04C9 R c<br />
0499 72 F3 c<br />
c<br />
049B 24 DE c<br />
0490 34 DC c<br />
049F 75 EA c<br />
c<br />
04A1 87 FE c<br />
04A3 AC c<br />
04A4 87 FE c<br />
04A6 EE c<br />
04A7 E2 EO c<br />
c<br />
04A9 E9 03DF R c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
dec<br />
mov<br />
mov<br />
busy_wait:<br />
in<br />
test<br />
jnz<br />
loop<br />
ret time:<br />
mov<br />
stc<br />
ret near 2:<br />
ret<br />
busy:<br />
mov<br />
mov<br />
cld<br />
ccb_byte:<br />
call<br />
jc<br />
Call:<br />
dx<br />
cx,6DD<br />
cx,3DD<br />
al,dx<br />
al,wx2_stat_busy<br />
busy<br />
busy_wait<br />
ah,ec time<br />
di,offset ram ccb<br />
cx,6<br />
wx2 req<br />
ret near 2<br />
;address of target status port<br />
;loop counter(value doubled)%<br />
;loop counter<br />
;read wx2 status<br />
:busy?<br />
; jump if yes.<br />
;loop if success still possible<br />
;completion code<br />
; set error flag<br />
;exit<br />
;pointer to ccb<br />
:number of bytes in a ccb<br />
;clear direction --> inc si<br />
;Wait for data request<br />
;jump if error<br />
and al,wx2 stat_busy or wx2_stat cd or wx2 statio<br />
xor al,wx2_stat_busy or wx2_stat cd ;command byte requested?<br />
jnz ret time<br />
;jump if no.<br />
xchg di,si<br />
lodsb<br />
xchg di,si<br />
out dx, al<br />
loop ccb byte<br />
jmp ret no err<br />
call<br />
return<br />
wx2 cc<br />
Read command completion byte<br />
Entry: (si) = offset to port base for target controller<br />
Exit: (cf) = D --> no error in reading completion byte<br />
1 -->error, completion byte not read<br />
(zf) = Valid only if (cf) = D<br />
1 --> error bit in completion byte not set<br />
D --> error bit in completion byte set<br />
(ah) = D<br />
changed: ax, dx<br />
unchanged: bx, ex, bp, si, di<br />
;ccb pointer to si & save port offset<br />
;ccb byte to al<br />
;restore port offset to si & save ccb<br />
;send to wx2<br />
;loop if more ccb bytes<br />
1-74 <strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong>
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
0537 00<br />
0538 04<br />
0539 40<br />
053A 00<br />
0538 00<br />
053C 11<br />
0530 DB<br />
= OOOA<br />
053E<br />
053E 01<br />
053F 02<br />
= 0002<br />
0540<br />
0540 20<br />
0541 20<br />
0542 10<br />
= 0003<br />
0543 38 35 2F 30 31 2F<br />
0548<br />
CEF7<br />
CEF7<br />
0550<br />
1-78<br />
32 35<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
db ec no err<br />
db ec sec not fnd<br />
db ec seek<br />
db ec no err<br />
db ec no err<br />
db ec ecc cor<br />
db ec bad trk<br />
- -<br />
- -<br />
tU equ $-t1 tbl<br />
t2 tbl:<br />
db ec be<br />
db ec addr mark<br />
t21 equ $-t2 tbl<br />
t3 tbl:<br />
db ec cntlr<br />
db ec cntlr<br />
db ec ecc un<br />
-<br />
- -<br />
t31 equ $-t3 tbl<br />
code ends<br />
db " 85/01/25"<br />
end<br />
-<br />
c<br />
c<br />
c ·===============================================================================<br />
c<br />
c<br />
code ends<br />
include graph.asm<br />
Filename: graph.src<br />
;not used<br />
;sector not found<br />
;seek error<br />
;not used<br />
;not used<br />
;ecc error corrected<br />
;bad track<br />
;invalid command<br />
;illegal disk address<br />
;RAM failure<br />
;<strong>ROM</strong> checksum error<br />
;ECC subsystem failure<br />
;release date<br />
c This module includes the four graphics functions for INT 10h.<br />
c<br />
c<br />
c ·===============================================================================<br />
c<br />
C page<br />
c .-------------------------------------------------------------------------------<br />
c INT 10h Graphics Support<br />
c<br />
C Must preserve bx, ex, dx and return values in ax<br />
c<br />
c All other registers are saved and restored by video dispatcher.<br />
c<br />
c Entered with the following in registers:<br />
C al, bx, ex, dx intact (set by INT 10 invoker)<br />
c ah = v mode<br />
c ·------------------------------------------------------------------------------c<br />
C code segment public '<strong>ROM</strong>'<br />
C assume cs:code, ds:data, es:v ram, ss:nothing<br />
c<br />
c ORG 00550H<br />
C ;Attempt to force a vacant space in the code for the hdu %<br />
c<br />
C page<br />
c ·===============================================================================<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong>
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
e<br />
e<br />
e<br />
e<br />
e<br />
e<br />
e<br />
056A e<br />
e<br />
056A 52 e<br />
056B 51 e<br />
056e 50 e<br />
e<br />
0560 E8 0595 R e<br />
0570 26: 8A OS e<br />
0573 SA e<br />
0574 52 e<br />
0575 OA 02 e<br />
0577 78 06 e<br />
0579 F6 04 e<br />
057B 22 e4 e<br />
0570 F6 04 e<br />
057F e<br />
057F FE e1 e<br />
0581 80 FE 05 e<br />
0584 7F 02 e<br />
0586 FE e1 e<br />
0588 e<br />
0588 02 eA e<br />
058A 22 04 e<br />
058e 32 e2 e<br />
058E 26: 88 05 e<br />
e<br />
0591 58 e<br />
0592 59 e<br />
0593 SA e<br />
0594 e3 e<br />
e<br />
0595 e<br />
e<br />
e<br />
e<br />
e<br />
e<br />
e<br />
e<br />
e<br />
e<br />
e<br />
e<br />
e<br />
e<br />
e<br />
e<br />
e<br />
1-80<br />
OX = row (0-399) (the actual value depends on the mode)<br />
ex = column (0-639) (the values are not range checked)<br />
Saved: AX. BX. ex. OX (Video dispatcher saves the rest)<br />
grf_write_dot proc near<br />
push<br />
or<br />
js<br />
not<br />
and<br />
not<br />
g xorbit:<br />
inc<br />
cmp<br />
jg<br />
inc<br />
g align dot:<br />
ror<br />
push dx preserve working registers<br />
push ex<br />
push ax<br />
call g addr ; compute address & mask<br />
mov al,byte ptr es:[di] ; fetch byte from video memory<br />
pop dx get v mode & dot value to write<br />
dx<br />
dl,dl<br />
g xorbit<br />
ah<br />
al,ah<br />
ah<br />
cl<br />
dh,S<br />
g align dot<br />
cl<br />
resave<br />
is the XOR bit set?<br />
jump if yes<br />
invert mask<br />
clear bits for new pixel<br />
restore mask for later<br />
prep for wraparound right (b&w)<br />
color ?<br />
jump if no<br />
prep for wraparound right (color)<br />
dl,cl<br />
align new pixel<br />
and dl,ah<br />
strip off non-pixel bits (xor bit, etc)<br />
xor al.dl OR or XOR in new pixel depending on xor bit<br />
mov byte ptr es:[di].al ; update video memory<br />
pop ax ; restore registers<br />
pop ex<br />
pop dx<br />
ret<br />
grf_write_dot endp<br />
page<br />
This subroutine determines the video RAM byte location<br />
of the indicated row column value. The current graphics mode<br />
is taken into account.<br />
INPUT:<br />
OUTPUT:<br />
AH = current graphics mode<br />
OX = row value (0-399)<br />
ex = column value (0-639)<br />
or = byte address of pixel location in video ram<br />
AH = mask of pixel in byte<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong>
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
0505 22 EA<br />
0507 03 EA<br />
0509 03 FA<br />
0506 80 F9 03<br />
D5DE 74 02<br />
D5EO DO E5<br />
D5E2<br />
D5E2 86 CD<br />
05E4 B4 80<br />
D5E6 02 EC<br />
D5E8 80 FD 03<br />
D5EB 74 06<br />
D5ED 8A C4<br />
D5EF DO E8<br />
D5F1 OA EO<br />
D5F3<br />
D5F3 C3<br />
05F4<br />
1-82<br />
C CL = shift count to divide column by pixels per byte<br />
C 3 for b&w (divide by 8), 2 for color (divide by 4)<br />
C CH = remainder's mask during division (7 for b&w , 3 for color)<br />
C OX = column<br />
C DI = address to column 0 of requested row<br />
c<br />
c<br />
c<br />
c<br />
and<br />
shr<br />
ch,dl<br />
dx,cl<br />
get division's remainder inCH<br />
perform division<br />
C OX = quotient = column's byte offset from start of row<br />
C CH =remainder (=pixel's offset into byte)<br />
c<br />
c<br />
c<br />
add<br />
C NOW:<br />
di,dx : DI =pixel's byte address<br />
c DI = address of byte containing the pixel<br />
c CH = pixel offset into byte (remainder)<br />
C CL = 3 (black & white) or 2 (color)<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
cmp<br />
je<br />
shl<br />
g_bitmask:<br />
g_skp_5:<br />
xchg<br />
mov<br />
shr<br />
cmp<br />
je<br />
mov<br />
shr<br />
or<br />
ret<br />
g_addr endp<br />
page<br />
cl,3<br />
g_bitmask<br />
ch,1<br />
cl,ch<br />
ah,80H<br />
ah,cl<br />
ch,3<br />
g skp 5<br />
al,ah<br />
al,1<br />
ah,al<br />
black & white?<br />
jump if yes<br />
color: convert to bit offset<br />
load CL, preserve " mode"<br />
set high bit in byte<br />
mask pixel's leftmost bit<br />
black & white?<br />
jump if yes<br />
color: create 2-bit mask<br />
DI = byte address. AH = pixel mask,<br />
CL =bit offset: pixel's leftmost bit<br />
c ·===============================================================================<br />
c<br />
c Scroll Up In Graphics Mode<br />
c<br />
c Scroll up the number of lines specified within the specified screen<br />
c area (window).<br />
c<br />
C Input:<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
AL =<br />
BH =<br />
number of lines to be scrolled up ( zero<br />
means clear the window)<br />
fill pattern to be used<br />
CH,CL = upper left corner of window in which to scroll<br />
DH,DL = lower right corner of window in which to scroll<br />
OS = data segment<br />
ES = graphics refresh ram segment<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong>
D5F4<br />
05F4 53<br />
D5F5 51<br />
D5F6 52<br />
05F7 80 0050<br />
05FA 50<br />
D5F8 88 C1<br />
05FD E8 D8E1 R<br />
0600 88 F8<br />
0602 06<br />
0603 1F<br />
0604 28 01<br />
0606 81 cz 0101<br />
060A 58<br />
0608 83 02<br />
0600 8A C8<br />
D60F 80 FC 40<br />
0612 72 06<br />
0614 83 04<br />
0616 74 02<br />
0618 DO F9<br />
D61A<br />
D61A 02 EO<br />
D61C 02 E6<br />
D61E 88 C8<br />
0620 80 FD 06<br />
0623 70 04<br />
0625 01 E7<br />
0627 DO EZ<br />
0629<br />
0629 81 E1 DOFF<br />
0620 74 3C<br />
D62F 88 C1<br />
0631 8A E9<br />
0633 86 F5<br />
0635 88 F7<br />
0637 81 04<br />
0639 03 EO<br />
0638 03 FO<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
C Saved: 8X, ex. OX (Video dispatcher saves the rest)<br />
c<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
c .-------------------------------------------------------------------------------<br />
(<br />
C grf_graphics_up proc near<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
push<br />
push<br />
push<br />
cld<br />
niOV<br />
push<br />
mov<br />
call<br />
mov<br />
push<br />
pop<br />
sub<br />
add<br />
pop<br />
mov<br />
mov<br />
cmp<br />
jb<br />
mov<br />
je<br />
sar<br />
C g_tst_mod:<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
C g_set_up:<br />
sal<br />
sal<br />
mov<br />
cmp<br />
jge<br />
sal<br />
sal<br />
C and<br />
C jz<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
mov<br />
mov<br />
xchg<br />
mov<br />
mov<br />
sal<br />
add<br />
bx<br />
ex<br />
dx<br />
bp,80<br />
ax<br />
ax,cx<br />
g_curs off<br />
di,ax<br />
es<br />
ds<br />
dx,cx<br />
dx,101H<br />
ax<br />
bl,Z<br />
cl,bl<br />
ah,64<br />
g_tst_mod<br />
bl,4<br />
g_tst_mod<br />
cl. 1<br />
al,cl<br />
dh,cl<br />
cx,ax<br />
ch.6<br />
g_set_up<br />
di,1<br />
dl, 1<br />
save<br />
the<br />
registers<br />
:dir. flag = increment (from v scrl up)<br />
;offset to next scanline (CLD => +80)<br />
;save mode. #rows to scroll<br />
;compute address of window's<br />
upper left corner<br />
:save in DI for string instructions<br />
;set OS to video ram for string inst.<br />
;compute window's dimensions<br />
DH = height. DL = width<br />
:AH = mode, AL = # rows to scroll<br />
;# interlace areas = 2 for modes 4,5,6<br />
;# scanlines per i.a. = 4 for modes -72<br />
;jump if mode= 4.5,6<br />
;# interlace areas = 4 for modes 64 & 72<br />
;jump if mode = 64<br />
;# scanlines per i.a. = 2 for mode 72<br />
;convert number of rows to number of<br />
scanlines per interlace area<br />
:CH = mode, CL = # scanlines to scroll<br />
:are we in a medium resolution mode ?<br />
:jump if no<br />
:double number of bytes per character<br />
;get address of lines to scroll in refresh ram memory<br />
cx,OOFFH :CX = # of scanlines to scroll per i.a.<br />
g filler :if zero. go fill all of window<br />
ax,cx<br />
ch,cl<br />
dh.ch<br />
si,di<br />
cl.4<br />
ax,cl<br />
si,ax<br />
;make DH = # scanlines to fill per i.a.<br />
AX = # scanlines to scroll "<br />
CH = # scanlines in window "<br />
;compute address of scanline to be<br />
scrolled to top of window:<br />
0662 SE<br />
0663 03 FD<br />
0665 03 FS<br />
0667 FE CC<br />
0669 75 DE<br />
0668<br />
0668<br />
0668 SA C7<br />
0660<br />
0660 57<br />
066E 52<br />
066F<br />
D66F 57<br />
0670 SA CA<br />
0672 F3/ AA<br />
0674 SF<br />
067S 03 FD<br />
0677 FE CE<br />
0679 75 F4<br />
0678 SA<br />
D67C SF<br />
0670 S1 C7 2000<br />
D6S1 FE C8<br />
06S3 7S ES<br />
0685 SA<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
pop<br />
add<br />
add<br />
dec<br />
jnz<br />
si<br />
di,bp<br />
si,bp<br />
ah<br />
c<br />
c<br />
c g_ scroller endp<br />
c<br />
C page<br />
g scroller<br />
jmp short g_filler<br />
and destination addresses<br />
;address next scanline in<br />
each interlace area<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
; loop to move " all" scanlines in<br />
each interlace area<br />
;now fill in the gap<br />
c ·===============================================================================<br />
c<br />
C Fill rows in graphics refresh memory with the fill pattern<br />
c<br />
c<br />
C Input:<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c Output:<br />
c<br />
c<br />
c<br />
8L =<br />
8H =<br />
CH =<br />
DL =<br />
DH =<br />
DI =<br />
8P =<br />
AL =<br />
AH =<br />
Number of interlace areas<br />
Fill pattern to be used<br />
0<br />
Number of bytes to fill in each scanline<br />
Number of scanlines to fill in each interlace area<br />
Destination scanline address of first byte to fill<br />
offset to next scanline (+/- SO)<br />
fill pattern<br />
0<br />
c .-----------------------------------------------------------------------------c<br />
C g_filler<br />
c<br />
c<br />
c<br />
mov<br />
c g_f_i_lp:<br />
c push<br />
c push<br />
c<br />
c g_f_s_lp:<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
push<br />
mov<br />
rep<br />
pop<br />
add<br />
dec<br />
jnz<br />
pop<br />
pop<br />
add<br />
dec<br />
jnz<br />
pop<br />
proc near<br />
al,bh ;AL = fill pattern for STDSB instruction<br />
:Fill Interlace Areas Loop<br />
di ;save interlace area address<br />
dx ;save scanlines count (DH)<br />
;Fill Scanlines Loop<br />
di<br />
cl,dl<br />
stosb<br />
di<br />
di,bp<br />
dh<br />
g f s lp<br />
dx<br />
di<br />
di,2DDDH<br />
bl<br />
g f i lp<br />
dx<br />
;save scanline address<br />
;count of bytes to fill in scanline<br />
; fill scanline<br />
;restore scanline address<br />
;next scanline in interlace area<br />
;fill an interlace area<br />
:restore scanlines count (DH)<br />
;restore interlace area address<br />
;next interlace area address<br />
;fill next interlace area<br />
;restore<br />
1-85
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
0686 59<br />
0687 58<br />
0688 C3<br />
0689<br />
0689<br />
0689 53<br />
D68A 51<br />
0688 52<br />
D68C BD FFBO<br />
D68F 50<br />
0690 88 C2<br />
0692 E8 D8E1 R<br />
0695 88 F8<br />
0697 06<br />
0698 1F<br />
0699 28 01<br />
0698 81 C2 0101<br />
D69F 58<br />
D6AO 83 02<br />
D6A2 8A CB<br />
D6A4 80 FC 40<br />
D6A7 72 06<br />
D6A9 83 04<br />
D6AB 74 02<br />
1-86<br />
c<br />
c<br />
c<br />
c<br />
C g_filler<br />
c<br />
C page<br />
pop<br />
pop<br />
ret<br />
ex the<br />
bx registers<br />
endp<br />
;exit scroll routine<br />
c ·===============================================================================<br />
c<br />
C Scroll Down In Graphics Mode<br />
c<br />
c Scroll down the number of lines specified within the specified screen<br />
c area (window).<br />
c<br />
C Input:<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
AL<br />
BH<br />
= number of lines to be scrolled up ( zero<br />
means clear the window)<br />
= fill pattern to be used<br />
CH,CL = upper left corner of window in which to scroll<br />
DH,DL = lower right corner of window in which to scroll<br />
OS = data segment<br />
ES = graphics refresh ram segment<br />
c Saved: BX, CX, OX (Video dispatcher saves the rest)<br />
c<br />
c .-------------------------------------------------------------------------------<br />
(<br />
c grf_graphics_down<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
push<br />
push<br />
push<br />
std<br />
mov<br />
push<br />
mov<br />
call<br />
mov<br />
push<br />
pop<br />
sub<br />
add<br />
pop<br />
mov<br />
mov<br />
cmp<br />
jb<br />
mov<br />
je<br />
bx<br />
ex<br />
dx<br />
bp,-80<br />
ax<br />
ax,dx<br />
g_curs_off<br />
di,ax<br />
es<br />
ds<br />
dx,cx<br />
dx,101H<br />
ax<br />
bl,2<br />
cl,bl<br />
ah,64<br />
g_cmp_mod<br />
bl,4<br />
g cmp_mod<br />
proc near<br />
save<br />
the<br />
registers<br />
:dir. flag= decrement (from v_scrl_dn)<br />
:offset to next scanline (STD => -80)<br />
;save mode, # rows to scroll<br />
;compute address of window's<br />
lower right corner<br />
;save in DI for string instructions<br />
;set OS to video ram for string inst.<br />
;compute window's dimensions<br />
DH = height, DL = width<br />
:AH =mode, AL = # rows to scroll<br />
;# interlace areas = 2 for modes 4,5,6<br />
;# scanlines per i.a. = 4 for modes -72<br />
;jump if mode = 4,5,6<br />
;# interlace areas = 4 for modes 64 & 72<br />
;jump if mode = 64<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong>
D6AD DO F9<br />
D6AF<br />
D6AF 02 EO<br />
0661 02 E6<br />
0663 80 FC 06<br />
0666 70 05<br />
0668 01 E7<br />
D6BA DO E2<br />
D6BC 47<br />
0660<br />
0660 BE 0050<br />
D6CO 03 E6<br />
D6C2 83 EE 50<br />
D6C5 03 FE<br />
06C7 86 C8<br />
06C9 81 E1 DOFF<br />
06CD 74 9C<br />
D6CF 86 C1<br />
0601 SA E9<br />
0603 86 F5<br />
0605 86 F7<br />
0607 61 04<br />
0609 03 EO<br />
0606 26 FO<br />
0600 01 EO<br />
D6DF 01 EO<br />
D6E1 26 FO<br />
D6E3 8A E5<br />
D6E5 2A E6<br />
D6E7 33 C9<br />
D6E9 E9 0649 R<br />
D6EC<br />
D6EC<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
c<br />
c<br />
sar<br />
C g_cmp_mod:<br />
C sal<br />
C sal<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
cmp<br />
jge<br />
sal<br />
sal<br />
inc<br />
cl. 1<br />
al.cl<br />
dh,cl<br />
ah,6<br />
g_setdown<br />
di,1<br />
dl,1<br />
di<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
;# scanlines per i.a. = 2 for mode 72<br />
,convert number of rows to number of<br />
scanlines per interlace area<br />
:are we in a medium resolution mode ?<br />
;jump if no<br />
;double number of bytes per character<br />
;address last byte in bottom row<br />
C g_setdown: ;get address of lines to scroll in refresh RAM memory<br />
C mov si,80<br />
;address bottom scanline in i.a.<br />
C sal<br />
C sub si,80<br />
C add<br />
cx,ax<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
mov<br />
and<br />
jz<br />
mov<br />
mov<br />
xchg<br />
mov<br />
mov<br />
sal<br />
sub<br />
sal<br />
sal<br />
sub<br />
mov<br />
sub<br />
xor<br />
si,cl<br />
di,si<br />
cx,OOFFH<br />
g filler<br />
ax,cx<br />
ch.cl<br />
dh,ch<br />
si,di<br />
cl.4<br />
ax,cl<br />
si,ax<br />
ax, 1<br />
ax, 1<br />
si,ax<br />
ah.ch<br />
ah,dh<br />
CX,CX<br />
c jmp g_scroller<br />
c<br />
C grf_graphics_down<br />
c<br />
C page<br />
endp<br />
;CH = mode, CL = # scanlines to scroll<br />
;CL = # of scanlines to scroll per i.a.<br />
;if zero. go fill all of window<br />
;make DH = # scanlines to fill per i.a.<br />
AX = # scanlines to scroll 11<br />
CH = # scanlines in window 11<br />
;compute address of scanline to be<br />
scrolled to top of window:<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
D6EC 53<br />
D6ED 51<br />
D6EE 52<br />
D6EF 8A DC<br />
D6F1 A1 0050 R<br />
D6F4 E8 D8E1 R<br />
06F7 8B FO<br />
06F9 8A C3<br />
D6FB B9 0004<br />
D6FE 33 DB<br />
0700 3C 40<br />
D702 72 08<br />
D704 B3 04<br />
0706 74 04<br />
0708 D1 F9<br />
D70A 33 DB<br />
070C<br />
070C C5 3E 0084 R<br />
0710 C5 79 06<br />
D713 1E<br />
D714 06<br />
0715 1F<br />
0716 07<br />
D717 D1 E3<br />
D719 83 C3 08<br />
071C 2B E3<br />
071E 8B EC<br />
0720 BA 0002<br />
D723 3C 06<br />
0725 7C 35<br />
D727 74 03<br />
D729 BA 0004<br />
D72C<br />
D72C 51<br />
D72D 56<br />
D72E 8B CA<br />
D730<br />
D730 8A 04<br />
D732 88 46 00<br />
D735 45<br />
D736 81 C6 2000<br />
073A E2 F4<br />
D73C 5E<br />
1-88<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
push<br />
push<br />
push<br />
mov<br />
mov<br />
call<br />
mov<br />
mov<br />
mov<br />
xor<br />
cmp<br />
jb<br />
mov<br />
je<br />
sar<br />
xor<br />
C g_lds_r:<br />
C lds<br />
c lds<br />
C push<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
push<br />
pop<br />
pop<br />
sal<br />
add<br />
sub<br />
mov<br />
mov<br />
cmp<br />
jl<br />
je<br />
bx<br />
ex<br />
dx<br />
save<br />
the<br />
bl,ah :BL saves v mode<br />
ax,word ptr ds:[v_curpos]<br />
g_curs_off<br />
si,ax<br />
al,bl<br />
cx,4<br />
bx,bx<br />
al.64<br />
g_lds_r<br />
bl,4<br />
g lds_r<br />
ex, 1<br />
bx,bx<br />
registers<br />
,get address of cursor position<br />
:save as a pointer for later<br />
:AL saves v mode<br />
;# scanlines per i.a. = 4 for modes -72<br />
:make BX=O for modes 4,5,6<br />
;jump if mode = 4,5,6<br />
:make BX=4 for mode 64<br />
;jump if mode = 64<br />
;# scanlines per i.a. = 2 for mode 72<br />
:make BX=O for mode 72<br />
:(BX= font pointer offset in master table)<br />
di,dword ptr ds:[master_tbl_ptr] ;get pointer to master table<br />
di,dword ptr ds:[di+6][bx] ;get pointer to font's 1st 128 chars<br />
ds ;XCHG OS,ES<br />
es<br />
ds<br />
es<br />
bx,1<br />
bx,8<br />
:OS:SI -> grafix ram read location ???<br />
;ES:DI -> font's 1st 128 characters<br />
:make BX=8 for modes 4,5,6,72<br />
BX=16 for mode 64<br />
:(BX= number of font bytes per character)<br />
sp,bx<br />
bp,sp<br />
dx,2<br />
al,6<br />
g_rd_med<br />
g_rdloop<br />
;get stack space for font bytes<br />
;save pointer to stack space<br />
;number of interlace areas (modes 4,5,6)<br />
;check graphics mode<br />
we're in super resolution (640x400) mode (64 & 72)<br />
C g_rdloop:<br />
C push<br />
C push<br />
C mov<br />
c<br />
C g_rd_ia:<br />
C mov<br />
C mov<br />
C inc<br />
c add<br />
c<br />
c<br />
c<br />
;jump if in medium resolution mode (4,5)<br />
;jump if in 640x200 resolution mode (6)<br />
mov dx,4 ;number of interlace areas<br />
loop<br />
pop<br />
ex<br />
si<br />
cx,dx<br />
al, [si]<br />
[bp] ,al<br />
bp<br />
si,2000H<br />
g_rd_ia<br />
si<br />
;Read Scanlines Loop for both 640x200 and 640x400<br />
:Read Interlace Area Loop<br />
;save # of scanlines per interlace area<br />
;save current addr. in interlace area #1<br />
:init. counter: # of interlace areas<br />
;get byte from grafix ram<br />
;save on reserved stack<br />
;bump reserved stack address<br />
;address next interlace area<br />
;restore interlace area #1 address<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong>
D73D 83 C6 50<br />
D740 59<br />
D741 E2 E9<br />
D743 83 FA 04<br />
D746 75 49<br />
D748 88 F5<br />
D74A 28 F3<br />
D74C 36: F6 04 80<br />
D750 74 3F<br />
D752 88 CB<br />
D754<br />
D754 36: F6 14<br />
D757 46<br />
D758 E2 FA<br />
D75A EB 35<br />
D75C<br />
D75C D1 E6<br />
D75E<br />
D75E 51<br />
D75F 56<br />
D760 89 0002<br />
D763<br />
D763 51<br />
D764 88 04<br />
D766 86 EO<br />
D768 F7 DO<br />
D76A 88 DO<br />
D76C D1 E2<br />
D76E 23 DO<br />
D770 F7 D2<br />
D772 32 co<br />
D774 89 0008<br />
D777<br />
D777 D1 EA<br />
D779 D1 EA<br />
D77B DO D8<br />
D77D E2 F8<br />
D77F 88 46 00<br />
D782 45<br />
D783 81 C6 2000<br />
D787 59<br />
D788 E2 D9<br />
D78A 5E<br />
D78B 83 C6 50<br />
D78E 59<br />
D78F E2 CD<br />
D791<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
add<br />
pop<br />
loop<br />
cmp<br />
jne<br />
mov<br />
sub<br />
test<br />
jz<br />
si,80<br />
ex<br />
g_rdloop<br />
dx,4<br />
g_matchb<br />
si.bp<br />
si,bx<br />
byte ptr ss:[si],80H<br />
g_matchb<br />
C mov ex. bx<br />
C g unreverse_video_loop:<br />
C not byte ptr ss: [si]<br />
C inc si<br />
C loop g_unreverse_video_loop<br />
C jmp short g_ matchb<br />
c<br />
C g_rd_med: ;Read Medium Resolution<br />
si,1<br />
c sal<br />
c<br />
c g medget:<br />
C push<br />
C push<br />
C mov<br />
c g_med_ia:<br />
C push<br />
C mov<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
xchg<br />
not<br />
mov<br />
shl<br />
and<br />
not<br />
xor<br />
mov<br />
C g_med_bit:<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
C g_matchb:<br />
shr<br />
shr<br />
rcr<br />
loop<br />
mov<br />
inc<br />
add<br />
pop<br />
loop<br />
pop<br />
add<br />
pop<br />
loop<br />
ex<br />
si<br />
cx.2<br />
ex<br />
ax. [si]<br />
ah.al<br />
ax<br />
dx.ax<br />
dx,1<br />
dx.ax<br />
dx<br />
al.al<br />
cx,8<br />
dx.1<br />
dx,1<br />
al,1<br />
g_med_bit<br />
[bp],al<br />
bp<br />
si.2000H<br />
ex<br />
g_med_ia<br />
si<br />
si,80<br />
ex<br />
g_medget<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
;address next scanline in each i.a.<br />
;restore # of scanlines counter<br />
;are we in mode 64 or 72 (640x400)?<br />
;jump if no (reverse video not allowed)<br />
;point to first byte in stack save area<br />
;is upper left bit of char = 0 or 1 ?<br />
;jump if 0 (not reversed video)<br />
;number of char bytes counter<br />
;reverse the reversed byte for matching<br />
;address next char byte<br />
;now find the char in the font table<br />
;double graf ram pointer (2 bytes/char)<br />
:Get font bytes in medium resolution (320 X 200) mode<br />
;save # scanlines per i.a. counter<br />
;save current scanline address<br />
;init. # interlace areas counter<br />
;save i.a. counter<br />
;get 2 bytes of 1 char from video memory<br />
;order them logically<br />
;map background pixels to 0.<br />
foreground pixels to 1<br />
;clear result accumulator<br />
;prepare to process 8 bits<br />
;ignore unused bit<br />
;load carry with mapped pixel value<br />
;rotate it into result accumulator<br />
;process next bit of character<br />
:save font byte on reserved stack<br />
:bump reserved stack pointer<br />
;address next interlace area<br />
:restore i.a. counter<br />
;process next i.a. of character<br />
:restore scanline address<br />
;address next scanline<br />
;restore scanlines counter<br />
;process next scanline of character<br />
:Match Font Byte: find character<br />
1-89
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
080C 32 02 c xor dl,dl ;substitute null character<br />
080E 2E: 8E 1E E538 R c mov ds,word ptr cs:[set ds word] :restore data segment register<br />
c jmp short g selfont ;and continue in 1st half of font table<br />
c<br />
c character (0 -> 127) is in 1st 1/2 of font table<br />
c<br />
0813 c g_ selfont:<br />
0813 53 c push bx ;preserve register<br />
c<br />
0814 33 DB c xor bx,bx ;make BX=O for modes 4,5,6<br />
0816 80 FE 40 c cmp dh,64<br />
0819 72 06 c jb g_lds_w ;jump if mode = 4,5,6<br />
081B B3 04 c mov bl,4 :make BX=4 for mode 64<br />
0810 74 02 c je g lds w ;jump if mode = 64<br />
081F 33 DB c xor bx,bx ;make BX=O for mode 72<br />
c<br />
0821 c g_lds_w: :(BX= font pointer offset in master table)<br />
0821 C5 36 0084 R c lds si,dword ptr ds:[master_tbl_ptr] ;get pointer to master table<br />
0825 C5 70 06 c lds si,dword ptr ds: [si+6][bx] ;get pointer to font's 1st 128 chars<br />
c<br />
0828 5B c pop bx ;restore register<br />
c<br />
0829 c g_detmode: ;determine graphics mode<br />
0829 51 c push ex<br />
D82A 33 co c xor ax,ax ;get ascii code in AX<br />
082C 8A C2 c mov al,dl<br />
082E B1 03 c mov cl,3 to multiply by<br />
0830 03 EO c sal ax,cl 8 (font bytes per character)<br />
0832 59 c pop ex<br />
0833 03 FO c add si,ax :and add to address of font table<br />
c<br />
0835 B2 04 c mov dl,4 ;# scanlines per i.a. (modes 4,5,6,64)<br />
c<br />
0837 80 FE 06 c cmp dh,6 ;Which resolution are we using?<br />
083A 7C 49 c jl g_med_wr ;jump if medium resolution (modes 4 & 5)<br />
D83C 74 OF c je g_hi_wr ;jump if 640x200 resolution (mode 6)<br />
c<br />
c ;we're in 640x400 resolution<br />
D83E 80 FE 48 c cmp dh,72 ;mode 72?<br />
0841 B6 04 c mov dh,4 ;# interlace areas = 4 for modes 64 & 72<br />
0843 75 04 c jne g_super_wr<br />
c<br />
0845 c g_tinytext: :640x400 resolution (mode 72)<br />
0845 B2 02 c mov dl,2 ;# scanlines per i.a. = 2 for mode 72<br />
0847 EB 09 c jmp short g_repchar<br />
c<br />
0849 c g_super_wr: :640x400 resolution (mode 64)<br />
0849 03 FO c add si,ax ;multiply ascii code by 16 bytes/char<br />
D84B EB 05 c jmp short g_repchar<br />
c<br />
0840 c g hi wr: :Hi-resolution Character Write<br />
0840 B6 02 c mov dh,2 :interlace areas count (even/odd)<br />
084F 80 CB 01 c or bl, 1 :mode 6 doesn't allow reverse video<br />
c<br />
0852 c g_repchar: :Repeat Character Loop<br />
1-92 <strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong>
0852 51<br />
0853 56<br />
0854 57<br />
0855 33 C9<br />
0857 8A CA<br />
0859<br />
0859 51<br />
D85A 57<br />
D8SB 8A CE<br />
0850<br />
0850 AC<br />
D8SE F6 C3 01<br />
0861 75 02<br />
0863 F6 DO<br />
0865<br />
0865 OA DB<br />
0867 79 03<br />
0869 26: 32 OS<br />
D86C<br />
D86C 26: 88 OS<br />
D86F 81 C7 2000<br />
0873 E2 E8<br />
0875 SF<br />
0876 83 C7 50<br />
0879 59<br />
D87A E2 DO<br />
087C SF<br />
0870 47<br />
D87E SE<br />
D87F 59<br />
0880 E2 DO<br />
0882 EB 55 90<br />
0885<br />
0885 01 E7<br />
0887 8A 03<br />
0889 81 E3 0003<br />
0880 2E: 8A 9F 0800 R<br />
0892 8A FB<br />
0894 8B EB<br />
0896<br />
0896 51<br />
0897 56<br />
0898 57<br />
0899 B9 0004<br />
D89C<br />
D89C 51<br />
0890 57<br />
089E B9 0002<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
C g_linelp:<br />
c<br />
c<br />
c<br />
c<br />
C g_i_a_lp:<br />
push<br />
push<br />
push<br />
xor<br />
mov<br />
push<br />
push<br />
mov<br />
c lodsb<br />
c<br />
c<br />
test<br />
jnz<br />
C not<br />
C g t xor:<br />
c or<br />
C jns<br />
C xor<br />
C g_w_byte:<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
mov<br />
add<br />
loop<br />
pop<br />
add<br />
pop<br />
loop<br />
pop<br />
inc<br />
pop<br />
pop<br />
loop<br />
jmp<br />
C g_med_wr:<br />
C sal<br />
C mov<br />
C and<br />
c<br />
c<br />
c<br />
c<br />
mov<br />
mov<br />
mov<br />
C g_char_lp:<br />
c<br />
c<br />
c<br />
c<br />
c<br />
push<br />
push<br />
push<br />
mov<br />
C g_scan_lp:<br />
c<br />
c<br />
c<br />
push<br />
push<br />
mov<br />
ex<br />
si<br />
di<br />
CX,CX<br />
cl,dl<br />
ex<br />
di<br />
cl,dh<br />
bl, 1<br />
g_t_xor<br />
al<br />
bl,bl<br />
g_w_byte<br />
al, es: [ di]<br />
es: [ di], al<br />
di,2000H<br />
g_i_a_lp<br />
di<br />
di,80<br />
ex<br />
g_linelp<br />
di<br />
di<br />
si<br />
ex<br />
g_repchar<br />
g return<br />
di,1<br />
dl,bl<br />
bx,0003H<br />
:Scanline Loop<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
:save character repeat count<br />
:save source address (font table)<br />
;save destination addr. (grafix ram)<br />
;prepare loop counter<br />
:scanlines per interlace area counter<br />
;save scanlines per i.a. counter<br />
:save interlace area #1 address<br />
:init. interlace areas counter (2 or 4)<br />
;Interlace Area Loop<br />
;get byte from font table<br />
:reverse video?<br />
:jump if no<br />
:reverse video<br />
:Test For XOR<br />
:Write Byte<br />
:XOR the char. with grafix ram?<br />
;jump if no<br />
:XOR with grafix ram<br />
:write byte in grafix ram<br />
:address next interlace area<br />
:restore interlace area #1 address<br />
:address next scanline in each i.a.<br />
:restore scanlines per i.a. counter<br />
:restore char's grafix ram address<br />
;address next character in grafix ram<br />
:restore char's font table address<br />
:restore character repeat count<br />
:repeat the character<br />
:exit<br />
:Medium Resolution Character Write<br />
:double graf ram pointer (2 bytes/char)<br />
:DL saves XOR bit input param (bit 7)<br />
:BX; foreground color (& table offset)<br />
bl,cs:g_color_table[bx] ;propagate color through byte<br />
bh,bl ;propagate color through word<br />
bp,bx<br />
ex<br />
si<br />
di<br />
cx,4<br />
ex<br />
di<br />
cx,2<br />
:BP saves word of color masks<br />
:Repeat Character Loop<br />
:Scanline Loop<br />
;save character repeat counter<br />
;save source address (font table)<br />
;save destination addr. (grafix ram)<br />
:init. scanlines per i.a. counter<br />
;save scanlines per i.a. counter<br />
:save interlace area #1 address<br />
:init. interlace areas counter<br />
1-93
D8E1<br />
D8E1 51<br />
D8E2 8A E8<br />
D8E4 8A C4<br />
D8E6 B1 01<br />
D8E8 80 3E 0049 R 48<br />
D8ED 74 02<br />
D8EF FE C1<br />
D8F1<br />
D8F1 02 EO<br />
D8F3 32 C9<br />
D8F5 86 E9<br />
D8F7 F6 26 004A R<br />
D8FB 03 C1<br />
D8FD 59<br />
D8FE C3<br />
D8FF<br />
D8FF<br />
D8FF<br />
= 0000<br />
D8FF<br />
D8FF 90<br />
0900 DB48 R<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
C page<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
c ·===============================================================================<br />
c<br />
C Get offset into graphics ram refresh memory which corresponds to<br />
C the current cursor position (or any arbitrary character position).<br />
c<br />
C Input: AX = current cursor position (AL = Column #, AH = Row #)<br />
c<br />
C Output: AX = offset into graphics ram<br />
c<br />
c ·-------------------------------------------------------------------------------<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
g_curs off<br />
g_72:<br />
push<br />
mov<br />
mov<br />
mov<br />
cmp<br />
je<br />
inc<br />
shl<br />
xor<br />
xchg<br />
mul<br />
add<br />
pop<br />
ret<br />
proc near<br />
ex<br />
ch,al<br />
al,ah<br />
cl,1<br />
byte ptr ds:[v_mode],72<br />
g 72<br />
cl<br />
al,cl<br />
cl,cl<br />
ch,cl<br />
byte ptr ds:[v_width]<br />
ax,cx<br />
ex<br />
C g_curs_off endp<br />
c<br />
C code ends<br />
;save work register<br />
:hold column number<br />
;row number to al<br />
;mode 72 shift count (multiply * 2)<br />
;jump if mode 72<br />
;mode -72 shift count (multiply * 4)<br />
;multiply row # by rows per byte<br />
:zero out the shift count<br />
;move column number for add<br />
:multiply by bytes per columnn<br />
;compute offset into refresh ram<br />
;restore register<br />
;and return to caller<br />
.LIST : start list 2<br />
C include pwrup1.asm<br />
c<br />
c ·======================================================================<br />
c Filename: pwrup1.src<br />
c<br />
C This module includes CPU, <strong>ROM</strong>, 8254 p dma p timer, & 8237 p dma<br />
C Controller tests.<br />
c<br />
c ·======================================================================<br />
c<br />
C code segment public '<strong>ROM</strong>'<br />
C assume cs:code, ds:nothing, es:nothing, ss:nothing<br />
c<br />
C PARITY = 0<br />
c<br />
C p1 data1<br />
c<br />
C even<br />
c<br />
C stack rom<br />
proc<br />
dw<br />
near<br />
; ; CONDITIONAL ASSEMBLY<br />
word-align stack rom<br />
i rom return from i cpu<br />
1-95
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
D902 DB4E R c dw i rom ret1 return from rom checksum<br />
D904 DB56 R c dw i rom ret2<br />
D906 DB5E R c dw i rom ret3<br />
-<br />
D908 DB6D R c dw i dmat return from i rom<br />
-<br />
D90A DB79 R c dw i dmat ret return from rtc chk<br />
D90C DB88 R c dw i dmac return from i dmat<br />
D90E DBFA R c dw i dmac ret return from memtst<br />
D910 DC1B R c dw i pic return from i dmac<br />
c<br />
D912 52 65 73 69 64 65 c banner m db 'Resident Diagnostics' ,CR,LF<br />
6E 74 20 44 69 61 c<br />
67 6E 6F 73 74 69 c<br />
63 73 OD OA c<br />
0928 56 65 72 73 20 32 c db 'Vers 2.02' ,CR,LF,LF<br />
2E 30 32 OD OA OA c<br />
D934 00 c db NUL<br />
c<br />
D935 OD OA 50 72 69 6D c bt m db CR,LF, 'Primary Boot-Strap . . . ' , CR , LF, NUL<br />
61 72 79 20 42 6F c<br />
6F 74 2D 53 74 72 c<br />
61 70 2E 2E 2E OD c<br />
OA 00 c<br />
D94F 50 72 69 6D 61 72 c bt merr db 'Primary Boot-Strap DISK READ ERROR.' ,CR,NUL<br />
-<br />
79 20 42 6F 6F 74 c<br />
2D 53 74 72 61 70 c<br />
20 44 49 53 4B 20 c<br />
52 45 41 44 20 45 c<br />
52 52 4F 52 2E OD c<br />
00 c<br />
c : This line must have same number of blanks as the preceding has characters:<br />
D974 20 20 20 20 20 20 c bt spaces db ', CR, NUL<br />
20 20 20 20 20 20 c<br />
20 20 20 20 20 20 c<br />
20 20 20 20 20 20 c<br />
20 20 20 20 20 20 c<br />
20 20 20 20 20 OD c<br />
00 c<br />
c<br />
D999 2A 20 49 6C 6C 65 c ill m1 db '* Illegal Interrupt No. ',NUL<br />
67 61 6C 20 49 6E c<br />
74 65 72 72 75 70 c<br />
74 20 4E 6F 2E 20 c<br />
00 c<br />
D9B2 68 20 61 74 20 00 c ill m2 db 'h at ',NUL<br />
D9B8 20 2A 00 c ill m3 db ' *',NUL<br />
c<br />
D9BB 20 20 50 61 73 73 c pass_m db Pass' , CR, LF, NUL<br />
00 OA 00 c<br />
09C4 20 50 61 73 73 00 c spass m db Pass' ,CR,LF,NUL<br />
OA 00 c<br />
D9CC 20 20 46 61 69 6C c fail m db Fail', NUL<br />
00 c<br />
c<br />
0903 43 50 55 20 28 69 c i cpu m db 'CPU (i286) ',NUL : Pass/Fail<br />
32 38 36 29 20 20 c<br />
1-96 <strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong>
00 c<br />
09EO 52 4F 40 20 40 6F c i rom m db '<strong>ROM</strong> Module ',NUL ; Pass/Fail<br />
64 75 6C 65 20 20 c<br />
00 c<br />
09ED 44 40 41 20 54 69 c i dmat m db 'OMA Timer ',NUL Pass/Fail<br />
60 65 72 20 20 20 c<br />
00 c<br />
09FA 44 40 41 20 43 6F c i dmac m db 'OMA Control ',NUL Pass/Fail<br />
6E 74 72 6F 6C 20 c<br />
00 c<br />
OA07 49 6E 74 65 72 72 c i pic m db 'Interrupts ',NUL Pass/Fail/Fail:Hx<br />
75 70 74 73 20 20 c<br />
00 c<br />
OA14 56 69 64 65 6F 20 c i d m db 'Video Board ',NUL Pass/Fail<br />
42 6F 61 72 64 20 c<br />
00 c<br />
OA21 4E 50 55 20 28 69 c i npu_m db 'NPU (i287) . , NUL Pass/Fail<br />
32 38 37 29 20 20 c<br />
00 c<br />
OA2E 43 61 6C 65 6E 64 c i calr m db 'Calendar Clk' ,NUL Fail only%<br />
61 72 20 43 6C 6B c<br />
00 c<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
OA3B 52 54 20 43 6C 6F c i rtc m db 'RT Clock ',NUL Pass/Fail/Fail:LO,HI,NR<br />
63 6B 20 20 20 20 c<br />
00 c<br />
DA48 3A 4C 4F 00 c i rtc lo m db ': LO', NUL Error #1 (must remain in<br />
OA4C 3A 48 49 00 c i rtc hi m db ' :HI', NUL Error #2 order for addr.<br />
OA50 3A 4E 52 00 c i rtc nr m db ': NR', NUL Error #3 calculation!)<br />
DA54 4B 65 79 62 6F 61 c i kb m db 'Keyboard ',NUL Pass/Fail/Fail:ST<br />
72 64 20 20 20 20 c<br />
00 c<br />
DA61 3A 53 54 00 c i kb st m db ': ST', NUL<br />
DA65 50 72 69 6E 74 65 c i prt m db 'Printer Port' ,NUL : Pass/Fail: xx<br />
72 20 50 6F 72 74 c<br />
00 c<br />
DA72 53 65 72 69 61 6C c i com m db 'Serial Comm.' ,NUL ; Pass/Fail:xx<br />
20 43 6F 60 60 2E c<br />
00 c<br />
OA7F 20 6B 62 20 52 41 c i RAM m db ' kb RAM ',NUL Pass/Fail:cc:yOOO:zzzz:wwww:rrrr<br />
40 20 20 00 c<br />
DA89 4F 70 74 69 6F 6E c i opt<strong>ROM</strong> m db 'Optional <strong>ROM</strong>' ,NUL ; Pass/Fail:XXXX<br />
61 6C 20 52 4F 40 c<br />
00 c<br />
- -<br />
DA96 46 6C 6F 70 70 79 c i fduA m db 'Floppy (A:) ',NUL Ready/Not Ready/Fail:xx<br />
20 28 41 3A 29 20 c<br />
00 c<br />
DAA3 46 6C 6F 70 70 79 c i fduB m db 'Floppy (B:) ',NUL<br />
20 28 42 3A 29 20 c<br />
00 c<br />
- -<br />
DABO 20 4E 6F 74 c i fdu not m db Not' : purposely no NULl r r r r<br />
- - -<br />
DAB4 20 52 65 61 64 79 c i fdu rdy_m db Ready' ,CR,LF,NUL<br />
00 OA 00 c<br />
DABD 46 69 78 65 64 20 c i hdu m db 'Fixed Disk ',NUL Pass/Fail:xx<br />
44 69 73 6B 20 20 c<br />
00 c<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong> 1-97
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
DACA OF<br />
DACB 07<br />
DACC OF<br />
DACD 03<br />
DACE OF<br />
DACF 03<br />
DADO 07<br />
DAD1 OF<br />
DAD2 01<br />
OA03<br />
OA03<br />
DA03 BA 3FAO<br />
DA06 EC<br />
OAD7 A8 20<br />
OA09 74 09<br />
DADB 2E: 8E 1E E538 R<br />
DAEO FF 2E OOA2 R<br />
DAE4<br />
DAE4 FA<br />
DAES BO 40<br />
DAE7 BA 0378<br />
DAEA EE<br />
OAEB FC<br />
OAEC BA 3F40<br />
DAEF BO 03<br />
DAF1 EE<br />
DAF2 FE C2<br />
DAF4 EE<br />
OAFS FE C2<br />
DAF7 EE<br />
1-98<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
C i cal val<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
C p1 data1<br />
c<br />
db<br />
db<br />
db<br />
db<br />
db<br />
db<br />
db<br />
db<br />
db<br />
db<br />
db<br />
db<br />
db<br />
db<br />
db<br />
db<br />
db<br />
db<br />
endp<br />
'Disk Diagnostics xxxxx'<br />
'Loop Diagnostics xxxxx'<br />
'Primary BootStrap Floppy (A:) Not Ready<br />
'Insert system disk and type any key.'<br />
'Primary BootStrap Floppy (A:) Fail: XX'<br />
'Primary BootStrap Floppy (B:) Fail: XX'<br />
'Primary BootStrap Fixed Disk Fail: XX'<br />
'Select Operating System?<br />
'Serial BootStrap'<br />
OFh port 074h = units of minutes (0-9)<br />
07h port 075h = tens of minutes (0-5)<br />
OFh port 076h = units of hours (0-9)<br />
03h port 077h = tens of hours (0-2)<br />
OFh port 078h = units of days (0-9)<br />
03h port 079h = tens of days (0-3)<br />
07h port 07Ah = day of week (0-7)<br />
OFh port 07Bh = tens of months (0-9)<br />
01h port 07Ch = units of months (0-1)<br />
c ·======================================================================<br />
c<br />
c<br />
DO NOT change any code between here and the first 11 out" statement unless<br />
you know what you are doing ... which is doubtful. You could break<br />
C merge.<br />
c<br />
C diagnostics_1 proc near<br />
C assume cs:code, ds:nothing, es:nothing, ss:nothing<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
mov<br />
in<br />
test<br />
jz<br />
mov<br />
jmp<br />
i pwrup:<br />
eli<br />
mov<br />
mov<br />
out<br />
cld<br />
mov<br />
mov<br />
out<br />
inc<br />
out<br />
inc<br />
out<br />
dx,bitread mise status latch%<br />
al,dx decide why resetting%<br />
al,pwrupl is it a powerup-up?%<br />
i pwrup yes, do diagnostics%<br />
ds,word ptr cs:[set_ds_word] get resumption offset%<br />
dword ptr ds:[osmerge1] go to UNIX%<br />
disable interrupts<br />
al,40h Check Point #0<br />
dx,378h parallel port data port address<br />
dx,al output 11 Running- Checkpoint 0 11<br />
clear string direction flag<br />
dx,3f40h CTC timer port,access to clr intr%<br />
al, 3 value to stop timers%<br />
dx,al stop CTC timer and clear intr%<br />
dl do port 3f41%<br />
dx,al stop timer%<br />
dl do port 3f42%<br />
dx,al stop timer%<br />
c .--------------------------------------------------------------------------c<br />
80286 CPU Test<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong>
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
DB34<br />
DB34 8C C8<br />
DB36 8E 08<br />
DB38 8E DO<br />
DB3A BC 0900 R<br />
DB3D BO 41<br />
DB3F BA 0378<br />
DB42 EE<br />
DB43 BO 00<br />
DB45 E6 61<br />
DB47 C3<br />
DB48<br />
DB48 BE EOOO<br />
DB4B E9 E52A R<br />
DB4E<br />
DB4E 75 10<br />
DB 50 BE COOO<br />
DB 53 E9 E52A R<br />
DB 56<br />
DB56 75 08<br />
DB58 BE AOOO<br />
DB5B E9 E52A R<br />
DB5E<br />
DB5E 74 06<br />
DB60<br />
DB60 BE D9EO R<br />
DB63 E9 F720 R<br />
DB66<br />
DB66 BO 42<br />
DB68 BA 0378<br />
DB6B EE<br />
DB6C C3<br />
1-100<br />
C i cpu ok:<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
mov<br />
mov<br />
mov<br />
mov<br />
mov<br />
mov<br />
out<br />
C Reset the keyboard<br />
c<br />
c<br />
c<br />
c<br />
c<br />
mov<br />
out<br />
ret<br />
ax,cs satisfy assumptions<br />
ds,ax<br />
ss,ax use <strong>ROM</strong> 'stack'<br />
sp,cs:(offset stack rom)<br />
al,41h Check Point #1<br />
dx,378h parallel port data port address<br />
dx, al output " Running- Checkpoint 1"<br />
al,O<br />
p kctrl,al<br />
: will 'ret' to i rom<br />
c ·-------------------------------------------------------------------------c<br />
<strong>ROM</strong> Module Test<br />
c .-------------------------------------------------------------------------c<br />
c<br />
c<br />
c i rom:<br />
c<br />
assume cs:code, ds:code, es:absO, ss:code<br />
C Calculate Checksum of <strong>ROM</strong>.<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
mov<br />
jmp<br />
i rom ret1:<br />
jnz<br />
mov<br />
jmp<br />
i rom ret2:<br />
jnz<br />
mov<br />
jmp<br />
i rom ret3:<br />
jz<br />
C i rom err:<br />
C mov<br />
jmp<br />
c<br />
c<br />
c<br />
C i rom ok:<br />
c<br />
c<br />
c<br />
c<br />
c<br />
mov<br />
mov<br />
out<br />
ret<br />
si,OEOOOh<br />
rom checksum<br />
i rom err<br />
si,OCOOOh<br />
rom checksum<br />
i rom err<br />
si,OAOOOh<br />
rom checksum<br />
i rom ok<br />
si,cs:(offset i_rom_m)<br />
i fatal<br />
al,42h<br />
dx,378h<br />
dx,al<br />
<strong>ROM</strong> starts at ds:si = FOOO:EOOO<br />
·call' rom checksum<br />
will 'ret' here<br />
<strong>ROM</strong> starts at ds:si = FOOO:COOO<br />
·call' rom checksum<br />
<strong>ROM</strong> starts at ds:si = FOOO:AOOO<br />
·call' rom checksum<br />
will ·ret· here<br />
ah has illegal checksum<br />
i fatal will ·ret' to i dmat<br />
Check Point #2<br />
parallel port data port address<br />
output " Running- Checkpoint 2"<br />
will ·ret' to i dmat<br />
c .--------------------------------------------------------------------------c<br />
8254 p dma p timer Test<br />
c .--------------------------------------------------------------------------c<br />
c assume cs:code, ds:code, es:absO, ss:code<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong>
DB6D<br />
DB6D BO 04<br />
DB6F E6 08<br />
DB71 BO 74<br />
DB73 BA 0041<br />
DB76 E9 E1CO R<br />
DB79<br />
DB79 74 06<br />
DB7B<br />
DB7B BE D9ED R<br />
DB7E E9 F720 R<br />
DB81<br />
DB81 BO 43<br />
DB83 BA 0378<br />
DB86 EE<br />
DB87 C3<br />
DB88<br />
DB88 E6 00<br />
DB8A B4 01<br />
DB8C E4 00<br />
DB8E OA CO<br />
DB90 75 75<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
c<br />
C i dmat:<br />
c<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
C Disable 8237A p_dma Controller before the testing of the 8254 p_dma p timer channel.<br />
c<br />
c<br />
c<br />
c<br />
mov<br />
out<br />
al,dma cmd disable<br />
dma command,al<br />
disable p dma controller command<br />
C Proceed with the testing of the 8254 p dma p_timer channel ()P 8253 1.<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
mov<br />
mov<br />
jmp<br />
i dmat ret:<br />
jz<br />
C i dmat err:<br />
c<br />
c<br />
c<br />
c<br />
mov<br />
jmp<br />
C i dmat ok:<br />
c<br />
c<br />
c<br />
c<br />
c<br />
mov<br />
mov<br />
out<br />
ret<br />
al,074h 01 11 010 0 -> p 8253 1, lsb 1st, mode 2,<br />
dx,p_8253 1 select p dma refresh counter<br />
rtc chk 'call' rtc chk<br />
will 'ret' here<br />
i dmat ok<br />
si,cs:(offset i_dmat_m)<br />
i fatal ah has error code to report.<br />
i fatal will ·ret' to i dmac<br />
al,43h<br />
dx,378h<br />
dx,al<br />
Check Point #3<br />
parallel port data port address<br />
output " Running- Checkpoint 3"<br />
will 'ret' to i dmac<br />
c .---------------------------------------------------------------------------<br />
C 8237 p_dma Controller Test-- Test Chip's Operation & Channel Registers<br />
c<br />
C The 8237A p_dma Controller was disabled before the testing of the<br />
C 8254 p dma p timer channel.<br />
c .-------------------------------------------------------------------------c<br />
c<br />
c<br />
C i dmac:<br />
c<br />
assume cs:code, ds,code, es:absO, ss:code<br />
C Send a 'master clear' to 8237 p dma Controller.<br />
c<br />
c<br />
c<br />
out dma master clr,al : send master clear to port<br />
- -<br />
C The dma_command, dma_status, dma request, dma temp, and dma ff registers<br />
C are cleared, and the dma_mask register is set (all off).<br />
C Test readable control registers: dma status & dma temp)<br />
c<br />
c mov<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
in<br />
or<br />
jnz<br />
ah, 1<br />
al,dma temp<br />
al,al<br />
i dmac err<br />
: TEMP Error #1<br />
al = Q?<br />
if not, abort<br />
Test all 8 16-bit readable/writeable channel registers (address and count<br />
registers for all 4 channels, i.e., ports 0 through 7) with register bit test:<br />
no BCD<br />
1-101
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
0892 BB FFFF<br />
0895<br />
0895 BA 0007<br />
0898<br />
0898 88 C3<br />
DB9A EE<br />
DB9B 90<br />
DB9C EE<br />
0890 90<br />
DB9E EC<br />
DB9F 8A EO<br />
DBA1 EC<br />
DBA2 38 C3<br />
DBA4 84 02<br />
DBA6 75 SF<br />
DBA8 4A<br />
DBA9 79 ED<br />
DBAB 43<br />
DBAC 74 E7<br />
DBAE BO FF<br />
DBBO E6 01<br />
DBB2 90<br />
DBB3 E6 01<br />
DBBS BO 58<br />
DBB7 E6 DB<br />
DBB9 BO 00<br />
DBBB E6 08<br />
1-102<br />
C (dma addr_x & dma count_x are tested with OFFFFh and then Oh for x = 0 to 3.)<br />
c<br />
c mov<br />
c<br />
C i dmac pass2:<br />
c<br />
c<br />
c<br />
c<br />
mov<br />
C i dmac lp:<br />
C mov<br />
C out<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
nap<br />
out<br />
nap<br />
in<br />
mov<br />
in<br />
cmp<br />
mov<br />
jnz<br />
dec<br />
jns<br />
inc<br />
jz<br />
bx,OFFFFh<br />
dx ,7<br />
ax,bx<br />
dx,al<br />
dx,al<br />
al,dx<br />
ah,al<br />
al,dx<br />
ax,bx<br />
ah,2<br />
i dmac err<br />
dx<br />
i dmac lp<br />
bx<br />
i dmac pass2<br />
bx = 0 all bits reset<br />
outer loop<br />
if 1st pass, bx = OFFFFh<br />
if 2nd pass, bx = Oh<br />
loop counter and port address I 11<br />
inner loop<br />
get bit test pattern<br />
write low byte of address/count<br />
no successive in's or outs to dma chip<br />
write high byte of address/count<br />
read low byte of address/count<br />
save low byte in ah<br />
read high byte of address/count<br />
does what's been read = test pattern?<br />
TEMP Error #2<br />
if not, abort<br />
did we decrement past port address Q?<br />
if not, continue same pass for all 8.<br />
1st pass? if so, bx = OFFFFh & loop<br />
2nd pass? if so, bx = 0 & continue<br />
C We are done testing all 8 16-bit readable/writeable channel registers (address<br />
C and count registers for all 4 channels) with the following results: All the<br />
C address registers (dma addr x) and count registers (dma count x) have been<br />
C initialized to zero.<br />
c<br />
C Load 64k (OFFFFh+1) count for RAM refresh p dma controller channel.<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
mov<br />
out<br />
nap<br />
out<br />
al,OFFh<br />
dma count O,al<br />
dma count O,al<br />
low byte of count for 64k RAM refresh<br />
chip needs time%<br />
high byte of count for 64k RAM refresh<br />
C Load mode for RAM refresh p dma controller channel: channel 0, read, auto-<br />
C initialize, increment, single mode.<br />
c<br />
c<br />
c<br />
c<br />
mov<br />
out<br />
al,dma mode 0<br />
dma mode,al<br />
mode for RAM refresh<br />
C Enable p dma controller: memory-to-I/O, controller enable. normal. fixed<br />
C priority, late write, and DREQ/-DACK.<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
mov<br />
out<br />
al,dma cmd enable<br />
dma command.al<br />
enable p dma controller<br />
The master clear command above has masked off all channels. Now, we 'unmask'<br />
the RAM refresh dma mask bit. p_dma RAM refresh begins for the first timet<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong>
0880 80 00<br />
OB8F E6 OA<br />
OBC1 80 74<br />
OBC3 E6 43<br />
OBCS BS 0013<br />
OBCS E6 41<br />
OBCA SA C4<br />
OBCC E6 41<br />
OBCE 84 03<br />
0800 E4 OS<br />
0802 AS 10<br />
0804 75 31<br />
0806 8A 0008<br />
0809 80 41<br />
0808 EE<br />
OBOC 80 56<br />
OBOE EE<br />
OBOF 80 43<br />
OBE1 EE<br />
OBE2 32 CO<br />
OBE4 8A OOS3<br />
OBE7<br />
OBE7 EE<br />
OBES FE CA<br />
OBEA 7S F8<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
c<br />
c<br />
c<br />
c<br />
mov<br />
out<br />
al,dma unmask 0 turn on RAM refresh channel 0<br />
dma mask bit,al<br />
c Program p S253 1 of iS254 p timer to proper value for RAM refresh.<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
mov<br />
out<br />
mov<br />
out<br />
mov<br />
out<br />
al,t1cmd<br />
p S253 ctrl,al<br />
ax,t1count<br />
p S253 1,al<br />
al,ah<br />
p S253 1,al<br />
select p dma refresh counter<br />
load p dma refresh count<br />
C Check dma status for 'hot' p dma request from p S253 1.<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
mov ah,3 TEMP Error #3<br />
in al,dma status test for RAM refresh request in status<br />
test al,010h bit #4 -> channel 0 request<br />
jnz i dmac err if 'hot' p dma request is there, abort<br />
C Initialize other p dma counters and modes.<br />
c<br />
c mov dx,dma mode<br />
c<br />
C Initialize p dma channel 1 not used.<br />
c<br />
c<br />
c<br />
c<br />
mov<br />
out<br />
al,dma mode 1<br />
dx,al<br />
C Initialize p dma channel 2 FOU.<br />
c<br />
c<br />
c<br />
c<br />
mov<br />
out<br />
al,dma mode 2<br />
dx,al<br />
C Initialize p_dma channel 3 display.<br />
c<br />
c<br />
c<br />
c<br />
mov<br />
out<br />
al,dma mode 3<br />
dx,al<br />
mode for not used<br />
: mode for FOU<br />
: mode for display<br />
C Initialize p_dma Segment Nibble Latches to zero.<br />
c (dma segm_x for x = 0 to 3 is port addresses SOh to S3h).<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
i dmac nib:<br />
xor al,al al = 0<br />
mov dx,OS3h loop counter and port address!<br />
out dx,al<br />
dx = dma segm 3 = OS3h<br />
dec dl when dl goes from SOh (-12S) to<br />
js i dmac nib 07Fh (+127) we will exit<br />
c .--------------------------------------------------------------------------c<br />
S237 p dma Controller Test -- Test Lowest 64k bank of RAM<br />
c .--------------------------------------------------------------------------c<br />
1-103
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
DBEC 2E: 8E 1E E538 R<br />
DBF1 8B 36 0072 R<br />
DBFS 33 D2<br />
DBF7 E9 E22F R<br />
DBFA<br />
DBFA 2E: 8E 1E E538 R<br />
DBFF 89 36 0072 R<br />
DC03 B4 04<br />
DCOS 74 OD<br />
DC07<br />
DC07 BE D9FA R<br />
DCOA OB C9<br />
DCOC 75 03<br />
DCOE BE ESFB R<br />
DC11<br />
DC11 E9 F720 R<br />
DC14<br />
DC14 BO 44<br />
DC16 BA 0378<br />
DC19 EE<br />
DC1A C3<br />
DC1B<br />
DC1B B8 0030<br />
DC1E 8E DO<br />
DC20 BC 0100<br />
DC23 E8 E1A6 R<br />
DC26 33 F6<br />
DC28 8B FE<br />
DC2A B9 01FE<br />
DC2D B8 DC8C R<br />
1-104<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
mov<br />
mov<br />
xor<br />
C jmp<br />
C i dmac ret:<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
mov<br />
mov<br />
mov<br />
jz<br />
C i dmac err:<br />
c<br />
c<br />
c<br />
c<br />
C i d e:<br />
c<br />
c<br />
c<br />
mov<br />
or<br />
jnz<br />
mov<br />
jmp<br />
C i dmac ok:<br />
C mov<br />
C mov<br />
c<br />
c<br />
c<br />
out<br />
ret<br />
assume cs:code, ds:data, es:absO. ss:code<br />
ds,word ptr cs:[set_ds_word]<br />
si,word ptr ds:[reset_flag]<br />
dx,dx<br />
memtst<br />
ds,word ptr cs:[set_ds_word]<br />
word ptr ds:[reset flag],si<br />
ah,4 ; TEMP Error #4<br />
i dmac ok<br />
satisfy assumptions<br />
save reset flag<br />
dx = 0; test 0000:0 to OOOO:FFFF<br />
'call' memtst<br />
will 'ret' here<br />
satisfy assumptions<br />
restore reset_flag<br />
si,cs:(offset i dmac m)<br />
cx,cx , , if zero then it was a parity error.<br />
i d e ,<br />
si,cs:(offset parity1_m);;<br />
i fatal<br />
al,44h<br />
dx,378h<br />
dx,al<br />
ah has error code to report.<br />
i fatal will 'ret' to i pic<br />
Check Point #4<br />
parallel port data port address<br />
output " Running- Checkpoint 4"<br />
will 'ret' to pic<br />
c ·---------------------------------------------------------------------------<br />
C 8259A Programmable Interrupt Controller Test.<br />
c ·---------------------------------------------------------------------------<br />
c<br />
c<br />
c<br />
C i pic:<br />
c<br />
c<br />
c<br />
c<br />
mov<br />
mov<br />
mov<br />
assume cs:code, ds:data, es:absO, ss:stack ram<br />
ax,stack_seg<br />
ss,ax<br />
sp,100h<br />
;Initialize RAM Stack<br />
; on lower tested memory<br />
C Initialize & Disable 8259A Programmable Interrupt Controller.<br />
c<br />
c call i pic init<br />
c<br />
C Install Interrupt Vectors for diagnostics.<br />
c<br />
C Install unexpected diagnostic interrupt vectors.<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
xor<br />
mov<br />
mov<br />
mov<br />
si,si<br />
di,si<br />
cx,(0400h-0004h)/2<br />
ax,cs:(offset i pic err)<br />
es:si = absO seg:intOOlocn<br />
es:di = absO_seg:intOOlocn<br />
words from 0:0004h to 0:0400h<br />
store offset i pic err<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong>
DC30 AB<br />
DC31 8C C8<br />
DC33 AB<br />
D.C34 F3/ 26: AS<br />
DC37 B8 DC.59 R<br />
DC3A 33 FF<br />
DC3C B1 05<br />
DC3E<br />
DC3E AB<br />
DC3F 47<br />
DC40 47<br />
DC41 05 0004<br />
D.C44 E2 F8<br />
DC46 B8 FF.23 R<br />
DC49 BF 0020 R<br />
DC4C B1 08<br />
DC4E<br />
DC4E AB<br />
D.C4F 47<br />
DC 50 47<br />
DC54 E2 FB<br />
DC 53 B7 09<br />
DC 55 F6 F5<br />
DC 57 EB 33<br />
DC 59<br />
DC 59 53<br />
DCSA 90<br />
DCSB EB 2F<br />
Dc5D<br />
DC5D CD 02<br />
DCSF EB 2B<br />
DC61<br />
DC61 cc<br />
DC62 90<br />
DC63 EB 27<br />
DC65<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
stosw<br />
mov ax.cs : store segment address<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
stosw : es:di = absO_seg:intOOlocn + 4<br />
rep movs word ptr E?S: 0004h, word ptr es: OOOOh : replicate vector<br />
C Install software diagnostic interrupt vectors.<br />
c<br />
c<br />
c<br />
c<br />
c<br />
mov<br />
xor<br />
mov<br />
C i pic soft:<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
stosw<br />
ax,cs:(offset i_pic 0 ok)<br />
di,di<br />
c1,5<br />
inc di<br />
inc<br />
add<br />
loop<br />
.di<br />
ax.4<br />
i pic soft<br />
C Install hardware diagnostic interrupt vectors.<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
mov<br />
mov<br />
mov<br />
i_pic_hard:<br />
stosw<br />
inc<br />
inc<br />
loop<br />
ax,cs:(offset ill_int)<br />
di,es:(offset int08locn)<br />
cl,8<br />
di<br />
di<br />
i _pic _hard<br />
C Test software interrupts first (cl = 0 if error).<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
mov<br />
div<br />
jmp<br />
i_pic_O_ok:<br />
push<br />
popf<br />
jmp<br />
i pic 1 Ok:<br />
INT<br />
jmp<br />
i pic_2_ok:<br />
-<br />
INT<br />
nap<br />
jmp<br />
i pic_3_ok:<br />
-<br />
bh,09h<br />
ch<br />
short i pic err<br />
bx<br />
short i pic err<br />
02h<br />
short i_pic err<br />
03h<br />
short i pic err<br />
ax = offset i pic 0 ok<br />
es:di = absO_seg:intOOlocn<br />
load INT's Oh through 4h.<br />
ax = ( 4*x)+(i _pic_ 0 _ ok)<br />
es:di gets offset i_pic x ok<br />
skip segment (already = cs)<br />
i pic x ok are 4 bytes apart<br />
until ex = 0.<br />
ax = offset ill int<br />
es:di = absD_seg:int08locn<br />
load INT's 8h through Fh.<br />
es:di gets offset ill_int<br />
skip segment (already = cs)<br />
; until ex = 0.<br />
bx has its 8th and 11th bits set.<br />
ex = 0 from loop above.<br />
generate a divide-by-zero INT DOh<br />
bh = 09h. set trap & OF flags in bx<br />
(bits 8 and 11 of flags).<br />
put trap flags on sta.ck<br />
generate a single-step trap INT 01h<br />
must be 4 bytes longl<br />
generate a software interrupt INT 02h<br />
must be 4 bytes longl<br />
generate a 1-byte break-point INT 03h<br />
must be 4 bytes longl<br />
: OF overflow flag is still set.<br />
1-105
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
DC65 CE<br />
DC66 90<br />
DC67 EB 23<br />
DC69<br />
DC69 BO 01<br />
DC6B<br />
DC6B E8 E1B7 R<br />
DC6E 75 1C<br />
DC70 DO DO<br />
DC72 73 F7<br />
DC74 BO FF<br />
DC76 E8 E1B7 R<br />
DC79 75 11<br />
DC7B FB<br />
DC7C 33 C9<br />
DC7E E2 FE<br />
DC80 AD 006B R<br />
DC83 OA CO<br />
DC85 74 34<br />
DC87<br />
DC87 41<br />
DC88 DO D8<br />
DC8A 73 FB<br />
DC8C<br />
DC8C BC 0100<br />
DC8F 51<br />
DC90 E8 E164 R<br />
DC93 E8 EOAO R<br />
1-106<br />
c INTO<br />
C nop<br />
C jmp short i pic err<br />
C i pic 4 ok:<br />
c<br />
C Test hardware interrupts second.<br />
c<br />
generate an overflow interrupt INT 04h<br />
must be 4 bytes longJ<br />
C Test 8259A PIC interrupt mask with test patterns (cl = 0 if error).<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
mov<br />
i pic test:<br />
call<br />
jne<br />
rcl<br />
jnc<br />
mov<br />
call<br />
jne<br />
al,1<br />
i out mask<br />
i pic err<br />
al, 1<br />
i pic test<br />
al,OFFh<br />
i out mask<br />
i pic err<br />
; initialize mask value = 1<br />
output pattern, test input<br />
if not same pattern, abort<br />
rotate test pattern<br />
test again, if not finished<br />
test pattern of all ones<br />
output pattern, test input<br />
if not same pattern. abort<br />
C Look for 'hot' (active though masked off) PIC interrupts (cl = IR# if error).<br />
c<br />
C Enable Interrupts for the very first timeJ<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
sti<br />
xor<br />
loop<br />
mov<br />
or<br />
jz<br />
CX,CX<br />
$<br />
al,byte ptr ds:[intr_flag]<br />
al,al<br />
i pic ok<br />
enable interrupts<br />
delay awhile, waiting for<br />
a 'hot' interrupt.<br />
get the flag from ill int<br />
intr _flag = O?<br />
if so, we're all done.<br />
C Convert 'hot' interrupt mask (bit pattern) to IR# (1 to 8 error code).<br />
c<br />
C i pic hot:<br />
C inc<br />
C rcr<br />
c<br />
c<br />
c<br />
jnb<br />
C i pic err:<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
mov<br />
push<br />
ex<br />
al,1<br />
i pic hot<br />
sp, 10Dh<br />
ex<br />
Install Vector Table.<br />
call i vector<br />
C Initialize Video.<br />
c<br />
c<br />
c<br />
c<br />
call i d init<br />
Display error message.<br />
ex = 0 from loop above.<br />
increment ex (IR#+1).<br />
mask's least significant bit.<br />
if not set, continue.<br />
(exit with cl = 1 to 8.)<br />
cl = 0 or failing PIC 'hot' active IR#<br />
re-initialize stack<br />
save error code.<br />
set int1Dlocn = code_seg:v io, and<br />
set int1Dlocn = code seg:v parms.<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong>
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
DCD2 E8 E540 R<br />
DCD5 BE D9D3 R<br />
DCD8 E8 f540 R<br />
DCDB BE D9BB R<br />
DCDE E8 E540 R<br />
DCE1 BE D9EO R<br />
DCE4 E8 E540 R<br />
DCE7 BE D9BB R<br />
DCEA E8 E540 R<br />
DCED BE D9ED R<br />
DCFO E8 E540 R<br />
DCF3 BE D9BB R<br />
DCF6 E8 E540 R<br />
DCF9 BE D9FA R<br />
DCFC E8 E540 R<br />
DCFF BE D9BB R<br />
DD02 E8 E540 R<br />
DD05 BE DA07 R<br />
DD08 E8 E540 R<br />
DDOB BE D9B8 R<br />
DDOE E8 E540 R<br />
DD11 E8 E5E4 R<br />
DD14<br />
DD14 BD 0040<br />
DD17 88 36 0072 R<br />
DD18 81 EE 1234<br />
DD1F 33 FF<br />
OD21 8A 1000<br />
DD24<br />
D024 8E C2<br />
DD26 DB F6<br />
DD28 74 03<br />
DD2A 26: 89 05<br />
DD2D<br />
DD2D 26: 88 05<br />
DD30 F7 DO<br />
DD32 26: 89 05<br />
DD35 26: 8B 1D<br />
1-108<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
call<br />
mov<br />
call<br />
mov<br />
call<br />
mov<br />
call<br />
mov<br />
call<br />
mov<br />
call<br />
mov<br />
call<br />
mov<br />
call<br />
mov<br />
call<br />
mov<br />
call<br />
mov<br />
call<br />
DRomString<br />
si.cs:(offset i_cpu_m)<br />
DRomString<br />
si,cs:(offset pass_m)<br />
DRomString<br />
si,cs:(offset i_rom_m)<br />
DRomString<br />
si,cs:(offset pass_m)<br />
ORomString<br />
si,cs:(offset i_dmat_m)<br />
DRomString<br />
si.cs:(offset pass_m)<br />
DRomString<br />
si,cs:(offset i_dmac_m)<br />
ORomString<br />
si.cs:(offset pass_m)<br />
DRomString<br />
si,cs:(offset i_pic_m)<br />
DRomString<br />
si,cs:(offset pass_m)<br />
DRomString<br />
C call enable _parity : enable parity routine<br />
c .---------------------------------------------------------------------------<br />
[ Size & clear RAM at every 64k byte bank past the lowest 64k.<br />
c .---------------------------------------------------------------------------<br />
[<br />
C RAM size tst:<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
mov<br />
mov<br />
sub<br />
xor<br />
mov<br />
C RAM size lp:<br />
mov<br />
or<br />
jz<br />
mov<br />
C save ram:<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
mov<br />
not<br />
mov<br />
mov<br />
assume cs:code, ds:data. es:absO, ss:stack ram<br />
bp,64 :initialize memory count<br />
si,word ptr ds:[reset flag] : get warm bootflag<br />
si,01234h si=O iff CTL ALT DEL sequence.<br />
di,di Gffset = OOOOh<br />
dx, 1000h<br />
es,dx<br />
si,si<br />
save ram<br />
word ptr es:[di].ax<br />
ax,word ptr es:[di]<br />
ax<br />
word ptr es:[di],ax<br />
bx,word ptr es:[di]<br />
start at 1000:0000 (dx keeps segment)<br />
get segment<br />
if not a warm boot then save contents%<br />
of RAM%<br />
write someti.ng to RAM%<br />
to initialize parity correctly%<br />
read existing ram value<br />
complement it<br />
write complement back to RAM<br />
read back from RAM<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong>
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
DE28 88 16 OOCA R<br />
OE2C 8E C2<br />
DE2E 88 3E OOCC R<br />
OE32 A1 OOCE R<br />
DE35 88 1E DODO R<br />
DE39 E9 DF05 R<br />
DE3C<br />
OE3C 88 0010<br />
OE3F 8E CO<br />
DE41 33 FF<br />
DE43 26: 89 05<br />
DE46 26: 88 05<br />
DE49 F7 DO<br />
DE48 26: 89 05<br />
DE4E 26: 88 1D<br />
DE51 38 C3<br />
DE53 75 49<br />
DE55 89 8000<br />
DE58 FC<br />
DE 59<br />
DE59 88 C7<br />
DE58 A8<br />
DESC E2 F8<br />
DE5E 89 8000<br />
DE61 33 FF<br />
DE63<br />
DE63 88 C7<br />
DE65 26: 88 10<br />
DE68 38 C3<br />
DE6A 75 37<br />
DE6C 47<br />
DE6D 47<br />
DE6E E2 F3<br />
DE70 89 8000<br />
DE73 33 FF<br />
DE75<br />
DE75 88 C7<br />
DE77 F7 DO<br />
DE79 A8<br />
DE7A E2 F9<br />
DE7C 89 8000<br />
1-112<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
mov<br />
mov<br />
mov<br />
mov<br />
mov<br />
jmp<br />
dx,ds:(seg_fail]<br />
es,dx<br />
di,ds:[off_fail]<br />
ax,ds:dwrite<br />
bx,ds:dread<br />
RAM error<br />
setup registers expected by<br />
RAM error<br />
: it was an error%<br />
c ; ; ; ; ; '' ''''' '',;;;; '' ''',';;;;;;;;;;;;;;;;;;;'' '', ''','' ',;;;;;;;;;;;;;;;;;;;;;<br />
c<br />
c ptestaddr is the code that runs in protected mode to test memory above<br />
c 640k bytes. It is patterned CLOSELY after the memory test code that<br />
C runs in real mode.<br />
c<br />
c ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; :; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;<br />
C ptestaddr:<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
mov<br />
mov<br />
xor<br />
mov<br />
mov<br />
not<br />
mov<br />
mov<br />
cmp<br />
jne<br />
mov<br />
C cld<br />
C pmemtst_w1:<br />
C mov<br />
C stosw<br />
C loop<br />
C mov<br />
C xor<br />
c<br />
c pmemtst r1:<br />
C mov<br />
C mov<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
cmp<br />
jne<br />
inc<br />
inc<br />
loop<br />
mov<br />
xor<br />
C pmemtst w2:<br />
c<br />
c<br />
c<br />
c<br />
c<br />
mov<br />
not<br />
stosw<br />
loop<br />
mov<br />
ax,10h<br />
es,ax<br />
di,di<br />
word ptr es:[di],ax<br />
ax,word ptr es:[di]<br />
ax<br />
word ptr es:[di],ax<br />
bx, word ptr es:[di]<br />
ax,bx<br />
endofram<br />
cx,08000h<br />
ax,di<br />
pmemtst w1<br />
cx,08000h<br />
di,di<br />
ax,di<br />
bx,word ptr es:[di]<br />
ax,bx<br />
ptsterr<br />
di<br />
di<br />
pmemtst_r1<br />
cx,08000h<br />
di,di<br />
ax,di<br />
ax<br />
pmemtst w2<br />
cx,08000h<br />
set up es selector%<br />
clear di%<br />
initialize es:[di]%<br />
first to set parity bit %<br />
mov es:[di] into ax%<br />
complement ax%<br />
mov complement into es:[di]%<br />
mov es:[di] into bx%<br />
is ax = bx?%<br />
if not we passed end of ram%<br />
load ex with word count for%<br />
64k bytes%<br />
increment direction%<br />
ax = location%<br />
write location to memory%<br />
write all 64k%<br />
reset loop counter%<br />
clear di%<br />
set ax%<br />
read memory location into bx%<br />
compare location with contents%<br />
if not equal report error%<br />
increment di twice%<br />
reset loop counter%<br />
clear di%<br />
ax = location%<br />
complemeht location%<br />
write complement location to memory<br />
write all 64k%<br />
reset loop counter%<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong>
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
DED3 EB 03<br />
DED5<br />
DED5 BE D9BB R<br />
DED8<br />
DED8 E8 E540 R<br />
DEDB<br />
DEDB 33 co<br />
DEDD 8E CO<br />
DEDF 2E: 8E 1E E538 R<br />
DEE4 A1 0013 R<br />
DEE7 3B C5<br />
DEE9 72 08<br />
DEEB C7 06 OOCA R 0000<br />
DEF1 EB 08<br />
DEF3<br />
DEF3 8B DD<br />
DEF5 2B 08<br />
DEF7 89 1E OOCA R<br />
DEFB<br />
DEFB 8F 06 OOAA R<br />
DEFF 8F 06 OOA8 R<br />
DF03 EB 30<br />
DF05<br />
DF05 52<br />
DF06 1E<br />
DF07 50<br />
DF08 E8 E55F R<br />
DFOB BE D9CC R<br />
DFOE E8 E540 R<br />
DF11 E8 E56C R<br />
DF14 E4 66<br />
DF16 24 OF<br />
DF18 E8 E589 R<br />
1-114<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
rpass:<br />
ppass:<br />
jmp<br />
mov<br />
call<br />
RAM size end<br />
mor mem:<br />
no pmem:<br />
xor<br />
mov<br />
mov<br />
mov<br />
cmp<br />
cmp<br />
jb<br />
mov<br />
jmp<br />
mov<br />
sub<br />
mov<br />
pop<br />
pop<br />
1:<br />
short ppass<br />
si,cs:(offset pass m) :Display OK<br />
DRomString<br />
ax, ax ax = 0<br />
bx = RAM size/16<br />
es.ax satisfy assumptions es = 0 = absO seg<br />
ds,word ptr cs:(set_ds_word]<br />
ax,ds:[memory size]<br />
ax,280h<br />
ax,bp<br />
mor mem<br />
ds : ( seg fail] , 0<br />
short no pmem<br />
bx,bp<br />
bx,ax<br />
ds:(seg_fail],bx<br />
word ptr ds:(osmerge2+4]<br />
word ptr ds:[osmerge2+2]<br />
see if real memory full%<br />
if memory > 640k DOS won't load%<br />
if total memory > real memory%<br />
see if memory above 640k%<br />
zero out p-mode mem size%<br />
dos is ok%<br />
bp has total mem size at this point<br />
subtract real mode memory from total%<br />
memory to get p-mode memory in ax%<br />
mov p-mode mem size into seg fail location%<br />
EGA -- GWBASIC fix<br />
restore locations 4aa and 4a8 from<br />
stack an restore when memory<br />
C count is complete<br />
c<br />
C GoTo Display Passing Messages<br />
c<br />
c jmp short i_cal :Go check clock calendar<br />
c<br />
c<br />
C RAM error:<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
push<br />
push<br />
push<br />
call<br />
mov<br />
call<br />
call<br />
in<br />
and<br />
call<br />
dx<br />
ds<br />
ax<br />
DCrlf<br />
Error message looks like: Fail:cc:yOOO:zzzz,wwww:rrrr<br />
where: cc = RAM configuration number<br />
si,cs:(offset fail_m)<br />
yOOO = Segment of failure<br />
zzzz = Offset of failure<br />
wwww = Data that was written<br />
rrrr = Data that was read<br />
;save failing segment<br />
;save ds<br />
; save failing test pattern.<br />
:Carriage Return. Line Feed<br />
DRomString display fail message.<br />
DColon display a colon<br />
al.sys_conf a get RAM configuration.<br />
al,OFh mask valid bits.<br />
DHexByte display RAM configuration.<br />
= dx = es<br />
= di<br />
= ax<br />
= bx<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong>
DF1B E8 E56C R<br />
DF1E 8E DA<br />
DF20 8B C7<br />
DF22 E8 E578 R<br />
DF25 E8 E56C R<br />
DF28 1F<br />
DF29 8B C3<br />
DF2B E8 E578 R<br />
DFZE E8 E55F R<br />
DF31 1F<br />
DF32 SA<br />
DF33 EB A6<br />
DF35<br />
DF35 BO 01<br />
DF37 BA 0070<br />
DF3A EE<br />
DF3B B4 FE<br />
OF3D CD 1A<br />
DF3F B8 OOOA<br />
DF42 86 C2<br />
DF44 F6 F2<br />
DF46 3D OOOA<br />
DF49 73 15<br />
DF4B 80 FE 3C<br />
DF4E 73 10<br />
DFSO 80 F9 3C<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
call<br />
mov<br />
mov<br />
call<br />
call<br />
pop<br />
mov<br />
call<br />
call<br />
pop<br />
pop<br />
jmp<br />
DColon<br />
ds,dx<br />
ax,di<br />
DHexLong<br />
DColon<br />
ds<br />
ax,bx<br />
DHexLong<br />
DCrlf<br />
ds<br />
dx<br />
short RAM size end<br />
display a colon<br />
ds = failing segment = dx<br />
ax = failing segment = di<br />
display ds:ax<br />
display a colon<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
ds = failing test pattern = on stack<br />
ax = what was read = bx<br />
display ds:ax<br />
;restore ds<br />
;restore failing segment<br />
c<br />
c .---------------------------------------------------------------------------<br />
c MM58274 Clock Calendar Device Test<br />
c .---------------------------------------------------------------------------<br />
c<br />
C i cal:<br />
c<br />
C IF G4TOD<br />
C mov<br />
C mov<br />
C out<br />
c<br />
C ENDIF<br />
c<br />
al,01h<br />
dx,70h<br />
dx,al<br />
c Read Clock Calendar Device.<br />
c<br />
c<br />
c<br />
c<br />
mov<br />
int<br />
ah,-2<br />
1Ah<br />
C Check time & date read.<br />
c<br />
C Hundredths of Seconds.<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
mov<br />
xchg<br />
div<br />
cmp<br />
jae<br />
C Seconds.<br />
c<br />
c<br />
c<br />
c<br />
c<br />
cmp<br />
jae<br />
C Minutes.<br />
c<br />
c cmp<br />
ax. 10<br />
al, dl<br />
dl<br />
ax, 10<br />
i cal 1 1 80<br />
dh,60<br />
i cal 1 1 80<br />
cl,60<br />
This should fix the factory<br />
initial powerup problem<br />
al=1 implies Normal mode. Clock run<br />
Clock setting reg, interrupt stop<br />
bx = day (from 1-1 of leap year)<br />
ch = hour<br />
cl = minutes<br />
dh = seconds<br />
dl = hundredths of seconds<br />
ax = 10; dl =hundredths<br />
ax = hundredths; dl = 10<br />
ah =remainder. al =quotient<br />
(can only read tenths of seconds.)<br />
ah should = 0, and al should be < 10.<br />
if not, test chip & write 1-1-80.<br />
dh = seconds should be < 60.<br />
if not, test chip & write 1-1-80.<br />
; cl =minutes should be < 60.<br />
1-115
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
DFC2 BO 01<br />
DFC4 E6 61<br />
DFC6 BO B4<br />
DFC8 BA 0042<br />
DFCB E8 E1CO R<br />
DFCE BO 00<br />
DFDO E6 61<br />
DFD2 75 1C<br />
DFD4 BO 36<br />
DFD6 E6 43<br />
DFD8 B8 0000<br />
DFDB E6 40<br />
DFDD 8A C4<br />
DFDF E6 40<br />
DFE1 BO B6<br />
DFE3 E6 43<br />
DFE5 B8 0266<br />
DFE8 E6 42<br />
DFEA 8A C4<br />
DFEC E6 42<br />
DFEE EB 1C<br />
DFFO<br />
DFFO BE D9CC R<br />
DFF3 E8 E540 R<br />
DFF6 BE DA44 R<br />
DFF9 8A C4<br />
DFFB 32 E4<br />
DFFD 01 EO<br />
DFFF 01 EO<br />
ED01 03 FO<br />
E003 E8 E540 R<br />
E006 E8 E55F R<br />
E009 EB DO<br />
EDOB F4<br />
1-118<br />
c<br />
C Test i8254 tone generator p_timer counter (P 8253_2).<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
mov<br />
out<br />
mov<br />
mov<br />
call<br />
mov<br />
out<br />
jnz<br />
al, 1<br />
p kctrl,al<br />
al,OB4h<br />
dx,p 8253 2<br />
rtc chk<br />
al,O<br />
p kctrl,al<br />
i rtc err<br />
clear kb interrupts, reset kb, disable parity<br />
turn off speaker data -- bit #1<br />
turn on speaker gate to p_8253_2 --bit #0<br />
10 11 010 0 -> p 8253 2, lsb 1st. mode 2, no BCD<br />
select tone generator counter<br />
clear kb interrupts, reset kb, disable parity<br />
turn off speaker data & gate -- bits #1 & #0<br />
if nz, ah has error code to report.<br />
c Initialize i8254 real-time clock interrupt p timer counter (P 8253 0).<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
mov<br />
out<br />
mov<br />
out<br />
mov<br />
out<br />
al,tocmd<br />
p 8253 ctrl,al<br />
ax,tOcount<br />
p 8253 O,al<br />
al,ah<br />
p 8253 O,al<br />
: select real time clock counter<br />
: load real time clock count<br />
c Initialize i8254 tone generator p timer counter (P 8253 2).<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
mov<br />
out<br />
mov<br />
out<br />
mov<br />
out<br />
jmp<br />
C i rtc err:<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
mov<br />
call<br />
mov<br />
mov<br />
xor<br />
shl<br />
shl<br />
add<br />
call<br />
call<br />
jmp<br />
hlt<br />
al,t2cmd<br />
p 8253 ctrl.al<br />
ax,t2count<br />
p 8253 2,al<br />
al,ah<br />
p 8253 2,al<br />
short i rtc ok<br />
si,cs:(offset fail_m)<br />
DRomString<br />
si,cs:(offset i_rtc_lo_m-(4*1))<br />
: select tone generator counter<br />
load tone generator count<br />
ah has error code to report.<br />
display fail message.<br />
al,ah al =error code= (1. 2 or, 3)<br />
ah,ah ax= error code= (1, 2 or. 3)<br />
ax,1<br />
ax.1<br />
si,ax<br />
DRomString<br />
DCrlf<br />
short i rtc end<br />
ax = 2*(error code) = (2, 4, or 6)<br />
ax = 4*(error code) = (4, 8, or 12)<br />
index to (LO, HI, or NR message.)<br />
display failing mode.<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong>
EOOC<br />
EOOC BE 09BB R<br />
EOOF E8 E540 R<br />
E012 BO 48<br />
E014 BA 0378<br />
E017 EE<br />
E018<br />
E018 B8 OE07<br />
E01B CD 10<br />
E010 E9 E2AD R<br />
E020<br />
E020<br />
E020<br />
E05B<br />
E05B<br />
E05B E9 DAD3 R<br />
E05E<br />
E05E<br />
E05E 1E<br />
E05F 06<br />
E060 57<br />
E061 56<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
i rtc ok:<br />
mov<br />
call<br />
mov<br />
mov<br />
out<br />
i rtc end:<br />
mov<br />
int<br />
si,cs:(offset pass_m)<br />
DRomString<br />
al,48h Check Point #8<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
dx,378h parallel port data port address<br />
dx,al output " Running- Checkpoint 8"<br />
ax.(OEh*100h)+BEL beep keyboard<br />
10h<br />
c assume cs:code. ds:nothing. es:nothing. ss:stack ram<br />
c<br />
c<br />
c<br />
jmp<br />
C diagnostics_<br />
c<br />
pcinit<br />
endp<br />
C code ends<br />
C include pwrup1a.asm<br />
c<br />
c<br />
c ·======================================================================<br />
c<br />
c<br />
Filename: pwrup1a.src<br />
c ·======================================================================<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
code segment public '<strong>ROM</strong>'<br />
assume CS:COde, ds:nothing,<br />
ORG OE05Bh<br />
i hard reset proc<br />
jmp diagnostics<br />
i hard reset endp<br />
es:nothing, ss:nothing<br />
c ·---------------------------------------------------------------------------<br />
( Install GOT ENTRIES<br />
c<br />
C Input: None.<br />
C Output: None.<br />
c<br />
C Trash: ax = ex = 0 destroyed.<br />
c ·-------------------------------------------------------------------------c<br />
C i_gdt proc<br />
c<br />
c<br />
c push<br />
c<br />
c<br />
c<br />
c<br />
push<br />
push<br />
push<br />
near<br />
..<br />
..<br />
..<br />
..<br />
assume cs:code, ds:nothing, es:nothing, ss:stack_ram<br />
ds<br />
es<br />
di<br />
si<br />
c Initialize the gdt with gdt_ent.<br />
: save registers<br />
1-119
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
EOD2 C7 06 0084 R E297 R c mov word ptr ds:[master_tbl_ptr+DODOh],cs:(offset mastab)<br />
EOD8 8C DE 0086 R c mov word ptr ds:[master_tbl ptr+DOD2h],cs<br />
c<br />
c<br />
c<br />
EODC 3C 30 c cmp al,D3Dh is it the monochrome board?<br />
EODE 75 1E c jnz i d ok if not, 4Dx25 or 8Dx25 color ok.<br />
c<br />
c assume CS:COde, ds:v ram, es:nothing, ss:stack_ram<br />
c<br />
EOEO 1E c push ds save ds = data seg = 004Dh.<br />
EDE1 B8 BODO c mov ax,para mono satisfy assumptions<br />
EOE4 8E 08 c mov ds,ax<br />
EOE6 BO AS c mov al,OA5h test pattern<br />
EOE8 A2 DODO c mov byte ptr ds:[DDDDh],al if so, is monochrome there?<br />
EOEB 8A 26 DODO c mov ah,byte ptr ds:[OODOh] read monochrome RAM<br />
EOEF 1F c pop ds restore ds = data seg = D04Dh.<br />
c<br />
c assume cs:code, ds:data, es:nothing, ss:stack ram<br />
c<br />
EOFO 3A C4 c cmp al,ah if monochrome RAM is there.<br />
EOF2 75 04 c jnz i d 80x25 then the board must be therel<br />
c if not, default to 8Dx25 color<br />
EOF4 B5 07 c mov ch,D7h if there, we believe switches,<br />
EOF6 EB 06 c jmp short i d ok initialize display to mode #7.<br />
EDF8 c i d 8Dx25:<br />
c<br />
EOF8 80 E1 EF c and cl,OEFh reset bit #4 for 80x25 color.<br />
EOFB 80 C9 20 c or cl,D20h set bit #5 for 8Dx25 color.<br />
EOFE c i d ok:<br />
c<br />
c<br />
c<br />
c Set system configuration (switch bits) from switches.<br />
c<br />
EOFE E4 66 c in al,sys_conf a get switch info%<br />
E100 A8 10 c test al, 1Dh 80287 present?%<br />
E102 75 03 c jnz i d sw no, move on%<br />
E104 80 C9 02 c or cl,D2 yes,record it%<br />
E107 c i d SW:<br />
--<br />
E107 32 E4 c xor ah,ah ah = D.<br />
E109 8A C1 c mov al,cl get data from switches.<br />
E10B A3 0010 R c mov word ptr ds:[switch_bits],ax save data from switches<br />
c<br />
c .-------------------------------------------------------------------------c<br />
;Test for and Initialize optional video <strong>ROM</strong>s<br />
c .-------------------------------------------------------------------------c<br />
c assume cs:code, ds:nothing, es:nothing, ss:nothing<br />
c<br />
E10E BB COOO c mov bx,OCOOOh ; load starting segment<br />
c<br />
E111 c vrom scan loop:<br />
E111 8E DB c mov ds,bx bx has pending segment<br />
E113 33 F6 c xor si,si offset OOOOh<br />
1-122 <strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong>
E191 BE FEF3 R<br />
E194 B1 18<br />
E196 AS<br />
E197 AB<br />
E198 E2 FC<br />
E19A 33 CO<br />
E19C B9 01B8<br />
E19F F3/ AB<br />
E1A1 SE<br />
E1A2 SF<br />
E1A3 07<br />
E1A4 1F<br />
E1AS C3<br />
E1A6<br />
E1A6<br />
E1A6 BA 0020<br />
E1A9 BO 13<br />
E1AB EE<br />
E1AC 42<br />
E1AD BO 08<br />
E1AF EE<br />
E1BO BO OD<br />
E1B2 EE<br />
E1B3 BO FF<br />
E1BS EE<br />
E1B6 C3<br />
E1B7<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
c<br />
c<br />
c<br />
c<br />
mov<br />
mov<br />
C i vec8: movsw<br />
C stosw<br />
C loop i vec8<br />
c<br />
si,cs:(offset i vec_tbl)<br />
cl, (1Fh-08h)+1<br />
C Initialize Interrupt Vectors 20h and above to zero.<br />
c<br />
c xor<br />
c<br />
c<br />
mov<br />
c<br />
c rep<br />
c<br />
c pop<br />
c pop<br />
c pop<br />
c pop<br />
c ret<br />
c<br />
C i vector<br />
c<br />
ax,ax<br />
cx,((03FOh-0080h)/2)<br />
stosw<br />
si<br />
di<br />
es<br />
ds<br />
endp<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
ds:si = code_seg:i_vec_tbl<br />
es:di = absO_seg:int08locn<br />
load INT's 08h through 1Fh.<br />
es:di++ gets ds:si (offset)<br />
es:di++ gets ax = cs (segment)<br />
until ex = 0.<br />
ax = 0<br />
es:di = absO_seg:int20locn<br />
clear 0:0080h to 0:03FOh<br />
don't blow away stack!<br />
es:di++ gets 0<br />
restore registers<br />
c .--------------------------------------------------------------------------c<br />
Initialize & Disable 82S9A Programmable Interrupt Controller.<br />
c<br />
C Input: None.<br />
C Output: None.<br />
c<br />
C Trash: al & dx destroyed.<br />
c ·-----------------------------------------------· ---------------------------<br />
c<br />
C i_pic_init<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
mov<br />
mov<br />
out<br />
inc<br />
mov<br />
out<br />
mov<br />
out<br />
mov<br />
out<br />
ret<br />
C i pic init<br />
c<br />
proc near<br />
assume cs:code, ds:nothing, es:nothing, ss:stack_ram<br />
dx,pic 0<br />
al,pic icw1<br />
dx,al<br />
dx<br />
al,pic_icw2<br />
dx,al<br />
al,pic icw4<br />
dx,al<br />
al,pic off msk<br />
dx,al<br />
endp<br />
dx = pic_O (8259A ·control' port)<br />
edge triggered, single, icw4 to follow<br />
dx = pic 1 (82S9A 'data' port)<br />
interrupt vector base address<br />
since we are single mode (no slave), skip icw3<br />
dx = pic 1 (8259A 'data' port)<br />
not special fully nested, buffered,<br />
master. normal end of int, 8086 mode<br />
mask all interrupts off for now<br />
dx = pic 1 (82S9A 'data' port)<br />
1-125
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
E1B7<br />
E1B7 E6 21<br />
E1B9 SA EO<br />
E1BB E4 21<br />
E1BD 3A EO<br />
E1BF C3<br />
E1CO<br />
E1CO<br />
E1CO SA EO<br />
E1C2 B9 FFFF<br />
E1C5 SB 09<br />
E1C7 E6 43<br />
E1C9 32 CO<br />
E1CB EE<br />
E1CC FE CO<br />
E1CE EE<br />
E1CF<br />
1-126<br />
c .--------------------------------------------------------------------------c<br />
Output Mask to S259A Programmable Interrupt Controller.<br />
c<br />
c Input: AL = mask pattern<br />
c<br />
C Output: Flags<br />
c<br />
C Trash: ah destroyed.<br />
c ---------------------------------------------------------------------------<br />
c<br />
C i out mask<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
out<br />
mov<br />
in<br />
cmp<br />
ret<br />
i out mask<br />
proc near<br />
assume cs:code, ds:nothing, es:nothing, ss:stack_ram<br />
pic 1, al ;output interrupt mask pattern<br />
ah,al ;save pattern for compar<br />
al,pic 1 ;get mask from S259<br />
ah,al ;the same ?<br />
;return flags = result of compare<br />
endp<br />
c ·---------------------------------------------------------------------c<br />
S254 p timer test for one p timer counter channel<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
Input: al<br />
dx<br />
Output: zf<br />
ah<br />
= S254 p timer control byte<br />
= port address of S254 p timer data (counter)<br />
= set (z status) if no error; reset (nz status) if error<br />
=Error codes: 0 ->No Errorl<br />
1 ->Low below time interval window.<br />
2 -> High above time interval window.<br />
3 -> No Response.<br />
C Trash: al, bx & ex destroyed.<br />
c .----------------------------------------------------------------------<br />
c<br />
C rtc chk proc<br />
C assume<br />
c<br />
c<br />
c<br />
c<br />
mov<br />
mov<br />
near<br />
cs:code, ds:nothing, es:nothing, ss:nothing<br />
ah,al<br />
cx,OFFFFh<br />
save control byte for later.<br />
time out for both Register Bit Tests.<br />
C Register Bit Test (All Reset): Count down from 10Dh until all bits reset.<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
mov<br />
out<br />
xor<br />
out<br />
inc<br />
out<br />
C rtc chk reset lp:<br />
- - -<br />
bx,cx<br />
p S253 ctrl,al<br />
al,al<br />
dx,al<br />
al<br />
dx,al<br />
bx gets all its bits set.<br />
send iS254 p timer control byte.<br />
al = DOh<br />
load low byte of p_timer count.<br />
al = 01h<br />
load high byte of p_timer count.<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong>
E1CF 8A C4 c mov al,ah get control byte for read.<br />
E1D1 24 co c and al,OCOh mask off all but top 2 bits.<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
E1D3 E6 43 c out p 8253 ctr 1. al send latching control byte for read.<br />
c<br />
E1D5 EC c in al,dx get low byte of p timer count.<br />
E1D6 22 D8 c and bl,al ·and' low byte.<br />
E1D8 EC c in al,dx get high byte of p timer count.<br />
E1D9 22 F8 c and bh,al ·and' high byte.<br />
c<br />
E1DB DB DB c or bx,bx is bx = O?<br />
E1DD 74 05 c jz rtc chk reset ok if so. we're done.<br />
- - -<br />
E1DF EZ EE c loop rtc_chk reset lp if not, continue reading.<br />
c (Note: loops less than 16 times.<br />
c<br />
E1E1 c rtc chk reset err: time out.<br />
E1E1 B4 03 c mov ah,3 Error #3. (No Response.)<br />
E1E3 C3 c ret return nz status (loop leaves zf ok).<br />
E1E4 c rtc chk reset ok:<br />
c<br />
c<br />
c Register Bit Test (All Set): Count down from Oh (FFFFh+1) until all bits set.<br />
c<br />
E1E4 33 DB c xor bx,bx bx gets all its bits reset.<br />
c<br />
E1E6 8A C4 c mov al,ah get control byte for load.<br />
E1E8 E6 43 c out p 8253 ctr 1. al send i8254 p_timer control byte.<br />
c<br />
E1EA 32 co c xor al,al al = DOh<br />
E1EC EE c out dx,al load low byte of p timer count.<br />
E1ED EE c out dx,al load high byte of p_timer count.<br />
c<br />
E1EE c rtc chk set lp:<br />
E1EE 8A C4 c mov al,ah get control byte for read.<br />
- - -<br />
E1FO 24 co c and al,OCOh mask off all but top 2 bits.<br />
E1F2 E6 43 c out p 8253 ctr 1. al send latching control byte for read.<br />
c<br />
E1F4 EC c in al,dx get low byte of p timer count.<br />
E1F5 OA D8 c or bl,al ·or' low byte.<br />
E1F7 EC c in al,dx get high byte of p timer count.<br />
E1F8 OA F8 c or bh,al ·or· high byte.<br />
c<br />
E1FA 83 FB FF c cmp bx,OFFFFh is bx = OFFFFh?<br />
E1FD 74 05 c jz rtc chk set ok if so, we're done.<br />
E1FF E2 ED c loop rtc chk set lp if not, continue reading.<br />
- -<br />
c (Note: loops less than 16 times.)<br />
c<br />
E201 c rtc chk set err: time out.<br />
E201 B4 03 c mov ah,3 Error #3. (No Response.)<br />
E203 C3 c ret return nz status (loop leaves zf ok).<br />
E204 c rtc chk set ok:<br />
c<br />
-<br />
c<br />
c p_timer Time Window Test: Test p timer versus CPU & see if it falls within spec.<br />
c<br />
E204 8A C4 c mov al,ah ; get control byte for read.<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong> 1-127
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
E206 24 co c and al,OCOh mask off all but top 2 bits.<br />
E208 E6 43 c out p 8253 ctrl,al send latching control byte for read.<br />
c<br />
E20A EC c in al,dx get low byte of p timer count.<br />
E2DB 8A 08 c mov bl,al save low byte.<br />
E2DD EC c in al,dx get high byte of p timer count.<br />
E2DE 8A F8 c mov bh,al save high byte.<br />
c<br />
E210 8A C4 c mov al,ah get control byte for read.<br />
E212 24 co c and al,OCOh mask off all but top 2 bits.<br />
E214 E6 43 c out p 8253 ctrl,al send latching control byte for read.<br />
c<br />
E216 EC c in al,dx get low byte of p timer count.<br />
E217 8A C8 c mov cl,al save low byte.<br />
E219 EC c in al,dx get high byte of p timer count.<br />
E21A 8A E8 c mov ch,al save high byte.<br />
c<br />
E21C 2B 09 c sub bx,cx calculate time difference.<br />
c<br />
c Do Time Range Checking ( 4
E22F 89 8000 c mov cx,08000h get word count<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
c (64k = 32k * 2 bytes/word)<br />
E232 8E C2 c mov es,dx<br />
E234 33 FF c xor di,di es:di = address<br />
E236 c memtst w1:<br />
-<br />
E236 88 C7 c mov ax,di ;data = offset<br />
E238 AB c stosw<br />
E239 E2 F8 c loop memtst w1<br />
E23B 8E DA c mov ds,dx<br />
c<br />
E23D 33 DB c xor bx,bx ;ds:bx = address<br />
E23F 89 8000 c mov cx,08000h : word count<br />
E242 c memtst r1:<br />
-<br />
E242 88 07 c mov ax, [bx] ;read data<br />
E244 38 C3 c cmp ax,bx ;verify data<br />
E246 75 2C c jne memtst err<br />
E248 43 c inc bx<br />
E249 43 c inc bx :next address<br />
E24A E2 F6 c loop memtst r1<br />
c<br />
E24C 89 8000 c mov cx,08000h word count<br />
E24F c memtst w2: address is already ok<br />
E24F 88 C7 c mov ax,di data = offset<br />
E251 F7 DO c not ax complement it<br />
E253 A8 c stosw :fill memory<br />
E254 E2 F9 c loop memtst w2<br />
c<br />
E256 89 8000 c mov cx,08000h word count<br />
c<br />
E259 c memtst r2:<br />
E259 88 07 c mov ax,[bx] read data<br />
E25B F7 DO c not ax complement<br />
E25D 38 C3 c cmp ax,bx verify<br />
E25F 75 OF c jne memtst err c<br />
c<br />
E261 43 c inc bx update address<br />
E262 43 c inc bx<br />
E263 E2 F4 c loop memtst r2<br />
E265 88 0000 c mov ax,O to clear memory<br />
E268 89 8000 c mov cx,08000h word count<br />
E26B F3/ A8 c rep stosw<br />
E26D 08 co c or ax,ax ;set ZF<br />
c END IF<br />
E26F C3 c ret<br />
E270 c memtst err c:<br />
c<br />
- -<br />
E270 F7 DO c not ax error during complemented<br />
E272 F7 D3 c not bx address test<br />
E274 c memtst err:<br />
c<br />
-<br />
E274 93 c xchg ax,bx ;return registers as specified<br />
E275 C3 c ret<br />
E276 c memtst endp<br />
c<br />
c<br />
-<br />
-<br />
-<br />
-<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong> 1-129<br />
-
E2AD<br />
E2AD<br />
E2AD<br />
E2AD B8 0040<br />
E2BO 8E 08<br />
E2B2 8E CO<br />
E2B4 9C<br />
E2B5 FA<br />
E2B6 BA 0061<br />
E2B9 BO 40<br />
E2BB EE<br />
E2BC 33 C9<br />
E2BE E2 FE<br />
E2CO B4 01<br />
E2C2 E8 E4B3 R<br />
E2C5 89 OE 0072 R<br />
E2C9 33 C9<br />
E2CB E2 FE<br />
E2CD<br />
E2CD E4 64<br />
E2CF AS 01<br />
E2D1 74 09<br />
E2D3 E4 60<br />
E2D5 3C AA<br />
E2D7 75 F4<br />
E2D9 A3 0072 R<br />
E2DC<br />
E2DC E2 EF<br />
E2DE 33 C9<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
c : 16h etc ..<br />
C mt end label word<br />
c<br />
C pO_data1<br />
c<br />
endp<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
c .----------------------------------------------·-----------------------------<br />
c<br />
c<br />
Initialize the basic hardware,<br />
Set up the interrupt pointers,<br />
c Initialize all RAM variables,<br />
c Clear the screen,<br />
C Initialize the disk drivers,<br />
C and perform the cold boot.<br />
c .--------------------------------------------------------------------------c<br />
C pcinit proc near<br />
c<br />
C assume cs:code, ds:data, es:data, ss:stack ram<br />
C extrn bios install:near<br />
c<br />
c<br />
c<br />
c<br />
c<br />
mov<br />
mov<br />
mov<br />
ax,data seg<br />
ds,ax<br />
es,ax<br />
C Initialize Keyboard Controller.<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
pushf<br />
eli<br />
mov<br />
mov<br />
out<br />
xor<br />
loop<br />
mov<br />
call<br />
mov<br />
xor<br />
loop<br />
dx,p kctrl<br />
al,40h<br />
dx,al<br />
CX,CX<br />
$<br />
ah,1<br />
kb cmd send<br />
word ptr ds:(reset flag],cx<br />
CX,CX<br />
$<br />
satisfy assumptions<br />
save flags and<br />
disable interrupts<br />
dx = p kctrl<br />
remove keyboard reset<br />
; delay<br />
enable self test<br />
delay<br />
C Flush any keyboard scan code and store AAh if we get it.<br />
c<br />
C kb flush:<br />
C in<br />
c test<br />
C jz<br />
c<br />
c<br />
c<br />
c<br />
in<br />
cmp<br />
jne<br />
mov<br />
al,kb status<br />
al, 1<br />
kb flush back<br />
al,p kscan<br />
al,OAAh<br />
kb flush<br />
C kb flush back:<br />
C loop kb flush<br />
c<br />
c xor CX,CX<br />
word ptr ds:[reset flag],ax<br />
get 8041 status<br />
test output buffer bit<br />
jump if no character pending<br />
get scan code from data port<br />
verify keyboard present<br />
keyboard present<br />
;loop if zero<br />
: delay<br />
1-131
c<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
E32B BO 01 c mov al,01h printer default timeout = 01<br />
E32D BF 007C R c mov di,ds:(offset serial tout)<br />
E330 B9 0004 c mov cx,4<br />
E333 F3/ AA c rep stosb es:di gets al<br />
c<br />
c Determine Parallel Port Configuration.<br />
c<br />
c assume cs:code, ds:code, es:data, ss:stack ram<br />
c<br />
E335 8C C8 c mov ax,cs<br />
E337 8E D8 c mov ds,ax satisfy assumptions<br />
c<br />
E339 32 DB c xor bl,bl clear high byte of switch_bits<br />
c<br />
E33B BF 0008 R c mov di,es:(offset printer addr) es:di points at printer base<br />
E33E BE E287 R c mov si,ds:(offset p tbl) addresses of printer ports<br />
c<br />
E341 c i prt loop:<br />
E341 AD c lodsw ax gets ds:si port address.<br />
E342 DB CO c or ax,ax valid port address?<br />
E344 74 14 c jz i prt exit exit if invalid port address<br />
c<br />
E346 8B DO c mov dx,ax transfer to data register<br />
E348 BO AS c mov al,OASh load test pattern<br />
E34A EE c out dx,al output test pattern.<br />
E34B 86 C4 c xchg al.ah mov ah.al: trash al: & delay.<br />
E34D EC c in al,dx input test pattern back.<br />
E34E 3A C4 c cmp al.ah what we read = test pattern ?<br />
E350 75 EF c jnz i_prt_loop if not, loop as port is absent<br />
c else. printer port is present<br />
E352 8B C2 c mov ax,dx retrieve port address<br />
E354 AB c stosw es:di gets ax.<br />
c<br />
E355 80 C3 40 c add bl,040h :add to high byte of switch_bits<br />
c<br />
E358 EB E7 c jmp i prt loop : will go around loop 3 times<br />
E35A c i prt exit:<br />
c<br />
c<br />
c Determine Communication (RS-232) Configuration (INS82SO's).<br />
c<br />
E35A BF 0000 R c mov di,es:(offset rs232_addr) es:di points at rs232 base<br />
c<br />
E35D BA 03FA c mov dx,com id a read interrupt I.D. register<br />
E360 EC c in al,dx for first 8250 port.<br />
E361 A8 F8 c test al,OF8h bits #3-7 are always low if<br />
E363 75 07 c jnz i no com a installed.<br />
c<br />
E365 B8 03F8 c mov ax,com data a if present, load address of<br />
E368 AB c stosw first 8250 data port.<br />
c es:di gets ax.<br />
E369 80 C3 02 c add bl,002h :add to high byte of switch_bits<br />
c<br />
E36C c i no com a: : es:di points next empty word<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong> 1-133<br />
-
E3A4 8B 01<br />
E3A6 4A<br />
E3A7 CD 14<br />
E3A9 E2 F6<br />
E3AB<br />
E3AB BO 01<br />
E3AD BA 0063<br />
E3BO EE<br />
E3B1 33 CO<br />
E3B3 8E 08<br />
E3B5 E4 66<br />
E3B7 A8 40<br />
E3B9 75 4A<br />
E3BB BE DABD R<br />
E3BE E8 E540 R<br />
E3C1 E8 0000 E<br />
E3C4 2E: 8E 1E E538 R<br />
E3C9 80 3E 0075 R 00<br />
E3CE 75 35<br />
E3DO BC 0100<br />
E303 FA<br />
E304 33 CO<br />
c<br />
c<br />
c<br />
c<br />
c<br />
mov<br />
dec<br />
INT<br />
C dis dmacc:<br />
c<br />
c<br />
loop<br />
mov<br />
mov<br />
c<br />
c<br />
c .--------------------------------------------------------------------------<br />
out<br />
dx,cx<br />
dx<br />
14h<br />
rs init<br />
al,1<br />
dx,63h<br />
dx,al<br />
C ; Call internal HDU init code.<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
; port number = loop - 1<br />
c .--------------------------------------------------------------------------<br />
[<br />
c<br />
C assume cs:code. ds:absO, es:nothing, ss:stack_ram<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
xor<br />
mov<br />
in<br />
test<br />
jnz<br />
mov<br />
call<br />
call<br />
ax.ax<br />
ds,ax<br />
al.sys_conf a<br />
al,64<br />
i hdu ok<br />
si,cs:(offset i_hdu_m)<br />
DRomString<br />
bios install<br />
; satisfy assumptions<br />
.. port 66h.%<br />
c assume cs:code, ds:data. es:absO. ss:stack ram<br />
c<br />
c<br />
c<br />
E306 8E CO<br />
E308 26: C7 06 0034 R FF23 C<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
E3DF 26: 8C DE 0036 R C<br />
E3E4 26: C7 06 004C R EC59 C<br />
E3EB 26: 8C DE 004E R C<br />
E3FO 26: C7 06 0064 R F876 C<br />
E3F7 26: 8C DE 0066 R C<br />
E3FC 26: A3 0100<br />
E400 26: A3 0102<br />
E404 FB<br />
E405<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
c<br />
c<br />
mov<br />
cmp<br />
jnz<br />
mov<br />
eli<br />
call<br />
xor<br />
mov<br />
mov<br />
mov<br />
mov<br />
mov<br />
mov<br />
mov<br />
C Initialize<br />
C mov<br />
C mov<br />
c sti<br />
C i hdu ok:<br />
c<br />
c<br />
ds,word ptr cs:[set_ds_word]<br />
byte ptr ds:[hf num].O<br />
. , test switch bit 7%(1-8 no 0-7)<br />
.. if set. skip init<br />
print test message<br />
calls w.d. bios%<br />
satisfy assumptions<br />
number of hard disks.<br />
i hdu ok if ok. leave everything alone.<br />
sp. 100h<br />
i vector<br />
ax.ax<br />
es.ax<br />
word ptr es:[intODlocn].cs:(offset ill int)<br />
word ptr es:[int0Dlocn+2].cs<br />
word ptr es:[int13locn].cs:(offset fd io)<br />
word ptr es:[int13locn+2].cs<br />
word ptr es:[int19locn].cs:(offset bt_int)<br />
word ptr es:[int19locn+2].cs<br />
Interrupt Vectors 20h and above to zero.<br />
re-initialize stack<br />
disable interrupts<br />
re-install old vectors for<br />
hard disk and<br />
floppy disk and<br />
; floppy disk and<br />
; int 40h<br />
; and the boot<br />
; and the boot<br />
; interrupt 19h<br />
word ptr es:[(4*40h)+OOOOh].ax <strong>ROM</strong> intialization messed up%<br />
word ptr es:[(4*40h)+0002h].ax ; es:di = absO_seg:int40locn<br />
1-135
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
c .-------------------------------------------------------------------------c<br />
:Test for and Initialize optional <strong>ROM</strong>s<br />
c .-------------------------------------------------------------------------c<br />
c assume cs:code, ds:nothing, es:nothing, ss:nothing<br />
c<br />
E405 BB C800 c mov bx,OC800h : load starting segment<br />
E408 c rom scan loop:<br />
c<br />
E408 8E DB c mov ds,bx bx has pending segment<br />
E40A 33 F6 c xor si,si offset OOOOh<br />
c<br />
E40C 81 3C AASS c cmp word ptr ds:[si],OAASSh<br />
E410 75 43 c jne rom scan next<br />
c<br />
E412 BE E276 R c mov si,cs:(offset opt <strong>ROM</strong>_m) indicate <strong>ROM</strong> detected<br />
E415 E8 E540 R c call DRomString<br />
E418 33 co c xor ax,ax<br />
c<br />
E41A E8 E578 R c call DHexLong ds:ax points at <strong>ROM</strong><br />
c<br />
E41D B8 OE20 c mov ax,(OEh*100h)+' put out SPACE<br />
E420 CD 10 c INT 10h<br />
c<br />
E422 B8 0040 c mov ax,data_seg satisfy assumptions<br />
E425 8E CO c mov es,ax for es in rom check<br />
E427 33 F6 c xor si,si ds:si points to <strong>ROM</strong> to check<br />
c<br />
c Now: ds:si = pointer to <strong>ROM</strong> to be tested<br />
c bx = ds = pending segment of <strong>ROM</strong> under test<br />
c es: = data segment<br />
c<br />
c assume cs:code, ds:nothing, es:data, ss:nothing<br />
c<br />
E429 33 co c xor ax,ax clear al<br />
E42B 8A 64 02 c mov ah,byte ptr ds:[si+2] ax = (<strong>ROM</strong> length/512) * 256<br />
E42E D1 EO c shl ax, 1 ax = (<strong>ROM</strong> length/512) * 512<br />
c ax = <strong>ROM</strong> length in bytes<br />
E430 50 c push ax save <strong>ROM</strong> length<br />
E431 B1 04 c mov cl,4<br />
E433 D3 E8 c shr ax.cl advance segment for next <strong>ROM</strong><br />
E435 03 08 c add bx.ax by the number of paragraphs<br />
E437 59 c pop ex restore <strong>ROM</strong> length in ex<br />
c<br />
E438 E8 E52D R c call rom checksum cnt get the checksum of the ex-<br />
c byte <strong>ROM</strong>.<br />
E43B 74 03 c jz rom chk sum ok OK if the checksum was zero<br />
E43D E9 E51A R c jmp rom err error the checksum wasn't zero<br />
c<br />
E440 c rom chksum ok:<br />
E440 53 c push bx save the segment for next <strong>ROM</strong><br />
c<br />
E441 26: C7 06 0067 R 0003 C mov word ptr es:[io_rom_init],0003h<br />
E448 26: 8C 1E 0069 R c mov word ptr es:[io_rom_seg],ds<br />
-<br />
E44D 26: FF 1E 0067 R c call dword ptr es:[io_rom_init] : initialize the <strong>ROM</strong><br />
1-136 <strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
-
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
E491 06 c push es<br />
E492 CD 13 c INT 13h bx, ex, dx, & ds preserved<br />
E494 07 c pop es restore return registers<br />
E495 58 c pop ax<br />
E496 50 c pop bp restore retry count<br />
c<br />
E497 73 08 c jnc i fdu ok error during read?<br />
-<br />
E499 40 c dec bp if so, decrement retry count<br />
E49A 75 E2 c jnz i fdu lp and try again<br />
c<br />
E49C BE DABO R c mov si,cs:(offset i fdu not_m) drive not ready message.<br />
E49F EB 03 c jmp short i fdu end<br />
E4A1 c i fdu ok:<br />
c<br />
E4A1 BE DAB4 R c mov si,cs:(offset i fdu_rdy_m) drive ready message.<br />
E4A4 c i fdu end:<br />
c<br />
E4A4 E8 E540 R c call DRomString<br />
E4A7 FB c sti<br />
c<br />
E4A8 c i init end:<br />
E4A8 BA 0378 c mov dx,0378h printer port<br />
E4AB BO 3F c mov al,3Fh OK status<br />
E4AD EE c out dx,al tell mfg tester<br />
E4AE E8 E55F R c call DCrlf<br />
c<br />
c<br />
E4B1 CD 19 c INT 19h go to boot-strap routine<br />
E4B3 c pcinit endp<br />
E4B3 c kb_cmd_send proc near<br />
c<br />
c<br />
c : Send command in AH to keyboard interface processor. AX is used.<br />
c<br />
c<br />
E4B3 c kb cmd wlup:<br />
E4B3 E4 64 c in al,kb status get 8041 port status<br />
E4B5 A8 02 c test al, 10b ready to receive?<br />
E4B7 75 FA c jnz kb_cmd_wlup<br />
c<br />
E4B9 8A C4 c mov al,ah ready, send command<br />
E4BB E6 60 c out p_kscan,al<br />
E4BD C3 c ret<br />
E4BE c kb cmd send endp<br />
E4BE c code ends<br />
c<br />
c<br />
c include pwrup2.asm<br />
c<br />
c ·======================================================================<br />
c Filename: pwrup2.src<br />
c<br />
c This module includes 8259 Interrupt, Video Controller, 82087<br />
c NPU, and 8254 & MM58274 Clock tests.<br />
c<br />
1-138 <strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong>
E4BE<br />
E4BE<br />
E4BE 50<br />
E4BF 52<br />
E4CO 56<br />
E4C1 88 F4<br />
E4C3 36: 8E 5C DE<br />
E4C7 36: 88 74 DC<br />
E4CB 83 EE 02<br />
E4CE 8A 04<br />
E4DO 3C CD<br />
E4D2 75 31<br />
E4D4 E8 ED50 R<br />
E4D7 E8 E509 R<br />
E4DA BE 0999 R<br />
E4DD E8 E540 R<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
c ·======================================================================<br />
c<br />
C code segment public '<strong>ROM</strong>'<br />
C assume cs:code, ds:nothing, es:nothing, ss:nothing<br />
c<br />
c ·======================================================================<br />
C Note: We are called from ill int ONLY (see vector.src), and<br />
stack looks like this:<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
(10)<br />
(DE)<br />
(DC)<br />
(OA)<br />
(08)<br />
(06)<br />
(04)<br />
(02)<br />
(00)<br />
High Address<br />
1------------------1
E51A<br />
E51A 8C 08<br />
E51C 26: 88 26 0015 R<br />
E521 BE D9CC R<br />
E524 E8 E540 R<br />
E527 EB 36 90<br />
E52A<br />
E52A<br />
E52A 89 2000<br />
E52D<br />
E52D 33 co<br />
E52F<br />
E52F AC<br />
E530 02 EO<br />
E532 E2 FB<br />
E534 OA E4<br />
E536 C3<br />
E537<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
c<br />
c<br />
c<br />
Input: ds<br />
es<br />
= segment of <strong>ROM</strong> under test<br />
= firmware data segment<br />
C Trash: All other registers except bx destroyed (in general).<br />
c .--------------------------------------------------------------------c<br />
C rom err proc near<br />
c assume cs:code, ds:nothing, es:data, ss:nothing<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
mov<br />
mov<br />
mov<br />
call<br />
jmp<br />
C rom err endp<br />
c<br />
c<br />
c<br />
ax,ds<br />
byte ptr es:[mfg err flag],ah<br />
si,cs:(offset fail m)<br />
DRomString<br />
DCrlf<br />
C assume cs:code, ds:nothing, es:nothing, ss:nothing<br />
c<br />
high byte of <strong>ROM</strong> address<br />
indicate <strong>ROM</strong> failed<br />
c .-----------------------------------------------------------------------<br />
(<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
Input:<br />
Output,<br />
Trash:<br />
ds:si = pointer to <strong>ROM</strong> to be tested<br />
ah = checksum for the <strong>ROM</strong><br />
ex = 0<br />
si = pointer to byte past <strong>ROM</strong><br />
zf = state of checksum for the <strong>ROM</strong><br />
al destroyed.<br />
c ·----------------------------------------------------------------------<br />
[<br />
C rom checksum proc near<br />
c assume cs:code, ds:nothing, es:nothing, ss:nothing<br />
c<br />
c<br />
c<br />
mov cx,2000h<br />
C rom checksum cnt:<br />
- -<br />
c xor ax,ax<br />
c<br />
C rom checksum loop:<br />
- -<br />
C lodsb<br />
C add ah, al<br />
loop rom checksum loop<br />
- -<br />
c<br />
c<br />
c<br />
or<br />
c ret<br />
c<br />
ah,ah<br />
C rom checksum endp<br />
c<br />
c<br />
clear ah<br />
12 al gets ds:si<br />
c ·======================================================================<br />
C Utility Routines:<br />
c<br />
3<br />
17<br />
1-141
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
E537<br />
E537 90<br />
E538 0040<br />
E53A<br />
E53A<br />
E53A 2E: 8E 1E E538 R<br />
E53F C3<br />
E540<br />
E540<br />
E540 1E<br />
E541 OE<br />
E542 1F<br />
E543 E8 E548 R<br />
E546 1F<br />
E547 C3<br />
E548<br />
E548<br />
E548 50<br />
E549 53<br />
E54A 56<br />
E54B 9C<br />
E54C FC<br />
E540 B3 01<br />
E54F AC<br />
E550 OA CO<br />
E552 74 06<br />
E554 B4 OE<br />
E556 CD 10<br />
E558 EB F5<br />
E55A<br />
E55A 90<br />
E55B 5E<br />
ESSC SB<br />
1-142<br />
c<br />
c<br />
c<br />
DRomString<br />
DHexLong<br />
DNum<br />
DString<br />
DHexWord<br />
DNumW<br />
DCrLf<br />
DHexByte<br />
DColon<br />
DHexNib<br />
c ·======================================================================<br />
c<br />
C p4 data1<br />
c<br />
C even<br />
c<br />
C set ds word<br />
c<br />
C p4 data1<br />
c<br />
c<br />
C set ds<br />
c<br />
c<br />
c<br />
c<br />
c<br />
C set ds<br />
mov<br />
ret<br />
proc near<br />
dw data seg 2 bytes 0 clocks<br />
endp<br />
proc near ; set ds to firmware data segment<br />
assume cs:code, ds:nothing, es:nothing, ss:nothing<br />
ds,word ptr cs:[set_ds_word]<br />
endp<br />
5 bytes 2+9+6 = 17 clocks<br />
1 byte = 8 clocks<br />
c ·======================================================================<br />
C Display ASCII String Utilities<br />
c ·======================================================================<br />
c<br />
C DRomString<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
push<br />
push<br />
pop<br />
call<br />
pop<br />
C ret<br />
C DRomString<br />
c<br />
C DString<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
push<br />
proc near ; Displays NUL terminated string at cs:si<br />
assume cs:code, ds:nothing, es:nothing, ss:nothing<br />
ds<br />
cs<br />
ds<br />
DString<br />
ds<br />
push bx<br />
push si<br />
pushf<br />
cld<br />
mov<br />
C OS lp: lodsb<br />
C or<br />
C je<br />
C mov<br />
C INT<br />
C jmp<br />
C OS ret:<br />
c<br />
c<br />
c<br />
popf<br />
pop<br />
pop<br />
endp<br />
proc near<br />
all registers saved<br />
ds gets cs<br />
restore ds<br />
; Displays NUL terminated string at ds:si<br />
assume cs:code, ds:nothing, es:nothing, ss:nothing<br />
ax ; all registers & flags saved<br />
bl,1<br />
al,al<br />
OS ret<br />
ah,OEh<br />
10h<br />
short OS lp<br />
si<br />
bx<br />
auto increment<br />
select foreground color for grafix modes<br />
al gets ds:si and si++<br />
NUL ?<br />
tty emulator<br />
restore registers & flags<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong>
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
ESSD 58 c pop ax<br />
ESSE C3 c ret<br />
ESSF c DString endp<br />
c<br />
ESSF c DCrlf proc near ; Displays a CR & LF.<br />
c assume CS:COde, ds:nothing, es:nothing, ss:nothing<br />
ESSF 50 c push ax all registers preserved<br />
E560 B8 OEOD c mov ax,(OEh*100h)+CR<br />
E563 CD 10 c INT 10h tty emulator<br />
E565 B8 OEOA c mov ax,(OEh*100h)+LF<br />
E568 CD 10 c INT 10h tty emulator<br />
E56A 58 c pop ax restore ax<br />
E56B C3 c ret<br />
E56C c DCrlf endp<br />
c<br />
E56C c DColon proc near ; Displays a :<br />
c assume CS:COde, ds:nothing, es:nothing, ss:nothing<br />
E56C 50 c push ax all registers preserved<br />
E56D 53 c push bx<br />
E56E B3 01 c mov bl.1 select foreground color for grafix modes<br />
E570 B8 OE3A c mov ax.(OEh*100h)+': ·<br />
E573 CD 10 c INT 10h tty emulator<br />
E575 SB c pop bx restore registers<br />
E576 58 c pop ax<br />
E577 C3 c ret<br />
E578 c DColon endp<br />
c<br />
c .;=====================================================================<br />
c Display Hexadecimal Number in ASCII Utilities<br />
c ·======================================================================<br />
c<br />
E578 c DHexlong proc near ; Displays ds:ax in ASCII<br />
c assume CS:COde, ds:nothing, es:nothing, ss:nothing<br />
E578 so c push ax all registers preserved<br />
E579 8C D8 c mov ax,ds ; display segment first<br />
E57B E8 E582 R c call DHexWord<br />
c<br />
E57E E8 E56C R c call DColon display a colon<br />
c<br />
E581 58 c pop ax restore ax<br />
c jmp short DHexWord fall through: display offset second<br />
c<br />
E582 c DHexLong endp<br />
c<br />
E582 c DHexWord proc near ; Displays ax in ASCII<br />
c assume CS:COde, ds:nothing, es:nothing, ss:nothing<br />
E582 so c push ax all registers preserved<br />
E583 8A C4 c mov al,ah<br />
E585 E8 E589 R c call DHexByte display high byte first<br />
E588 58 c pop ax restore ax<br />
c jmp short DHexByte fall through: display low byte second<br />
c<br />
E589 c DHexWord endp<br />
c<br />
E589 c DHexByte proc near Displays al in ASCII<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong> 1-143
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
E589 50<br />
E58A DO C8<br />
E58C DO C8<br />
ESSE DO C8<br />
E590 DO C8<br />
E592 E8 E596 R<br />
E595 58<br />
E596<br />
E596<br />
E596 50<br />
E597 53<br />
E598 B3 01<br />
E59A 24 OF<br />
E59C 04 30<br />
E59E 3C 39<br />
ESAO 76 02<br />
ESA2 04 07<br />
ESA4 B4 DE<br />
ESA6 CD 10<br />
ESA8 SB<br />
ESA9 58<br />
ESAA C3<br />
ESAB<br />
ESAB<br />
ESAB 53<br />
ESAC 33 DB<br />
ESAE E8 ESB3 R<br />
ESB1 SB<br />
ESB2 C3<br />
ESB3<br />
ESB3<br />
ESB3 50<br />
ESB4 53<br />
ESBS 51<br />
ESB6 52<br />
ESB7 56<br />
ESB8 BE OOOA<br />
ESBB 33 C9<br />
ESBD<br />
ESBD 33 D2<br />
1-144<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
C DHexByte<br />
c<br />
C DHexNib<br />
c<br />
push<br />
ror<br />
ror<br />
ror<br />
ror<br />
call<br />
pop<br />
jmp<br />
C push<br />
C push<br />
C mov<br />
c and<br />
C add<br />
C cmp<br />
C jbe<br />
C add<br />
C NibOk: mov<br />
C INT<br />
C pop<br />
C pop<br />
C ret<br />
C DHexNib<br />
c<br />
assume cs:code, ds:nothing, es:nothing, ss:nothing<br />
ax<br />
al,1<br />
al,1<br />
al,1<br />
al, 1<br />
DHexNib<br />
ax<br />
short DHexNib<br />
endp<br />
; all registers preserved<br />
move high nibble to low nibble<br />
display high nibble in ASCII<br />
restore ax<br />
fall through: display low nibble in ASCII<br />
proc near ; Displays low nibble of al in ASCII<br />
assume cs:code, ds:nothing, es:nothing, ss:nothing<br />
ax<br />
bx<br />
bl,1<br />
al,Ofh<br />
al, '0'<br />
al, '9'<br />
NibOk<br />
al, 'A'-'0'-10<br />
ah,OEh<br />
10h<br />
bx<br />
ax<br />
endp<br />
all registers preserved<br />
select foreground color for grafix modes<br />
clear high nibble<br />
'0'
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
73 74 65 60 20 62 c<br />
6F 61 72 64 00 c<br />
E618 50 61 72 69 74 79 c parity2_m db 'Parity error on expansion board' ,NUL<br />
20 65 72 72 6F 72 c<br />
20 6F 6E 20 65 78 c<br />
70 61 6E 73 69 6F c<br />
6E 20 62 6F 61 72 c<br />
64 00 c<br />
E638 c enable_parity endp<br />
E638 c OP INT PROC NEAR<br />
c<br />
c<br />
c ·=======================================================================<br />
c INT 06H -- Illegal Opcode Interrupt Routine%<br />
c<br />
c Purpose: To intercept certain (well-used) illegal%<br />
c opcodes. Note that this vector is installed%<br />
c i vector.%<br />
c<br />
c ·=======================================================================<br />
c<br />
c<br />
E638 FA c eli stop intrs%<br />
c This routine checks for MOV CS
E65C OS 0002<br />
E65F 50<br />
E660 83 EC 02<br />
E663 58<br />
E664 CF<br />
E665<br />
E665<br />
E665<br />
E665<br />
E665 50<br />
E666 E8 F603 R<br />
E669 8A 46 03<br />
E66C 3C 01<br />
E66E 76 1F<br />
E670 3C 06<br />
E672 73 1B<br />
E674 AO 0041 R<br />
E677 OA CO<br />
E679 75 17<br />
E67B 8A 87 0090 R<br />
E67F A8 10 90 90<br />
E683 75 sc<br />
E685 oc 10 90 90<br />
E689 04 03<br />
E68B 88 87 0090 R<br />
E68F<br />
E68F EB 50 90<br />
E692<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
OP INT ENDP<br />
code ends<br />
include fdu6.asm<br />
ADD AX,2 ;%<br />
PUSH AX ;%<br />
SUB SP,Z ;%<br />
POP AX ;%<br />
IRET ;%<br />
;retore AX register%<br />
C code segment public '<strong>ROM</strong>'<br />
C assume cs:code, ds:data, es:nothing, ss:nothing<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
c ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; '';;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;''' ', ''''';;; '';;;;<br />
c<br />
C file fdu6.asm<br />
c<br />
c ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ';; '' ''';;;;;;;;;;;;;;;;;;;;;' ';;;;;;;;;;' ''''<br />
c<br />
c<br />
c ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;<br />
c<br />
C Test for Retry<br />
c<br />
C Routine checks for certain commands and error conditions<br />
C If no retry is needed, the disk-state is made 'established'<br />
C When a retry is needed, disk-state and f head are changed.<br />
C CY is set/cleared as appropriate<br />
c<br />
C note: state transitions are odd.<br />
c<br />
c ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
f_tstretry<br />
f_jmpnr:<br />
f dskerr:<br />
push<br />
call<br />
mov<br />
cmp<br />
jbe<br />
cmp<br />
jae<br />
mov<br />
or<br />
jnz<br />
mov<br />
test<br />
jnz<br />
or<br />
add<br />
mov<br />
jmp<br />
proc near<br />
ax<br />
f_getdrv<br />
al,f command<br />
al.1<br />
f jmpnr<br />
al,6<br />
f jmpnr<br />
al,diskette status<br />
al,al<br />
f dskerr<br />
al,diskstate[bx]<br />
-<br />
al,ESTAB<br />
f_noretry<br />
al,ESTAB<br />
al,3<br />
diskstate[bx],al<br />
f noretry<br />
savefunction info%<br />
get drive number in bl%<br />
get original cmd%<br />
reset/status cmd?%<br />
yes, exit%<br />
special cmds?%<br />
yes. no special handling here%<br />
hold status info%<br />
test error msg%<br />
jmp if error%<br />
no errors. massage state%<br />
is it established??%<br />
yes it is, jump out%<br />
no, state is now confirmed%<br />
state part was unestab, add w/o fear%<br />
record new state%<br />
added for 127-byte jump to f_noretry %<br />
done<br />
1-147
E6E4<br />
E6F2<br />
E6F2<br />
E6F2 E9 F876 R<br />
E6F5<br />
E6F5<br />
E6F5<br />
E6F5<br />
E6F5 80 FC 88<br />
E6F8 75 DB<br />
E6FA 1E<br />
E6FB 2E: 8E 1E E538 R<br />
E700 A1 OOCA R<br />
E703 1F<br />
E704 CF<br />
E705<br />
E705 F9<br />
E706 B4 86<br />
E708 CA 0002<br />
E70B<br />
E70B<br />
E7DB<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
c Fi.lename: boot1.src<br />
c<br />
C This module includes the ORG"d jump to INT 19h (boot2.src)<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
c<br />
c ·======================================================================<br />
c<br />
C code<br />
segment public '<strong>ROM</strong>'<br />
c assume cs:code, ds:nothing, es:nothing, ss:nothing<br />
c<br />
c ORG OE6F2h<br />
c<br />
C bt_jmp proc near<br />
c<br />
c<br />
c<br />
jmp<br />
C bt_jmp endp<br />
c<br />
bt int<br />
C code ends<br />
C include memx.asm<br />
C code segment public '<strong>ROM</strong>'<br />
C assume cs:code, ds:nothing, es:nothing, ss:nothing<br />
c<br />
C add mem code proc far<br />
C assume cs:code, ds:nothing, es:nothing, ss:nothing<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
cass:<br />
cmp<br />
jne<br />
push<br />
mov<br />
mov<br />
pop<br />
iret<br />
stc<br />
mov<br />
ret<br />
ah,88h<br />
cass<br />
assume ds:data<br />
ds<br />
ds,word ptr cs:[set_ds_word]<br />
ax,ds:[seg_fail]<br />
ds<br />
ah,86h<br />
C add mem code endp<br />
c<br />
c<br />
c<br />
c<br />
C code ends<br />
C include comm1.asm<br />
2<br />
necessary jump for ORG<br />
; see if request for mem above 1 Mb<br />
error<br />
satisfy assumptions<br />
c ·======================================================================<br />
c<br />
c<br />
Filename: com1.src<br />
C This module, com2, and com3 supply INT 14h.<br />
c<br />
c ·======================================================================<br />
c<br />
C code<br />
c<br />
segment public '<strong>ROM</strong>'<br />
assume cs:code, ds:nothing, es:nothing, ss:nothing<br />
1-149
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
= 0080<br />
= 0020<br />
= 0008<br />
= 0004<br />
= 0002<br />
= 0001<br />
= 0020<br />
= 0010<br />
= 0002<br />
= 0001<br />
= 0004<br />
= 0001<br />
= 0040<br />
= 0020<br />
= 0010<br />
1-150<br />
c<br />
c .--------------------------------------------------------------------c<br />
INS8250 Compatible Line Status Bits (ah) for Z8530 SCC Re-Mapping<br />
c (8530 not used on the <strong>6300</strong> PLUS)<br />
c .--------------------------------------------------------------------c<br />
c com te<br />
equ 80h time out error (bit #7)<br />
-<br />
c com txd<br />
equ 20h transmit ready (bit #5)<br />
c com fe<br />
equ 08h framing error (bit #3)<br />
c com_pe<br />
equ 04h parity error (bit #2)<br />
c com oe<br />
equ 02h overrun error (bit #1)<br />
c com rxd<br />
c<br />
equ 01h receive ready (bit #0)<br />
c .--------------------------------------------------------------------c<br />
INS8250 Compatible Modem Status Bits (al) for Z8530 SCC Re-Mapping<br />
C (8530 not used on the <strong>6300</strong> PLUS)<br />
c .----------------------------------------------------------------------<br />
c<br />
C com dsr<br />
C com cts<br />
c<br />
equ<br />
equ<br />
20h<br />
10h<br />
data set ready (bit #5)<br />
clear to send (bit #4)<br />
c .---------------------------------------------------------------------c<br />
INS8250 Compatible Modem Control Bits.<br />
c .----------------------------------------------------------------------<br />
c<br />
C com rts<br />
C com dtr<br />
equ<br />
equ<br />
02h<br />
01h<br />
request to send (bit #1)<br />
data terminal ready (bit #0)<br />
c<br />
c .--------------------------------------------------------------------c<br />
Z8530 SCC Status Register (Read Register #0)<br />
c (8530 not used on the <strong>6300</strong> PLUS)<br />
c ·----------------------------------------------------------------------<br />
c<br />
C sec txd<br />
C sec rxd<br />
equ<br />
equ<br />
04h<br />
01h<br />
transmit ready (bit #2)<br />
receive ready (bit #0)<br />
c<br />
c ·--------------------------------------------------------------------c<br />
Z8530 SCC Error Register (Read Register #1)<br />
c (8530 not used on the <strong>6300</strong> PLUS)<br />
c .--------------------------------------------------------------------c<br />
C sec fe<br />
equ 40h<br />
C sec oe<br />
c sec pe<br />
equ<br />
equ<br />
20h<br />
10h<br />
c<br />
c .--------------------------------------------------------------------c<br />
INS8250 Asynchronous Communication Chip Baud Rate Time Constants<br />
C (baud rate generator signal is 3.6864 MHz put through a<br />
C<br />
c<br />
divide-by-2 circuit.<br />
C ((3,686,400 Hz)/2) = Input Freq.<br />
C Time Constant = --------------------------------<br />
C (16)*(baud rate)<br />
c .--------------------------------------------------------------------c<br />
framing error (bit #6)<br />
overrun error (bit #5)<br />
parity error (bit #4)<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong>
E729 c<br />
c<br />
E729 c<br />
c<br />
E729 0417 c<br />
E72B 0300 c<br />
E72D 0180 c<br />
E72F ooco c<br />
E731 0060 c<br />
E733 0030 c<br />
E735 0018 c<br />
E737 oooc c<br />
c<br />
E739 c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
com data1 proc<br />
ORG OE729h<br />
com baud dw 1047 110 baud (0)<br />
dw 768 150 baud (1)<br />
dw 384 300 baud (2)<br />
dw 192 600 baud (3)<br />
dw 96 1200 baud (4)<br />
dw 48 2400 baud (5)<br />
dw 24 4800 baud (6)<br />
dw 12 9600 baud (7)<br />
com data1 endp<br />
Z8530 Serial Communication Controller Baud Rate Time Constants<br />
(baud rate generator signal is 3.6864 MHz)<br />
(NO divide-by-2 circuitl!! !)<br />
(8530 not used on the <strong>6300</strong> PLUS)<br />
(3,686,400 Hz) = Input Freq.<br />
Time Constant = ---------------------------- - 2<br />
(16)*(2)*(baud rate)<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
NOTE: These values are the SAME as the above EXCEPT for the - 2! I I 1<br />
;SCC baud dw 1045 110 baud (0)<br />
dw 766 150 baud (1)<br />
dw 382 300 baud (2)<br />
dw 190 600 baud (3)<br />
dw 94 1200 baud (4)<br />
dw 46 2400 baud (5)<br />
dw 22 4800 baud (6)<br />
dw 10 9600 baud (7)<br />
INT 14h -- RS-232 Software Interrupt Request Routine<br />
Assumes:<br />
Similarly:<br />
Z8530 Note:<br />
INS8250 port addresses are > 256. That is, the<br />
high byte of the port address is nonzero, if and<br />
only if, the port is a INS8250. (e.g. com_a ports<br />
are 03F8h- 03FFh & com_b ports are 02F8h- 02FFh.)<br />
Z8530 port addresses are < 256. That is, the<br />
high byte of the port address is zero, if and<br />
only if, the port is a Z8530. (e.g. scc_a ports<br />
are 0050h - 0051h & scc_b ports are 0052h - 0053h.)<br />
For the reset during power-up, DTR and RTS must be<br />
set low which is the only difference from a normal<br />
reset (AH=O). This is accomplished by a special<br />
function code (AH=OFFh). (8530 not used on<br />
the <strong>6300</strong> PLUS) .<br />
1-151
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
c ·======================================================================<br />
c<br />
E739 c ORG OE739h<br />
c<br />
E739 c serial io proc near<br />
c assume cs:code, ds:nothing, es:nothing, ss:nothing<br />
c<br />
E739 FB c sti enable interrupts<br />
c<br />
E73A 55 c push bp save register<br />
c<br />
E73B 83 FA 04 c cmp dx,4 4 RS-232 channels allowed max<br />
E73E 73 30 c jae rs nop<br />
c<br />
E740 8B E8 c mov bp,ax save original function code<br />
E742 80 FC FF c cmp ah,OFFh power-up reset?<br />
E745 75 02 c jne rs norm jump if no<br />
E747 32 E4 c xor ah,ah same as reset, BP remembers FF<br />
c<br />
E749 c rs norm:<br />
-<br />
E749 80 FC 03 c cmp ah,03h input out of range?<br />
E74C 77 2F c ja rs nop<br />
c<br />
c assume cs:code, ds:data, es:nothing, ss:nothing<br />
c<br />
E74E 52 c push dx ; save registers<br />
E74F 51 c push ex<br />
E750 53 c push bx<br />
E751 1E c push ds save ds<br />
E752 2E: 8E 1E E538 R c mov ds,word ptr cs:[set_ds_word] satisfy assumptions<br />
c<br />
E757 8B OA c mov bx,dx get port number (0-3)<br />
E759 33 C9 c xor cx,cx clear ch<br />
E75B 8A 8F 007C R c mov cl,byte ptr ds:[bx+serial_t_out] get RS-232 time-out<br />
E75F 01 E3 c shl bx,1 make word index<br />
E761 8B 97 DODO R c mov dx,word ptr ds:[bx+rs232_addr] get address of RS-232<br />
c data port<br />
E765 1F c pop ds restore ds<br />
c<br />
c assume cs:code, ds:nothing, es:nothing, ss:nothing<br />
c<br />
E766 DB 02 c or dx,dx RS-232 port present?<br />
E768 74 10 c jz rs ret if not, leave<br />
c<br />
E76A OA F6 c or dh,dh are we a INS8250 chip?<br />
E76C 75 03 c jnz rs ok if so, take jump<br />
c<br />
E76E 80 C4 04 c add ah,4 if sec Z853D and 4 to function<br />
c<br />
E771 c rs ok:<br />
E771 8A DC c mov bl,ah bx = function number<br />
E773 01 E3 c shl bx, 1 bx = 2*(function number)<br />
E775 2E: FF 97 E77F R c call cs:[bx+(offset rs_tbl)] perform rs232 function<br />
c<br />
E77A c rs ret:<br />
-<br />
1-152 <strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong>
E77A 58<br />
E77B 59<br />
E77C SA<br />
E77D<br />
E77D 50<br />
E77E CF<br />
E77F E787 R<br />
E781 E8B6 R<br />
E783 E8E2 R<br />
E785 E87D R<br />
E787<br />
E787<br />
E787 52<br />
E788 8A E8<br />
E78A BO 80<br />
E78C 83 C2 03<br />
E78F EE<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
c<br />
c<br />
c<br />
C rs nop:<br />
pop<br />
pop<br />
pop<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
c<br />
c<br />
c<br />
c .----------------------------------------------------------------------<br />
pop<br />
iret<br />
bx<br />
ex<br />
dx<br />
bp<br />
C INT 14h Jump Table<br />
restore registers<br />
c .----------------------------------------------------------------------<br />
[<br />
c rs tbl dw<br />
c dw<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
C serial io<br />
c<br />
c<br />
dw<br />
dw<br />
dw<br />
dw<br />
dw<br />
dw<br />
com init<br />
com pb<br />
com_gb<br />
com stat<br />
sec init<br />
sec pb<br />
scc_gb<br />
sec stat<br />
endp<br />
ah = DOh for INS8250<br />
ah = 01h for INS8250<br />
ah = 02h for INS8250<br />
ah = 03h for INS8250<br />
ah = DOh for sec Z8530%<br />
ah = 01h for sec Z8530%<br />
ah = 02h for sec Z8530%<br />
ah = 03h for sec Z8530%<br />
c ·----------------------------------------------------------------------<br />
[ Initialize RS-232 Interface.<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
Input: al =<br />
dx =<br />
Output: ax =<br />
input parameters<br />
address of RS-232 channel<br />
RS-232 channel status<br />
al initializes port with: bit # 7 6 5 4 3 2 1 0<br />
Baud (BBB): Parity (PP):<br />
0 = 110 4 = 1200<br />
1 = 150 5 = 2400<br />
2 = 300 6 = 4800<br />
3 = 600 7 = 9600<br />
xo = None<br />
+-+-+-+-+-+-+-+-+<br />
IBIBIBIPIPISIDIDI<br />
+-+-+-+-+-+-+-+-+<br />
Stop Bits (S): Data Bits (DO):<br />
c<br />
c<br />
c .----------------------------------------------------------------------<br />
[<br />
C com init<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
Assumes:<br />
push<br />
mov<br />
mov<br />
add<br />
out<br />
01 = Odd 1 = 2<br />
11 = Even<br />
0 = 1 10 = 7<br />
com int x = com data x + 1 = dx + 1<br />
com lctl x = com data x + 3 = dx + 3<br />
proc near : ah = DOh<br />
assume cs:code, ds:nothing, es:nothing, ss:nothing<br />
dx<br />
ch,al<br />
al. 080h<br />
dx.3<br />
11 = 8<br />
(00 = 5?)<br />
(01 = 6?)<br />
save dx = com data x<br />
save input parameters.<br />
access divisor latch of<br />
baud count register.<br />
dx = com lctl x<br />
dx.al write to line control register<br />
1-153
E82E<br />
E82E<br />
C Trash: None. ( bx & ds if <strong>ROM</strong> stack)<br />
c<br />
C Note: The stack never gets deeper than 6 words I! 1<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
High Address<br />
1------------------1
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
E845<br />
E845 FB<br />
E846 E8 E854 R<br />
E849 74 FA<br />
E84B E8 E86E R<br />
E84E 89 1E 001A R<br />
E852 EB EE<br />
E854 FA<br />
E855 8B 1E 001A R<br />
E859 3B 1E 001C R<br />
E85D 8B 07<br />
E85F C3<br />
E860<br />
E860<br />
E860 E8 E854 R<br />
E863 FB<br />
E864 SB<br />
E865 1F<br />
E866 CA 0002<br />
E869<br />
1-156<br />
c Trash: None.<br />
c .----------·------------------------------------------------------------<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
k read<br />
k see:<br />
k read<br />
proc<br />
assume<br />
sti<br />
call<br />
jz<br />
call<br />
mov<br />
jmp<br />
eli<br />
mov<br />
cmp<br />
mov<br />
ret<br />
endp<br />
near<br />
CS:COde, ds:data, es:nothing, ss:nothing<br />
enable interrupts (again)<br />
k see is there a character present?<br />
interrupts come back disabled!<br />
k read loop until something in buffer<br />
-<br />
k adv ptr move pointer to next position<br />
word ptr ds:[buffer_head],bx store value in variable<br />
short k ret<br />
disable interrupts I 1<br />
bx,word ptr ds:[buffer_head] get pointer to head of buffer<br />
bx,word ptr ds:[buffer_tail] if equal, then nothing there<br />
ax,word ptr ds:[bx] get scan code and ascii code<br />
c .---------------------------------------------------------------------c<br />
Checks for key in keyboard buffer, but does not extract it.<br />
c<br />
C Output: if key is in buffer, then:<br />
C zf = 0 (nz = reset)<br />
C ah = raw scan code<br />
C al = ASCII translated key<br />
C or<br />
C ah = translated key<br />
C al = DOh<br />
C else:<br />
C zf = 1 (z = set)<br />
C ax = 16th previous key<br />
c<br />
C Trash: ax is trashed if keyboard buffer is empty.<br />
c ·----------------------------------------------------------------------<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
k look proc far ; must be far I 11 1<br />
assume cs:code, ds:data, es:nothing, ss:nothing<br />
k look endp<br />
call k see is there a character present?<br />
interrupts come back disabled!<br />
sti must return interrupts enabled<br />
pop bx restore registers<br />
pop ds blow away flags returning:<br />
ret 2 zf & ax = k see output, & sti<br />
c .----------------------------------------------------------------------<br />
c<br />
c<br />
Returns keyboard shift state kb_flag in al.<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong>
E869<br />
E869 AO 0017 R<br />
E86C EB 04<br />
E86E<br />
E86E<br />
E86E 43<br />
E86F 43<br />
E870 3B 1E 0082 R<br />
E874 75 04<br />
E876 8B 1E 0080 R<br />
E87A<br />
E87A C3<br />
E87B<br />
E87B<br />
E87B<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
c Output: ah = 0.<br />
c al = kb flag<br />
C Trash: None.<br />
c .----------------------------------------------------------------------<br />
[<br />
C k stat proc near<br />
C assume cs:code, ds:data, es:nothing, ss:nothing<br />
c<br />
c<br />
c<br />
c<br />
mov al,byte ptr ds:[kb_flag]<br />
jmp short k ret<br />
; get the shift status flags<br />
C k stat endp<br />
c<br />
c ·----------------------------------------------------------------------<br />
[ Advances kb buffer ring buffer pointer.<br />
c<br />
C Input: bx<br />
c Output: bx<br />
c Trash: None.<br />
c .----------------------------------------------------------------------<br />
c<br />
C k adv ptr proc near<br />
c assume cs:code, ds:data, es:nothing, ss:nothing<br />
c<br />
c inc<br />
c inc<br />
C cmp<br />
c jne<br />
C mov<br />
C k adv end:<br />
C ret<br />
c<br />
C k adv ptr endp<br />
c<br />
c code ends<br />
bx<br />
bx<br />
bx,word ptr ds:[buffer end]<br />
k adv end<br />
bx,word ptr ds:[buffer_start]<br />
move to next word in list<br />
end of buffer ?<br />
no, continue<br />
yes, buffer to beginning<br />
C include comm2.asm<br />
c ·======================================================================<br />
C<br />
c<br />
Filename: com2. src<br />
c ·======================================================================<br />
c<br />
C code segment public '<strong>ROM</strong>'<br />
c assume cs:code, ds:nothing, es:nothing, ss:nothing<br />
c<br />
c .--------------------------------------------------------------------c<br />
Read Status of RS-232 Interface. (rs_stat)<br />
C<br />
c<br />
(8530 not used on the <strong>6300</strong> PLUS)<br />
C Input: dx = if dh = 0, then address of Z8530 channel (sec ctl x).<br />
C if dh 0, then address of 8250 data port (com_data x).<br />
C Output: ax = RS-232 (INS8250-compatible) channel status.<br />
C<br />
c<br />
Trash: None.<br />
1-157
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
E87B<br />
E87B OA F6<br />
E87D<br />
E87D 52<br />
E87E 83 C2 OS<br />
E881 EC<br />
E882 8A EO<br />
E884 42<br />
E885 EC<br />
E886 SA<br />
E887 C3<br />
1-158<br />
c Assumes: com lstat x = com data x + 5 = dx + 5 (line status)<br />
C com_mstat x = com_data x + 6 = dx + 6 (modem status)<br />
c .---------------------------------------------------------------------c<br />
C rs stat proc near ; ah = 03h<br />
C assume cs:code, ds:nothing, es:nothing, ss:nothing<br />
c<br />
c<br />
c<br />
c<br />
c<br />
C com stat:<br />
c<br />
or<br />
jz<br />
C Get Line Status.<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
push<br />
add<br />
in<br />
mov<br />
dh,dh<br />
sec stat<br />
dx<br />
dx,S<br />
al,dx<br />
ah,al<br />
C Get Modem Status.<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
inc<br />
in<br />
pop<br />
ret<br />
C ;SCC stat:<br />
c<br />
dx<br />
al,dx<br />
dx<br />
C Get Channel Status.<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
xor<br />
out<br />
call<br />
in<br />
test<br />
jz<br />
C or<br />
C ;sec no txd:<br />
c<br />
c<br />
c<br />
c<br />
c<br />
test<br />
jz<br />
or<br />
C ;sec no rxd:<br />
c<br />
ax,ax<br />
dx,al<br />
rs_dly<br />
al,dx<br />
C , , Get Error Status.<br />
c<br />
c<br />
c<br />
c<br />
c<br />
mov<br />
out<br />
call<br />
in<br />
al,scc txd<br />
sec no txd<br />
ah,com txd<br />
al,scc rxd<br />
sec no rxd<br />
ah,com rxd<br />
al,1<br />
dx,al<br />
rs_dly<br />
al,dx<br />
are we a sec Z8530 chip?<br />
if so, take jump%<br />
INS8250 read status routine.<br />
save dx = com data x<br />
dx = com lstat x<br />
get line status<br />
line status comes back in high byte<br />
dx = com mstat x<br />
get modem status in low byte<br />
restore dx = com data x<br />
sec Z8530 read status routine.<br />
al = selects 0 ah = no errors<br />
dx = sec ctl x<br />
get channel status<br />
test for transmit ready<br />
if so, set INS8250-compatible bit.<br />
test for receive ready<br />
if so, set INS8250-compatible bit.<br />
get errors<br />
dx = sec ctl x<br />
get error status<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong>
E888<br />
E888<br />
E888 51<br />
E889 33 DB<br />
E88B 87 CB<br />
E88D<br />
E88D OA F6<br />
E88F 75 06<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
test<br />
jz<br />
or<br />
;sec no fe:<br />
test<br />
jz<br />
or<br />
;sec no pe:<br />
test<br />
jz<br />
or<br />
;sec no oe:<br />
C , , Set Modem Status.<br />
c<br />
c<br />
c<br />
c<br />
mov<br />
ret<br />
C rs stat endp<br />
al,scc fe test for framing error<br />
sec no fe<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
ah,com fe if so. set INS8250-compatible bit.<br />
al,scc pe test for parity error<br />
sec no pe<br />
ah,com pe if so, set INS8250-compatible bit.<br />
al,scc oe test for overrun error<br />
sec no oe<br />
ah,com oe if so, set INS8250-compatible bit.<br />
al,(com_dsr+com_cts) al = DSR and CTS<br />
c<br />
c ·--------------------------------------------------------------------c<br />
Wait for Status of RS-232 Interface. (rs_ws)<br />
C<br />
c<br />
(8530 not used on the <strong>6300</strong> PLUS)<br />
c Input: ah = RS-232 channel status for which to wait<br />
ex = RS-232 time-out<br />
dx = if dh = 0, then address of Z8530 channel (sec ctl x).<br />
if dh 0, then address of 8250 data port to poll.<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
Output: AH =<br />
ZF =<br />
C Trash: al & bx destroyed.<br />
c<br />
c<br />
c<br />
Status.<br />
set, if status matches.<br />
reset, if time-out.<br />
Assumes: com lstat x = com data x + 5 = dx + 5 (line status)<br />
com mstat x = com data x + 6 = dx + 6 (modem status)<br />
c ·----------------------------------------------------------------------<br />
[<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
rs ws proc<br />
assume<br />
push<br />
xor<br />
xchg<br />
rs ws lp:<br />
or<br />
jnz<br />
near<br />
cs:code, ds:nothing, es:nothing, ss:nothing<br />
ex save time-out<br />
bx,bx clear bx<br />
cx,bx BL now has rs232 time out.<br />
dh,dh are we an INS8250 chip?<br />
rs ws com if so, take jump<br />
1-159
E8B6<br />
E8B6 52<br />
E8B7 50<br />
E8B8 BO 03<br />
E8BA 83 C2 04<br />
E8BD EE<br />
E8BE B4 30<br />
E8CO 42<br />
E8C1 42<br />
E8C2 E8 E888 R<br />
E8C5 75 13<br />
E8C7 B4 20<br />
E8C9 4A<br />
E8CA E8 E888 R<br />
E8CD 75 DB<br />
E8CF 58<br />
E8DO SA<br />
E8D1 8A 08<br />
E803 E8 E87B R<br />
E806 8A C3<br />
E808 EE<br />
E8D9<br />
E809 C3<br />
E8DA<br />
E8DA 5B<br />
E8DB SA<br />
E8DC 8A C3<br />
E8DE 80 CC 80<br />
E8E1 C3<br />
E8E2<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
c<br />
c<br />
c<br />
c<br />
Assumes: com mctl x = com data x + 4 = dx + 4<br />
com lstat x = com data x + 5 = dx + 5<br />
com mstat x = com data x + 6 = dx + 6<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
c<br />
c .----------------------------------------------------------------------<br />
c<br />
C com pb proc<br />
C assume<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c rs_pb_gb:<br />
c<br />
c<br />
c<br />
C rs pbe:<br />
c<br />
c<br />
c<br />
c<br />
c , ,<br />
c<br />
c<br />
c<br />
c<br />
push<br />
push<br />
mov<br />
add<br />
out<br />
mov<br />
inc<br />
inc<br />
call<br />
jnz<br />
mov<br />
dec<br />
call<br />
jnz<br />
pop<br />
pop<br />
mov<br />
call<br />
mov<br />
out<br />
ret<br />
pop<br />
pop<br />
call<br />
mov<br />
or<br />
ret<br />
C com pb endp<br />
c<br />
c<br />
C ;sec pb proc<br />
C assume<br />
sec data x = sec ctl x + 1 = dx + 1<br />
near : ah = 01h<br />
cs:code, ds:nothing, es:nothing, ss:nothing<br />
dx<br />
ax<br />
al,(com_rts+com_dtr)<br />
dx,4<br />
dx,al<br />
ah,(com_dsr+com_cts)<br />
dx<br />
dx<br />
rs ws<br />
rs pbe<br />
ah,com txd<br />
dx<br />
rs ws<br />
rs pbe<br />
ax<br />
dx<br />
bl,al<br />
rs stat<br />
al,bl<br />
dx,al<br />
bx<br />
dx<br />
rs stat<br />
al,bl<br />
ah,com te<br />
save dx = com data x<br />
save character to output in al<br />
signal RTS & DTR<br />
dx = com mctl x<br />
near : ah = 01h<br />
send to modem control register<br />
wait for DSR & CTS<br />
dx = com mstat x<br />
wait for modem status register<br />
if time-out, take jump<br />
wait for transmit ready<br />
dx = com lstat x<br />
wait for line status register<br />
if time-out, take jump<br />
restore character to output in al<br />
restore dx = com data x<br />
save character input/output in bl<br />
get return status<br />
restore character input/output in al<br />
else, output the character<br />
exit for put and get byte<br />
if sec Z8530, dx = sec ctl x<br />
exit for put byte error<br />
restore character to output in bl<br />
if sec Z8530, restore dx = sec ctl x<br />
else INS8250, restore dx = com data x<br />
get return status<br />
restore character to output in al<br />
indicate timeout error<br />
cs:code, ds:nothing, es:nothing, ss:nothing<br />
1-161
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
E8E2 c<br />
c<br />
c<br />
E8E2 52 c<br />
E8E3 80 01 c<br />
E8E5 83 C2 04 c<br />
E8E8 EE c<br />
E8E9 B4 20 c<br />
E8EB 42 c<br />
E8EC 42 c<br />
E8ED E8 E888 R c<br />
E8FO 75 DE c<br />
E8F2 B4 01 c<br />
E8F4 4A c<br />
E8F5 E8 E888 R c<br />
1-162<br />
c<br />
c<br />
;SCC pb endp<br />
com_gb<br />
push dx<br />
push ax<br />
mov ah,scc txd<br />
call rs ws<br />
jnz rs pbe<br />
pop ax<br />
inc dx<br />
out dx,al<br />
pop dx<br />
-<br />
jmp short rs_pb_gb<br />
save dx = sec ctl x<br />
save character to output in al<br />
wait for transmit ready<br />
if time-out, take jump<br />
restore character to output in al<br />
dx = sec data x<br />
else, output the character<br />
restore dx = sec ctl x<br />
INS8250 Get Byte (com_gb) & SCC Z8530 Get Byte (sec gb)<br />
(8530 not used on the <strong>6300</strong> PLUS)<br />
Receive Character to RS-232 Interface.<br />
Input: ex = RS-232 time-out<br />
dx = if dh = 0, then address of Z8530 channel (scc_ctl_x).<br />
if dh 0, then address of 8250 data port (com_data x).<br />
Output: al = character received<br />
ah = line status<br />
Trash: bx destroyed.<br />
Assumes: com mctl x = com data x + 4 = dx + 4<br />
com lstat x = com data x + 5 = dx + 5<br />
com mstat x = com data x + 6 = dx + 6<br />
sec data x = sec ctl x + 1 = dx + 1<br />
proc near : ah = 02h<br />
assume CS:COde, ds:nothing, es:nothing, ss:nothing<br />
push dx save dx = com data x<br />
mov al,com dtr signal DTR<br />
add dx,4 dx = com mctl x<br />
out dx.al send to modem control register<br />
mov ah,com dsr wait for DSR<br />
inc dx<br />
inc dx dx = com mstat x<br />
call rs ws wait for modem status register<br />
jnz rs gbe if time-out, take jump<br />
-<br />
mov ah,com rxd wait for receive ready<br />
dec dx dx = com lstat x<br />
call rs ws wait for line status register<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong>
E8F8 7S 06<br />
E8FA 80 E4 DE<br />
E8FD SA<br />
E8FE EC<br />
E8FF C3<br />
E900<br />
E900 SA<br />
E901 80 CC 80<br />
E904 C3<br />
E90S<br />
E90S<br />
E90S<br />
E90S<br />
E90S E8 F603 R<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
rs gbe:<br />
com_gb<br />
jnz<br />
and<br />
pop<br />
in<br />
ret<br />
pop<br />
or<br />
ret<br />
endp<br />
C ;sec gb proc<br />
C assume<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
push<br />
mov<br />
call<br />
jnz<br />
inc<br />
in<br />
pop<br />
jmp<br />
;SCC_Qb endp<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
c<br />
c<br />
c ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;<br />
c<br />
code ends<br />
include fdu7.asm<br />
C fdu7.asm<br />
rs_gbe<br />
ah,OEh<br />
dx<br />
al,dx<br />
dx<br />
ah.com te<br />
near : ah = 02h<br />
if time-out. take jump<br />
Only interested on low nibble.<br />
restore dx = com data x<br />
else get character<br />
exit for get byte error<br />
cs:code. ds:nothing, es:nothing. ss:nothing<br />
if sec Z8S30. restore dx = sec ctl x<br />
else INS82SO, restore dx = com data x<br />
indicate timeout error<br />
dx save dx = sec ctl x<br />
ah,scc rxd wait for receive ready<br />
rs ws<br />
rs_gbe if time-out. take jump<br />
dx dx = sec data x<br />
al,dx else get character<br />
dx restore dx = sec ctl x<br />
short rs_pb_gb<br />
c<br />
c ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;<br />
C code segment public '<strong>ROM</strong>'<br />
C assume cs:code, ds:data, es:nothing. ss:nothing<br />
c ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;<br />
c<br />
C Set Format transfer rate<br />
c<br />
C Routine sets the disk-state variable to an Established state.<br />
C CAUTION: routine sets the rate on the pertain drive. If this is<br />
c the current drive. and the rate is differnet than the current<br />
C rate. the existing media will be inaccessible!<br />
c<br />
c ........ ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; .. ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; .<br />
c<br />
C f setfrmt proc near<br />
C call f_getdrv : get drive number in bl%<br />
1-163
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
E908 SA 46 02<br />
E90B FE C8<br />
E900 75 08<br />
E90F C6 87 0090 R 93<br />
E914 EB 16 90<br />
E917<br />
E917 FE C8<br />
E919 75 08<br />
E91B C6 87 0090 R 74<br />
E920 EB OA 90<br />
E923<br />
E923 FE C8<br />
E925 75 DB<br />
E927 C6 87 0090 R<br />
E92C<br />
E92C E8 E93A R<br />
E92F EB 06 90<br />
15\<br />
E932<br />
E932 C6 06 0041 R 01<br />
E937<br />
E937 E9 ECCZ R<br />
E93A<br />
E93A<br />
E93A 8A 87 0090 R<br />
E93E 8A 97 008E R<br />
E942 8A EO<br />
E944 80 E4 CO<br />
E947 8A FZ<br />
E949 80 E6 CO<br />
E94C 3A E6<br />
E94E 74 ZF<br />
E950 88 87 008E R<br />
E954<br />
E954 E8 F6BA R<br />
E957 51<br />
E958 89 OOOA<br />
1-164<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
mov<br />
dec<br />
jnz<br />
mov<br />
jmp<br />
f nolofmt:<br />
dec<br />
jnz<br />
mov<br />
jmp<br />
nomedfmt:<br />
f dofmt:<br />
dec<br />
jnz<br />
mov<br />
call<br />
jmp<br />
f oppsfmt:<br />
mov<br />
f fmtdone:<br />
f setfrmt<br />
jmp<br />
al,f numsecs get original al%<br />
al test format parm%<br />
f nolofmt jmp if not low rate%<br />
-<br />
diskstate[bx],E48M48D set state%<br />
f dofmt<br />
al test parm%<br />
f nomedfmt jmp if not 48 in 1,2%<br />
-<br />
diskstate[bx],E48M12D set state%<br />
f dofmt<br />
al test parm%<br />
f oppsfmt error %<br />
diskstate[bx],E12M12D set state%<br />
f setrate set speed%<br />
f fmtdone<br />
diskette status,cmd error record error %<br />
- -<br />
f io ret cmd over%<br />
endp<br />
c ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; '<br />
c<br />
C Checks if requested rate is the same as the last rate<br />
C of data transfer, If so, no action needed, Otherwise,<br />
C set the new speed and wait for the motor/crystal to settle down<br />
C (assume its a retry operation and do the delay),<br />
c<br />
C INPUT: BX - drive bit<br />
c<br />
c ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
f setrate proc near<br />
END IF<br />
f nurate:<br />
END IF<br />
IFE BETA<br />
mov al,diskstate[bx]<br />
mov dl,lastrate[bx]<br />
mov ah,al<br />
and ah,OCOH<br />
mov dh,dl<br />
and dh,OCOH<br />
cmp ah,dh<br />
jz f ratedone<br />
-<br />
mov lastrate[bx],al<br />
call f setff<br />
; temp test code for russ<br />
push ex<br />
mov cx,250<br />
mov ex, 10<br />
get present state%<br />
get last rate%<br />
hold rate bits%<br />
hold rate bits%<br />
are they the same%<br />
yes, finito%<br />
hold info%<br />
write to flip-flops%<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong>
E95B<br />
E95B E8 EF4C R<br />
E95E E2 FB<br />
E960 59<br />
E961 8A 4E 00<br />
E964 BO 01<br />
E966 02 EO<br />
E968 8A E1<br />
E96A B1 04<br />
E96C 02 EO<br />
E96E DC DC<br />
E970 OA C4<br />
E972 34 01<br />
E974 BA 03F2<br />
E977 EE<br />
E978 34 01<br />
E97A BA 03F2<br />
E970 90<br />
E97E EE<br />
E97F<br />
E97F C3<br />
E980<br />
E980<br />
E980<br />
E987<br />
E987<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
fS tmp:<br />
ENOIF<br />
call<br />
loop<br />
pop<br />
mov<br />
mov<br />
shl<br />
mov<br />
mov<br />
shl<br />
or<br />
or<br />
f wait one ms<br />
- -<br />
fS_tmp<br />
ex<br />
cl,f drive<br />
al,1<br />
al,cl<br />
ah,cl<br />
cl,4<br />
al,cl<br />
al,OCh<br />
al,ah<br />
: drive.%<br />
;%<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
: mask for motor status.%<br />
: drive number in ah.%<br />
;%<br />
motor on bit to high nibble.%<br />
set bits 2 & 3 (0000 1100).%<br />
drive bits ( 0 & 1).<br />
xor al,01h toggle drive bits ( 0 & 1).%<br />
mov dx,f motor port ;%<br />
out dx,al turn on the motor.%<br />
write a 1d to deselect a%<br />
or 2c to deselect b%<br />
xor al,01h toggle drive bits ( 0 & 1).%<br />
mov dx,f motor port ;%<br />
nop for good measure%<br />
out dx,al : turn on the motor.%<br />
:end of tmp fix<br />
f ratedone:<br />
ret<br />
f setrate endp<br />
code ends<br />
include kb2.asm<br />
c ·======================================================================<br />
c<br />
c<br />
Filename: kb2.src<br />
C This module includes !NT 09h & 16h.<br />
c<br />
c ·======================================================================<br />
c<br />
C code segment public '<strong>ROM</strong>'<br />
C assume cs:code, ds:nothing, es:nothing, ss:nothing<br />
c<br />
c<br />
c<br />
c<br />
ORG OE987h<br />
c ·======================================================================<br />
c !NT 09h -- i8041A Keyboard Hardware Interrupt Service Routine<br />
c<br />
C Note: 'make' -> key is depressed -> DOh + key scan code<br />
c 'break' -> key is released -> 80h + key scan code<br />
c ·======================================================================<br />
c<br />
c<br />
C k int<br />
c<br />
proc near<br />
assume cs:code, ds:nothing, es:nothing, ss:nothing<br />
1-165
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
E987 FB<br />
E988 50<br />
E989 53<br />
E98A 51<br />
E98B 52<br />
E98C 56<br />
E98D 57<br />
E98E 1E<br />
E98F FC<br />
E990 2E: 8E 1E E538 R<br />
E995 06<br />
E996 E4 60<br />
E998 8A ED<br />
E99A BA 0061<br />
E99D EC<br />
E99E 8A 08<br />
E9AO DC 80<br />
E9A2 EE<br />
E9A3 8A C3<br />
E9A5 EE<br />
E9A6 8A C4<br />
E9A8 3C FF<br />
E9AA 75 06<br />
E9AC E8 EBC9 R<br />
E9AF E9 EA63 R<br />
E9B2<br />
1-166<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
sti<br />
pusr1<br />
push<br />
push<br />
push<br />
push<br />
push<br />
push<br />
cld<br />
mov<br />
push<br />
ax<br />
bx<br />
ex<br />
dx<br />
si<br />
di<br />
ds<br />
ds,word ptr cs:[set_ds_word]<br />
es<br />
C Get the scan code.<br />
c<br />
in<br />
mov<br />
; re-enable interrupts<br />
assume cs:code, ds:data, es:nothing, ss:nothing<br />
al,p kscan<br />
ah,al<br />
C Retrieve the scan code in both al & ah.<br />
c<br />
c<br />
c<br />
mov al,ah<br />
; clear direction flag<br />
; : prokey fix?<br />
; avoid potential stack problems<br />
get scan code from data port<br />
save scan code in ah<br />
get control port address<br />
get the status<br />
save the status in bl<br />
set bit #7 -- reset<br />
reset keyboard<br />
; scan code in both registers<br />
C Test for overrun scan code from keyboard = DFFh.<br />
C Note: 20 key scan codes can be buffered up by the keyboard.<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
k ok:<br />
cmp<br />
jnz<br />
call<br />
jmp<br />
al,DFFh an overrun scan code?<br />
k ok if not, continue<br />
k beep beep the speaker<br />
k nop<br />
c ·----------------------------------------------------------------------<br />
c<br />
c<br />
c<br />
c<br />
ah<br />
bx<br />
ex<br />
dx<br />
c<br />
c .----------------------------------------------------------------------<br />
es:di<br />
= scan code (make/break) al = scan code (make/break)<br />
= ?<br />
= ?<br />
= ?<br />
= ?<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong>
E9B2 24 7F<br />
E9B4 2E: 8E 06 FOOD<br />
E9B9 BB FOOD<br />
E9BC 8E C3<br />
E9BE BF CBBF R<br />
E9C1 33 DB<br />
E9C3 33 C9<br />
E9C5 8A 2E 0017 R<br />
E9C9 8A 08<br />
E9CB 01 E3<br />
E9CD 01 E3<br />
E9CF 4B<br />
E9DO F6 C5 08<br />
E903 75 32<br />
E905 4B<br />
E906 F6 C5 04<br />
E909 75 2C<br />
E9DB 4B<br />
E9DC 3C 37<br />
E9DE 77 oc<br />
E9EO F6 C5 40<br />
E9E3 74 1C<br />
E9E5 E8 EB8C R<br />
E9E8 73 17<br />
E9EA EB 00<br />
E9EC<br />
E9EC 3C 47<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
and<br />
les<br />
mov<br />
mov<br />
mov<br />
mov<br />
xor<br />
xor<br />
mov<br />
mov<br />
shl<br />
shl<br />
al,07Fh<br />
di,dword ptr ds:[master tbl ptr]<br />
es,word ptr cs:[code_seg]<br />
bx,code_seg<br />
es,bx<br />
di,offset [kb_data_table]<br />
bx,bx<br />
CX,CX<br />
ch,byte ptr ds:[kb_flag]<br />
bl,al<br />
bx,1<br />
bx, 1<br />
al = scan code make<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
es:di points to master table<br />
; ; ega2 fix<br />
; es:di points to p kscan table<br />
clear bh<br />
clear cl<br />
bx = scan code make<br />
bx = 2*(scan code make)<br />
bx = 4*(scan code make)<br />
c<br />
c ·--------------------------------------------------------------------c<br />
c<br />
c<br />
ah<br />
bx<br />
ch<br />
C dx = ?<br />
= scan code (make/break)<br />
= 4*(scan code make) = 4*al<br />
= kb _flag<br />
C es: di = p _ kscan base<br />
al = scan code (make)<br />
cl = 0<br />
c ·--------------------------------------------------------------------c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
dec bx bx = 4*(scan code make)-1<br />
test ch,alt shift alt state?<br />
jnz k ix if so, has highest priority<br />
dec bx bx = 4*(scan code make)-2<br />
test ch,cntrl shift control state?<br />
jnz k ix if so, next highest priority<br />
c bx = 4*(scan code make)-3<br />
c<br />
dec bx<br />
C Handle Caplk Case.<br />
c<br />
C 0
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
E9EE 72 11<br />
E9FO 3C 53<br />
E9F2 77 DO<br />
E9F4 F6 CS 20<br />
E9F7 74 08<br />
E9F9<br />
E9F9 F6 CS 03<br />
E9FC 74 09<br />
E9FE 4B<br />
E9FF EB 06<br />
EA01<br />
EA01 F6 CS 03<br />
EA04 75 01<br />
EA06 4B<br />
EA07<br />
EA07 01 E3<br />
EA09 03 FB<br />
EAOB 26: 8B 15<br />
EAOE 33 DB<br />
EA10 8A DA<br />
EA12 F6 06 0018 R 01<br />
EA17 74 02<br />
EA19 SA DE<br />
EA1B<br />
EA1B OA 02<br />
EA10 74 1C<br />
EA1F 80 FB CO<br />
EA22 72 17<br />
EA24 80 FB 08<br />
EA27 77 12<br />
1-168<br />
c jb<br />
C cmp<br />
C ja<br />
C test<br />
C jz<br />
c<br />
C k lock:<br />
C test<br />
C jz<br />
c<br />
c<br />
c<br />
c<br />
dec<br />
jmp<br />
C k no lock:<br />
c test<br />
c<br />
c<br />
c<br />
c<br />
c<br />
C k iX:<br />
jnz<br />
dec<br />
jmp<br />
c shl<br />
c<br />
c<br />
c<br />
c<br />
c<br />
add<br />
mov<br />
xor<br />
c<br />
mov<br />
c<br />
c<br />
c<br />
test<br />
jz<br />
c<br />
c<br />
c k xlat:<br />
mov<br />
k no lock<br />
al,83<br />
k no lock<br />
ch,num lock mode<br />
k no lock<br />
ch,(left shift+right shift)<br />
k ix<br />
bx<br />
short k ix<br />
ch,(left_shift+right_shift)<br />
k ix<br />
bx<br />
short k ix<br />
bx,1<br />
di,bx<br />
dx,word ptr es:[di]<br />
bx,bx<br />
bl,dl<br />
byte ptr ds:[kb_flag_1],dlx_kb<br />
k xlat<br />
bl,dh<br />
scan code
EA29 80 FB C8<br />
EA2C 72 04<br />
EA2E OA E4<br />
EA30 78 2E<br />
EA32<br />
EA32 8B F3<br />
EA34 01 E6<br />
EA36 2E: FF A4 EA6C R<br />
EA3B<br />
EA3B OA E4<br />
EA30 78 21<br />
EA3F F6 06 0018 R 08<br />
EA44 74 DB<br />
EA46 3C 45<br />
EA48 74 16<br />
EA4A 80 26 0018 R F7<br />
EA4F EB OF<br />
EA51<br />
EA51 OA 02<br />
EA53 75 04<br />
EASS 8B C2<br />
EA57 EB 02<br />
EA59<br />
EA59 8A C3<br />
EASB<br />
EASB E8 EBB3 R<br />
EASE 74 03<br />
EA60<br />
EA60 E8 EBAB R<br />
EA63 07<br />
EA64 1F<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
C Test for 'break' of special case.<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
C k jmp:<br />
c<br />
c<br />
c<br />
c<br />
cmp<br />
jb<br />
or<br />
js<br />
mov<br />
shl<br />
jmp<br />
C k no case:<br />
c<br />
bl,OC8h<br />
k jmp<br />
ah,ah<br />
k none<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
is xlated byte a shift key?<br />
if so, do 'break' of shift key<br />
DCOh
EA6C 80 E5 OC<br />
EA6F 80 FD OC<br />
EA72 75 EC<br />
EA74 C7 06 0072 R 1234<br />
EA7A E9 DAD3 R<br />
EA7D<br />
EA7D 80 OE 0018 R 08<br />
EA82 E8 EBAB R<br />
EA85 FB<br />
EA86 80 3E 0049 R 07<br />
EA8B 74 OB<br />
EA8D 8B 16 0063 R<br />
EA91 83 C2 04<br />
EA94 AO 0065 R<br />
EA97 EE<br />
EA98 F6 06 0018 R 08<br />
EA9D 75 F9<br />
EA9F EB C2<br />
EAA1 E8 EBAB R<br />
EAA4 FB<br />
EAA5 CD 05<br />
EAA7 EB BA<br />
1-170<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
pop<br />
pop<br />
pop<br />
pop<br />
pop<br />
pop<br />
iret<br />
di<br />
si<br />
dx<br />
ex<br />
bx<br />
ax<br />
c .--------------------------------------------------------------------c<br />
Test for system reset sequence. ·make' only.<br />
c .--------------------------------------------------------------------c<br />
C k res: and<br />
c<br />
c<br />
c<br />
cmp<br />
jne<br />
ch,(alt shift+cntrl shift)<br />
ch,(alt shift+cntrl shift)<br />
k none<br />
C CTL ALT DEL system reset.<br />
c<br />
c<br />
c<br />
c<br />
mov<br />
jmp<br />
is it CTL ALT shift?<br />
word ptr ds:[reset flag],01234h set flag for warm boot<br />
diagnostics 1 re-boot<br />
c .----------------------------------------------------------------------<br />
c Pause waiting for another key. 'make' only.<br />
c .---------------------------------------------------------------------c<br />
C k pause:<br />
C or<br />
c<br />
c<br />
c<br />
c<br />
c<br />
call<br />
sti<br />
byte ptr ds:[kb_flag_1],pause_mode<br />
k eoi<br />
C Note: Video not disabled during vertical retrace.<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
cmp<br />
je<br />
mov<br />
add<br />
mov<br />
out<br />
C k hold: test<br />
C jnz<br />
C jmp<br />
: set the pause bit.<br />
send specific end of interrupt<br />
k eoi clears interrupts<br />
we must undo that here<br />
byte ptr ds:[v_mode],7 : never on a monochrome card<br />
k hold<br />
dx,word ptr ds:[v_base6845]<br />
dx,4<br />
al,byte ptr ds:[v 3x8]<br />
dx,al<br />
: get 6845 pointer register<br />
: get 6845 mode control register<br />
get the video mode last sent<br />
: enable video<br />
byte ptr ds:[kb_flag 1],pause_mode : test the pause bit.<br />
k hold : loop until pause bit cleared<br />
short k nap<br />
c<br />
c .----------------------------------------------------------------------<br />
C Print Screen sequence. ·make' only.<br />
c .----------------------------------------------------------------------<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
k prt: call<br />
sti<br />
INT<br />
jmp<br />
k eoi send specific end of interrupt<br />
enable interrupts%<br />
5h issue print screen interrupt<br />
short k nap<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong>
EAA9 88 0300<br />
EAAC E8 AD<br />
EAAE 80 80<br />
EABO E8 EADB R<br />
EAB3 OA E4<br />
EAB5 78 A9<br />
EAB7 88 5200<br />
EABA EB 9F<br />
EABC BO 40<br />
EA8E E8 EADB R<br />
EAC1 81 01<br />
EAC3 E8 E86A R<br />
EAC6 E8 98<br />
EAC8 80 20<br />
EACA E8 EAD8 R<br />
EACD 81 02<br />
EACF E8 E860 R<br />
EAD2 E8 F2<br />
EAD4 80 10<br />
EAD6 E8 EAD8 R<br />
EAD9 E8 E8<br />
EAD8 OA E4<br />
EADD 78 OF<br />
EADF 84 06 0018 R<br />
EAE3 75 08<br />
EAE5 08 06 0018 R<br />
EAE9 30 06 0017 R<br />
EAED C3<br />
EAEE F6 DO<br />
EAFO 20 06 0018 R<br />
EAF4 C3<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
c ·----------------------------------------------------------------------<br />
( Deluxe code put NUL into kb buffer. ·make' only.<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
c .--------------------------------------------------------------------c<br />
C k nul: mov<br />
C jmp<br />
c<br />
ax,0300h<br />
short k buf<br />
NUL=X03<br />
put ax into the buffer<br />
c .---------------------------------------------------------------------c<br />
; Four state shifts. ·make' & 'break' in kb_flag 1 plus history in kb flag.<br />
c .--------------------------------------------------------------------c<br />
C k ins: mov<br />
C call<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
or<br />
js<br />
mov<br />
jmp<br />
C k cap: mov<br />
C call<br />
C mov<br />
c call<br />
C k non1: jmp<br />
c<br />
c<br />
C k num: mov<br />
C call<br />
C mov<br />
C call<br />
C jmp<br />
c<br />
c<br />
C k scr: mov<br />
C call<br />
C jmp<br />
c<br />
c<br />
C k_4tog: or<br />
C js<br />
c<br />
c<br />
c<br />
c<br />
C or<br />
C xor<br />
C k 4ret: ret<br />
c<br />
C k 4res: not<br />
C and<br />
c ret<br />
c<br />
al,insert shift<br />
k_4tog<br />
ah,ah<br />
k none<br />
ax,(insert_key*100h)+OOh<br />
k buf<br />
al,caps lock shift<br />
k_4tog<br />
cl,OOOOOOD1b<br />
k LED cap<br />
short k none<br />
al,num lock shift<br />
k_4tog<br />
cl,DOOOD010b<br />
k LED num<br />
short k non1<br />
al,scrl lock shift<br />
k_4tog<br />
short k non1<br />
ah,ah<br />
k 4res<br />
test byte ptr ds:[kb flag 1J,al<br />
jnz k 4ret<br />
byte ptr ds:[kb_flag_1],al<br />
byte ptr ds:[kb_flag],al<br />
al<br />
byte ptr ds:[kb_flag_1],al<br />
INS toggle lock<br />
toggle 4 state<br />
is INS toggle ·make' ?<br />
if not, exit<br />
else, ax gets deluxe INS key<br />
put ax into the buffer<br />
; CAPS LOCK toggle lock<br />
toggle 4 state<br />
CAPS LOCK LED is bit #0.<br />
send LED information<br />
; NUM LOCK toggle lock<br />
toggle 4 state<br />
NUM LOCK LED is bit #1.<br />
send LED information<br />
; SCROLL LOCK toggle lock<br />
toggle 4 state<br />
is toggle shift ·make' ?<br />
if 'break' reset kb flag_1<br />
if 'make', test bit.<br />
return if already pressed<br />
set the bit.<br />
toggle kb_flag history.<br />
; if 'break', reset bit only.<br />
c .---------------------------------------------------------------------c<br />
Two state shifts. ·make' & 'break' in kb flag only.<br />
1-171
EB35 02 C1<br />
EB37 A2 0019 R<br />
EB3A EB 8A<br />
EB3C 80 30<br />
EB3E E8 EBB3 R<br />
EB41 74 03<br />
EB43 E9 EASB R<br />
EB46 E9 EA63 R<br />
EB49 88 001E R<br />
EB4C 89 1E 001A R<br />
EBSO 89 1E 001C R<br />
EB54 C6 06 0071 R 80<br />
EB59 CD 18<br />
EBSB 33 co<br />
EBSD E9 EASB R<br />
EB60<br />
EB60<br />
EB60 F6 06 0018 R 01<br />
EB65 74 03<br />
EB67 80 F1 80<br />
EB6A<br />
EB6A OA E4<br />
EB6C 78 1D<br />
EB6E 84 06 0017 R<br />
EB72 74 03<br />
EB74 80 F1 80<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
c<br />
c<br />
c<br />
c<br />
add<br />
mov<br />
jmp<br />
al,cl<br />
byte ptr ds:[alt input].al<br />
short k non1<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
c .---------------------------------------------------------------------c<br />
Double Zero on Keypad. 'make' only.<br />
c .----------------------------------------------------------------------<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
k 00:<br />
k nop1:<br />
mov<br />
call<br />
jz<br />
jmp<br />
jmp<br />
al, '0' try to put ax into kb buffer.<br />
I
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
c<br />
EB77 c k LED cmd: polling loop to send command.<br />
EB77 E4 64 c in al,kb status get 8041 status<br />
EB79 A8 02 c test al,00000010b test input buffer bit<br />
EB7B 75 FA c jnz k LED cmd if not ok to write cmd, loop.<br />
c<br />
EB7D BO 13 c mov al, 013h keyboard 'LED' command.<br />
EB7F E6 60 c out p kscan,al send keyboard 'LED' command.<br />
c<br />
EB81 c k LED dat: polling loop to send data.<br />
EB81 E4 64 c in al,kb status get 8041 status<br />
EB83 A8 02 c test al,00000010b test input buffer bit<br />
EB85 75 FA c jnz k LED dat if not ok to write data, loop.<br />
c<br />
EB87 8A C1 c mov al,cl retrieve keyboard 'LED' data.<br />
EB89 E6 60 c out p kscan,al send keyboard 'LED' data.<br />
EB8B c k LED ret:<br />
EB8B C3 c ret<br />
c<br />
EB8C c k LED num endp<br />
c<br />
c .---------------------------------------------------------------------c<br />
Get kb cap flags bit into the carry flag (cf).<br />
c<br />
c Input: al = scan code (make)<br />
c cl = 0<br />
c es:di = p kscan base<br />
c Output: cf set if kb cap_flags bit<br />
c<br />
c Trash: si destroyed.<br />
c .---------------------------------------------------------------------c<br />
EB8C c k bit proc near<br />
c assume cs:code, ds:data, es:nothing, ss:nothing<br />
c<br />
EB8C 8B F3 c mov si,bx save bx<br />
c<br />
EB8E 33 DB c xor bx,bx clear bh<br />
EB90 8A D8 c mov bl,al bx = scan code (make) index<br />
c bx = 00000000 ooxxxyyy<br />
c<br />
EB92 B1 03 c mov cl,3 rotate right bx 3<br />
EB94 D3 CB c ror bx,cl bx = yyyOOOOO OOOOOxxx<br />
c<br />
EB96 B1 03 c mov cl,3 rotate left bh 3<br />
EB98 02 C7 c rol bh,cl bx = oooooyyy oooooxxx<br />
c bh = remainder = (0-7)<br />
c bl = quotient = (0-6)<br />
c<br />
EB9A 8A CF c mov cl,bh cl = remainder = (0-7)<br />
EB9C 32 FF c xor bh,bh bx = quotient = (0-6)<br />
c<br />
c<br />
EB9E 26: 8A 59 F9 c mov bl,byte ptr es:[di+bx-7] bl = proper cap flags byte<br />
c<br />
1-174 <strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong>
EBA2 D2 D3<br />
EBA4 32 C9<br />
EBA6 DO D3<br />
EBA8 8B DE<br />
EBAA C3<br />
EBAB<br />
EBAB<br />
EBAB FA<br />
EBAC BO 61<br />
EBAE BA 0020<br />
EBB1 EE<br />
EBB2 C3<br />
EBB3<br />
EBB3<br />
EBB3 8B 1E 001C R<br />
EBB7 8B F3<br />
EBB9 E8 E86E R<br />
EBBC 3B 1E 001A R<br />
EBCO 74 07<br />
EBC2 89 04<br />
EBC4 89 1E 001C R<br />
EBC8 C3<br />
EBC9<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
c<br />
c<br />
c<br />
c<br />
c<br />
rcl<br />
xor<br />
rcl<br />
mov<br />
C ret<br />
c<br />
C k bit endp<br />
bl,cl<br />
cl,cl<br />
bl,1<br />
bx,si restore bx<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
rotate (0-7) times into bit #7<br />
cl = 0<br />
rotate into cf bit #7<br />
c<br />
c ·--------------------------------------------------------------------c<br />
Input: None.<br />
C Output: None.<br />
c<br />
C Trash: al & dx destroyed.<br />
c .----------------------------------------------------------------------<br />
c<br />
C k eoi proc near<br />
c<br />
C Send specific end of interrupt (SEOI) to pic 'command' port.<br />
c<br />
c eli disable interrupts<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
mov<br />
mov<br />
out<br />
al,pic_seoi 1<br />
dx,pic 0<br />
dx,al<br />
specific end of interrupt<br />
command to pic 'command' port.<br />
sti enable interrupts<br />
ret<br />
C k eoi endp<br />
c<br />
c .----------------------------------------------------------------------<br />
c Try to put ax into the kb buffer.<br />
c<br />
C Input: ax = word to put in kb buffer.<br />
C Output: zf set (z) if buffer is full. (ax trashed)<br />
C zf reset (nz) if buffer got ax. (ax saved)<br />
c<br />
C Trash: bx, ex, dx, & si destroyed (in general).<br />
c .---------------------------------------------------------------------c<br />
C k_try proc near<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
assume cs:code, ds:data, es:nothing, ss:nothing<br />
mov<br />
mov<br />
call<br />
cmp<br />
je<br />
mov<br />
mov<br />
ret<br />
C k_try endp<br />
c<br />
bx,word ptr ds:[buffer_tail]<br />
si,bx<br />
k adv ptr<br />
bx,word ptr ds:[buffer_head]<br />
k_beep<br />
word ptr ds:[si],ax<br />
word ptr ds:[buffer tail],bx<br />
get buffer end pointer<br />
save the value<br />
advance the tail<br />
has the buffer wrapped around<br />
zf is reset (nz)<br />
store the value<br />
move the pointer up<br />
return zf reset (nz)<br />
1-175
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
EBC9<br />
EBC9 BA 0061<br />
EBCC EC<br />
EBCD 8A EO<br />
EBCF B3 80<br />
EBD1 24 FC<br />
EBD3 EE<br />
EBD4 B9 0048<br />
EBD7 EZ FE<br />
EBD9 DC 02<br />
EBDB EE<br />
EBDC B9 0048<br />
EBDF EZ FE<br />
EBE1 FE CB<br />
EBE3 75 EC<br />
EBES SA C4<br />
EBE7 EE<br />
EBE8 E8 EBAB R<br />
EBEB C3<br />
EBEC<br />
EBEC<br />
EBEC EAAE R<br />
EBEE EABC R<br />
EBFO EAC8 R<br />
EBFZ EAD4 R<br />
EBF4 EAFS R<br />
EBF6 EB07 R<br />
EBF8 EBOB R<br />
EBFA EBOF R<br />
EBFC EA6C R<br />
EBFE EB49 R<br />
ECOO EA7D R<br />
1-176<br />
c .----------------------------------------------------------------------<br />
[ Input, None.<br />
C Output: zf set (z) always.<br />
c<br />
C Trash: ax. bl, ex, & dx destroyed.<br />
c .----------------------------------------------------------------------<br />
[<br />
C k beep proc near<br />
C assume cs:code, ds:data, es:nothing, ss:nothing<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
call<br />
mov<br />
in<br />
mov<br />
mov<br />
C k lp: and<br />
c out<br />
c<br />
c<br />
mov<br />
c loop<br />
c<br />
c or<br />
c out<br />
c<br />
c<br />
mov<br />
c loop<br />
c<br />
c dec<br />
c jnz<br />
c<br />
c<br />
mov<br />
c out<br />
c call<br />
c ret<br />
c<br />
C k beep<br />
c<br />
c<br />
C k data1 proc<br />
c<br />
C k case dw<br />
C dw<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
dw<br />
dw<br />
dw<br />
dw<br />
dw<br />
dw<br />
dw<br />
dw<br />
dw<br />
k eoi<br />
dx,p kctrl<br />
al,dx<br />
ah,al<br />
bl,80h<br />
al,OFCh<br />
dx,al<br />
cx,48h<br />
$<br />
al,OZh<br />
dx,al<br />
cx,48h<br />
$<br />
bl<br />
k lp<br />
al,ah<br />
dx,al<br />
k eoi<br />
endp<br />
k ins<br />
k cap<br />
k num<br />
k scr<br />
k alt<br />
k ctl<br />
k lsh<br />
k rsh<br />
k res<br />
k brk<br />
k pause<br />
kbins (OCOh)<br />
kbcap<br />
kbnum<br />
kbscr<br />
kbalt<br />
kbctl<br />
kblsh<br />
kbrsh<br />
kbres (OC8h)<br />
kbbrk<br />
pause<br />
send specific end of interrupt<br />
get kb control port address<br />
get control data<br />
save control data<br />
outer loop counter<br />
turn off speaker data<br />
set up count<br />
delay awhile<br />
turn on speaker<br />
set up count<br />
delay awhile<br />
decrement outer loop counter<br />
zf is set (z)<br />
restore control data<br />
send specific end of interrupt<br />
return zf set (z)<br />
·make' & 'break'<br />
v<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong>
EC02<br />
EC04<br />
EC06<br />
EC08<br />
ECOA<br />
ECOC<br />
ECOE<br />
EC10<br />
EC12<br />
EC14<br />
EC16<br />
EC18<br />
EC1A<br />
EC1C<br />
EC1E<br />
EC1E<br />
EC1E<br />
= 0080<br />
= 0061<br />
= 0002<br />
= 0093<br />
= 0074<br />
= 0015<br />
= 0020<br />
= 0010<br />
= 0000<br />
= 0040<br />
= 0080<br />
EC59<br />
EC59<br />
EC59 FB<br />
ECSA 55<br />
ECSB 06<br />
EAA1 R<br />
EAA9 R<br />
EA60 R<br />
EB26 R<br />
EB27 R<br />
EB28 R<br />
EB29 R<br />
EB2A R<br />
EB2B R<br />
EB2C R<br />
EB2D R<br />
EB2E R<br />
EB2F R<br />
EB3C R<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
dw<br />
dw<br />
dw<br />
dw<br />
dw<br />
dw<br />
dw<br />
dw<br />
dw<br />
dw<br />
dw<br />
dw<br />
dw<br />
dw<br />
k data1 endp<br />
code ends<br />
include fdu1.asm<br />
k prt kbprt<br />
k nul kbnul<br />
k none NONE<br />
k alt9 kdec9<br />
I< alt8 kdec8<br />
I< alt7 kdec7 ·make' only<br />
-<br />
k alt6 kdec6<br />
I< altS kdecS<br />
k alt4 l
ED4D E9 ECC2 R<br />
ED 50<br />
ED 50<br />
ED50 BO DC<br />
ED52 BA 03F2<br />
ED55 EE<br />
ED56 C3<br />
ED 57<br />
ED 57<br />
ED57 80 26 003F R 7F<br />
ED5C E8 F5C6 R<br />
EDSF 73 08<br />
E061 B9 01F4<br />
ED64<br />
ED64 E8 EF4C R<br />
ED67 E2 FB<br />
E069<br />
ED69 BO 46<br />
ED6B 80 7E 03 04<br />
E06F 75 06<br />
E071 BO 42<br />
ED73 33 DB<br />
ED75 8E C3<br />
ED77<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
c<br />
c<br />
c<br />
c<br />
c<br />
jmp<br />
reset endp<br />
f io ret<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
c ''' '''' '';;;;;;;;;;;;;;;' '' '' ''' '' '' ';'' ';;' '''' ''' ''';;;;;;;;;;;''' ''' ';'' ''''<br />
c<br />
C : This routine is called by the timer_int routine when motor count= 0<br />
c<br />
c ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ''''';;;;,' '' ',;;', ', ', ',';;'' '''' ''''<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
stop disk<br />
mov<br />
mov<br />
out<br />
ret<br />
stop disk<br />
proc near<br />
al,OCh<br />
dx, f motor port<br />
dx,al<br />
endp<br />
c ''' ''' ';; ';;;;;;;;;;; 1;;;;;;;;;;;;'''' '''' '1',' '1 '',;;; '1 '1 1'' '1 '1 ';' '' '''' ''''<br />
c<br />
c '' '' ';;;';;;;;;;;;;;;;; '' '' '' '';;;;' ',' ',''''''' ','' '', '';, '1 '' ';;;;; ''' ''' ';;'<br />
c<br />
C f_rdata proc<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
and<br />
call<br />
jnc<br />
near<br />
motor status,D7Fh<br />
f motor on<br />
f rd1<br />
C slow motor delay loop<br />
c<br />
clear high bit, indicate read<br />
motor was on, no delay.<br />
C slow motors<br />
C approx. 500 ms delay for<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
rd loop:<br />
f rd1:<br />
mov cx,500<br />
call<br />
loop<br />
mov<br />
cmp<br />
jne<br />
mov<br />
xor<br />
mov<br />
rdata endp<br />
f wait one ms<br />
f rd loop<br />
- -<br />
al,046h<br />
byte ptr f command,4<br />
f rw common<br />
al,042h<br />
bx,bx<br />
es,bx<br />
DMA mode byte: channel 2,<br />
single mode, write transfer.<br />
Is it a verify command?<br />
No, must have been a read.<br />
DMA mode byte: channel 2,<br />
single mode, verify transfer.<br />
Fool the DMAC into thinking<br />
there is a full segment to<br />
play with.<br />
c '';;;;;'' '1' ''''' '',' ', '' '' '' '' '' '' '1 '1, ', 1,,''',''' 1' 1;,<br />
c<br />
c Common ( f rw common)<br />
c<br />
.............<br />
'' '''' ''''',''<br />
1-181
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
ED77<br />
ED77 C6 06 0040 R FF<br />
ED7C E8 EE49 R<br />
ED7F 06<br />
ED80 1E<br />
EDS1 07<br />
EDS2 32 co<br />
EDS4 B9 0007<br />
EDS7 BF 0042 R<br />
EDSA F3/ AA<br />
EDSC 07<br />
EDSD E8 EEAA R<br />
ED90 SA 56 03<br />
ED93 B4 CS<br />
ED95 SO FA 03<br />
ED9S 74 09<br />
ED9A B4 40<br />
ED9C 80 FA 05<br />
ED9F 74 02<br />
EDA1 B4 E6<br />
EDA3<br />
EDA3 ES F6C5 R<br />
EDA6 SA 66 00<br />
EDA9 ES F6C5 R<br />
EDAC SO 7E 03 05<br />
EDBO 74 15<br />
EDB2 SA 66 07<br />
EDB5 ES F6C5 R<br />
EDBS SA 66 01<br />
EDBB SO E4 7F<br />
EDBE E8 F6C5 R<br />
EDC1 SA 66 06<br />
EDC4 E8 F6C5 R<br />
EDC7<br />
EDC7 B9 0004<br />
1-182<br />
c<br />
c<br />
INPUT:<br />
C OUTPUT:<br />
c<br />
C DESTROYS:<br />
c<br />
AL dma mode byte.<br />
c ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
f rw common proc near<br />
mov motor count,OFFh<br />
call f set dma<br />
Clear out status from previous operation.<br />
f rw1:<br />
push es<br />
push ds<br />
pop es<br />
xor al,al<br />
mov cx,7<br />
mov di,offset nee status<br />
rep stosb<br />
pop es<br />
call f seek<br />
mov dl,byte ptr f command<br />
mov ah, f write cmd<br />
cmp dl,3<br />
je f rw1<br />
mov ah,f format cmd<br />
cmp dl,5<br />
je f rw1<br />
mov ah,f read cmd<br />
call f_put_byte<br />
mov ah,f drive<br />
call f put_byte<br />
cmp byte ptr f command,5<br />
je f rw skip<br />
mov ah,f_cyl<br />
call f_put_byte<br />
mov ah,f head<br />
and ah,07Fh<br />
call f_put_byte<br />
mov ah,f secnum<br />
call f put_byte<br />
long wait.<br />
C Get bytes 3,4,5,6 from table.<br />
C If we are formatting then we need bytes 3,4,7,8 from table.<br />
c<br />
C rw skip:<br />
c mov cx,4<br />
pass mode byte on through.<br />
On return, f drive has<br />
head bit or'd in.<br />
get command<br />
Is it a write command?<br />
yes<br />
Is it a format command?<br />
yes<br />
must be read or verify.<br />
send command.<br />
has head and drive bits.<br />
was it a format command?<br />
yes, skip next 3 params.<br />
; blow off bit 7.<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong>
EDCA BB 0003<br />
EDCD<br />
EDCD E8 F62E R<br />
EDDO 8A EO<br />
EDD2 E8 F6C5 R<br />
EDD5 43<br />
EDD6 83 FB 05<br />
EDD9 75 09<br />
EDDB 80 7E 03 05<br />
EDDF 75 03<br />
EDE1 BB 0007<br />
EDE4<br />
EDE4 E2 E7<br />
EDE6 E8 F652 R<br />
EDE9 E8 EDF8 R<br />
EDEC<br />
EDEC E9 ECC2 R<br />
EDEF<br />
EDEF<br />
EDEF<br />
EDEF 04<br />
EDFO 00<br />
EDF1 10<br />
EDF2 08<br />
EDF3 00<br />
EDF4 04<br />
EDF5 03<br />
EDF6 02<br />
EDF7 20<br />
EDF8<br />
EDF8<br />
EDF8 06<br />
EDF9 1E<br />
EDFA 07<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
c mov<br />
C f rw2:<br />
C call<br />
C mov<br />
C call<br />
C inc<br />
C cmp<br />
C jne<br />
C cmp<br />
C jne<br />
C mov<br />
C f rw3:<br />
c<br />
c<br />
c<br />
c<br />
c<br />
loop<br />
call<br />
call<br />
C f rw ret:<br />
jmp<br />
c<br />
c<br />
c<br />
c<br />
rw common<br />
bx,3<br />
f_get_var<br />
ah,al<br />
f_put_byte<br />
bx<br />
bx,5<br />
f rw3<br />
byte ptr f command,5<br />
f rw3<br />
bx .7<br />
f rw2<br />
f wait for nee<br />
- - -<br />
f get_byte<br />
f io ret<br />
endp<br />
: no. bytes per sector.<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
time to check for format?<br />
No.<br />
was it a format command?<br />
no.<br />
7th parameter in table.<br />
get the results.<br />
c ';;;, ';;;;;;;';;;;;;;;;;;;;; ';;;;;;;;;;;; i' ';;, ';',,;;;;;;';;;;;;; ';;;;;;;;;;;;<br />
c<br />
C Read the results bytes from the NEC controller (fdu_data1)<br />
c<br />
c INPUT: none<br />
c<br />
C OUTPUT:<br />
c<br />
c<br />
c DESTROYS: OX, SI<br />
c<br />
c ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; 1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;',;;;;;;;;;;;;;<br />
c<br />
C fdu data1<br />
c<br />
C f gb table<br />
c db<br />
c db<br />
c db<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
db<br />
db<br />
db<br />
db<br />
db<br />
db<br />
C fdu data1<br />
c<br />
C f_get_byte<br />
c<br />
c<br />
c<br />
c<br />
push<br />
push<br />
pop<br />
proc<br />
label byte<br />
4<br />
0<br />
10h<br />
8<br />
0<br />
4<br />
3<br />
2<br />
20h<br />
endp<br />
proc<br />
es<br />
ds<br />
es<br />
near<br />
record not found.<br />
dummy<br />
ere error.<br />
dma error.<br />
dummy.<br />
sector not found.<br />
write protect.<br />
address mark error.<br />
fdc error.<br />
1-183
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
EDFB BF 0042 R<br />
EDFE 88 F7<br />
EEOO 89 0007<br />
EE03<br />
EE03 E8 F63B R<br />
EE06 AS 10<br />
EE08 74 3D<br />
EEOA A8 40<br />
EEOC 74 OC<br />
EEOE 42<br />
EEOF EC<br />
EE10 AA<br />
EE11 51<br />
EE12 89 0002<br />
EE15<br />
EE15 E2 FE<br />
EE17 59<br />
EE18 E2 E9<br />
EE1A<br />
EE1A 80 7E 03 00<br />
EE1E 74 27<br />
EE20 AC<br />
EE21 A8 20<br />
EE23 75 22<br />
EE25 A8 CO<br />
EE27 74 1A<br />
EE29 C6 06 0041 R 20<br />
EE2E AC<br />
EE2F 89 0008<br />
EE32 33 DB<br />
EE34<br />
EE34 DO CO<br />
EE36 72 03<br />
EE38 43<br />
EE39 E2 F9<br />
EE3B<br />
EE3B 2E: 8A 87 EDEF R<br />
EE40 A2 0041 R<br />
EE43<br />
EE43 07<br />
EE44 E9 ECC2 R<br />
EE47<br />
EE47 07<br />
EE48 C3<br />
EE49<br />
1-184<br />
c<br />
c<br />
c<br />
mov<br />
mov<br />
mov<br />
C f gb loop:<br />
C call<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
C wasteg:<br />
c<br />
c<br />
test<br />
jz<br />
test<br />
jz<br />
inc<br />
in<br />
stosb<br />
push<br />
mov<br />
loop<br />
pop<br />
C loop<br />
C f gb out:<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
di,offset nee status<br />
si,di<br />
ex ,7<br />
f_nec_rdy<br />
al,10h<br />
f_gb_ret<br />
al,40h<br />
f gb out<br />
dx<br />
al,dx<br />
ex<br />
cx.2<br />
wasteg<br />
ex<br />
f gb loop<br />
cmp byte ptr command,O<br />
je f gb ret<br />
lodsb<br />
test<br />
jnz<br />
test<br />
jz<br />
mov<br />
C lodsb<br />
C mov<br />
C xor<br />
C f gb loop1:<br />
C rol<br />
C jc<br />
c<br />
c<br />
c<br />
c<br />
c<br />
inc<br />
loop<br />
gb decode:<br />
C f_gb_jmp:<br />
c<br />
c<br />
C f_gb_ret:<br />
c<br />
c<br />
c<br />
mov<br />
mov<br />
pop<br />
jmp<br />
pop<br />
ret<br />
C f_get_byte<br />
c<br />
al,20h<br />
f_gb_ret<br />
al,OCOh<br />
f gb jmp<br />
diskette status, fdc error<br />
cx,8<br />
bx,bx<br />
al, 1<br />
f gb decode<br />
bx<br />
f gb loop1<br />
al,cs:f gb table[bx]<br />
diskette status,al<br />
es<br />
f io ret<br />
es<br />
endp<br />
ES:DI is now ready for stosb.<br />
offset of nee status in SI.<br />
maximum no. of bytes.<br />
Returns MSR byte in AL.<br />
will not return if error.<br />
busy bit.<br />
done.<br />
direction bit.<br />
wrong direction.<br />
point to nee data port (3F5h)<br />
save ex %<br />
need to insure atleast%<br />
12 microseconds between %<br />
this out and next in done%<br />
by f_nec_rdy, so waste some time%<br />
restore ex %<br />
was it reset command?<br />
yes.<br />
get STO in AL.<br />
seek end?<br />
yes.<br />
: get ST1 in AL.<br />
c ''; ''' ';' '''' ''' ''';' ''' '' '' '';'' '''' '';;''' ''' '.;;;;;;;;;' '' '' '''' '''' ''''' '''<br />
c<br />
C Test for boundary crossing case then program the<br />
C DMA controller ( f _set_ dma).<br />
c<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong>
c INPUT: AL mode byte<br />
c ES segment of user buffer.<br />
c<br />
c OUTPUT:<br />
c<br />
c DESTROYS: AX, BX, CX, OX<br />
c<br />
c<br />
c<br />
EE49 c f set dma proc near<br />
c<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
. " . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .<br />
I! 1 I!'!!!!!! 1 I' I It!> 11!! >I I 1 I' I! 1! I I> I!!!'' I! l '1 1'! t! 1 I!!! I I 1! 1 I 111 I I!'! 1111 f! l<br />
EE49 C6 06 0041 R 09 c mov diskette_status,dma seg_error<br />
EE4E E6 DB c out dma mode,al send mode byte.<br />
EESO 88 SE 04 c mov bx,word ptr f bufoff offset of user buffer.<br />
EE53 8C CO c mov ax,es offset of user buffer.<br />
EESS 81 04 c mov cl,4 shift count<br />
EE57 03 co c rol ax,cl move high nib around.<br />
EE59 8A E8 c mov ch,al save high nib.<br />
EESB 80 ES OF c and ch,OFh isolate high nib<br />
EESE 24 FO c and al,OFOh prepare for offset calculation<br />
EE60 03 08 c add bx,ax 20 bit calculation.<br />
EE62 73 02 c jnc f sd1<br />
EE64 FE CS c inc ch high nib<br />
EE66 c f sd1:<br />
EE66 SA CS c mov al,ch<br />
-<br />
EE68 E6 81 c out dma_segm_2,al high nib. to latch<br />
EE6A BO 06 c mov al,6<br />
EE6C E6 OA c out dma mask bit,al disable channel 2.<br />
EE6E FA c eli :rsc/drb disable interrupt %<br />
EE6F E6 OC c out dma ff clr,al set to known state. %<br />
EE71 8A C3 c mov al,bl<br />
EE73 E6 04 c out dma addr 2,al low byte of address.<br />
EE75 8A C7 c mov al,bh<br />
EE77 E6 04 c out dma addr 2,al high byte of address.<br />
EE79 FB c sti enable interrupts rsc/drb %<br />
EE7A 88 03 c mov dx,bx save buffer offset.<br />
EE7C BB 0003 c mov bx,3 bytes/sector param<br />
EE7F E8 F62E R c call f_get_var get param from table<br />
EE82 8A C8 c mov cl,al save for shift count<br />
EE84 8A 66 02 c mov ah,f numsecs get #sectors.<br />
EE87 32 co c xor al,al AX = #Sectors x 256<br />
EE89 01 E8 c shr ax,1 AX = #Sectors x 128<br />
EE8B 03 EO c shl ax,cl multiply by bytes/sector.<br />
EE80 48 c dec ax DMAC counts zero.<br />
EE8E 03 DO c add dx,ax add count to offset<br />
EE90 73 03 c jnc f sd2<br />
EE92 E9 ECC2 R c jmp f io ret exit boundary crossing.<br />
EE95 c f sd2:<br />
EE95 FA c eli ;rsc/drb disable interrupt%<br />
EE96 E6 DC c out dma ff clr,al set to known state. %<br />
EE98 90 c nap no back to back i/o %<br />
EE99 E6 05 c out dma count 2,al low byte of count.<br />
EE9B 8A C4 c mov al,ah<br />
EE90 E6 05 c out dma count 2,al high byte of count.<br />
EE9F FB c sti ;enable interrupt rsc/drb%<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
1-185
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
EF4C<br />
EF4C 51<br />
EF4D B9 02E4<br />
EF50 E2 FE<br />
EF52 59<br />
EF53 C3<br />
EF54<br />
EF57<br />
EF57<br />
EF57 FB<br />
EF58 50<br />
EF59 1E<br />
EF5A BO 66<br />
EF5C E6 20<br />
EF5E 2E: 8E 1E E538 R<br />
EF63 80 DE 003E R 80<br />
EF68 1F<br />
EF69 58<br />
EF6A CF<br />
EF6B<br />
1-188<br />
c ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
f wait one ms<br />
-<br />
push<br />
mov<br />
mov<br />
w one: loop<br />
pop<br />
ret<br />
f wait one ms<br />
include fdu2.asm<br />
proc near<br />
ex 3 clocks<br />
cx,374 2 clocks<br />
ex ,740 2 clocks<br />
w one (8 x CX) clocks<br />
ex 5 clocks<br />
11+ clocks<br />
endp<br />
c ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;<br />
c<br />
c<br />
c<br />
INPUT:<br />
none<br />
c<br />
c<br />
OUTPUT:<br />
MSB of seek status is set if NEC interrupts.<br />
c<br />
c<br />
DESTROYS: nothing<br />
c<br />
c ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
fd int<br />
fd int<br />
proc<br />
sti<br />
push<br />
push<br />
mov<br />
out<br />
mov<br />
or<br />
pop<br />
pop<br />
iret<br />
endp<br />
ORG OEF57h<br />
near<br />
enable interupts<br />
ax<br />
ds<br />
al,pic seoi 6 specific end of interupt<br />
pic O,al send to 8259<br />
ds,word ptr cs:[set_ds_word] set OS to segment 40h<br />
seek status,80h interupt indicator<br />
ds<br />
ax<br />
c ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;<br />
c<br />
C Check Valid (f_check_valid)<br />
c<br />
C This routine sets the starting diskstate. If the last operation%<br />
C passed (was ESTABlished), hte state is held. Otherwise, the%<br />
C default state indicated by the motherboara switches is used%<br />
c<br />
C Drive 1 :%<br />
Bit 0 of sys conf_b port:<br />
c<br />
c<br />
C Drive 0:%<br />
Bit 1 of sys conf b port:<br />
c<br />
c<br />
0 = 40 trk drive, 1 = 80 trk drive<br />
0 = 40 trk drive, 1 = 80 trk drive%<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong>
EF6B<br />
EF6B 50<br />
EF6C 53<br />
EF6D E8 F603 R<br />
EF70 C6 87 0092 R 00<br />
EF75 80 F3 01<br />
EF78 C6 87 008E R FF<br />
EF7D 80 F3 01<br />
EF80 8A 87 0090 R<br />
EF84 A8 10<br />
EF86 75 12<br />
EF88 E8 FSF6 R<br />
EF8B OA CO<br />
EF8D 75 OS<br />
EF8F BO 93<br />
EF91 EB 03 90<br />
EF94<br />
EF94 BO 15<br />
EF96<br />
EF96 SS S7 0090 R<br />
EF9A<br />
EF9A SA S7 0090 R<br />
EF9E AS 20<br />
EFAO 75 07<br />
EFA2 80 66 01 7F<br />
EFA6 EB 05 90<br />
EFA9<br />
EFA9 80 4E 01 80<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
C MSB of head parameter(DH): 0 = 40 trk media, 1 = 80 trk media%<br />
c<br />
C drive type<br />
c 1-----------1<br />
C I 0 I 1 I<br />
c ---1-----------1<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
OUTPUT:<br />
I 0 I r/w I r/w I<br />
media ---1-----------1<br />
type I 1 I n/ a I r /w I<br />
---1-----------1<br />
The MSB of the head parameter at bp+1 is set<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
if the drive is 80 track and the media is 40 track.<br />
This is used by seek to determine if double stepping<br />
is necessary.<br />
Also, diskstat and diskstat+2 are set for the current%<br />
and original fdu states. %<br />
c ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
f check valid<br />
-<br />
push<br />
push<br />
call<br />
mov<br />
xor<br />
mov<br />
xor<br />
;% mov<br />
;% cmp<br />
;% jz<br />
;% cmp<br />
;% jae<br />
f CV hi:<br />
mov<br />
test<br />
jnz<br />
call<br />
or<br />
jnz<br />
mov<br />
jmp<br />
mov<br />
f_cv_pre2:<br />
mov<br />
f CV tst2:<br />
mov<br />
test<br />
jnz<br />
and<br />
jmp<br />
f cv double:<br />
or<br />
proc near<br />
ax<br />
bx save working reg%<br />
f_getdrv get drive number in bl%<br />
diskstate[bx+2],0 clr orig state for reties%<br />
bl,01h select unused drive%%<br />
lastrate[bx],Offh use an illegal rate%%<br />
bl,01h return to correct drive%%<br />
al,f command skip state change for some cmds%<br />
al,1 status cmd%<br />
f CV tst2 do double step test%<br />
al,6 dasd cmds%<br />
f cv tst2 skip state, set double step%<br />
al,diskstate[bx] hold current state%<br />
- -<br />
- -<br />
al,ESTAB did it pass last cmd?%<br />
f cv tst2 yes, keep same state%<br />
f drvswitch no, set for drive type%<br />
-<br />
al,al set flags%<br />
f CV hi jmp for hi density%<br />
-<br />
-<br />
al,E48M48D low density default%<br />
f cv pre2 do double step test%<br />
al,E12M12D high density default%<br />
diskstate[bx],al store it%<br />
al,diskstate[bx] hold it%<br />
al,DOUBLE double step state?%<br />
f cv double yes if set%<br />
- -<br />
byte ptr f_head,7fh not needed%<br />
f cv ret<br />
byte ptr f head,80h yes double step%<br />
1-189
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
EFAD<br />
EFAD E8 F6BA R<br />
EFBO SB<br />
EFB1 58<br />
EFB2 C3<br />
EFB3<br />
EFB3<br />
EFB3 C6 06 0041 R 06<br />
EFB8 E9 ECC2 R<br />
EFBB<br />
EFC7<br />
EFC7<br />
1-190<br />
c<br />
C f cv ret,<br />
C call<br />
c<br />
c<br />
c<br />
c<br />
c<br />
pop<br />
pop<br />
ret<br />
f setff<br />
bx<br />
ax<br />
C f check valid endp<br />
c<br />
set rate flip-flops al=state%<br />
restore regs%<br />
restore regs%<br />
c ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;<br />
c<br />
C Change-line status<br />
c<br />
c Routine records a media change.<br />
c<br />
c ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; , ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; '';;;;;;;;;;;;;;;;;;<br />
c<br />
C f_chngln<br />
C mov<br />
C jmp<br />
C f_chngln<br />
c<br />
c include fdu3.asm<br />
c<br />
proc near<br />
diskette_status,media_change<br />
f io ret<br />
endp<br />
;status %<br />
; cmd over%<br />
c ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;<br />
C fd parms<br />
C This is the set of parameters required for diskette operation.<br />
C They are pointed to by interrupt vector 1Eh (0:78h). To modify<br />
C the parameters, build another parameter block and point disk pointer<br />
C to it.<br />
c ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;<br />
c<br />
C ;fdu data3 proc<br />
C ;commemted out because DOS[ibmbios] handles parms internally%<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
;fd 12parms<br />
db<br />
db<br />
db<br />
db<br />
db<br />
db<br />
db<br />
db<br />
db<br />
db<br />
db<br />
;fdu data3<br />
fdu data2<br />
ORG<br />
label byte<br />
(f_srt_96 shl 4) + f hut<br />
(f hlt shl 1) + f ndma<br />
f motor wait<br />
2<br />
Ofh<br />
01bh<br />
OFFh<br />
054h<br />
OF6h<br />
20<br />
4<br />
endp<br />
OEFC7h<br />
proc<br />
SRT + HUT%<br />
HLT + DMA mode<br />
motor off delay<br />
512 bytes per sector<br />
EDT last sector on cyl%<br />
gap length(23h-48m12d?)%<br />
DTL<br />
gap length for format%<br />
fill byte for format<br />
head settle time (ms)%<br />
motor start time<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong>
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
EFD2<br />
EFD2<br />
EF02 FB<br />
EF03 83 FA 04<br />
EFD6 73 32<br />
EF08 51<br />
EF09 52<br />
EFOA 57<br />
EFOB 86 C4<br />
EFOO 1E<br />
EFOE 2E: 8E 1E E538 R<br />
EFE3 8B FA<br />
EFE5 33 C9<br />
EFE7 8A 80 0078 R<br />
EFEB 01 E1<br />
EFEO 03 FF<br />
EFEF 8B 95 0008 R<br />
EFF3 1F<br />
EFF4 OB 02<br />
EFF6 74 00<br />
EFF8 33 FF<br />
EFFA OA CO<br />
EFFC 74 00<br />
EFFE 42<br />
1-192<br />
C Printer Status Byte from prt stat X:<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
bit #Q =<br />
bits #1-2 =<br />
bit #3 =<br />
bit #4 =<br />
bit #5 =<br />
bit<br />
bit #7 =<br />
time-out on printing character (Pout).<br />
set by software; no hardware significance.<br />
no significance (always cleared).<br />
hardware: I/O error.<br />
hardware: selected.<br />
hardware: out of paper.<br />
hardware: acknowledge.<br />
hardware: not busy.<br />
C " Good" Statuses are: 90h & 10h if a printer is connected.<br />
c 30h if printer is disconnected.<br />
c ·======================================================================<br />
c<br />
c<br />
c<br />
C p io<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
ORG OEF02h<br />
proc near<br />
assume cs:code, ds:nothing, es:nothing, ss:nothing<br />
sti<br />
cmp<br />
jae<br />
push<br />
push<br />
push<br />
xchg<br />
push<br />
mov<br />
mov<br />
xor<br />
mov<br />
sal<br />
add<br />
mov<br />
pop<br />
or<br />
jz<br />
xor<br />
or<br />
jz<br />
inc<br />
dx,4<br />
p nop<br />
assume cs:code, ds:data, es,nothing, ss:nothing<br />
ex<br />
dx<br />
di<br />
al,ah<br />
ds<br />
ds,word ptr cs:[set_ds_word]<br />
di,dx<br />
CX,CX<br />
cl,byte ptr ds:[di+printer_t_out]<br />
cx,1<br />
di,di<br />
dx,word ptr ds:[di+printer addr]<br />
ds<br />
enable interrupts<br />
4 printers allowed max<br />
: save registers<br />
reverse al & ah<br />
ah saves al throughout<br />
save ds<br />
satisfy assumptions<br />
get port number (0-3)<br />
clear ch<br />
get printer time-out<br />
double it 4 faster cpu<br />
make word index<br />
assume cs:code, ds:nothing, es:nothing, ss:nothing<br />
dx,dx<br />
p ret<br />
di,di<br />
al,al<br />
p_out<br />
dx<br />
get address of printer<br />
data port<br />
restore ds<br />
: is a printer there?<br />
clear di<br />
al = O?<br />
dx = prt data x<br />
dx = prt stat x<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong>
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
F025 EB OD<br />
F027 BO 08<br />
F029 42<br />
F02A EE<br />
F02B BS 05<br />
F02D E2 FE<br />
F02F BO OC<br />
F031 EE<br />
F032 90<br />
F033 4A<br />
F034 EC<br />
F035 24 F8<br />
F037 34 48<br />
F039 EB CA<br />
F03B<br />
F03B<br />
1-194<br />
c<br />
jmp short p stat<br />
c<br />
c .----------------------------------------------------------------------<br />
C Initialize Parallel Printer Interface.<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
Input: ah =<br />
dx =<br />
Output: al =<br />
dx =<br />
Trash: ex =<br />
c<br />
c<br />
c ·----------------------------------------------------------------------<br />
(<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
p init:<br />
Assumes:<br />
assume<br />
mov<br />
inc<br />
out<br />
mov<br />
loop<br />
mov<br />
out<br />
nop<br />
dec<br />
jmp<br />
byte to return in al.<br />
address of printer status port (prt_stat_x).<br />
status of printer<br />
address of printer status port (prt stat x).<br />
0 destroyed.<br />
prt stat_x = prt data x + 1 = dx + 1<br />
prt cmd_x = prt data x + 2 = dx + 2<br />
cs:code, ds:nothing, es:nothing, ss:nothing<br />
al,08h request init (hold line low)<br />
dx dx = prt cmd x<br />
dx,al<br />
ch,OSh delay awhile (ex = OS??h)<br />
$<br />
al,OCh disable interupts, manual lf<br />
dx,al (init done - line set high)<br />
dx dx = prt stat x<br />
short p stat fall through<br />
c ·----------------------------------------------------------------------<br />
( Read Status of Parallel Printer Interface.<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
Input: dx =<br />
Output: al =<br />
dx =<br />
c<br />
c .----------------------------------------------------------------------<br />
(<br />
Assumes:<br />
address of printer status port (prt stat x).<br />
status of printer<br />
address of printer status port (prt stat x).<br />
prt stat x = prt data x + 1 = dx + 1<br />
- - -<br />
C assume cs:code, ds:nothing, es:nothing, ss:nothing<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
p stat: in<br />
and<br />
xor<br />
jmp<br />
p io endp<br />
code ends<br />
include vid.asm<br />
;I* NAME<br />
al,dx get printer status<br />
al,OF8h clear bogus printer bits<br />
al,048h flip acknowledge & I/0 err bit<br />
short p ret exit<br />
DATE ACTION<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong>
= ODED<br />
= 0162<br />
F03B<br />
F04S<br />
F04S<br />
FD4S FOFC R<br />
F047 F1E9 R<br />
F049 F1F7 R<br />
F04B F21S R<br />
F04D FSA8 R<br />
F04F F22C R<br />
FOS1 F27F R<br />
FOS3 F390 R<br />
FOSS F3B1 R<br />
FOS7 F3DB R<br />
FOS9 F414 R<br />
FOSB F44F R<br />
FOSD DS6A R<br />
FOSF DSSO R<br />
F061 F47B R<br />
F063 FS04 R<br />
F06S<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
*<br />
·*<br />
*<br />
*<br />
*<br />
·*<br />
·*<br />
*<br />
*<br />
. *<br />
·*<br />
. *<br />
*<br />
; *!<br />
mikef<br />
mikef<br />
joe<br />
joe<br />
joe<br />
joe<br />
joe<br />
joe<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
10/2S/84 Added code in scroll up to enable video.<br />
02/13/8S Moved grf_light_pen from graph.src to here.<br />
03/13/8S Changed ORG to ORG<br />
03/2S/8S Replaced scroll code in text mode for speed<br />
04/04/8S Fixed Mode 7 scroll to use ds<br />
04/18/8S Added code to check for dip switch indication<br />
of non-Olivetti video controller board<br />
06/11/8S Revived code to wait for Hercules card during<br />
slow scrolling code .<br />
06/13/8S Changed fourth parameter in 684S parameter table<br />
from 06h to OAh. for v_md_40 and v_md_graph.<br />
Removed extraneous parameter table stuff.<br />
c ·======================================================================<br />
c<br />
c<br />
Filename: vid.src<br />
c This module includes INT 10h, the display routines.<br />
c<br />
c ·======================================================================<br />
c<br />
c ; These constants must be defined (amount to scroll/clear during vert retrace):<br />
c , , V KSCROLL1 equ 224 314 chars to move during vert. retrace<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
code<br />
V KSCROLL1 equ 224<br />
V KSCROLL2 equ 3S4<br />
segment public '<strong>ROM</strong>'<br />
assume cs:code, ds:nothing,<br />
324 chars to move during vert.<br />
3S4 chars to move during vert.<br />
es:nothing, ss:nothing<br />
c .----------------------------------------------------------------------<br />
c <strong>ROM</strong> data<br />
c .----------------------------------------------------------------------<br />
(<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
ORG<br />
v data1 proc<br />
v tbl dw<br />
dw<br />
dw<br />
dw<br />
dw<br />
dw<br />
dw<br />
dw<br />
dw<br />
dw<br />
dw<br />
dw<br />
dw<br />
dw<br />
dw<br />
dw<br />
v data1 endp<br />
OF04Sh<br />
near<br />
v set mode<br />
- -<br />
v_curs_type<br />
v curs pos<br />
v r curs pos<br />
grf light_pen<br />
-- -<br />
v page<br />
v_scrl_up<br />
v scrl dn<br />
v rae<br />
v wac<br />
v we<br />
-<br />
v col<br />
-<br />
grf_write_dot<br />
grf read dot<br />
v terminal<br />
v stat<br />
ah = DOh<br />
ah = 01h<br />
ah = 02h<br />
ah = 03h<br />
ah = 04h<br />
ah = OSh<br />
ah = 06h<br />
ah = 07h<br />
ah = 08h<br />
ah = 09h<br />
ah = OAh<br />
ah = OBh<br />
ah = OCh<br />
ah = ODh<br />
ah = DEh<br />
ah = OFh<br />
(see graph.src)<br />
(see graph.src)<br />
(see graph.src)<br />
retrace<br />
retrace<br />
1-195
F082 A8 20 c test al,20h<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
F084 74 08 c jz v colour if either is 0, it's<br />
F086 A8 10 c test al,10h . . color display board<br />
F088 74 04 c jz v colour<br />
-<br />
-<br />
F08A 81 C7 F800 c add di,para_mono-para_graph it's a monochrome board<br />
F08E c v colour:<br />
-<br />
F08E 8E C7 c mov es,di set es = video ram<br />
c<br />
F090 SF c pop di Get index to call table.<br />
c<br />
F091 58 c pop ax restore ax<br />
F092 8A 26 0049 R c mov ah,byte ptr ds:[v mode] get display driver mode<br />
F096 8B E8 c mov bp,ax bp saves ax throughout<br />
c (return ah = v_mode<br />
c unless specific ret. value)<br />
c<br />
F098 FC c cld String ops move UP, mostly.<br />
F099 2E: FF 95 F045 R c call cs:[di+(offset v_tbl)] perform display function<br />
c<br />
F09E 50 c pop bp restore 'trashed' registers<br />
F09F SE c pop si (destroyed if <strong>ROM</strong> stack)<br />
FOAO SF c pop di<br />
FOA1 1F c pop ds<br />
FOA2 07 c pop es<br />
FOA3 c v nop:<br />
FOA3 CF c iret<br />
FOA4 c v io endp<br />
FOA4 c ORG OFOA4h<br />
FOA4 c v data2 proc near<br />
FOA4 c v parms label byte<br />
c<br />
c<br />
c ·======================================================================<br />
c<br />
c<br />
c<br />
c<br />
c ; 6845 Parameters except register 3h (Horizontal Synch Width).<br />
c<br />
FOA4 38 28 20 OA c v md 40 db 38h,28h,20h,OAh text 40 X 25<br />
FOA8 1F 06 19 1C c db 1Fh, 06h, 19h, 1Ch mode 0 -> monochrome<br />
FOAC 02 07 06 07 c db 02h,07h,06h,07h mode 1 -> color<br />
FOBO 00 00 00 00 c db OOh,OOh,OOh,OOh<br />
c<br />
FOB4 71 50 SA DC c v md 80 db 71h,50h,5Ah,OCh text 80 X 25<br />
FOBS 1F 06 19 1C c db 1Fh,06h,19h,1Ch mode 2 -> monochrome<br />
FOBC 02 07 06 07 c db 02h,07h,06h,07h mode 3 -> color<br />
FOCO 00 00 00 00 c db OOh,OOh,OOh,OOh<br />
c<br />
FOC4 38 28 20 OA c v_md_graph db 38h,28h,20h,OAh graphics<br />
FOC8 7F 06 64 70 c db 7Fh,06h,64h,70h mode 4 -> 320 x 200 color<br />
FOCC 02 01 06 07 c db 02h,01h,06h,07h mode 5 -> 320 x 200 monochrome<br />
FOOD 00 00 00 00 c db OOh,OOh,OOh,OOh mode 6 -> 640 x 200 monochrome<br />
c<br />
F004 61 50 52 OF c v md mono db 61h,50h,52h,OFh monochrome card 80 x 25<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong> 1-197
<strong>ROM</strong> B:U:OS <strong>Listing</strong><br />
F008 19 06 19 19 c<br />
FOOC 02 00 DB DC c<br />
FOEO 00 00 00 00 c<br />
c<br />
FOE4 0800 c<br />
FOE6 1000 c<br />
FOE8 4000 c<br />
FOEA 4000 c<br />
c<br />
c<br />
FOEC 28 c<br />
FOEO 28 c<br />
FOEE 50 c<br />
FOEF 50 c<br />
FOFO 28 c<br />
FOF1 28 c<br />
FOF2 50 c<br />
FOF3 50 c<br />
FOF4 2C c<br />
FOF5 28 c<br />
FOF6 20 c<br />
FOF7 29 c<br />
FOF8 2A c<br />
FOF9 2E c<br />
FOFA 1E c<br />
FOFB 29 c<br />
c<br />
FOFC c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
1-198<br />
db 19h' 06h' 19h' 19h mode 7 -> monochrome card<br />
db 02h,ODh,OBh,OCh<br />
db OOh,OOh,OOh,OOh<br />
v md len dw 2048 40x25 modes 0 & 1<br />
dw 4096 80x25 modes 2 & 3<br />
dw 16384 graphics modes 4 & 5<br />
dw 16384 mode 6<br />
;only in 1050 dw 32768 modes 64 & 72<br />
v md wid db 40 0 -> text 40x 25 monochrome<br />
db 40 1 -> text 40x 25 color<br />
db 80 2 -> text 80x 25 monochrome<br />
db 80 3 -> text 80x 25 color<br />
db 40 4 -> graphics 320x200 color<br />
db 40 5 -> graphics 320x200 monochrome<br />
db 80 6 -> graphics 640x200 monochrome<br />
db 80 7 -> text 80x 25 monochrome card<br />
v md enable db 2Ch o -> text 40x 25 monochrome<br />
db 28h 1 -> text 4Dx 25 color<br />
db 20h 2 -> text 80x 25 monochrome<br />
db 29h 3 -> text 80x 25 color<br />
db 2Ah 4 -> graphics 320x200 color<br />
db 2Eh 5 -> graphics 32Dx200 monochrome<br />
db 1Eh 6 -> graphics 640x200 monochrome<br />
db 29h 7 -> text 80x 25 monochrome card<br />
v data2 endp<br />
Set Mode & Clear Screen ah = DOh<br />
Input: al = mode = 0 -> text<br />
= 1 -> text<br />
= 2 -> text<br />
Output: ah<br />
al<br />
= DOh<br />
= v colorpal<br />
40x 25 monochrome<br />
40x 25 color<br />
80x 25 monochrome<br />
= 3 -> text 80x 25 color<br />
= 4 -> graphics 320x200 color<br />
= 5 -> graphics 320x200 monochrome<br />
= 6 -> graphics 640x200 monochrome<br />
= 7 -> text 80x 25 monochrome card<br />
= 64 -> graphics 640x4DO monochrome<br />
= 72 -> graphics 640x400 monochrome tinytext<br />
Assume: contents of v base6845 = pointer register<br />
(contents of v base6845)+1 = data register<br />
(contents of v_base6845)+4 = mode control register<br />
(contents of v_base6845)+5 = overscan register<br />
(contents of v base6845)+6 = status register<br />
(contents of v base6845)+10 = mode control register #2<br />
(304h)<br />
(305h)<br />
(3D8h)<br />
(309h)<br />
(30Ah)<br />
(30Eh)<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong>
FOFC<br />
FOFC 52<br />
FOFD 51<br />
FOFE 32 E4<br />
F100 BA 03D4<br />
F103 F6 06 0010 R 10<br />
F108 74 OD<br />
F10A F6 06 0010 R 20<br />
F10F 74 06<br />
F111 B8 0107<br />
F114 83 C2 EO<br />
F117<br />
F117 A2 0049 R<br />
F11A 89 16 0063 R<br />
F11E 86 EO<br />
F120 83 C2 04<br />
F123 EE<br />
F124 83 EA 04<br />
F127 8A C4<br />
F129 1E<br />
F12A 33 F6<br />
F12C 8E DE<br />
F12E C5 36 0074 R<br />
F132 B9 0010<br />
F135 3C 02<br />
F137 72 DE<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
C Trash: si & di destroyed.<br />
c .----------------------------------------------------------------------<br />
c<br />
C v set mode<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
push<br />
push<br />
proc near<br />
assume cs:code, ds:data, es:v_ram, ss:nothing<br />
dx<br />
ex<br />
C Get Color/Monochrome dependent stuff.<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
xor<br />
mov<br />
test<br />
jz<br />
test<br />
jz<br />
mov<br />
add<br />
ah,ah<br />
dx,color pointer<br />
byte ptr ds:[switch_bits],10h<br />
v set mode color<br />
- - -<br />
byte ptr ds:[switch_bits],20h<br />
v set mode color<br />
save dx<br />
save ex<br />
AH = mode ctrl., color board<br />
color 6845 pointer register.<br />
monochrome board?<br />
if not, skip monochrome stuff.<br />
It's a monochrome board, so.<br />
ax,0107h<br />
(AH,AL) = (overwrite mode<br />
for monochrome, mono. mode)<br />
dx,v_pointer-color_pointer; monochrome pointer register.<br />
C v set mode color:<br />
c<br />
c Save CRT Mode & 6845 address, and reset display monitor with mode control.<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
mov<br />
mov<br />
xchg<br />
add<br />
out<br />
sub<br />
mov<br />
byte ptr ds:[v_mode],al : save mode.<br />
word ptr ds:[v_base6845],dx<br />
ah,al<br />
dx,4<br />
dx,al<br />
dx,4<br />
al,ah<br />
C Get pointer to display parameters.<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
push<br />
xor<br />
mov<br />
lds<br />
save 6845 pointer register.<br />
AH=mode, AL=mode ctrl.<br />
get 6845 mode control register<br />
reset display<br />
restore 6845 address.<br />
restore mode in al<br />
ds : save ds = data_seg<br />
assume cs:code, ds:absO, es:v_ram, ss:nothing<br />
si,si<br />
ds,si<br />
si,dword ptr ds:[int1Dlocn]<br />
C ds:si in effect points to cs:v parms.<br />
c<br />
c assume cs:code, ds:code, es:v_ram, ss:nothing<br />
c<br />
C Determine which set of parameters to use from mode.<br />
c<br />
c<br />
c<br />
c<br />
mov<br />
cmp<br />
jb<br />
cx,16<br />
al,2<br />
v set mode lp<br />
- - -<br />
satisfy assumptions<br />
display parameter pointer<br />
count of parameters<br />
40x25 mode? (0 & 1?)<br />
if so, we're done<br />
1-199
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
F139 03 F1<br />
F13B 3C 04<br />
F13D 72 08<br />
F13F 03 F1<br />
F141 3C 07<br />
F143 75 02<br />
F145 03 F1<br />
F147<br />
F147 BO 10<br />
F149 2A C1<br />
F14B EE<br />
F14C 42<br />
F14D AC<br />
F14E EE<br />
F14F 4A<br />
F150 E2 F5<br />
F152 1F<br />
F153 8A C4<br />
F155 32 E4<br />
F157 8B FO<br />
F159 B9 2000<br />
F15C 3C 04<br />
F15E 72 DE<br />
F160 3C 07<br />
F162 74 08<br />
F164 72 02<br />
F166 01 E1<br />
F168<br />
F168 33 CO<br />
F16A EB 05<br />
F16C<br />
F16C B5 08<br />
F16E<br />
F16E B8 0720<br />
F171<br />
F171 33 FF<br />
F173 F3/ AB<br />
1-200<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
add<br />
cmp<br />
jb<br />
add<br />
cmp<br />
jne<br />
add<br />
si,cx<br />
al,4<br />
v set mode lp<br />
si,cx<br />
al,7<br />
v set mode lp<br />
- - -<br />
si,cx<br />
next set of parameters<br />
80x25 mode? (2 & 3?)<br />
if so, we're done<br />
next set of parameters<br />
graphics mode? (4,5,6,64,72?)<br />
if so, we're done<br />
else, monochrome card (7)<br />
C Loop through 6845 initialization table outputting register number and data<br />
c<br />
C v set_mode lp:<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
mov<br />
sub<br />
out<br />
inc<br />
lodsb<br />
out<br />
dec<br />
loop<br />
pop<br />
mov<br />
xor<br />
mov<br />
al,16<br />
al,cl<br />
dx,al<br />
dx<br />
dx,al<br />
dx<br />
v set mode lp<br />
assume cs:code, ds:data, es:v_ram, ss:nothing<br />
ds<br />
al,ah<br />
ah,ah<br />
si,ax<br />
C Clear the screen.<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
mov<br />
cmp<br />
jb<br />
cmp<br />
je<br />
jb<br />
shl<br />
cx,2000h<br />
al,4<br />
v md clr 8k<br />
al,7<br />
v md clr 2k<br />
v_md_clr graphics<br />
ex, 1<br />
C v_md_clr_graphics:<br />
C xor ax, ax<br />
C<br />
c<br />
jmp short v md clr<br />
C v md clr 2k:<br />
c mov ch,08h<br />
C v md clr 8k:<br />
C mov ax,(7*100h)+(' ')<br />
C v md clr:<br />
c<br />
c<br />
c<br />
c<br />
c<br />
xor<br />
rep<br />
di,di<br />
stosw<br />
Set mode control register #2<br />
get 6845 register number =<br />
= (16 - cl) (unscrambled)<br />
output to register port<br />
point to 6845 data register<br />
get parm value: al gets ds:si<br />
output to data port<br />
point back to pointer register<br />
next register<br />
dx = pointer register<br />
restore ds = data seg<br />
save mode in ah & al<br />
ax = mode<br />
si =mode hence ...<br />
assume 8k words to clear<br />
40x25 or 80x25 text modes 0-3?<br />
if so, clear 8k words.<br />
monochrome card mode 7?<br />
if so, clear 2k words.<br />
graphics mode 4-6 clear 8k wds<br />
mode 64 & 72 clear 16k wds<br />
graphics mode<br />
clear screen with zeroes<br />
ex = 0800h<br />
clear with attribute & space<br />
; es:di gets ax<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong>
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
c Handle underline on shades-of-gray monitor.<br />
c dx = pointer register<br />
F175 83 C2 06 c add dx,6 get 6845 status register<br />
F178 EC c in al,dx get CRT status<br />
F179 24 10 c and al,010h isolate color/shades bit #4<br />
F17B DO EO c shl al,1 move it to underline bit #6<br />
F17D DO EO c shl al,1<br />
c<br />
c Handle double scan line modes 64 & 72.<br />
c dx = 6845 status register<br />
F17F 83 FE 40 c cmp si,64 modes 0 through 7?<br />
F182 72 04 c jb v md dbl if so, single scan line mode<br />
F184 40 c inc ax else mode 64 or 72, set bit #0<br />
F185 BE 0006 c mov si,6 modes 64 & 72 look like mode 6<br />
c from now on<br />
c<br />
F188 c v md dbl: double scan line mode.<br />
F188 83 C2 04 c add dx,4 get mode control register #2<br />
F18B EE c out dx,al<br />
c<br />
c Enable display monitor with mode control.<br />
c<br />
F18C 2E: 8A 84 FOF4 R c mov al,byte ptr cs:[si+v_md_enable]<br />
F191 A2 0065 R c mov byte ptr ds:[v_3x8],al save the value for later<br />
c dx = mode control register #2<br />
F194 83 EA 06 c sub dx,6 get 6845 mode control register<br />
F197 EE c out dx,al enable display<br />
c<br />
c Determine width & length of screen.<br />
c<br />
F198 33 co c xor ax,ax clear ah<br />
F19A 2E: 8A 84 FOEC R c mov al,byte ptr cs:[si+v_md_wid]<br />
F19F A3 004A R c mov word ptr ds:[v_width],ax<br />
c<br />
F1A2 81 E6 OOOE c and si,OEh make word index divided by 2<br />
F1A6 2E: 8B 84 FOE4 R c mov ax,word ptr cs:[si+v_md_len]<br />
F1AB A3 004C R c mov word ptr ds:[v_height],ax<br />
c<br />
c Set up overscan register & v colorpal.<br />
c<br />
F1AE BO 30 c mov al,030h : v colorpal for modes 0-5 & 7<br />
F1BO 8A 26 0049 R c mov ah,byte ptr ds:[v_mode] retrieve v mode<br />
F1B4 80 FC 06 c cmp ah,6 modes 0-5 ?<br />
F1B7 72 OD c jb v ovr ok if so, we're ok.<br />
c<br />
F1B9 74 09 c je v ovr not ok 640x200.graphics mode 6?<br />
c if so, change v_colorpal<br />
c<br />
F1BB 80 FC 40 c cmp ah,64 640x400 graphics mode 64, 72 ?<br />
F1BE 72 06 c jb v ovr ok if not, we're ok.<br />
c<br />
c if so we set v_height wrong,<br />
F1CO D1 26 004C R c shl word ptr ds:[v height],1 double v_height from 16k to 32k<br />
F1C4 c v ovr not ok:<br />
c<br />
-<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong> 1-201<br />
-
F1F4 SA C1<br />
F1F6 C3<br />
F1F7<br />
F1F7<br />
F1F7 SB F9<br />
F1F9 SA CF<br />
F1FB SB F1<br />
F1FD S1 E6 0007<br />
F201 03 F6<br />
F203 S9 94 0050 R<br />
F207 3A 3E 0062 R<br />
F20B 74 03<br />
F20D SB CF<br />
F20F C3<br />
F210<br />
F210 SB C2<br />
F212 EB 42 90<br />
F215<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
c<br />
c<br />
c mov<br />
C ret<br />
C v_curs_type<br />
c<br />
al,cl<br />
endp<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
ah = preserved = 10: al = cl<br />
di restores ex<br />
restore al with original cl<br />
c .---------------------------------------------------------------------c<br />
Set Cursor Position ah = 02h<br />
c<br />
C Input: bh = page number (0-7)<br />
C (dh,dl) = (row,col) of current cursor from (0,0)<br />
c Output: if bh = v_apage, ah = 14<br />
c<br />
al = low byte of cursor position<br />
c<br />
else,<br />
ah = v mode<br />
c<br />
c<br />
al = preserved<br />
C Trash: si & di destroyed. ( si = dx, di = ex)<br />
c .--------------------------------------------------------------------c<br />
C v curs pos<br />
c<br />
proc near<br />
C assume cs:code, ds:data, es:v ram, ss:nothing<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
mov<br />
mov<br />
mov<br />
and<br />
add<br />
mov<br />
cmp<br />
je<br />
mov<br />
ret<br />
di,cx<br />
cl,bh<br />
si,cx<br />
si,7<br />
si,si<br />
word ptr ds:[si+v curpos],dx<br />
bh,byte ptr ds:[v_apage]<br />
v set curs<br />
cx,di<br />
; save ex<br />
mask to S pages<br />
*2 => word index<br />
save the cursor position<br />
if active page, put the cursor<br />
on the screen.<br />
not active page, so just<br />
restore ex<br />
and exit<br />
C v set curs:<br />
active page, so set cursor ..<br />
C<br />
c<br />
c<br />
c<br />
c<br />
c<br />
mov<br />
jmp<br />
ax,dx<br />
v set cur pos<br />
ax gets cursor position<br />
set cursor: ah 6S45 gets ex<br />
si = dx destroyed<br />
ah = preserved = 14<br />
al = low byte of cursor posn<br />
C v curs pos<br />
c<br />
endp<br />
c .----------------------------------------------------------------------<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
Read Cursor<br />
Input: bh<br />
Output: (dh,dl)<br />
(ch,cl)<br />
ax<br />
= page number (0-7)<br />
ah = 03h<br />
= (row,col) of current cursor from (0,0)<br />
= current cursor mode setting<br />
= dx<br />
1-203
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
F215<br />
F215 8B C2<br />
F217 8B CB<br />
F219 8A OF<br />
F21B 81 E3 0007<br />
F21F 01 E3<br />
F221 8B 97 0050 R<br />
F225 8B 09<br />
F227 8B DE 0060 R<br />
F22B C3<br />
F22C<br />
F22C<br />
F22C 25 0007<br />
F22F 8B E8<br />
F231 A2 0062 R<br />
F234 74 08<br />
F236 8B FA<br />
F238 F7 26 004C R<br />
F23C 8B 07<br />
F23E<br />
F23E A3 004E R<br />
F241 01 F8<br />
F243 8B F9<br />
1-204<br />
C Trash: None.<br />
c .--------------------------------------------------------------------c<br />
C v r curs pas<br />
c<br />
proc near<br />
c assume cs:code, ds:data, es:v ram, ss:nothing<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
mov<br />
mov<br />
mov<br />
and<br />
shl<br />
mov<br />
mov<br />
mov<br />
ret<br />
C v r curs pos<br />
c<br />
ax,dx<br />
cx,bx<br />
bl,bh<br />
bx,07h<br />
bx,1<br />
dx,word ptr ds:(bx+v_curpos]<br />
bx,cx<br />
cx,word ptr ds:(v_cursize]<br />
endp<br />
save bx<br />
page number mod 8<br />
page number mod 8 word index<br />
restore bx<br />
c ·--------------------------------------------------------------------c<br />
Read Light Pen (see graph.src) ah = 04h<br />
c .--------------------------------------------------------------------c<br />
c .--------------------------------------------------------------------c<br />
c<br />
Set Active Display Page ah = 05h<br />
C Input: al =new page number (0-7 for modes 0-1; 0-3 for 2-3)<br />
C Output: 6845 is reset to display the new active page<br />
C ah = 14<br />
al = low byte of cursor position<br />
c<br />
c<br />
C Trash: bp, si & di destroyed. (si = dx, di = ex)<br />
c .----------------------------------------------------------------------<br />
c<br />
C v_page proc<br />
c<br />
near<br />
C assume cs:code, ds:data, es:v ram, ss:nothing<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
C v_page_O:<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
and<br />
mov<br />
mov<br />
jz<br />
mov<br />
mul<br />
mov<br />
mov<br />
sar<br />
mov<br />
ax,07h<br />
bp,ax<br />
byte ptr ds:(v apage],al<br />
v_page 0<br />
di,dx<br />
word ptr ds:(v_height]<br />
dx,di<br />
word ptr ds:(v_top],ax<br />
ax,1<br />
di,cx<br />
page number mod 8<br />
save ax = page number mod 8<br />
save active page number (0-7)<br />
page number = 0?<br />
save dx<br />
dx:ax = (page number)*v height<br />
restore dx<br />
save starting address of page<br />
divide by 2 for byte count<br />
save ex<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong>
F245 8B C8<br />
F247 B4 DC<br />
F249 E8 F262 R<br />
F24C 8B C5<br />
F24E 01 EO<br />
F250 8B FO<br />
F252 8B 84 0050 R<br />
F256<br />
F256 E8 F560 R<br />
F259 03 06 004E R<br />
F250 01 F8<br />
F25F B5 DE<br />
F261 91<br />
F262<br />
F262 8B F2<br />
F264 E8 F273 R<br />
F267 FE C4<br />
F269 8A E9<br />
F26B E8 F273 R<br />
F26E 8B 06<br />
F270 8B CF<br />
F272 C3<br />
F273<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
mov<br />
mov<br />
call<br />
mov<br />
shl<br />
mov<br />
mov<br />
c v set cur pos:<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
- - -<br />
call<br />
add<br />
sar<br />
mov<br />
Now: ah<br />
c v 6845:<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
xchg<br />
ch<br />
cl<br />
di<br />
mov<br />
call<br />
inc<br />
mov<br />
call<br />
mov<br />
mov<br />
C ret<br />
C v_page endp<br />
c<br />
cx,ax<br />
ah,12<br />
v 6845<br />
ax,bp<br />
ax,1<br />
si,ax<br />
ax,word ptr ds:[si+v_curpos]<br />
v posn<br />
ax,word ptr ds:[v_top]<br />
ax,1<br />
ch, 14<br />
cx,ax<br />
= 6845 register selection<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
ex gets offset of active page<br />
6845 cursor set address = 12<br />
set cursor; ah 6845 gets ex<br />
si = dx destroyed<br />
ah = preserved = 12; al = cl<br />
di restores ex<br />
restore ax = page number mod 8<br />
page number mod 8 word index<br />
get page's cursor position<br />
;(ah,al) = (row,col) cursor pos.<br />
di = value to return in ex<br />
(ah,al) -> ax offset; si trash<br />
add offset of active page<br />
divide by 2 for byte count<br />
6845 cursor pos register = 14<br />
= first data byte to (ah) 6845 internal register<br />
= second data byte to (ah+1) 6845 internal register<br />
= value to return in ex<br />
; program 6845 cursor:<br />
si,dx<br />
v out_byte<br />
ah<br />
ch,cl<br />
v_out byte<br />
dx,si<br />
cx,di<br />
save dx<br />
output to 6845<br />
next 6845 register<br />
get the register input<br />
output to 6845<br />
restore dx value<br />
set up return value<br />
c ·-----------------------------------------------------------------------------c<br />
Output two byte to the selected 6845 registers<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
Input: ah<br />
ch<br />
cl<br />
di<br />
= 6845 register selection<br />
= first data byte to (ah) 6845 internal register<br />
= second data byte to (ah+1) 6845 internal register<br />
= value to return in ex<br />
Assume: contents of v base6845<br />
Output: ah<br />
(contents of v base6845)+1<br />
al<br />
C ex = di<br />
= 6845 register selection<br />
= second data byte<br />
= pointer register<br />
= data register<br />
c .------------------------------------------------------------------------------<br />
1-205
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
F273<br />
F273 88 16 0063 R<br />
F277 8A C4<br />
F279 EE<br />
F27A 42<br />
F278 8A C5<br />
F27D EE<br />
F27E C3<br />
F27F<br />
F27F<br />
F27F E8 F571 R<br />
F282 72 03<br />
F284 E9 D5F4 R<br />
F287<br />
F287 52<br />
F288 51<br />
F289 53<br />
F28A 8A 08<br />
F28C 88 C1<br />
F28E E8 F513 R<br />
F291 74 25<br />
1-206<br />
c<br />
C v out_byte<br />
c<br />
proc near<br />
C assume cs:code, ds:data, es:v ram, ss:nothing<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
mov<br />
mov<br />
out<br />
inc<br />
mov<br />
out<br />
ret<br />
C v_out_byte<br />
c<br />
dx,word ptr ds:[v_base6845]<br />
al,ah<br />
dx,al<br />
dx<br />
al,ch<br />
dx,al<br />
endp<br />
get 6845 pointer register<br />
get the register address<br />
select the data register<br />
next register<br />
get second data byte<br />
output a data byte to 6845<br />
c ,----------------------------------------------------------------------<br />
( Scroll Active Page Up ah = 06h<br />
c<br />
C Input: if al = 0, then clear entire window with attribute in bh<br />
else, al =number of rows to 'scroll' up<br />
= number of rows to clear at bottom of window<br />
bh = attribute to be used on blank row(s)<br />
(ch,cl) = (row,col) of upper left corner of window from (0,0)<br />
(dh,dl) = (row,col) of lower right corner of window from (0,0)<br />
C Output: ah = attribute to be used on blank row(s)<br />
C if v mode = 7, al = 20h = space<br />
else al = v 3x8<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
C<br />
c<br />
Assume: (contents of v base6845)+6 = status register<br />
C Trash: bp, si, & di destroyed. (bx thru dx destroyed if <strong>ROM</strong> stack)<br />
c ·----------------------------------------------------------------------<br />
(<br />
C v scrl up<br />
c<br />
c<br />
c<br />
c call<br />
c jb<br />
C jmp<br />
C v txt up:<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
push<br />
push<br />
push<br />
mov<br />
mov<br />
call<br />
jz<br />
proc near<br />
assume cs:code, ds:data, es:v_ram, ss:nothing<br />
v txt md<br />
v txt up<br />
grf graphics up<br />
dx<br />
ex<br />
bx<br />
C Scroll cl rows up.<br />
c<br />
C ;V mv up:<br />
bl,al<br />
ax,cx<br />
v scrl pos<br />
v clr<br />
all registers preserved<br />
jump if graphics<br />
save registers<br />
save lille count<br />
pass upper left coordinates ....<br />
to common scroll positioning routine<br />
clear rows if nothing to move<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong>
F293 03 FO<br />
F295<br />
F295 8A E1<br />
F297 80 3E 0049 R 07<br />
F29C 74 OA<br />
F29E 53<br />
F29F BB F322 R<br />
F2A2<br />
F2A2 E8 F2EC R<br />
F2A5 58<br />
F2A6 EB 10<br />
F2A8<br />
F2A8 1E<br />
F2A9 06<br />
F2AA 1F<br />
F2AB<br />
F2AB 8A CA<br />
F2AD F3/ AS<br />
F2AF 03 F5<br />
F2B1 03 FD<br />
F2B3 FE CC<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
c<br />
c<br />
c<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
add si,ax add (bytes/row)*(rows to scroll) to<br />
'from' address for scroll<br />
C ; Scroll cl rows up/down (based on bp & direction flag OF).<br />
c<br />
C v mv:<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
mov<br />
cmp<br />
je<br />
push<br />
ah,cl ah
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
c<br />
F2B5 75 F4 c jnz v mv flp ; go back if not finished<br />
c<br />
F2B7 1F c pop ds ;restore data segment<br />
c .---------------------------------------------------------------------c<br />
c Set up to clear one or more rows<br />
c<br />
F2B8 c v clr:<br />
F2B8 8A E7 c mov ah,bh ah
F2F7 06 c push es<br />
F2F8 1F c pop ds ds
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
F31A c v 01:<br />
F31A 41 c inc ex adjust the column counter<br />
F31B c v 02:<br />
F31B 96 c xchg ax,si restore ah = row counter<br />
c<br />
c Repeat for all columns of the current row<br />
c<br />
F31C E2 E7 c loop v cols<br />
-<br />
F31E EB 4A c jmp short v 31<br />
c<br />
c Else scrolling rows<br />
c Loop for all columns in the current row<br />
c If only one word can be moved at each horizontal retrace<br />
c Wait for the beginning of horizontal retrace<br />
c<br />
F320 ODED c dw V KSCROLL1 ; # of words to move at vert. retrace<br />
F322 c v 1:<br />
F322 EC c in al,dx<br />
F323 DO D8 c rcr al,1<br />
F32S 73 FB c jnc v 1<br />
c<br />
c Move one word of the current row<br />
c<br />
F327 AS c movsw<br />
c<br />
c If vertical retrace has started<br />
c If scrolling the full screen width<br />
c Move a fixed number of words or finish the scroll<br />
c<br />
F328 EB DE c jmp short v v<br />
c<br />
c Else two words can be moved at each horizontal retrace<br />
c If there is only one column remaining in this row<br />
c<br />
F32A 0162 c dw V KSCROLL2 ; # of words to move at vert. retrace<br />
F32C c v 2:<br />
F32C E2 03 c loop v 21<br />
c<br />
c Move the last word of the current row<br />
c<br />
F32E 41 c inc ex ; adjust the column counter<br />
F32F EB F1 c jmp v 1<br />
c<br />
c Else<br />
c Wait for the beginning of horizontal retrace<br />
c<br />
F331 c v 21:<br />
F331 EC c in al,dx<br />
F332 DO D8 c rcr al,1<br />
F334 73 FB c jnc v 21<br />
c<br />
c Move two words of the current row<br />
c<br />
F336 AS c movsw<br />
F337 AS c movsw<br />
1-210 <strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong>
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
F373 c v v2:<br />
F373 03 C8 c add cx,ax<br />
F375 F3/ AS c rep movsw move the remaining words<br />
F377 59 c pop ex reinitialize the column counter<br />
F378 33 ED c xor bp,bp restore bp register<br />
c<br />
c Reenable the timer interrupt and return<br />
c<br />
F37A c v 4:<br />
F37A FA c eli<br />
F37B E4 21 c in al,pic 1 8259 mask register<br />
F37D 24 FE c and al,not 01h unmask IRQO<br />
F37F E6 21 c out pic 1, al<br />
F381 FB c sti<br />
F382 1F c pop ds restore ds<br />
c assume ds:data<br />
F383 SA c pop dx restore dl for subsequent " clear" call<br />
F384 C3 c ret<br />
c<br />
c Latch and read counter 0 of the 8253<br />
c<br />
c ; ; ; v 8253:<br />
c ''' mov al,O " latch counter" command<br />
c '''<br />
c '''<br />
c '''<br />
c '''<br />
c<br />
c<br />
out<br />
in<br />
mov<br />
in<br />
ret<br />
43h,al<br />
al,40h<br />
bl,al<br />
al,40h<br />
latch 8253 counter 0<br />
lsb of latched count<br />
save it for comparison<br />
msb of latched count<br />
c<br />
c<br />
Wait for the end of horizontal retrace<br />
F385<br />
F385<br />
F386<br />
F388<br />
F38A<br />
F38A<br />
F38B<br />
F38D<br />
F38F<br />
F390<br />
EC<br />
DO D8<br />
73 FB<br />
EC<br />
DO D8<br />
72 FB<br />
C3<br />
c v_sync:<br />
c in al,dx<br />
c rcr al,1<br />
c jnc v_sync<br />
c v_sync2:<br />
c in al,dx<br />
c rcr al,1<br />
c jc v sync2<br />
c ret<br />
c v_scrl_up endp<br />
c<br />
c .--------------------------------------------------------------------c<br />
Scroll Active Page Down ah = 07h<br />
c<br />
c Input: if al = 0, then clear entire window with attribute in bh<br />
c else, al = number of rows to 'scroll' down<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
= number of rows to clear at top of window<br />
bh = attribute to be used on blank row(s)<br />
(ch,cl) = (row,col) of upper left corner of window from (0,0)<br />
(dh,dl) = (row,col) of lower right corner of window from (0,0)<br />
Output: ah = attribute to be used on blank row(s)<br />
if v mode = 7, al = 20h = space<br />
else al = v 3x8<br />
1-212 <strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong>
F390<br />
F390 FD<br />
F391 E8 F571 R<br />
F394 72 03<br />
F396 E9 0689 R<br />
F399<br />
F399 52<br />
F39A 51<br />
F398 53<br />
F39C 8A 08<br />
F39E 88 C2<br />
F3AO E8 F513 R<br />
F3A3 74 07<br />
F3A5<br />
F3A5 28 FO<br />
F3A7 F7 DO<br />
F3A9 E9 F295 R<br />
F3AC<br />
F3AC F7 DO<br />
F3AE E9 F288 R<br />
F381<br />
F381<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
C Assume: (contents of v base6845)+6 = status register<br />
c<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
C Trash: bp, si, & di destroyed. (bx thru dx destroyed if <strong>ROM</strong> stack)<br />
c .--------------------------------------------------------------------c<br />
C v scrl dn<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
v txt dn:<br />
proc near<br />
assume cs:code, ds:data, es:v ram, ss:nothing<br />
std NOTE: scroll down everything backwards<br />
call v txt md<br />
jb v txt dn<br />
- -<br />
jmp grf graphics_down<br />
push dx<br />
push ex<br />
push bx<br />
mov bl,al<br />
mov ax,dx<br />
call v scrl pos<br />
jz v clr_top<br />
Scroll cl rows down.<br />
v mv dn:<br />
sub si,ax<br />
neg bp<br />
jmp v mv<br />
Clear bl rows above.<br />
C v clr top:<br />
c<br />
c<br />
c<br />
C v scrl dn<br />
c<br />
neg<br />
jmp<br />
bp<br />
v clr<br />
endp<br />
all registers preserved<br />
jump if graphics<br />
save registers<br />
save line count<br />
pass lower right coordinates ..<br />
to common scroll positioning routine<br />
clear rows if nothing to move<br />
subtract (bytes/row)*(rows to scroll)<br />
from 'from' address for scroll<br />
negate number of bytes to skip per row<br />
now identical to scroll upl<br />
negate number of bytes to skip per row<br />
now identical to v clr bot!<br />
c .----------------------------------------------------------------------<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
Read Attribute & Character at Cursor ah = 08h<br />
Input: bh<br />
Output: al<br />
ah<br />
= current active display page (0-7)<br />
= character read<br />
= attribute of character read<br />
C Assume: (contents of v_base6845)+6 = status register<br />
c<br />
C Trash: si & di destroyed. ( si = dx: di = bx)<br />
c .--------------------------------------------------------------------c<br />
C v rae proc<br />
c<br />
near<br />
1-213
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
F381 E8 F571 R<br />
F384 72 03<br />
F386 E9 06EC R<br />
F389<br />
F389 88 F8<br />
F388 E8 F542 R<br />
F38E 88 F2<br />
F3CO 8A 0006<br />
F3C3 03 16 0063 R<br />
F3C7<br />
F3C7 EC<br />
F3C8 .DO 08<br />
F3CA 72 F8<br />
F3CC FA<br />
F3CD<br />
F3CD EC<br />
F3CE DO 08<br />
F300 73 F8<br />
F302 26: 88 07<br />
F305 F8<br />
F306 88 06<br />
F308 88 OF<br />
F3DA C3<br />
F308<br />
1-214<br />
c assume cs:code, ds:data, es:v_ram, ss:nothing<br />
c<br />
c call<br />
c jb<br />
C jmp<br />
C v txt rae:<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
mov<br />
call<br />
mov<br />
mov<br />
add<br />
v txt md<br />
v txt rae<br />
grf graphics_read<br />
di,bx<br />
v fpos<br />
si,dx<br />
dx,6<br />
all registers preserved<br />
jump if graphics<br />
save bx<br />
ax & si destroyed.<br />
bx = offset into current page<br />
save dx<br />
get 6845 status reg. offset<br />
dx,word ptr ds:[v base6845] add 6845 pointer<br />
C Wait for horizontal retrace ... we can't read the screen during a trace<br />
C without disturbing the screen image.<br />
c<br />
c<br />
C v rae inline:<br />
C in<br />
make sure we're in a scanline<br />
al,dx<br />
get horiz. retrace blanking status<br />
C rcr al,1<br />
C jc v rae inline wait for display enable low (cf)<br />
disable ints FIRST<br />
c eli<br />
c<br />
c<br />
c v rae inblank:<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
in al,dx<br />
rcr al,1<br />
jnc v rae inblank<br />
mov<br />
sti<br />
mov<br />
mov<br />
ret<br />
C v rae endp<br />
test for horiz. retrace<br />
wait for blanking:<br />
get retrace blanking status<br />
test display enable (bit #0)<br />
try again if still in scanline.<br />
ax,es: [bx] char. and attr. now in AX<br />
dx,si<br />
bx,di<br />
enable interrupts immediately<br />
restore dx<br />
restore bx<br />
c<br />
c .----------------------------------------------------------------------<br />
c Write Attribute & Character at Cursor ah = 09h<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
Input: al<br />
bh<br />
bl<br />
ex<br />
bp<br />
Output: al<br />
ah<br />
= character to write<br />
= current active display page (0-7)<br />
= attribute of character to write<br />
= counter of characters to write<br />
= value to return in ax<br />
= character to write<br />
= attribute of character to write<br />
C Assume: (contents of v_base6845)+6 = status register<br />
c<br />
C Trash: bp, si & di destroyed. (si = ex: dx if <strong>ROM</strong> stack)<br />
c .----------------------------------------------------------------------<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong>
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
F410 SA c pop dx restore dx<br />
F411 86 CE c mov cx,si restore ex<br />
F413 C3 c ret<br />
c<br />
F414 c v wac endp<br />
c<br />
c .---------------------------------------------------------------------c<br />
Write Character at Cursor Position ah = OAh<br />
c<br />
c Input: al = character to write<br />
c bh = current active display page (0-7)<br />
c ex = counter of characters to write<br />
c bp = value to return in ax<br />
c Output: al = character to write<br />
c ah = top byte of offset of character in page 0<br />
c<br />
c Assume: (contents of v_base6845)+6 = status register<br />
c<br />
c Trash: si & di destroyed. (si = CX; dx if <strong>ROM</strong> stack)<br />
c .---------------------------------------------------------------------c<br />
F414 c v we proc near<br />
c<br />
c assume CS:COde, ds:data, es:v ram, ss:nothing<br />
c<br />
F414 E8 F571 R c call v txt md all registers preserved<br />
F417 72 03 c jb v txt we<br />
F419 E9 D7DB R c jmp grf graphics_write jump if graphics<br />
F41C c V txt WC:<br />
c<br />
F41C 86 F6 c mov di,bx save bx<br />
c<br />
F41E E8 F542 R c call v fpos si destroyed.<br />
c ax = offset into page 0<br />
c bx = offset into current page<br />
F421 87 OF c xchg bx,di restore bx; di = transfer offset<br />
c<br />
c<br />
F423 86 F1 c mov si,cx save ex<br />
F425 52 c push dx save dx<br />
c<br />
F426 86 05 c mov dx,bp retrieve character in dl<br />
F428 8A C2 c mov al,dl get char in al (ah = attr.)<br />
F42A 86 E8 c mov bp,ax bp = (attr. char)<br />
c<br />
F42C 6A 0006 c mov dx,6 get 6845 status register<br />
F42F 03 16 0063 R c add dx,word ptr ds:[v_base6845] get 6845 pointer register<br />
c<br />
c Wait for horizontal retrace ...<br />
c<br />
F433 c v we next:<br />
c<br />
F433 c v we hi:<br />
F433 EC c in al,dx get CRT status<br />
F434 DO 08 c rcr al, 1 test display enable (bit #0)<br />
1-216 <strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong>
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
F436 72 FB c jc v we hi wait for display enable low (cf)<br />
F438 FA c eli disable ints FIRST<br />
c<br />
F439 c v we lo:<br />
F439 EC c in al,dx 08 get CRT status<br />
F43A DO 08 c rcr al, 1 02 test display enable (bit #Q)<br />
F43C 73 FB c jnc v we lo 16/04 wait for display enable hi (cf)<br />
c<br />
F43E 8B CS c mov ax,bp 02 restore ax = (attr, char)<br />
F440 AA c stosb 11 es:di gets al (character)<br />
c<br />
F441 49 c dec ex 02<br />
c ;we can do 2 bytes in 10 us<br />
F442 74 06 c jz v we end 04/16<br />
F444 47 c inc di 02 skip past attribute byte<br />
c<br />
-<br />
F445 AA c stosb 11 es:di gets al (character)<br />
c<br />
c Worst case: (8+2+16)+(8+2+4)+(2+11)+(2+4+2+11) = 72 cycles = 90% of 80 cycles<br />
c<br />
F446 FB c sti enable interrupts immediately<br />
F447 47 c inc di skip past attribute byte<br />
F448 E2 E9 c loop v we next do it ex times<br />
c<br />
F44A c v we end:<br />
F44A FB c sti enable interrupts immediately<br />
c<br />
F44B SA c pop dx restore dx<br />
F44C 8B CE c mov cx,si restore ex<br />
F44E C3 c ret<br />
F44F c v we endp<br />
F44F c v col proc near<br />
c<br />
c<br />
c .---------------------------------------------------------------------c<br />
Set Overscan, Back, & Foreground Colors ah = OBh<br />
c<br />
c Input: bh = palette color ID to set (0-127)<br />
c bl = color value to be used with that color ID<br />
c Output: ah = v mode<br />
c al = new v colorpal<br />
c<br />
c Assume: (contents of v base6845)+5 = overscan register<br />
c<br />
c Trash: si & di destroyed. (si = bx; di = dx)<br />
c ·---------------------------------------------------------------------c<br />
c<br />
c assume CS:COde, ds:data, es:v ram, ss:nothing<br />
c<br />
F44F AD 0066 R c mov al,byte ptr ds:[v colorpal] get current palette<br />
c<br />
F452 8B FA c mov di,dx save dx<br />
F454 8B F3 c mov si,bx save bx<br />
c<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong> 1-217
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
F456 OA FF<br />
F458 74 OA<br />
F45A 24 OF<br />
F45C DO DB<br />
F45E 73 DB<br />
F460 DC 20<br />
F462 EB 07<br />
F464<br />
F464 80 E3 1F<br />
F467 24 EO<br />
F469 OA C3<br />
F46B<br />
F46B BA 0005<br />
F46E 03 16 0063 R<br />
F472 EE<br />
F473 8B DE<br />
F475 8B 07<br />
F477 A2 0066 R<br />
F47A C3<br />
F47B<br />
F47B<br />
F47B 3C 07<br />
F47D 75 03<br />
F47F E9 F583 R<br />
1-218<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
v col 0:<br />
v col 1:<br />
v col<br />
or<br />
jz<br />
and<br />
rcr<br />
jnb<br />
or<br />
jmp<br />
and<br />
and<br />
or<br />
mov<br />
add<br />
out<br />
mov<br />
mov<br />
mov<br />
ret<br />
endp<br />
bh,bh<br />
v col o<br />
al,ODFh<br />
bl,1<br />
v col 1<br />
al,20h<br />
short v col 1<br />
bl,01Fh<br />
al,OEOh<br />
al,bl<br />
dx,5<br />
dx,word ptr ds:[v_base6845]<br />
dx,al<br />
bx,si<br />
dx,di<br />
byte ptr ds:[v_colorpal],al<br />
palette color ID = 0?<br />
handle color ID 0<br />
clear palette select bit #5<br />
test new color (bit #0)<br />
if bit #0 set. all done<br />
else set palette select bit #5<br />
save bits #0-4 of new color<br />
clear bits #0-4 of old color<br />
and combine the two.<br />
get 6845 overscan reg. offset<br />
add 6845 pointer register<br />
output selection<br />
restore bx<br />
restore dx<br />
save the value for later<br />
c .---------------------------------------------------------------------c<br />
Write Dot (see graph.src) ah = OCh<br />
c .----------------------------------------------------------------------<br />
(<br />
c .---------------------------------------------------------------------c<br />
Read Dot (see graph.src) ah = ODh<br />
c .----------------------------------------------------------------------<br />
(<br />
c ·--------------------------------------------------------------------c<br />
c<br />
Terminal Emulator to active page<br />
C Input: al = character to write<br />
ah = OEh<br />
c bl = foreground color in graphics mode<br />
C bp = value to return in ax<br />
C Output: All registers saved.<br />
c<br />
C Trash: si & di destroyed. (si = cx: di = bx: dx if <strong>ROM</strong> stack)<br />
c .----------------------------------------------------------------------<br />
(<br />
C v terminal proc near<br />
c<br />
C assume cs:code, ds:data, es:v ram, ss:nothing<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
cmp<br />
jne<br />
jmp<br />
al,BEL : is it bell character?<br />
v term nobell<br />
v bell<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong>
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
F4CF 73 04 c jnb v scrl_tty_graphics jump if graphics<br />
c<br />
F401 64 08 c mov ah,08h call v rae<br />
F403 CD 10 c INT 10h to get attribute byte in ah<br />
c<br />
F405 c v_scrl_tty_graphics:<br />
F405 33 C9 c xor cx.cx (ch.cl)= upper left (row.col)<br />
c = (0,0)<br />
F407 8A FC c mov bh,ah store attribute in bh<br />
F409 68 0601 c mov ax.0601h call v scrl up to scroll<br />
c one line with attribute bh<br />
F4DC 8A 16 004A R c mov dl,byte ptr ds:(v_width] (dh,dl)= lower right (row.col)<br />
F4EO 80 EA 01 c sub dl,1 column = v width-1<br />
F4E3 80 3E 0049 R 48 c cmp byte ptr ds:(v mode].72 is this mode 72 ?<br />
F4E8 66 31 c mov dh,49 if yes then row = 49<br />
F4EA 74 02 c je v term ret jump if mode = 72<br />
F4EC 66 18 c mov dh,24 if not mode 72 then row= 24<br />
F4EE c v term ret:<br />
F4EE CD 10 c INT 10h<br />
F4FO c v term nop:<br />
c<br />
c<br />
c Clean up.<br />
c<br />
F4FO 86 C5 c mov ax,bp restore ax<br />
F4F2 86 OF c mov bx,di restore bx<br />
F4F4 86 CE c mov cx.si restore ex<br />
F4F6 5A c pop dx restore dx<br />
F4F7 C3 c ret<br />
c<br />
c<br />
F4F8 OA 02 c v bs: or dl,dl back space -- column = 0 ?<br />
F4FA 74 F4 c jz v term nop don't change cursor position<br />
F4FC FE CA c dec dl<br />
F4FE E6 C1 c jmp v set new cur<br />
c<br />
c<br />
F500 32 02 c v cr: xor dl.dl carriage return<br />
F502 E6 60 c jmp v set new cur<br />
F504 c v terminal endp<br />
F504 c v stat proc near<br />
c<br />
-<br />
c<br />
c .---------------------------------------------------------------------c<br />
Read Current Video Status ah = OFh<br />
c<br />
c Input: None.<br />
c Output: ah = number of character columns on screen<br />
c al = display mode currently set<br />
c bh = current active display page (0-7)<br />
c<br />
c Trash: None.<br />
c .---------------------------------------------------------------------c<br />
c<br />
1-220 <strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
-<br />
-
c<br />
c<br />
F504 8A 26 004A R c<br />
F508 AD 0049 R c<br />
FSOB 8A 3E 0062 R c<br />
FSOF 80 E7 07 c<br />
F512 C3 c<br />
c<br />
F513 c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
assume cs:code, ds:data, es:v ram, ss:nothing<br />
mov ah,byte ptr ds:[v_width]<br />
mov<br />
mov<br />
and<br />
ret<br />
v stat endp<br />
page<br />
al,byte ptr ds:[v_mode]<br />
bh,byte ptr ds:[v_apage]<br />
bh,07h page number mod 8<br />
Common scroll positioning and register initialization routine.<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
Input: (ah,al) = starting (row,col) position from (0,0)<br />
= (ch,cl) for up I (dh,dl) for down<br />
bh = attribute to be used on blank row(s)<br />
if bl = 0, then clear entire window with attribute in bh<br />
else, bl = number of rows to 'scroll' up I down<br />
(ch,cl)<br />
(dh,dl)<br />
= number of rows to clear at top I bottom of window<br />
(row,col) of upper left corner of window from (0,0)<br />
(row,col) of lower right corner of window from (0,0)<br />
es: +-----------------------------------------------+<br />
(ch,cl)<br />
+-------------------------------+<br />
Output: zf<br />
ax<br />
A +-------------------------------+<br />
bl I I<br />
v +-------------------------------+<br />
(dh,dl)<br />
+-----------------------------------------------+<br />
=state of bl at entry (nz if scroll: z if clear only)<br />
= (number of bytes/row) * (number of rows to scroll)<br />
= (2 * bl * v width)<br />
bh = attribute to be used on blank line(s)<br />
if bl = 0 at entry, then clear entire window with bl attribute<br />
bl = dh = window height to clear<br />
else, bl = number of rows to 'scroll' up I down<br />
= number of rows to clear at top I bottom of window<br />
ch = zero<br />
cl = number of rows to move<br />
= delta of upper and lower coordinates-bl = (dh-bl)<br />
(dh,dl) = delta of upper left and lower right coordinates<br />
bp<br />
si<br />
di<br />
ds<br />
es<br />
= window height and width<br />
=number of bytes NOT to move per row (2*(v_width -dl))<br />
= 'from' address for scroll<br />
= 'to' address for scroll<br />
= data seg (preserved)<br />
= para_mono<br />
1-221
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
F513<br />
F513 E8 F560 R<br />
F516 2A FS<br />
F518 fE C6<br />
F51A 2A D1<br />
F51C FE C2<br />
F51E 88 36 004E R<br />
F522 03 FO<br />
F524 88 FE<br />
F526 33 C9<br />
F528 8A CA<br />
F52A A1 004A R<br />
F52D 88 E8<br />
F52F 2B E9<br />
F531 D1 ES<br />
F533 DO EO<br />
F535 F6 E3<br />
F537 SA CE<br />
F539 2A CB<br />
F53B OA DB<br />
F53D 75 02<br />
F53F SA DE<br />
F541<br />
F541 C3<br />
F542<br />
1-222<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
es:<br />
<br />
+-----------------------------------------------+<br />
si, di offset if up<br />
+-------------------------------+ A<br />
11<br />
dh<br />
A +-------------------------------+<br />
bl I I<br />
v +-------------------------------+ v<br />
si, di offset if down<br />
+-----------------------------------------------+<br />
c .---------------------------------------------------------------------c<br />
page<br />
C v scrl pos proc near<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
call<br />
sub<br />
inc<br />
sub<br />
inc<br />
mov<br />
add<br />
mov<br />
xor<br />
mov<br />
mov<br />
mov<br />
sub<br />
shl<br />
shl<br />
mul<br />
mov<br />
sub<br />
or<br />
jnz<br />
mov<br />
assume cs:code, ds:data, es:v_ram, ss:nothing<br />
v posn<br />
dh.ch<br />
dh<br />
dl,cl<br />
dl<br />
si,word ptr ds:[v top]<br />
si,ax<br />
di,si<br />
CX,CX<br />
cl,dl<br />
ax,word ptr ds:[v width]<br />
bp,ax<br />
bp,cx<br />
bp, 1<br />
al,1<br />
bl<br />
cl,dh<br />
cl,bl<br />
bl,bl<br />
v scrl mv and clr<br />
bl,dh<br />
C v scrl mv and clr:<br />
c ret<br />
c<br />
C v scrl pos endp<br />
C page<br />
(ah,al) -> ax offset: si trash<br />
(dh,dl) gets delta (drow,dcol)<br />
dh = number of rows<br />
dl = number of columns<br />
get offset of active page<br />
add offset in page => 'from'<br />
'to' addresses.<br />
init count register to zero.<br />
ex = number of columns = dl<br />
get screen width<br />
bp = v width<br />
bp = (v_width - dl)<br />
bp = 2 * (v width - dl)<br />
al = 2 * v width<br />
ax = 2*v width*no. of rows<br />
cl
F542<br />
F542 8A C7<br />
F544 33 DB<br />
F546 25 0007<br />
F549 88 FO<br />
F54B 74 07<br />
F54D<br />
F54D 03 1E 004C R<br />
F551 48<br />
F552 75 F9<br />
F554<br />
F554 01 E6<br />
F556 88 84 0050 R<br />
F55A E8 F560 R<br />
F55D 03 08<br />
F55F C3<br />
F560<br />
F560<br />
F560 88 FO<br />
F562 81 E6 DOFF<br />
F566 8A C4<br />
F568 F6 26 004A R<br />
F56C 03 C6<br />
F56E 01 EO<br />
F570 C3<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
C Calculates video ram buffer offset of a character in text mode<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
Input: bh<br />
Output: bx<br />
ax<br />
C Trash, si = destroyed.<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
= current active display page (0-7)<br />
= offset of character in text mode at display page<br />
= (page number)*(v height)+offset of v_curpos(bh)<br />
= offset of character in text mode from page 0<br />
c .--------------------------------------------------------------------c<br />
C v fpos proc<br />
c<br />
near<br />
c assume cs:code, ds:data, es:v ram, ss:nothing<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
v fpos lp:<br />
mov al,bh al gets page number<br />
xor bx,bx bx = 0<br />
and ax,07h ax = page number mod 8<br />
mov si,ax si keeps page number mod 8<br />
jz v fpos 0 page number = Q?<br />
add bx,word ptr ds:[v_height] optimization: word multipli-<br />
dec ax cation by less than 8 without<br />
jnz v fpos lp destroying dx (or ex).<br />
v fpos o, bx = (page number)*(v height)<br />
shl si, 1 page number mod 8 word index<br />
mov ax,word ptr ds:[si+v_curpos]<br />
call v posn (ah,al) -> ax offset; si trash<br />
add bx,ax bx = (page)*(v height)+offset<br />
ret<br />
v fpos endp<br />
c .---------------------------------------------------------------------c<br />
Calculates video ram buffer offset of a character in text mode<br />
c<br />
C Input: (ah,al) = (row,col) position<br />
c Output: ax = offset of character in text mode.<br />
c<br />
C Trash, si destroyed.<br />
c .--------------------------------------------------------------------c<br />
C v posn<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
mov<br />
and<br />
mov<br />
mul<br />
add<br />
shl<br />
ret<br />
proc near<br />
assume cs:code, ds:data, es:v ram, ss:nothing<br />
si,ax<br />
si,OFFh<br />
al,ah<br />
byte ptr ds:[v_width]<br />
ax,si<br />
ax,1<br />
si keeps column (al)<br />
al gets row (ah)<br />
ax gets (row * v_width)<br />
ax gets (row* v_width)+ column<br />
ax gets 2*((row * v width)+column)<br />
1-223
F596 E6 61<br />
'""""""""m=:t<br />
F598 51<br />
F599 B9 OOC8<br />
F59C<br />
F59C E8 EF4C R<br />
F59F E2 FB<br />
FSA1 59<br />
FSA2 8A C4<br />
FSA4 E6 61<br />
FSA6 58<br />
FSA7 C3<br />
FSA8<br />
FSA8<br />
FSA8 32 E4<br />
FSAA C3<br />
FSAB<br />
FSAB<br />
FSAB<br />
FSAB<br />
FSAB BA 03F4<br />
FSAE EC<br />
FSAF 3C 10<br />
FSB1 75 12<br />
FSB3 AD 0041 R<br />
FSB6 so<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
out<br />
push<br />
mov<br />
bell wait:<br />
call<br />
loop<br />
pop<br />
mov<br />
out<br />
pop<br />
ret<br />
v bell endp<br />
p kctrl,al<br />
ex<br />
cx,200 ;512 msec<br />
f wait one ms ;wait for 1 ms<br />
- -<br />
bell wait<br />
ex<br />
al,ah restore control status<br />
p kctrl,al<br />
ax<br />
return from v term<br />
c ·===============================================================================<br />
c<br />
C Read Light Pen function code = 04h<br />
c<br />
c Input: None.<br />
C Output: ah = 0 light pen switch not down/not triggered<br />
c ah = 1 implies:<br />
c (dh,dl) = (row,col) of character light pen<br />
c<br />
c<br />
c<br />
c<br />
ch<br />
bx<br />
C Trash: None. ???<br />
position from (0,0)<br />
= raster line (0-199)<br />
= pixel column (0-319,0-639)<br />
c<br />
c .-------------------------------------------------------------------------------<br />
[<br />
C grf_light_pen proc<br />
c<br />
c<br />
c<br />
c<br />
xor<br />
ret<br />
ah,ah<br />
C grf_light_pen endp<br />
c<br />
C code ends<br />
C include fdu4.asm<br />
near<br />
return ah = 0 for now (al intact) ...<br />
c ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;<br />
c<br />
C code segment public '<strong>ROM</strong>'<br />
C assume cs:code, ds:data, es:nothing, ss:nothing<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
nee reset<br />
mov<br />
in<br />
cmp<br />
jne<br />
mov<br />
push<br />
proc near<br />
dx,f nee status<br />
al,dx<br />
al, 10h<br />
f nee reset ret<br />
- - -<br />
al,diskette status<br />
ax<br />
NEC status port<br />
NEC busy.<br />
no.<br />
save from previous operation.<br />
1-225
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
FSB7 33 CO<br />
FSB9 8B DO<br />
FSBB 9C<br />
FSBC 9A<br />
FSBD EC59 R<br />
FSBF FOOD<br />
FSC1 58<br />
FSC2 A2 0041 R<br />
FSCS<br />
FSCS C3<br />
FSC6<br />
FSC6<br />
FSC6 C6 06 0040 R FF<br />
FSCB 8A 4E 00<br />
FSCE BO 01<br />
FSDO D2 EO<br />
FSD2 84 06 003F R<br />
FSD6 75 12<br />
FSD8 A2 003F R<br />
FSDB 8A E1<br />
FSDD B1 04<br />
FSDF D2 EO<br />
FSE1 oc oc<br />
FSE3 OA C4<br />
FSES BA 03F2<br />
FSE8 EE<br />
FSE9 F9<br />
FSEA<br />
FSEA C3<br />
FSEB<br />
1-226<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
xor<br />
mov<br />
pushf<br />
db<br />
dw<br />
dw<br />
int<br />
pop<br />
mov<br />
nee reset ret:<br />
ret<br />
f nee reset<br />
ax.ax reset call.<br />
dx,ax<br />
9ah<br />
fd io this is call far OfOOO:fd io<br />
code seg<br />
13h<br />
ax<br />
because of ram disks<br />
diskette status.al restore from previous op.<br />
endp<br />
c ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;<br />
c<br />
C (f_motor_on)<br />
c<br />
c<br />
c<br />
INPUT:<br />
c<br />
c<br />
c<br />
c<br />
c ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; . ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
f motor on<br />
f mo ret:<br />
OUTPUT:<br />
DESTROYS:<br />
mov<br />
mov<br />
mov<br />
shl<br />
test<br />
jnz<br />
mov<br />
mov<br />
mov<br />
shl<br />
or<br />
or<br />
mov<br />
out<br />
stc<br />
ret<br />
f motor on<br />
none<br />
Carry set if motor was off. cleared otherwise.<br />
AX. ex<br />
proc near<br />
motor count.OFFh<br />
cl. f drive<br />
al,1<br />
al.cl<br />
al.motor status<br />
f mo ret<br />
motor status.al<br />
ah.cl<br />
cl,4<br />
al.cl<br />
al,OCh<br />
al.ah<br />
dx,f motor port<br />
dx,al<br />
endp<br />
max. time for motor.<br />
drive.<br />
mask for motor status.<br />
test always clears carry.<br />
already running.<br />
set correct bit.<br />
drive into AH.<br />
motor on bit to high nibble.<br />
set bits 2 & 3 (0000 1100).<br />
drive bits ( 0 & 1).<br />
turn on the motor.<br />
motor was off indicator.<br />
c ';;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;' ';;;;;;;;;;''';;;;<br />
c<br />
c<br />
c<br />
Read DASD type<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong>
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
F5EB c<br />
F5EB E8 F603 R c<br />
F5EE E8 F5F6 R c<br />
F5F1 FE CO c<br />
F5F3 E9 ECC2 R c<br />
F5F6 c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
This routine reads the motherboard switches to determine<br />
what type of drive is installed. (value returned from this<br />
routine in AL. exchange to AH made after f io ret).<br />
Returns 0 - not used<br />
1 - low density drive (48tpi)<br />
2- high density drive (1.2Mb)<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
................................................... ' .......................... .<br />
l l! > l l! l! l > l! l l! l >! 1 l 1 l l l! 1! l l l 1 l! 1! l l l!!! l l l l! l l l l l l l 1! I! 1! l! I I 1! 1 I 1'! l l l l > > l 1<br />
f_dtype proc near<br />
call f getdrv get drive bit in bl%<br />
call f drvswitch get switch info%<br />
inc al get return info%<br />
jmp f io ret cmd over%<br />
f_dtype endp<br />
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .................... .<br />
''''' '' ''' '' ''' '''''',' '''' ''' ''' ''''' ''' '''' ''' ', '',', ', ', ', ', '' '','' '''' ''''<br />
Routine checks the hardware switches for the type of drive<br />
being used. The fdu-parameter table (INT1ELOCN) is changed<br />
as is appropriate.<br />
;(commented out because DOS[ibmbios] adjusts the table internally)<br />
..................................................... ' ....................... .<br />
'''' ''''''' ',''', ', '''', '' ''' ', '', ',' '''' '' '''' '' ''' '' '' ''', ', ', '' ''' ', '''' '''<br />
;f_setparms<br />
call<br />
mov<br />
push<br />
push<br />
xor<br />
mov<br />
;assume ds:absO<br />
pop<br />
test<br />
jnz<br />
proc near<br />
f drvswitch<br />
-<br />
bl, f head<br />
ds<br />
ax<br />
ax,ax<br />
ds,ax<br />
ax<br />
bl,80h<br />
f setslow<br />
get drive type in al%<br />
get info b4 change segment%<br />
or<br />
-<br />
al,al<br />
test media/drive mismatch?%<br />
yes,use 320kb(48tpi) info%<br />
else use drive(same as media) info%<br />
jz f setslow<br />
jmp if 48tpi drive%<br />
; ;same parms for now%<br />
mov word ptr INT1ELOCN,offset fd 12parms 12Mb drive%<br />
jmp<br />
;f setslow:<br />
f setdone<br />
mov<br />
;f setdone:<br />
;assume ds:data<br />
word ptr INT1ELOCN,offset fd parms 48 tpi drive%<br />
pop<br />
ret<br />
ds<br />
;f setparms endp<br />
get the configuration switch for the fdu and<br />
return it in the LSB of al.<br />
1-227
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
FSF6<br />
FSF6 E4 67<br />
FSF8 F6 46 00 01<br />
FSFC 75 02<br />
FSFE DO C8<br />
F600<br />
F600 24 01<br />
F602 C3<br />
F603<br />
F603<br />
F603 32 FF<br />
F605 8A SE 00<br />
F608 80 E3 01<br />
F608 C3<br />
F60C<br />
F60C<br />
F60C 8A 46 03<br />
F60F 3C 01<br />
F611 74 OS<br />
F613 C6 06 0041 R 00<br />
F618<br />
F618 E8 F603 R<br />
F61B 80 BF 0092 R 00<br />
F620 75 08<br />
F622 8A 87 0090 R<br />
F626 88 87 0092 R<br />
1-228<br />
c<br />
c<br />
c<br />
c<br />
0 = 48 tpi<br />
1 = 96 tpi I 1.2Mb<br />
c ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
f drvswitch<br />
in<br />
test<br />
jnz<br />
ror<br />
f CV dr:<br />
and<br />
ret<br />
f drvswitch<br />
proc near<br />
al.sys_conf_b switch port<br />
byte ptr f drive, 1 select drive bit%<br />
f cv dr jmp if drive 1%<br />
al,1 shift OrO into LSB%<br />
- -<br />
al, 1 blow off high 7 bits<br />
endp<br />
c<br />
c ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;<br />
c<br />
C f getdrv<br />
c<br />
C Routine gets the input drive parm and returns with<br />
C the LSB (drive number) in bl.<br />
c<br />
c ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ';;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;<br />
c<br />
C f_getdrv<br />
C xor<br />
c<br />
c<br />
mov<br />
and<br />
c ret<br />
proc near<br />
bh,bh<br />
bl,f drive<br />
bl, 1<br />
C f getdrv endp<br />
c<br />
c<br />
get drive bit<br />
c ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;<br />
c<br />
C f nustate<br />
c<br />
C Routine sets the original state if this is the first attempt<br />
C at an operation. The new transfer rate is set. A delay is taken<br />
C if the motor is already on. ( A test for track number
F62A<br />
F62A E8 E93A R<br />
F62D C3<br />
F62E<br />
F62E<br />
F62E<br />
F62E 1E<br />
F62F 33 CO<br />
F631 8E 08<br />
F633 CS 36 0078 R<br />
F637 8A 00<br />
F639 1F<br />
F63A<br />
F63A C3<br />
F63B<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
C f nu cant:<br />
C call<br />
c<br />
c<br />
c<br />
c<br />
c<br />
nus tate<br />
ret<br />
f setrate set transfer rate%<br />
endp<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
c ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;<br />
c<br />
C Get specified byte from fdu parameter table (f get var)<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
INPUT:<br />
OUTPUT:<br />
DESTROYS:<br />
BX parameter number (0 - 10)<br />
AL The requested byte.<br />
AH<br />
c ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
f get var<br />
f_gvok:<br />
f_gvdone:<br />
get_var<br />
mov<br />
and<br />
jz<br />
cmp<br />
jnz<br />
mov<br />
jmp<br />
push<br />
xor<br />
mov<br />
assume<br />
lds<br />
mov<br />
pop<br />
assume<br />
ret<br />
proc near<br />
al,f head<br />
al,80h<br />
f_gvok<br />
bl,S<br />
f_gvok<br />
al,23h<br />
f gvdone<br />
ds<br />
ax,ax<br />
ds,ax<br />
ds:absO<br />
si,dword ptr<br />
al, (bx+si]<br />
ds<br />
ds:data<br />
endp<br />
(int1Elocn]<br />
;get media info%<br />
media-drive match%<br />
test gap parm%<br />
return it%<br />
segment 0<br />
tell assembler seg 0:<br />
DS:SI points to table<br />
; tell assembler seg 40:<br />
c<br />
c ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;<br />
c<br />
C NEC ready ( f nee rdy)<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
INPUT:<br />
OUTPUT:<br />
none<br />
AL<br />
ox<br />
;%<br />
Main Status Register byte.<br />
Points to port 3F4h<br />
1-229
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
F63B<br />
F63B 51<br />
F63C 33 C9<br />
F63E<br />
F63E BA 03F4<br />
F641 EC<br />
F642 A8 80<br />
F644 75 OA<br />
F646 E2 F6<br />
F648 C6 06 0041 R 80<br />
F64D E9 ECC2 R<br />
F650<br />
F650 59<br />
F651 C3<br />
F652<br />
F652<br />
F652 FB<br />
F653 51<br />
F654 B9 03E8<br />
F657<br />
F657 F6 06 003E R 80<br />
F65C 75 00<br />
F65E E8 EF4C R<br />
F661 E2 F4<br />
F663 C6 06 0041 R 80<br />
F668 E9 ECC2 R<br />
F66B<br />
F66B 80 26 003E R 7F<br />
F670 59<br />
F671 C3<br />
F672<br />
1-230<br />
C DESTROYS:<br />
c<br />
c '''';;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;'<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
f_nec_rdy<br />
f nr1:<br />
f nr ret:<br />
push<br />
xor<br />
mov<br />
in<br />
test<br />
jnz<br />
loop<br />
mov<br />
jmp<br />
pop<br />
ret<br />
c<br />
c<br />
c ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;<br />
c<br />
nee rdy<br />
proc near<br />
ex<br />
cx,cx<br />
dx,f nee status Main status register(3F4h)<br />
al,dx<br />
al,080h RQM<br />
f nr ret NEC is ready.<br />
f nr1<br />
diskette status,time out<br />
f io ret Took too long to respond.<br />
ex<br />
- -<br />
endp<br />
- -<br />
C Wait for NEC to interupt on completion of execution phase or<br />
C time out if NEC never interupts (f wait for_nec).<br />
c<br />
c<br />
c<br />
INPUTS:<br />
C OUTPUTS:<br />
c<br />
none<br />
c ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ''''' ';;;;;;;;;;;;;;;;;;;;;;;;;;;<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
f wait for nee<br />
w nee:<br />
sti<br />
push<br />
mov<br />
test<br />
jnz<br />
call<br />
loop<br />
mov<br />
jmp<br />
w nee ret:<br />
and<br />
pop<br />
ret<br />
f wait for nee<br />
- - -<br />
proc near<br />
ex<br />
enable interupts<br />
cx,1000 wait a while<br />
seek status,80h test MSB (int_flag)<br />
w nee ret<br />
f wait one ms<br />
w nee<br />
diskette status,time out<br />
f io ret<br />
-<br />
- - -<br />
-<br />
- -<br />
seek status,07Fh clear MSB.<br />
ex<br />
endp<br />
c ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;<br />
c<br />
c chkspeed<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong>
F672<br />
F672 2E: 8E 1E E538 R<br />
F677 BE 0042 R<br />
F67A 46<br />
F67B AC<br />
F67C A8 01<br />
F67E 74 04<br />
F680 F9<br />
F681 EB 02 90<br />
F684<br />
F684 F8<br />
F685<br />
F685 C3<br />
F686<br />
F686<br />
F686 E8 F652 R<br />
F689 B4 08<br />
F68B E8 F6C5 R<br />
F68E E9 EDF8 R<br />
F691<br />
F691<br />
F691 E8 FSC6 R<br />
F694 73 1A<br />
F696 BO 02<br />
F698 8A C8<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
c<br />
C this routine checks the error status associated with the<br />
C previous operation. If the bad-addr-mark error was found<br />
C a speed change will be made. Otherwise the error is taken<br />
C as valid and not retry is made.<br />
c<br />
c OUTPUT: CY=O, no error-> no retry, speed ok.<br />
c CY=1, speed error-> retry at other speed<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
c<br />
c ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; '' '1' ', ', '' ',;;;;;;;;;'<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
chkspeed<br />
mov<br />
mov<br />
inc<br />
lodsb<br />
test<br />
jz<br />
stc<br />
jmp<br />
f speedok:<br />
clc<br />
f cs out:<br />
ret<br />
chkspeed<br />
proc near<br />
ds,word ptr cs:[set_ds_word] ;get segment%<br />
si,offset nee status get buffer%<br />
si point to ST1 of error info%<br />
get error info from DS:SI%<br />
al,01h check for addr-mark error%<br />
f speedok zeros for no error%<br />
flag error%<br />
f cs out done%<br />
endp<br />
; no error%<br />
c ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;<br />
c<br />
C Sense Interrupt Status (f sis).<br />
c<br />
c<br />
c<br />
INPUT:<br />
C OUTPUT:<br />
c<br />
C DESTROYS:<br />
none<br />
c<br />
c ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
f sis proc<br />
call<br />
mov<br />
call<br />
jmp<br />
f sis endp<br />
f wdata proc<br />
call<br />
jnc<br />
mov<br />
mov<br />
near<br />
f wait for nee<br />
ah,f snsint cmd<br />
f_put_byte<br />
f get_byte<br />
near<br />
f motor on<br />
f wd1<br />
al,2<br />
cl,al<br />
no return on error.<br />
end of command phase.<br />
no return on error.<br />
sets carry if motor was off.<br />
motor was on, skip delay.<br />
assume slow motor bit%<br />
1-231
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
F69A BA 007D<br />
F69D D3 E2<br />
F69F BB OOOA<br />
F6A2 E8 F62E R<br />
F6A5 32 E4<br />
F6A7 F7 E2<br />
F6A9 8B C8<br />
F6AB<br />
F6AB E8 EF4C R<br />
F6AE E2 FB<br />
F6BO<br />
F6BO 80 DE 003F R 80<br />
F6B5 BO 4A<br />
F6B7 E9 ED77 R<br />
F6BA<br />
F6BA<br />
F6BA DO CO<br />
F6BC DO CO<br />
F6BE 24 03<br />
F6CO<br />
F6CO BA 0065<br />
F6C3 EE<br />
F6C4 C3<br />
F6C5<br />
F6C5<br />
F6C5 E8 F63B R<br />
F6C8 A8 40<br />
1-232<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
mov<br />
shl<br />
mov<br />
call<br />
xor<br />
mul<br />
mov<br />
f wd loop:<br />
call<br />
f wd1:<br />
loop<br />
or<br />
mov<br />
jmp<br />
f wdata endp<br />
dx, 125<br />
dx,cl<br />
bx, 10<br />
f_get var<br />
ah,ah<br />
dx<br />
cx,ax<br />
f wait one ms<br />
f wd loop<br />
- -<br />
motor status,080h<br />
al,04Ah<br />
f rw common<br />
125 ms delay to start with.<br />
125 X 4<br />
motor start delay parameter.<br />
returns param. in AL.<br />
for good measure.<br />
AX has total delay<br />
set high bit, indicate write.<br />
DMA mode byte: channel 2,<br />
single mode, read transfer<br />
c ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;<br />
c<br />
C f setff<br />
c<br />
C routine writes to the fdu rate flip-flops<br />
C (called in setrate and f check valid.)<br />
c<br />
C INPUT: AL- parm to determine rate: eg. diskstate[],lastrate[]<br />
c<br />
c ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;<br />
c<br />
C f setff proc<br />
C rol<br />
rol<br />
c<br />
c<br />
and<br />
near<br />
al,1<br />
al,1<br />
al,3<br />
move onto low bits%<br />
move%<br />
C ENDIF ; non-beta units use 2 bits for data transfer rate%<br />
C f dorate:<br />
C mov<br />
C out<br />
c ret<br />
C f setff endp<br />
c<br />
dx,65h<br />
dx,al<br />
hold relevant bits%<br />
rate port%<br />
set rate%<br />
c ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;<br />
c<br />
C Send a byte to the NEC controller (f put byte)<br />
c<br />
c INPUT: AH byte to output.<br />
c<br />
C OUTPUT:<br />
c<br />
c ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;<br />
c<br />
C f_put_byte<br />
c<br />
c<br />
c<br />
c<br />
proc near<br />
call f_nec_rdy ; returns MSR byte in AL.<br />
test al,40h ; direction bit.<br />
We could put a little more intelligence here to determine why the NEC balked.<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong>
c<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
F736 BO 00 c mov al,dma unmask 0 turn on RAM refresh channel 0<br />
F738 E6 OA c out dma mask bit,al<br />
c<br />
c Program p_8253_1 of i8254 p_timer to proper value for RAM refresh.<br />
c<br />
F73A BO 74 c mov al,t1cmd select p dma refresh counter<br />
F73C E6 43 c out p 8253 ctr l, al<br />
c<br />
F73E BO 13 c mov al,t1count load p dma refresh count<br />
F740 E6 41 c out p 8253 1, al<br />
F742 32 co c xor al,al<br />
F744 E6 41 c out p 8253 1, al<br />
c<br />
c assume CS:COde, ds:nothing, es:nothing, ss:stack_ram<br />
c<br />
F746 8C D7 c mov di,ss ; save stack pointer<br />
F748 8B EC c mov bp,sp<br />
F74A BA 0030 c mov dx,stack seg<br />
F74D 8E D2 c mov ss.dx<br />
F74F BC 0100 c mov sp, 100h<br />
c<br />
F752 50 c push ax ; save error code<br />
c<br />
c Initialize & Disable 8259A Programmable Interrupt Controller.<br />
c<br />
F753 E8 E1A6 R c call i pic init<br />
F756 E8 E164 R c call i vector<br />
c<br />
c Install Vector Table. set int10locn = code_seg:v io, and<br />
c set int1Dlocn = code seg:v_parms.<br />
c<br />
c Initialize Video.<br />
c<br />
F759 E8 EOAO R c call i d init<br />
c<br />
c Display error message.<br />
c<br />
F75C 58 c pop ax restore error code<br />
c<br />
F75D E8 E540 R c call DRomString display string at cs:si.<br />
c<br />
F760 BE D9CC R c mov si,cs:(offset fail_m)<br />
F763 E8 E540 R c call DRomString display fail message.<br />
c<br />
F766 OA E4 c or ah,ah ah = O?<br />
F768 74 08 c jz i fatal ret if so, no arguments<br />
c<br />
F76A E8 E56C R c call DColon display a colon<br />
c<br />
F76D 8A C4 c mov al,ah display error code<br />
F76F E8 E589 R c call DHexByte<br />
F772 c i fatal ret:<br />
F772 E8 E55F R c call DCrlf<br />
c<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong> 1-235
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
F775 BA 0378<br />
F778 EC<br />
F779 34 3F<br />
F77B EE<br />
F77C 8E D7<br />
F77E 8B E5<br />
F780 F4<br />
F781<br />
F781<br />
F781<br />
F841<br />
F841<br />
F841 FB<br />
F842 1E<br />
F843 B8 0040<br />
F846 8E 08<br />
F848 A1 0013 R<br />
F84B 1F<br />
F84C CF<br />
F84D<br />
1-236<br />
c<br />
C ;Output fatal error status for manufacturing tests<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
mov<br />
in<br />
xor<br />
out<br />
mov<br />
mov<br />
ret<br />
hlt<br />
C i fatal endp<br />
c<br />
C code ends<br />
C include mem.asm<br />
c<br />
c<br />
dx,378h<br />
al,dx<br />
al,03fh<br />
dx,al<br />
parallel port address<br />
read last checkpoint value<br />
extract checkpoint number from status<br />
output " Not OK - number"<br />
assume cs:code, ds:nothing, es:nothing, ss:nothing<br />
ss,di<br />
sp,bp<br />
; restore stack pointer<br />
c ·======================================================================<br />
C Filename: mem. src<br />
c<br />
C This module includes INT 12h. 11h. & 15h.<br />
c<br />
c ·======================================================================<br />
c<br />
C code segment public '<strong>ROM</strong>'<br />
C assume cs:code, ds:nothing, es:nothing, ss:nothing<br />
c<br />
c .---------------------------------------------------------------------c<br />
INT 12h -- memory size detect<br />
c .----------------------------------------------------------------------<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
m size<br />
m size<br />
ORG<br />
proc<br />
assume<br />
sti<br />
push<br />
mov<br />
mov<br />
assume<br />
mov<br />
pop<br />
iret<br />
endp<br />
OF841h<br />
near<br />
CS:COde, ds:nothing, es:nothing, ss:nothing<br />
ds<br />
ax,data_seg<br />
ds.ax<br />
CS:COde, ds:data, es:nothing, ss:nothing<br />
ax,word ptr ds:[memory_size]<br />
ds<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong>
F84D<br />
F84D<br />
F84D FB<br />
F84E 1E<br />
F84F B8 0040<br />
F852 8E 08<br />
F854 A1 0010 R<br />
F857 1F<br />
F858 CF<br />
F859<br />
F859<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
c .--------------------------------------------------------------------c<br />
INT 11h -- equipment check<br />
c ·--------------------------------------------------------------------c<br />
c<br />
AX returns the following values:<br />
c<br />
40:11<br />
40:10<br />
c<br />
I<br />
--- -- ------------------ - --<br />
C I no. I I Ga I no. I of I no. I of I vi Ideo I pla I nar I 2 I di I<br />
C I I of I - I me I I com I m I - I f I dus I ty I pe I mem I ory I 8 I skI<br />
C I prn I trs I I I I poI rts I I I I I I I I 7 I I<br />
c --------l---l---l-----------l---l-------l-------l-------1---l----c<br />
C No. of printers 0-3<br />
C Game = 1 => game adapter attached<br />
C No. of comm ports 0-7<br />
C No. of fdu's => 00 1 fdu<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
Video type =><br />
01<br />
10<br />
01<br />
10<br />
11<br />
C Planar memory always 1<br />
c<br />
C 287 = 1 => 287 attached<br />
c<br />
C Disk always 1<br />
c<br />
c<br />
c<br />
c ORG OF84Dh<br />
c<br />
C m equip proc near<br />
2 fdu<br />
3 fdu<br />
Monochrome<br />
Monochrome<br />
Monochrome<br />
40 cols<br />
80 cols<br />
test<br />
c assume cs:code, ds:nothing, es:nothing, ss:nothing<br />
c<br />
C sti<br />
C push ds<br />
C mov ax, data_ seg<br />
C mov ds, ax<br />
c<br />
C assume cs:code, ds:data, es:nothing, ss:nothing<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
mov<br />
pop<br />
iret<br />
C m equip endp<br />
c<br />
ax,word ptr ds:[switch_bits]<br />
ds<br />
c .----------------------------------------------------------------------<br />
( INT 15h -- cassette I/O<br />
c ·---------------------------------------------------------------------c<br />
c ORG OF859h<br />
1-237
F859<br />
F859 EA<br />
F85A E6F5 R<br />
F85C FOOD<br />
F85E<br />
F85E<br />
F85E<br />
F85F<br />
F85F<br />
F85F 50<br />
F860 E4 62<br />
F862 24 co<br />
F864 74 DE<br />
F866 BE E5FB R<br />
F869 DO CO<br />
F86B 72 03<br />
F86D BE E618 R<br />
F870<br />
F870 E8 E540 R<br />
F873 F4<br />
F874<br />
F874 58<br />
F875 CF<br />
F876<br />
F876<br />
1-238<br />
c<br />
C m cass proc far<br />
C assume cs:code, ds:nothing, es:nothing, ss:nothing<br />
c<br />
c<br />
c<br />
c<br />
stc<br />
mov<br />
ret<br />
C . . iret<br />
c<br />
c<br />
c<br />
c<br />
jmp<br />
db<br />
dw<br />
dw<br />
C m cass endp<br />
c<br />
C code ends<br />
C include nmi.asm<br />
c<br />
ah,86h<br />
2<br />
word ptr cs:add mem code<br />
Oeah<br />
add mem code<br />
code_seg<br />
; error<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
c ·======================================================================<br />
Filename: nmi.src<br />
c<br />
c<br />
C This module includes INT 02h.<br />
c<br />
C And ENABLE PARITY<br />
c<br />
c ·======================================================================<br />
c<br />
C code<br />
c<br />
c<br />
segment public '<strong>ROM</strong>'<br />
assume cs:code, ds:nothing, es:nothing, ss:nothing<br />
c ·----------------------------------------------------------------------<br />
( INT 02h<br />
c .----------------------------------------------------------------------<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
n int<br />
n 1:<br />
n out:<br />
n int<br />
code<br />
ORG<br />
proc<br />
push<br />
in<br />
and<br />
jz<br />
mov<br />
rol<br />
jc<br />
mov<br />
call<br />
hlt<br />
pop<br />
iret<br />
endp<br />
ends<br />
OF85Fh<br />
near<br />
ax<br />
al,ControlC High two bits indicate parity.<br />
al,OCOh Mask of low 6 bits.<br />
n out It wasn't a parity interrupti<br />
-<br />
si,offset parity1_m System board message.<br />
al,1<br />
n 1<br />
si,offset parity2_m Expansion board message.<br />
DRomString<br />
ax<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong>
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
F876 c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
include boot2.asm<br />
Filename: boot.src<br />
This module includes INT 19h.<br />
code segment public '<strong>ROM</strong>'<br />
assume cs:code, ds:nothing, es:nothing, ss:nothing<br />
INT 19h -- Cold boot routine:<br />
This code reads Track 0, Side 0, Sector 0 into memory at<br />
0000:7COO and iret's into the secondary boot-strap loader<br />
Note: The stack looks like this at exit I 11 1<br />
Output:<br />
High Address<br />
1------------------1 Fixed Disk (C:). ]<br />
These three parameters will<br />
specify the booted partition<br />
in the case of the fixed disk.<br />
(AL) = Number of Sectors read [in order to read 512 bytes.<br />
(ES:BX) = Address of the transfer [0000:7COO]<br />
(DS:BX)<br />
(CS:IP) =Address of entry point [0000:7COO]<br />
(SS:SP) = Stack Segment and Pointer are left intact from the INT<br />
19h invocation for multi-tasking environments.<br />
(IF) = The interrupt enable flag is left intact from the INT<br />
19h invocation for multi-tasking environments.<br />
Trash: bp destoryed. (si, di, & bp preserved.)<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong> 1-239
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
F876<br />
F876 FB<br />
F877 55<br />
F878 56<br />
F879 2E: 8E 1E E538 R<br />
F87E BE 0935 R<br />
F881 E8 E540 R<br />
F884 32 DB<br />
F886 53<br />
F887<br />
F887 33 CO<br />
F889 8E 08<br />
F88B 8E CO<br />
c ·======================================================================<br />
c<br />
C bt int proc near<br />
C assume cs:code, ds:nothing, es:nothing, ss:nothing<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c , ,<br />
c , ,<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
sti<br />
push<br />
push<br />
bp<br />
si<br />
enable interrupts<br />
save BP & SI<br />
c assume ds:data<br />
C mov ds,word ptr cs:(set_ds_word]<br />
C ; ; ; EGA2 fix<br />
mov word ptr ds:(master_tbl_ptr+OOOOh],cs:(offset mastab)<br />
mov word ptr ds:(master_tbl ptr+0002h],cs<br />
mov<br />
call<br />
xor<br />
push<br />
si,cs:(offset bt_m)<br />
DRomString<br />
bl,bl<br />
bx<br />
C assume ds:absO, es:absO<br />
c bt 0:<br />
C xor<br />
C mov<br />
mov<br />
c<br />
c<br />
F88D C7 06 0078 R EFC7 R C<br />
F893 8C OE 007A R C<br />
F897 BD 0003<br />
F89A<br />
F89A 33 CO<br />
F89C 8B 08<br />
F89E 8B C8<br />
F8AO 8B DO<br />
F8A2 CD 13<br />
F8A4 72 OA<br />
F8A6 B8 0201<br />
F8A9 B7 7C<br />
F8AB 41<br />
1-240<br />
ax,ax<br />
ds,ax<br />
es,ax<br />
C Reset fd parms table vector.<br />
c<br />
c<br />
mov<br />
mov<br />
C Initialize retry loop.<br />
c<br />
C mov bp,3<br />
c bt i:<br />
c<br />
C Initialize the drive.<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
xor<br />
mov<br />
mov<br />
mov<br />
INT<br />
jc<br />
reset master table ptr to <strong>ROM</strong><br />
satisfy assumption<br />
boot strap message<br />
print banner<br />
disable error message blinking<br />
save blink status<br />
boot strap outer loop<br />
AX= absO seg.<br />
satisfy assumptions<br />
word ptr ds:(int1Elocn+O],cs:(offset fd_parms)<br />
word ptr ds:(int1Elocn+2],cs<br />
ax,ax<br />
bx,ax<br />
cx,ax<br />
dx,ax<br />
13h<br />
bt nxt<br />
C Read the boot sector.<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
mov<br />
mov<br />
inc<br />
ax,0201h<br />
bh,7Ch<br />
ex<br />
retry counter<br />
boot retry inner loop<br />
AX = 0.<br />
BX = 0.<br />
ex = o.<br />
ox= 0.<br />
try again, if error<br />
read one sector<br />
bl = 0.<br />
xfer address= ES:BX = 0:7COO<br />
ex = 0.<br />
track 0; sector 1<br />
dx = 0.<br />
head 0; drive 0<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong>
F90E<br />
F90E 50<br />
F90F BA 0070<br />
F912 EC<br />
F913<br />
F913 BA 007C<br />
F916 E8 F96C R<br />
F919 8A E8<br />
F91B B2 7B<br />
F91D E8 F97F R<br />
F920 48<br />
F921 8B D8<br />
F923 E8 F97F R<br />
F926 48<br />
F927 8B DO<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
c<br />
c<br />
c<br />
c<br />
c<br />
c Trash:<br />
ch =<br />
cl =<br />
dh =<br />
dl =<br />
None.<br />
hour<br />
minutes<br />
seconds<br />
hundredths of seconds<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
c ·======================================================================<br />
c<br />
C c read proc near<br />
C assume cs:code. ds:nothing. es:nothing. ss:nothing<br />
c<br />
C Save registers.<br />
c<br />
c<br />
c<br />
C Years.<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
years:<br />
push<br />
mov<br />
in<br />
mov<br />
mov<br />
in<br />
in<br />
call<br />
mov<br />
Months.<br />
Days.<br />
ax<br />
dx,70h<br />
al.dx<br />
dx.7Fh<br />
dx.7Ch<br />
al.dx<br />
al.dx<br />
c rBCD<br />
ch,al<br />
mov bx.ax<br />
dec dx<br />
dx was dec inc rhex to 79 already.<br />
call c rhex<br />
dec ax<br />
C Calculate Day (ax has day).<br />
c<br />
c<br />
c<br />
mov dx.ax<br />
C Calculate Month (bx has month).<br />
c<br />
:: clear data changed flag<br />
...<br />
; interrupts (years mod 8)%<br />
: units year port%<br />
;%<br />
;%<br />
al = years<br />
ch = saves year mod 8<br />
c 7Ch por·t = tens of mths for MM5827 4A chip%<br />
;mov dl.07Ch dl = tens of months port = 7Ch%<br />
mov dl,07Bh<br />
dl = tens of mths port. MM58274A chip%<br />
call c rhex<br />
Input: dl = tens of mon.s port = 7Ch<br />
dec ax<br />
Output: ax = hex of months (1-12)<br />
dx = day of week port = 7Ah<br />
ax = map month (1-12) to month (0-11)<br />
bx = saves month (0-11)<br />
: dl = tens of days port = 79h<br />
hence comment out original dec dx inst%<br />
Input: dl = tens of days port = 79h<br />
Output: ax = hex of days (1-?)<br />
dx = tens of hours port = 77h<br />
ax = map days (1-?) to days (0-?)<br />
: dx = day<br />
1-243
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
F929 48 c dec bx previous month<br />
F92A 7S OS c<br />
c<br />
js c rmo jump if it was zero<br />
F92C c c rmlp:<br />
F92C ES FA41 R c call c gdays get days per month<br />
F92F 03 DO c add dx,ax dx = day + current month<br />
F931 48 c dec bx previous month<br />
F932 79 FS c<br />
c<br />
jns c_rmlp<br />
F934 c c rmO: zero case<br />
c dx = day + month<br />
c<br />
c<br />
Calculate Year (ch has month).<br />
F934 33 DB c xor bx,bx clear bh<br />
F936 SA DO c mov bl,ch get year mod S<br />
F93S 01 E3 c shl bx, 1 make word index<br />
F93A 2E: 03 97 FSF2 R c<br />
c<br />
add dx,word ptr cs:[bx+c_dy_yr]<br />
F93F SB DA c<br />
c<br />
mov bx,dx : bx = day + month + year<br />
c<br />
c<br />
Hours.<br />
F941 82 77 c mov dl,077h dl = tens of hours port = 77h<br />
F943 ES F97F R c call c rhex Input: dl = tens of hours port = 77h<br />
c Output: ax = hexadecimal of hours<br />
c dx = tens of min.s port = 75h<br />
F946 SA ES c<br />
c<br />
mov ch,al ch = hours<br />
c Minutes.<br />
c dl = tens of minutes port = 75h<br />
F94S ES F97F R c call c rhex Input: dl = tens of min.s port = 75h<br />
c Output: ax = hexadecimal of minutes<br />
c dx = tens of sec.s port= 73h<br />
F94B SA CS c<br />
c<br />
mov cl,al cl = minutes<br />
c Seconds.<br />
c dl = tens of seconds port = 73h<br />
F94D ES F97F R c call c rhex Input: dl = tens of sec.s port = 73h<br />
c Output: ax = hexadecimal of seconds<br />
c dx = tenths of sees port = 71h<br />
F950 SA FO c<br />
c<br />
mov dh,al dh = seconds<br />
F952 52 c<br />
c<br />
c<br />
push dx save seconds (dh)<br />
c<br />
c<br />
Hundredths of Seconds.<br />
c dl = tenths of seconds port = 71h<br />
F953 ES F96C R c call c rBCD al = tenths of seconds<br />
F956 SA EO c mov ah,al move tenths of seconds to high byte<br />
F95S 32 co c xor al,al ax = BCD of hundredths of seconds<br />
F95A ES F989 R c<br />
c<br />
call c BCD2hex ax = hex of hundredths of seconds<br />
F95D 50<br />
F95E BA 0070<br />
c<br />
c<br />
push<br />
mov<br />
ax<br />
dx,70h<br />
save ax ''''<br />
read the data changed flag<br />
''''<br />
1-244 <strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong>
F961 EC c in al,dx again<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
F962 AS 08 c test al,Sh if bit is set then reread the chip<br />
F964 58 c pop ax reset ax<br />
F965 SA c pop dx ; restore seconds (dh)<br />
F966 75 AB c jnz years<br />
c<br />
F968 SA DO c mov dl,al dl = hex of hundredths of seconds<br />
c<br />
c Restore registers.<br />
c<br />
c<br />
F96A 58 c pop ax<br />
F96B C3 c ret<br />
c<br />
F96C 51 c c rBCD: push ex save ex<br />
F96D B9 0003 c mov cx,3 try 3 times only I! 1<br />
F970 32 F6 c xor dh,dh clear dh<br />
c<br />
F972 EC c c rBlp: in al,dx get the byte<br />
F973 24 OF c and al,OFh clear high nibble<br />
F975 3C OA c cmp al, 10 is it less than 10?<br />
F977 72 04 c jb c rBret if so, return<br />
c<br />
F979 E2 F7 c loop c rBlp else, try again<br />
F97B BO 01 c mov al,1 if timeout, return one.<br />
c<br />
F97D c c rBret:<br />
F97D 59 c pop ex restore ex<br />
F97E C3 c ret<br />
F97F c c read endp<br />
F97F c c rhex proc near<br />
c<br />
c<br />
c END IF<br />
c END IF<br />
c .---------------------------------------------------------------------c<br />
Convert to Hex (c rhex)<br />
c<br />
c Inputs both BCD bytes and converts to hexdecimal word.<br />
c<br />
c Input: dl = pointer to tens of whatever port<br />
c Output: ax = hexadecimal word (ah = 0)<br />
c dx = pointer to tens of previous port (dh = 0)<br />
c<br />
c Trash: None.<br />
c .---------------------------------------------------------------------c<br />
c assume CS:COde, ds:nothing, es:nothing, ss:nothing<br />
c<br />
F97F E8 F96C R c call c rBCD in from tens of whatever<br />
F982 SA EO c mov ah,al move tens of whatever to high byte<br />
F984 4A c dec dx dx points to units of whatever port<br />
F985 E8 F96C R c call c rBCD in from units of whatever<br />
F988 4A c dec dx dx points to tens of previous port<br />
c<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong> 1-245
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
F989<br />
F989<br />
F989 8A F4<br />
F98B DO E6<br />
F98D DO E6<br />
F98F 02 F4<br />
F991 DO E6<br />
F993 02 C6<br />
F995 32 E4<br />
F997 32 F6<br />
F999 C3<br />
F99A<br />
F99A<br />
F99A 80 F9 3C<br />
F99D 72 01<br />
F99F C3<br />
F9AO<br />
F9AO 80 FD 18<br />
F9A3 72 01<br />
1-246<br />
c<br />
c<br />
jmp<br />
C c rhex endp<br />
short c BCD2hex fall through<br />
c<br />
c .--------------------------------------------------------------------c<br />
C BCD to Hexadecimal ( c BCD2hex)<br />
c<br />
C Input: ah = high BCD digit<br />
C al = low BCD digit<br />
C Output: ax = hexadecimal byte (ah = 0)<br />
c dh = 0<br />
C Trash: None.<br />
c ·----------------------------------------------------------------------<br />
c<br />
C c BCD2hex<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c BCD2hex<br />
mov<br />
shl<br />
shl<br />
add<br />
shl<br />
add<br />
xor<br />
xor<br />
ret<br />
c<br />
c ·----------------------------------------------------------------------<br />
IF G4TOD<br />
proc near<br />
assume cs:code. ds:nothing, es:nothing, ss:nothing<br />
dh,ah dh = hi BCD digit<br />
dh,1 dh = 2*(hi BCD digit)<br />
dh, 1 dh = 4*(hi BCD digit)<br />
dh,ah dh = 5*(hi BCD digit)<br />
dh,1 dh = 10*(hi BCD digit)<br />
al,dh al = 10*(hi BCD digit)+(low BCD digit)<br />
ah,ah ax = 10*(hi BCD digit)+(low BCD digit)<br />
dh,dh dh = 0<br />
endp<br />
c Write Clock Calendar Device (c write)<br />
c<br />
C Input: ah = -1<br />
c<br />
c<br />
c<br />
c<br />
bx = day (from 1-1 of leap year up to 12-31 of leap year+7)<br />
(0-2921) = (0-B69h)<br />
ch = hour (0-23)<br />
cl = minutes (0-59)<br />
C Output: ah = -1 implies date/time error<br />
C ah = 0 implies date/time OK<br />
C Trash: None.<br />
c .----------------------------------------------------------------------<br />
(<br />
c c write proc near<br />
C assume cs:code, ds:nothing, es:nothing, ss:nothing<br />
c<br />
C Check for errors.<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
label1:<br />
cmp<br />
jb<br />
ret<br />
cmp<br />
jb<br />
cl,60<br />
label1<br />
ch,24<br />
label2<br />
cl = minutes (0-59)<br />
jif within the range%<br />
return (c_werr too far) %<br />
ch = hour (0-23)<br />
jif within the range%<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong>
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
F9D4 BB 0010 c mov bx. (8*2) word index of year<br />
F9D7 c c_wylp:<br />
F9D7 4B c dec bx<br />
F9D8 4B c dec bx<br />
F9D9 2E: 3B 97 F8F2 R c cmp dx,word ptr cs:[bx+c dy yr]<br />
F9DE 72 F7 c jb c_wylp<br />
c<br />
F9EO 2E: 2B 97 F8F2 R c sub dx,word ptr cs:[bx+c dy yr] dx = saves day of year<br />
F9ES D1 EB c shr bx,1 bl = year mod 8<br />
F9E7 8A EB c mov ch,bl ch = saves year mod 8<br />
c<br />
c Calculate LEAP YEAR counter for clock setting register%<br />
F9E9 B8 0004 c mov ax,4 ;%<br />
F9EC 3B C3 c cmp ax,bx check if year is > 4%<br />
F9EE 72 04 c jb leap1 jif less than 4 since 1984%<br />
F9FO 2B C3 c sub ax,bx ax = year since 1984 modulo 4%<br />
F9F2 8B D8 c mov bx,ax so that bx = modulo 4 LEAP%<br />
c YEAR counter since 1984%<br />
F9F4 c leap1: ;%<br />
F9F4 8B C3 c mov ax,bx ;%<br />
F9F6 D1 EO c shl ax,1 ; Shift LEAP COUNTER into pro-%<br />
F9F8 D1 EO c shl ax,1 ;%<br />
c bit position for clock reg%<br />
F9FA DC 01 c or al, 1 set 24-hour mode%<br />
F9FC E6 7F c out 7Fh,al set LEAP counter & 24-hour%<br />
c<br />
c Calculate Days & Months.<br />
c<br />
F9FE BB FFFF c mov bx,-1 start at January<br />
FA01 c c wmlp:<br />
FA01 43 c inc bx next month<br />
FA02 E8 FA41 R c call c_gdays get days per month<br />
FADS 2B DO c sub dx,ax<br />
FA07 73 F8 c jae c wmlp<br />
c bx = month (0-11)<br />
FA09 03 C2 c add ax,dx ax = day (0-?)<br />
c<br />
c Days.<br />
c<br />
FAOB B2 78 c mov dl,078h dl = units of days port = 78h<br />
FAOD 40 c inc ax al = map days (0-?) to days (1-?)<br />
FADE E8 FA30 R c call c whex Input: al = hexadecimal of days<br />
c dl = units of days port = 78h<br />
c Output: ax = trash<br />
c dx = day of week port = 7Ah<br />
c For MM58274 chip 7Ah is Units Months port<br />
c Months.<br />
c<br />
c inc dx ; dl = units of months port = 7Bh%<br />
c comment out the above because 7Ah is already units of months%<br />
FA11 8B C3 c mov ax,bx al = month (0-11)<br />
FA13 40 c inc ax al = map month (0-11) to month (1-12)<br />
FA14 E8 FA30 R c call c whex Input: al = hexadecimal of months<br />
c dl = units of mon.s port = 7Bh<br />
c Output: ax = trash<br />
1-248 <strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong>
FA17 8A CS<br />
FA19 E6 7C<br />
FA18 88 0002<br />
FA1E E6 70<br />
FA20 88 0008<br />
FA23 E6 7F<br />
FA25 33 co<br />
FA27 E6 70<br />
FA29 SA<br />
FA2A 59<br />
FA28 58<br />
FA2C 58<br />
FA20 32 E4<br />
FA2F<br />
FA2F C3<br />
FA30<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
C dx = leap year port = 7Dh<br />
C Leap Years.<br />
mov al,08h<br />
mov cl,ch<br />
and cl,03h<br />
shr al,cl<br />
out dx,al<br />
C ; dx = leap year port = 7Dh, MM58274A%<br />
c<br />
C Years.<br />
c<br />
c inc dx<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
inc dx<br />
mov al.ch<br />
or al,08h<br />
out dx,al%<br />
nap%<br />
in al,dx%<br />
nap%<br />
in al,dx%<br />
nap%<br />
Start Clock.<br />
in al,dx%<br />
mov al,ch<br />
out 7Ch,al<br />
mov al,OFFh<br />
dec dx<br />
out dx,al<br />
mov ax,2<br />
out 70h,al<br />
mov ax,08h<br />
out 7Fh,al<br />
xor ax,ax<br />
out 70h,al<br />
Restore registers.<br />
c werr:<br />
pop dx<br />
pop ex<br />
pop bx<br />
pop ax<br />
xor ah,ah<br />
ret<br />
c write endp<br />
END IF<br />
;%<br />
dx = stop/start = 7Eh%<br />
dx = interrupt = 7Fh%<br />
get year mod 8%<br />
set 'repeated interrupt' bit%<br />
get year since beginning of time %<br />
units year port%<br />
al = OFFh%<br />
dx = stop/start = 7Eh%<br />
start clock%<br />
; select the interrupt register%<br />
; repeated interrupts, every second%<br />
;%<br />
;%<br />
; start the clock%<br />
ah = 0 no error<br />
1-249
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
FA30<br />
FA30 32 E4<br />
FA32 B6 OA<br />
FA34 F6 F6<br />
FA36 86 C4<br />
FA38 32 F6<br />
FA3A EE<br />
FA3B 8A C4<br />
FA3D 42<br />
FA3E EE<br />
FA3F 42<br />
FA40 C3<br />
FA41<br />
FA41<br />
FA41 33 CO<br />
FA43 2E: 8A 87 F902 R<br />
FA48 80 FB 01<br />
FA4B 75 06<br />
FA4D F6 CS 03<br />
1-250<br />
C ENDIF<br />
c ·---------------------------------------------------------------------c<br />
Converts hexadecimal byte to BCD and outputs both bytes. (c whex)<br />
c<br />
C Input: al = hexadecimal byte<br />
C dl = pointer to units of whatever port<br />
C Output: dx = pointer to units of next port (dh = 0)<br />
c<br />
C Trash: ax destroyed.<br />
c .---------------------------------------------------------------------c<br />
C c whex proc near<br />
c assume cs:code, ds:nothing, es:nothing, ss:nothing<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
xor<br />
mov<br />
div<br />
xchg<br />
xor<br />
out<br />
mov<br />
inc<br />
out<br />
inc<br />
ret<br />
C c whex endp<br />
ah,ah<br />
dh,10<br />
dh<br />
al,ah<br />
dh,dh<br />
dx,al<br />
al,ah<br />
dx<br />
dx,al<br />
dx<br />
ax = hexadecimal byte<br />
dh = divisor<br />
ah = remainder = low BCD digit (0-9)<br />
al = quotient = high BCD digit<br />
ah = quotient = high BCD digit<br />
al = remainder = low BCD digit (0-9)<br />
dx points to units of whatever port<br />
out to units of whatever<br />
move tens of whatever to low byte<br />
dx points to tens of whatever port<br />
out to tens of whatever<br />
dx points to units of next port<br />
c<br />
c .--------------------------------------------------------------------c<br />
C Get Days per Month. ( c _gdays)<br />
c<br />
C This routine calculates the number of days<br />
C per month based on the year without checking validity of month.<br />
c<br />
c<br />
c<br />
c<br />
c<br />
Input: bx<br />
ch<br />
Output: ax<br />
C Trash: None.<br />
= month (assumes bx < 12)<br />
= year<br />
= days in month, if month valid: else garbage<br />
c .---------------------------------------------------------------------c<br />
C c_gdays proc near<br />
C assume cs:code, ds:nothing, es:nothing, ss:nothing<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
xor<br />
mov<br />
cmp<br />
jnz<br />
test<br />
ax,ax<br />
al,cs:[bx+c_dy_mo]<br />
bl,1<br />
c gret<br />
ch,03h<br />
: clear ah<br />
is is February?<br />
if not February, return<br />
if year= 0 mod 4, leap year<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong>;
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
FAF6 02 DE 3E FE 3E DE c DB 02h,Oeh,3eh,Ofeh,3eh,Oeh,02h,OOh 11<br />
02 00 c<br />
FAFE 18 3C 7E 18 18 7E c DB 18h,3ch,7eh, 18h, 18h,7eh,3ch,18h 12<br />
3C 18 c<br />
FB06 66 66 66 66 66 00 c DB 66h,66h,66h,66h,66h,OOh,66h,OOh 13<br />
66 00 c<br />
FBOE 7F DB DB 7B 1B 1B c DB 7fh,Odbh,Odbh,7bh,1bh,1bh, 1bh,OOh 14<br />
1B 00 c<br />
FB16 3E 63 38 6C 6C 38 c DB 3eh,63h,38h,6ch,6ch,38h,Occh,78h 15<br />
cc 78 c<br />
FB1E 00 00 00 00 7E 7E c DB OOh,OOh,OOh,OOh,7eh,7eh,7eh,OOh 16<br />
7E 00 c<br />
FB26 18 3C 7E 18 7E 3C c DB 18h,3ch,7eh,18h,7eh,3ch,18h,Offh 17<br />
18 FF c<br />
FB2E 18 3C 7E 18 18 18 c DB 18h,3ch,7eh,18h,18h,18h,18h,OOh 18<br />
18 00 c<br />
FB36 18 18 18 18 7E 3C c DB 18h,18h,18h,18h,7eh,3ch,18h,OOh 19<br />
18 00 c<br />
FB3E 00 18 OC FE OC 18 c DB OOh,18h,Och,Ofeh,Och,18h,OOh,OOh 1a<br />
00 00 c<br />
FB46 00 30 60 FE 60 30 c DB OOh,30h,60h,Ofeh,60h,30h,OOh,OOh 1b<br />
00 00 c<br />
FB4E 00 00 CO CO CO FE c DB OOh,OOh,OcOh,OcOh,OcOh,Ofeh,OOh,OOh 1c<br />
00 00 c<br />
FB56 00 24 66 FF 66 24 c DB OOh,24h,66h,Offh,66h,24h,OOh,OOh 1d<br />
00 00 c<br />
FB5E 00 18 3C 7E FF FF c DB OOh,18h,3ch,7eh,Offh,Offh,OOh,OOh 1e<br />
00 00 c<br />
FB66 00 FF FF 7E 3C 18 c DB 00h,Offh,Offh,7eh,3ch, 18h,OOh,OOh 1f<br />
00 00 c<br />
FB6E 00 00 00 00 00 00 c DB OOh,OOh,OOh,OOh,OOh,OOh,OOh,OOh 20<br />
00 00 c<br />
FB76 30 78 78 30 30 00 c DB 30h,78h,78h,30h,30h,OOh,30h,OOh ; 'I' 21<br />
30 00 c<br />
FB7E 6C 6C 6C 00 00 00 c DB 6ch,6ch,6ch,OOh,OOh,OOh,OOh,OOh ; '" ' 22<br />
00 00 c<br />
FB86 6C 6C FE 6C FE 6C c DB 6ch,6ch,Ofeh,6ch,Ofeh,6ch,6ch,OOh ; '#' 23<br />
6C 00 c<br />
FB8E 30 7C CO 78 OC F8 c DB 30h,7ch,OcOh,78h,Och,Of8h,30h,OOh ; '$' 24<br />
30 00 c<br />
FB96 00 C6 CC 18 30 66 c DB OOh,Oc6h,Occh, 18h,30h,66h,Oc6h,00h ; '%' 25<br />
C6 00 c<br />
FB9E 38 6C 38 76 DC CC c DB 38h,6ch,38h,76h,Odch,Occh,76h,OOh ; '&' 26<br />
76 00 c<br />
FBA6 60 60 co 00 00 00 c DB 60h,60h,OcOh,OOh,OOh,OOh,OOh,OOh 27<br />
00 00 c<br />
FBAE 18 30 60 60 60 30 c DB 18h,30h,60h,60h,60h,30h,18h,OOh ; ' (' 28<br />
18 00 c<br />
FBB6 60 30 18 18 18 30 c DB 60h,30h,18h,18h,18h,30h,60h,OOh ; ')' 29<br />
60 00 c<br />
FBBE 00 66 3C FF 3C 66 c DB OOh,66h,3ch,Offh,3ch,66h,OOh,OOh . '*1 2a<br />
00 00 c<br />
FBC6 00 30 30 FC 30 30 c DB OOh,30h,30h,Ofch,30h,30h,OOh,OOh '+' 2b<br />
00 00 c<br />
FBCE 00 00 00 00 00 30 c DB OOh,OOh,OOh,OOh,OOh,30h,30h,60h , ' 2c<br />
1-252<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong>
30 60 c<br />
FBD6 00 DO DO FC 00 DO c DB OOh,OOh,OOh,Ofch,OOh,OOh,OOh,OOh - 2d<br />
00 00 c<br />
FBDE 00 00 00 00 00 30 c DB OOh,OOh,OOh,OOh,OOh,30h,30h,OOh 2e<br />
30 00 c<br />
FBE6 06 DC 18 30 60 CO c DB 06h,Och, 18h,30h,60h,OcOh,80h,OOh ; , I, 2f<br />
80 00 c<br />
FBEE 7C C6 CE DE F6 E6 c DB 7ch,Oc6h,Oceh,Odeh,Of6h,Oe6h,7ch,00h ; '0' 30<br />
7C 00 c<br />
FBF6 30 70 30 30 30 30 c DB 30h,70h,30h,30h,30h,30h,Ofch,OOh ; '1' 31<br />
FC 00 c<br />
FBFE 78 CC DC 38 60 CC c DB 78h,Occh,Och,38h,60h,Occh,Ofch,OOh ; '2' 32<br />
FC 00 c<br />
FC06 78 CC DC 38 DC CC c DB 78h,Occh,Och,38h,Och,Occh,78h,OOh ; '3' 33<br />
78 00 c<br />
FCOE 1C 3C 6C CC FE DC c DB 1ch,3ch,6ch,Occh,Ofeh,Och,1eh,OOh ; '4' 34<br />
1E 00 c<br />
FC16 FC CO F8 DC DC CC c DB Ofch,Oc0h,Of8h,Och,Och,Occh,78h,OOh ; '5' 35<br />
78 00 c<br />
FC1E 38 60 CO F8 CC CC c DB 38h,60h,OcOh,Of8h,Occh,Occh,78h,OOh ; '6' 36<br />
78 00 c<br />
FC26 FC CC DC 18 30 30 c DB Ofch,Occh,Och, 18h,30h,30h,30h,OOh ; '7' 37<br />
30 00 c<br />
FC2E 78 cc cc 78 cc cc c DB 78h,Occh,Occh,78h,Occh,Occh,78h,OOh ; '8' 38<br />
78 00 c<br />
FC36 78 CC CC 7C DC 18 c DB 78h,Occh,Occh,7ch,Och,18h,7Dh,OOh ; '9' 39<br />
70 00 c<br />
FC3E 00 30 30 00 00 30 c DB OOh,30h,30h,OOh,OOh,30h,30h,OOh 3a<br />
30 00 c<br />
FC46 00 30 30 00 00 30 c DB OOh,30h,30h,OOh,OOh,30h,30h,60h ; 3b<br />
30 60 c<br />
FC4E 18 30 60 co 60 30 c DB 18h,30h,60h,OcOh,60h,30h,18h,OOh ; '
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
FCAE CC CC CC FC CC CC c DB Occh,Occh,Occh,Ofch,Occh,Occh,Dcch,OOh ; 'H' 48<br />
cc 00 c<br />
FCB6 78 30 30 30 30 30 c DB 78h,30h,30h,30h,30h,30h,78h,00h ; , I, 49<br />
78 00 c<br />
FCBE 1E DC DC DC CC CC c DB 1eh,Och,Och,Och,Occh,Occh,78h,OOh ; 'j' 4a<br />
78 00 c<br />
FCC6 E6 66 6C 78 6C 66 c DB Oe6h,66h,6ch,78h,6ch,66h,Oe6h,OOh ; 'K' 4b<br />
E6 00 c<br />
FCCE FO 60 60 60 62 66 c DB OfOh,60h,60h,60h,62h,66h,Ofeh,OOh ; 'L' 4c<br />
FE 00 c<br />
FCD6 C6 EE FE FE D6 C6 c DB Oc6h,Oeeh,Ofeh,Ofeh,Od6h,Oc6h,Oc6h,OOh ; 'M' 4d<br />
C6 00 c<br />
FCDE C6 E6 F6 DE CE C6 c DB Oc6h,Oe6h,Of6h,Odeh,Oceh,Oc6h,Oc6h,OOh ; 'N' 4e<br />
C6 00 c<br />
FCE6 38 6C C6 C6 C6 6C c DB 38h,6ch,Oc6h,Oc6h,Oc6h,6ch,38h,OOh ; '0' 4f<br />
38 00 c<br />
FCEE FC 66 66 7C 60 60 c DB Ofch,66h,66h,7ch,60h,60h,OfOh,OOh ; 'P' 50<br />
FO 00 c<br />
FCF6 78 CC CC CC DC 78 c DB 78h,Occh,Occh,Occh,Odch,78h, 1ch,OOh ; 'Q' 51<br />
1C 00 c<br />
FCFE FC 66 66 7C 6C 66 c DB Ofch,66h,66h,7ch,6ch,66h,Oe6h,OOh ; 'R' 52<br />
E6 00 c<br />
FD06 78 CC EO 70 1C CC c DB 78h,Occh,Oe0h,70h,1ch,Occh,78h,OOh ; 's' 53<br />
78 00 c<br />
FDOE FC B4 30 30 30 30 c DB Ofch,Ob4h,30h,30h,30h,30h,78h,OOh ; 'T' 54<br />
78 00 c<br />
FD16 cc cc cc cc cc cc c DB Occh,Occh,Occh,Occh,Occh,Occh,Ofch,OOh ; 'U' 55<br />
FC DO c<br />
FD1E cc cc cc cc cc 78 c DB Occh,Occh,Occh,Occh,Occh,78h,30h,OOh ; 'V, 56<br />
30 00 c<br />
FD26 C6 C6 C6 D6 FE EE c DB Oc6h,Oc6h,Oc6h,Od6h,Ofeh,Oeeh,Oc6h,OOh ; 'W' 57<br />
C6 00 c<br />
FD2E C6 C6 6C 38 38 6C c DB Oc6h,Oc6h,6ch,38h,38h,6ch,Oc6h,OOh ; 'X' 58<br />
C6 DO c<br />
FD36 cc cc cc 78 30 30 c DB Occh,Occh,Occh,78h,30h,30h,78h,OOh ; 'Y' 59<br />
78 00 c<br />
FD3E FE C6 8C 18 32 66 c DB Ofeh,Oc6h,8ch,18h,32h,66h,Ofeh,OOh ; 'Z' Sa<br />
FE 00 c<br />
FD46 78 60 60 60 60 60 c DB 78h,60h,60h,60h,60h,60h,78h,OOh ; '[' Sb<br />
78 00 c<br />
FD4E CO 60 30 18 DC 06 c DB OcOh,60h,30h,18h,Och,06h,02h,OOh ; •' Sc<br />
02 00 c<br />
FD56 78 18 18 18 18 18 c DB 78h,18h, 18h,18h,18h,18h,78h,00h ;']' Sd<br />
78 00 c<br />
FDSE 10 38 6C C6 00 00 c DB 10h,38h,6ch,Oc6h,OOh,OOh,OOh,OOh Se<br />
00 00 c<br />
FD66 00 00 00 00 00 DO c DB OOh,OOh,OOh,OOh,OOh,OOh,OOh,Offh Sf<br />
00 FF c<br />
FD6E 30 30 18 00 00 00 c DB 30h,30h,18h,OOh,OOh,OOh,OOh,OOh 60<br />
00 00 c<br />
FD76 00 00 78 DC 7C CC c DB OOh,OOh,78h,Och,7ch,Occh,76h,OOh ; 'a' 61<br />
76 00 c<br />
FD7E EO 60 60 7C 66 66 c DB OeOh,60h,60h,7ch,66h,66h,Odch,OOh ; 'b' 62<br />
DC 00 c<br />
FD86 00 00 78 cc co cc c DB OOh,OOh,78h,Occh,OcOh,Occh,78h,OOh ; 'c · 63<br />
1-254<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong>
78 DO c<br />
FD8E 1C DC DC 7C CC CC c DB 1ch,Och,Dch,7ch,Occh,Dcch,76h,DOh ; 'd' 64<br />
76 DO c<br />
FD96 DO DO 78 CC FC CO c DB DOh,DDh,78h,Occh,Ofch,DcDh,78h,DOh ; , e, 65<br />
78 DO c<br />
FD9E 38 6C 60 FO 60 60 c DB 38h,6ch,60h,Of0h,60h,60h,Of0h,OOh ; 'f' 66<br />
FO DO c<br />
FDA6 DO DO 76 CC CC 7C c DB OOh,OOh,76h,Occh,Occh,7ch,Och,Of8h ; 'g' 67<br />
DC F8 c<br />
FDAE EO 60 6C 76 66 66 c DB OeOh,60h,6ch,76h,66h,66h,Oe6h,OOh ; 'h' 68<br />
E6 DO c<br />
FDB6 30 DO 70 30 30 30 c DB 30h,OOh,70h,30h,30h,30h,78h,OOh ; 'i' 69<br />
78 00 c<br />
FDBE DC DO DC DC OC CC c DB Och,ODh,Och,Och,Och,Occh,Occh,78h ; 'j' 6a<br />
cc 78 c<br />
FDC6 EO 60 66 6C 78 6C c DB DeOh,6Dh,66h,6ch,78h,6ch,Oe6h,OOh ; 'k' 6b<br />
E6 DO c<br />
FDCE 70 30 30 30 30 30 c DB 70h,3Dh,30h,30h,3Dh,3Dh,78h,OOh ; '1' 6c<br />
78 DO c<br />
FDD6 00 00 CC FE FE D6 c DB OOh,OOh,Occh,Ofeh,Ofeh,Od6h,Oc6h,OOh ; 'm' 6d<br />
C6 DO c<br />
FDDE DO DO F8 CC CC CC c DB OOh,ODh,Of8h,Occh,Occh,Occh,Occh,OOh ; , n, 6e<br />
CC DO c<br />
FDE6 00 DO 78 CC CC CC c DB OOh,OOh,78h,Occh,Occh,Occh,78h,OOh ; 'o' 6f<br />
78 DO c<br />
FDEE DO DO DC 66 66 7C c DB OOh,OOh,Odch,66h,66h,7ch,60h,OfOh ; 'p' 70<br />
60 FO c<br />
FDF6 00 00 76 CC CC 7C c DB ODh,OOh,76h,Occh,Occh,7ch,Dch,1eh ; 'q' 71<br />
DC 1E c<br />
FDFE DO DO DC 76 66 60 c DB OOh,ODh,Odch,76h,66h,60h,OfOh,OOh ; , r' 72<br />
FO 00 c<br />
FE06 00 DO 7C CO 78 DC c DB OOh,ODh,7ch,OcOh,78h,Och,Of8h,OOh ; , s' 73<br />
F8 DO c<br />
FEOE 10 30 7C 30 30 34 c DB 10h,3Dh,7ch,3Dh,3Dh,34h, 18h,OOh ; 't' 74<br />
18 DO c<br />
FE16 00 DO CC CC CC CC c DB OOh,OOh,Occh,Occh,Occh,Occh,76h,OOh ; 'u' 75<br />
76 DO c<br />
FE1E DO DO CC CC CC 78 c DB OOh,OOh,Occh,Occh,Occh,78h,30h,OOh ; 'v' 76<br />
30 DO c<br />
FE26 DO DO C6 D6 FE FE c DB OOh,ODh,Oc6h,Od6h,Ofeh,Ofeh,6ch,OOh ; 'w' 77<br />
6C DO c<br />
FE2E 00 DO C6 6C 38 6C c DB OOh,OOh,Oc6h,6ch,38h,6ch,Oc6h,OOh ; , x' 78<br />
C6 DO c<br />
FE36 00 DO CC CC CC 7C c DB OOh,OOh,Occh,Occh,Occh,7ch,Och,Of8h ;'y' 79<br />
DC F8 c<br />
FE3E DO DO FC 98 30 64 c DB OOh,OOh,Ofch,98h,30h,64h,Ofch,OOh ; 'z' 7a<br />
FC 00 c<br />
FE46 1C 30 30 EO 30 30 c DB 1ch,3Dh,3Dh,Oe0h,3Dh,3Dh,1ch,DDh ; ' {' 7b<br />
1C DO c<br />
FE4E 18 18 18 DO 18 18 c DB 18h,18h,18h,DDh,18h,18h,18h,OOh ; 'I' 7c<br />
18 DO c<br />
FE 56 EO 30 30 1C 30 30 c DB Oe0h,30h,30h,1ch,3Dh,3Dh,OeOh,OOh ; '}' 7d<br />
EO 00 c<br />
FE5E 76 DC 00 DO 00 00 c DB 76h,Odch,OOh,OOh,OOh,OOh,OOh,OOh 7e<br />
DO DO c<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong> 1-255
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
FE66 00 10 38 6C C6 C6<br />
FE6E<br />
FE6E<br />
FE6E<br />
FE6E<br />
FE6E<br />
1-256<br />
FE 00<br />
c<br />
c<br />
C ;End of font matrix<br />
c<br />
C fontlo8 endp<br />
code ends<br />
C include rtc.asm<br />
c<br />
DB 00h.10h.38h,6ch,Oc6h.Oc6h,Ofeh,OOh<br />
" 7f<br />
c ·======================================================================<br />
c<br />
c<br />
Filename: rtc.src<br />
C This module includes INT 08h & 1Ah.<br />
c<br />
c ·======================================================================<br />
c<br />
c code segment public '<strong>ROM</strong>'<br />
C assume cs:code, ds:nothing, es:nothing. ss:nothing<br />
c<br />
c ·======================================================================<br />
C INT 1Ah -- Time of Day Software Interrupt Request Routine<br />
c<br />
C Input: ah = 0 Read the Clock, then:<br />
C Output: ex = High Portion of Clock (t_hi_order)<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
dx =<br />
Input: ah =<br />
Low Portion of Clock (t low_order)<br />
al = 1 if 24 hours have elapsed (t overflow); 0 otherwise<br />
ex =<br />
dx =<br />
Trash: ah =<br />
Set the Clock, then:<br />
High Portion of Clock (t_hi_order)<br />
Low Portion of Clock (t low order)<br />
(ah - 1) if ah 0,-1, or -2<br />
c ·======================================================================<br />
C Input: ah = -1 Write Clock Calendar Device, then:<br />
C bx = day (from 1-1 of leap year up to 12-31 of leap year+?)<br />
C (0-2921) = (O-B69h)<br />
c ch = hour (0-23)<br />
C cl = minutes (0-59)<br />
C Output: ah = -1 implies date/time error<br />
C ah = 0 implies date/time OK<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
Input: ah = -2 Read Clock Calendar Device. then:<br />
Output: bx = day (from 1-1 of leap year up to 12-31 of leap year+7)<br />
ch = hour<br />
cl =<br />
dh =<br />
dl =<br />
C Trash: None.<br />
minutes<br />
seconds<br />
hundredths of seconds<br />
c ·======================================================================<br />
c<br />
C ORG OFE6Eh<br />
c<br />
C t_day proc near<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong>
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
c assume CS:COde, ds:nothing, es:nothing, ss:nothing<br />
c<br />
FE6E FB c sti enable interrupts<br />
c<br />
FE6F 80 FC FE c cmp ah,OFEh ZF set if FEh, CF reset if FFh<br />
FE72 75 04 c jne t nFE ah = -2 = OFEh ?<br />
c<br />
FE74 E8 F90E R c call c read read calendar chip<br />
FE77 CF c iret<br />
FE78 c t nFE:<br />
c<br />
FE78 72 04 c jb t nFF ah = -1 = DFFh > DFEh ?<br />
c<br />
FE7A E8 F99A R c call c write set calendar chip<br />
FE7D CF c iret<br />
FE7E c t nFF:<br />
c<br />
c assume cs:code, ds:data, es:nothing, ss:nothing<br />
c<br />
FE7E 1E c push ds save registers<br />
FE7F E8 E53A R c call set ds satisfy assumptions<br />
c<br />
FE82 FA c eli interrupts offl<br />
c (shared variables)<br />
c<br />
FE83 8D EC D1 c sub ah, 1 DON'T DECREMENT (CF needed!)<br />
FE86 73 DO c jae t set ah = D < 1?<br />
c<br />
c Read Time of Day.<br />
c<br />
FE88 32 E4 c xor ah,ah ah = 0 & ZF setl<br />
FE8A 8B DE DD6E R c mov cx,word ptr ds:[t_hi_order]<br />
FE8E 8B 16 D06C R c mov dx,word ptr ds:[t_low_order]<br />
FE92 AD DD7D R c mov al,byte ptr ds:[t overflow] t_overflow = D by setting timel<br />
c fall through (ah = 0 & ZF set)<br />
c<br />
FE95 75 DC c t set: jnz t end was ah = 1? (is ah = D now)?<br />
c<br />
c Set Time of Day.<br />
c<br />
FE97 89 DE OD6E R c mov word ptr ds:[t hi order],cx it's ok, if we fell through.<br />
FE9B 89 16 DD6C R c mov word ptr ds:[t_low_order],dx (a bit slower, but smaller!)<br />
FE9F 88 26 D07D R c mov byte ptr ds:[t_overflow],ah ah = D (in all cases ... )<br />
c<br />
FEA3 1F c t end: pop ds restore registers<br />
FEA4 CF c iret<br />
c<br />
FEA5 c t_day endp<br />
c<br />
c ·======================================================================<br />
c INT D8h -- i8254 p timer Hardware Interrupt Service Routine<br />
c ·======================================================================<br />
c<br />
FEA5 c ORG DFEA5h<br />
c<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong> 1-257
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
FEA5<br />
FEA5 50<br />
FEA6 52<br />
FEA7 1E<br />
FEA8 2E: 8E 1E E538 R<br />
FEAD FE DE 0040 R<br />
FEB1 75 08<br />
FEB3 E8 ED50 R<br />
FEB6 80 26 003F R FO<br />
FEBB<br />
FEBB FF 06 006C R<br />
FEBF 75 04<br />
FEC1 FF 06 006E R<br />
FEC5<br />
FEC5 81 3E 006C R OOBO<br />
FECB 75 14<br />
FECD 83 3E 006E R 18<br />
FED2 75 OD<br />
FED4 C6 06 0070 R 01<br />
FED9 33 co<br />
FEDB A3 006C R<br />
FEDE A3 006E R<br />
FEE1<br />
FEE1 CD 1C<br />
1-258<br />
C t int<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
proc near<br />
assume cs:code, ds:nothing, es:nothing, ss:nothing<br />
interrupts offl<br />
(shared variables)<br />
push ax<br />
preserve registers<br />
push dx<br />
push ds<br />
assume cs:code, ds:data, es:nothing, ss:nothing<br />
mov ds,word ptr cs:(set_ds_word] : satisfy assumption<br />
c Handle turning off floppy disk drive motor.<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
C t inc:<br />
c<br />
dec<br />
jnz<br />
call<br />
and<br />
C Increment long p timer count<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c t hi:<br />
c<br />
inc<br />
jnz<br />
inc<br />
byte ptr ds:(motor count] decrement motor on count<br />
t inc should we turn off drive?<br />
stop_disk if so, stop disk motor<br />
byte ptr ds:[motor status],OFOh clear low nibble of status<br />
word ptr ds:[t low order]<br />
t hi<br />
word ptr ds:[t_hi_order]<br />
c Handle 24 hour overflow situation<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
t ofl:<br />
cmp<br />
jne<br />
cmp<br />
jne<br />
mov<br />
xor<br />
mov<br />
mov<br />
sti<br />
increment low byte of counter<br />
skip t hi order<br />
increment high byte of counter<br />
word ptr ds:[t_low order],OOBOh has 24 hours elapsed?<br />
t ofl if not, skip t overflow<br />
word ptr ds:[t_hi_order],24 has 24 hours elapsed?<br />
t ofl if not, skip t overflow<br />
byte ptr ds:[t_overflow],01h<br />
ax,ax<br />
word ptr ds:[t_low_order].ax<br />
word ptr ds:[t hi order],ax<br />
C Invoke any user p timer break routine.<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
INT 1Ch<br />
enable interrupts<br />
(no more shared variables)<br />
Send specific end of interrupt (SEOI) to pic 'command' port AFTER p timer<br />
break, because user may be out-to-lunch for quite awhile ....<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong>
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
FEE3 BO 60 c mov al,pic_seoi_O specific end of interrupt command<br />
FEES E6 20 c out pic O,al to pic ·command port.<br />
FEE7 EB 01 90 c .jmp drb<br />
FEEA c drb:<br />
FEEA FB c sti<br />
c<br />
FEEB 1F c pop ds : restore registers<br />
FEEC SA c pop dx<br />
FEED 58 c pop ax<br />
FEEE CF c iret<br />
FEEF c t int endp<br />
FEEF c code ends<br />
c<br />
c<br />
c include vector.asm<br />
c<br />
c ·======================================================================<br />
c Filename: vector.src<br />
c<br />
c This module includes the table of <strong>ROM</strong> interrupt vectors & ill int<br />
c hardware diagnostic & illegal software interrupt service routine.<br />
c<br />
c ·======================================================================<br />
c<br />
FEEF c code segment public '<strong>ROM</strong>'<br />
FEF3 c ORG OFEF3h<br />
c assume CS:COde, ds:nothing, es:nothing, ss:nothing<br />
c<br />
c<br />
FEF3 c i vee tbl proc near<br />
c<br />
FEF3 FEAS R c dw t int int08locn see rtc.src<br />
FEFS E987 R c dw k int int09locn see kb.src<br />
FEF7 FF23 R c dw ill int intOAlocn<br />
FEF9 FF23 R c dw ill int intOBlocn<br />
FEFB FF23 R c dw ill int intOClocn<br />
FEFD FF23 R c dw ill int intODlocn<br />
FEFF EF57 R c dw fd int intOElocn see dsk.src<br />
FF01 FF23 R c dw ill int intOFlocn<br />
c<br />
FF03 F065 R c dw v io int10locn see vid.src<br />
FFOS F84D R c dw m equip int11locn see mem.src<br />
FF07 F841 R c dw m size int12locn see mem.src<br />
FF09 EC59 R c dw fd io int13locn see dsk.src<br />
FFOB E739 R c dw serial io int14locn see com.src<br />
FFOD F859 R c dw m cass int15locn see mem.src<br />
-<br />
FFOF E82E R c dw k io int16locn see kb.src<br />
FF11 EFD2 R c dw p_io int17locn see prn.src<br />
c<br />
-<br />
FF13 F6EO R c dw basic trap int18locn see int18.src<br />
FF15 F876 R c dw bt int int19locn see boot.src<br />
FF17 FE6E R c dw t_day int1Alocn see rtc.src<br />
FF19 FF4B R c dw dummy iret int1Blocn see kb.src<br />
FF1B FF4B R c dw dummy iret int1Clocn see rtc.src<br />
FF1D FOA4 R c dw v parms int1Dlocn see vid.src<br />
-<br />
-<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong> 1-259
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
FF1F EFC7 R<br />
FF21 C860 R<br />
FF23<br />
FF23<br />
FF23<br />
FF23 50<br />
FF24 B8 FFOB<br />
FF27 E6 20<br />
FF29 1E<br />
FF2A E4 20<br />
FF2C OA CO<br />
FF2E 74 DE<br />
FF30 8A EO<br />
FF32 E4 21<br />
FF34 OA C4<br />
FF36 E6 21<br />
FF38 BO 20<br />
FF3A E6 20<br />
FF3C EB 03<br />
FF3E<br />
FF3E E8 E4BE R<br />
FF41<br />
1-260<br />
c<br />
c<br />
c<br />
C i vee tbl<br />
c<br />
dw<br />
dw<br />
fd parms<br />
font hi 8x8<br />
endp<br />
int1Elocn<br />
int1Flocn<br />
see dsk.src<br />
see graph.src<br />
c .--------------------------------------------------------------------------c<br />
Interrupt Routine for Unused Hardware & Illegal Software Interrupts<br />
c .--------------------------------------------------------------------------c<br />
C assume cs:code, ds:nothing, es:nothing, ss:nothing<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
ORG<br />
ill int proc<br />
push<br />
mov<br />
out<br />
push<br />
OFF23h<br />
near trap for illegal interrupts<br />
ax save registers<br />
ah = -1: illegal software trap<br />
ax,(OFFh*100h)+OBh al = OCW3 -- read PIC's<br />
pic D,al in-service register<br />
ds save registers & delay<br />
C Determine whether it is a hardware or software interrupt.<br />
c<br />
c<br />
c<br />
c<br />
c<br />
in<br />
or<br />
jz<br />
al,pic 0<br />
al,al<br />
ill SW<br />
get active PIC IR#<br />
are any active?<br />
if not, illegal software trap.<br />
C If hardware interrupt, disable the 8259 PIC from further interrupts.<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
mov<br />
in<br />
or<br />
out<br />
mov<br />
out<br />
ah,al return active PIC IR#<br />
al,pic 1 OCW1 -- get PIC interrupt mask<br />
al,ah shut off (set) IR# bit.<br />
pic 1,al send PIC new mask.<br />
al,pic_neoi OCW2 -- send PIC a<br />
pic D,al nonspecific end of int<br />
C Return ah =active PIC Interrupt Number in intr_flag.<br />
c<br />
c<br />
c<br />
c ill sw:<br />
c<br />
jmp short ill flg<br />
C Turn off floppy disk drives and notify user<br />
c<br />
c<br />
c<br />
illegal software trap; ah = -1<br />
call ill_trap : every register but ds saved!<br />
C assume cs:code, ds:nothing, es:nothing, ss:nothing<br />
c<br />
c ill flg:<br />
c<br />
c<br />
C assume cs:code, ds:data. es:nothing, ss:nothing<br />
c<br />
set illegal trap flag.<br />
illegal software trap; ah = -1<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong>
FF41 E8 E53A R<br />
FF44 88 26 0068 R<br />
FF48 1F<br />
FF49 58<br />
FF4A CF<br />
FF4B<br />
FF4B<br />
FF4B<br />
FF4B CF<br />
FF4C CF<br />
FF40 CF<br />
FF4E CF<br />
FF4F CF<br />
FFSO CF<br />
FF51 CF<br />
FF52 CF<br />
FF53 CF<br />
FF54<br />
FF54<br />
FF54<br />
FF54<br />
FF54<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
call<br />
mov<br />
pop<br />
pop<br />
iret<br />
C ill int endp<br />
c<br />
set ds<br />
-<br />
byte ptr ds:[intr<br />
ds<br />
ax<br />
flag] ,ah<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
satisfy assumptions.<br />
return interrupt flag.<br />
restore registers.<br />
C assume cs:code, ds:nothing, es:nothing, ss:nothing<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
give user a second chance<br />
ORG OFF4Bh ORG OFF4Bh through OFF53h<br />
dummy_iret proc near 'BREAK' key interrupt (1Bh)<br />
iret p_timer break interrupt (1Ch)<br />
iret OFF4Ch -- in case someone is<br />
iret OFF4Dh<br />
iret OFF4Eh<br />
iret OFF4Fh<br />
iret OFF SOh<br />
iret OFF51h<br />
iret OFF52h<br />
iret OFF53h<br />
dummy iret endp<br />
code ends<br />
include prnscr.asm<br />
c ·======================================================================<br />
c<br />
c<br />
Filename: prnscr.src<br />
C This module includes INT OSh.<br />
c<br />
c ·======================================================================<br />
c<br />
c<br />
C code<br />
segment public '<strong>ROM</strong>'<br />
c<br />
c<br />
c .----------------------------------------------------------------------<br />
assume cs:code, ds:nothing, es:nothing, ss:nothing<br />
C INT OSh -- Print Screen<br />
c<br />
C Input: None.<br />
C Output: None.<br />
C Trash: None. (Uses byte at 50:0 = 40:0100 as monitor lock:<br />
C 0 indicates monitor not locked.<br />
1 indicates monitor locked.<br />
c<br />
c<br />
c .--------------------------------------------------------------------c<br />
C ORG OFF54h<br />
c<br />
C s int proc near<br />
-1 indicates printer error.<br />
1-261
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
FF54 FA<br />
FF55 50<br />
FF56 56<br />
FF57 06<br />
FF58 83 C4 06<br />
FF5B 5E<br />
FF5C 07<br />
FF50 26: 8B 04<br />
FF60 83 EC OA<br />
FF63 07<br />
FF64 5E<br />
FF65 2C 62<br />
FF67 58<br />
FF68 75 02<br />
FF6A FB<br />
FF6B CF<br />
FF6C<br />
FF6C 1E<br />
FF6D 2E: 8E 1E E538 R<br />
FF72 52<br />
FF73 B2 01<br />
FF75 FO/ 86 16 0100<br />
FF7A FE CA<br />
FF7C 74 4C<br />
FF7E FB<br />
FF7F 51<br />
FF80 53<br />
FF81 50<br />
1-262<br />
C assume cs:code, ds:nothing, es:nothing, ss:nothing<br />
c ·=======================================================================<br />
C INT 05H -- Check for Bound instruction%<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
Purpose: To intercept the interrupt generated by the %<br />
bound instruction if the bound test fails.%<br />
If the last instruction executed was a bound %<br />
then iret, else print the screen.%<br />
c ·=======================================================================<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
C notbound:<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
eli<br />
push<br />
push<br />
push<br />
add<br />
pop<br />
pop<br />
mov<br />
sub<br />
pop<br />
pop<br />
sub<br />
pop<br />
jnz<br />
sti<br />
iret<br />
push<br />
mov<br />
push<br />
mov<br />
lock xchg<br />
dec<br />
jz<br />
sti<br />
push<br />
push<br />
push<br />
ax<br />
si<br />
es<br />
sp, 6<br />
si<br />
es<br />
stop intrs%<br />
This front end routine checks for bound instruction.%<br />
;%<br />
;going to trash these registers%<br />
;%<br />
;go back to old sp%<br />
;Old ip%<br />
;old cs%<br />
ax, es: [si] ;ax has desired opcode%<br />
sp, Oah<br />
es<br />
si<br />
al, 062H<br />
ax<br />
notbound<br />
ds<br />
;normal sp%<br />
;original values of es and si%<br />
;%<br />
Compare offending instruction with known opcode%<br />
; 62 /r is the opcode for bound %<br />
;restore ax%<br />
;if not a bound instruction jmp to notbound%<br />
; reenable interrupts%<br />
;%<br />
print screen rountine %<br />
save ds<br />
assume cs:code, ds:data, es:nothing, ss:nothing<br />
ds,word ptr cs:[set_ds_word] ; satisfy assumptions<br />
dx<br />
dl, 1 1 = locked<br />
byte ptr ds:[100h],dl check monitor lock<br />
dl already locked ?<br />
s nap if set, do nothing<br />
enable interrupts after<br />
monitor lock code I 1 1 1<br />
ex save registers<br />
bx<br />
ax<br />
Get Current Video Width.<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong>
FF82 B4 OF c mov ah,OFh call v video state<br />
FF84 CD 10 c INT 10h Output: ah = crt cols<br />
c al = crt mode<br />
c bh = active page<br />
c<br />
FF86 8A DC c mov bl,ah save ah = crt cols<br />
c<br />
c Get Current Cursor Position.<br />
c<br />
FF88 B4 03 c mov ah,03h call v read cursor<br />
- -<br />
FF8A CD 10 c INT 10h Input: bh = active page<br />
-<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
c Output:<br />
c (dh,dl) = (row,col) of cursor<br />
c (ch.cl) = cursor mode setting<br />
c<br />
FF8C 8A EB c mov ch,bl ;get crt_cols<br />
FF8E 52 c push dx save row, col of cursor<br />
FF8F B1 FF c mov cl,-1 : initialize cl = printer error<br />
c<br />
c Loop Through the Screen.<br />
c<br />
FF91 BA 0000 c mov dx,O (dh,dl) = (row,col) of origin<br />
c<br />
FF94 E8 FFCD R c call s eol print a new line<br />
FF97 75 24 c jnz s err any errors?<br />
c<br />
FF99 E8 FFE1 R c s lp: call s_get get next character from screen<br />
c<br />
c : Map Invalid Characters to Space.<br />
c<br />
FF9C 3C 00 c cmp al,O check validity of character.<br />
FF9E 75 02 c jne s ok if valid, we're ok.<br />
FFAO BO 20 c mov al,' if invalid, print a space.<br />
FFAZ c S Ok:<br />
c<br />
c Print the Character.<br />
c<br />
FFA2 E8 FFD4 R c call s out<br />
FFAS 75 16 c jnz s err any errors?<br />
c<br />
c Advance to Next Character.<br />
c<br />
-<br />
FFA7 FE CZ c inc dl advance column (1-crt cols)<br />
FFA9 3A OS c cmp dl,ch dl < ch = crt cols?<br />
FFAB 7C EC c jl s_lp if so. continue<br />
c<br />
FFAD E8 FFCD R c call s eol else print a new line<br />
FFBO 75 DB c jnz s err any errors?<br />
c<br />
FFBZ 32 02 c xor dl,dl move column back to 0<br />
FFB4 FE C6 c inc dh advance row (1-25)<br />
FFB6 80 FE 19 c cmp dh,ZS dh < 25<br />
FFB9 7C DE c jl s lp if so, continue<br />
c<br />
FFBB 33 C9 c xor CX,CX set cl = printer no error<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong> 1-263
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
FFBD SA<br />
FFBE 84 02<br />
FFCO CD 10<br />
FFC2 FB<br />
FFC3 88 DE 0100<br />
FFC7 58<br />
FFC8 58<br />
FFC9 59<br />
FFCA SA<br />
FFCB 1F<br />
FFCC CF<br />
FFCD BO OA<br />
FFCF E8 FFD4 R<br />
FFD2 BO OD<br />
FFD4<br />
FFD4 52<br />
FFDS BA 0000<br />
FFD8 84 00<br />
FFDA CD 17<br />
FFDC SA<br />
FFDD F6 C4 01<br />
FFEO C3<br />
FFE1<br />
FFE1 84 02<br />
FFE3 CD 10<br />
FFES 84 08<br />
FFE7 CD 10<br />
FFE9 C3<br />
FFEA<br />
FFEA<br />
1-264<br />
c jmp<br />
c<br />
C s err: pop<br />
C mov<br />
C INT<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
sti<br />
mov<br />
pop<br />
C pop<br />
c pop<br />
C s nap: pop<br />
c<br />
c<br />
c<br />
c<br />
pop<br />
iret<br />
C s eol: mov<br />
C call<br />
C mov<br />
c<br />
c<br />
C s out:<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
jmp<br />
push<br />
mov<br />
mov<br />
INT<br />
pop<br />
test<br />
test<br />
C ret<br />
short s err<br />
dx<br />
ah,02h<br />
10h<br />
byte ptr ds:[100h].cl<br />
ax<br />
bx<br />
ex<br />
dx<br />
ds<br />
al,LF<br />
s out<br />
al,CR<br />
short s out<br />
dx<br />
dx,O<br />
ah,O<br />
17h<br />
dx<br />
ah,025h<br />
ah,001h<br />
fall through<br />
restore dx=(row,col) of cursor<br />
call v set cpos<br />
Input: bh = active_page<br />
dx =(row.col) of cursor<br />
disable interrupts during<br />
monitor lock code! 1 1 1<br />
reset monitor lock<br />
restore registers<br />
print LF & CR<br />
print CR<br />
fall through<br />
prints out byte in al<br />
save dx<br />
address printer port 0.<br />
write byte to port 0<br />
restore dx<br />
test for any errors?<br />
test for time out?<br />
c s_get: ; Set Cursor Position and get character @ curs. position<br />
c<br />
c<br />
c<br />
mov<br />
INT<br />
ah,02h<br />
10h<br />
call v set cpos<br />
Input: bh = active page<br />
C dx =(row,col) of cursor<br />
C Read Character at Cursor Position.<br />
c<br />
c<br />
c<br />
c<br />
c<br />
c<br />
mov<br />
INT<br />
ret<br />
C s int endp<br />
c<br />
C code ends<br />
ah,08h<br />
10h<br />
CPU System Reset Vector<br />
call v read ac current<br />
Input: bh = active page<br />
Output: al = character read<br />
ah = attribute<br />
....................................... "........ . . . . . . . . . . . . . ...<br />
11 It l 1!! 11'!! 1'! 11! 1! 11 t 11 >'>I 111! 111! 11 > 1! 1! 11111111111'! 11111111 > 1! 11<br />
; The reset vector must point to diagnostics_1 so that OSMERGE can find<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong>
FFEA<br />
FFFO<br />
FFFO<br />
FFFO EA<br />
FFF1 DAD3 R<br />
FFF3 FOOD<br />
FFF5 31 32 2F 31 35 2F<br />
38 35<br />
FFFD DO<br />
FFFE<br />
FFFE FE<br />
FFFF<br />
FFFF<br />
Macros:<br />
N a m e<br />
JMPF ....... .<br />
Segments and Groups:<br />
ABSO<br />
CODE<br />
DATA<br />
STACK RAM.<br />
V RAM ..<br />
Symbols:<br />
ABSO SEG . . . .<br />
ADDR ..... .<br />
ADDR MARK ERROR.<br />
ADD MEM CODE<br />
ALT INPUT.<br />
ALT KEY.<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
N a m e<br />
N a m e<br />
; it's data area, i.e. osmerge1 and osmerge2. Do NOT change change<br />
; the code to jump elsewhere as this will break OSMERGE<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
; ; ; ; ; ; ; ;; ;; ; ; ; ; ; ; ; ; ;; ;; ; ; ; ;; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;<br />
code segment public '<strong>ROM</strong>'<br />
assume cs:code, ds:nothing. es:nothing. ss:nothing<br />
ORG OFFFOh ; FOOO:FFFO ; FFFFO; FFFF:OOOO<br />
vector proc near<br />
db DEAh jmp intersegment FDOO:(offset diagnostics_1)<br />
dw diagnostics_1 instruction pointer<br />
dw code_seg code segment FOOOh<br />
db '12/15/85' release marker (exactly 8 bytest 11 I)<br />
chk hi db 0<br />
ORG OFFFEh<br />
db OFEh for " compatibility"<br />
vector endp near<br />
code ends<br />
end<br />
Length<br />
0001<br />
Size Align Combine Class<br />
0080 PARA PUBLIC 'RAM'<br />
FFFF PARA PUBLIC '<strong>ROM</strong>'<br />
OOD3 PARA PUBLIC 'RAM'<br />
DODO PARA PUBLIC 'RAM'<br />
DODO PARA PUBLIC 'RAM'<br />
Type Value Attr<br />
Number 0000<br />
L BYTE OOD2 DATA<br />
Number 0002<br />
F PROC E6F5 CODE Length ;0016<br />
L BYTE 0019 DATA<br />
Number 0038<br />
1-265
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
ALT RET .. L WORD E293 CODE<br />
ALT SHIFT. Number 0008<br />
BANNER M . L BYTE D912 CODE<br />
BASIC TRAP N PROC F6EO CODE Length =0040<br />
BEL .... Number 0007<br />
BELL WAIT. L NEAR F59C CODE<br />
BETA ... Number 0000<br />
<strong>BIOS</strong> BREAK L BYTE 0071 DATA<br />
<strong>BIOS</strong> INSTALL L NEAR 0000 CODE External<br />
BITREAD. Number 3FAO<br />
BS ... Number 0008<br />
BT AGAIN L NEAR F8DE CODE<br />
BT BLNK. L NEAR F8BF CODE<br />
BT DEC L NEAR F8C5 CODE<br />
BT I . L NEAR F89A CODE<br />
BT INT N PROC F876 CODE Length =007C<br />
BT JMP N PROC E6F2 CODE Length =0003<br />
BT M . L BYTE D935 CODE<br />
BT MERR. L BYTE D94F CODE<br />
BT NXT L NEAR F8BO CODE<br />
BT 0 . L NEAR F887 CODE<br />
BT OK. L NEAR F8EO CODE<br />
BT SPACES. L BYTE D974 CODE<br />
-<br />
-<br />
-<br />
-<br />
-<br />
-<br />
BUFFER END L WORD 0082 DATA<br />
BUFFER HEAD. L WORD 001A DATA<br />
BUFFER START L WORD 0080 DATA<br />
BUFFER TAIL. L WORD 001C DATA<br />
-<br />
CAPS LOCK KEY. Number 003A<br />
CAPS LOCK MODE Number 0040<br />
CAPS LOCK SHIFT. Number 0040<br />
CASS .. L NEAR E705 CODE<br />
-<br />
CHKSPEED N PROC F672 CODE Length =0014<br />
CHK HI . L BYTE FFFD CODE<br />
CHK LO . L BYTE cooo CODE<br />
-<br />
CMD BLOCK. L BYTE 0042 DATA<br />
-<br />
CMD ERROR. Number 0001<br />
-<br />
CNTRL KEY. Number 001D<br />
CNTRL SHIFT. Number 0004<br />
CODE SEG . . Number FOOD<br />
COLOR POINTER. Number 03D4<br />
COMMCONTROL. Number 0065<br />
COM BAUD . L WORD E729 CODE<br />
COM CTS .. Number 0010<br />
COM DATA1. N PROC E729 CODE Length =0010<br />
-<br />
-<br />
-<br />
COM DATA A Number 03F8<br />
-<br />
COM DATA B Number 02F8<br />
COM DSR. Number 0020<br />
COM DTR. Number 0001<br />
COM FE . Number 0008<br />
COM GB . N PROC E8E2 CODE Length =0023<br />
COM ID A Number 03FA<br />
COM ID B Number 02FA<br />
COM INIT N PROC E787 CODE Length =003A<br />
COM OE Number 0002<br />
COM PB N PROC E8B6 CODE Length =002C<br />
- -<br />
-<br />
-<br />
-<br />
-<br />
-<br />
1-266<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong>
COM PE . Number 0004<br />
COM RTS. Number 0002<br />
COM RXD. Number 0001<br />
COM STAT L NEAR E87D CODE<br />
COM TE . Number 0080<br />
COM TXD. Number 0020<br />
-<br />
-<br />
-<br />
-<br />
-<br />
-<br />
CONTROLC Number 0062<br />
CONTROL BYTE L BYTE 0076 DATA<br />
-<br />
CONT CNT . L NEAR DE12 CODE<br />
-<br />
CR .... Number OOOD<br />
CRC ERROR. Number 0010<br />
-<br />
CUR CYL. . L BYTE 0094 DATA<br />
-<br />
C BCD2HEX. N PROC F989 CODE Length =0011<br />
C DATA1. N PROC F8F2 CODE Length =001C<br />
C DY MO. L BYTE F902 CODE<br />
C DY YR. L WORD F8F2 CODE<br />
C GDAYS. N PROC FA41 CODE Length =0013<br />
C GRET . L NEAR FA53 CODE<br />
C RBCD . L NEAR F96C CODE<br />
C RBLP . L NEAR F972 CODE<br />
C RBRET. L NEAR F97D CODE<br />
C READ N PROC F90E CODE Length =0071<br />
C RHEX N PROC F97F CODE Length =OOOA<br />
C RMO. L NEAR F934 CODE<br />
C RMLP L NEAR F92C CODE<br />
C WERR L NEAR FA2F CODE<br />
C WHEX N PROC FA 3D CODE Length =0011<br />
C WMLP L NEAR FA01 CODE<br />
C WRITE. N PROC F99A CODE Length =0096<br />
C WYLP . L NEAR F9D7 CODE<br />
-<br />
-<br />
-<br />
-<br />
-<br />
-<br />
-<br />
-<br />
-<br />
-<br />
-<br />
-<br />
-<br />
-<br />
-<br />
-<br />
DATA SEG Number 0040<br />
-<br />
DCOLON . N PROC E56C CODE Length =OOOC<br />
DCRLF. . N PROC E55F CODE Length =DODD<br />
DELETE KEY Number 0053<br />
-<br />
DHEXBYTE N PROC E589 CODE Length =ODDD<br />
DHEXLONG N PROC E578 CODE Length =OOOA<br />
DHEXNIB. N PROC E596 CODE Length =0015<br />
DHEXWORD N PROC E582 CODE Length =0007<br />
DIAGNOSTICS 1. N PROC DAD3 CODE Length =054D<br />
-<br />
DISKETTE I01 . L NEAR EC99 CODE<br />
DISKETTE STATUS. L BYTE 0041 DATA<br />
-<br />
-<br />
DISKSTATE. . L BYTE 0090 DATA<br />
DISK STATUS. L BYTE 0074 DATA<br />
-<br />
DISP PASS. L NEAR DCCA CODE<br />
-<br />
DIS DMACC. L NEAR E3AB CODE<br />
-<br />
DLX KB . Number 0001<br />
-<br />
DMACCEL. . Number 0004<br />
DMA ADDR 0 Number DODO<br />
- -<br />
DMA ADDR 1 Number 0002<br />
DMA ADDR 2 Number 0004<br />
DMA ADDR 3 Number 0006<br />
- -<br />
- -<br />
- -<br />
DMA CMD DISABLE. Number 0004<br />
DMA CMD ENABLE . Number DODO<br />
DMA COMMAND. Number 0008<br />
- -<br />
- -<br />
-<br />
DMA COUNT 0. Number 0001<br />
-<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
-<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
1-267
FONTL08. N PROC FA6E CODE Length =0400<br />
FONT HI 8X8. L BYTE C860 CODE<br />
FONT LO 8X16 L BYTE C060 CODE<br />
FONT LO 8X8. L BYTE FA6E CODE<br />
- -<br />
FOO .. L NEAR DDCC CODE<br />
F BUFOFF .. Text [bp+4]<br />
F CHECK VALID. N PROC EF6B CODE Length =0048<br />
F CHNGLN . N PROC EFB3 CODE Length =0008<br />
F CLRHEAD. L NEAR E6BE CODE<br />
F COMMAND. Text [bp+3]<br />
F CONT .. L NEAR EF2B CODE<br />
F CS OUT . L NEAR F685 CODE<br />
F CV DOUBLE. L NEAR EFA9 CODE<br />
F CV DR. . L NEAR F600 CODE<br />
F CV HI. . L NEAR EF94 CODE<br />
F CV PRE2. L NEAR EF96 CODE<br />
F CV RET . L NEAR EFAD CODE<br />
F CV TST2. L NEAR EF9A CODE<br />
F CVL .. Text [bp+7]<br />
F DOFMT. L NEAR E92C CODE<br />
F DORATE L NEAR F6CO CODE<br />
F DRIVE. Text [bp+O]<br />
F DRVSWITCH. N PROC F5F6 CODE Length =DODD<br />
F DSKERR . L NEAR E692 CODE<br />
F DTVPE. . . N PROC F5EB CODE Length =OOOB<br />
F FMTDONE .. L NEAR E937 CODE<br />
F FORMAT CMD Number 0040<br />
F GB DECODE. L NEAR EE3B CODE<br />
F GB JMP . L NEAR EE43 CODE<br />
F GB LOOP. L NEAR EE03 CODE<br />
F GB LOOP1 L NEAR EE34 CODE<br />
F GB OUT . L NEAR EE1A CODE<br />
F GB RET . L NEAR EE47 CODE<br />
F GB TABLE L BYTE EDEF CODE<br />
F GETDRV . N PROC F603 CODE Length =0009<br />
F GET BYTE N PROC EDF8 CODE Length =0051<br />
F GET VAR. N PROC F62E CODE Length =DODD<br />
F GVDONE L NEAR F63A CODE<br />
F GVOK . . L NEAR F62E CODE<br />
F HEAD . . Text [bp+1]<br />
F HEAD SETTLE. L NEAR EF46 CODE<br />
F HLT. Number 0001<br />
F HUT ... Number OOOF<br />
F I01 ... L NEAR EC92 CODE<br />
F IO EXIT. L NEAR ECED CODE<br />
F IO QUIT. L NEAR ECC9 CODE<br />
F IO RET L NEAR ECC2 CODE<br />
F JMPNR .. L NEAR E68F CODE<br />
F MK1212 . L NEAR E6AE CODE<br />
F MOTOR ON N PROC F5C6 CODE Length =0025<br />
F MOTOR PORT Number 03F2<br />
F MOTOR WAIT Number 0025<br />
F MD RET . L NEAR F5EA CODE<br />
F NOMA .. Number 0000<br />
F NEC DATA Number 03F5<br />
-<br />
- -<br />
-<br />
-<br />
-<br />
-<br />
-<br />
-<br />
-<br />
-<br />
-<br />
-<br />
-<br />
-<br />
- -<br />
-<br />
- -<br />
- -<br />
-<br />
-<br />
-<br />
- -<br />
-<br />
-<br />
-<br />
-<br />
-<br />
- -<br />
- -<br />
- -<br />
-<br />
- -<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
1-269
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
F NEC ROY. . N PROC F63B CODE Length =0017<br />
F NEC RESET. N PROC F5AB CODE Length =001B<br />
F NEC RESET RET. L NEAR F5C5 CODE<br />
F NEC STATUS Number 03F4<br />
F NOLOFMT. L NEAR E917 CODE<br />
F NOMEDFMT L NEAR E923 CODE<br />
F NOPASS . L NEAR E692 CODE<br />
F NORETRY. L NEAR E6E1 CODE<br />
F NOTSTAT. L NEAR F618 CODE<br />
F NR1 .. L NEAR F63E CODE<br />
F NR RET . L NEAR F650 CODE<br />
F NUMSECS. Text [bp+2]<br />
F NURATE . L NEAR E954 CODE<br />
F NUSTATE. N PROC F60C CODE Length =0022<br />
F NU CONT. L NEAR F62A CODE<br />
F OPPSFMT. L NEAR E932 CODE<br />
F PASS2. . L NEAR E6DD CODE<br />
F PB ERRET L NEAR F608 CODE<br />
F PB RET . L NEAR F607 CODE<br />
F PUT BYTE N PROC F6C5 CODE Length =001B<br />
F R1 L NEAR ED13 CODE<br />
F R2 ... L NEAR ED1B CODE<br />
F RATEDONE L NEAR E97F CODE<br />
F RD1 ... L NEAR ED69 CODE<br />
F RDATA. . N PROC ED 57 CODE Length =0020<br />
F RD LOOP. L NEAR ED64 CODE<br />
F READ CMD Number OOE6<br />
F REAL DRIVE Text [bp+8]<br />
F RECAL CMD. Number 0007<br />
F RESET. N PROC ECFA CODE Length =0056<br />
F RETRY. . L NEAR EC9D CODE<br />
F RETSTAT. L NEAR ECE3 CODE<br />
F RW1. L NEAR EDA3 CODE<br />
F RW2 ... L NEAR EDCD CODE<br />
F RW3 ... L NEAR EDE4 CODE<br />
F RW COMMON. N PROC ED77 CODE Length =0078<br />
F RW RET . L NEAR EDEC CODE<br />
F RW SKIP. L NEAR EDC7 CODE<br />
F S1 . L NEAR EEEC CODE<br />
F S2 . L NEAR EEE7 CODE<br />
F SD1. L NEAR EE66 CODE<br />
F SD2. L NEAR EE95 CODE<br />
F SO RET L NEAR EEA9 CODE<br />
F SECNUM . Text [bp+6]<br />
F SEEK . . N PROC EEAA CODE Length =OOA2<br />
F SEEK CMD Number OOOF<br />
F SETFF. . N PROC F6BA CODE Length =OOOB<br />
F SETFRMT. N PROC E905 CODE Length =0035<br />
F SETRATE. N PROC E93A CODE Length =0046<br />
F SET DMA. N PROC EE49 CODE Length =0061<br />
F SIS ... N PROC F686 CODE Length =OOOB<br />
F SNSDRV CMD Number 0004<br />
F SNSINT CMD Number 0008<br />
F SPECIFY CMD. Number 0003<br />
F SPEEDOK. L NEAR F684 CODE<br />
- -<br />
- -<br />
- - -<br />
- -<br />
-<br />
-<br />
-<br />
-<br />
-<br />
-<br />
-<br />
-<br />
-<br />
-<br />
-<br />
-<br />
-<br />
-<br />
-<br />
-<br />
- -<br />
- -<br />
-<br />
-<br />
-<br />
-<br />
-<br />
-<br />
-<br />
-<br />
-<br />
-<br />
-<br />
-<br />
-<br />
- -<br />
-<br />
-<br />
-<br />
- -<br />
-<br />
- -<br />
- -<br />
- -<br />
-<br />
1-270<br />
-<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong>
F SRT 48<br />
F SRT 96<br />
F S RECAL.<br />
F S RET.<br />
F TABLE ..<br />
F TRCONT .<br />
F TRCONTO.<br />
F TRDONE .<br />
F TSTRETRY<br />
F WAIT FOR NEC<br />
F WAIT ONE MS.<br />
F WD1 ...<br />
F WDATA. . .<br />
F WD LOOP. .<br />
F WRITE CMD.<br />
-<br />
- - -<br />
- - -<br />
G4TOD ...<br />
GAME CARD.<br />
GOT ...<br />
GOT ALIAS<br />
GOT ENT.<br />
GEN3 .<br />
GO ON1<br />
GO ON2<br />
GO ON3<br />
GO ON4<br />
GRF GRAPHICS DOWN.<br />
GRF GRAPHICS READ.<br />
- -<br />
- -<br />
GRF GRAPHICS UP ..<br />
GRF GRAPHICS WRITE<br />
- -<br />
- -<br />
GRF LIGHT PEN.<br />
GRF READ DOT .<br />
GRF WRITE DOT.<br />
G 72 ..<br />
G 8X16 2<br />
G 8X8 2.<br />
G ADDR .<br />
G ADDR TEST.<br />
G ALIGN DOT.<br />
G BITMASK.<br />
G CHAR LP. .<br />
G CMP MOD. .<br />
G COLOR TABLE.<br />
G CURS OFF<br />
G DETMODE.<br />
G EXP BYT.<br />
G FILLER .<br />
G F CONT .<br />
G F EXIT<br />
G F I LP<br />
G F MACH<br />
G F S LP<br />
G HI WR.<br />
G IA LP.<br />
G I A LP<br />
G JSFY DOT<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
Number oooc<br />
Number OOOE<br />
L NEAR EEBE CODE<br />
L NEAR EF4B CODE<br />
L WORD ECBO CODE<br />
L NEAR E6B1 CODE<br />
L NEAR E6C2 CODE<br />
L NEAR E6E2 CODE<br />
N PROC E665 CODE Length =007F<br />
N PROC F652 CODE Length =0020<br />
N PROC EF4C CODE Length =0008<br />
L NEAR F6BO CODE<br />
N PROC F691 CODE Length =0029<br />
L NEAR F6AB CODE<br />
Number DOCS<br />
Number 0001<br />
Number 0201<br />
L WORD OOAA DATA<br />
L WORD OOC2 DATA<br />
L WORD E080 CODE<br />
Number 0000<br />
L NEAR DD3E CODE<br />
L NEAR 0040 CODE<br />
L NEAR DE19 CODE<br />
L NEAR DE28 CODE<br />
Length =OOOC<br />
Length =0004<br />
N PROC 0689 CODE Length =0063<br />
N PROC D6EC CODE Length =OOEF<br />
N PROC D5F4 CODE Length =0055<br />
N PROC D7DB CODE Length =0106<br />
N PROC F5A8 CODE Length =0003<br />
N PROC 0550 CODE Length =001A<br />
N PROC D56A CODE Length =002B<br />
L NEAR D8F1 CODE<br />
L NEAR D7BF CODE<br />
L NEAR D7FE CODE<br />
N PROC 0595 CODE Length =005F<br />
L NEAR 0806 CODE<br />
L NEAR 0588 CODE<br />
L NEAR D5E2 CODE<br />
L NEAR 0896 CODE<br />
L NEAR D6AF CODE<br />
L BYTE 0800 CODE<br />
N PROC D8E1 CODE Length =001E<br />
L NEAR 0829 CODE<br />
L NEAR D8A8 CODE<br />
N PROC D66B CODE Length =001E<br />
L NEAR 0797 CODE<br />
L NEAR 0705 CODE<br />
L NEAR 0660 CODE<br />
L NEAR D79C CODE<br />
L NEAR D66F CODE<br />
L NEAR 0840 CODE<br />
L NEAR D8A1 CODE<br />
L NEAR 0850 CODE<br />
L NEAR 0565 CODE<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
1-271
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
G LOS R. L NEAR D?OC CODE<br />
G LOS W. L NEAR 0821 CODE<br />
G LINELP L NEAR 0859 CODE<br />
G MATCHB L NEAR 0791 CODE<br />
G MEDGET L NEAR D75E CODE<br />
G MED BIT. L NEAR 0777 CODE<br />
G MED IA . L NEAR 0763 CODE<br />
G MED STORE. L NEAR D8BD CODE<br />
G MED WR L NEAR 0885 CODE<br />
G M AREA L NEAR D64C CODE<br />
G RDLOOP L NEAR D72C CODE<br />
G RD IA. L NEAR 0730 CODE<br />
G RD MED L NEAR D75C CODE<br />
G REPCHAR. L NEAR D852 CODE<br />
G RETURN . L NEAR D809 CODE<br />
G SCAN LP. L NEAR D89C CODE<br />
G SCROLLER N PROC 0649 CODE Length =0022<br />
G SELFONT. L NEAR D813 CODE<br />
G SETDOWN. L NEAR D6BD CODE<br />
G SET UP L NEAR D629 CODE<br />
G SKP 1. L NEAR D5A6 CODE<br />
G SKP 2. L NEAR D5AC CODE<br />
G SKP 3. L NEAR D5B2 CODE<br />
G SKP 4. L NEAR 0505 CODE<br />
G SKP 5. L NEAR D5F3 CODE<br />
G SUPER WR L NEAR 0849 CODE<br />
G TEST ADDR. L NEAR D7CB CODE<br />
G TINYTEXT L NEAR 0845 CODE<br />
G TST MOD .. L NEAR D61A CODE<br />
G T XOR. . . L NEAR 0865 CODE<br />
G UNREVERSE VIDEO LOOP L NEAR 0754 CODE<br />
G W BYTE L NEAR D86C CODE<br />
G XORBIT L NEAR D57F CODE<br />
- -<br />
-<br />
-<br />
-<br />
-<br />
-<br />
- -<br />
-<br />
-<br />
- -<br />
-<br />
-<br />
-<br />
-<br />
-<br />
- -<br />
- -<br />
-<br />
-<br />
-<br />
- - -<br />
HD ERROR L BYTE 0042 DATA<br />
-<br />
HF NUM . L BYTE 0075 DATA<br />
-<br />
HIRATE . Number 0000<br />
HISTORY. L NEAR DEBA CODE<br />
HOLDON . L NEAR 0001 CODE<br />
I13 IH . V WORD 0000 CODE External<br />
-<br />
ILL FLG. L NEAR FF41 CODE<br />
-<br />
ILL INT. N PROC FF23 CODE Length =0028<br />
-<br />
ILL LN L NEAR E509 CODE<br />
ILL LP L NEAR E50E CODE<br />
-<br />
-<br />
ILL M1 L BYTE 0999 CODE<br />
-<br />
ILL M2 L BYTE D9B2 CODE<br />
ILL M3 L BYTE D9B8 CODE<br />
ILL SW . L NEAR FF3E CODE<br />
ILL TEND L NEAR E505 CODE<br />
ILL TRAP N PROC E4BE CODE Length =005C<br />
-<br />
-<br />
-<br />
-<br />
INNERLOOP. L NEAR DD9E CODE<br />
INSERT KEY Number 0052<br />
INSERT MODE. Number 0080<br />
INSERT SHIFT Number 0080<br />
-<br />
-<br />
-<br />
INTOOLOCN. L DWORD 0000 ABSO<br />
INT01LOCN. . L DWORD 0004 ABSO<br />
1-272<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong>
INT02LOCN.<br />
INT03LOCN.<br />
INT04LOCN.<br />
INT05LOCN.<br />
INT06LOCN.<br />
INT07LOCN.<br />
INT08LOCN.<br />
INT09LOCN.<br />
INTOALOCN.<br />
INTOBLOCN.<br />
INTOCLOCN.<br />
INTODLOCN.<br />
INTOELOCN.<br />
INTOFLOCN.<br />
INT10LOCN.<br />
INT11LOCN.<br />
INT12LOCN.<br />
INT13LOCN.<br />
INT14LOCN.<br />
INT15LOCN.<br />
INT16LOCN.<br />
INT17LOCN.<br />
INT18LOCN.<br />
INT19LOCN.<br />
INT1ALOCN.<br />
INT1BLOCN.<br />
INT1CLOCN.<br />
INT1DLOCN.<br />
INT1ELOCN.<br />
INT1FLOCN.<br />
INTR FLAG.<br />
IO <strong>ROM</strong> INIT.<br />
IO <strong>ROM</strong> SEG<br />
I CAL ..<br />
I CALR M .<br />
I CAL 0. .<br />
I CAL 1 1 80<br />
I CAL END.<br />
I CAL ERR.<br />
I CAL MAX.<br />
I CAL OK .<br />
I CAL VAL.<br />
I COM M. .<br />
I CPU ...<br />
I CPU ERR.<br />
I CPU M. .<br />
I CPU OK .<br />
I DMAC . .<br />
I DMAC ERR<br />
I DMAC LP.<br />
I DMAC M .<br />
I DMAC NIB<br />
I DMAC OK.<br />
I DMAC PASS2<br />
I DMAC RET<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
L DWORD 0008 ABSO<br />
L DWORD OOOC ABSO<br />
L DWORD 0010 ABSO<br />
L DWORD 0014 ABSO<br />
L DWORD 0018 ABSO<br />
L DWORD 001C ABSO<br />
L DWORD 0020 ABSO<br />
L DWORD 0024 ABSO<br />
L DWORD 0028 ABSO<br />
L DWORD 002C ABSO<br />
L DWORD 0030 ABSO<br />
L DWORD 0034 ABSO<br />
L DWORD 0038 ABSO<br />
L DWORD 003C ABSO<br />
L DWORD 0040 ABSO<br />
L DWORD 0044 ABSO<br />
L DWORD 0048 ABSO<br />
L DWORD 004C ABSO<br />
L DWORD 0050 ABSO<br />
L DWORD 0054 ABSO<br />
L DWORD 0058 ABSO<br />
L DWORD 005C ABSO<br />
L DWORD 0060 ABSO<br />
L DWORD 0064 ABSO<br />
L DWORD 0068 ABSO<br />
L DWORD 006C ABSO<br />
L DWORD 0070 ABSO<br />
L DWORD 0074 ABSO<br />
L DWORD 0078 ABSO<br />
L DWORD 007C ABSO<br />
L BYTE 006B DATA<br />
L WORD 0067 DATA<br />
L WORD 0069 DATA<br />
L NEAR DF35 CODE<br />
L BYTE DA2E CODE<br />
L NEAR DF8A CODE<br />
L NEAR DF60 CODE<br />
L NEAR DFB2 CODE<br />
L NEAR DF93 CODE<br />
L NEAR DF77 CODE<br />
L NEAR DFA5 CODE<br />
L BYTE DACA CODE<br />
L BYTE DA72 CODE<br />
L NEAR DAF8 CODE<br />
L NEAR DB23 CODE<br />
L BYTE D9D3 CODE<br />
L NEAR DB34 CODE<br />
L NEAR DB88 CODE<br />
L NEAR DC07 CODE<br />
L NEAR DB98 CODE<br />
L BYTE D9FA CODE<br />
L NEAR DBE7 CODE<br />
L NEAR DC14 CODE<br />
L NEAR DB95 CODE<br />
L NEAR DBFA CODE<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
1-273
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
I DMAT . . L NEAR DB6D CODE<br />
I DMAT ERR L NEAR DB7B CODE<br />
I DMAT M . L BYTE D9ED CODE<br />
I DMAT OK. L NEAR DB81 CODE<br />
I DMAT RET L NEAR DB79 CODE<br />
I D 80X25. L NEAR EOF8 CODE<br />
I D E. L NEAR DC11 CODE<br />
I D INIT N PROC EOAO CODE Length =DOC4<br />
I D M<br />
I D MODE L NEAR E15E CODE<br />
I D OK . L NEAR EOFE CODE<br />
I D SW . L NEAR E107 CODE<br />
I FATAL. N PROC F720 CODE Length =0061<br />
I FATAL RET. L NEAR F772 CODE<br />
I FDUA M . L BYTE DA96 CODE<br />
I FDUB M L BYTE DAA3 CODE<br />
I FDU END. L NEAR E4A4 CODE<br />
I FDU LP . L NEAR E47E CODE<br />
I FDU NOT M. L BYTE DABO CODE<br />
I FDU OK . . L NEAR E4A1 CODE<br />
I FDU ROY M. L BYTE DAB4 CODE<br />
I GOT .. N PROC EOSE CODE Length =0042<br />
I GDTO L NEAR E078 CODE<br />
I HARD RESET N PROC EOSB CODE Length =0003<br />
I HDU M. . L BYTE DABD CODE<br />
I HDU OK . L NEAR E405 CODE<br />
I INIT END L NEAR E4A8 CODE<br />
I KB M .. L BYTE DA54 CODE<br />
I KB ST M. L BYTE DA61 CODE<br />
I NO COM A L NEAR E36C CODE<br />
I NO GAME CARD L NEAR E386 CODE<br />
I NO sees. L NEAR E37B CODE<br />
I NPU M. L BYTE DA21 CODE<br />
I OPT<strong>ROM</strong> M L BYTE DA89 CODE<br />
I OUT MASK N PROC E1B7 CODE Length =0009<br />
I PIC ... L NEAR DC1B CODE<br />
I PIC 0 OK L NEAR DC 59 CODE<br />
I PIC 1 OK L NEAR DCSD CODE<br />
I PIC 2 OK L NEAR DC61 CODE<br />
I PIC 3 OK L NEAR DC65 CODE<br />
I PIC 4 OK L NEAR DC69 CODE<br />
I PIC END. L NEAR DCC1 CODE<br />
I PIC ERR. L NEAR DC8C CODE<br />
I PIC HARD L NEAR DC4E CODE<br />
I PIC HOT. L NEAR DC87 CODE<br />
I PIC INIT N PROC E1A6 CODE Length =0011<br />
I PIC M. . L BYTE DA07 CODE<br />
I PIC NO HOT L NEAR DCBS CODE<br />
I PIC OK . L NEAR DCBB CODE<br />
I PIC SOFT . L NEAR DC3E CODE<br />
I PIC TEST L NEAR DC6B CODE<br />
I PRT EXIT L NEAR E35A CODE<br />
I PRT LOOP L NEAR E341 CODE<br />
I PRT M. L BYTE DA65 CODE<br />
I PWRUP. L NEAR DAE4 CODE<br />
-<br />
- -<br />
- -<br />
- -<br />
- -<br />
--<br />
-<br />
- -<br />
- -<br />
- -<br />
-<br />
-<br />
- -<br />
- - -<br />
- -<br />
- - -<br />
-<br />
-<br />
-<br />
-<br />
-<br />
-<br />
- -<br />
.. L BYTE DA14 CODE<br />
-<br />
- -<br />
- -<br />
-<br />
-<br />
-<br />
-<br />
-<br />
-<br />
-<br />
- -<br />
-<br />
-<br />
- -<br />
- -<br />
-<br />
- -<br />
-<br />
-<br />
- -<br />
- -<br />
- -<br />
- -<br />
-<br />
1-274<br />
-<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong>
I RAM M. . L BYTE DA7F CODE<br />
I <strong>ROM</strong> ... L NEAR DB48 CODE<br />
I <strong>ROM</strong> ERR. L NEAR DB60 CODE<br />
I <strong>ROM</strong> M. . L BYTE D9EO CODE<br />
I <strong>ROM</strong> OK L NEAR DB66 CODE<br />
I <strong>ROM</strong> RET1 L NEAR DB4E CODE<br />
I <strong>ROM</strong> RET2 L NEAR DB56 CODE<br />
I <strong>ROM</strong> RET3 L NEAR DBSE CODE<br />
I RTC ... L NEAR DFB2 CODE<br />
I RTC END. L NEAR E018 CODE<br />
I RTC ERR. L NEAR DFFO CODE<br />
I RTC HI M L BYTE DA4C CODE<br />
I RTC LO M L BYTE DA48 CODE<br />
I RTC M. . L BYTE DA3B CODE<br />
I RTC NR M L BYTE DASO CODE<br />
I RTC OK L NEAR EOOC CODE<br />
I VECO . L NEAR E174 CODE<br />
I VEC8 . L NEAR E196 CODE<br />
I VECTOR N PROC E164 CODE Length =0042<br />
I VEC TBL. N PROC FEF3 CODE Length =0030<br />
KBALT. Number OOC4<br />
KBBRK. Number OOC9<br />
KBCAP. Number OOC1<br />
KBCTL. Number DOCS<br />
KBINS. Number ooco<br />
KBLSH. Number OOC6<br />
KBNUL. Number oocc<br />
KBNUM. Number OOC2<br />
KBPRT. Number OOCB<br />
KBRES. Number OOC8<br />
KBRSH. Number OOC7<br />
KBSCR. Number OOC3<br />
KB BUFFER. L WORD 001E DATA Length =0010<br />
KB CAP FLAGS L BYTE CBB8 CODE<br />
KB CMD SEND. N PROC E4B3 CODE Length =OOOB<br />
KB CMD WLUP. L NEAR E4B3 CODE<br />
KB DATA1 .. N PROC CBB8 CODE Length =033F<br />
KB DATA TABLE. L BYTE CBBF CODE<br />
KB FLAG. . L BYTE 0017 DATA<br />
KB FLAG 1. . . L BYTE 0018 DATA<br />
KB FLUSH . . . L NEAR E2CD CODE<br />
KB FLUSH BACK. L NEAR E2DC CODE<br />
KB NOT DLX . L NEAR E320 CODE<br />
KB STATUS .. Number 0064<br />
KB TYPE READ L NEAR E310 CODE<br />
KB TYPE WAIT L NEAR E305 CODE<br />
-<br />
-<br />
- -<br />
- -<br />
- -<br />
-<br />
-<br />
- -<br />
-<br />
-<br />
-<br />
KDBLO. Number OOD8<br />
KDECO. Number OOD7<br />
KDEC1. Number OOD6<br />
KDEC2. Number ODDS<br />
KDEC3. Number OOD4<br />
KDEC4. Number OOD3<br />
KDECS. Number OOD2<br />
KDEC6. Number OOD1<br />
KDEC7. Number DODO<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
1-275
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
KDEC8. Number OOCF<br />
KDEC9. Number OOCE<br />
KNONE. Number OOCD<br />
K 00 . L NEAR EB3C CODE<br />
K 2RES L NEAR EB1F CODE<br />
K 2RET L NEAR EB11 CODE<br />
K 2TOG L NEAR EB16 CODE<br />
K 4RES L NEAR EAEE CODE<br />
K 4RET L NEAR EAED CODE<br />
K 4TOG L NEAR EADB CODE<br />
K ADV END. L NEAR E87A CODE<br />
K ADV PTR. N PROC E86E CODE Length =OOOD<br />
K ALT. L NEAR EAFS CODE<br />
K ALTO L NEAR EB2F CODE<br />
-<br />
-<br />
-<br />
-<br />
-<br />
K ALT1 L NEAR EB2E CODE<br />
-<br />
K ALT2 L NEAR EB2D CODE<br />
K ALT3 L NEAR EB2C CODE<br />
K ALT4 L NEAR EB2B CODE<br />
K ALTS L NEAR EB2A CODE<br />
K ALT6 L NEAR EB29 CODE<br />
K ALT7 L NEAR EB28 CODE<br />
K ALT8 L NEAR EB27 CODE<br />
K ALT9 L NEAR EB26 CODE<br />
K BEEP N PROC EBC9 CODE Length =0023<br />
K BIT. N PROC EB8C CODE Length =001F<br />
K BRK. L NEAR EB49 CODE<br />
-<br />
-<br />
-<br />
-<br />
-<br />
-<br />
K BUF. L NEAR EASB CODE<br />
-<br />
K CAP. L NEAR EABC CODE<br />
K CASE L WORD EBEC CODE<br />
K CTL. L NEAR EB07 CODE<br />
K DATA1. N PROC EBEC CODE Length =0032<br />
-<br />
K EOI. N PROC EBAB CODE Length =0008<br />
K HOLD L NEAR EA98 CODE<br />
K INS. L NEAR EAAE CODE<br />
K INT. N PROC E987 CODE Length =0109<br />
-<br />
KID. N PROC E82E CODE Length =0017<br />
-<br />
K IX . L NEAR EA07 CODE<br />
K JMP. L NEAR EA32 CODE<br />
K LED CAP. L NEAR EB6A CODE<br />
K LED CMD. L NEAR EB77 CODE<br />
K LED OAT. L NEAR EB81 CODE<br />
K LED NUM. N PROC EB60 CODE Length =002C<br />
K LED RET. L NEAR EB8B CODE<br />
K LOCK L NEAR E9F9 CODE<br />
K LOOK F PROC E860 CODE Length =0009<br />
K LP . L NEAR EBD1 CODE<br />
- -<br />
- -<br />
- -<br />
- -<br />
- -<br />
-<br />
-<br />
-<br />
K LSH. L NEAR EBOB CODE<br />
-<br />
K NON1 L NEAR EAC6 CODE<br />
K NONE L NEAR EA60 CODE<br />
K NOP. L NEAR EA63 CODE<br />
-<br />
K NOP1 L NEAR EB46 CODE<br />
-<br />
K NO CAP L NEAR E9EC CODE<br />
K NO CASE. L NEAR EA3B CODE<br />
K NO HOLD. L NEAR EA51 CODE<br />
K NO LOCK. L NEAR EA01 CODE<br />
1-276<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong>
K NO XCODE L NEAR EA59 CODE<br />
K NUL. L NEAR EAA9 CODE<br />
K NUM. L NEAR EAC8 CODE<br />
K OK . L NEAR E9B2 CODE<br />
K PAUSE. L NEAR EA7D CODE<br />
K PRT. L NEAR EAA1 CODE<br />
K READ N PROC E845 CODE Length =001B<br />
K RES. L NEAR EA6C CODE<br />
K RET. L NEAR E842 CODE<br />
K RSH. L NEAR EBOF CODE<br />
K SCR. L NEAR EAD4 CODE<br />
K SEE. L NEAR E854 CODE<br />
K STAT N PROC E869 CODE Length =0005<br />
K TRY. N PROC EBB3 CODE Length =0016<br />
K XLAT L NEAR EA1B CODE<br />
-<br />
-<br />
-<br />
-<br />
-<br />
-<br />
-<br />
-<br />
-<br />
-<br />
-<br />
-<br />
LABEL 1 L NEAR F9AO CODE<br />
LABEL2 . L NEAR F9A6 CODE<br />
LABEL3 . L NEAR F9AD CODE<br />
LA STRATE L BYTE 008E DATA<br />
LEAP1. . L NEAR F9F4 CODE<br />
LEFT SHIFT Number 0002<br />
LEFT SHIFT KEY Number 002A<br />
-<br />
-<br />
LF .. Number OOOA<br />
LORATE . . . . Number 0080<br />
MASTAB .... L WORD E297 CODE<br />
MASTER TBL PTR L DWORD 0084 DATA<br />
-<br />
MEDIA CHANGE Number 0006<br />
MEDRATE. . . Number 0040<br />
MEMORY SIZE. L WORD 0013 DATA<br />
-<br />
MEMTST .. N PROC E22F CODE Length =0047<br />
MEMTST ERR L NEAR E274 CODE<br />
MEMTST ERR C L NEAR E270 CODE<br />
-<br />
- -<br />
MEMTST R1. L NEAR E242 CODE<br />
MEMTST R2. L NEAR E259 CODE<br />
MEMTST W1. L NEAR E236 CODE<br />
-<br />
-<br />
-<br />
MEMTST W2. L NEAR E24F CODE<br />
MFG ERR FLAG L BYTE 0015 DATA Length =0002<br />
-<br />
MFG TST. . . L BYTE 0012 DATA<br />
-<br />
MOR MEM ... L NEAR DEF3 CODE<br />
-<br />
MOTOR COUNT. L BYTE 0040 DATA<br />
MOTOR STATUS L BYTE 003F DATA<br />
-<br />
-<br />
MOVAXCS. L NEAR E650 CODE<br />
MT END . L WORD E2AD CODE<br />
-<br />
M CASS . F PROC F859 CODE Length =0005<br />
M EQUIP. N PROC F84D CODE Length =OOOC<br />
M SIZE . N PROC F841 CODE Length =OOOC<br />
-<br />
-<br />
NEC STATUS L BYTE 0042 DATA Length =0007<br />
-<br />
NEWFLOP. . Number 0002<br />
NIBOK ... L NEAR E5A4 CODE<br />
NMI ENABLE Number 0080<br />
NMI ENABLE PORT. Number OOAO<br />
-<br />
- -<br />
NOPRINT. L NEAR DE09 CODE<br />
NOTBOUND .. L NEAR FF6C CODE<br />
NO DBL STEP. L NEAR EFOD CODE<br />
- -<br />
NO PMEM. L NEAR DEFB CODE<br />
-<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
1-277
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
NO THING . L WORD 0096 DATA Length =0006<br />
-<br />
NUL ... Number 0000<br />
NUM LOCK KEY Number 0045<br />
NUM LOCK MODE. Number 0020<br />
NUM LOCK SHIFT Number 0020<br />
N 1. L NEAR F870 CODE<br />
N INT .. N PROC F85F CODE Length =0017<br />
N OUT .. L NEAR F874 CODE<br />
OFF FAIL L WORD oocc DATA<br />
-<br />
OPT <strong>ROM</strong> M. L BYTE E276 CODE<br />
-<br />
OP INT N PROC E638 CODE Length =002D<br />
-<br />
OSMERGE1 L DWORD OOA2 DATA<br />
OSMERGE2 L DWORD OOA6 DATA<br />
PO DATA1 N PROC E276 CODE Length =0037<br />
P1 DATA1 N PROC D8FF CODE Length =01D4<br />
-<br />
P4 DATA1 N PROC E537 CODE Length =0003<br />
PARA GRAPH Number B800<br />
PARA MONO. Number BODO<br />
PARITY Number 0000<br />
PARITY1 M. L BYTE E5FB CODE<br />
PARITY2 M. L BYTE E618 CODE<br />
PASS M . L BYTE D9BB CODE<br />
PAUSE. . . Number OOCA<br />
PAUSE MODE Number 0008<br />
PCINIT N PROC E2AD CODE Length =0206<br />
PIC 0 .. Number 0020<br />
PIC 1 .. Number 0021<br />
PIC ICW1 Number 0013<br />
PIC ICW2 Number 0008<br />
PIC ICW3 Number 0008<br />
PIC ICW4 Number DODD<br />
PIC NEOI Number 0020<br />
PIC OFF MSK. Number DOFF<br />
PIC SEOI 0 Number 0060<br />
PIC SEOI 1 Number 0061<br />
PIC SEOI 6 Number 0066<br />
-<br />
-<br />
-<br />
-<br />
-<br />
-<br />
-<br />
-<br />
PMEMCNT .. L NEAR DD7F CODE<br />
PMEMTST R1 L NEAR DE63 CODE<br />
PMEMTST R2 L NEAR DE81 CODE<br />
PMEMTST W1 L NEAR DE 59 CODE<br />
PMEMTST W2 L NEAR DE75 CODE<br />
PORT OFF . L BYTE 0077 DATA<br />
PPASS. . . L NEAR DED8 CODE<br />
PRINTER ADDR L WORD 0008 DATA Length =0004<br />
PRINTER TOUT. L BYTE 0078 DATA Length =0004<br />
PRT DATA A Number 03BC<br />
-<br />
PRT DATA B Number 0378<br />
PRT DATA C Number 0278<br />
-<br />
-<br />
PTESTADDR. L NEAR DE3C CODE<br />
PTSTERR. L NEAR DEA3 CODE<br />
PWRUPL . Number 0020<br />
p 8253 0 Number 0040<br />
p 8253 1 Number 0041<br />
p 8253 2 Number 0042<br />
P 8253 CTRL. Number 0043<br />
1-278<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong>
P INIT . L NEAR F027 CODE<br />
-<br />
p IO .. N PROC EFD2 CODE Length =0069<br />
-<br />
P KCTRL. Number 0061<br />
-<br />
P KSCAN. Number 0060<br />
-<br />
P LP . L NEAR FOOF CODE<br />
-<br />
P NOP. L NEAR FOOA CODE<br />
-<br />
P OK . L NEAR F01D CODE<br />
-<br />
P OUT. L NEAR FOOB CODE<br />
-<br />
P RET. L NEAR F005 CODE<br />
-<br />
P STAT L NEAR F034 CODE<br />
P TBL. L WORD E287 CODE<br />
-<br />
P TRAPCE Number 3F60<br />
-<br />
RAM ERROR. L NEAR DF05 CODE<br />
-<br />
RAM SIZE END L NEAR DEC6 CODE<br />
- -<br />
RAM SIZE END 1 L NEAR DEDB CODE<br />
- - -<br />
RAM SIZE LP. L NEAR DD24 CODE<br />
- -<br />
RAM SIZE NXT L NEAR DD65 CODE<br />
- -<br />
RAM SIZE TST L NEAR DD14 CODE<br />
- -<br />
RESET FLAG . L WORD 0072 DATA<br />
RESVO. . L DWORD 0088 DATA<br />
RESV1. . . . L WORD 008C DATA<br />
RIGHT SHIFT. Number 0001<br />
-<br />
RIGHT SHIFT KEY. Number 0036<br />
- -<br />
<strong>ROM</strong> CHECKSUM . . N PROC E52A CODE Length =DODD<br />
-<br />
<strong>ROM</strong> CHECKSUM CNT L NEAR E52D CODE<br />
- -<br />
<strong>ROM</strong> CHECKSUM LOOP. L NEAR E52F CODE<br />
- -<br />
<strong>ROM</strong> CHKSUM OK. L NEAR E440 CODE<br />
- -<br />
<strong>ROM</strong> ERR. N PROC E51A CODE Length =0010<br />
-<br />
<strong>ROM</strong> ID .... L BYTE C001 CODE<br />
-<br />
<strong>ROM</strong> MT .<br />
-<br />
<strong>ROM</strong> SCAN EXIT.<br />
-<br />
-<br />
<strong>ROM</strong> SCAN LOOP.<br />
- -<br />
<strong>ROM</strong> SCAN NEXT.<br />
- -<br />
RPASS. . .<br />
L WORD<br />
L NEAR<br />
L NEAR<br />
L NEAR<br />
L NEAR<br />
C002<br />
E459<br />
E408<br />
E455<br />
DED5<br />
CODE<br />
CODE<br />
CODE<br />
CODE<br />
CODE<br />
RS232 ADDR<br />
-<br />
RS DLY .<br />
L WORD<br />
N PROC<br />
0000<br />
E8AC<br />
DATA<br />
CODE<br />
Length =0004<br />
Length =OOOA<br />
-<br />
RS GBE . L NEAR E900 CODE<br />
-<br />
RS INIT.<br />
-<br />
RS LP ..<br />
L NEAR<br />
L NEAR<br />
E3A1<br />
E8B1<br />
CODE<br />
CODE<br />
-<br />
RS NOP<br />
-<br />
RS NORM.<br />
-<br />
RS OK ..<br />
-<br />
RS PBE .<br />
L NEAR<br />
L NEAR<br />
L NEAR<br />
L NEAR<br />
E77D<br />
E749<br />
E771<br />
E8DA<br />
CODE<br />
CODE<br />
CODE<br />
CODE<br />
-<br />
RS PB GB L NEAR E8D9 CODE<br />
RS RET .<br />
-<br />
RS STAT.<br />
-<br />
RS TBL .<br />
-<br />
RS WS.<br />
-<br />
RS WS COM.<br />
L NEAR<br />
N PROC<br />
L WORD<br />
N PROC<br />
L NEAR<br />
E77A<br />
E87B<br />
E77F<br />
E888<br />
E897<br />
CODE<br />
CODE<br />
CODE<br />
CODE<br />
CODE<br />
Length =DODD<br />
Length =0024<br />
RS WS EXIT L NEAR E8A8 CODE<br />
RS WS LP . L NEAR E88D CODE<br />
RTC CHK. .<br />
-<br />
RTC CHK HIGH<br />
- -<br />
RTC CHK LOW.<br />
- -<br />
RTC CHK RESET ERR.<br />
- - -<br />
N PROC<br />
L NEAR<br />
L NEAR<br />
L NEAR<br />
E1CO<br />
E22E<br />
E22E<br />
E1E1<br />
CODE<br />
CODE<br />
CODE<br />
CODE<br />
Length =006F<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
1-279
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
RTC CHK RESET LP L NEAR E1CF CODE<br />
RTC CHK RESET OK L NEAR E1E4 CODE<br />
RTC CHK SET ERR. L NEAR E201 CODE<br />
RTC CHK SET LP L NEAR E1EE CODE<br />
RTC CHK SET OK L NEAR E204 CODE<br />
SAVE RAM . L NEAR 0020 CODE<br />
SCC CTL A. Number 0050<br />
SCC CTL B. Number 0052<br />
sec FE Number 0040<br />
sec DE . Number 0020<br />
sec PE Number 0010<br />
sec RXD. Number 0001<br />
sec TBL. L WORD E28F CODE<br />
sec TXD. Number 0004<br />
SCRL LOCK KEY. Number 0046<br />
-<br />
SCRL LOCK MODE Number 0010<br />
SCRL LOCK SHIFT. Number 0010<br />
SECT NOT FOUND Number 0004<br />
SEEK ERROR . Number 0040<br />
SEEK STATUS. L BYTE 003E DATA<br />
SEG FAIL . . L WORD OOCA DATA<br />
SERIAL IO. . N PROC E739 CODE Length =004E<br />
SERIAL T OUT L BYTE OO?C DATA Length =0004<br />
SET OS . . . N PROC E53A CODE Length =0006<br />
SET OS WORD. L WORD E538 CODE<br />
SPASS M<br />
.. L BYTE D9C4 CODE<br />
STACK <strong>ROM</strong>. L WORD 0900 CODE<br />
STACK SEG. Number 0030<br />
-<br />
STOP . L NEAR DE21 CODE<br />
STOP DISK. N PROC ED 50 CODE Length =0007<br />
SWITCH BITS. L WORD 0010 DATA<br />
SYS CONF A Number 0066<br />
SYS CONF B Number 0067<br />
S EOL. L NEAR FFCD CODE<br />
S ERR. L NEAR FFBD CODE<br />
S GET. L NEAR FFE1 CODE<br />
S INT. N PROC FF54 CODE Length =0096<br />
-<br />
S LP . L NEAR FF99 CODE<br />
S NOP. L NEAR FFCA CODE<br />
S OK L NEAR FFA2 CODE<br />
S OUT. L NEAR FFD4 CODE<br />
TOCMD. Number 0036<br />
TOCOUNT. Number 0000<br />
T1CMD. . Number 0074<br />
T1COUNT. Number 0013<br />
T2CMD .. Number OOB6<br />
T2COUNT. Number 0266<br />
TIME OUT Number 0080<br />
TOO ... Number 0001<br />
TRAP MESS. L BYTE F6E8 CODE<br />
T DAY. N PROC FE6E CODE Length =0037<br />
T END ... L NEAR FEA3 CODE<br />
T HI ... L NEAR FEC5 CODE<br />
T HI ORDER L WORD 006E DATA<br />
T INC. L NEAR FEBB CODE<br />
1-280<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong>
T INT .... N PROC FEA5 CODE Length =004A<br />
T LOW ORDER. L WORD 006C DATA<br />
T NFE. L NEAR FE78 CODE<br />
T NFF .. L NEAR FE7E CODE<br />
T OFL .. L NEAR FEE1 CODE<br />
T OVERFLOW L BYTE 0070 DATA<br />
T SET .. L NEAR FE95 CODE<br />
-<br />
- -<br />
-<br />
-<br />
-<br />
-<br />
-<br />
U12M12D. Number 0002<br />
U48M12D. Number 0061<br />
U48M48D. Number 0080<br />
VECTOR . N PROC FFFO CODE Length =OOOF<br />
V<strong>ROM</strong> CHKSUM OK L NEAR E139 CODE<br />
V<strong>ROM</strong> ERR . . . L NEAR E14E CODE<br />
V<strong>ROM</strong> SCAN EXIT L NEAR E152 CODE<br />
V<strong>ROM</strong> SCAN LOOP L NEAR E111 CODE<br />
- -<br />
-<br />
- -<br />
- -<br />
V<strong>ROM</strong> SCAN NEXT . L NEAR E14E CODE<br />
v 0. L NEAR F30D CODE<br />
-<br />
- -<br />
v 01 L NEAR F31A CODE<br />
v 02 L NEAR F31B CODE<br />
v 1. L NEAR F322 CODE<br />
-<br />
-<br />
v 2. L NEAR F32C CODE<br />
-<br />
v 21 L NEAR F331 CODE<br />
v 22 L NEAR F366 CODE<br />
-<br />
v 3. L NEAR F368 CODE<br />
-<br />
v 31 L NEAR F36A CODE<br />
-<br />
V 3X8. L BYTE 0065 DATA<br />
v 4 .. L NEAR F37A CODE<br />
v 6845 L NEAR F262 CODE<br />
-<br />
-<br />
V APAGE. L BYTE 0062 DATA<br />
V BASE6845 L WORD 0063 DATA<br />
V BELL . N PROC F583 CODE Length =0025<br />
V BS L NEAR F4F8 CODE<br />
V C2 .. L NEAR F308 CODE<br />
V CLR. L NEAR F2B8 CODE<br />
V CLR FAST L NEAR F2CF CODE<br />
V CLR FIN. L NEAR F2D9 CODE<br />
V CLR TOP. L NEAR F3AC CODE<br />
V COL ... N PROC F44F CODE Length =002C<br />
V COLORPAL L BYTE 0066 DATA<br />
V COLOUR L NEAR F08E CODE<br />
V COLS . L NEAR F305 CODE<br />
V COL 0. L NEAR F464 CODE<br />
V COL 1. L NEAR F46B CODE<br />
V CR .. L NEAR F500 CODE<br />
V CURPOS L WORD 0050 DATA Length =0008<br />
V CURSIZE. L WORD 0060 DATA<br />
V CURS POS N PROC F1F7 CODE Length =001E<br />
V CURS TYPE. N PROC F1E9 CODE Length =OOOE<br />
V DATA1. N PROC F045 CODE Length =0020<br />
V DATA2. N PROC FOA4 CODE Length =0058<br />
V FPOS . N PROC F542 CODE Length =001E<br />
V FPOS 0 L NEAR F554 CODE<br />
V FPOS LP. L NEAR F54D CODE<br />
V HEIGHT L WORD 004C DATA<br />
V IO N PROC F065 CODE Length =003F<br />
-<br />
-<br />
-<br />
-<br />
-<br />
-<br />
- -<br />
- -<br />
- -<br />
-<br />
-<br />
-<br />
-<br />
- -<br />
- -<br />
-<br />
-<br />
-<br />
- -<br />
- -<br />
-<br />
-<br />
-<br />
- -<br />
- -<br />
-<br />
-<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
1-281
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
V KSCROLL 1 Number ODED<br />
V KSCROLL2 Number 0162<br />
V LF L NEAR F4BO CODE<br />
V LROW . L NEAR F4BB CODE<br />
V MD 40. L BYTE FOA4 CODE<br />
V MD 80. L BYTE FOB4 CODE<br />
V MD CLR L NEAR F171 CODE<br />
V MD CLR 2K. L NEAR F16C CODE<br />
V MD CLR 8K. L NEAR F16E CODE<br />
V MD CLR GRAPHICS. L NEAR F168 CODE<br />
V MD DBL . . L NEAR F188 CODE<br />
V MD ENABLE. L BYTE FOF4 CODE<br />
V MD GRAPH L BYTE FOC4 CODE<br />
V MD LEN . L WORD FOE4 CODE<br />
V MD MONO. L BYTE FOD4 CODE<br />
V MD WID L BYTE FOEC CODE<br />
V MODE L BYTE 0049 DATA<br />
V MV .. L NEAR F295 CODE<br />
V MV2 .. L NEAR F2A2 CODE<br />
V MV ON. L NEAR F3A5 CODE<br />
V MV FAST. L NEAR F2A8 CODE<br />
V MV FLP . L NEAR F2AB CODE<br />
V NOP .. L NEAR FOA3 CODE<br />
V OUT BYTE . N PROC F273 CODE Length =OOOC<br />
V OVR NOT OK L NEAR F1C4 CODE<br />
V OVR OK L NEAR F1C6 CODE<br />
V PAGE . N PROC F22C CODE Length =0047<br />
V PAGE 0 L NEAR F23E CODE<br />
V PARMS. L BYTE FOA4 CODE<br />
V POINTER. Number 03B4<br />
V POSN . . N PROC F560 CODE Length =0011<br />
V RAC ... N PROC F3B1 CODE Length =002A<br />
V RAC INBLANK. L NEAR F3CD CODE<br />
V RAC INLINE L NEAR F3C7 CODE<br />
V ROWS . . . L NEAR F304 CODE<br />
V R CURS POS N PROC F215 CODE Length =0017<br />
V SCRL ON. . N PROC F390 CODE Length =0021<br />
V SCRL MODE 7. L NEAR F2E7 CODE<br />
V SCRL MV AND CLR. L NEAR F541 CODE<br />
V SCRL POS . . . . N PROC F513 CODE Length =002F<br />
V SCRL TTY . . . . L NEAR F4C6 CODE<br />
V SCRL TTY GRAPHICS. L NEAR F405 CODE<br />
V SCRL UP. . . . . N PROC F27F CODE Length =0111<br />
V SCROLL OR CLEAR. L NEAR F2EC CODE<br />
V SET CURS . . L NEAR F210 CODE<br />
V SET CUR POS .. L NEAR F256 CODE<br />
V SET MODE . . . N PROC FOFC CODE Length =ODED<br />
V SET MODE COLOR L NEAR F117 CODE<br />
V SET MODE LP. L NEAR F147 CODE<br />
V SET NEW CUR. L NEAR F4C1 CODE<br />
V STAT . N PROC F504 CODE Length =OOOF<br />
V SYNC . L NEAR F385 CODE<br />
V SYNC2. L NEAR F38A CODE<br />
V TBL .. L WORD F045 CODE<br />
V TERMINAL N PROC F47B CODE Length =0089<br />
-<br />
-<br />
-<br />
-<br />
-<br />
-<br />
-<br />
-<br />
- -<br />
-<br />
-<br />
-<br />
- - -<br />
- -<br />
-<br />
- -<br />
-<br />
-<br />
-<br />
-<br />
- -<br />
- -<br />
-<br />
-<br />
-<br />
- - -<br />
- -<br />
- -<br />
- -<br />
-<br />
- - -<br />
- -<br />
-<br />
- -<br />
- - -<br />
- -<br />
- - -<br />
- - -<br />
- - -<br />
-<br />
-<br />
-<br />
-<br />
-<br />
1-282<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong>
===w<br />
V TERM NOBELL. L NEAR F482 CODE<br />
V TERM NOP L NEAR F4FO CODE<br />
V TERM RET L NEAR F4EE CODE<br />
V TOP .. L WORD 004E DATA<br />
V TXT ON L NEAR F399 CODE<br />
V TXT MD N PROC F571 CODE Length =0012<br />
V TXT OK L NEAR F581 CODE<br />
V TXT RAC. L NEAR F3B9 CODE<br />
V TXT UP L NEAR F287 CODE<br />
V TXT WAC. L NEAR F3E3 CODE<br />
V TXT WC L NEAR F41C CODE<br />
- -<br />
- -<br />
-<br />
-<br />
- -<br />
- -<br />
- -<br />
- -<br />
- -<br />
- -<br />
- -<br />
v v .. L NEAR F338 CODE<br />
-<br />
V V2 .. L NEAR F373 CODE<br />
V WAC .. N PROC F3DB CODE Length =0039<br />
V WAC END. L NEAR F40F CODE<br />
V WAC HI L NEAR F3FA CODE<br />
V WAC LO L NEAR F400 CODE<br />
-<br />
-<br />
- -<br />
- -<br />
- -<br />
v we .. N PROC F414 CODE Length =003B<br />
-<br />
V WC END L NEAR F44A CODE<br />
- -<br />
v we HI. L NEAR F433 CODE<br />
v we LO. L NEAR F439 CODE<br />
V WC NEXT. L NEAR F433 CODE<br />
V WIDTH. L WORD 004A DATA<br />
-<br />
WASTE .. L NEAR F604 CODE<br />
WASTEG . L NEAR EE15 CODE<br />
WEREBACK L NEAR ODDS CODE<br />
WRITE PROTECT. Number 0003<br />
-<br />
WX2 FMT .. L NEAR 0000 CODE External<br />
-<br />
W NEC ... L NEAR F657 CODE<br />
W NEC RET. L NEAR F66B CODE<br />
W ONE. L NEAR EFSO CODE<br />
-<br />
- -<br />
-<br />
YEARS. . . L NEAR F913 CODE<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong> 1-283
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
Segments and Groups:<br />
N a m e Size Align Combine Class<br />
CODE . D54B PARA COMMON '<strong>ROM</strong>'<br />
INTVEC 7COO AT DODO<br />
WDRAM. 0078 AT 0040<br />
Symbols:<br />
N a m e Type Value Attr<br />
A1 BP. Number 0008<br />
A1 BX. Number OOOE<br />
A1 ex. Number oooc<br />
A1 DI. Number 0006<br />
A1 DS. Number 0002<br />
A1 OX. Number OOOA<br />
A1 ES. Number DODO<br />
AGAINO L NEAR B01C CODE<br />
AGAIN1 L NEAR BD34 CODE<br />
AGAIN2 L NEAR B04A CODE<br />
AGAIN3 L NEAR B060 CODE<br />
AGAIN4 L NEAR BD76 CODE<br />
AGAIN5 L NEAR BD8C CODE<br />
AGAIN6 L NEAR BOA2 CODE<br />
AL SI. Number 0004<br />
ANOTHER. L NEAR B015 CODE<br />
BAD. N PROC BODO CODE Length =0831<br />
BBB .. L NEAR BODO CODE<br />
BC BAD L NEAR D1B3 CODE<br />
BC BUFF RD Number OOOE<br />
BC BUFF WR Number OOOF<br />
-<br />
BC CC. Number 0001<br />
BC DASD. . Number 0015<br />
BC DIAG CTLR Number 0014<br />
BC DIAG DRV. Number 0013<br />
BC DIAG RAM. Number 0012<br />
-<br />
-<br />
BC FBT Number 0006<br />
-<br />
BC FD ... Number 0007<br />
BC FT. Number 0005<br />
BC PAR RD. Number 0008<br />
BC PAR SET Number 0009<br />
BC RD. Number 0002<br />
BC RDL Number OOOA<br />
BC RECAL Number 0011<br />
BC RESET Number 0000<br />
BC RESET 1 Number DODD<br />
BC SEEK. . Number oooc<br />
-<br />
BC TST ROY Number 0010<br />
-<br />
BC VR. Number 0004<br />
BC V W Number OOOE<br />
BC WR. Number 0003<br />
BC WRL Number OOOB<br />
<strong>BIOS</strong> INSTALL N PROC CFB4 CODE Global Length =0139<br />
1-284 <strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong>
BOGUS. L NEAR D17B CODE<br />
BOOT SUCC. L NEAR D158 CODE<br />
BREC . L NEAR D15D CODE<br />
BR TBL . L WORD D22A CODE<br />
BUFF IO. L NEAR D332 CODE<br />
BUSY L NEAR D48F CODE<br />
BUSY WAIT. L NEAR D484 CODE<br />
CCB BLKS Number 0004<br />
CCB BYTE . L NEAR D496 CODE<br />
CCB CMD. . Number DODD<br />
CCB DRV B. Number 0020<br />
CCB OPT. Number 0005<br />
CCB SEND L NEAR 047A CODE<br />
-<br />
-<br />
CCFD . Number 0007<br />
CCREC. . Number 0011<br />
CCRT .. Number 0012<br />
CC BUSY. L NEAR 04BD CODE<br />
CC ER .. Number 0002<br />
-<br />
CHK 1 .. L BYTE AOOO CODE<br />
CMD DONE L NEAR 01BA CODE<br />
COMMAND BR N PROC 01E4 CODE Length =033F<br />
CONTINUE . L NEAR 03CF CODE<br />
CTLR INIT. L NEAR 0011 CODE<br />
CTLR MISSING L NEAR 0288 CODE<br />
CTLR MX. . Number 0004<br />
-<br />
DC BUFF RD . Number OOOE<br />
DC BUFF WR . Number OOOF<br />
DC DIAG CTLR Number OOE4<br />
DC DIAG DRV. Number OOE3<br />
DC DIAG RAM. Number ODED<br />
DC ECC RD. Number 0000<br />
-<br />
DC FBT Number 0007<br />
-<br />
DC FD ... Number 0004<br />
DC FT ... Number 0006<br />
DC PAR SET Number oooc<br />
DC RD .. Number 0008<br />
DC RDL . Number DOES<br />
DC RECAL Number 0001<br />
DC SEEK. Number OOOB<br />
DC STAT RD Number 0003<br />
DC TBL . . L BYTE 0254 CODE<br />
DC TST ROY Number DODD<br />
DC VR. Number 0005<br />
DC WR .. Number OOOA<br />
DC WRL . Number OOE6<br />
-<br />
- -<br />
DETT BOOT. L NEAR 010E CODE<br />
DETT BOOT END. L NEAR 012B CODE<br />
DETT BOOT NXT. L NEAR 0124 CODE<br />
-<br />
DIS CHAR L NEAR DOAC CODE<br />
-<br />
DMACC. . Number 0001<br />
DMALONG. Number 0001<br />
DMANORM. Number DODO<br />
DMA 64K. L NEAR 0396 CODE<br />
DMA MASK B 3 Number 0003<br />
DMA MASK B S Number 0004<br />
-<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
1-285
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
DMA MODE RD. Number OOOB<br />
-<br />
DMA MODE WR. Number 0007<br />
DMA NO . . . L NEAR 0399 CODE<br />
DMA R STATUS Number 0008<br />
DMA START. L NEAR 0349 CODE<br />
DMA W ADDR Number 0006<br />
DMA W BYTE Number oooc<br />
DMA W CLR. Number 0000<br />
DMA W CMD. Number 0008<br />
DMA W CNT. Number 0007<br />
--<br />
DMA W MASK Number OOOF<br />
DMA W MASK B Number OOOA<br />
DMA W MODE Number OOOB<br />
DMA W REQ. Number 0009<br />
DNWIN. . Number 0080<br />
DRV ... L NEAR 0032 CODE<br />
DRVN OK. L NEAR D1B7 CODE<br />
-<br />
DRV 1 . . L NEAR D4F2 CODE<br />
DRV CTLR Number 0002<br />
-<br />
DRV DIAG L NEAR D3C4 CODE<br />
DRV FORMAT L NEAR D3CB CODE<br />
-<br />
DRV ROY. L NEAR 0076 CODE<br />
-<br />
DRV TOTAL. Number 0008<br />
OS BY HEX. N PROC B8C7 CODE Length =OOOC<br />
EC ADDR MARK Number 0002<br />
EC BAD TRK Number OOOB<br />
EC BC ... Number 0001<br />
EC CNTLR . Number 0020<br />
EC DMA 64K Number 0009<br />
EC ECC COR Number 0011<br />
EC ECC UN. Number 0010<br />
EC INIT. . Number 0007<br />
EC NO ERR. Number 0000<br />
EC RESET . Number 0005<br />
-<br />
EC SEC NOT FND Number 0004<br />
EC SEEK. Number 0040<br />
EC STAT. Number DOFF<br />
-<br />
EC TIME. Number 0080<br />
EC UNDEF Number OOBB<br />
ERC CORR Number 0018<br />
ERR. L NEAR B8AB CODE<br />
ER MASTER TBL. L BYTE 0523 CODE<br />
-<br />
FALL . L NEAR D3E6 CODE<br />
FCDISB . Number 0002<br />
FCKBIN . Number 0001<br />
FCPRSTR. Number 0009<br />
FCTEND Number 004C<br />
FILL . L BYTE A001 CODE Length =7FFF<br />
HABS . L NEAR 0067 CODE<br />
HABSS. Number OOOF<br />
HBAD . L NEAR 0051 CODE<br />
HBADS. Number 0000<br />
HD QUIT. L NEAR 0109 CODE<br />
HGOOD. L NEAR DOSE CODE<br />
HGOODS . Number 0009<br />
1-286<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong>
HMSG .<br />
H EXIT<br />
I13 BUFF RD.<br />
I13 BUFF WR.<br />
I13 cc . .<br />
I 13 IH . .<br />
I13 PAR RD<br />
I13 PAR WR<br />
I13 RD . .<br />
I13 RDL ..<br />
I13 RESET.<br />
I13 WR . .<br />
I13 WRL. .<br />
I19 BOOT SYS<br />
ID IH ....<br />
INT OCW1 . .<br />
INT OCW1 MO.<br />
INT OCW1 MS.<br />
INT OCW2 EOI<br />
INT WAIT .<br />
INT W OCW2<br />
IO LONG.<br />
IO NORM.<br />
IVDBC. .<br />
IVFC ..<br />
IVN BASIC.<br />
IVN BC . .<br />
IVN BC DETTE<br />
IVN DIS CHAR<br />
IV BC ...<br />
IV BC DETT .<br />
IV BOOT. . .<br />
IV BOOT BUF.<br />
IV INT . . .<br />
IV P TBL DETT.<br />
IV P TBL WIN<br />
KB RESET<br />
MDRV 1<br />
MEC.<br />
MI .<br />
MINT<br />
MNOD<br />
MSELTBL.<br />
MSUC ..<br />
NOCHG. .<br />
NO RESET<br />
NXT CTLR<br />
NXT DRV.<br />
NZDRVS .<br />
PAR WR .<br />
PAR WR ERX<br />
P DMA.<br />
P DMACC. .<br />
P DMA LATCH.<br />
P INT.<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
L NEAR DODC CODE<br />
L NEAR DOE4 CODE<br />
L NEAR 0330 CODE<br />
L NEAR 0336 CODE<br />
L NEAR 0312 CODE<br />
F PROC 0170 CODE Global Length =0067<br />
L NEAR D2EB CODE<br />
L NEAR D28B CODE<br />
L NEAR D33A CODE<br />
L NEAR D31B CODE<br />
L NEAR 0269 CODE<br />
L NEAR 0317 CODE<br />
L NEAR D32C CODE<br />
L NEAR ODED CODE<br />
L NEAR 0161 CODE<br />
Number 0001<br />
Number 0001<br />
Number 0020<br />
Number 0020<br />
L NEAR 0300 CODE<br />
Number 0000<br />
L NEAR 0310 CODE<br />
L NEAR D33C CODE<br />
Number 0013<br />
Number 0021<br />
Number 0018<br />
Number 0013<br />
Number 0040<br />
Number 0010<br />
L DWORD 004C INTVEC<br />
L DWORD 0100 INTVEC<br />
L DWORD 0064 INTVEC<br />
L FAR 7COO INTVEC<br />
L DWORD 0034 INTVEC<br />
L DWORD 0078 INTVEC<br />
L DWORD 0104 INTVEC<br />
L NEAR 0004 CODE<br />
L NEAR 0507 CODE<br />
L BYTE B9C5 CODE<br />
L BYTE B8E2 CODE<br />
L BYTE B99F CODE<br />
L BYTE B9EO CODE<br />
L NEAR 0509 CODE<br />
L BYTE B9B1 CODE<br />
L NEAR B853 CODE<br />
L NEAR 0191 CODE<br />
L NEAR 0040 CODE<br />
L NEAR 0080 CODE<br />
L NEAR DODO CODE<br />
L NEAR D29A CODE<br />
L NEAR D2DB CODE<br />
Number 0000<br />
Number 0063<br />
Number 0082<br />
Number 0020<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
1-287
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
P TBL DETT L NEAR CF29 CODE<br />
P TBL WIN. L NEAR CF34 CODE<br />
P WX2. Number 0320<br />
- -<br />
- -<br />
-<br />
RAM CC . . L BYTE 0074 WDRAM<br />
RAM CCB. . L BYTE 0042 WDRAM<br />
RAM DRV CNT. L BYTE 0075 WDRAM<br />
RAM KB RESET . L WORD 0072 WDRAM<br />
RAM OPT. L BYTE 0076 WDRAM<br />
RAM PO . L BYTE 0077 WDRAM<br />
RAM STAT L BYTE 0042 WDRAM<br />
RAM TIME L WORD 006C WDRAM<br />
-<br />
-<br />
- -<br />
-<br />
-<br />
-<br />
-<br />
REPEAT . L NEAR B027 CODE<br />
REQ L .. L NEAR D4CC CODE<br />
REQ SUCC L NEAR 0408 CODE<br />
RET NEAR L NEAR D28A CODE<br />
-<br />
RET NEAR 1 L NEAR 0200 CODE<br />
- -<br />
RET NEAR 2 L NEAR 048E CODE<br />
RET NEAR 3 L NEAR 0398 CODE<br />
RET NEAR 4 L NEAR 04C8 CODE<br />
- -<br />
- -<br />
- -<br />
RET NEAR 5 L NEAR 0476 CODE<br />
-<br />
-<br />
RET NO ERR . L NEAR 030F CODE<br />
RET STC. . L NEAR 04C7 CODE<br />
-<br />
RET TIME . L NEAR 048B CODE<br />
-<br />
RET TIME J L NEAR 03EE CODE<br />
RET TIME K L NEAR 03EB CODE<br />
- -<br />
-<br />
-<br />
RE OLY L NEAR 0270 CODE<br />
-<br />
RE W L NEAR 0274 CODE<br />
-<br />
ROW1 L NEAR BOZO CODE<br />
ROW2 L NEAR B043 ·:ODE<br />
ROW3 L NEAR B059 CODE<br />
ROW4 L NEAR B06F CODE<br />
ROWS L NEAR B085 CODE<br />
ROW6 L NEAR B09B CODE<br />
SEC SIZE Number 0200<br />
SEC SIZE NORM. L NEAR 0340 CODE<br />
-<br />
-<br />
-<br />
SEND BYTE. L NEAR 02DE CODE<br />
SEND ERR L NEAR 02E8 CODE<br />
-<br />
STAT ERR . L NEAR 0477 CODE<br />
-<br />
STAT LOOP. L NEAR 0418 CODE<br />
-<br />
SUBTABLE L NEAR 04DA CODE<br />
SW B . Number 0067<br />
-<br />
TOL. Number 0009<br />
TO TBL L NEAR 052B CODE<br />
-<br />
T1L .. Number OOOA<br />
T1 TBL L NEAR 0534 CODE<br />
-<br />
T2L .. Number 0002<br />
T2 TBL L NEAR 053E CODE<br />
-<br />
T3L .. Number 0003<br />
T3 TBL L NEAR 0540 CODE<br />
-<br />
TI 0 1 Number 0165<br />
TI BC RESET. Number 0584<br />
TI FIN Number 01BE<br />
TI KB RESET. Number 019A<br />
-<br />
TRDYO. . L NEAR 0024 CODE<br />
TST DRV ROY. L NEAR 0030 CODE<br />
1-288<br />
- -<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong>
UNDEF. L NEAR D474 CODE<br />
USABLE L NEAR D09C CODE<br />
W2RAM. Number 0040<br />
WAIT MORE. L NEAR D3D8 CODE<br />
WASTED L NEAR B01F CODE<br />
WASTE1 L NEAR B037 CODE<br />
WASTE2 L NEAR B04D CODE<br />
WASTE3 L NEAR B063 CODE<br />
WASTE4 L NEAR B079 CODE<br />
WASTES L NEAR B08F CODE<br />
WASTE6 L NEAR BOAS CODE<br />
WE BAD L NEAR BOB1 CODE<br />
-<br />
WINS USABLE. L NEAR DOBA CODE<br />
WIN BC . . . L NEAR D188 CODE<br />
WIN BOOT .. L NEAR D13S CODE<br />
WIN BOOT NXT L NEAR D1S2 CODE<br />
WIN CONT L NEAR D1AC CODE<br />
-<br />
-<br />
WST CYL. . Number DODO<br />
WST DDTO . Number OOOB<br />
-<br />
WST ER BUR Number 0007<br />
WST FTO .. Number OOOA<br />
WST HEADS. Number 0002<br />
WST OPT. . Number 0008<br />
-<br />
-<br />
WST RE WR. Number 0003<br />
WST STO. . Number 0009<br />
WST WR PRE Number ODDS<br />
-<br />
- -<br />
WX2 CC . . L NEAR D4AC CODE<br />
WX2 CONFIG L NEAR DS14 CODE<br />
WX2 CONFIG 0 Number oooc<br />
WX2 CONFIG 1 Number 0003<br />
WX2 FMT. N PROC B840 CODE Global Length =0087<br />
WX2 INT. . . L NEAR D3F1 CODE<br />
-<br />
-<br />
WX2 L .... Number 0004<br />
WX2 LRG OFFSET Number oooc<br />
WX2 MSK ... L NEAR DS1E CODE<br />
WX2 MSK DMA. Number 0001<br />
- -<br />
-<br />
WX2 MSK INT. Number 0002<br />
- -<br />
WX2 REQ ... L NEAR D4C9 CODE<br />
WX2 RESET. . L NEAR DS19 CODE<br />
-<br />
WX2 R CONFIG Number 0002<br />
WX2 R DATA . Number DODO<br />
WX2 R STATUS Number 0001<br />
WX2 STAT .. L NEAR DS19 CODE<br />
-<br />
WX2 STAT BUSY. Number 0008<br />
- -<br />
WX2 STAT CD. Number 0004<br />
WX2 STAT DRQ Number 0010<br />
WX2 STAT INT Number 0020<br />
WX2 STAT IO. Number 0002<br />
WX2 STAT REQ Number 0001<br />
- -<br />
- -<br />
WX2 WAIT . L NEAR D3AO CODE<br />
-<br />
WX2 W DATA . Number DODO<br />
WX2 W MSK. . Number 0003<br />
WX2 W RESET. Number 0001<br />
WX2 W SELECT Number 0002<br />
ZFMT L NEAR B880 CODE<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
1-289
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong><br />
ZHEX<br />
ZNX.<br />
ZNX2<br />
ZTEND.<br />
1-290<br />
N PROC B8D3<br />
L NEAR B8BA<br />
L NEAR B8BD<br />
L NEAR B8C1<br />
CODE<br />
CODE<br />
CODE<br />
CODE<br />
Length =OOOF<br />
<strong>ROM</strong> <strong>BIOS</strong> <strong>Listing</strong>
A<br />
ACSII String Utilities-Display, 1-142<br />
Additional Keyboard Data Area, 1-14<br />
Addresses, 1-4<br />
Floppy Disk Port, 1-8<br />
PC <strong>6300</strong> PLUS, 1-4<br />
i8237A p_dma Controller Port, 1-4<br />
i8254 p_timer Port, 1-6<br />
i8259A Programmable Interrupt Controller Port, 1-5<br />
Alphabetic (Migratory), 1-36<br />
Alphabetic (Non-Migratory), 1-40<br />
Alternate Numeric Keypad, 1-172<br />
Assembly Modules, 1-3<br />
Asynchronous Communication Chip (INS8250), 1-9<br />
B<br />
Background Colors-Set, 1-217<br />
BEL Character, 1-224<br />
Bound Instruction-Check, 1-262<br />
Break Key Sequence, 1-173<br />
Byte Location-Video RAM, 1-80<br />
c<br />
Call Internal HDU !nit Code, 1-135<br />
CapLk Bytes, 1-35<br />
Carry Flag, 1-174<br />
Cassette I/0, 1-237<br />
Change-Line Status, 1-190<br />
Check Error Status, 1-231<br />
Check Hardware Switches for Drive Type, 1-227<br />
Check Valid, 1-188<br />
Check for Bound Instruction, 1-262<br />
Clear Screen, 1-131<br />
Clock Calendar, 1-8<br />
58274A, 1-8<br />
MM58274 Device Test, 1-115<br />
Read or Write, 1-242<br />
Write, 1-246<br />
Clock Test (8254), 1-138<br />
Clock Test (MM58274), 1-138<br />
Code Declaration, 1-2<br />
Cold Boot, 1-131<br />
Cold Boot Routine, 1-239<br />
Color Video Controller, 1-9<br />
Colors-Set Background and Foreground, 1-217<br />
Commands, 1-5<br />
Floppy Disk, 1-8<br />
i8259A Programmable Interrupt Controller, 1-5<br />
Index<br />
Communication LSI Test, 1-140<br />
Constants, 1-4<br />
Global, 1-4<br />
Keyboard, 1-10<br />
i8237 A p_dma Controller, 1-5<br />
Control Bytes-i8254 p_timer, 1-6<br />
Control Ports (General), 1-7<br />
Controller Tests, 1-95<br />
8237 p_dma, 1-95, 1-101, 1-103<br />
8254 p_dma p_timer, 1-95<br />
8259A Programmable Interrupt Controller, 1-104<br />
CPU, 1-95<br />
<strong>ROM</strong>, 1-95<br />
Convert BCD to Hexadecimal, 1-245, 1-246<br />
Convert Hexadecimal to BCD, 1-250<br />
CPU Interrupt Routines, 1-11<br />
CPU System Reset Vector, 1-264<br />
Cursor, 1-202<br />
Read, 1-203<br />
Read Attribute and Character, 1-213<br />
Set Position, 1-203<br />
Set Value, 1-202<br />
Write Attribute and Character, 1-214<br />
Write Character, 1-216<br />
D<br />
Data Area, 1-12<br />
Additional Keyboard, 1-14<br />
Fixed Disk, 1-13<br />
Floppy Disk, 1-13<br />
Keyboard, 1-12<br />
Optional Post, 1-13<br />
Printer and RS-232 Time-Out, 1-14<br />
<strong>ROM</strong> <strong>BIOS</strong>, 1-12<br />
System, 1-13<br />
Video Display, 1-13<br />
i8254 p_timer, 1-13<br />
Data Declarations, 1-11<br />
Days Per Month, 1-250<br />
Decimal Number-Display in ASCII Utilities, 1-144<br />
Delay Loop (One Millisecond), 1-187<br />
Deluxe Code Put NUL into kb_buffer, 1-171<br />
Disable 8259A Programmable Interrupt Controller, 1-125<br />
Disk Drive Tests, 1-140<br />
Disk Driver Error Codes (FDU and HDU), 1-8<br />
Disk Drivers-Initialize, 1-131<br />
Diskstate, 1-188<br />
Display ACSII String Utilities, 1-142<br />
Display Decimal Number in ASCII Utilities, 1-144<br />
Display Hexadecimal Number in ASCII Utilities, 1-143<br />
Display Page (Active), 1-204<br />
Scroll Down, 1-212<br />
Scroll Up, 1-206<br />
Set, 1-204<br />
Terminal Emulator, 1-218<br />
I-1
Index<br />
Display Routines, 1-195<br />
DMA Controller, 1-184<br />
Double Zero on Keypad, 1-173<br />
E<br />
Enable Video, 1-120<br />
Equipment Check, 1-237<br />
EQUs to Include Correct Code for Varying Hardware<br />
Versions, 1-2<br />
EQUs to Set rom_id Variable for UNIX, 1-2<br />
Error Routine-Fatal, 1-234<br />
Error Status-Check, 1-231<br />
F<br />
Fatal Error Routine, 1-234<br />
FDC-Reset and Reprogram, 1-179<br />
FDU, 1-8<br />
Controller Constants, 1-8<br />
Disk Driver Error Codes, 1-8<br />
Equates, 1-8<br />
Floppy Disk Commands, 1-8<br />
Floppy Disk Port Addresses, 1-8<br />
Parameter Table, 1-229<br />
Rate Flip-Flops-Write, 1-232<br />
Test, 1-137<br />
FDU and HDU Disk Driver Error Codes, 1-8<br />
Filename, 1-15<br />
boot.src, 1-239<br />
bootl.src, 1-149<br />
cal.src, 1-242<br />
coml.src, 1-149<br />
com2.src, 1-157<br />
fdu6.asm, 1-147<br />
fdu7.asm, 1-163<br />
graph.src, 1-78<br />
hdisk.asm, 1-15<br />
int18.src, 1-233<br />
kb.data, 1-34<br />
kbl.src, 1-154<br />
kb2.src, 1-165<br />
kb_buffer, 1-171,1-175<br />
kb_flag, 1-171<br />
mem.src, 1-236<br />
nmi.src, 1-238<br />
prnscr.src, 1-261<br />
prt.src, 1-191<br />
pwrupO.src, 1-130<br />
pwrupl.src, 1-95<br />
pwrup1a.src, 1-119<br />
pwrup2.src, 1-138<br />
pwrup3.src, 1-140<br />
pwrup4.src, 1-234<br />
rtc.src, 1-256<br />
vector.src, 1-259<br />
vid.src, 1-195<br />
Fixed Disk Data Area, 1-13<br />
I-2<br />
Floppy Disk, 1-8<br />
Commands, 1-8<br />
Data Area, 1-13<br />
Port Addresses, 1-8<br />
Foreground Colors-Set, 1-217<br />
Format Drive, 1-17<br />
Function Keypad, 1-42<br />
G<br />
Game Card, 1-9<br />
General Control Ports, 1-7<br />
Get Byte From FDU Parameter Table, 1-229<br />
Global Constants, 1-4<br />
Graphics Mode, 1-82<br />
Read Character, 1-87<br />
Scroll Down, 1-86<br />
Scroll Up, 1-82<br />
Write Character, 1-91<br />
Graphics Refresh Memory, 1-84<br />
Fill Rows With Fill Pattern, 1-85<br />
Get Offset, 1-95<br />
Scroll Rows, 1-84<br />
Graphics Support, 1-78<br />
Groups, 1-265, 1-284<br />
H<br />
Hard Disk (Western Digital), 1-15<br />
Hardware Switches-Check for Drive Type, 1-227<br />
HDU Init Code-Call, 1-135<br />
Hexadecimal Number-Display in ASCII Utilities, 1-143<br />
I<br />
i8041A Keyboard Hardware Interrupt Service<br />
Routine, 1-165<br />
i8041A Keyboard Software Interrupt Request<br />
Routine, 1-154<br />
i8237A p_dma, 1-4<br />
Controller Constants, 1-5<br />
Controller Port Addresses, 1-4<br />
i8254 Real-Time Time Clock Test, 1-117<br />
i8254 p_timer, 1-6<br />
Control Bytes, 1-6<br />
Counts, 1-6<br />
Data Area, 1-13<br />
Hardware Interrupt Service Routine, 1-257<br />
Port Addresses, 1-6<br />
i8259A Programmable Interrupt Controller, 1-5<br />
Commands, 1-5<br />
Hardware Interrupt Routines, 1-11<br />
Port Addresses, 1-5<br />
Illegal Opcode Interrupt Routine, 1-146<br />
Includes of Assembly Modules, 1-3
Initialize 8259A Programmable Interrupt<br />
Controller, 1-125<br />
Initialize All RAM Variables, 1-131<br />
Initialize Basic Hardware, 1-131<br />
Initialize Disk Drivers, 1-131<br />
Initialize Optional <strong>ROM</strong>s, 1-136<br />
Initialize Parallel Printer Interface, 1-194<br />
Initialize RS-232 Interface, 1-153<br />
Initialize Video, 1-107<br />
Input Drive Parameter, 1-228<br />
INS8250, 1-9<br />
Asynchronous Communication Chip, 1-9<br />
Baud Rate Time Constants, 1-150<br />
Compatible Modem Control Bits, 1-150<br />
Get Byte, 1-162<br />
Put Byte, 1-160<br />
Install Vector Table, 1-124<br />
Interrupt Locations, 1-11<br />
Interrupt Pointers-Set Up, 1-131<br />
Interrupt Routines, 1-11<br />
CPU, 1-11<br />
Illegal Opcode, 1-146<br />
Printer Software, 1-191<br />
RS-232 Software, 1-151<br />
Software, 1-11<br />
Time of Day, 1-256<br />
Unused Hardware and Illegal Software<br />
Interrupts, 1-260<br />
Video, 1-196<br />
i8041A Keyboard Software, 1-154<br />
i8254 p_timer Hardware, 1-257<br />
i8259A Programmable Interrupt Controller, 1-11<br />
Interrupt Vector Area, 1-49<br />
Interrupt Vectors, 1-259<br />
J<br />
Jump Table, 1-153<br />
K<br />
Keyboard, 1-7<br />
Boot-Strap Options, 1-140<br />
Constants, 1-10<br />
Controller (8041), 1-7<br />
Data Area, 1-12<br />
LEDs, 1-173<br />
Scan Code Translation Data, 1-34<br />
Test (8041), 1-140<br />
i8041A Hardware Interrupt Service Routine, 1-165<br />
i8041A Software Interrupt Request Routine, 1-154<br />
Keypad, 1-41<br />
Alternate, 1-172<br />
Double Zero, 1-173<br />
Function, 1-42<br />
Numeric, 1-41<br />
L<br />
Light Pen-Read, 1-204, 1-225<br />
M<br />
Macro Definitions, 1-2<br />
Macros, 1-265<br />
Media Change, 1-190<br />
Memory Size Detect, 1-236<br />
Message Routines, 1-140<br />
MM58274 Clock Calendar Device Test, 1-115<br />
MM58274 Clock Test, 1-138<br />
Monochrome Video Controller, 1-9<br />
Motherboard Switches-Read, 1-227<br />
N<br />
NEC, 1-183<br />
Controller-Read Result Bytes, 1-183<br />
Controller-Send Byte, 1-232<br />
Interrupt, 1-230<br />
Ready, 1-229<br />
Numeric Keypad, 1-41<br />
0<br />
Optional Post Data Area, 1-13<br />
ORG'd Font Tables, 1-251<br />
OS Merge Link Address, 1-14<br />
Overscan-Set, 1-217<br />
p<br />
Parallel Printer Interface, 1-9<br />
Initialize, 1-194<br />
Print Character, 1-193<br />
Read Status, 1-194<br />
Parameters for Diskette Operation, 1-190<br />
Passing Error Messages-Display, 1-107<br />
Pause Waiting for Another Key, 1-170<br />
PC <strong>6300</strong> PLUS Addresses, 1-4<br />
Port Addresses, 1-4<br />
Floppy Disk, 1-8<br />
i8237A p_dma Controller, 1-4<br />
i8254 p_timer, 1-6<br />
i8259A Programmable Interrupt Controller, 1-5<br />
Print Character to Parallel Printer Interface, 1-193<br />
Print Screen, 1-261<br />
Print Screen Sequence, 1-170<br />
Printer Software Interrupt Request Routine, 1-191<br />
Printer Time-Out Data Area, 1-14<br />
Index<br />
I-3
Index<br />
Programmable Interrupt Controller, 1-125<br />
Disable, 1-125<br />
Initialize, 1-125<br />
Output Mask, 1-126<br />
Protected Mode Data Space, 1-15<br />
R<br />
RAM, 1-12<br />
Initialize All Variables, 1-131<br />
Size and Clear, 1-108<br />
Stack, 1-12<br />
Storage Test, 1-128<br />
Test, 1-17, 1-140<br />
Workspace, 1-50<br />
Read Attribute and Character at Cursor, 1-213<br />
Read Character in Graphics Mode, 1-87<br />
Read Clock Calendar Device, 1-242<br />
Read Current Video Status, 1-220<br />
Read Cursor, 1-203<br />
Read DASD Type, 1-226<br />
Read Dot, 1-79, 1-218<br />
Read Light Pen, 1-204, 1-225<br />
Read Motherboard Switches, 1-227<br />
Read Result Bytes From NEC Controller, 1-183<br />
Read Status of Parallel Printer Interface, 1-194<br />
Read Status of RS-232 Interface, 1-157<br />
Register Initialization Routine, 1-221<br />
Registers (6845)-0utput Two Bytes, 1-205<br />
Reserved, 1-14<br />
Reset and Reprogram FDC, 1-179<br />
<strong>ROM</strong>, 1-100<br />
Data, 1-195<br />
Module Test, 1-100<br />
Test, 1-140<br />
<strong>ROM</strong> <strong>BIOS</strong> Data Area, 1-12<br />
<strong>ROM</strong>s-Test for and Initialize, 1-136<br />
RS-232 Interface, 1-14<br />
s<br />
Initialize, 1-153<br />
Read Status, 1-157<br />
Software Interrupt Request Routine, 1-151<br />
Time-Out Data Area, 1-14<br />
Wait for Status, 1-159<br />
Scan Code Translation Data (Keyboard), 1-34<br />
Screen Sequence-Print, 1-170<br />
Screen-Print, 1-261<br />
Screen-Set Mode and Clear, 1-198<br />
Scroll Active Page Down, 1-212<br />
Scroll Active Page Up, 1-206<br />
Scroll Down in Graphics Mode, 1-86<br />
Scroll Positioning and Register Initialization<br />
Routine, 1-221<br />
I-4<br />
Scroll Rows in Graphics Refresh Memory, 1-84<br />
Scroll Up in Graphics Mode, 1-82<br />
Sector Buffer, 1-17<br />
Seek, 1-186<br />
Segments, 1-265, 1-284<br />
Send Byte to NEC Controller, 1-232<br />
Sense Interrupt Status, 1-231<br />
Set Active Display Page, 1-204<br />
Set Cursor Position, 1-203<br />
Set Cursor Value, 1-202<br />
Set Format Transfer Rate, 1-163<br />
Set Mode and Clear Screen, 1-198<br />
Set Original State, 1-228<br />
Set Overscan and Background/Foreground Colors, 1-217<br />
Set Transfer Rate, 1-228<br />
Software Interrupt Routines, 1-11<br />
State Shifts, 1-171<br />
Symbols, 1-265, 1-284<br />
System Configuration From Switches and Enable<br />
Video, 1-120<br />
System Configuration-Determine From Switches, 1-107<br />
System Data Area, 1-12, 1-13<br />
System Initialization, 1-140<br />
System Reset Sequence-Test for, 1-170<br />
T<br />
Temporary Hardware Initialization, 1-130<br />
Terminal Emulator to Active Page, 1-218<br />
Test for Retry, 1-147<br />
Test for System Reset Sequence, 1-170<br />
Time Clock (i8254 Real-Time), 1-117<br />
Time of Day Software Interrupt Request Routine, 1-256<br />
u<br />
Utility Routines, 1-141<br />
v<br />
Vector Table-Install, 1-107, 1-124<br />
Video Controller (Color and Monochrome), 1-9<br />
Video Controller Test, 1-138<br />
Video Display Data Area, 1-13<br />
Video Interrupt Service Routine, 1-196<br />
Video RAM, 1-15<br />
Video RAM Buffer-Calculate Offset of Character in<br />
Text Mode, 1-223<br />
Video RAM Byte Location, 1-80<br />
Video <strong>ROM</strong>S-Test for and Initialize, 1-122<br />
Video Status-Read Current, 1-220
w<br />
Wait for Status of RS-232 Interface, 1-159<br />
Western Digital Hard Disk, 1-15<br />
Write Attribute and Character at Cursor, 1-214<br />
Write Character at Cursor Position, 1-216<br />
Write Character in Graphics Mode, 1-91<br />
Write Clock Calendar Device, 1-242, 1-246<br />
Write Dot, 1-79, 1-218<br />
Write to FDU Rate Flip-Flops, 1-232<br />
I-5