15.08.2013 Views

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

SHOW MORE
SHOW LESS

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

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!