55X8817_PC_Convertable_Technical_Reference_Volume_2_Feb86 55X8817 PC Convertable Technical Reference Volume 2 Feb86

User Manual: 55X8817_PC_Convertable_Technical_Reference_Volume_2_Feb86

Open the PDF directly: View PDF PDF.
Page Count: 275

Download55X8817_PC_Convertable_Technical_Reference_Volume_2_Feb86 55X8817 PC Convertable Technical Reference Volume 2 Feb86
Open PDF In BrowserView PDF
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,

First Edition (February 1986)
THE FOLLOWING PARAGRAPH DOES NOT APPLY TO THE
UNITED KINGDOM OR ANY COUNTRY WHERE SUCH
PROVISIONS ARE INCONSISTENT WITH LOCAL LAW:
International Business Machines Corporation provides this manual "as is,"
without warranty of any kind, either express or implied, including, but not
limited to, the particular purpose. IBM may make improvements and
changes in the products and the programs described in this manual at any
time.
This product could include technical inaccuracies or typographical errors.
Changes are periodically made to the information herein; these changes will
be incorporated in new editions of the publication.
It is possible that this material may contain reference to, or information
about, IBM products (machines and programs), piOgramming, or services
that are not announced in your country. Such references or information
must not be construed to mean that IBM intends to announce such IBM
products, programming, or services in your country.
Products are not stocked at the address below. Requests for copies of the
product and for technical information about the system should be made to
your authorized IBM Personal Computer Dealer.
THE FOLLOWING PARAGRAPH APPLIES ONLY TO THE UNITED
STATES AND PUERTO RICO: A form for reader's comments is
provided at the back of this publication. If the form has been removed,
comments may be addressed to IBM Corporation, Department 95H, 11400
Burnet Road, Austin, Texas 78758, U.S.A. IBM may use or distribute
whatever information you supply in any way it believes appropriate without
incurring any obligation to you.
All specifications are subject to change without notice.
©Copyright International Business Machines 1986

Preface

The IBM PC Convertible Technical Reference consists of two
volumes. Volume 1 describes the hardware design and
provides interface information for the IBM PC Convertible.
Volume 1 also has information about the basic input/output
system (BIOS) and programming support. Volume 2 contains
the BIOS listings.
The information in these volumes is both descriptive and
reference-oriented and is intended for hardware and software
designers, programmers, engineers, and other interested
persons who need to understand the design and operation of
the IBM PC Convertible. These users should be familiar with
the use of the IBM PC Convertible and understand the
concepts of computer architecture and programming.
Volume 1 has five sections:
•

Section 1, "Introduction" is an overview of the system and
the available options.

•

Section 2, "System Unit" describes each functional part of
the base system. This section also contains the description
of the interfaces. Programming considerations are
supported by command code and register descriptions.

•

Section 3, "System Options" describes each available
option.

•

Section 4, "System BIOS and Usage" describes the basic
input/output system (BIOS) and its use. This section also
contains the software interrupt listing, a system memory
map, descriptions of vectors with special meanings, and a
set oflow-storage maps. In addition, Section 4 describes
keyboard encoding and usage.

•

Section 5, "Compatibility with the IBM Personal
Computer Family" describes programming concerns for
maintaining compatibility among the IBM PC
Convertible system and the other IBM Personal
Computers.

iii

Volume 1 has the following appendixes:
•

Appendix A, "Characters and Keystrokes"

•

Appendix B, "Unit Specifications"

•

Appendix C, "Logic Timing Diagrams"

•

Appendix D, "Power-On Self Test Error Codes".

Volume 2 contains the BIOS listing and is to be used in
conjunction with Volume 1.

Prerequisite Publications
Guide to Operations: for the IBM PC Convertible.

Suggested Reading
•

BASIC for the IBM Personal Computer

•

Disk Operating System

•

Hardware Maintenance and Service for the IBM PC
Convertible

•

MACRO Assembler for the IBM Personal Computer.

iv

Contents

Section 1. Power-On Self-Test (POST) ............... 1-1
Power-On Self-Test Sequence .................. 1-2
Modem Presence Test ........................ 1-9
Printer/Communications Presence Test ......... 1-12
Section 2. ROM BIOS Listing ...................... 2-1
ROMMap ................................. 2-4
Common Equates and Data Areas ............... 2-7
Nonmaskable Interrupt Handler (BlONMIH) .... 2-26
Keyboard Services (BIIKYBD) ............... 2-65
Video I/O and Print Screen (BI2VIDEO) ........ 2-77
Diskette Support (B 13DSKT) ................ 2-119
Communications and Printer BIOS
(B14COMMO) ........................... 2-143
Time of Day (B15TOD) ..................... 2-153
System Services (B 16SYSV) . . . . . . . . . . . . . . . . . . 2-168
General Subroutines and Tables (B 17TABLE) ... 2-191
Release Date Marker ....................... 2-241
System Model Byte ......................... 2-241

v

Notes:

vi

Section 1. Power-On Self-Test
(POST)

The IBM PC Convertible uses a set of routines called the
power-on self-test (POST) routines. These routines
automatically activate system power, perform basic function
and device control tests for the major system components,
and initialize the system to the ready state. Because the
operation of these routines is automatic and cannot be
changed by an application programmer, the actual program
listings are not included in this manual. However, it may be
useful to understand the function of these routines and the
initial values they may establish.
Figure I-Ion page 1-2 shows the sequence of the steps the
power-on routines, the error indicators returned, and the
initial values established. Figure 1-2 on page 1-9 and Figure
1-3 on page 1-12 provide additional information on testing for
the presence of devices.

Power-On Self-Test (POST) 1-1

Power-On Self-Test Sequence
Description

Error Indication

Processor test: Verifies processor
operation.

System power off.

System ROM checksum test:
Verifies system ROM.

I-long and I-short
beep, then system
power off.

Real-iime clock RAM test: Verifies
the clock. If contents have been
altered, RAM is cleared and
system profile defaults are loaded.

l-iong and I-short
beep, then system
power off.

Power source and battery check:
Checks for external power. If no
external power, checks for good
battery.

3-short beeps, then
system power off.

Base 8K RAM test: Validates first
8K of RAM and clears it to zero.

I-long and I-short
beep, then system
power off.

Internal modem power on: Checks
for internal modem presence and
applies power to it ifpresent. See
Figure 1-2 on page 1-9 for
additional information.
Figure 1-1 (Part 1 of7). Power-on Self-Test Sequence

1-2 Power-On Self-Test (POST)

Description

Error Indication

Video adapter presence test:
Checks for attached video
adapters by nondestructive writing
and reading hex A55A to address
hex BOOOO and B8000. Checks for
video adapters with valid rom.
Checks for LCD by determining if
the 'LCD sense' line is set.
Video interrupt vectors
initialization: Initializes hex 10,
I D, I F and 44 video interrupt
vectors to system default values.
Video ROM validity tests: Checks
for video adapter with valid ROM.
See Volume I for additional
information about adapters with
system accessible ROM. Links to
ROM if valid.
LCD function test: Runs LCD
function test if the LCD is present.

Error 5001, 5002, or
5003

CRT adapter without ROM
presence andfunction tests: Ifa
CRT adapter without ROM is
present, test vertical and
horizontal syncs.

Error 0501

Operable display presence test:
Checks to ensure that an operable
display is present.

I-long and 2-short
beeps, then system
power off.

Figure 1-1 (Part 2 of 7). Power-on Self-Test Sequence

Power-On Self-Test (POST) 1-3

Description

Error Indication

Display initialization: Ifnot a
resume sequence, initialize the
display for POST. Ifthe LCD is
present, loads the default font
from vectors hex I F and 44.
Interrupt controller test: Tests the
interrupt controller and initializes
it to edge triggered, software
end-of-interrupt, and interrupt
types 8-15.

Error 0 I 0 I with icon,
I-long and I-short
beep, then waits for
power off or
Fn/Ctl/Del sequence.

System timers tests: Tests the
system timers. Timer-O is
initialized to 18.2 interrupts per
second rate.

One of the following:
Error 0 I 03 with icon,
I-long and I-short
beep, then waits for
power off or
Fn/CtljDel sequence.
Error 0 I 02 with icon
and Fl prompt; POST
continues.

DMA controller test: Tests the
DMA controller.

Error 0105 with icon,
I-long and I-short
beep, then waits for
power off or
Fn/CtljDel sequence.

Figure 1-1 (Part 3 of 7). Power-on Self-Test Sequence

1-4 Power-On Self-Test (POST)

Description

Error Indication

Keyboard controller test: Tests the
keyboard controller.

One of the following:
Error 0303 or 0304
with icon, I-long and
I-short beep, then
wai ts for power off or
Fn/Ctl/Del sequence.
Error 0102 with icon
and Fl prompt; POST
continues.

Interrupt vectors initialization:
Initializes interrupt vectors 0
through 32 excluding the video
interrupt vectors.
Serial/parallel initializations:
Initializes the serial and parallel
adapter timeout values.
Internal modem initialization:
Initializes the internal modem. See
Volume 1 for additional
information about initializing the
internal modem.
RAM block check: Checks RAM
for good contiguous 8K-bytes of
RAM.

Error 0164 with icon
and Fl prompt.

Figure 1-1 (Part 4 of 7). Power-on Self-Test Sequence

Power-On Self-Test (POST) 1-5

Description

Error Indication

RAMfunction test: Checks for
functional RAM in 64K-byte
increments and clears it to zeroes.
This test is not performed during
either a resume or Ctlj AltjDel
sequence.

One of the following:
When less than
64K-bytes of RAM is
functional, error 020 I
or 0202 with icon,
I-long and I-short
beep, then waits for
power off or
FnjCtljDel sequence.
When more than
64K-bytes of RAM is
functional, error 020 I
or 0 I 02 with icon and
FI prompt. POST
continues.

Diskette drive function test: Tests
the operation ofthe diskette drives.

One of the following:
Error 060 I with icon,
I-long and I-short
beep, then waits for
power off or
FnjCtljDel sequence.
Error 060 I with icon
and FI prompt.

Figure 1-1 (Part 50f7). Power-on Self-Test Sequence

1-6 Power-On Self-Test (POST)

Description

Error Indication

Real-time clock test: Tests the
update and interrupt functions.
Zeros and initializes time and
date, and sets alarm to zeros if the
clock has not been updated or if
power was lost.

Error 0163 with icon
and Fl prompt.

Portable printer interface test:
Checks the function of the adapter.

Error 510 1 with icon
andFI prompt.

Printer/communications presence
test: Checks to determine what
printer and communications
features are attached. See Figure
1-3 on page 1-12 for additional
information.
Internal modem test: Checks the
function ofthe internal modem.

Error 110 1 or 1102
with icon and Fl
prompt.

Serial adapter test: Tests the serial
adapter portion of the IBM PC
Convrtible Serial/Parallel Adapter
if it is installed.

Error 1101 or 1201
with icon and Fl
prompt.

Feature adapter ROM presence:
External adapters are tested for the
presence of ROM. See Volume 1
for additional information about
adapters with system accessible
ROM. Links to the ROM if valid.

Checksum or feature
error.

Figure 1-1 (Part 6 of 7). Power-on Self-Test Sequence

Power-On Self-Test (POST) 1-7

Description

Error Indication

Set time ofday: Sets time of day
data area from real-time clock.

Clock icon if clock has
not been set by the
user.

Low battery test: Checks for good
battery.

Battery icon if battery
is low and warning is
enabled in the system
profile.

Complete POST: Ifa system
suspend was active and the resume
was not cancelled, the system state
is restored and the application
resumed. Otherwise, the LCD
default font is loaded from vectors
hex 1F and 44, and the system is
booted from drive O.

2-short beeps if any
warmng errors
occurred.

Figure 1-1 (Part 7 of7). Power-on Self-Test Sequence

1-8 Power-On Self-Test (POST)

Modem Presence Test

Clear
RS232_BASE
table (hex 400).

Clear
PRINTER_BASE
table (hex 408).

Turn off power to
internal modem
and serial/parallel
adapter.

Write/read hex
AAand55to
work register at
hex3FF.

To

Part 2
Figure 1-2 (Part 1 of 3). Internal Modem Presence Test

Power-On Self-Test (POST) 1-9

Yes (Other adapter present)

Turn on power to
internal modem.

Set loop counter

t05.

Delay 100 ms.

Write/read hex
AA and 55 to
work register at
hex 3FF.

To
Part 3

Figure 1-2 (Part 2 of 3). Internal Modem Presence Test

1-10 Power-On Self-Test (POST)

Set first entry in
RS232_BASE
table to hex 3F8.

From
Part 2

No

Set modem
installed flag in
equipment word.

Subtract 1 from
loop counter.

Set first entry in
RS232-BASE
table to hex 3F8.

Turn off modem
power.

To
Part 2

Return to POST.

Figure 1-2 (Part 3 of 3). Internal Modem Presence Test

Power-On Self-Test (POST) 1-11

Printer/Communications Presence
Test
From
Part 3

Set pointer to
PRINTER_BASE
table (hex 408).

--

t

Printer presence test
Printer Table (PRT_TAB)

Set pointer to
PRT_TAB table.

Entry
(hex)

Port

078
378
3BC
278

Portable Printer
Primary Printer
Mono Adapter
Secondary

No

No

To
Part 3

Delay 160 ms.

Check portable
printer status
register (hex
079).

To
Part 3

__ SPortable printer
lpresence test

To
Part 2

Figure 1-3 (Part 1 of 7). Printer/Communications Presence Test

1-12 Power-OnSelf-Test(POST)

From

Part 1

Yes (Attached)

Yes (Not attached)

To
Part 3

Send top of
forms (ESC 4)
command.

No (Not attached)

Yes (Attached)

To
Part 3

To
Part 3
To
Part 2
Figure 1-3 (Part 2 of 7). Printer/Communications Presence Test

Power-On Self-Test (POST) 1-13

From
Parts 1 and 2

From
Part 2

From
Parts 1 and 2

No

Store address in
PRINTER_BASE
table.

Move
PRINTER_BASE
table pointer to
next entry.

Move PRT_TAB
table pointer to
next entry.

No

To
Part 4

Figure 1-3 (Part 3 of 7). Printer/Communications Presence Test

1-14 Power-On Self-Test (POST)

To
Part 1

From

Part 3

Set pointer to
RS232_BASE
table (hex 400).

- - - - - - - {RS232 presence test

No (Internal
modem attached)

Set serial/parallel
adapter to
primary.

Move
RS23LBASE
table pointer to
next entry.

Turn on power to
adapter.

Write/read hex
AA and 55 to
work register at
hex 2FF.

Delay 100 ms.
To

Part 7
Write/read hex
AA and 55 to
work register at
hex 3FF.

- - - - - - - {Test for primary

To

Part 5
Figure 1-3 (Part 4 of 7). Printer/Communications Presence Test

Power-On Self-Test (POST) 1-15

No (Not attached)

Set RS232_BASE
table entry to hex
3F8.

Move
RS232_BASE
table pointer to
next entry.

Write/read hex
AAand55to
work register at
hex2FF.

- - - - - - - { Test for secondary

To

Part 6
Figure 1-3 (Part 5 of 7). Printer/Communications Presence Test

1-16 Power-OnSelf-Test(POST)

From
Part 5

No

Set RS232_BASE
table entry to hex
2F8.

Move
RS232_BASE
table pointer to
next entry.

Set equipment
word for number
of printer and
communications
ports installed.

Figure 1-3 (Part 6 of 7). Printer/Communications Presence Test

Power-On Self-Test (POST) 1-17

Yes (Attached)

Set RS232_BASE
table entry to hex
2F8.
Turn on power to
adapter at hex
2F8.
Move
RS23LBASE
table pointer to
next entry.
Delay 100 ms.

Set equipment
word for number
of printer and
communications
ports installed.

Write/read hex
AA and 55 to
work register at
hex 2FF.

Yes (serial/
parallel attached)

Turn off power to
adapter.

Delay 100 ms.

Figure 1-3 (Part 7 of 7). Printer/Communications Presence Test

1-18 Power-On Self-Test (POST)

Section 2. ROM BIOS Listing

ROM Map .................................. 2-4
Common Equates and Data Areas ................ 2-7
Common Equates .......................... 2-7
Processor Interrupt Vector Area ............. 2-16
POST and Bootstrap Temporary Stack ........ 2-16
BIOS Data Areas ......................... 2-17
POST Temporary Data Area ................ 2-23
Common Macros ......................... 2-24
Nonmaskable Interrupt Handler (B 10NMIH) ..... 2-26
First Level Interrupt Handler (NMLFLIH) .... 2-26
Diskette Resync (DSKT_RESYNC) .......... 2-29
Keyboard Data NMI (KBNMLDAT A) ....... 2-35
Keyboard Clear NMI (KYBD_CLR) .......... 2-37
Translate Scan Code (KYBD_XLT) .......... 2-38
Real-Time Clock NMI (RTCALARM_NMI) .. 2-44
Low Battery Check (LOW_BAT _CHK) ....... 2-47
Suspend NMI (SUSPEND) ................. 2-51
Resume (RESUME) ....................... 2-55
Keyboard Services (B11KYBD) ................ 2-65
Keyboard Interrupt Hex 16 (KYBD_IO) ....... 2-66
Levell Interrupt Hex 9 (KYBD_INT9) ....... 2-68
Video I/O and Print Screen (B 12VIDEO) ......... 2-77
Print Screen Interrupt Hex 05 (PRT_SCRN) .. 2-116
Diskette Support (B13DSKT) ................. 2-119
Diskette I/O Interrupt Hex 13 (DSKT_IO) .... 2-120
Bootstrap Loader Interrupt Hex 19
(SYS_BOOT) .......................... 2-139
Communications and Printer BIOS
(B14COMMO) ............................ 2-143
Communications Interrupt Hex 14
(COMMO_IO) ......................... 2-144
Printer Interrupt Hex 17 (PRT_IO) .......... 2-150
Time of Day (B15TOD) ...................... 2-153
Time of Day Interrupt Hex 1A (TOD_PROC) . 2-154
Timer 0 Interrupt 8 (TMRO_INT8) .......... 2-166
System Services (B 16SYSV) ................... 2-168

ROM BIOS 2-1

System Services Interrupt Hex 15
(SYS_SERVICES) ......................
System Profile Services (SYS_PROF) ........
External Event Services (EXT_EVENT) ......
System Power Off Services
(SYS_POWER.. DFF ....................
System Status Services (SYS_ST ATUS) ......
Modem Power Services
(SYS_MODEM_PWR) ..................
POST Interval Services (POST_INTV) .......
Wait Interval Services (WAIT _INTV) .......
Device Busy Services (DEV _BUSY) .........
Interrupt Complete Services
(INT_COMPLETE) .....................
General Subroutines and Tables (B 17TABLE) ....
Software Reset Routine ...................
System Descriptor Table ..................
Default System Profile ....................
Printer Configuration Table (PR T _TAB) .....
ASCII Conversion (STR....CON) ............
NMI Handler Entry Point Address
(NMLINT) ............................
Character Generator Graphics 128-255
(CHAR....GEN_HI) ......................
Convert AX to ASCII (DSP_BYTE) .........
Boot Strap Loader Entry Address
(BOOT_STRAP) .......................
Keyboard Noise (KB_NOISE) ..............
Communications Baud Rate Table
(BAUD_TABLE) .......................
RS-232 1/0 Entry Point (RS232_10) .........
Indicate POST Error (ERR....BEEP) ..........
Beep to Speaker (BEEP) ...................
Disable All Interrupts (DISABLE_NMI) ......
Enable Global NMls (ENABLE_NMI) .......
Get RTC Register (GET_RTC_REG) ........
Put RTC Register (PUT_RTC_REG) ........
Setup for Battery Savings
(BAT_SA V_SETUP) ....................
Keyoard 1/0 Entry Point (KEYBOARD_IO) ..
Keyboard Reset (KYBD_RESET) ...........
Set Data Segment (DDS) ..................

2-2 ROMBIOS

2-169
2-173
2-177
2-181
2-182
2-183
2-185
2-186
2-187
2-190
2-191
2-194
2-197
2-197
2-197
2-198
2-198
2-199
2-203
2-204
2-204
2-205
2-205
2-205
2-206
2-207
2-207
2-208
2-208
2-209
2-210
2-210
2-211

Calculate Absolute Vector Offset
(GET_VECTOR@) .....................
Keyboard Support Tables .................
System Setup (SYS_SETUP) ...............
Vector Setup (VECTOR-SETUP) ...........
Error Message Routine (SYS_CHK) .........
Resume Error Check (RES_ERR-CHK) ......
Diskette I/O Entry (DISKETTE_IO) .........
Icon and Error Message Routine (E_MSG) ....
Icon Display Routine (ICON_PR) ...........
Diskette Interrupt Entry (DSKT _INT) .......
Diskette Drive Parameters .................
Diskette Timing Parameters (DSKT _BASE) ..
Printer I/O Entry (PRINTER-IO) ...........
Video Parameters ........................
Video I/O Entry (VIDEO_IO) ..............
Video Parameters ........................
Memory Interrupt Hex 12
(MEMORY_SIZE_DET) .................
Equipment Interrupt Hex 11 (EQUIPMENT) .
Cassette I/O Entry (No BIOS Support) .......
Character Generator Graphics 0-127
(CHAR-GEN_LO) .....................
Time of Day Entry (TIME_OF_DAY) .......
Timer 0 Interrupt Handler (TIMER-INT) ....
BIOS Vector Table (VECTOR-TABLE) ......
Default Interrupt Services (D 11) ............
Hardware Power-on Reset Address ..........
Release Date Marker ........................
System Model Byte ..........................

2-211
2-212
2-214
2-215
2-219
2-220
2-221
2-221
2-225
2-229
2-229
2-229
2-230
2-230
2-231
2-231
2-232
2-232
2-233
2-233
2-237
2-237
2-237
2-238
2-240
2-241
2-241

ROMBIOS 2-3

ROM Map
Start Stop
Length Name
FOOOOH FFFFEH FFFFH ROMCODE
Address

Pub Ii cs by Name

FOOD: 4350
FOOD: OC72
FOOD: E229
FOOD: ElE6
FOOD: E729
FOOO:E75F
FOOD: E762
FOOD: E6F2
FOOD: F859
FOOD: EFE3
FOOD: E2C6
FOOD: FA6E
FOOD: 2030
FOOO:ODEE
FOOD:OCCF
FOOO:2B61
FOOD: 530A
FOOO:53DF
FOOO:2473
FOOD: FF23
FOOD: E85C
FOOD: E261
FOOD: E79B
FOOD: EC59
FOOD: 4C95
FOOD: 18AA
FOOD: EFC7
FOOD: E214
FOOD: EF57
FOOD: 4FBO
FOOD: 4C2B
FOOO:261F
FOOD: E6C6
FOOD: 1E9A
FOOD: 2304
FOOD: E6E7
FOOD: 22E2
FOOD: FF53
FOOD: E7A3
FOOD: F84D
FOOD: E73C
FOOD: 5A99
FOOD: EC5C
FOOD: El28
FOOD: 5D4F
FOOD: 4E6C
FOOD: 3809
FOOD: E7AA
FOOD: E864
FOOD: ED5F
FOOD: 570C
FOOD: E8E!
FOOD: E91B
FOOD: E955
FOOD: E95 F
FOOD: E969
FOOD: E976
FOOD: EA87
FOOD: E87E
FOOO:OO08
FOOD: E886

ACLDISP_PAGE
ADDR_TST
BAD_DSKT_I CON
BALSALSETUP
BAUD_TABLE
BEEP
BEEP_SUB
BOOLSTRAP
CASSETTLIO
CGIUBL
CHAR_GEN_H I
CHAR_GEN_LO
CHECK_FOR_8250
CHECLINT
CLR_STG
CMPLADAPLTEST
COMMO_IO
COM_POWER
CRLTEST
011
DDS
DEF_SYS_PROF
DISABLE_NMI
DISKETTLIO
DISLRESET
DMA_CHECK
DSKLBASE
DSKLICON
DSKLINT
DSKLINTE
DSKLIO
DSKLTST
DSP_BYTE
DSP _CONFIG
DSP_FSETM
DSP_HEX
DSP_INIT
DUMMLRETURN
ENABLLNMI
EQUIPMENT
ERR_BEEP
EXLEVENT
E-MSG
FLICON
FILL
GELPARM
GELRTLNMI
GELRTLREG
GELVECTOR@
ICON_PR
I NITIALI IE_STATUS
KID

Kll

Abs

K12
K13
K14
K15
K30
K6
K6L
K7

2-4 ROM BIOS

Address
FOOD
FOOD
FOOD
FOOD
FOOD
FOOD
FOOD
FOOD
FOOD
FOOD
FOOD
FOOD
FOOD
FOOD
FOOD
FOOD
FOOD
FOOD
FOOD
FOOD
FOOD
FOOD
FOOD
FOOD
FOOD
FOOD
FOOD
FOOD
FOOD
FOOD
FOOD
FOOD
FOOD
FOOD
FOOD
FOOD
FOOD
FOOD
FOOD
FOOD
FOOD
FOOD
FOOD
FOOD
FOOD
FOOD
FOOD
FOOD
FOOD
FOOD
FOOD
FOOD
FOOD
FOOD
FOOD
FOOD
FOOD
FOOD
FOOD
FOOD
FOOD

0008
0010
0014
ODIE
0020
002C
0043
03DB
0A46
OB40
OBDD
OC72
OCCF
ODOA
0015
OD5A
OD6F
ODEE
134C
18AA
1B49
1E9A
1F90
20EE
22E2
2304
2384
2473
2548
261F
2857
2966
29EA
2B1A
2B26
2B4B
2B61
2030
2070
2DCB
3174
3192
3809
38E2
3AC4
3040
3DA4
4110
415A
42AB
4332
4350
4381
439C
43C2
43E8
446B
44A7
44ED
4521
4554

Publics by Value
Abs
Abs
Abs
Abs
Abs

K6L
M4
KBFUNL
KBPADL
MIL
POSTMAIN
POSLLOOP
POSTCNTL
ME~TEST

ST"-TST
MEM_SIIE_CHK
ADDILTST
CLILSTG
ROM_CHECKSUM
ROM_SCAN
VAll D_ROMCHK
ROM_LINK
CHECLINT
TMILTST
DMA_CHECK
KYBD_TST
DSP _CONFIG
LCDBUF_TST
LCDCTLTST
DSP_INIT
DSP_FSETM
LCDINIT
CRLTEST
VIDEO_LINK
DSKLTST
PTR_COM_PRESENCE
MODEM_POWER_ON
MODE~CONFIG

SEND_C
RECLS
MODEM_INIT
CMPLADAPLTEST
CHECLFOR_8250
RS23LTEST
MODEM_TEST
SEND_COM
NMLFLIH
GELRTLNMI
PULRTLNMI
RESUME
KYBD_IO
KYBD_INT9
VIDEO_IO_1
SELMODE
SELCTYPE
SELCPOS
ACLDISP _PAGE
READ_CURSOR
SELCOLOR
VIDEO_STATE
SCROLLUP
SCROLL_DOWN
READ-ALCURRENT
WRITE-ALCURRENT
WRITE_LCURRENT
READ_DOT

FOOO:E88E
FOOO:E8C8
FOOO:0014
FOOO: EAC9
FOOO: EADD
FOOO:OOIE
FOOO:EAAB
FOOO: E987
FOOO: E6F5
FOOO: E82E
FOOO:3DA4
FOOO:3D40
FOOO: E831
FOOO: IB49
FOOO: IF90
FOOO:20EE
FOOO:2384
FOOO: EFFI
FOOO: EFFF
FOOO: F045
FOOO:0020
FOOO:OOlO
FOOO: FOE4
FOOO: FOEC
FOOO: FOF4
FOOO: F841
FOOO: E06B
FOOO:OBDD
FOOO:0A46
FOOO:29EA
FOOO: 2B4B
FOOO:2966
FOOO: 2DCB
FOOO: EFD5
FOOO: 4E3F
FOOO:3192
FOOO: E2C3
FOOO: EF62
FOOO: EF5A
FOOO: El8F
FOOO:03DB
FOOO:002C
FOOO:0043
FOOO: EFD2
FOOO: FF54
FOOO: 547A
FOOO:4B4F
FOOO: E26D
FOOO: E275
FOOO:2857
F{)00:38E2
FOOO: E7C8
FOOO: FFFO
FOOO:44A7
FOOO: 4381
FOOO:4554
FOOO:48C4
FOOO:2B26
FOOO:E05B
FOOO: 4FC6
FOOO:3AC4
FOOO: EB70
FOOO:6000
FOOO:ODOA
FOOO:OD6F
FOOO: E072
FoaO:OD15
FOOO: E739
FOOO:2D70
FOOO: 57BA
FOOO: E269
FOOO:4468
FOOO: 43E8
FOOO:4E7B

Abs
Abs

Abs
Abs

K8
K9
K8FUNL
K8FUN_TBL
KBNMLTBL
KBPADL
KBPAD_TBL
KILl NT
KILNOISE
KEYBOARD_IO
KYBD_INT9
KYBD_IO
KYBD_RESET
KYBD_TST
LCDBUF_TST
LCDCTL_TST
LCDINIT
LCD_CGA-TBL
LCD...MONO_TBL
Ml
MIL
M4
M5
M6
M7
MEMORLSIZLDET
MEM...MSG
MEM_SIZLCHK
MEM....TEST
MODEM_CON FIG
MODEM_INIT
MODEM....POWEILON
MODEM_TEST
MONO_TBL
NELOUTPUT
NMLFLIH
NMLINT
PARMS_TPIl35
PARMS_TPI48
PAILCHK
POSTCNTL
POSTMAIN
POSLLOOP
PRINTEILIO
PRINT~CREEN

PRLIO
PRT~CRN

PRLTAB
PRLTAILEND
PTILCOM....PRESENCE
PULRTLNMI
PULRTLREG
P_O_R
READ.JILCURRENT
READ_CURSOR
READ_DOT
READ.J.PEN
RECV~

RESET
RESULTS
RESUME
RES_ERILCHK
ROM_BASIC
ROM_CHECKSUM
ROM....LINK
ROM...MSG
ROUCAN
RS23LIO
RS23LTEST
RTCLTST
RTLS I Il-SAV E
SCROLLDOWN
SCROLLUP
SEEK

FOOO
FOOO
FOOO
FOOO
FOOO
FOOO
FOOO
FOOO
FOOO
FOOO
FOOO
FOOO
FOOO
FOOO
FOOO
FOOO
FOOO
FOOO
FOOO
FOOO
FOOO
FOOO
FOOO
FOOO
FOOO
FOOO
FOOO
FOOO
FOOO
FOOO
FOOO
FOOO
FOOO
FOOO
FOOO
FOOO
FOOO
FOOO
FOOO
FOOO
FOOO
FOOO
FOOO
FOOO
FOOO
FOOO
FOOO
FOOO
FOOO
FOOO
FOOO
FOOO
FOOO
FOOO
FOOO
FOOO
FOOO
FOOO
FOOO
FOOO
FOOO
FOOO
FOOO
FOOO
FOOO
FOOO
FOOO
FOOO
FOOO
FOOO
FOOO
FOOO
FOOO
FOOO

4565
4840
48C4
4B4F
4C2B
4C95
4E3F
4E6C
4E7B
4FBO
4FC6
51B6
530A
53DF
547A
5527
570C
5739
57BA
5864
58F7
5A99
5D4F
6000
E05B
E05B
E06B
E072
E128
E18F
EIBF
E214
E229
E257
E261
E269
E26D
E275
E275
E2C3
E2C6
E6C6
E6EO
E6E7
E6F2
E6F5
E729
E739
E73C
E75F
E762
E79B
E7A3
E7AA
E7C8
E7E6
E82E
E831
E85C
E864
E87E
E886
E88E
E8C8
E8El
E918
E955
E95F
E969
E976
E987
E98A
EAOC
EA87

WRITE_DOT
WRITLTTY
READ_LPEN
PRLSCRN
DSKLIO
DISILRESET
NELOUTPUT
GELPARM
SEEK
DSKLINTE
RESULTS
SYS_BOOT
COMMO_IO
COM....POWER
PRLIO
TOD_PROC
INITIALIZE~TATUS

SELTOD
RTCLTST
TMRO_INT8
SYS~ERVICES

EXLEVENT
FILL
ROM....BASIC
RESET
START
MEM...MSG
ROM...MSG
FLICON
PAILCHK
SYS_DSKLICON
DSKLICON
BAD_DSKT_I CON
SYS_DESCILTABLE
DEF_SYS_PROF
RTLSIIl-SAVE
PRLTAB
PRLTAILEND
STILCON
NMLINT
CHAILGEN_H I
DSP_BYTE
XLALNIB
DSP_HEX
BOOLSTRAP
KILNOISE
BAUD_TABLE
RS23LIO
ERILBEEP
BEEP
BEEP_SUB
DISABLLNMI
ENABLLNMI
GELRTLREG
PULRTLREG
BALSALSETUP
KEYBOARD_IO
KYBILRESET
DDS
GELVECTOR@
K6
K7
K8
K9
KI0
Kll
K12
KI3
K14
K15
KILl NT
SYS_SETUP
VECTOILSETUP
K30

ROM BIOS 2-5

FOOD
FOOD
FOOD
FOOD
FOOD
FOOD
FOOD
FOOD
FOOD
FOOD
FOOD
FOOD
FOOD
FOOD
FOOD
FOOD
FOOD
FOOD
FOOD
FOOD
FOOD
FOOD
FOOD
FOOD
FOOD
FOOD
FOOD
FOOD
FOOD
FOOD
FOOD
FOOD
FOOD
FOOD

2BIA
3174
439C
4332
42AB
415A
5739
E05B
OB40
E275
51B6
EB43
E257
ElBF
58F7
E98A
FEA5
FE6E
5864
134C
5527
OD5A
EAOC
FEF3
F065
4110
2548
FOA4
43C2
44ED
4521
4565
4840
E6EO

SEND_C
SEND_COM
SELCOlOR
SELCPOS
SELCTYPE
SET~ODE

SELTOD
START
STG_TST
STR_CON
SYS_BOOT
SYS_CHK
SYS_DESCR-TABlE
SYS_DSKLICON
SYS_SERVICES
SYS_SETUP
TIMER-INT
TIME_OF_DAY
TMRO_INT8
TMR_TST
TOD_PROC
VAll D_ROMCHK
VECTOR_SETUP
VECTOR-TABLE
VIDEO_IO
VIDEO_IO_l
VIDEO_LINK
VIDEO_PARMS
VIDEO_STATE
WRITLACCURRENT
WRI TE_CCURRENT
WRITE_DOT
WRITLTTY
XlALNIB

Program entry poi nt at FOOD: E05B

2-6 ROM BIOS

FOOD
FOOD
FOOD
FOOD
FOOD
FOOD
FOOD
FOOD
FOOD
FOOD
FOOD
FOOD
FOOD
FOOD
FOOD
FOOD
FOOD
FOOD
FOOD
FOOD
FOOD
FOOO
FOOD
FOOD
FOOD
FOOD
FOOD
FOOD
FOOD
FOOD
FOOD
FOOD
FOOD
FOOD

EAAB
EAC9
EADD
EB43
EB70
EC59
EC5C
ED5F
EF57
EF5A
EF62
EFC7
EFD2
EFD5
EFE3
EFFl
EFFF
F045
F065
FOA4
FOE4
FOEC
FOF4
F841
F84D
F859
FA6E
FE6E
FEA5
FEF3
FF23
FF53
FF54
FFFO

KBPAD_TBl
KBFUN_TBl
KBNMLTBl
SYS_CHK
RES_ERR-CHK
DISKETTLJO
E~SG

ICON_PR
DSKLINT
PARMS_TPI48
PARMS_TPI135
DSKLBASE
PRINTER-IO
MONO_TBl
CGA....TBl
lCD_CGA_TBl
lCD~ONO_ TBl
Ml
VIDEO_IO
VI DEO_PARMS
M5
M6
M7
MEMORY-SIZE_DET
EQUIPMENT
CASSETTE_IO
CHAR_GEN_lO
TIME_OF_DAY
TIMEILINT
VECTOR_TABLE
D11
DUMMY _RETURN
PRINLSCREEN
P_O_R

Common Equates and Data Areas
TITLE

COMMON EQUATES/ DATA AREAS
INCLUDE SROMEQUS. INC
; DATE LAST MODIFIED: 09(13(1985

; *******************************************************
;

GLOBAL

EQUATES

FOR

I/O

PORTS

; *******************************************************

Common Equates
D MAC 0 N T R 0 L L E R P 0 R T
DMA

• 0000

o

EQU

I N T ERR U P T

00; DMA CONTROLLER BASE ADDRESS

CON T R 0 L L E R - 20,21H

0020
0020
OOOB
OOOA

INTAOO
EOI
READ_ISR
READ_IRR

EQU
EQU
EQU
EQU

20H
20H
OBH
OAH

INTERRUPT CONTROLLER PORT 1
NON SPECI FIC END OF INTERRUPT
READ IN SERV REG AT INTAOO
READ INT REQ REG AT INTAOO

0021

INTA01

EQU

21H

IRPT CONTROLLER MASK REG

SYSTEM

TIMERS

- 40,42,43H

• 0040
• 0042

TIMERO
TIMER2

EQU
EQU

40H
42H

• 0043
0080
• 0030

TIMEILCTL EQU
TIMER2JTL EQU
TLATCH
EQU

43H
80H
30H

KEY BOA R D S CAN
0060

EQU
NMI

• 0061
0061
0080
• 0040
= 0020
• 0008
• 0004
0002
• 0001

CON T R 0 L
NMLCNTL
KB_CTL
CLR_KEYBD
DIS_COPROC
DIS_IOCHK
DISJ.LARM
EN_SPKR
SPKR_DATA
TMRLGATE

EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU

TIMER 0 COUNTER PORT AD DR
TIMER 2 COUNTER PORT AD DR
TIMER 0,2 CONTROL PORT ADDR
ACCESS TIMER2 CONTROLS
LATCH TMR VAL R/W LEAST, 1ST

COD E P 0 R T - 60H
60H

P 0 RT
61H
61H
80H
40H
20H
08H
04H
02H
01H

; MAIN KEYBOARD SCAN CODE PORT
- 61H
NMI CONTROL PORT
PORT 60H CONTROL REGISTER
CLEAR KEYBOARD SIGNAL
DISABLE COPROCESSOR NMI
DISABLE I/O CHANNEL CHECK
DISABLE RTC ALARM NMI
ENABLE SPEAKER
(NOT AN
SPEAKER DATA LINE (NOT AN
GATE TIMER 2
(NOT AN

NMI
NMI)
NMI)
NMI)

ROM BIOS 2-7

- -- -- - - - - - - - - - - -- -- -- -- - - -- -- --- ---- - ----

;NMI

SOURCE

= 0062

NMLSRC
DSKLNMI
IOCHICNMI
TIMER2_SN
KBCLILNMI
SYS_SUSP _NMI
RTC.J\LRM_NMI
KBDATA_NMI

= 0080

= 0040
= 0020
= 0010
= 0008

= 0004
= 0001

REG

- 62H

EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU

NMI SOURCE PORT ADDRESS
DISKETTE NMI
I/O CHANNEL CHECK NMI
TMR 2 SNE (NOT AN NMI SOURCE)
KYBD PORT 60 AVAILABLE NMI
SYSTEM SUSPEND NMI
REAL TIME CLOCK ALARM NMI
KEYBOARD DATA READY NMI

62H
80H
40H
20H
10H
08H
04H
01H

- -- - -- -- - - - - - - - -- - - - - - -- - - - - - - - - - - - -- - --; SYSTEM CLOCK CONTROL REGISTER
= 0072
= 0020

CLOCICCTL
GLOBAL_NMI
DISABLE_SLEEP
CLOCICRUN
CLOCK_STOP

= 0004
= 0003
= 0000

EQU
EQU
EQU
EQU
EQU

- 72H
72H
20H
04H
03H

o

-- - - --- - - ------- - - - - -- -- - - -- ---- - -- - -

;LCD

CONTROLLER

-

INDEX

= 0074

LCD_INDX

EQU

74H

= 0000

LCD_FUNCT
LCD_WRAP

EQU
EQU

00
01

= 0001

SLEEP CLOCK CONTROL REGISTER
GLOBAL NMI ENABLE
DISABLE SLEEP CLOCK BIT
SLEEP CLOCK RUN STATE
CLOCK STOP VALUE
---

- ---- ---

- 74H

INDEX REG FOR ACCESING LCDC
; REGS
; LCDC FUNCT CONTROL REGISTER
; LCDC DIAG CONTROL REGISTER

--

- --- -- -- ----- ----- -- -- --- -- ---- -- --- -- - - - - - - - - - - - - - --

- - -- - - - -- - - - - -- - - - - - - - - - - - - - - - - - - - - - - - - -;LCD CONTROLLER OATA
- 75H
=

0075

=

0001

LCD_DATA

EQU

75H

DATA REG FOR WRITING TO LCDC
REGS

ON = TWO PANEL LCD
OFF = ONE PANEL LCD
ON = LCD EMULATING CGA
OFF = LCD EMULATING MONO
ON = LCD IN NORMAL MODE
OFF = LCD IN DIAGNOSTIC MODE
ON = LCD ADDR DECODE ENABLED
OFF = LCD DISABLED
ON = ACCESS LCD FONT STORAGE
OFF = ACCESS REGEN BUFFER
ON = ENABLE SYNCS
OFF = DISABLE SYNCS
ON = LCD PANEL POWER ENABLED
OFF = LCD PANEL PWR DISABLE
ON = TWO PANEL LCD SENSED BY
HRDWARE

LCD_2PAN

EQU

OIH

= 0002

LCD_CGA

EQU

02H

= 0004

LCD_NORM

EQU

04H

= 0008

LCD_ENAB

EQU

08H

= 0010

LCD_FONT

EQU

10H

= 0020

SYNCENABLE

EQU

20H

= 0040

PANEL_ENABLE

EQU

40H

= 0080

LCD_SENSP

EQU

80H

- - -- - - - - - - -- - - - - - -- - - - - -- - - - -- - - - - - - -- - - -- -- -- - - - - -= OOll
=

0080

; DISKETTE CONTROL PORT
-- - - - - -- - -- - -- - - - - - - - - - - - -- - - - - - - - - - - - - - - - - - - --DSKT POWER CONTROL REGISTER
DSKLCNTL
llH
EQU
DSKLNMI
80H
ENABLE DSKT NMI POWER ON REQ
EQU

-- --

= 0040

FDCPWR

EQU

40H

DSKT CONTROLLER POWER ENABLE

= 0020

DSKLDEGATE

EQU

20H

DSKT DRIVE DEGATE FROM CNTLR

= 0010

RD_CNTL
10H
; READ CONTROLLER REGISTER
EQU
;* THIS BIT OFF ALLOWS READING THE DRIVE TRK POSTN FROM DSKLCNTL REG

= 0008

DRO_TRICS EL
; READ DRIVE 0 TRACK POSITION
08H
EQU
;* THIS BIT OFF ALLOWS READING THE DRIVE I TRACK POSITION

= 0002

2-8 ROM BIOS

CNTLSEL

EQU

02H

; BIT MUST ALWAYS BE ON FOR
; ANY WRITE TO THIS I/O PORT

- -- -- - - - --- ---- - - - - - -- --- -- - - -- - -- -- -- -- - - -- - - - --;PORTABLE

PRINTER

PORTS

= 0078

CPRLDATA

EQU

78H

PORTABLE PTR XMIT PORT ADDR

= 0079
= 0080
= 0008

CPRLSTAT
NOLBUSY
NOLERROR

EQU
EQU
EQU

79H
80H
08H

PORTABLE PTR STAT PORT AD DR
NOT BUSY BIT IN STATUS PORT
NOT ERROR BIT IN STATUS PORT

= 007A

CPRLMODE
ACK
SELECT
NO_INIT
STROBE

EQU
EQU
EQU
EQU
EQU

7AH
40H
08H
04H
01H

PORTABLE PTR MODE PORT ADDR
ACKNOWLEDGE BIT (NOT USED)
SLCT BIT IN MD PRT (NOT USED)
INITIALIZE BIT IN MODE PORT
STRB BIT IN MD PRT (NOT USED)

= 0040
= 0008

= 0004
= 0001

----- ------ - -- - - - - - - - - -- - - - - - -- - - - - - - - - - - - - - - -- --

& F EAT U R E C N T L - 7CH

; KEY BOA R 0

= 007C
= 0080

KYBD_CNTL
ENJYBD_NMI
KYBD-ATTACH
SELKYBD_DIAG
ACLRS232
ACLMODEM
SELRS23LPRIM

= 0040
= 0020

= 0004

= 0002
= 0001

7CH
80H
40H
20H
04H
02H
01H

EQU
EQU
EQU
EQU
EQU
EQU
EQU

KYBD AND FEAT CONTROL ADDR
ENABLE KEYBOARD NMI
KEYBOARD ATTACHED SENSE
ACT KYBD DIAGNOSTI C MODE
ACT RS232 FEATURE POWER
ACTIVATE MODEM FEATURE POWER
SET RS232 FEAT TO PRI ADDR.

------ - -- - - - -- -- - - - -- - -- - - - - - - - - --- - - - - - - -; POW E R

= 007F
= 0080
= 0040
= 0020
= 0010
= 0008
= 0004
= 0002
= 0001

I N T E R F ACE

PWILSTAT
LOW_BAT
EXLPWR
SYS_POR
PON-ALRM
HDWR_RESET
EN_SUS_NMI
REQ_POFF
EN_PON-ALRM

EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU

REG - 7 FH
7FH
80H
40H
20H
10H
08H
04H
02H
01H

POWER INTERFACE PORT ADDRESS
LOW BATTERY STATUS FLAG
EXTERNAL POWER SUPPLI ED
SYSTEM POR REQSTD (AL T CTL R)
POWER ACTIVATED BY RTC ALARM
CAUSE POWER-ON-RESET
ENABLE SYSTEM SUSPEND NMI
REQUEST SYSTEM POWER OFF
ENABLE POWER ON BY RTC ALARM

----- --------- ------------------ -- -- - - - - - --

;DMA
= 0083

PAGE

REGISTERS

DMILPAGEl
DMA_PAGE2
DMA_PAGE3

= 0081
= 0082

EQU
EQU
EQU

83H
81H
82H

; DMA PAGE REGISTER CHANNEL 1
; DMA PAGE REGISTER CHNL 2 (DSKT)
; DMA PAGE REGISTER CHANNEL 3

------------------- - -- - - - - - - - - - - - - - - - - - - - -;MANUFACTURING
=
=
=
=
=

00A1
00A2
00A3
0080
0001

MFG_CHKPT
MFG_ERILHI
MFG_ERILLO
MEM_CTL

PORTS

EQU
EQU
EQU
EQU
EQU

MEM_SUB~ODE

OA1H
OA2H
OA3H
80H
OIH

MFG CHECKPOINT PORT
MFG ERROR CODE PORT HIGH
MFG ERROR CODE PORT LOW
MEMORY DECODE CONTROL PORT
BIT SET IN MEMJTL FOR SPECIAL
MEM SUBSTITUTE OF LCD DISPLAY
RAM FOR MAIN MEM FOR MFG MODE

, ---- -------------------------- - -- - -- - - - - - - - -; I I 0

= OOAO
= 0080

= 0007

C H K

- 8 0 8 7

IONMLCNTL
EN_IOCHK
INLLEVEL

CON T R 0 L - AOH

EQU
EQU
EQU

OAOH
80H
07H

1/0 CHAN CHK NMI ENABIDISAB
; ENABLE 8087 AND 10 CHECK NMI
; MASK FOR CURRENT IRPT LVL SNE

ROM BIOS 2-9

, ----------------------------------------------------;DISPLAY
= 0308
= 03B8

ADAPTER

CGA....CNTL
MONO_CNTL

EQU
EQU

CONTROL
03D8H
03B8H

REGS

; COLOR GRAPHICS CONTROL PORT
; MONO DISPLAY CONTROL PORT

-- --- -- - - - - - - - -- - - - - - - - - - - - -- - - -- - -- -- -- - - - - - - - -- - - -;FLOPPY

DISKETTE

CONTROL

REGS

DRIVE MOTOR, SELECT CONTROL PORT
=

03F2

= 0020
= DOlO
= 0008
= 0004

= 0001
= 0000

FLOPPY DISKETTE DRIVE CONTROL
*****WRITE ONLY REGISTER*****
DRLMOTOR
EQU
20H
DRIVE I MOTOR ENABLE
DRO_MOTOR
EQU
10H
DRIVE 0 MOTOR ENABLE
FDCDMA_ENAB
EQU
08H
ENABLE FDC DMA AND INTERRUPTS
FDCRUN
EQU
04H
; DISKETTE CONTROLLER RUN BIT
IF THE ABOVE BIT IS OFF THE DISKETTE CONTROLLER IS RESET
DRLSELECT
ORO_SELECT

EQU

03F2H

EQU
EQU

OIH
ODH

; DRIVE I SELECT
; DRIVE 0 SELECT

DISKETTE CONTROLLER MAIN STATUS REGISTER
= 03F4

FDCSTATUS

EQU

03F4H

= 0080
= 0040
= 0010

REQJ1ASTER
DATA_READY
FDCBUSY

EQU
EQU
EQU

080H
040H
OIOH

DSKT CONTROLLER MASTER STATUS
*** READ ONLY REGISTER *****
REQUEST FOR MASTER
DATA RDY TO BE RD FROM CNTLR
CONTROLLER IS BUSY

DISKETTE CONTROLLER DATA INPUT jOUTPUT REGISTER
03F5

EQU

03F5H

; DISKETTE CONTROLLER DATA PORT

DRIVE MOTOR, SELECT TRACK 0 SENSE PORT

= 03F7

DRIVE-SENSE

EQU

03F7H

= 0080

CHG_LlNE
DRO_SEL_SENSE
DRLSEL_SENSE
DRO_MOLSENSE
DRLMOLSENSE
TRACKO_SENSE

EQU
EQU
EQU
EQU
EQU
EQU

080H
040H
020H
OIOH
008H
OOIH

= 0040

= 0020
= DOlO
= 0008
= 0001

DSKT DRIVE CONTROL LlNE SENSE
***** READ ONLY REGISTER *****
MEDIA CHNG LlNE ACTIVE SENSE
DRIVE 0 SELECTED SENSE BACK
DRIVE I SELECTED SENSE BACK
DRIVE 0 MOTOR ON SENSE BACK
DRIVE I MOTOR ON SENSE BACK
TRACK 0 IND FOR SLCTD DRIVE

COMMANDS SENT TO DISKETTE CONTROLLER BY BIOS

= 0008
= 0003
= 0007

= OOOF

= 00E6
= 00C5

= 0040

READ_INLSTATUS
SPECI FY
RECAll BRATE
SEEICCMD
READ_CMND
WRlTEJMND
FORMALCMND

EQU
EQU
EQU
EQU
EQU
EQU
EQU

08H
03H
07H
OFH
OE6H
OC5H
04DH

READ INTERRUPT STATUS COMMAND
SPECI FY COMMAND
RECAll BRATE DRIVE COMMAND
SEEK DRIVE COMMAND
READ COMMAND
WRITE COMMAND
FORMAT COMMAND

46H
4AH
42H

SETUP DMA FOR DISKETTE READ
SETUP DMA FOR DISKETTE WRITE
SETUP DMA FOR NO XFER (VRFY)

DMA SETUP COMMANDS FOR DISKETTE

= 0046
= 004A
= 0042

DMA_READ
DMA_WRITE
DMA_VERI FY

2-10 ROM BIOS

EQU
EQU
EQU

*********************************************************************
GLOBAL

EQUATES

FOR

REAL

TIME

CLOCK

*********************************************************************
RTC REGISTER INDEX PORT

= 0070

RTCILPORT

EQU

070H

REAL TIME CLOCK IX REG PORT

OllH

REAL TIME ClK DATA REG PORT

RTC REGISTER DATA PORT

= OOll

EQU

RTC TIME,DATE, AND ALARM REGISTERS
= 0000

= 0001
= 0002
= 0003
= 0004
= 0005
= 0006
= 0007
= 0008
= 0009

RTCTSEC
RTCASEC
RTCTMIN
RTLJ\MIN
RTCTHRS
RTCAHRS
RTCWDAY
RTCMOAY
RTCMON
RTCYEAR

EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU

o

EQU
EQU

10
080H

TIME SECONDS REG ADDR
ALARM SECONDS REG ADDR
TIME MINUTES REG ADOR
ALARM MINUTES REG ADDR
TIME HOURS REG ADDR
ALARM HOURS REG AD DR
DAY OF WEEK (SUNDAY
1)
DAY OF MONTH
MONTH
YEAR

1
2
3
4

5
6

7
8
9

RTC STATUS REGISTER
OOOA
0080

RTCUP_STAT
RTCUIP

; CLOCK UPDATE STATUS REG AD DR
; UPDATE IN PROGRESS BIT

RTC INTERRUPT AND MODE SET REGISTER
= OOOB
= 0080
0040
0020
0010
0004
0002
0001

RTCMODE
SELClOCK
PI E_ENABlE
AI E_ENABlE
UI E_ENABlE
SELBIN
SEL24HR
SELDAYLIGHT

EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU

11
080H
040H
020H
OIOH
004H
002H
OOIH

MODE REG ADDR
SET CLOCK BIT
PERIODIC INTERRUPT ENABLE
ALARM INTERRUPT ENABLE
UPDATE ENDED IRPT ENABLE
SET BINARY MODE
SET 24 HOUR MODE
SET DAYLIGHT SAVINGS MODE

RTC INTERRUPT STATUS REGISTER

= OOOC
= 0080
= 0040

0020

= 0010

RTCINLSTAT
RTCIRQ
PLINT
Al_INT
UE_INT

EQU
EQU
EQU
EQU
EQU

12
080H
040H
020H
OIOH

INTERRUPT STATUS REG AODR
INTERRUPT REQUEST SET
PERIODIC REQUEST
ALARM REQUEST
UPDATE ENDED REQUEST

RTC CONDITION STATUS REGISTER

= 0000
= 0080

RTCCOND_STAT
VALID_TIME

EQU
EQU

13

OBOH

RTC CONDITION STATUS
RTC HAS NOT lOST POWER

RTC DIAG_STATUS FLAGS ---

= OOOE
= 0080
= 0040
= 0020
= 0010
= 0008
= 0004
= 0002

= 0001

RTCDIAG_STAT
RTCTIMLBAD
BAD_RTCS I G
BAD_STOR_CKSUM
lCD...Al LFAlLED
lCD_CHANGE
RTCJAI lED

EQU
EQU
EQU
EQU
EQU
EQU
EQU

14
080H
040H
020H
OlOH
08H
04H

LCO_NOT...ACTIVE
DSKT...ACTIVE

EQU
EQU

02H
OIH

DIAG STATUS BYTE IN RTC RAM
STANDBY POWER lOST FLAG
REAL TIME ClK SIGNATURE BAD
BASE 12BK STG CHECKSUM BAD
LCD ALT DISPLAY MODE FAilED
LCD CONFIGURATION CHANGED
REAL TIME ClK DID NOT UPDATE
OR VALUES OUT OF LIMITS
LCD NOT ACT WHEN SUSPENDED
DSKT WAS ACT AT SUSPEND TIME

ROM BIOS 2-11

---- BEGINNING OF RTC CMOS DATA AREA ---REGISTERS FROM HERE TO RTCJlEM....END ARE KEPT CHECKSUMMED
= OOOF

RTCMEM....START

EQU

15

; START OF RTC REGISTER STACK

DISKETTE TYPE INDENTIFIER --- UPPER 4 BITS
= 0010
= 0011

= 0000
= 0001

= 0002
= 0003

RTCDSKLCON
RTCDSKLCON2
NO_DRIVE
TPL48
TPL96
TPL135

EQU
EQU
EQU
EQU
EQU
EQU

16
17
0
1
2
3

= DRV

0, LOWER

= DRV

DSKT CONFIG INFO (0 & 1)
DSKT CONFIG INFO (2 & 3)
48 TRACK PER INCH DRIVE
96 TRACK PER INCH DRIVE
135 TRACK PER INCH DRIVE

SYSTEM EQUIPMENT WORD (COPY OF EQUIPMENLWORD IN DATA SEGMENT)
= 0013
= 0014

RTCEQU I P_LO
RTCEQU I P_H I

EQU
EQU

19
20

; SYSTEM EQUIPMENT FLAG (LOW)
; SYSTEM EQUIPMENT FLAG (HI)

- 15-14 - 13 - 12 - 11-9 - 8 - 7-6 - 5-4 - 3-1 - 0 -

I

I
IPL DSKT INSTALLED
-- UNUSED
INITIAL VIDEO MODE
NUMBER OF DISKETTE DRIVES
I
-- UNUSED
-- NUMBER OF COM DEVICES
-- JOYSTICK ATTACHED
INTERNAL MODEM INSTALLED
NUMBER OF PRINTERS ATTACHED
SYSTEM MEMORY SIZE

= 0015
= 0016

RTCMEMS_LO
RTC....MEMS_HI

EQU
EQU

10 MEMORY SIZE LO BYTE (POST)
10 MEMORY SIZE HI BYTE (POST)

21
22

SYSTEM PROFILE INFORMATION
SYS_PROF1

I 15 I 14 I 13-12 I 11-10 I 9

I 8 I

7 - 0

I

.

-- UNUSED
RS232/PARL AVAIL ON 8ATTERY
-- MODEM AVAILABLE ON BATTERY
-- LCD HIGH INTENSITY MAPPING
- INITIAL VIDEO MODE
ENABLE LOW BATTERY WARNING
SYSTEM WARM START SELECTED

= 0017

RTC_SYS_PROFl
RESUME_ENABLE
LOWBALENABLE
MODEM_BATT
RS23LBATT

EQU
EQU
EQU
EQU
EQU

23
80H
40H
02
01

= 0019

RTCSYS_PROF2
RTCLCD_INACT

EQU
EQU

24
25

= 001B

RTCSYS_INACT

EQU

27

= 0080

= 0040
= 0002
= 0001
= 0018

2-12 ROM BIOS

SYSTEM PROFI LE BYTE 1
SYSTEM RESUME ENABLE FLAG
LOW BAT WARNING ENABLE FLAG
MODEM AVAILABLE ON BATTERY
RS232/PARALLEL AVAILABLE ON
BATTERY
SYSTEM PROFILE BYTE 2
INACT TIME TO DISPLAY BLANK
(2 BYTES)
INACT TIME TO SYS POWER OFF
(2 BYTES)

--- MODEM

PROFILE INFORMATION
MOD_PROFl

I 15-14 I 13 112-10 19-8 I

I 7 - 0
I
-- UNUSED

-- DATA RATE
PARITY / FRAMING
ANSWER, 1 = AUTO ANSWER

o = MANUAL
= 001D
= 001E

RESERVED
RTCMOD_PROFl
RTCMOD_PROF2

EQU
EQU

29
30

; MODEM SETUP PROFILE BYTE
; MODEM SETUP PROFILE BYTE

FEATURE DEVICE CONFIGURATION INFORMATION

= 001F
=
=
=
=
=

0080
0040
0020
0010
0008

RTCFEALCON
SERPLL_INST
I NTMOD_I NST
MODILINST
PRLINST
CMPLPP_OK

EQU
EQU
EQU
EQU
EQU
EQU

31
80H
40H
20H
lOH
08H

FEATURE CONFIGURATION REG @
SERIAL PARAL CARD INSTALLED
INTERNAL MODEM INSTALLED
1200BPS MODEM INSTALLED
SER CARD INSTALLED AS PMRY
COMPACT PTR PORT PASSED TEST

LCD/CRT ADAPTER CONFIGURATION INFORMATION
= 0020
= 0080
= 0010
= 0008
= 0004
= 0002
= 0001
= 0021

RTCDSP_CON
DSP _LCD_PRES
DSP_VIDEO_ROM

DSP_CLCD

EQU
EQU
EQU
EQU
EQU
EQU
EQU

32
BOH
10H
OBH
04H
02H
OIH

DISPLAY CONFIGURATION REG @
ON = LCD PANEL IS PRESENT
ON = FEAT VIDEO ROM SENSED
ON = MONOCHROME ADAPT PRESENT
ON = CGA ADAPTER PRESENT
ON = LCD CONFIGED AS MONO ADA
ON = LCD CONFIGED AS CGA ADA

RTCSYS_STAT

EQU

33

SYSTEM POWER ON STATUS

DSP~ONO

DSP_CGA
DSP~LCD

FOR EQUATES SEE DEFINITION OF PWR_STAT REGISTER 7FH
LCD/CRT ADAPTER STATUS INFO
= 0022

= 0080
= 0004
= 0002
= 0001

RTCDSP _STAT
DIAli-FORCE3US

EQU
EQU

34
BOH

MONO_BAD
CGA-BAD
LCD_BAD

EQU
EQU
EQU

04H
02H
01H

DISPLAY STATUS REGISTER
USED TO FORCE RESUME W/O LCD
(DSP~LCD & DSP_CLCD = 0)
MONO ADAPT PRESENT, BUT BAD
CGA PRESENT, BUT BAD
LCD WAS CONFIG, BUT BAD

LOW BYTE OF BASE STGE CHECKSUM
HI BYTE OF BASE STG CHECKSUM

BASE 128K STORAGE CHECKSUM
= 0023

RTCBME~CKSL

0024

RTCBME~CKSH

EQU
EQU

35
36

RTC~E~END

EQU

36

=

= 0024

; END OF RTC

RTC MEMORY GOOD SIGNATURE AREA (MUST BE "RTCG" FOR VALID RTC
= 002E

RTC31GNATURE

EQU

46

46-49 VAL RTC SIGNATURE AREA

= 0032

RTCCENTURY

EQU

50

RTC CENTURY BYTE SAVE AREA

ROM BIOS 2-13

********************************************************
GLOBAL

EQUATES

FOR

BIOS/POST

********************************************************
SPECIAL KEY EQUATES

=
=
=
=

0045
0046
0038
0010
003A
002A
0036
0052
0053
OOOF
0054
0004
0052
003B
OOED

NUM_KEY
SCROLL_KEY
AL LKEY
CTL_KEY
CAPS_KEY
LEFLKEY
RIGHLKEY
INS_KEY
DEL_KEY
TAB_KEY
SYSREQJ1AKE
SYSREQ_BREAK
FN_KEY
FLKEY
HIDN_CODE_EO

EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU

69
70
56
29
58
42
54
82
83
15
054H
OD4H
052H
59
OEDH

PCl SCAN CODE FOR NUM LOCK
PCl SCAN CODE FOR SCL LK KEY
PCl SCAN CODE FOR AL T SFT KEY
PCl SCAN CODE FOR CNTL KEY
PCl SCAN CODE FOR SHI FT LOCK
PCl SCAN CODE FOR LEFT SHI FT
PCl SCAN CODE FOR RGHT SHI FT
PCl SCAN CODE FOR INSERT KEY
PCl SCAN CODE FOR DELETE KEY
PCl SCAN CODE FOR TAB KEY
PCl SCAN CODE SYS_REQ (MAKE)
PCl SCAN CODE SYS_REQ (BRK)
NMI SCAN CODE FOR FN KEY
PC1 SCAN CODE FOR F1 KEY
HIDDEN CODE SEQUENCE 10

------------ - -- - - - -- - - - - - - - - - - - - -- - - - - - - - - - - - - - - - - - -KEYBOARD EQUATES USED IN KEYBOARD SUPPORT TABLES

------------ -- ----------- -- - - - - - - - - - - - - - - - - - - -- - - - - -0000
0001
0002
0003
0004
0005
0006
0007
0009
OOOA
OOOB
OOOC
OOOE
OOOF
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
001A
001C
OOlD
001E
001F
0020
= 007F

=
=
=
=

CTL + KEYPAD KEYS TO GIVE ASCII CONTROL CODES
(EXCEPT NUL)
NUL
000
EQU
SOH
001
EQU
STX
002
EQU
ETX
003
EQU
EOT
004
EQU
005
ENQ
EQU
ACK006
006
EQU
BEL
007
EQU
HT
009
EQU
LF
010
EQU
VT
011
EQU
FF
012
EQU
CR
013
EQU
SO
014
EQU
SI015
015
EQU
OLE
016
EQU
DCl
017
EQU
DC2
018
EQU
DC3
019
EQU
DC4
020
EQU
NAK
021
EQU
SYN
022
EQU
ETB
023
EQU
CAN
024
EQU
EM
025
EQU
SUB
026
EQU
ESC
027
EQU
FS
028
EQU
GS
029
EQU
RS
030
EQU
US
031
EQU
ENTER
EQU
032
DEL
127
EQU

2-14 ROM BIOS

KEYPAD BASE PC1 SCAN CODES

= 0047

HOMLKEY
CUR_UP
PGUP
KYPD.-MINUS
CUR_LFT
CUR_RHT
KYPD_PLUS
END_KEY
CUILDN
PGDN
INS_KEY
DEL_KEY

= 0048

0049
= 004A
= 004B
= 0040
= 004E
= 004F
= 0050
= 0051

=

71
72

EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU

73
74
75

n

78
79
80
81
82
83

CTL + BASE KEYPAD KEYS

= oon

CTL_HOME
CTL_PGUP
CTL_CUR_L FT
CTL_CUILRHT
CTL_END
CTL_PGDN

= 0084
= 0073
= 0074
= 0075
= 0076

EXTENDED ASCI I CODE

EQU
EQU
EQU
EQU
EQU
EQU

119
132
115
116
117
118

ASCI I CODES

= 001B

ESC
BKSPC
TAB
ENTER
APOSTR
SPACE
PSEUDO

= 0008
= 0009

= 0000
= 0027
= 0020
= 0000

EQU
EQU
EQU
EQU
EQU
EQU
EQU

1BH
08H
09H
ODH
27H
20H
OOH

; BUILD PSEUDO SCAN CODES

; --iiios -i (a -ROUTi NE -i NT ERRUPT -ASS i GNMENTS ----;

= 0005
= 0010
= 0013

= 0014

= 0015
= 0016
= 0017
= 0019
= OOIA

-- -- -- - - - - - - - - - - - - - - - - - - - - - - -- - - - - - - - - - - - - - -PRTSCFN
VIDEO_FN
DSKLFN
RS23LFN
SYSSERVJN
KEYBDJN
PRINTER_FN
BOOLFN
TOLFN

EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU

05
10H
13H
14H
ISH
16H
17H
19H
1AH

PRINT SCREEN FUNCTION CALL
VIDEO I/O
DISKETTE
COMMUNICATIONS
SYSTEM SERVICES
KEYBOARD
PRINTER
SYSTEM BOOT STRAP
TIME OF DAY

EQUATES FOR ERRORS IN RETURN CODE OF POST ROUTINES

= 0020
= 0010
= 0008
= 0004

FATALERROR
NONJATALERR
POST.-MSG
RLDISPATCH
NONJ ATAL_NW
DISPLALERR

EQU
EQU
EQU
EQU
EQU
EQU

80H
40H
20H
10H
08H
04H

FATAL ERROR (POSLSTATUS)
NON FATAL ERR (POSLSTATUS)
ERR MSG PO I NTED TO BY ES: DX
RE-DSPTCH LST RTN AFTER STAT
NON FATAL BUT NOT WARMSTART
ERROR COMES FROM DSPL Y TEST

GENERAL DELAY LOOP COUNTS USING LOOP $ WITH INTERRUPTS DISABLED
= 0102

= 006B

MS_DELAY
DELAL415US

EQU
EQU

258
107

; 1 MILLISECOND DELAY COUNT
; 415 USEe DLY COUNT FOR COMMO

ROM BIOS 2-15

INCLUDE SROMDATA. INC

Processor Interrupt Vector Area
8088 INTERRUPT LOCATIONS
0000
0000
0008
0008
0014
0014
0020
0020
0020
0024
0024
0040
0040
0070
0070
0074
0074
0060
0060
0078
0078
007C
007C
0110
0110
0128
0128
01BO
01BO
0400
0400
0400
0600
0600
7COO
7COO
7COO

ABSO
SEGMENT AT 0
STG_LOCO
LABEL
ORG
2*4
NMLPTR
LABEL
ORG
5*4
INT5_PTR
LABEL
ORG
8*4
INLADDR
LABEL
INLPTR
LABEL
ORG
9*4
INTLPTR
LABEL
ORG
10H*4
VIDEO_INT
LABEL
ORG
lCH*4
WORD
ONECH
LABEL
ORG
lDH*4
PARM-PTR
LABEL
ORG
IBH*4
LABEL
BASICPTR
ORG
01EH*4
DISK-POINTER
LABEL
ORG
01FH*4
EXLPTR
LABEL
ORG
044H*4
LABEL
CSELPTR
ORG
04AH*4
RTCA_PTR
LABEL
ORG
06CH*4
RESUME_PTR
LABEL
ORG
400H
DATA--AREA
LABEL
DATA_WORD
LABEL
ORG
0600H
MFG_TESLRTN
LABEL
ORG
7COOH
LABEL
BOOLLOCN
ABSO
ENDS

BYTE
WORD
WORD

PRT SCREEN INTERRUPT VECTOR

WORD
aWORD
WORD

KEYBOARD INTERRUPT VECTOR

WORD

VIDEO I/O INTERRUPT VECTOR
USER TIMER VECTOR

DWORD

POINTER TO VIDEO PARMS

WORD

ENTRY FOR RESIDENT BASIC

DWORD
DWORD

LOCATION OF POINTER
PO I NTER TO EXT ENS I ON

DWORD

PTR TO LOWER 128 CHAR SET

DWORD

PTR TO USER RTC ALARM VECTOR

DWORD

PTR TO PROGRAM RESUME VECTOR

BYTE
WORD

; ABS LOCATION OF DATA SEGMENT

FAR
FAR

POST and Bootstrap Temporary Stack
--- - -- - - - - - - - - - - - - - - - - -- - - - - - -- - -- - - - -- - - - - - --~

; STACK -- USED DURING INITIALIZATION ONLY
0000
0000

STACK
OW

7F [

SEGMENT AT 30H
127 DUP(?)

????

OOFE
OOFE

TOP _OF_STACK
STACK
ENDS

2-16 ROM BIOS

LABEL

WORD

BIOS Data Areas
-- -- - - -- - - - -- - - - - - - -- - - - - - - - - - - - - - - - - - -;

ROM BIOS DATA AREAS

0000

SEGMENT AT 40H

DATA

0000

04 [

RS23LBASE

DW

4 DUP(?)

ADDR RS232 ADA (COM1-COM4)

PRINTEILBASE

ow

4 DUP(?)

AD DR PRINTERS (LPTl-LPT3)

????

0008

04 [

????

EQUIPMENT
0010

WORD
OW

????

; INSTALLED HARDWARE

I 15-14 I 13 I 12 I 11-9 I 8 I 7-6 I 5-4 I 3-1 I 0 I
I

I
IPL DSKT INSTALLED
-- UNUSED
INITIAL VIDEO MODE
NUMBER OF DISKETTE DRIVES
UNUSED
NUMBER OF COM DEVICES
-- JOYSTICK ATTACHED
INTERNAL MODEM INSTALLED
NUMBER OF PRINTERS ATTACHED
POST
0012

??

0080
0040
0020

= 0010
= 0002
= 0001

STATUS

DB

FATAL_ERROR
NON-FATAL_ERR

EQU
EQU

80H
40H

BAD_RTCMEM
FEATURE_ERROR

EQU
EQU
EQU
EQU

20H
10H
02H
01H

MFG~ODE

POSLACTlVE
M EM0 R Y

0013

????

FLAG

POSLSTATUS

S I Z

MEMORLSIZE

( 1 K

POST ERROR FLAGS AND STATUS
(DURING POST)
POST DETCD FATAL SYS ERROR
POST HAS DETECTED AN ERROR
(NON_FATAL)
RTC MEMORY BAD - DO NOT USE
FEAT DEV FAILED (ROM_SCAN)
MANUFACTURING MODE ACTIVE
POST IS CURRENTLY ACTIVE

B Y T E S )
; MEMORY SIZE IN K BYTES

DW

BATTERY CONTROL FLAGS
0015
= 0080

0040
= 0020
=

??

BALSTATUS
LOW_BALSIG
LOW_BALHOLO
LOW_BALPEND

DB
EQU
EQU
EQU

80H
40H
20H

BATTERY SUPPORT STATUS
LOW BATTERY SIGNALLED FLAG
LOW BATTERY KEY HOLD STATE
LOW BAT PENDING SECOND SENSE

ROM BIOS 2-17

B I

oS

STATUS

F LAG

0016 ??
= 0080

BIOS_STATUS
DSP_BLANKED

DB
EQU

80H

= 0040
= 0020
= 0010
= 0004
= 0002

F_RESUME
KYBD.JICTIVE
BOOLF1HIT
DCLSUPPORTED
FORCUJCL

EQU
EQU
EQU
EQU
EQU

40H
20H
lOH
04H
02H

KB_NOISE.JICT

EQU

01H

= 0001

BIOS STATUS FLAGS
DISPLAY HAS BEEN BLANKED
(KYBD INACTIVE)
FORCE SYSTEM RESUME MODE REQ
KEBD HAS HAD A KEY PRESSED
Fl KEY HIT IN BOOT ROUTINE
DSKT CHANGE LINE SUPPORTED
SYS RESUMED - FORCE DISKETTE
CHANGE LINE ERROR ON NEXT OP
FLAG TO SHOW AUDIO ROUTINE

, -- ------------- - -- - -- -- - - - - - - - - - - - - - - - -;

KEYBOARD DATA AREAS

0017

LABEL

KEY BOA R D
0017
=
=
=
=
=
=
=
=

??

0080
0040
0020
0010
0008
0004
0002
0001

=
=
=
=
=
=

??

0080
0040
0020
0010
0008
0004

DB

INS_STATE
CAPS_STATE
NUM_STATE
SCROLL_STATE
ALT_SHIFT
CTLSHIFT
LEFLSHI FT
RIGHLSHIFT

EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU

F LAG

KB_FLAIi-1

DB

INS_SHIFT
CAPS_SHIFT
SCROLL_SHI FT
HOLD_STATE
SYS_SHI FT

EQU
EQU
EQU
EQU
EQU
EQU

ALT_INPUT

DB

NU~SHIFT

0019

??

001A

????

KEY BOA R 0

KYBD INT 9 AND INT 16 FLAGS
AND BFR (CLRD BY KYBD_RESET
ROUTINE DURING POST)

LAG

KBJLAG

KEY BOA R 0
0018

r

BYTE

;KEYBOARD FLAG STATUS BYTE 1
80H
40H
20H
10H
08H
04H
02H
01H
1

A SCI I

BUFFER_HEAD

INSERT STATE IS ACTIVE
CAPS LOCK STATE TOGGLED
NUM LOCK STATE TOGGLED
SCROLL LOCK STATE TOGGLED
AL TERNATE SHI FT KEY PRESSED
CONTROL SHIFT KEY PRESSED
LEFT SHI FT KEY PRESSED
RIGHT SHIFT KEY PRESSED

SECOND BYTE OF KEYBOARD STATUS
80H
40H
20H
lOH
08H
04H

INSERT KEY IS DEPRESSED
CAPS LOCK KEY IS DEPRESSED
NUM LOCK KEY IS DEPRESSED
SCROLL LOCK KEY IS DEPRESSED
SUSPEND KEY HAS BEEN TOGGLED
SYS REQUEST KEY IS DEPRESSED
STORAGE FOR AL T KEYPAD ENTRY

B U F

OW

E R AND

POINTERS

; POINTER TO HEAD OF KBD BUFFER

HEAD = TAIL INDICATES THAT THE BUFFER IS EMPTY
001C
001E

????
10

BUFFEILTAIL

OW

KB_BUFFER

OW

16 DUP (?) ; ROOM FOR 16 ENTRI ES

; POINTER TO TAIL OF KBD BUFFER

KLBUFFER_END

LABEL

WORD

KB.JIREALLNG

EQU

$-KB.JIREA1 ; LNTH OF KEYBOARD AREA

????
003E
=

0027

2-18 ROM BIOS

; LAST BYTE IN KB.JIREALLNG

DISKETTE DATA AREAS
EEK
003E

??

= 0080

STATUS

AND

SEEK-STATUS

DB

INLFLAG

EQU

MOTOR

STATUS

AN

FLAGS

080H
MOTOR

003F ??
" 0080
" 0020

MOTOR_STATUS
WRITE-OP
MOTOILOK

DB
EQU
EQU

080H
020H

0040 ??
" 0025

MOTOILCOUNT
MOTOR_WAIT

DB
EQU

37

RAT

ON

DISKETTE
0041

??

OP

TIME_OUT
BAD_SEEK
BAD_NEC
BAD_CRC
DMILBOUNDARY
BAD_DMA
MEDIILCHANGE
RECORD_NOLFND
WRITE_PROTECT

0080
0040
0020
0010
= 0009
" 0008
" 0006
" 0004
" 0003
= 0002
= 0001

BAD..J\DDR~ARK

BAD_CMD
0

SKETTE

07 [

EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU

DB

DELAY

COUNT

TIME OUT CNTR FOR DRIVE OFF
2 SECS OF CNTS FOR MOTOR OFF
END

STATUS

RETURN CODE STATUS BYTE
80H
40H
20H
10H
09H
08H
06H
04H
03H
02H
01H

CONTROLLER

NECSTATUS

OFF

MOTOR STATUS
CURRENT OPERATION IS A WRITE
MOTOR ON FOR 500 MSEC
BIT 3-0 " DRV 3-0 IS CNTRLY
RUNNING

DISKETTE_STATUS DB

"
"
"
"

0042

DRIVE RECALIBRATION STATUS
BIT 3-0 " DRV 3-0 NEEDS RECAL
BEFORE NEXT SEEK IF BIT IS " 0
BIT 7 " INTERRUPT OCCURRED

ATTACH FAILED TO RESPOND
SEEK OPERATION FAILED
NEC CONTROLLER HAS FAILED
BAD CRC ON DISKETTE READ
ATMPT TO DMA CROSS 64K BNDRY
DMA OVERRUN ON OPERATION
MEDIA CHANGED ON 3.5" DRIVES
REQUESTED SECTOR NOT FOUND
WRITE ATTEMP ON WRT PROT DSK
ADDRESS MARK NOT FOUND
BAD CMD PASSED TO DSKT I/O
STATUS

7 DUP(?) ; STATUS BYTES FROM CNTLR

??

--

; --- - - -- - - - - - - - - - -- - - - - - - - - - - - - - - - - - - -; VIDEO DISPLAY DATA AREA
-- - -- - - -- - - - - - - - - - - - - - - - - - - - - - - - - - - - - --

-

0049

??

CRLMODE

DB

CURRENT CRT MODE

004A

????

CRLCOLS

OW

NUMBER OF COLUMNS ON SCREEN

004C

????

CRLLEN

OW

LENGTH OF REGEN IN BYTES

004E

????

CRLSTART

OW

CURSOILPOSN

OW

0050

08

STARTING ADDR IN REGEN BFR
B DUP(?) ; CURSOR EACH OF UP TO 8 PGS

????

0060

????

CURSOUODE

OW

CURRENT CURSOR MODE SETTING

0062

??

ACTIVE-PAGE

DB

CURRENT PAGE BEING DISPLAYED

0063

????

ADDIL6845

OW

BASE AD DR FOR ACT DSPL Y CARD

0065

??

CRT~ODE-SET

DB

CRNT SETTING OF THE 3X8 REG

0066

??

CRLPALETTE

08

CRNT PALETTE SETTING COLOR CD

ROM BIOS 2-19

THE FOLLOWING FOUR BYTES ARE LOADED IN THE BLANICCTR THEN SYS_OFF_CTR
BY THE RTC...ALARM INTERRUPT HANDLER. THE ORDER MUST NOT BE CHANGED
AUTO DISPLAY BLANK TIME COUNTER
0067

????

DSP_BLANICCTR

DW

TIME DSPLY BLANKED (SECS)

AUTO SYSTEM OFF TIME COUNTER
0069

????

SYS_OFF_CTR

DW

TIME SYSTEM IS POWERED OFF

006B

??

INTR_FLAG

DB

FLAG TO SHOW AN INTERRUPT

----- - -- -- - - -- - -- -- - - - - - -- - - - - -- - - - - - - -;

TIMER DATA AREA

006C

????

TIMER_LOW

DW

LOW WORD OF TIMER COUNT

006E

????

TIMEILHIGH

DW

HIGH WORD OF TIMER COUNT

0070

??

TIMEILOFL

DB

= 0012
= 0444
= 0007

SEC-.MALLIMIT
MIN_MALLIMIT
HRS_MALLIMIT
GELRTCTlME
COUNTS_SEC
COUNTS_MIN
COUNTS_HOUR

EQU
EQU
EQU
EQU
EQU
EQU
EQU

59H
59H
23H
2
18
1092
7

= 0018
= OOBO

COUNTS_DAY
COUNTS_DALHI
COUNTS_DA LLO

EQU
EQU
EQU

1573040
18H
OBOH

= 0059
= 0059
= 0023
0

0002

TIMER ROLLED SINCE LAST RD
MAX FOR BCD SECONDS
MAX FOR BCD MINUTES
MAX FOR BCD HOURS
TIMER COUNTS PER SECOND
TIMER COUNTS PER MINUTE
65543-10000H (65543 TOO LARGE
FOR 1 WORD, SO LOW WORD IS
USED IN CALCULATIONS)
= 1800BOH COUNTS PER DAY
HIGH BYTE OF COUNTS PER DAY
LOW BYTE OF COUNTS PER DAY

------- - -- - - - - - - - - -- --- - - -- -- - - - - - - - - - -;

SYSTEM DATA AREA

0071 ??
= 0080

BIOS_BREAK
BREAICH IT

DB
EQU

80H

BREAK KEY FLAGS
BREAK KEY HAS BEEN HIT

0072 ????
= 1234
= 5678
= 9ABC
= ABCD

RESELFLAG
SOFLRESET
SYS3USPEND
MFG_MEM-.MODE
LOOP-.MODE

DW
EQU
EQU
EQU
EQU

1234H
5678H
9ABCH
OABCDH

SYS RESET TYPE CONTROL FLAG
RE- I PL WITHOUT STORAGE CLEAR
SYS SUCCESSFULLY SUSPENDED
MANUFACTURING MEMORY MODE
POST LOOP MODE

0074

02 [

OW

2 DUP(?)

RESERVED

????

;

- - ----------- ---------- - --- -- - -- -- -- -- - -- - - - - - - - - - - - --

03 [

0078

PRINTER AND RS232 TIME-OUT VARIABLES
PRINLTIrLOUT

DB

3 DUP(?) ; FOR LPTI-LPT4 RESPECTIVELY

EVENLTlM_OUT

DB

WAIT ON EXT EVNT TIMEOUT CTR

RS23LTIM_OUT

DB

4 DUP(?) ; FOR COMI-COM4 RESPECTIVELY

??

0078
007C

??
04 [

??

2-20 ROM BIOS

, -- - - - -- -- - - -- - --- -- -- - ---- -- - -- -- -- - ---;
0080

?17?

0082

?17?

0084

ADDITIONAL KEYBOARD DATA AREA
BUFFEILSTART
BUFFEILEND
KB_BUFFEILEND BY POST

07 [

DB

7

OW

PTRS TO 16 BYTE KBD BUFFER

OW

INIT SET TO KB_BUFFER AND

DUP(?)

RESERVED

??

DISKETTE LAST DATA RATE INFORMATION
LASLDAT~RATE

008B ??
= 0080
008C

RATE_250KBS
02 [

DB
EQU

80H

2 DUP(?)

OW

ALWAYS 80H - 250 KBS RATE
250 KB/SEC DATA RATE VALUE
SET BY POST DISKETTE TEST
RESERVED

????

DISKETTE DRIVE MEDIA TYPE CODES

(MEDIA TYPE BYTE

=0

IF NO DRIVE)

17-615141312-01

1
1
1
1

-- MEDIA TYPE CODES (ALWAYS
III FOR 720KB MEDIA)
RESERVED - ALWAYS 0
-- MEDIA TYPE ESTABLISHED - ALWAYS 1
DOUBLE STEP REQUIRED - NOT SUPPORTED ALWAYS 0
DATA TRANSFER RATE FOR THIS DRIVE - ALWAYS 10 (250 KBS)
0090 ??
0091 ??
= 0097
0092 ??

MEDIA_TYPLDRO
MEDIA_TYPE_DRI
MEDI~720KB

DB
DB
EQU

97H

DB

DISKETTE MEDIA TYPE DRIVE 0
DISKETTE MEDIA TYPE DRIVE 1
MEDIA TYPE FOR 720 KB DSKT
RESERVED

LOW BATTERY WARNING COUNTER
0093

??

0094

????

0096

17

DB

LOW BATTERY WARNING COUNTER
RESERVED

KEYBOARD CONTROL FLAG 3 USED BY INTERRUPT 9 KEYBOARD PROCESSING

= 0002
0097 ??

KBJLAIL3
LCHC
DB

DB
EQU

02H

KEYBOARD TRACKING FLAG 3
(CLEARED BY KYBD_RESET
ROUTINE IN POST)
LAST CODE HIDDEN CODE FLAG
RESERVED

ROM BIOS 2-21

- --- --- - -- - - -- -- - - - - - - -- -- - - - - -- - _... -- --EVENT POST/WAIT DATA AREA

-- -- --- -- -- - - - - - -- -- - - -- -- - - -- - - - - - - - - -POINTER TO USERS POST FLAG
0098
0098

????

009A
009A

????

= 0080

IO_ROM_INIT

LABEL

USER_FLAG

DW

10_ROM_SEG

LABEL

US ERJLAG_S EG

OW

EVENLPOSTED

EQU

I N T E R V A L
009C
009E

????
????

WA

RTCLOW
RTCHIGH

OOAO ??
0080
0004
0002
0001

T

REDEFINITION OF WORD DURING
POST ROM_SCAN
OSET ADDR OF USERS WAIT FLAG

WORD

REDEFINITION OF WORD DURING
POST ROM_SCAN
SEG ADDR OF USERS WAIT FLAG

080H

FLAG SET WHEN WAIT TIME EXP
IN USERS FLAG

ME

OW
OW

P 0 S T / WA I T

S A V E

A R EA

LOW WORD OF USER WAIT COUNT
HIGH WORD OF USER WAIT COUNT

F LAG S

RTCWAILFLAG
POSTED
EQU
PON-ALRM_PEND
ALARM_PEND
I NTERVAL_WA IT

=
=
=
=

T

WORD

DB
80H
EQU
EQU
EQU

04H
02H
01H

WAIT ACTIVE FLAG
POST ON INTERVAL OCCURRED
POWER ON BY ALARM PENDING
USER ALRM I NT 4AH PNDNG SPND
INTVL WAIT CURRENTLY ACTIVE

KEYBOARD NMI PRE-PROCESSING FUNCTION CONTROL SAVE AREA B4H-CCH
00B4
00B4

ORG
OB4H
KB-AREA2

LABEL

00B4 ??
= 0080
= 0040
= 0010
= 0008
= 0004

KB_NMLCNTL
P60_LOADED
FUNCSTATE
XLATE_BUSY
CLICK-ON
KEYPAD_STATE

DB
EQU
EQU
EQU
EQU
EQU

00B5
00B7
00B9
OOBA

????
????
??
??

B_PEND1
B_PEND2
P60_HOLD_BYTE
LAST _CL I CK-KEY

DW
OW
DB
DB

OOBB
OOBC

??
??

KB_NMLHEAD
KB_NMLTAIL

DB
DB

KB_NMLBUFFER

DB

16 DUP(?) ; ROOM FOR 16 ENTRIES

= 0010

KLNMLBLTH

EQU

$-KB_NMLBUFFER ; LENGTH OF NMI BFR

= 0019

KB-AREALLNG

EQU

$-KB-AREA2 ; LENGTH OF KYBD AREA 2

OOCD

DATA

OOBD

10 [

BYTE
80H
40H
lOH
08H
04H

KBD AREA 2 (CLRD KYBD3ESET
ROUTINE IN POST)
KBD PREPROCESSOR CTRLL FLAGS
KEYBOARD PORT 60 IS LD FLAG
KEYBOARD FUNCTION KEY STATE
KEYBOARD TRANSLATION ACTIVE
KEYBOARD CLICKER IS ENABLED
KEYBOARD KEYPAD STATE
KEYBOARD BRK PENDING FLAGS 1
KEYBOARD BRK PENDING FLAGS 2
PORT 60 SINGLE BYTE QUEUE
AREA FOR SCAN CD OF LAST KEY
CLICKED
PTR TO HEAD OF PREP ROC BFR
PTR TO END OF PREPROC BFR

??

2-22 ROM BIOS

ENDS

POST Temporary Data Area
-- -

-- - - ----- -- --- - - -- -- --- - - - - - - -- - - -- - - - - - -- - - - - - - - - - -- -- - - --

; EXTRA DATA SEGMENT - FOR POST AND PRINT SCREEN STATUS ONLY
0000
0000 ??
= 0001
= OOFF

XXDATA SEGMENT
STATUS_BYTE
PRTSCACTIVE
PRTSCERROR

AT 50H
DB
EQU
EQU

0001

POSLPTR

OW

0003 ??
= 0080
= 0040
= 0020
= 0010

POSTJ1ASK
SOFTJ10DE
WARMJ10DE
COLDJ10DE
MF"--TST

DB
EQU
EQU
EQU
EQU

0004 ??
= 0001
= 0002
= 0003
= 0004
= 0005
= 0006
= 0009
= 0010
= 0012
= 0011
= 0050
= 0051

POSLDEVID
SYS_ID
EQU
EQU
KYBD_ID
MONO_ID
COLOILID
DSKLID
PPRLID
APRLID
RS23LID

DB

LCLID
CPRLID

0005 ??
= 0001
= 0002
= 0003
= 0004
= 0.005
= 0006

POSLICON
SYSTEM
FEATURE
SETUP
BATTERY
PCHECK2
PROMPT

0006
0008

MF"--ERILCODE
MF"--CKPT

0009
0009

????

????
??
10 [

?
80H
40H
20H
10H

03
04
05
06
09
10H
l2H
llH

EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU
050H

EQU

05lH

EQU
DB
01

EQU
EQU

02
03

EQU

04
05

EQU
EQU
06

EQU

PRINT SCREEN ACTIVE STATUS
BIT ON WHEN PRTSC IS ACTIVE
PRTSC ERROR - CANCELLED
PTR TO CURRENT TEST ROUTINE

01
02

ME~ID

MODE~ID

01
OFFH

DW
DB

TEMP
DB

16

ASCSTR
DB

LABEL
17 DUP(?)

PWR ON SELF TST ROUTINE MASK
SYSTEM SOFT START MODE
SYSTEM WARM START MODE
SYSTEM COLD START MODE
MANUFACTURING TEST MODE
DEV ID FOR POST ROUTINE CALLS
SYSTEM UNIT 10
MEMORY 10
KEYBOARD 10
MONOCHROME CRT ADAPTER 10
COLOR CRT ADAPTER 10
DISKETTE 10
PARALLEL PRINTER 10
ALT PARALLEL PRINTER ID
RS232 PORT 10
MODE~ID

LCD DEVICE 10
COMPACT PRINTER PORT ID
ICON NUMBER FOR FAILING AREA
SYSTEM UN IT I CON
SYSTEM FEATURE ICON
SYSTEM SETUP
BATTERY LOW I CON
SYSTEM PARITY CHECK 2
USER PROMPT ICON
MANUFACTURING ERROR CODE
MANUFACTURING CHECKPOINT

LABEL
BYTE
DUP (?)

USED DURING SELF TEST ONLY

??
0019
0019

11 [

BYTE
ASCI I STRING FOR ERROR MSG

??
002A

07 [

ICON_DIS

DB

7 DUP(?)

AREA USED FOR EJ1SG ONLY

ICONJ1SG

DB

7 DUP(?)

AREA USED FOR LMSG ONLY

??
0031

07 [
??

ROM BIOS 2-23

0038 ??
" 0080
" 0040
" 0008
" 0004
" 0002
" 0001

DSPTEST.Y1ASK
VROM_CGA
VROM.Y10NO
VIDEO_ROM
MONO
EQU
CGA
EQU
LCD
EQU

DB
EQU
EQU
EQU

0039

SUSP_DSP _CON

DB

??

003A

XXDATA
;

?
80H
40H
08H
04H
02H
OIH

ENDS

VIDEO DISPLAY BUFFER
VIDEO_RAM

SEGMENT AT OB800H

0000
0000

REGEN
REGENW

BYTE
WORD

4000 [

LABEL
LABEL

DB

16384 DUP (?)

??

4000

HLDS RTCDSP _CON VALUE

-- ----- ---- -- -- --- - - - - -- -- - -- -- - - - - -- - --

0000

0000

DISPATCH MASK FOR DSP_TEST
VIDEO ROM CGA AVAILABLE
VIDEO ROM MONO AVAILABLE
DISPATCH VIDEO_LINK
MONO AVAILABLE
CGA AVAIL! OS PATCH CRLTEST
LCD AVAIL! DSPATCH LCD TSTS

VIDEO_RAM
ENDS
INCLUDE SROMMACS .MAC

Common Macros
IDENT MACRO
NAME SNAME
ENDM
SAVE
MACRO
PUSH
AX
PUSH
BX
PUSH
CX
PUSH
OX
PUSH
BP
PUSH
SI
PUSH
DI
PUSH
ES
PUSH
DS
ENDM
RESTORE MACRO
POP
DS
POP
ES
POP
DI
POP
SI
POP
BP
POP
DX
POP
CX
POP
BX
POP
AX
ENDM

2-24 ROM BIOS

SNAME,SEQ,REV

16K BYTE DISPLAY BUFFER

THE FOLLOWING MACROS MAY BE USED WHEN A CONDITIONAL JUMP OF MORE THAN

+/- 128 BYTES IS REQUIRED. THE MACROS ARE NAMED THE SAME WAY AS THE
CONDITIONAL JUMP EXCEPT J BECOMES JF.
JFA
MACRO
JLABEL
JNA
$+5
JMP
JLABEL
ENDM
JFNA MACRO
JLABEL
JA
$+5
JLABEL
JMP
ENDM
JFB
MACRO
JLABEL
JNB
$+5
JLABEL
JMP
ENDM
JFNB MACRO
JLABEL
$+5
JB
JMP
JLABEL
ENDM
JFG
MACRO
JLABEL
JNG
$+5
JMP
JLABEL
ENDM
JLABEL
JFNG MACRO
$+5
JG
JMP
JLABEL
ENDM
JFL
MACRO
JLABEL
JNL
$+5
JMP
JLABEL
ENDM
JLABEL
JFNL MACRO
JL
$+5
JLABEL
JMP
ENDM
JFO
MACRO
JLABEL
$+5
JNO
JMP
JLABEL
ENDM
JFNO MACRO
JLABEL
$+5
JO
JMP
JLABEL
ENDM
JFP
MACRO
JLABEL
JNP
$+5
JMP
JLABEL
ENDM
JFNP MACRO
JLABEL
JP
$+5
JLABEL
JMP
ENDM
JFS
MACRO
JLABEL
JNS
$+5
JMP
JLABEL
ENDM
JFNS MACRO
JLABEL
JS
$+5
JMP
JLABEL
ENDM
JFZ
MACRO
JLABEL
JNZ
$+5
JLABEL
JMP
ENDM
JFNZ MACRO
JLABEL
$+5
JZ
JLABEL
JMP
ENDM
END

I F NOT ABOVE JUMP AROUND JMP
ELSE TAKE A LONG JUMP
I F NOT NOT ABOVE JUMP AROUND
ELSE TAKE A LONG JUMP
I F NOT BELOW JUMP AROUND JMP
ELSE TAKE A LONG JUMP
I F NOT NOT BELOW JUMP AROUND
ELSE TAKE A LONG JUMP
I F NOT GREATER JUMP AROUND
ELSE TAKE A LONG JUMP
I F NOT NOT GTR JUMP AROUND
ELSE TAKE A LONG JUMP
I F NOT LESS JUMP AROUND JUMP
ELSE TAKE A LONG JUMP
I F NOT NOT LESS JUMP AROUND
ELSE TAKE A LONG JUMP
I F NOT OVERFLOW JUMP AROUND
ELSE TAKE A LONG JUMP
I F NOT NOT OFLOW JMP AROUND
ELSE TAKE A LONG JUMP
I F NOT PRTY E JMP AROUND JMP
ELSE TAKE A LONG JUMP
I F PARITY E JMP AROUND JMP
ELSE TAKE A LONG JUMP
IF NOT SIGN NEG JMP AROUND
ELSE TAKE A LONG JUMP
I F SIGN NEGATIVE JUMP AROUND
ELSE TAKE A LONG JUMP
I F NOT ZERO JUMP AROUND JUMP
ELSE TAKE A LONG JUMP
I F NOT NOT 0 JMP AROUND JMP
ELSE TAKE A LONG JUMP

ROM BIOS 2-25

Nonmaskable Interrupt Handler
(BIONMIH)
; ****************************
PUBLICS

;****************************
PUBLIC NMLFLIH
PUBLI C PULRTCNMI
PUBLIC GELRTCNMI

; ****************************
EXTERNALS

;****************************
EXTRN
EXTRN
EXTRN
EXTRN

0000

PAR_CHK: BYTE
ICON_PR:NEAR
ENABLE_NMI : NEAR
DISABLE_NMI :NEAR

ROMCODE SEGMENT BYTE PUBLIC
ASSUME CS: ROMCODE
IDENT BlONMIH,lO,OO

First Level Interrupt Handler
(NMI_FLIH)
; **********************************************************************
MODULE-NAME:
NMLFLIH
OATE LAST MODI FI ED : 09/12/85
DESCRIPTIVE-NAME: THIS ROUTINE SUPPORTS THE SIX TYPES OF NMI SOURCES
COPYRIGHT: 7396-917 (C) COPYRIGHT IBM CORP. 1985
REFER TO COPYRIGHT INSTRUCTIONS FORM NUMBER G120-2083
CHANGE LEVEL: ECOOO
FUNCTION:

THIS MODULE HANDLES NON-MASKIBLE INTERRUPTS. THE
SIX TYPES OF NMI' S ARE:
DISKETTE NMI - I/O INSTR. ISSUED WITH CONTROLLER OFF
I/O CHANNEL CHECK - I/O DEVICE CHANNEL .ERROR
SYSTEM SUSPEND
2 SECONDS BEFORE POWER OFF OCCURS
KYBD_DATA
KEYBOARD HAS DATA IN PORT 7DH
KYBD_CLEAR
INT 9 HANDLER ISSUED KYBD CLEAR I/O
RTC~LARM
REAL TIME CLOCK INTERRUPT

MODULE SIZE: 2618 BYTES

2-26 ROM BIOS

ENTRY CONDITIONS:
PURPOSE OF ENTRY: SERVICE NON-MASKIBLE INTERRUPT
INPUT CONDITIONS: NON-MASKIBLE INTERRUPT OCCURRED
RESTRICTIONS: NONE
INTERNALLY REFERENCED
DSKLRESYNC
KYBD_XL T
CHAN_CHK

ROUTINES:
KYBD_PREP
KYBD_CLR
RTCALARM_NMI LOW_BAT_CHK
SUSPEND
RESUME

EXTERNALL Y REFERENCED ROUTI NES: REFER TO EXTRN LIST
CHANGE ACTIVITY:

NONE

**********************************************************************
0000

REGSAVE STRUC
OW
5 DUP(?)

05 [
????

DXSAVE
CXSAVE
BXSAVE
AXSAVE
OFFSAVE
SEGSAVE
FLGSAVE
REGSAVE

OOOA
OOOC
OOOE
0010
0012
0014
0016
0018

REGLSAV STRUC
OW
8 DUP(?)

08 [

0000

OX SAVE AREA ON STACK
CX SAVE AREA ON STACK
BX SAVE AREA ON STACK
AX SAVE AREA ON STACK
OFFSET SAVE AREA ON STACK
SEGMENT SAVE AREA ON STACK
FLAGS SAVE AREA ON STACK

OW
OW
OW
OW
OW
OW
OW
ENDS

1???
0010
DOll
0012

AL SAVE AREA ON STACK
AH SAVE AREA ON STACK

ALSAVE DB
AHSAVE DB
REGLSAV ENDS

??
1?

= 0200

LFLAG

EQU

0200H

= OOEC
= OOEE

IrLINSTR
OULINSTR

EQU
EQU

OECH
OEEH

0000
0000
0001
0003
0005
0006
0007
0008
0009
OOOA
OOOB
OOOC
0000
0000
OOOE
DOll
0013
0015
0017
0019

ASSUME DS:DATA,ES:NOTHING
NMLFLIH
PROC
FAR
PUSH
AX
; SAVE REGISTERS
MOV
AL,DISABLLSLEEP+CLOCICRUN ; DISABLE NMIS
OUT
CLOCICCTL, AL
PUSH
BX
PUSH
CX
PUSH
OX
PUSH
BP
PUSH
SI
PUSH
01
PUSH
ES
PUSH
OS
NMLREDRIVE:
CLEAR DIRECTION
CLD
MOV
AX ,DATA
MOV
DS,AX
SET BP TO STACK PTR
MOV
BP,SP
READ NMI SOURCE FLAGS
IN
AL,NMLSRC
SAVE ALL BUT TIMER SENSE
AND
AL,NOT TIMERLSN
NMIH_OUT
JZ

001B
OOlD
001F
0021

50
BO 07
E6 72
53
51
52
55
56
57
06
IE
FC
B8
8E
8B
E4
24
74

---- R
08
EC
62
OF
46

8A
E4
DC
E6

08
61
08
61

MOV
IN
OR
OUT

BL,AL
AL,NMLCNTL
AL, 0 I S...ALARM
NMLCNTL,AL

INTERRUPT FLAG IN FLAGS
REGISTER
OBJECT CODE FOR IN AL,DX INSTR
OBJECT CODE FOR OUT DX,AL INSTR

BL

<---

NMI SOURCE FLAGS

DISABLE RTC ALARM· NMI

ROM BIOS 2-27

0023
0026
0028
002B
002B
002E
0030
0033
0033
0036

F6 C3 40
74 03
E9 0536 R

0038
003B
003D
0040
0040
0043
0045
0048
0048
004B
004D

F6 C3 01
74 03
E9 025F R

F6 C3 08
74 03
E9 0797 R
F6 C3 80
75 37

F6 C3 10
74 03
E9 02F6 R
F6 C3 04
74 03

E9 0551

TEST
JZ
JMP
NMLOO:
TEST
JZ
JMP
NMLOI :
TEST
JNZ

BL,IOCHICNMI
NMLOO
CHAN_CHK

CHANN EL CH ECK?

BL, SYS_SUSP _NMI
NMLOI
SUSPEND

SYSTEM SUSPEND?

TEST
JZ
JMP
NML02:
TEST
JZ
JMP
NML03 :
TEST
JZ
JMP

BL,KBDATILNMI
NML02
KYBD_PREP

KEYBOARD DATA READY?

BL, KBCLR_NMI
NML03
KYBD_CLR

KEYBOARD CLEAR?
PROCESS KEYBOARD CLEAR

BL, RTCJILRfLNMI
NMIH_EXIT
RTCALARM_NMi

EXIT I F NOT ALARM
OTHERWISE MUST BE ALARM

BL,DSKLNMI
DSKT _RESYNC

PROCESS CHANNEL CHECK

RUN SYSTEM SUSPEND ROUTINE
PROCESS DISKETTE NMI

GO TO PROCESS DATA

KYBD_PREP, KYBD_CLR , DSKLRESYNC, RTCALARM_NMI ROUTINES RETURN HERE
0050
0050
0051
0053

FA
BO 07
E6 72

0055
0057
0059

E4 61
24 F7
E6 61

005B
005D
005F
0061
0061
0062
0063
0064
0065
0066
0067
0068
0069
006B
006D
006E
006F

E4 62
24 DF
75 AC
IF
07
5F
5E
5D
5A
59
5B
BO 27
E6 72
58
CF

NMIH_EXIT:
CLI
MOV
AL, DI SABLLSLEEP+CLOCICRUN
OUT
CLOCICCTL ,AL
IN
AND
OUT

AL,NMLCNTL
AL,NOT OIS...ALARM
NMLCNTL ,AL

DISABLE NMIS

RE-ENABLE ALARM NMI

IN
AL,NMLSRC
READ NMI SOURCE FLAGS
AND
AL,NOT TlMERLSN
SAVE ALL BUT TIMER SENSE
JNZ
NMLREDRIVE
NMIH_OUT:
POP
RESTORE REGISTERS
DS
POP
ES
POP
DI
POP
SI
POP
BP
POP
DX
POP
CX
POP
BX
MOV
AL, DI SABLE_SLEEP+CLOCICRUN+GLOBAL_NMI
ENABLE NMIS
OUT
CLOCICCTL,AL
POP
AX
IRET
NMLFLIH
ENDP
INCLUDE DSKTNMI.INC
SUBTTL DISKETTE RESYNC DRIVER
EXTRN
EXTRN
EXTRN
EXTRN
EXTRN

2-28 ROM BIOS

NECOUTPUT: NEAR
RESUL TS: NEAR
DISICRESET:NEAR
GELPARM: NEAR
GELVECTOR@:NEAR

Diskette Resyoc (DSKT_RESYNC)
;***************************************************
MODULE-NAME : DSKLRESYNC
DESCRIPTIVE-NAME : DISKETTE RESYNC ROUTINES
COPYRIGHT: 7396-917 (C) COPYRIGHT IBM CORP. 1985
REFER TO COPYRIGHT INSTRUCTIONS FORM NUMBER G120-2083
CHANGE LEVEL: 0.0
FUNCTION : TO POWER ON ANO RE-SYNCHRONIZE THE STATE OF THE DISKETTE
CONTROLLER WITH THE CURRENT STATE OF THE DISKETTE DRIVES
MODULE SIZE: 660 BYTES
ENTRY CONDITIONS:
PURPOSE OF ENTRY: TO POWER UP THE FDC WHEN THE FDC IS POWERED OFF
INPUT CONDITIONS: DS POINTING TO ROM DATA AREA, BP POINTING
TO STACK
RESTRICTIONS: NONE
THIS ROUTINE IS INVOKED WHENEVER AN I/O ACCESS IS MADE
REGISTERS 3F2,3F4,3F5 WHEN POWER IS OFF TO THE FOC. IF
POWERED ON BY THIS ROUTINE AND THE RETURN ADDRESS-1 IS
IN AL,DX OR OUT DX,AL INSTRUCTION, THE RETURN ADDRESS
RE-EXECUTE THAT INSTRUCTION UPON NMI EXIT.

TO THE FOC
THE FDC IS
POINTING TO AN
IS ADJUSTED TO

EX IT COND I TI ONS:
NORMAL EXIT CONDITIONS: POWER RESTORED TO THE FDC
TRACK COUNTER(S) FOR THE FDC AND ARRAY IN SYNC
NMI'S ENABLED (PORT 77H)
SETUP TO REISSUE THE DISKETTE I/O COMMAND
ERROR EXIT CONDITIONS:

NONE

REGISTERS MODIFIED:

AX, BX, CX, DX, ES, AND SI

INTERNAL DATA AREAS / TABLES: BIOS DATA AREA AT SEGMENT 40H
EXTERNAL l Y REFERENCED ROUTINES: REFER TO EXTRN LIST

,

EXTERNALL Y REF,RENCED DATA AREAS:

REFER TO EXTRN LIST

;************* r;.-,:,*************************************************** ******
DSKT_RESYNC PROC NEAR
ASSUME CS: ROMCODE
ASSUME DS:DATA,ES:ABSO

006F

006F
0074
0076
007A

81
75
F6
74

7E OA 03F2
14
46 10 04
OE

007C
007E
0080
0082
0084
0086
0088

BO
E6
OC
E6
24
E6
EB

B2
77
40
77
BF
77
C6

CMP
JNE
TEST
JZ

DXSAVE[BP] ,DRIVLCNTL
DSKLON
ALSAVE[BP], FDCRUN
DSKLON

CHECK FOR DX = RESET PORT
JUMP IF NOT
RESET BIT ACTIVE IN AL?
YES THEN POWER ON CNTLR

IF NOT A RESET COMMAND TO 3F2H THEN RESET DISKETTE NMI AND EXIT LEVEL
MOV
OUT
OR
OUT
AND
OUT
JMP

AL, OSKLNMI +DSKLDEGATE+RD_CNTL +CNTL_SEL
DSKLCNTL,AL
AL,FDCPWR
TOGGLE POWER ON THEN OFF TO
DSKLCNTL,AL
RESET NMI BUT DO NOT POWER
AL. NOT FOCPWR
ON CONTROLLER
DSKLCNTL,AL
NMHLEXIT
EXIT LEVEL

SAVE DISKETTE MOTOR STATE BUT DISABLE DRIVE SELECTS,DMA, INTERRUPTS

ROM BIOS 2-29

008A
008D
008E
0090
0092
0095
0097
0099
0099
009C

BA
EC
8A
24
F6
74
DC

03F7

DSKLON:
DX,DRIVE_SENSE
MOV
IN
AL,DX
READ DRIVES MOTOR/SEL LINES
MOV
BL,AL
BL <--- STARTING SENSE
AND
AL, DR0J.10TOR
SAV E DRO MOTOR STATE
TEST BL, DRLMOLSENSE
WAS DRIVE 1 MOTOR ON?
JZ
DSKLRS01
NO THEN JUMP
OR
AL, DR1J.10TOR
OTHERWISE TURN ON DRIVE 1 MOTOR
DSKLRS01:
MOV
DX, DRIVE_CNTL
SET PORT TO 3F2
OUT
DX,AL
TURN OFF DMA/lNT LEAVE MOTOR ON

D8
10
C3 08
02
20

BA 03F2
EE

DISABLE POWER AND ACTIVATE DISKETTE DEGATE MODE
009D
009F

BO B2
E6 77

00A1
00A3

OC 40
E6 77

00A5
OOAA
OOAC
OOAE
OOBO
00B2
00B2

F6
74
E4
24
E6

00B5
00B8
OOBA

B9 050A
E2 FE
FA

MOV
OUT

AL, DSKLNMI +DSKLOEGATE+RD_CNTL +CNTL_SEL
DSKLCNTL,AL
; SEND TO THE DISKETTE CONTROL REG

ENABLE CONTROLLER POWER
OR
OUT

06 OOAO R 01
06
61
F7
61

E8 076E R

AL, FDCPWR
DSKLCNTL ,AL

; ENABLE POWER

TEST RTCWAILFLAG, INTERVAL_WAIT; CHECK FOR PERIODIC INT
JZ
DSKLRS01A
AL,NMLCNTL
IN
AND
AL,NOT DIS-ALARM
ALLOW RTC ALARM INTERRUPTS
OUT
NMLCNTL,AL
DSKLRS01A:
CALL NMLCYCLE
CYCLE NMI MASK, RESTORE INT FLAGS
MOV
LOOP
CLI

CX,5*MS_DELAY

DELAY TO WAIT FOR CONTROLLER

$

CHECK IF NMI CAUSED BY POWER ON DURING MIDDLE OF CONTROLLER RESET

=

OOBB
OOCO

81 7E OA 03F2
75 13

CMP
JNE

DXSAVE[BP] ,DRIVE_CNTL
DSKLRS02

CHECK FOR OX
JUMP I F NOT

00C2
00C5
00C7

8A 46 10
A8 04
75 OC

MOV
TEST
JNZ

AL,ALSAVE[BP]
AL, FDCRUN
DSKLRS02

GET ORIGI NAL AL REG
IS FDC RESET OFF?
YES THEN NOT A RESET

00C9
OOCB
OOCC
OOCE
DODO
00D2

DC
EE
E4
24
E6
E9

RESET PORT

POWER ON REQUEST IN THE MIDDLE OF THE CONTROLLER RESET
04

OR
OUT
IN
AND
OUT
JMP

77
DF
77
0207

AL, FDCRUN
DX,AL
AL, DSKLCNTL
AL,NOT DSKLDEGATE
DSKLCNTL, AL
DSKLRSEXIT

SET RESET BACK TO OFF
TURN OFF OEGATE
EXIT THE NMI TO COMPLETE
THE RESET SEQUENCE

TAKE OVER AND ACTIVATE DISKETTE INTERRUPT
0005
00D5
0008
0009
OODE
ODED
00E2
00E4

AD
50
C6
2B
8E
B1
E8

0040 R
06 0040 R FF
CO
CO
06
0000 E

DSKLRS02:
MOV
AL,MOTOR_COUNT
PUSH AX
MOV
MOTOILCOUNT ,OFFH
SUB
AX,AX
MOV
ES,AX
MOV
CL,6
CALL GELVECTOR@

SAVE CURRENT MOTOR COUNT
SAVE ON STACK
KEEP MOTOR FROM GO I NG OFF
GET INT LEVEL 6 VECTOR LOC

SI NOW CONTAINS INTERRUPT VECTOR ADDRESS

;
00E7
OOEA
OOEB
OOEF
OOFO
00F4
00F9

26:
50
26:
50
26:
26:
56

8B 04
8B 44 02
8C 4C 02
C7 04 024C R

2-30 ROM BIOS

MOV
PUSH
MOV
PUSH
MOV
MOV
PUSH

AX,ES: lSI]
GET VECTOR OFFSET
AX
; SAVE
AX,ES: [SI+2]
GET VECTOR SEG
AX
; SAVE
ES: [SI+2] ,CS
; SET CODE SEGMENT
WORD PTR ES: lSI] ,OFFSET DSKLNMIE ;
SI
; SAVE VECTOR ADDRESS

OOFA
OOFC
OOFE

E4 21
24 BF
E6 21

0100
0102
0104
0106
0108
010A
OlOC
OlOE
0110
0112

BO
E6
E4
8A
BO
E6
E4
8A
BO
E6

IN
AND
OUT

~ SETUP

AL,INTAOI
AL ,OBFH
INTAOl,AL

; ENABLE DISKETTE INTERRUPTS

TO READ THE TRACK COUNTERS AND DEGATE 01 SKETTES

EA
77
77
C8
E2
77
77
E8
F2
77

MOV
OUT
IN
MOV
MOV
OUT
IN
MOV
MOV
OUT

AL, DSKLNMI tFDCPWR+DSKT _DEGATE+DRO_TRLSEL +CNTLSEL
DSKLCNTL, AL
; READ THE TRACK CNTR FOR DR 0
AL,DSKLCNTL
CL,AL
; CL <-- DRIVE 0 POSITION
AL, DSKT_NMI +FDCPWR+DSKT_DEGATE+CNTL_SEL
DSKLCNTL,AL
; READ THE TRACK COUNTER FOR DR
AL,DSKLCNTL
CH,AL
; CH <--- DRIVE 1 POSITION
AL, DSKLNMI +FDCPWR+DSKT_DEGATE+RD_CNTL +CNTL_SEL
DSKT_CNTL, AL

RESET THE FOC AND ISSUE SPECIFY COMMAND TO THE FDC
CH = DRIVE 1 TRACK POSITION, CL= DRIVE 0, BL = DRIVE_SENSE ON NMI ENTRY
0114
0116
0118
011B
0110
011F
011F
0121
0124
0126
0128
0128
012B
012C
012E
0130
0131
0136
0137
013A
0130
013E
0140
0143
0143
0145
0148
014B
0140
0140
014F
0151
0154
0157
015A
0150
0160
0163
0166

8A
24
F6
74
OC

C3
10
C3 08
02
20

OC
F6
74
OC

08
C3 20
02
01

BA
EE
OC
EB
EE
80

03F2

FB
EB
BF
57
8B
B9

04
00
26 003E R 7F

STI
CALL WAILINTRPT
MOV
DI,OFFSET RESYNCOUT2
PUSH 01
MOV
DI,CX
MOV
CX,4
NMLRSETLP:
MOV
AH ,READ_INLSTATUS
CALL NECOUTPUT
CALL RESULTS
LOOP NMLRSETLP
NMLSPECI FY:
MOV
CX,DI
MOV
AH, SPECI FY
CALL NECOUTPUT
MOV
BX,1
CALL GELPARM
CALL NECOUTPUT
MOV
BX ,03H
CALL GELPARM
CALL NECOUTPUT
CALL DROP _BUSY

0231 R
01F4 R
F9
0004

B4
E8
E8
E2

08
0000
0000
F6

8B
B4
E8
BB
E8
E8
BB
E8
E8
E8

CF
03
0000
0001
0000
0000
0003
0000 E
0000 E
0222 R

MOV
AL,BL
AL , ORO_MOTOR
AND
TEST BL,DRL.MOLSENSE
JZ
NMLSELMOT
OR
AL,DRLMOTOR
NMLSELMOT:
OR
AL, FDCDMILENAB
TEST BL,DRLSEL_SENSE
NMLSELDR
JZ
OR
AL,DRLSELECT
NMLSELDR:
MOV
OX, DR I VE_CNTL
OUT
DX,AL
OR
AL, FDCRUN
JMP
$ + 2
OUT
DX,AL
AND
SEELSTATUS,NOT INLFLAG

SAVE ORO MOTOR STATE
WAS DRIVE 1 MOTOR ON?
NO THEN JUMP
OTHERWISE TURN ON DRIVE 1 MOTOR
ENABLE DMA/INTERRUPTS BIT
DRIVE 1 ACTIVE ?
JUMP I F NOT

RESET THE ADAPTER
TURN OFF THE RESET
TIME DELAY
; RESET THE I NTERRUPT FLAG
ALLOW INTERRUPTS
CHECK FOR FDC TO GENERATE AN INT
ERROR EXIT FOR NECOUTPUT
SAVE TRACK COUNTERS
READ 4 DRIVES STATUS
READ INTERRUPT STATUS COMMAND
SEND IT TO THE FDC
GET STO AND PCN
LOOP UNTI L COMPLETE
RESTORE TRACK COUNTERS
SPECIFY COMMAND
FIRST PARM SENT TO THE FDC
SECOND PARM SENT TO THE FOC

ISSUE OVERLAPPED RECALS TO DR 0 AND 1 IF INSTALLED
NOTE SEE WHAT TO DO WITH SEELSTATUS BIT 7-INTERRUPT RECEIVED
0169
016B
016E
0170
0173

B4
E8
B4
E8
E8

07
0000 E
00
0000 E
0222 R

MOV
CALL
MOV
CALL
CALL

,

AH, RECALl BRATE
NECOUTPUT
AH,OO
NECOUTPUT
DROP_BUSY

RECAL COMMAND FOR THE FDC
OUTPUT IT TO THE FDC
RECAL DRI VE 0 FI RST
OUTPUT IT TO THE FDC
CHK FOR FDC BUSY TO DROP FOR OVLP

;SEE IF THERE IS A SECOND DRIVE I F SO RECAL IT
0176
017C

F7 06
74 OA

ooui

R 0040

TEST
JZ

EQU I P_FLAG, 40H
RECAL_DONE

; SEE IF SECOND DRIVE IS INSTALLED
; ONLY DRIVE 0 INSTALLED

ROM BIOS 2-31

Ol7E
0180
0183
0185
0188
0188
018B
018D
0190
0193
0196
019C
019E
01A1
01A3
01A6

B4
E8
B4
E8

07
0000
01
0000

MOV
AH,RECALIBRATE
CALL NECOUTPUT
MOV
AH,Ol
CALL NECOUTPUT
RECAL_DONE:
E8 0231
CALL WAILINTRPT
B4 08
MOV
AH,READ_INLSTATUS
E8 0000
CALL NECOUTPUT
E8 0000 E
CALL RESULTS
80 C9 80
OR
CL,80H
F7 06 0010 R 0040
TEST EQUIP_FLAG,40H
74 OB
JZ
NMLSEEK
E8 0231 R
CALL WAILINTRPT
B4 08
MOV
AH,READ_INLSTATUS
E8 0000
CALL NECOUTPUT
E8 0000
CALL RESULTS

CHK FOR FDC TO GENERATE AN IRPT
READ DRIVE STATUS TO THE FOC
RECAL STATUS REQUESTED FLAG
SEE IF TWO DRIVES INSTALLED
CHK FOR FDC TO GENERATE AN IRPT
READ DRIVE STATUS TO THE FOC

,

;ISSUE OVERLAPPED SEEKS TO DR 0 AND
01A9
01A9
01AC
01AE
0181
01B3
01B6
01B8
018B

RECAL COMMAND FOR THE FDC
OUTPUT IT TO TH E FDC
RECAL DRI VE 1
OUTPUT IT TO THE FDC

80
B4
E8
B4
E8
8A
E8
E8

E1 7F
OF
0000
00
0000
El
0000
0222

IF INSTALLED

NMLSEEK:
AND
CL,07FH
MOV
AH, SEEK-CMD
CALL NECOUTPUT
MOV
AH,OO
CALL NECOUTPUT
MOV
AH,CL
CALL NECOUTPUT
CALL DROP_BUSY

,

TURN OFF THE RECAL SWITCH
SEEK COMMAND FOR THE FDC
OUTPUT IT TO THE FDC
SEEK DRIVE 0 FIRST
OUTPUT IT TO THE FDC
DR 0 TRACK TO SEEK TO
OUTPUT TO TH E FDC
CHK FOR FDC BUSY TO DROP FOR OVLP

;SEE IF THERE IS A SECOND DRIVE IF SO SEEK
01BE
01C4
01C6
01C8
01CB
01CD
01DO
0102
0105
01D5

F7
74
84
E8
B4
E8
8A
E8

06 0010 R 0040
OF
OF
0000
01
0000
E5
0000

0108
010A
0100

B4 08
E8 0000
E8 0000

E8 0231

TEST EQUI P_FLAG, 40H
JZ
SEEK-DONE
MOV
AH,SEEK-CMD
CALL NECOUTPUT
MOV
AH,Ol
CALL NECOUTPUT
MOV
AH,CH
CALL NECOUTPUT
SEEK-DONE:
CALL WAILINTRPT

SEE IF SECOND DRIVE IS INSTALLED
ONLY DRIVE 0 INSTALLED
SEEKL COMMAND FOR THE FDC
OUTPUT IT TO THE FOC
SEEK DRIVE 1
OUTPUT IT TO THE FDC
DR 0 TRACK TO SEEK TO
OUTPUT TO THE FDC
CHECK FOR FDC TO GENERATE AN IRPT

;GET THE STATUS OF THE SEEK AND THE TRACK VALUE RETURNED FROM THE FDC
MOV
CALL
CALL

AH,READ_INLSTATUS
NECOUTPUT
RESULTS

; READ DRIVE STATUS CMD TO THE FDC
; OUTPUT IT TO THE FDC
; GET STO AND PCN FROM THE FDC

~IF A SECOND DRIVE IS INSTALLED GET ITS RESULTS
OlEO
01E6
01E8
01EB
OlED
01FO

F7
74
E8
B4
E8
E8

06 0010 R 0040
OB
0231
08
0000
0000

TEST
JZ

CALL
MOV
CALL
CALL

EQU I P_FLAG, 40H
RESYNCOUTl
WAILINTRPT
AH,REALINLSTATUS
NECOUTPUT
RESULTS

SEE I F TWO DRIVES
CHECK FOR Foe TO GENERATE AN IRPT
READ DRIVE STATUS COMMAND TO FDC
OUTPUT IT TO THE FDC
GET STO AND PCN FROM FDC FOR DR 8

SETUP TO RETURN TO CALLER THE PROPER VALUE IN PORT 77H
01F3
01F3
01F4
01F4
01F6

RESYNCOUTl :
POP
SI
; DISCARD FOCOUTPUT ERROR ADDRESS
RESYNCOUT2 :
MOV
AL ,DSKLNMI HDCPWR+RD_CNTL +CNTLSEL ; TURN OFF DEGATE
OUT
DSKLCNTL,AL

BO D2
E6 77

01F8
01F9
01FA
OlFB
01FF
0200

FA
5E
58
26: 89 44 02
58
26: 89 04

5E

RESTORE THE USERS INTERRUPT VECTOR AND MOTOILCOUNT

2-32 ROM BIOS

CLI
POP
POP
MOV
POP
MOV

SI
AX
ES:[SI+2],AX
AX
ES: [SI] ,AX

; RETRI EVE VECTOR ADDRESS
RESTORE VECTOR SEG ADDRESS
RESTORE VECTOR OFFSET ADDRESS

0203
0204

58
A2 0040 R

POP
MOV

AX
MOTOILCOUNT , AL

; RETRI EVE MOTOR COUNT

ADJUST THE STACK POINTER TO RETURN TO USER
0207
0207
0208
020S
020E
0210
0211
0213
0214
0216
0218
021A
021C
021C
021F
021F

IE
88
8S
8E
4B
8A
IF
3C
74
3C
75

DSKLRSEXIT:
PUSH OS
MOV
BX,OFFSAVE[BP]
MOV
AX,SEGSAVE[BP]
MOV
DS,AX
DEC
BX
MOV
AL, [BX]
POP
OS
CMP
AL,IN_INSTR
JE
DSKLRHLADJ
CMP
AL, DULl NSTR
JNE
RHLEXITNMI
DSKLRTN-ADJ:
DEC
OFFSAVE[BP]
RTN_EXITNMI:
JMP
NMIH_EXIT

5E 12
46 14
08
07
EC
04
EE
03

FF 4E 12
E9 0050 R

GET RETURN OFFSET AODR
GET RETURN SEGMENT AOOR
POINT BACK TO INSTR
GET INSTRUCTION BYTE
IN AL ,OX INSTRUCTION?
YES THEN ADJUST RETURN
OUT DX,AL INSTRUCTION?
NO TH EN DO NOT ADJUST RTN
SETUP TO REISSUE THE I/O FOR USER
RETURN TO NMLFLIH

;THIS ROUTINE WILL WAIT FOR THE FOC TO DROP BUSY
0222
0222
0223
0226
0228
0228
0229
022B
0220
022F
022F
0230
0231

DROP_BUSY PROC NEAR
PUSH CX

51
BA 03F4
2B C9

MOV
OX, FOCSTATUS
SUB
CX,CX
WAILBUSY:
IN
AL,OX
TEST AL, FDCBUSY
JZ
FOCDONE
LOOP WAIT_BUSY
FOCDONE:
POP
CX
RET
DROP_BUSY ENDP

EC
A8 10
74 02
E2 F9
59
C3

SAVE REGISTER VALUE
POINT TO MASTER STATUS PORT
TIMING COUNT FOR LOOP
READ THE MASTER PORT
TEST FOR BUSY TO DROP
FDC NO LONGER I S BUSY
RESTORE ORIGINAL VALUE

;THIS ROUTINE WILL WAIT FOR AN INTERRUPT FROM THE FOC
0231
0231
0232
0233
0235
0237
0237
023C
023E
0240
0242
0244
0244
0249
024A
024B
024C
024C

51
53
B3 04
2B C9
F6
75
E2
FE
75

06 003E R 80
06
F7
CB
F3

80 26 003E R 7F
5B
59
C3

WAILINTRPT PROC NEAR
PUSH CX
PUSH BX
MOV
BL,4
SUB
CX,CX
WAILINT:
TEST SEEICSTATUS,INLFLAG
JNZ
FOCINTRPT
LOOP WAILINT
DEC
BL
JNZ
WAILINT
FDCINTRPT:
AND
SEEICSTATUS, NOT INLFLAG
POP
BX
POP
CX
RET
WAILINTRPT ENDP
DSKLRESYNC ENDP

SAVE BX
2 SECONDS WAIT
TIMING COUNT FOR LOOP
WAIT FOR AN INTERRUPT
FDC GENERATED AN INTERRUPT
WAIT ON INTERRUPT
; RESET THE INTERRUPT FLAG
RESTORE BX

DSKLINTE
THIS ROUTINE HANDLES THE DISKETTE INTERRUPT
INPUT:
OUTPUT:
024C
024C
0240
024E
0251
0253

IE
50
B8 ---- R
8E 08
80 OE 003E R 80

NONE
THE INTERRUPT FLAG SET IS SEEICSTATUS
DSKLNMIE
PUSH
PUSH
MOV
MOV
OR

PROC
FAR
OS
AX
AX,DATA
DS,AX
SEEICSTATUS, I NLFLAG

SET UP DATA SEGMENT

ROM BIOS 2-33

0258
025A
025C
025D
025E
025F

80 20
E6 20
58
IF
CF

MaV
OUT
POP
POP
IRET
DSKLNMIE

AL,EOI
INTAOO,AL
AX
OS

END OF INTERRUPT MARKER
INTERRUPT CONTROL PORT
RECOVER SYSTEM
RETURN FROM INTERRUPT

ENDP

INCLUDE KY8DNMI. INC

; **********************************************************************
MODULE-NAME:

KYBDNMI. INC

DATE LAST MODIFIED:

09/12/1985

DESCRIPTIVE-NAME: THIS MODULE CONTAINS THE BIOS KYBD NMI INTERRUPT
HANDLER AND THE ASSOCIATED KEY SCAN CODE TRANSLATION
ROUTINES.
COPYRIGHT:

7396-917 (C) COPYRIGHT IBM CORP. 1985
REFER TO COPYRIGHT INSTRUCTIONS FORM NUMBER G120-2083

CHANGE LEVEL:
FUNCTION:

0.0

KYBD_PREP
KYBD_CLR
KYBD_XL T

MODULE SIZE:

KEYBOARD SCAN CODE NMI ROUTINE
KEYBOARD CLEAR NMI ROUTINE
KEYBOARD SCAN CODE TRANSLATION ROUTINE

816 BYTES

ENTRY CONDITIONS:
PURPOSE OF ENTRY: TO PROCESS A KEYSTROKE
INPUT CONDITIONS: NIA
RESTRICTIONS: NIA
INTERNALLY REFERENCED ROUTINES:
KYBD_XLT SCAN CODE TRANSLATION
EXIT CONDITIONS:
NORMAL EXIT CONDITIONS: KEYSTROKE PROCESSED
ERROR EXIT CONDITIONS: NIA
REGISTERS MODIFIED: NONE
INTERNAL DATA AREAS I TABLES: NONE
EXTERNALLY REFERENCED ROUTINES: REFER TO EXTRN LIST
EXTERNALLY REFERENCED DATA AREAS: REFER TO EXTRN LIST
CHANGE ACTIVITY:

NONE

; *******************************************************************
; *******************************************************************

;KEYBOARD

EXTERNALS

; *******************************************************************
EXTRN
EXTRN
EXTRN
EXTRN
EXTRN
EXTRN

2-34 ROM BIOS

KBPAD_TBL:WORD
KBPADL:ABS
KBFUN_TBL: WORD
KBFUNL :ABS
KBNMLTBL:BYTE
KB_NOISE:NEAR

Keyboard Data NMI (KBNMI_DATA)
; *******************************************************************
; LOCAL EQUATES FOR KEYBOARD NMI PROCESSING

007D
0000
004B
0038
0008

; *******************************************************************

0080
0057

KBNMLDATA
NO_HOLD
NMLSLASH_SC
P60-AL LSC
NMLR-AL LBIT3

EQU
EQU
EQU
EQU
EQU

7DH
OOH
4BH
038H
08H

BREAK-BIT
P60_FILSC

EQU
EQU

BOH
057H

KEYBOARD NMI SCAN CODE INPUT PORT
VAL OF P60_HOLD_BYTE FOR NOT Q' 0
SCAN CODE FOR / MAKE AT NMI LEVEL
SCAN CODE FOR AL T AT P60 LEVEL
USED TO DENOTE LEFT & RIGHT
ALT NMI SC. R-ALT HAS THIS BIT SET.
USED TO TST AND SET BRK BIT OF SCs
Fll MAKE SC FOR P60

; *******************************************************************
KYBD_PREP - KEYBOARD SCAN CODE NMI PROCESSING

DESCRIPTION:
THIS ROUTINE IS JUMPED TO FROM THE FIRST LEVEL NMI INTERRUPT HANDLER
WHEN THE INTERRUPT IS THE RESULT OF A KEYSTROKE. A CLICK IS SOUNDED
WHEN A KEY SCAN CODE 'MAKE' IS RECEIVED AND THE CLICK STATE IS ON.
THE SCAN CODE IS READ THEN TESTS ARE MADE TO SEE IF THE BUFFER IS
EMPTY AND PORT 60 IS NOT ACTIVE. I F THESE 2 CONDITIONS ARE MET A CALL
IS MADE TO THE XLATE ROUTINE WITH THE KEY SCAN CODE IN AL. ELSE THE
SCAN CODE IS BUFFERED IN THE 16 POSITION NMI SCAN CODE BUFFER AT THE
BUFFER TAIL. IF PORT 60 IS NOT ACTIVE A CALL IS MADE TO THE XLATE
ROUTINE WITH THE KEY SCAN CODE TO BE TRANSLATED AT THE BUFFER HEAD.
THE FIRST LEVEL NMI INTERRUPT HANDLER SAVES REGISTERS AND MOVES THE
ADDRESS OF "DATA" TO THE OS REGISTER BEFORE IT JUMPS TO THIS ROUTINE.
ON EXIT THE FIRST LEVEL INTERRUPT HANDLER RESTORES REGISTERS.
INPUT:
OUTPUT:

DATA IN PORT 7DH
OS = DATA (40H)
STORE SCAN CODE INTO KB_NMLBUFFER
UPDATE KB_NMLHEAD _TAIL
SAVE LASLCLICK-KEY

INTERNAL ROUTINES:
EXTERNAL ROUTINES:

KYBD_XLT
SPKILON, KLNO I SE, SPKR_RESTORE

REGISTERS MODIFIED: N/A
INTERRUPTS: LEFT AS ARE
KYBD NMI INITIALLY DISABLED, ENABLED BEFORE EXIT
NORMAL EXIT:

; *******************************************************************

025F

025F
0260

JMP NMIH_EXIT
NEAR

ASSUME
ASSUME
PUSH
POP

IE
07

0261

OS: DATA
ES: DATA
DS
ES

DATA POINTER TO ES

PREPI0:
ENABLE DISPLAY I F DISABLED BY KEYBOARD INACTIVITY

0261
0266

F6 06 0016 R 80
74 OF

,

TEST
JZ

BIOS_STATUS,DSP_BLANKED ; IS LCD BLANKED?
PREP _12

; RESET BLANKED FLAG AND ENABLE DISPLAY

ROM BIOS 2-35

0268
0260
026F
0271
0273
0275

80
BO
E6
E4
OC
E6

26 0016 R 7F
00
74
75
60
75

AND
MOV
OUT
IN
OR
OUT

BIOS3TATUS,NOT DSP_BLANKED ; RESET FLAG
AL,O
LCD_INDX,AL
AL,LCLDATA
; GET DISPLAY CONTROL REG
AL,SYNCENABLE+PANELENABLE ; TURN ON PANEL
LCD_DATA,AL

SET KEYBOARD ACTIVE FLAG (FOR THIS PERIOD)
0277
0277
027C

80 OE 0016 R 20
80 26 0015 R BF

PREP_12:
OR
AND

BIOS3TATUS,KYBD~CTIVE ; INDICATE KEYBOARD IS ACTIVE
BALSTATUS,NOT LOW_BAT.JlOLD ; RESET LOW BTRY HOLD FLAG

..

; ..... -- ..... _------ ------ --- --- -- --- -- -- ----- -- ---- -- ---- ------ --- ------

; A KEYBOARD DATA READY NMI OCCURED. READING THE DATA RESETS THE DATA
; READY NMI REQUEST.
; ... ---------_ ...... -----_ ... --

0281

E4 7D

IN

-_ ... -- -- --- -- -- ------- -- -- ---- -- ---- ..... -- --- ---

AL,KBNMLDATA

; READ SCAN CODE

DETERMINE IF A KEY STROKE CLICK IS REQUIRED FOR THIS KEY.
A CLICK IS SOUNDED ON THE MAKE OF ALL KEYS EXCEPT THE MAKES OF KEYS
THAT ARE GENERATED BY TYPAMATIC MODE.
0283
0285

A8 80
74 07

0287
028C

C6 06 OOBA R 00
EB 23

028E
028E
0292

38 06 OOBA R
74 10

0294

;
A2 OOBA R

MOV

LASLCLI CK...KEY , AL

0297
029C
029E
02A1
02A4
02A6
02A9
02AC
02AF

F6
74
BB
B9
8A
E8
E8
E8
8A

TEST
JZ
MOV
MOV
MOV
CALL
CALL
CALL
MOV

KB_NMLCNTL,CLICK...ON ; IS AUDIO FEEDBACK ENABLED?
PREP29
NO, GO TO BUFFER PROCESSING
BX,lH
; DURATION OF CLICK
CX,20H
; FREQUENCY OF CLICK
DL,AL
; SAVE KEYSTROKE
SPKR_ON
; FORCE SPEAKER ON
KB_NOISE
; OUTPUT KEY STROKE CLICK
SPKILRESTORE
; RESTORE SPEAKER STATE
AL,DL
; RESTORE AL

TEST
JZ

AL, BREAK...BIT
PREP20

; IS THIS A 'MAKE' SCAN CODE?
; YES, GO TO CLICK PROCESSING

; ALLOW ANY BREAK KEY TO CLEAR LASLCLICK...KEY
MOV
JMP
PREP20:
CMP
JE

LASLCLI CK...KEY , 0
SHORT PREP29

; YES, CLEAR LASLCLI CK...KEY
; GO TO BUFFER PROCESSING

LASLCLI CK...KEY , AL
PREP29

; T-MATIC KEY IF = TO LAST KEY MAKE
; IF TYPAMATIC SKIP CLICK

FIRST KEY HIT - NOT TYPAMATIC

06 00B4 R 08
13
0001
0020
DO
0759 R
0000 E
0762 R
C2

; THIS KEY IS NOW LASLCLICK...KEY

PROCESS KEY
02B1
02B1
02B5
02B9
02BB
02BE
02CO

SA
8A
FE
80
72
B1

02C2
02C2
02C4

3A E9
75 12

2E OOBB R
OE OOBC R
C1
F9 10
02
00

,
02C6
02CB
02DO
0205

C6
C6
C6
EB

06
06
06
OF

PREP29 :
MOV
MOV
INC
CMP
JB
MOV

CH,KLNMLHEAD
CL,KB_NMLTAIL
CL
CL,KB_NMLBLTH
PREP50
CL,O

PREP50:
CMP
JNE

CH,CL
PREP60

BUFFER HEAD TO CH
BUFFER TAIL TO CL.·
INCREMENT TAIL POINTER
; IS CL = END OF BUFFER +l
; JUMP I F NOT PAST END OF BUFFER
PAST END - SET TO START
HAS TAIL REACHED HEAD - OVERFLOW
JUMP I F NOT OVERFLOW

KEYBOARD NMI BUFFER OVERFLOW

OOBB R 00
OOBC R 01
OOBD R FF
90

2-36 ROM BIOS

MOV
MOV
MOV
JMP

KB_NMLHEAD,O
KB_NMLTAIL,l
KB_NMLBUFFER,OFFH
PREP70

; BUFFER OVERFLOW - PURGE BUFFER
; POSITION FOR OVERFLOW INDICATOR
; OVERFLOW INDICATOR TO BUFFER HEAD

NO OVERFLOW
0208
0208
020A
020E
02E2

B7
8A
88
88

00
IE OOBC R
87 OOBO R
OE OOBC R

,

PREP60:
MOV
MOV
MOV
MOV

BH,O
BL,KILNMLTAIL
KB~MLBUFFER[BX]
KB~MLTAIL,CL

; CLEAR BH
; MOV ORIGINAL TAIL POINTER TO BL
,AL ; BUFFER SIC AT ORIGINAL TAIL POINTER
; UPDATE TAIL POINTER

; ATTEMPT TO DEQUEUE KEYSTROKE AND TRANSLATE
02E6
02E6
02EB
02ED
02FO

F6
75
E8
E9

02F3
02F3

E9 0050 R

06 00B4 R 10
06
0319 R
0050 R

02F6

PREP70:
TEST
JNZ
CALL
JMP

KB~MLCNTL.XLATE_BUSY

PREP90
KYBD_XL T
NMIH_EXIT

; IS A XLATION ALREADY IN PROGRESS?
JUMP I F ACTIVE
XLATE AND WRITE TO PORT 60
EXIT KEYBOARD DATA ROUTINE

PREP90:
JMP

GO TO 1ST LEVEL INTERRUPT HANDLER

KYBD_PREP ENDP

PROCEDURE END

Keyboard Clear NMI (KYBD_CLR)
*******************************************************************
KYBD_CLR - KEYBOARD CLEAR NMI PROCESSING

DESCRIPTION:
THIS ROUTINE IS JUMPED TO FROM THE FIRST LEVEL NMI INTERRUPT HANDLER
WHEN THE INTERRUPT IS THE RESULT OF PORT 60 BEING CLEARED.
A BUFFER EMPTY TEST IS MADE TO DETERMINE I F THERE ARE MORE KEY
SCAN CODES TO BE XLATED. IF THE BUFFER IS NOT EMPTY A CALL IS MADE TO
THE XLATE ROUTINE TO PROCESS THE KEY AT THE BUFFER HEAD.
THE FIRST LEVEL NMI INTERRUPT HANDLER SAVES REGISTERS AND MOVES THE
ADDRESS OF "DATA" TO THE DS REGISTER BEFORE IT JUMPS TO THIS ROUTINE.
ON EXIT THE FIRST LEVEL INTERRUPT HANDLER RESTORES REGISTERS.
INPUT:
OUTPUT:

P60JlOLD_BYTE
P60_HOLD_BYTE RESET
P60_LOADED RESET
CLILKEYBD OF PORT 6IH RESET

INTERNAL ROUTI NES:
EXTERNAL ROUTINES:

KYBDJL T
NONE

REGISTERS MODIFIED: NIA
INTERRUPTS:
NORMAL EXIT:

LEFT AS ARE
JMP NMIH_EXIT

*******************************************************************
NEAR

02F6

02F6
02F7

IE
07

ASSUME
ASSUME
PUSH
POP

DS:DATA
ES:DATA
DS
ES

DATA POINTER TO ES

ROM BIOS 2-37

THIS NMI IS A RESULT OF INT9 CLEARING THE KEYBOARD INDICATING THAT
THE PORT 60 SCAN CODE HAS BEEN READ AND IS READY TO ACCEPT ANOTHER.

KEYPAD /, * AND RIGHT -ALT NMI SCAN CODES GENERATE TWO CODES FOR PORT 60.
KYBD_XLT SENDS THE FIRST (HIDDEN CODE) DIRECTLY AND QUEUES THE SECOND
(P60 SCAN CODE) IN P60_HOLD_BYTE. IF P60_HOLD_BYTE IS HOLDING, IT MUST
BE SENT TO P60 AS SOON AS P60 IS EMPTY.
02F8
02FB
02FD
02FF
0301
0306
0308

AO
3C
74
E6
C6
EB
80

00B9
00
09
60
06 00B9 R 00
05
26 00B4 R 7F

030D
030F
0311

E4 61
24 7F
E6 61

0313
0316

;
E8 0319 R
E9 0050 R

MOV
CMP
JE
OUT
MOV
JMP
KCI0 :

AL, P60_HOLD_BYTE
GET HOLD BYTE
AL,NO_HOLD
IS A SCAN CODE QUEUED?
KClO
NO, JUMP.
KLDATA,AL
; HELD SCAN CODE TO P60
P6LHOLD_BYTE,NO_HOLD ; RESET HOLD BYTE
SHORT KC20
; LEAVE P60_LOADED SET
AND
KB_NMLCNTL ,NOT P60_LOADED ; SET OFF PRT 60 ACT

RESET CLEAR KEYBOARD NMI SOURCE
KC20 :
AND
OUT

IN

AL,NMLCNTL
AL, NOT CLR_KEYBD
NMLCNTL,AL

GET NMI CONTROL PORT
SET CLEAR KYBD BIT TO 0

CALL TRANSLATE TO SEE IF ANYTHING IN QUEUE AND TRANSLATE IF SO
KYBD_XL T
NMIH_EXIT

CALL
JMP

XLATE AND WRITE TO PORT 60
GO TO 1ST LEVEL INTERRUPT HANDLER
PROCEDURE END

0319

Translate Scan Code (KYBD_XLT)
; *******************************************************************
KYBD_XLT - KEYBOARD SCAN CODE XLATE ROUTINE

DESCRIPTION:
IF THE SCAN CODE BUFFER IS EMPTY OR PORT 60H IS LOADED AT ENTRY
THEN THIS ROUTINE ENABLES KEYBOARD NMI AND EXITS.
IF THE BUFFER IS NOT EMPTY THE NEXT ENTRY IN THE
SCAN CODE BUFFER IS PROCESSED. THE SCAN CODE IS TRANSLATED TO THE
PCl EQUIVALENT AND THE PCl SCAN CODE IS WRITTEN TO PORT 60. HARDWARE
WILL GENERATE A SET HARDWARE INTERRUPT 1 REQUEST WHEN PORT 60 IS
WRITTEN. I F THE TRANSLATION DOES NOT RESULT IN A PORT 60 LOAD THEN
OTHER KEYS IN THE QUEUE ARE PROCESSED I F ANY.
INPUT:

KB_NMLBUFFER

OUTPUT:

WRITE TO PORT 60H

INTERNAL ROUTINES:
EXTERNAL ROUTINES:

NUM_STATCFIX
NMLCYCLE

REGISTERS MODIFIED: N/A
INTERRUPTS: I FLAG RESTORED TO PRE-NMI STATE
KYBD_NMI ENABLED
, NORMAL EX IT:
0319

2~38

RET

; ******************************************************************
NEAR

ROM BIOS

ASSUME
ASSUME

OS: DATA
ES: DATA

SCAN CODE BUFFER PROCESSING
0319
0319

E8 0000 E

031C
0321

F6 06 00B4 R 80
75 00

,
;

0323
0327
032B

XL TlO:
CALL

; DISABLE ALL INTERRUPTS
KB_NMLCNTL, P60_LOADED ; IS PORT 60 CURRENTLY LOADED?
XL Tl3
; YES THEN EXIT THE ROUTINE

TEST
JNZ

PORT 60 IS NOT LOADED SO CHECK QUEUE FOR ANY KEYS

8A IE OOBB R
3A IE OOBC R
75 06

MOV
CMP
JNE

BL, KLNMLHEAD
BL,KB_NMLTAIL
XL Tl4

; BUFFER HEAD DISPLACEMENT
; I S BUFFER EMPTY
; YES, GO TO BUFFER EMPTY ENTRY

PORT 60 IS NOT LOADED AND NO KEYS IN QUEUE SO FIX NUM_LOCK STATUS
AND EXIT
0320

E8 0524 R'

CALL
RE-ENABLE KEYBOARD NMIS AND EXIT THE ROUTINE

0330

E9 0523 R

XLTl3:

JMP

XL T100

DEQUEUE THE SCAN CODE FROM THE NMI QUEUE
0333
0338
033A
033E
0340
0343
0345

80
B7
8A
FE
80
72
B3

OE 00B4 R 10
00
87 OOBD R
C3
FB 10
02
00

0347
0347

88 IE OOBB R
;

XLTl4:
MOV
MOV
INC
CMP
JB
MOV
XLTl5:
MOV

OR

KB_NMLCNTL,XLATLBUSY ; SET KEY XLATE IN PROCESS
BH,O
; CLEAR BH - BL IS BUFFER HEAD DISP
AL,KB_NMLBUFFER[BXl ; GET SCAN CODE FROM BUFFER
BL
INCREMENT HEAD POINTER
BL,KB_NMLBLTH
IS BL = END OF BUFFER +1
XL Tl5
JUMP I F NOT PAST END OF BUFFER
BL,O
PAST END - SET TO START
KB_NMLHEAD,BL

UPDATE BUFFER HEAD

START OF SCAN CODE TRANSLATION
ENABLE NMIS AND RESTORE INTERRUPT STATE TO PRE-NMI CONDITION

------- -------------------------- -- - - - - - -- - - - -- - - - - - -- - - - - - - - -- - ---

034B

;
E8 076E R

034E
0350
0352

8A EO
3C FF
75 14

0354
035A
0360
0365

C7
C7
80
E9

0368
0368
036B
036D
036F
0373
0375
0377
0379

; CHECK IF SC IS FOR A BAS E KEY ONLY
XLTl8:
80 E4 80
AND
AH , BR EALB IT
8A DO
MOV
DL,AL
24 7F
AND
AL,NOT BREALBIT
8D IE 0000
LEA
BX, KBNMLTBL
2E: D7
XLAT
KBNMLTBL
A8 80
TEST
AL ,80H
75 03
JNZ
XL Tl9
XL T60_1
E9 04DE R
JMP

CALL

NMLCYCLE

CYCLE NMI MASK, RESTORE INT FLAGS

MOV
CMP
JNE

AH,AL
AL,OFFH
XL Tl8

AH <=== ORIGINAL NMI SC
KEYBOARD OVERRUN ?
NO, GO LOOK FOR FUNCTION KEY

KEYBOARD OVERRUN DETECTED
06 00B5 R 0000
06 00B7 R 0000
26 00B4 R BF
050C R

MOV
MOV
AND
JMP

B_PENDl,O
; RESET BREAK PENDING FLAGS
B_PEND2,0
; RESET BREAK PENDING FLAGS
KB_NM LCNTL, NOT FUNCSTATE ; CLEAR FUNCTION STATE
; OVERRUN, GO WRITE PORT 60
XL T90

AH <=== BREAK BIT OF NMI SC
DL <=== ORIGINAL NMI SC
AL <=== NMI SC W/O BREAK BIT
SCAN CODE TABLE - NMI TO PCl
XLATE NMI SC TO PC! SC
BASE KEY ONLY?
NO, JUMP AROUND
YES, JUMP TO BASE KEY PROCESS

IF THIS IS THE FUNCTION KEY, SET/RESET FUNCTION STATE

ROM BIOS 2-39

037C
037E
0380
0382
0384
0387
0389
038E
0391
0391
0396

AL,DL
AL <=== ORIGINAL NMI SC
XLTl9: MOV
AND
AL, NOT BREAI<-BIT
AL <=== NMI SC W/O BREAK BIT
AL,FN_KEY
CMP
FUNCTI ON KEY ?
JNE
XL T23
NO, GO PROCESS FUNCTION + KEYS
TEST
AH, BREAI<-BIT
FUNCTI ON KEY MAKE ?
JZ
XLT20
JUMP IF MAKE
AND
KB_NMLCNTL,NOT FUNCSTATE ; BREAK, CLEAR FUNCTION STATE
JMP
XLT95
; GO TO RETURN
XLT20:
80 OE 00B4 R 40
OR
KB_NMLCNTL,FUNCSTATE ; MAKE, SET FUNCTION STATE
E9 051B R
JMP
XL T95
; GO TO RETURN
; ... -- --- -- -- ---_ ... ------- --- -- -_ ... ---_ ... ... --_ ... ---- --- --- ---- ----_ ...... ---8A
24
3C
75
F6
74
80
E9

C2
7F
52
15
C4 80
08
26 00B4 R BF
051B R

-_

FUNCTION + KEYS PROCESSING
IF FUNCTION STATE IS ACTIVE SEARCH THE FUNCTION TABLE FOR A MATCH.
I F THERE IS BREAK PENDING AND THIS KEY IS A BREAK KEY SEARCH THE
FUNCTION TABLE FOR A MATCH.

-_

0399
0399
039E
03AO
03A5
03A7
03AA
03AC
03AC
03AF
03B2
03B2
03B5
03BA
038C
03BE
03CO
03C3

; --- -- -_ ... -- -- -_ ...... -- ---- -- --- -- -- --_ ......... -- -- ----- -- -- -- -- -- ... --- -- --XL T23:
F6 06 00B4 R 40
TEST
KB_NMLCNTL,FUNCSTATE ; FUNCTION KEY STATE ?
75 OC
JNZ
XLT24
YES, GO SEARCH TABLE
B_PEND2,O
83 3E 00B7 R 00
CMP
BREAK PENDING?
74 IE
JE
XL T27
NO, GO CHECK FOR KEYPAD STATE
F6 C4 80
TEST
AH, BREAI<-BIT
YES, TEST FOR BREAK KEY
74 19
JZ
XL T27
MAKE KEY - GO CHK KEYPAD STATE
XL T24:
B9 0001
MOV
CX ,OlH
INIT KEYS BREAK PENDING FLAG
BE 0000 E
MOV
SI,OFFSET KBFUNL
TABLE LENGTH
XL T25:
83 EE 02
SUB
SI,2
SEARCH FUNCTION TABLE FOR MATCH
2E: 8B 9C 0000 E
BX, KBFUN_TBL [SI]
MOV
BH <=== NMI SC ENTRY
BL <=== P60 EXTENDED SC
3A C7
CMP
AL,BH
CHECK FOR MATCH
74 OA
JE
XL T28
JMP I F MATCH FOUND
01 E1
SHL
ex ,I
CX <=== SEARCH KEY BRK PEND FLAG
83 FE 00
CMP
SI,O
IS SEARCH COMPLETE ?
75 ED
JNE
XL T25
NO, GO CHECK NEXT ENTRY

THIS KEY IS NOT A FUNCTION + KEY.
03C5
03C5

XLT27 :
JMP

E9 0463 R
; --

XLT40

; GO TO KEYPAD SEARCH

-_ ... -- -_ ...... --_ ...... -_ ... --- -_ ... -- -- -_ ... -_ ............ -- -_ ... -- -_ ......... -_ ... -- -- -- -- ...... ----

A MATCH HAS BEEN FOUND IN THE FUNCTION STATE TABLE. THE TABLE CONTAINS
FOUR, FN + CURSOR KEYS; FN + Fl OR F2; AND FOUR, STATE TOGGLE KEYS.
THE STATE, CURSOR, AND Fl, F2 KEYS ARE:
STATE KEYS
CURSOR, Fl, F2 KEYS
FN
FN
FN
FN

+ SCRL LOCK
+ CAPS LOCK
+ NUM LOCK
+

ESC

= SPEAKER ON/OFF
= CLICKER ON/OFF
= KEYPAD ON/OFF
= SYS REQ
FN +
FN +

FN
FN
FN
FN
Fll
Fl2

Fl
F2

+
+
+
+

= HOME
= PGUP

= END
~

= PGON

THE FUNCTION STATE TABLE MAPS FUNCTION

+ STATE KEYS TO A BIT.
01H
02H
04H
08H

; --- ... --

03C8
03C8
03CB
03CD
0301
0303

F6
74
85
75
E9

C4 80
09
OE 00B7 R
03
0406 R

THE FUNCTION STATE TABLE MAPS
FUNCTION + CURSOR KEYS TO
EXTENDED SCAN CODES.

= SPEAKER ON/OFF
= CLICKER ON/OFF
= KEYPAD ON/OFF
= SYS REQ

-_ ...... -_ ......... -- --_ ... -- -- -_ ......... -- --_ ......... -- -_
XL T28:
TEST
JZ
TEST
JWZ
JMP

2-40 ROM BIOS

AH, BREAI<-BlT
XL T28A
CX, LPEND2
XL T28A
XL T60

IT ALSO MAPS FUNCTION + F1, F2
TO EXTENDED SCAN CODES FOR
Fll, F12.
... ----_ ...... -- -- ... ... --_ ......

-_ -_

_-

PROCESSING BREAK SC?
NO, JMP
BREAK PENDING FOR THIS SPECIFIC SC
YES, JMP TO RESET
NO, PROCESS AS BASE KEY

0306
0306
0309
03DB
03DE
03EO
03E3
03E5
03E9
03EC
03EC
03FO
03F2
03F6
03F9
03FB
03FD
03FF
0401
0404
0404
0407
0409
040E
0411
0411
0415
0418

80
77
80
74
F6
74
31
E9

FB 08
57
FB 08
3B
C4 80

OT
OE 00B7
051B R

85
75
09
80
75
E4
34
E6
E9

OE 00B7 R
26
OE 00B7 R
FB 01
09
61
04
61
051B R

80
75
80
E9

FB 02
08
36 00B4 R 08
051B R

30 1E 00B4 R
E8 0524 R
E9 051B R

XLT28A:
IS THIS A STATE CHANGE KEY?
CMP
BL,08H
JUMP TO CUR KEYS I F NOT STATE CHG
JA
XLT36
SYSTEM REQUEST KEY ?
CMP
BL,08H
YES, GO PROCESSES SYSTEM REQUEST
XLT33
JE
MAKE KEY?
TEST
AH, BREAILBIT
YES, GO SET BREAK PENDING
JZ
XLT29
BREAK KEY - RES ET BRK PEND FLAG
XOR
LPEND2,CX
GO TO RETURN
JMP
XLT95
XL T29:
B_PEND2,CX
IS BREAK ALREADY PENDING
TEST
TYPAMATIC INVALID FOR STATE KEY
JNZ
XLT32
B_PEND2,CX
SET KEYS BREAK PENDING FLAG
OR
SPEAKER STATE KEY ?
CMP
BL,OlH
NO, GO TEST FOR CLICK STATE
JNE
XLT30
READ SPEAKER CONTROL PORT
IN
AL,NMLCNTL
AL,EN_SPKR
TOGGLE ENABLE SPEAKER STATE
XOR
WRITE SPEAKER CONTROL PORT
NMLCNTL,AL
OUT
JMP
XLT95
GO TO RETURN
XLT30:
CMP
BL,02H
CLICK STATE KEY?
XL T31
; NO, GO TOGGLE KEYPAD STATE
JNE
KLNMLCNTL,CLICILON ; TOGGLE CLICK STATE
XOR
XL T95
GO TO RETURN
JMP
XLT31 :
XOR
KLNMLCNTL,BL
TOGGLE KEYPAD STATE
CALL
NUILSTATE_FIX
MAKE NUM_STATE RFCT KEYPAD_STATE
XL T32: JMP
XL T95
GO TO RETURN

SYSTEM REQUEST KEY PROCESSING
041B
041B
041E
0420
0424
0426
0429
0429
0420
042F
0432
0432
0434
0437

F6
75
09
BO
E9

C4 80
09
OE 00B7 R
54
050C R

31 OE 00B7 R
BO 04
E9 050C R

8A C3
80 FB 57
73 15

XL T33:
TEST
JNZ
OR
MOV
JMP
XLT34:
XOR
MOV
JMP

AH, BREAILBIT
XLT34
B_PEND2,CX
AL, SYSREQ_MAKE
XLT90

IS THIS A REQUEST KEY MAKE?
NO, GO RESET BREAK PENDING FLAG
YES, SET KEYS BREAK PENDING FLAG
SET AL TO SYSTEM REQUEST MAKE
GO WRITE TO PORT 60

B_PEND2,CX
AL, SYSREQ_BREAK
XLT90

BREAK KEY - RESET BRK PEND FLAG
SET AL TO SYSTEM REQUEST BREAK
GO WRITE TO PORT 60

IF HERE, MUST BE FN + CURSOR KEY, OR
XL T36:
MOV
AL,BL
BL,P60_FlLSC
CMP
JAE
XLT38
FUNCTION + CURSOR KEYS

0439
043C
043E
0442
0444
0447
0447
044B

F6
74
31
OC
E9

C4 80
09
OE 00B7 R
80
04FB R

09 OE 00B7 R
E9 04FB R

TEST
JZ
XOR
OR
JMP
XL T37:
OR
JMP

FUNCTI ON + Fl
FUNCTION + F2
044E
044E
0451
0453
0455
0459
045C
045C
0460

F6
74
OA
31
E9

C4 80
09
C4
OE 00B7 R
050C R

09 OE 00B7
E9 050C R

XLT38:
TEST
JZ
OR
XOR
JMP
XL T38_1:
OR
JMP

-

FN + Fl, F2
, AL <=== PC1 EXTENDED SC FROM TBL
; FN + Fl, F2?
; YES, JUMP

HOME, PGUP, END, PGDN

AH,BREAILBIT
XLT37
B_PEND2,CX
AL,BREAILBIT
XLT80

CURSOR KEY BREAK ?
NO, GO SET BREAK PENDING FLAG
BREAK KEY - RESET BREAK PEND FLAG
SET BREAK IN PC1 SCAN CODE
GO RESET PORT 60 KEYPAD STATE

B_PEND2,CX
XLT80

SET KEYS BREAK PENDING FLAG
GO RESET PORT 60 KEYPAD STATE

( F11)
(Fl2)

P60-SC:

Fll MAKE
Fl2 MAKE

= 57H
= 58H

Fll BREAK
Fl2 BREAK

= D7H
= D8H

AH, BREAILBIT
XL T38_1
AL,AH
B_PEND2,CX
XLT90

MAKE KEY?
YES, JUMP
CHANGE TO BREAK SC
BREAK KEY - RESET BREAK PEND FLAG
WRITE TO P60

B_PEND2,CX
XLT90

MAKE KEY - SET BREAK PEND FLAG
WRITE TO P60

ROM BIOS 2-41

KEYPAD KEYS PROCESSING
DETERMINE I F THE KEYPAD TABLE IS TO BE SEARCHED. THE KEYPAD TABLE
SEARCH/NO SEARCH DECISION IS MADE USING THE FOLLOWING RULES:
THE SEARCH IS ALWAYS MADE IF THERE ARE ANY BREAK PENDING FLAGS AND
THIS KEY IS A BREAK KEY. THE FUNCTION AND KEYPAD STATES ARE MUTUALLY
EXCLUSIVE. THE SEARCH IS PERFORMED IF EITHER STATE IS ACTIVE BUT
NOT BOTH STATES ACTIVE.
0463
0463
0468
046A
046F
0471
0476
0478
0478
047D
047F
0482
0484
0484
0487
048A
048A
048D
0492
0494
0496
0498
049B

F6
74
F6
74
F6
74

06 00B4 R 44
OE
06 00B4 R 40
13
06 00B4 R 04
OC

XLT40 :
TEST
JZ
TEST
JZ
TEST
JZ

KB_NMLCNTL, FUNCSTATE+KEYPAD_STATE
XL T41
; BOTH OFF - GO TEST BREAK PENDING
KB_NMLCNTL, FUNCSTATE ; ONE OR BOTH ARE ON
XLT42
; OFF - ONLY ONE ON - GO SEARCH
KB_NMLCNTL,KEYPAD_STATE ; ONE OR BOTH ARE ON
XLT42
; OFF - ONLY ONE ON - GO SEARCH

BOTH FUNCSTATE & KEYPAD_STATE ARE OFF OR ON ..•. KEYPAD INACTIVE
XL T41:
CMP
B_PEND1,O
BREAK PENDING?
JE
XLT60
NO, SKIP KEYPAD SEARCH
TEST
AH,BREAILBIT
YES, TEST FOR BREAK KEY
JZ
XLT60
MAKE KEY - SKI P KEYPAD SEARCH
XLT42 :
B9 0001
MOV
CX,OOOlH
CX <=== SEARCH KEY BRK PEND FLAG
BE 0000
MOV
SI,OFFSET KBPADL
TABLE LENGTH
XLT44 :
83 EE 02
SUB
SEARCH KEYPAD TABLE FOR MATCH
SI,2
2E: 8B 9C 0000
MOV
BX, KBPAD_TBL [SI]
GET TABLE ENTRY
3A C7
CMP
AL, BH
CHECK FOR MATCH
74 09
JE
XL T50
JMP I F MATCH FOUND
D1 E1
SHL
CX ,I
CX <=== SEARCH KEY BRK PEND FLAG
83 FE 00
CMP
IS SEARCH COMPLETE ?
SI,O
75 ED
JNE
XLT44
NO, GO CHECK NEXT ENTRY
83
74
F6
74

3E 00B5 R 00
57
C4 80
52

THIS KEY IS NOT A KEYPAD KEY.
049D

EB 37

JMP

SHORT XL T60

; GO XLATE NORMAL

A MATCH HAS BEEN FOUND IN THE KEYPAD TABLE. SET/RESET THE KEYS BREAK
PENDING FLAG THEN WRITE TO PORT 60. SEND HIDDEN CODE FIRST FOR / OR
049F
049F
04A2
04A4
04A8
04AA
04AA
04AE
04BO
04B4
04B6
04B8
04BB
04BD
04CO

F6
75
09
EB

C4 80
06
OE 00B5 R
OA

85
74
31
OA
8A
80

OE 00B5
26
OE 00B5
DC
C3
FF 4B
72 05
A2 00B9
BO ED

XLT50:
TEST
AH, BR EAILB IT
JNZ
XL T52
OR
B_PEND1,CX
JMP
SHORT XL T54
XLT52:
TEST
CX, B_PEND1
JZ
XLT60
XOR
B_PEND1, CX
XLT54: OR
BL ,AH
MOV
AL,BL
CMP
BH,NMLSLASH_SC
JB
XLT56
MOV
P60_HOLD_BYTE ,AL
MOV
AL, HI DN_CODLED

*.

BREAK KEY?
YES, GO RESET BREAK PENDING
SET KEYS BREAK PENDING FLAG
BREAK PENDING FOR THIS SPECIFIC SC
NO, JMP TO PROCESS AS BASE KEY
RESET KEYS BREAK PENDING FLAG
USE BREAK BIT FROM NMI SC
AL <=== PCl EXTENDED SC FROM TBL
/ OR * ?
NO, JUMP OUT
QUEUE P60 SC
SEND HIDDEN CODE TO P60

THE PORT 60 KEYPAD STATE IS SET OR RESET USING THE FOLLOWING RULES:
THIS KEY HAS BEEN TRANSLATED ASSUMING THE KEYPAD STATE IS ACTIVE.
A PORT 60 SHIFT STATE TEMPORARILY TOGGLES THE KEYPAD STATE. IF THE
PORT 60 SHI FT STATE IS NOT SET THE P60 KEYPAD STATE IS SET AND THE
PC1 KEYPAD SCAN CODE IS WRITTEN TO PORT 60. IF THE PORT 60 SHIFT STATE
IS SET THE P60 KEYPAD STATE IS RESET (IT WILL REVERT TO THE SET STATE IN
THE PORT 60 PROCESSING) AND THE PC1 SCAN CODE IS WRITTEN TO PORT 60.
04C2
04C2

80 OE 0017 R 20

XLT56:
OR

2-42 ROM BIOS

KB_FLAG,NUtLSTATE

; SET KEYPAD STATE

04C7
04CC
04CE
04D3

F6
74
80
EB

06 0017 R 03
3E
36 0017 R 20
37 90

TEST
JZ
XOR
JMP

KB_FLAG,LEFLSHIFT+RIGHLSHIFT ; PORT 60 SHIFT STATE ?
XLT90
; NO, GO WRITE TO PORT 60
KLFLAG,NUM_STATE
; RESET KEYPAD STATE
XL T90
; GO WRITE TO PORT 60

BASE KEYS PROCESSING
SCAN CODE IS NOT IN SPECIAL TABLES. XLATE TO PCl SCAN CODES.
AFTER TRANSLATION THE CURSOR, INSERT, AND DELETE KEYS ARE DETECTED
AND ROUTED TO THE ROUTINE THAT GUARANTEES THE PORT 60 KEYPAD STATE
IS INACTIVE. ALL OTHER KEYS ARE WRITTEN TO PORT 60.

04DC
04DE
04DE
04EO
04E2
04E4

;
; NOT A FN+KEY OR KEYPAD KEY -- GET KEY'S P60 SC
XLT60 :
AL <=== NMI SC WIO BREAK BIT
8D IE 0000 E
LEA
BX,KBNMLTBL
SCAN CODE TABLE - NMI TO PCl
2E: D7
XLAT
KBNMLTBL
XLATE NMI SCAN CD TO PCl SCAN CD
AL <=== PCl SC FROM TBL
24 7F
AND
AL, 7 FH
CLEAR TYPE BIT
XL T60_l:
3C 48
CMP
AL,48H
CURSOR, INSERT, DELETE
73 17
JAE
XLT65
YES, JUMP TO PROCESS THESE KEYS
3C 38
CMP
ALT KEY?
AL, P60-AL LSC
75 OC
JNE
XL T62
NO, JUMP AROUND

04E6
04E9
04EB
04ED
04FO

F6
74
OA
A2
BO

04F2
04F2
04F4
04F7

NOT CURSOR, INSERT, DELETE
XL T62:
OA C4
OR
AL,AH
NUM_STATE_FIX
E8 0524 R
CALL
EB 13
JMP
SHORT XL T90

04F9
04F9

OA C4

04D6
04D6
04DA

AL T KEY
C2 08
07
C4
00B9
EO

TEST
JZ
OR
MOV
MOV

DL,NMLUL LBIT3
XLT62
AL,AH
P60_HOLD_BYTE ,AL
AL,HIDNJODCEO

CURSOR, INSERT, OR DELETE KEY
XLT65 :
OR
AL,AH

R-ALT KEY?
NO, JUMP OUT
USE NMI SC BREAK BIT
QUEUE P60 AL T SC
SEND HIDDEN CODE TO P60

USE NMI SC BREAK BIT
MAKE NUM_STATE RLCT KEYPAD_STATE
GO WRITE TO PORT 60

; USE NMI SC BREAK BIT

THE CURSOR, FUNCTION+CURSOR, INSERT, AND DELETE KEYS ARE NO LONGER IN
THE KEYPAD AREA OF THE KEYBOARD. WHEN THEIR SCAN CODES ARE WRITTEN TO
PORT 60, THE PORT 60 KEYPAD STATE MUST BE INACTIVE.
A PORT 60 SHIFT STATE TEMPORARILY TOGGLES THE KEYPAD STATE. IF THE
PORT 60 SHIFT STATE IS NOT SET THE P60 KEYPAD STATE IS RESET AND THE
PCl SCAN CODE IS WRITTEN TO PORT 60. IF THE PORT 60 SHIFT STATE
IS SET THE P60 KEYPAD STATE IS SET (IT WILL REVERT TO THE RESET STATE IN
THE PORT 60 PROCESSING) AND THE PCl SCAN CODE IS WRITTEN TO PORT 60.
04FB
04FB
0500
0505
0507

80
F6
75
80

OE 0017 R 20
06 0017 R 03
05
36 0017 R 20

XLT80 :
OR
TEST
JNZ
XOR

KB_FLAG,NUM_STATE
; SET P60 KEYPAD STATE
KB_FLAG,LEFLSHIFT+RIGHLSHIFT ; PORT 60 SHIFT STATE ?
XLT90
; YES, GO WRITE TO PORT 60
KB_FLAG,NUM_STATE
; RESET P60 KEYPAD STATE

THE PCl SCAN CODE IN AL IS WRITTEN TO PORT 60
050C
050C
050D
0512
0514
0519
05lB
05lB
0520

XL T90:
FA
80
E6
80
EB

CLI
OE 00B4 R 80
60
26 00B4 R EF
08

80 26 0064 R EF
E9 0319 R

OR
OUT
AND
JMP
XLT95 :
AND
JMP

; DISABLE INTERRUPTS
KB_NMLCNTL,P60_LOADED ; SET ON PORT 60 ACTIVE STATUS
KLDATA,AL
; WRITE PCl SCAN CODE TO PORT 60
KB_NMLCNTL,NOT XLATE_BUSY
RESET BUSY FLAG
SHORT XL noo
KB_NMLCNTL,NOT XLATE_BUSY ; RESET BUSY FLAG
XL no
; REDRIVE XLATE ROUTINE

ROM BIOS 2-43

IN QUEUE
RETURN TO CALLER
0523
0523

C3

0524

XL noo:
RET

RETURN

KYBD_XL T ENDP

PROCEDURE END

SUBROUTINE NUM_STATE_FIX
THIS ROUTINE MAKES THE NUM_STATE FLAG REFLECT THE KEYPAD_STATE FLAG.
INPUT:
0524
0524
0529
052E
0530
0535
0535
0536

80
F6
74
80

26 0017 R OF
06 00B4 R 04
05
OE 0017 R 20

NONE

OUTPUT:

NUM_STATE SET OR RESET

NUM_STATLFIX PROC NEAR
AND
KB_FLAG,NOT NUM_STATE ; TURN OFF NUM_STATE
TEST
KB_NMLCNTL,KEYPAD_STATE; IS KEYPAD IN ACTIVE STATE?
JZ
NSF_RET
; NO, LEAVE NUM_STATE OFF
OR
KBJLAG,NUM_STATE; YES, TURN NUM_STATE ON
NSF_RET:

RET

C3

NUM_STATE_FIX

ENDP

THIS ROUTINE IS ACTIVATED WHEN THE NMLFLIH DETECTES AN I/O CHECK
IT CAUSES A PARITY CHECK ICON TO BE DISPLAYED ON THE ACTIVE DISPLAY AFTER
THE DISPLAY SCREEN IS CLEARED. SUSPEND IS DISABLED AND THE KEYBOARD IS
WAITING FOR A FUNCTION CONTROL DELETE KEY SEQUENCE.
0536
0536
0538
053B
0530
053F
0542
0543
0544
0547
0549
054B
0540
0540
054F

B4
AO
CD
2B
BD
OE
07
E8
E4
24
E6

00
0049 R
10
02
0000
0000
7F
F3
7F

E4 70
EB FC

CHAN_CHK
PROC
NEAR
INIT AND SET MODE FOR VIDEO
MOV
AH,O
MOV
AL, CRLMODE
CALL VI DEO_JO PROCEDURE
INT
lOH
SUB
DX,DX
SET ROW/COLUMN FOR ICON
MOV
BP ,OFFSET PAR_CHK
GET ADDRESS OF PARITY CHECK
PUSH
CS
POP
ES
ES:BP CONTAIN ICON ADDRESS
CALL
ICON_PR
DISPLAY CHECK ICON
IN
AL,PWILSTAT
; DISABLE SUSPEND NMI
AND
AL,NOT EN_SUS_NMI+HDWR_RESET ;
OUT
PWR_STAT ,AL
CHAN_STOP:
IN
AL,7DH
KEEP READING KEYBOARD
JMP
SHORT CHAN_STOP
FOR RESET SEQUENCE

0551

Real-Time Clock NMI
(RTC_ALARM_NMI)
; ***************************************************************
RTCALARM_NMI -- REAL TIME CLOCK INTERRUPT HANDLER
THIS ROUTINE HANDLES THE PERIODIC AND ALARM INTERRUPTS FROM
THE NON-VOLATILE TIMER. INPUT FREQUENCY IS 1.024 KHZ
OR APPROXIMATELY 1024 INTERRUPTS EVERY SECOND FOR THE
PERIODIC INTERRUPT. FOR THE ALARM FUNCTION, AN INTERRUPT WILL
OCCUR AT THE DESIGNATED TIME.

2-44 ROM BIOS

THE INTERRUPT IS ENABLED ONLY WHEN EVENT OR ALARM FUNCTIONS
ARE ACTIVE OR WHEN SYSTEM IS SLEEPING.
FOR THE EVENT INTERRUPT, THE HANDLER WILL DECREMENT THE
WAIT COUNTER AND WHEN IT EXPIRES WILL TURN ON THE HIGH ORDER
BIT OF THE DESIGNATED FLAG.
FOR THE ALARM INTERRUPT, THE USER ROUTINE WILL BE INVOKED
ON THE NEXT TIMER 0 INTERRUPT THROUGH INT 4AH.
ON ENTRY THE BP REGISTER POINTS TO THE LAST STACK POSITION
0551
0551
0553
0556
0558
055A
0550
055F
0560
0562

B4
E8
8A
FE
E8
22
50
A8
74

RTUILARM_NMI
PROC
MOV
AH, RTCMODE
CALL
GELRTCNMI
MOV
BH,AL
INC
AH
CALL
GELRTCNMI
AND
AL, BH
PUSH
AX
TEST
AL,PLINT
JZ
RTCINL9

OB
0747
F8
C4
0747
C7
40
25

NEAR
GET INTERRUPT MODE REGISTER
SAVE MODE
GET INTERRUPT STATUS REGISTER
MASK SOURCE WITH ENABLES
SAVE INTERRUPT CONDITIONS
CHECK FOR PERIODIC INTERRUPT
NO - GO AROUND

PERIODIC INTERRUPT HAS BEEN RECEIVED
0564
056A
056C
0571

81
73
83
73

2E 00ge R 0300
10
IE 009E R 00
16

0573
0575
0578
057A

B4
E8
24
E8

OB
0747 R
BF
0750

0570
0582
0586

80 26 OOAO R FE
C5 3E 0098 R
C6 05 80

0589
0589
058A
058C

58
A8 20
74 05

SUB
JNC
SBB
JAE

RTCLOW,0976
RTCINL9
RTCHIGH,O
RTC_INL9

DECREMENT ELAPSED TIME COUNT
SKIP HIGH BYTE
WAIT TELL ROLLS FROM 0

USERS ELAPSED TIME EVENT HAS OCCURRED
MOV
CALL
AND
CALL

AH,RTCMODE
GELRTCNMI
AL, NOT PI E_ENABLE
PULRTCNMI

GET INTERRUPT MODE CONTROL
RESET PERIODIC INTERRUPT

CLEAR EVENLWAIT ACTIVE FLAG AND SET USERS EVENT COMPLETE FLAG
RTCWAILFLAG,NOT INTERVALWAIT ; RESET INT WAIT FLAG
DI,DWORD PTR USEILFLAG ; OS: 01 <-- USERSJLAG ADDRESS
BYTE PTR [01], POSTED
SET US ERS FLAG

RTCINL9:
POP
AX
AL ,AL_INT
TEST
JZ
RTCINLI0

,
058E

AND
LOS
MOV

RETRIEVE INTERRUPT SOURCE
TEST FOR ALARM INTERRUPT
NO - GO AROUND

RTC ALARM TIME HAS BEEN REACHED - SET BIOS_STATUS FLAG TO ALARM_PEND
THIS WILL CAUSE AN INT 4AH TO BE EXECUTED ON THE NEXT TIMERO INTERRUPT

80 OE OOAO R 02

OR

RTCWAILFLAG,ALAR~PEND

; SET INT 4AH CALL PENDING

CHECK FOR UPDATE IN PROGRESS INTERRUPT (EVERY 1 SECOND)
0593
0593

A8 10

RTCINLI0:
TEST
AL,UE_INT
JFZ
RTCINL14
$+5
JNZ
JMP
RTCINL14

0595
0597

75 03
E9 0647 R

059A

E8 064A R

CALL

LOW_BALCHK

0590
059F

E4 7F
A8 40

05Al
05A3

74 03
E9 0647

IN
TEST
JFNZ
JZ
JMP

AL,PWR_STAT
AL, EXLPWR
RTCINL14
$+5
RTCINL14

; UPDATE ENDED INTERRUPT?
; JUMP IF NOT
; I F NOT ZERO JUMP AROUND JUMP
; ELSE TAKE A LONG JUMP
CHECK AND DISPLAY LOW BATTERY
MESSAGE I F NECESSARY
GET POWER STATUS
ARE WE ON EXTERNAL PWR?
JUMP I F SO
; I F NOT NOT ZERO JUMP AROUND JUMP
; ELSE TAKE A LONG JUMP

ROM BIOS 2-45

05A6
05AB

F6 06 0016 R 20
74 1A

05AD
05B2
05B3
05B4
05B7
05B9

80
IE
07
BF
B4
B9

05BC
05BC
05BF
05CO
05C2
05C4

E8
AA
FE
E2
E9

TEST
JZ

,

BIOS_STATUS,KYBD--ACTIVE ; HAS KEYBOARD BEEN ACTIVE?
RTCINL12
; JUMP I F KEYBOARD NOT ACTIVE

; RELOAD INACTIVITY COUNTS FROM RTC RAM TO SYSTEM RAM

,

26 0016 R OF

AND
PUSH
POP
MOV
MOV
MOV

0067 R
19
0004

BIOS_STATUS,NOT KYBD--ACTIVE ; RESET KBD ACTIVE FLAG
OS
; SET ES TO DATA
ES
DI,OFFSET DSP_BLANICCTR
AH, RTCLCD_INACT
; START WITH LCD INACTIVITY COUNT
CX,4
; TRANSFER 4 BYTES

RTCINL11:
CALL
GELRTCNMI
STOSB
INC
AH
LOOP
RTCINL11
JMP
RTCINL14

0747
C4
F8
0647

STORE IN COUNTER SAVE AREA
GET NEXT BYTE
EXIT LEVEL

CHECK FOR DISKETTE MOTORS ON AND IF SO THEN RELOAD COUNT
05C7
05C7
05CA
05CB
05CD

BA 03F7
EC
A8 78
74 07

05CF
0504

80 OE 0016 R 20
EB 71

RTCINL12:
MOV
DX,DRIVE_SENSE
; CHECK DISKETTE MOTOR STATUS
IN
AL,DX
;
TEST
AL, DRO_SELSENSE+DRLSEL_SENSE+DRO_MOT_SENSE +DRLMOT_SENSE
JZ
RTCINL1L1
; JUMP IF NOT
OR
JMP

BIOS_STATUS,KYBD--ACTIVE ; CAUSE RELOAD OF COUNTERS
SHORT RTCINL14
; EXIT

CHECK DISPLAY BLANK COUNT
0506
0506
05DB

83 3E 0067 R 00
74 06

0500
05El

FF OE 0067
74 36

RTCINL1L1:
CMP
DSP_BLANK_CTR, 0
JE
RTCINL13
DEC
JZ

DSP_BLANK_CTR
DSP_BLANK

CHECK SYSTEM POWER OFF COUNT
05E3
05E3
05E8
05EA
05EE
05FO
05F5

83
74
FF
74
83
75

3E 0069 R 00
50
OE 0069
46
3E 0069
IE
50

05F7
05FA
05FD
0600
0603
0606
0609
060B
060E
0611
0614
0617

E8
E8
BB
B9
E8
B9
E2
BB
B9
E8
E8
EB

;
076E R
0759 R
003C
0081
0000
050A
FE
0030
00A1
0000
0762
2E

RTCINL13:
CMP
SYS_OFFJTR,O
JE
RTCINL14
SYS_OFF_CTR
DEC
JZ
DEACLSYSTEM
CMP
SYS_OFF_CTR,30
JNE
RTCINL14

AT THE 30 SECOND MARK?
NO THEN EX IT

30 SECONDS TO POWER OFF SO RING ALARM
CALL
CALL
MOV
MOV
CALL
MOV
LOOP
MOV
MOV
CALL
CALL
JMP

NMLCYCLE
SPKR_ON
BX,60
CX,129
KB_NOISE
CX,5*MS_DELAY

CYCLE NMI AND RESTORE INT FLAGS
TURN ON SPEAKER
TONE LENGTH (60 MSECS)
1/2 CYCLE FREQUENCY FOR 1KHZ TONE
SOUND BEEPER
DELAY BETWEEN SOUNDS

$
BX,48
CX,161
KB_NOISE
SPKR_RESTORE
SHORT RTCINL14

TONE LENGTH (60 MSECS)
1/2 CYCLE FREQ FOR 800 HZ TONE
SOUND BEEPER
RESTORE SPEAKER STATE
EXIT

LCD/CRT MUST BE BLANKED
0619
0619
061B
0610
061F
0621

BO
E6
E4
24
E6

00
74
75
BF
75

DSP _BLANK:
MOV
OUT
IN
AND
OUT

2-46 ROM BIOS

AL,O
LCD_INDX,AL
AL,LCD_DATA
AL, NOT PANEL_ENABLE
LCD_DATA,AL

TURN OFF PANEL

0623
0626
0629
062B
0620
062F
0634

E8
B9
E2
24
E6
80
EB

076E R
64C8
FE
OF
75
OE 0016 R 80
11

CALL
MOV
LOOP
AND
OUT
OR
JMP

NMLCYCLE
CYCLE NMI , RESTORE INT FLAGS
CX,100*MS_DELAY
$
AL, NOT SYNCENABLE
TURN OFF SYNCS FOR POWER
LCD_DATA,AL
,
BIOS_STATUS,DSP_BLANKED ; SET DISPLAY BLANKED STATUS
SHORT RTCINL14
; EXIT

TURN OFF SYSTEM
0636
0636
063B
0630
063F
0641
0643
0645

80
E4
24
OC
E6
OC
E6

OE 0016 R 40
7F
F7
04
7F
02
7F

DEACLSYSTEM:
OR
BIOS_STATUS,F_RESUME ; INDICATE FORCED RESUME MODE
IN
AL,PWILSTAT
GET POWER STAT/CNTL REG
AND
AL, NOT HDWR_RESET
TURN OFF RESET FLAG
OR
AL, EN_SUS_NMI
ENABLE SYSTEM SUSPEND NMI
OUT
PWILSTAT ,AL
OR
AL, REQ_POFF
REQUEST POWER OFF
OUT
PWR_STAT ,AL

EXIT FROM RTC INTERRUPT
0647
0647

RTCINLI4:
JMP
NMIH_EXIT

E9 0050 R

064A

RTCALARM_NMI

RETURN TO FIRST LEVEL HANDLER

ENDP

Low Battery Check (LOW_BAT_CHK)
; **************************************************************************
LOW BATTERY CHECK
THIS ROUTINE CHECKS FOR A LOW BATTERY CONDITION AND IF DETECTED WILL ISSUE
A WARNING. THE LOW BATTERY WARNING WILL OCCUR AFTER TWO CONSECUTIVE LOW
BATTERY SENSES, NO EXTERNAL POWER SUPPLIED AND THE LOW BATTERY WARNING
FLAG IS ENABLED IN SYSTEM PROFILE. THE WARNING ISSUED WILL SOUND THREE
SHORT BEEPS, FLASH THE SCREEN ON AND OFF AT AN ONE SECOND INTERVAL AND
EXECUTE A PAUSE. THE PAUSE WILL HOLD UP ALL MAIN LEVEL PROCESSING AND
LOCK OUT NON- I NTERRUPT DR I VEN PROCESS I NG. ONCE TH E USER ACKNOWLEDGES THE
WARNING, EITHER BY PRESSING A KEY OR APPLYING EXTERNAL POWER, THE SCREEN
FLASHING WILL STOP AND MAIN LEVEL PROCESSING WILL CONTINUE.
AT SUCCESSIVE TWO MINUTE INTERVALS, THE LOW BATTERY WARNING WILL BE
REISSUED IF THE LOW BATTERY CONDITION STILL EXISTS OR EXTERNAL POWER HAS
NOT BEEN APPLIED. IF TWO MINUTES HAVE ELAPSED AND THE WARNING HAS NOT BEEN
ACKNOWLEDGED, THE APPLICATION WILL BE SUSPENDED AND THE SYSTEM POWERED OFF.
THIS ROUTINE IS CALLED BY THE RTCALAR~NMI ROUTINE EVERY ONE SECOND TO CHECK
ON THE BATTERY CONDITION. IF LOW BATTERY IS DETECTED, THIS ROUTINE WILL
CALL WAIT ON EXTERNAL EVENT. THIS WILL ALLOW THE SYSTEM TO SLEEP WHILE
WAITING FOR A KEY TO BE PRESSED. WHILE WAITING, THE ONE SECOND INTERRUPT CAN
OCCUR AGAIN CAUSING THE LOW BATTERY CHECK ROUTINE TO BE CALLED AGAIN. SO
THIS ROUTINE IS RECURSIVE.
LOW BATTERY CHECK IS DISABLED DURING POST

; ******************************************************************************

064A
064A

F6 06 0012 R 01

064F
0651
0654
0656
0658
065A
065C
065E
0660

74
E9
E4
A8
74
A8
75
B4
E8

03
0746 R
7F
80
lC
40
18
17
0747

LOW_BALCHK
PROC
NEAR
TEST
POSLSTATUS, POSLACTIVE ; IS POST CURRENTLY ACTIVE?
J FNZ
LOWBEND
YES, JUMP TO END
JZ
$+5
IF NOT NOT ZERO JUMP AROUND JUMP
JMP
LOWBEND
ELSE TAKE A LONG JUMP
IN
AL,PWR_STAT
GET POWER INTERFACE
TEST
AL,LOW_BAT
LOW BATTERY SIGNAL ON?
JZ
LO
NO LOW BATTERY SIGNAL - JUMP TO END
TEST
AL, EXLPWR
I S EXTERNAL POWER SUPPLI ED?
JNZ
LO
YES EXTERNAL POWER - JUMP TO END
MOV
AH,RTCSYS_PROFI
CALL
GELRTCNMI
GET SYSTEM PROFILE

ROM BIOS 2-47

0663
0665
0667
066C
066E
0673
0676

A8
74
F6
75
80
E9

40
OF
06 0015 R 20
23
OE 0015 R 20
0746 R

0676
067B
0670
0682
0685

F6
75
80
E9

0685
0687

A8 40
74 08

TEST
JZ
TEST
JNZ
OR
JMP

AL, LOWBALENABLE
; LOW BATTERY MESSAGE WANTED
LO
; NO MESSAGE WANTED - JUMP TO END
BALSTATUS,LOW_BALPEND ; FIRST LOW BAT SIGNAL?
Ll
; NO, ALREADY 2 CONSECUTIVE SIGNALS
BALSTATUS,LOW_BALPEND ; YES, SET WAITING FOR 2ND SIG
LOWBEND
; EXIT

LO:
BATTERY NOT LOW OR EXTERNAL POWER IS APPLIED
06 0015 R 80
08
26 0015 R OF
0746 R

TEST
JNZ
AND
JMP
LO--A :

BALSTATUS,LOW_BALSIG ; WAS LOW BTRY ALREADY SIGNALLED
LO--A
; YES, JUMP
BALSTATUS,NOT LOW_BALPEND ; TURN OFF LOW BTRY PENDING
LOWBEND
; JUMP TO EX IT

LOW BATTERY HAS BEEN SIGNALLED. IF EXTERNAL PWR APPLIED RESET THE WARNING.
TEST
JZ

AL, EXLPWR
Ll

; IS EXTERANL POWER APPLI ED?
; NO, JUMP TO WARNING

BATTERY WAS LOW BUT EXTERNAL POWER APPLIED.
TURN OFF WAITING FOR KEY AND LOW BATTERY WARNING SIGNALED FLAGS.
JUMP TO TURN ON PANEL POWER.
0689
068E

80 26 0015 R IF
E9 073C R

AND
JMP

BALSTATUS, NOT LOW_BAT_SI G+LOW_BAT_HOLD+LOW_BAT _PEND;
L_PANEL_ON
; ENABLE PANEL BEFORE EXITING

BATTERY IS LOW WITH NO EXTERNAL POWER AND WARNING ENABLED

Ll:

0691
0691
0696

F6 06 0015 R 80
74 2B

0698
0690

F6 06 0015 R 40
74 OC

TEST
JZ

BALSTATUS,LOW_BALSIG ; LOW BTRY ALREADY SIGNALLED?
NO, GO SIGNAL LOW BATTERY

L3

LOW BATTERY HAS ALREADY BEEN SIGNALLED
TEST
JZ

BALSTATUS,LOW_BALHOLD ; ARE WE IN HOLD STATE ?
L2
; NO, JUMP AROUND SCREEN TOGGLING

TOGGLE SCREEN ON AND OFF WHILE WAITING FOR A KEY TO BE PRESSED(HOLD STATE).
069F
06Al
06A3
06A5
06A7
06A9

BO
E6
E4
34
OC
E6

00
74
75
40
20
75

MOV
OUT
IN
XOR
OR
OUT

AL,LCD_FUNCT
LCD_INDX ,AL
AL,LCD_DATA
AL, PANEL_ENABLE
AL, SYNCENABLE
LCD_DATA,AL

DECREMENT 2 MINUTE COUNTER. IF COUNTER
WARN I NG AGAI N I F KEY HAS BEEN PRESSED.
BEEN PRESSED, TURN OFF WAITING FOR KEY
FOR KEY LOOP TO BE EXITED AND THEN SET
06AB
06AB

FE OE 0093

06AF
06Bl
06B4
06B9
06BB
06CO

74
E9
F6
74
80
E9

ACCESS LCDC CONTROL REGISTER
READ LCDC CONTROL REGISTER
TOGGLE PANEL ON AND OFF
FORCE SYNCS ON
ISSUE LCDC CONTROL REG COMMAND
GOES TO 0 SIGNAL LOW BATTERY
I F COUNTER = 0 AND A KEY HAS NOT
FLAG. THIS WILL CAUSE THE WAITING
UP THE SYSTEM TO SUSPEND.

L2:
DEC
JFNZ
JZ
JMP
TEST
JZ
AND
JMP

03
0746 R
06 0015 R 40
08
26 0015 R 3F
0746 R

LOW_BALCTR
COUNT DOWN 2 MINUTE COUNTER
LOWBEND
NOT 0, SO EXIT
I F NOT NOT ZERO JUMP AROUND JUMP
$+5
LOWBEND
; ELSE TAKE A LONG JUMP
BALSTATUS,LOW_BALHOLD ; HAS KEY BEEN PRESSED?
L3
; YES, SIGNAL WARNING AGAIN
BALSTATUS,NOT LOW_BALSIG + LOW_BALHOLD ; NO KEY,
LOWBEND
; TURN OFF FLAG AND EXIT

SIGNAL LOW BATTERY WARNING
CHECK FOR ANY INTERRUPTS IN SERVICE BEFORE SIGNALING LOW BATTERY
06C3
06C3
06C5
06C7
06C9
06C8

L3:
BO
E6
E4
OA
74

OB
20
20
CO
06

2-48 ROM BIOS

MOV
OUT
IN
OR
JZ

AL,OBH
INTAOO,AL
AL,INTAOO
AL,AL
L4

GET INTERRUPT IN SERVICE REG
INTERRUPT CONTROLL ER PORT
READ INTERRUPT IN SERVICE REG
ANY INTERRUPTS IN SERVICE
IF ZERO - NONE IN SERVICE

06CD
0601

FE 06 0093 R
EB 73

INC
JMP

LOW_BALCTR
SHORT LOWBEND

; NO INTERRUPTS IN SERVICE.

; PROCESS INTERRUPT

SIGNAL LOW BATTERY.

0603
0603

L4:
80 OE 0015 R 80

OR

BALSTATUS,LOW_BALSIG ; SET LOW BTRY SGNL FLAG ON

0608

E8 076E R

CALL

NMLCYCLE

; CYCLE NMI AND RESTORE INT FLAGS

SOUND THE 3 BEEPS
06DB
06EO
06E3
06E6
06E9
06E9
06EA
06ED

C6
B9
E8
BB

06FO
06F2
06F4
06F5
06F7
06FA
06FC
06FE
0700

2B
E2
59
E2
E8
E4
24
E6
80

06 009 R 78
0003
0759 R
OODF

51
B9 0090
E8 0000

MOV
LOW_BALCTR,120
MOV
CX,3
CALL
SPKR_ON
MOV
BX,223
LOW_BEEP_LOOP:
PUSH
CX
MOV
CX,144
CALL
KB_NOISE

C9
FE
F2
0762
61
F7
61
OE 001

SUB
LOOP
POP
LOOP
CALL
IN
AND
OUT
OR

R 40

SET 2 MINUTE COUNTER
3 BEEPS - LOOP COUNT
FORCE SPEAKER ON
SHORT BEEP (.25 SECONDS)
SAVE LOOP COUNT
1/2 CYCLE FOR 890 HZ TONE
SOUND SPEAKER

CX,CX

$

250 MS OELAY BETWEEN BEEPS
CX
RESTORE LOOP COUNT
LOW_BEEP _LOOP
SPKR_RESTORE
RESTORE SPEAKER ENABLE
AL,NMLCNTL
AL,NOT DISJ.LARM
RE-ENABLE ALARM NMI
NMLCNTL,AL
BALSTATUS,LOW_BALHOLD ; SET BIT FOR WAITING FOR KEY

THIS LOOP WAITS FOR A KEY TO BE PRESSED. WHILE WAITING THE SYSTEM SLEEPS.
ALSO, WHILE WAITING IN THIS LOOP, THE INTERRUPTS WILL BE PROCESSED. THE
UPDATE ENDED INTERRUPT WHICH CALLS THE LOW BATTERY ROUTINE WILL INTERRUPT
OUT EVERY SECOND. TO EXIT THIS LOOP, EITHER A KEY IS PRESSED, EXTERNAL
POWER IS APPLIED OR THE TWO MINUTE COUNTER GOES TO O. BY APPLYING EXTERNAL
POWER (SEE LOJ.) OR BY THE TWO MINUTE COUNTER GOING TO 0 (SEE L2) WILL
FORCE OFF THE WAITING FOR KEY FLAG. IF THE TWO MINUTE COUNTER GOES TO 0,
THE SYSTEM WILL SET UP TO SUSPENO.
0705

; LOOP UNTIL KEY PRESSED

0705
0708
070B
070C
0700
0710

B8
BB
1E
07
BF
CD

4104
4000

0712
0717
0719
071B
071B
0720
0722
0725
0727

F6 06 0015 R 40
74 02
EB EA

0015 R
15

MOV
MOV
PUSH
POP
MOV
INT

AX,4104H
; FUNCTION 41H, AL=04=RETURN IF ZERO
BX, LOW_BALHOLD*100H ; BH=LOW_BALHOLD, BL=O=NO TIME OUT
OS
; MAKE ES:DI POINT TO BALSTATUS
ES
,
DI,OFFSET BALSTATUS ;
15H
; SLEEP UNTI L KEY HIT

TEST
JZ
JMP

BALSTATUS,LOW_BALHOLD ; BIT IS OFF IF KEY WAS PRESSED
L5
KEY PRESSED EXIT LOOP
LOW_KB_LOOP
KEEP LOOPING

CMP
JNE
MOV
SUB
OUT

LOW_BALCTR,O
L6
DX,ORIVE_CNTL
AL,AL
DX,AL

L5:
80
75
BA
2A
EE

3E 0093 R 00
12
03F2
CO

CTR = 0 FORCE SUSPEND SET UP
NO, JUMP ON
TURN OFF DISKETTE MOTORS

THESE VARIABLES ARE INITIALIZED TO VALUES THAT CAUSES THE SYSTEM TO TURN
OFF WHEN RETURNING TO CALLER(RTCJ.LARM_NMI).
0728
072E
0734
0734
0737
073C
073C
073E
0740
0742

C7 06 0067 R 0000
C7 06 0069 R 0001

MOV
MOV

DSP_BLANK_CTR,O
SYS_OFF_CTR,1

CALL
AND

KEY PRESSED OR CTR=1
DISABLE_NMI
; DISABLE NMI
BALSTATUS,NOT LOW_BALPEND ; TURN OFF LOW BAT PEND FLAG

L6:
E8 0000 E
80 26 0015 R OF
BO
E6
E4
OC

00
74
75
60

L_PANEL_ON:
TURN PANEL ON BEFORE EXITING
MOV
AL, LCDJUNCT
OUT
LCD_INDX,AL
ACCESS LCDC CONTROL REGISTER
IN
AL,LCD_DATA
; READ LCDC CONTROL REGISTER
OR
AL,PANEL_ENABLE+SYNCENABLE ; FORCE PANEL ON

ROM BIOS 2-49

0744
0746
0746
0747

E6 75

OUT
LCD_DATA,AL
LOW BEND :
RET
LOW_BALCHK
ENDP

C3

ISSUE LCDC CONTROL REG COMMAND
RETURN TO CALLER

; *****************************************************
; GET RTC REGISTER WHEN ON NMI LEVEL
; INPUT AH= REGISTER #
OUTPUT AL = REGISTER DATA
0747
0747
0749
074B
074D
074F
0750

; *****************************************************
86
E6
86
E4
C3

GELRTCNMI PROC NEAR
XCHG
AH,AL
OUT
RTCR_PORT ,AL
XCHG
AL ,AH
IN
AL, RTCD_PORT
RET
GELRTCNMI ENDP

EO
70
C4
71

OUTPUT REGISTER #
GET DATA

; *****************************************************
; PUT RTC REGISTER WHEN ON NMI LEVEL
; INPUT AH= REGISTER #, AL = REGISTER DATA OUTPUT: RTC RAM MODIFIED
0750
0750
0752
0754
0756
0758
0759

; *****************************************************
86
E6
86
E6
C3

PULRTCNMI PROC NEAR
XCHG
AH ,AL
OUT
RTCR_PORT ,AL
XCHG
AL ,AH
OUT
RTCD_PORT, AL
RET
PULRTCNMI ENDP

EO
70
C4
71

; **********************************

; FORCE SPEAKER ENABLE ON
; ON EXIT AH HAS OLD SPEAKER CONDITION

0759
0759
075B
075D
075F
0761
0762

; **********************************
E4
8A
OC
E6
C3

SPKR_ON PROC
NEAR
IN
AL,NMLCNTL
MOV
AH,AL
OR
AL, EN_SPKR
OUT
NMLCNTL,AL
RET
SPKR_ON ENDP

61
EO
04
61

FORCE SPEAKER ON

; **********************************
; RESTORE SPEAKER TO PREVIOUS STATE
; ON INPUT AH HAS OLD SPEAKER CONDITION
0762
0762
0765
0767
0769
076B
076D
076E

; **********************************
80
E4
24
OA
E6
C3

SPKfLRESTORE PROC NEAR
AND
AH, EN_SPKR
IN
AL,NMLCNTL
AND
AL, NOT EN_SPKR
OR
AL,AH
OUT
NMLCNTL,AL
RET
SPKR_RESTORE ENDP

E4 04
61
FB
C4
61

RESTORE SPEAKER CONTROL

; *******************************************
NMLCYCLE: THIS CODE DISABLES
AND RE-ENABLES THE NMI BEFORE RESTORING
THE INTERRUPT FLAGS TO THEIR PREVIOUS
STATE.
, ALL REGISTERS PRESERVED EXCEPT FLAGS
076E
076E
076F
0771
0773
0775
0777
077C
077E
077F
077F
0781
0782
0783

; ********************************************
50
BO
E6
EB
OC
F7
74
FB

07
72
00
20
46 16 0200
01

E6 72
58
C3

NMLCYCLE PROC NEAR
PUSH
AX
;
MOV
AL, DI SA BL CSL EEP+CLOCICRUN
DISABLE GLOBAL NMI
OUT
CLOCICCTL ,AL
JMP
$+2
DELAY
OR
AL, GLOBAL_NMI
RE-ENABLE NMI' S
TEST
FLGSAVE [BP], LFLAG
CHECK FOR INTERRUPTS ON
JZ
NMLCI
I F NOT THEN DON'T ENABLE
STI
ALLOW I NTERRUPTS AFTER
NMLCI :
OUT
CLOCICCTL ,AL
ENABLE NMI INSTRUCTION
POP
AX
RET
NMLCYCLE ENDP

2-50 ROM BIOS

INCLUDE SUSPEND. INC
SUBTTL SUSPEND SYSTEM STATE

; **************************************************************************
SUSPEND
THIS ROUTINE IS ACTIVATED WHEN THE NMLFLIH DETECTES A SYSTEM SUSPEND NMI.

,

DATE LAST MODIFIED: 09/12/85

; **************************************************************************
; **************************************************************************
;LOCAL

EQUATES

; **************************************************************************
PUBLIC
EXTRN
EXTRN

RESUME
COM....POWER: NEAR
MODEM_CONFIG:NEAR

SUSPEND_COLOR
SUSPENDJ10NO
INILDISP

B9CO
BICO
0030

EQU
EQU
EQU

OB9COH
OBICOH
30H

SUSPEND SAVE AREA IN FONT
SAVE FOR WHEN IN MONO
INITIAL VIDEO BITS OF EQUIP_FLAG

TABLE OF LCD REGISTER ADDRESSES THAT MUST BE SAVED AND RESTORED
0783
0783
078C

010609 OA OB OC
00 OE OF
12 1415 16 17 18
19 lA IB lC 10

= 0014

LCDILTABLE
LABEL
BYTE
DB
1,6,9,OAH,OBH,OCH,ODH,OEH,OFH
DB

12H,14H,15H,16H,17H,18H,19H,IAH,IBH,ICH,IDH

LCDILLENGTH
ASSUME

EQU

$-LCDIL TABLE

OS: DATA

Suspend NMI (SUSPEND)
0797
0797
0790
07Al
07A4
07A5
07A7
07A9
07AB
07AD
07AF
07Bl
07B3

C7
8B
83
EC
8A
BO
E6
E4
8A
24
E6
2A

06 0072 R 0000
16 0063 R
C2 04
E8
00
74
75
F8
BF
75
DB

SUSPEND PROC
NEAR
MOV
RESELFLAG,O
MOV
OX ,ADD1L6845
ADD
DX,4
IN
AL,DX
MOV
CH,AL
AL, LCD_FUNCT
MOV
OUT
LCD_INDX,AL
IN
AL,LCD_DATA
MOV
BH,AL
AND
AL,NOT PANELENABLE
LCD_DATA,AL
OUT
SUB
BL, BL

CLEAR RESELFLAG
OFFSET TO DISPLAY MODE ADDRESS
GET CURRENT MODE (LCD ONLY)
CH <-- CURRENT DISPLAY MODE
SELECT LCD CONTROL REGISTER
BH <--- CURRENT LCD CONTROL
TURN OFF LCD PANEL
BL

<---

SUSPEND ERROR FLAGS

TEST FOR LCD OPERABLE I. E. CAN BE USED AS ACTIVE OR ALTERNATE DISPLAY
07B5
07B7
07BA
07BC
07BF
07Cl
07C4
07C7
07CA

B4
E8
8A
F6
75
BA
BF
F6
75

20
0747
C8
Cl 01
15
03B4
BICO
Cl 02
10

MOV
CALL
MOV
TEST
JNZ
MOV
MOV
TEST
JNZ

AH, RTCDSP _CON
GELRTCNMI
CL,AL
CL, DSP_CLCD
SUS_OOO
OX, MONO_CNTL-4
01 ,SUSPEND_MONO
CL, DSPJ1LCD
SUS_OOI

GET LCD CONFIG FLAG

AL, DSPJ10NO+DSP _CGA
AL, DSP _MONO+DSP _CGA
SUS_002

SAVE ONLY OTHER DISPLAY INFO
ARE BOTH DISPLAYS ATTACHED?
IS SO THEN CANNOT SUSPEND

CL <--- RTCDSP _CON FLAGS
TEST LCD STATE
JUMP IF LCD IS CGA
ASSUME LCD I S MONO
01 <-- SAVE AREA SEGMENT
TEST LCD STATE
JUMP I F LCD I S MONO

LCD NOT ACTIVE

OlCC
07CE
0700

24 OC
3C OC
74 33

AND
CMP
JE

ROM BIOS 2-51

0702
0704

A8 04
75 06

TEST
JNZ

AL,DSP_CGA
SUS_OOI

; CGA DISPLAY ONLY?
; IF YES LEAVE LCD AS MONO

MONO DISPLAY OR LCD AS CGA SO SET CGA ACCESS
0706
0706
0709

BA 0304
BF B9CO

SUS_OOO:
MOV
MOV

DX, CGA_CNTL-4
01 ,SUSPEND_COLOR

01

07DC
07DC
07EO

39 16 0063 R
74 25

SUS_OOI :
CMP
JE

ADDfL6845, OX
SUS_003

IS LCD THE ACTIVE DISPLAY?
I F SO THEN OKAY

07E2
07E6
07E8
07EB
07EO

8A
B4
E8
8B
A8

CH <--- MODE SET FOR CRT
GET DISPLAY STATUS

CALL
MOV
TEST

CH,CRLMODLSET
AH,RTCDSP_STAT
GELRTCNMI
SI,AX
AL, DIAG_FORCE_SUS

07EF

74 14

JZ

SUS_002

2E 0065
22
0747 R
FO
80

MOV

MOV

<--

SAVE AREA SEGMENT

SI LOW <--- RTCDSP_STAT
CHECK RTCDSP _STAT FLAGS FOR DIAG
RESUME
I F NOT THEN SUSPEND ERROR

SETUP LCD CONTROLLER FOR ACCESS
07Fl
07F4

F6 C7 08
75 11

07F6
07F8
OlFC
07FE

BO
81
74
OC

0800
0800
0802

E6 75
EB 03 90

TEST
JNZ

BH, LCD_ENAB
SUS_003

; CHECK FOR LCD ENABLED
I F SO THEN ALREADY ACCESSED

LCD NOT ACTIVE SO SET ACTIVE FOR ACCESS

MOV

08
FF BICO
02
02

CMP
JE
OR
SUS_OOlA:
OUT
JMP

AL, LCD_ENAB
01 ,SUSPEND~ONO
SUS_OOlA
AL,LCD_CGA

SET ENABLE
CHECK FOR LCD AS MONO
JUMP IF SO
OTHERWISE SET LCD AS CGA

LCD_DATA ,AL
SUS_003

WRITE TO LCD CONTROL

SET SUSPEND UNSUCCESSFUL DUE TO LCD INACCESSABI L ITY
0805
0805

B3 02

SUS_002:
MOV

BL ,LCD_NOLACTIVE

SET FLAG - FOR LCD INOPERABLE, THIS
WILL NOT BECOME AN ERROR

CHECK FOR DISKETTE MOTORS OFF
0807
0807
0808
080B
080C
080E

52
BA 03 F7
EC
A8 78
74 09

0810
0813
0815
0816

BA 03 F2
2A CO
EE
80 CB 01

SUS_003 :
PUSH
MOV
IN
TEST
JZ

OX
; SAVE LCD ADDRESS
OX, DRIVE_SENSE
; READ DRIVE STATUS
AL,DX
AL ,DRO_S EL_SENS E+DRLS EL_S ENS E+DRO_MOLS ENS E+DR l~OT _SENS E
SUS_004

DISKETTE MOTORS NOT OFF/TURN THEM OFF AND SET ERROR FLAG

MOV
SUB
OUT
OR

DX,DRIVE_CNTL
AL,AL
DX,AL
BL,DSKLACTIVE

DISKETTE CONTROL
SET ERROR FLAG

TURN OFF CGA DISPLAY VIDEO
0819
0819
081B
081E

2A CO
BA 0308
EE

081 F
0821
0824
0825

FE CO
BA 03B8
EE
5A

SUS_004:
SUB

MOV
OUT

AL,AL
OX, CGA_CNTL
DX,AL

DISABLE VIDEO COLOR

TURN OFF MONO DISPLAY VIDEO
INC

MOV
OUT
POP

AL
DX ,MONO_CNTL
DX,AL
OX

DISABLE VIDEO ON MONO
RESTORE LCD ADDRESS

SAVE REAL TIME CLOCK INTERRUPT MODE AND TURN OFF ALL BUT ALARM INTERRUPTS

2-52 ROM BIOS

0826
0828
082B

84 OB
E8 0747
8A FO

MOV
CALL
MOV

082D
082F
0832
0834

24
E8
FE
E8

AND
CALL
INC
CALL

; DH <-- RTC INTERRUPT MODE
; DL <-- LOW ORDER LCD ADDRESS
AL,NOT PILENABLE+UIE_ENABLE ; DISABLE INTS
PULRTCNMI
AH
; READ LAST INTERRUPT STATUS
; TO CLEAR IT
GELRTCNMI

0837

F6 06 OOAO R 04
74 OD

TEST
JZ

RTCWAILFLAG,PON-.ALRM-PEND ; IS POWER ON PENDING?
SUS04A

80
E4
24
OC
E6

AND
IN
AND
OR
OUT

RTCWAILFLAG,NOT PON-.ALRM_PEND ; RESET FLAG
AL,PWILSTAT
AL, NOT HDWR_RESET
; TURN OFF RESET FLAG
AL, EN_PON-.ALRM
; ENABLE POWER ON BY ALARM
PWR_STAT, AL

083C
083E

0843
0845

0847
0849

AF
0750 R
C4
0747 R

26 OOAO R FB
7F
F7
01
7F

AH,RTCMODE
GELRTCNMI
DH,AL

CHECK SYSTEM PROFILE FOR RESUME OPTION ENABLE OR FORCED RESUME
084B
084B
0850

0852
0854
0857

0859

F6
75
B4
E8
A8
74

06 0016 R 40
09
17

0747
80
IB

SUS04A:
TEST
JNZ
MOV
CALL
TEST
JZ

BIOS_STATUS, F_RESUME ; IS A FORCED RESUME REQUESTED?
SUS_04B
JUMP I F YES
AH,RTCSYS_PROFl
GET SYSTEM PROFI LE
GELRTCNMI
AL, RESUMLENABLE
SYSTEM TO BE RESUMED?
SUS_04D
JUMP I F YES

SET DIAGNOSTIC FLAGS IN RTC AREA
085B
085B
085D
0860

AH, RTCDIAG_STAT
UPDATE DIAGNOSTIC STATUS
GELRTCNMI
AL, BL
SET FLAGS
BL, BL
ANY ERRORS?
SUS_04E
; NO THEN SKIP SAVE
CL, DSP _CLCD+DSP --.MLCD ; I F LCD INOPERABLE, THEN RESET
SUS_04C
; ERROR FLAG
SI, DIAGJORCE_SUS
; CHECK FOR FORCE SUSPEND
SUS_04D
; I F NO LCD AND NO FORCE SUSPEND
; THEN DO NOT LOG ANY ERRORS
AL,NOT LCD_NOLACTIVE ; RESET LCD NOT ACTIVE FLAG

0866
0869
086B
086F

0871

24 FD

0873
0873

E8 0750

SUS_04C:
CALL

PULRTCNMI

E9 092C R

SUS_04D:
JMP

SUSP _HL T

0862
0864

OE

SUS_04B:
MOV
CALL
OR
OR
JZ
TEST
JNZ
TEST
JZ

B4
E8
OA
OA
74
F6
75
F7
74

0747
C3
DB
13
Cl 03
08
C6 0080
05

0876

0876

AND

YES THEN DO NOT SUSPEND

CH CONTAINS LCD CONTROL SAVE, BX CONTAINS SUSPEND SEGMENT ADDRESS
0879

0879
087B
0870

8A CF
8E C7
2B FF

087F
0881
0883

E4 75
OC 10
E6 75

SUS_04E:
MOV
MOV
SUB
IN
OR
OUT

CL,BH
ES, DI
DI,DI

CL <--- CURRENT LCD CONTROL
SET SEGMENT
CLEAR DESTINATION OFFSET

AL,LCD_DATA
AL,LCDJONT
LCD_DATA,AL

GET LCD CONTROL
SET FONT ACCESS FLAG

SAVE STACK SEGMENT AND POINTER
0885
0887
0888
088A

8C DO
AB
8B C4
AB

MOV
STOSW
MOV
STOSW

AX,SS

SAVE STACK SEGMENT

AX,SP

SAVE STACK POINTER

SAVE REAL TIME CLOCK INTERRUPT MODE
088B
088D

8A C6
AA

MOV
STOSB

AL,DH

; SAVE RTC INTERRUPT MODE

SAVE LCD SYSTEM CONTROL,MODE CONTROL, AND PARAMETER REGISTERS

ROM BIOS 2-53

088E
0890
0891
0894
0897

8B
AB
BE
B9
B6

0783 R
0014
03

C1

MOV
STOSW
MOV
MOV
MOV

0899
0899
089C
089D
089E
089F
08AO
08A1
08A2

2E: 8A 04
46
EE
42
EC
AA
4A
E2 F5

SUS_005:
MOV
INC
OUT
INC
IN
STOSB
DEC
LOOP

AX,CX

; SAVE LCD MODE CONTROL

SI,OFFSET LCDR_TABLE ; SAVE LCD REGISTERS
CX, LCDR_LENGTH
DH,03
SET HIGH ORDER LCD ADDRESS
LOW ORDER ALREADY SET
AL,CS: [SI]
SI
DX,AL
DX
AL, DX

; GET REGISTER #
BUMP PO INTER
SET REGISTER #
GET DATA PORT
SAVE

DX
SUS_005

CONTINUE

SAVE TIMER 0 AND TIMER 2 I NFORMATION
08A4
08A6
08A9
08A9
08AB
08AO
08AE
08BO
08B1
08B3
08B4
08B6

BO 50
B9 0002
E6
E4
AA
E4
AA
E4
AA
BO
E2

43
43
40
42
DO
F1

MOV
MOV
SUS_006 :
OUT
IN
STOSB
IN
STOSB
IN
STOSB
MOV
LOOP

AL,50H
CX ,2

SELECT TIMER 0 AND LSB
LOOP NUMBER

TIMER_CTL,AL
AL, TIMER_CTL

GET TIMER 0/2 MODE

AL, TIMERO

GET TIMER 0 LSB/MSB

AL, TIMER2

GET TIMER 2 LSB/MSB

AL ,OOOH
SUS_006

SELECT TIMER 2 AND MSB

SAVE INTERRUPT CONTROLLER STATE
08B8
08BA
08BB
08BD
08BF
08C1
08C2
08C4
08C6
08C8

E4 21

IN
STOSB
MOV
OUT
IN
STOSB
MOV
OUT
IN
STOSB

AA
BO
E6
E4
AA
BO
E6
E4

04
72
63
44
72
63

AA

AL,INTA01

GET INTERRUPT MASK

AL,04
CLOCLCTL ,AL
AL,63H

SELECT INTERRUPT BYTE 0

AL ,44H
CLOCLCTL,AL
AL,63H

SELECT INTERRUPT BYTE 1

SAVE BYTE 0

SAVE BYTE 1

SAVE INTERRUPT 0-32 VECTORS
08C9
08CC
08CE
0801
08D4

B8
8E
BE
B9

0000
D8
0000
0040
F31 A5

08D6
08D9
08DA

BE 0110
A5
A5

MOV
MOV
MOV
MOV
REP

AX,O
DS,AX
SI,O
CX ,64
MOVSW

SET OS SEGMENT 0
SAVE 32 VECTORS

SAVE INTERRUPT VECTOR 44H
MOV
MOVSW
MOVSW

SI,44H*4

SAVE VECTOR 44H

SAVE DATA AREA FROM 0300-053A
08DB
08DE
08E1

B9 OllE
BE 0300
F31 A5

08E3
08E5

E4 7C
AA

08E6
08E8

E4 AO
AA

MOV
MOV
REP

CX,llEH
SI,0300H
MOVSW

SET MOVE LENGTH
SET SOURCE ADDRESS

SAVE KEYBOARD AND FEATURE CONTROL REGISTER
IN
STOSB

AL, KYBD_CNTL

SAVE 110 CHANNEL CHECK FLAG

2-54 ROM BIOS

IN
STOSB

AL,IONMLCNTL

SAVE NMI AND SPEAKER CONTROL REGISTER
08E9
08EB
08EC
08EE

E4 61
AA
BO 00
E6 61

IN
STOSB
MOV
OUT

AL,NMLCNTL
AL,O
NMLCNTL ,AL

; DISABLE SPEAKER

SAVE COMMUNICAYTIONS CONTROLLER(S) CURRENT STATE
08FO
08F2

B3 01
E8 OB04

08F5
08F7
08FA
08FD
08FD
08FE
0900
0902
0905
0907
090A
090C
090C
0900
090F

2B DB
BE 053A
B9 7063

MOV
CALL

BL ,01
ASYNCSUSPEND

; SET SUSPEND PARAMETER FOR
; SAVING ASYNC DEVICES

CHECKSUM LOWER 128K OF STORAGE

AD
03
E2
B9
8C
80
8E

SUB
MOV
MOV
SUS_OlO :
LODSW
ADD
LOOP
MOV
MOV
ADD
MOV
SUS_Oll :
LODSW
ADD
LOOP

08
FB
8000
08
C4 10
08

AD
03 08
E2 FB

BX, BX
SI,53AH
CX,7D63H
BX,AX
SUS_OlO
CX ,8000H
AX,DS
AH,10H
DS,AX

SET ACCUMULATOR
STARTING OFFSET
CHECKSUM 32K WORDS

CHECKSUM NEXT 32K WORDS
OFFSET TO NEXT SEGMENT

BX,AX
SUS_Oll

CANNOT USE SYSTEM STACK FROM HERE ON
09ll
0913
0915
0917

BO
E6
8A
E6

23
70
C3
71

MOV
OUT
MOV
OUT

AL, RTCBMEMJKSL
RTCR_PORT, AL
AL, BL
RTCD_PORT ,AL

ADDRESS CHECKSUM LOW SAVE AREA
OUTPUT ADDRESS

0919
091B
0910
091F

BO
E6
8A
E6

24
70
C7
71

MOV
OUT
MOV
OUT

AL, RTCBMEM_CKSH
RTCR_PORT, AL
AL, BH
RTCD_PORT, AL

ADDRESS CHECKSUM HI SAVE AREA
OUTPUT ADDRESS

OUTPUT DATA

OUTPUT DATA

SET SUSPEND FLAG
0921
0924

On6
onc
onc

OnE
0930
0932

B8 ---8E 08
C7 06 0072 R 5678
BO 00
E6 72
EB FA

ASSUME
MOV
MOV
MOV
SUSP_HL T:
MOV
OUT
JMP
SUSPEND

DS:DATA
; SET OS BACK TO DATA AREA
AX, DATA
DS,AX
RESELFLAG,SYS_SUSPEND ; SET SUSPEND SUCCESSFUL
AL, CLOCLSTOP
CLOCLCTL, AL
SUSP_HL T
ENDP

; STOP SYSTEM CLOCKS

Resume (RESUME)
SUBTTL

RESUME SYSTEM STATE

****************************************************************
RESUME: SUBROUTINE TO RESTORE SYSTEM FOR APPLICATION RESUME

****************************************************************
0932
0932
0935
0937

E8 0000 E
B4 20
E8 0747 R

RESUME
ASSUME
CALL
MOV
CALL

PROC
NEAR
OS: DATA
DISABLE_NMI
AH, RTCDSP _CON
GELRTCNMI

DISABLE ALL INTERRUPTS
GET LCD TYPE

ROM BIOS 2-55

093A
093D

BB BICO
BA 03B4

MOV
MOV

BX, SUSPENDJ10NO
DX, MONO_CNTL-4

; DEFAULT TO LCD AS MONO

SET RESUME MODE ACCORDING TO DISPLAY CONFIGURATION
0940
0942

A8 06
75 06

TEST
JNZ

AL, DSP_MLCD+DSP _CGA
RES_DOl

I F LCD AS MONO OR CGA I NSTALL ED
JMP - RESUME IN MONO MODE

0944
0947

BB B9CO
BA 03D4

MOV
MOV

BX, SUSPEND_COLOR
DX, CGA_CNTL-4

LCD MUST BE COLOR

094A
094A
094C

8E DB
BE 0007

DS, BX
SI,7

GET SAVE AREA SEGMENT
RETRIEVE LCD INFO

094F
0951
0953
0955
0959
095B

BO
E6
BO
81
74
DC

095D
095D

E6 75

RES_DOl:
MOV
MOV

ACCESS LCD FONT AREA WHERE SYSTEM SUSPEND SAVE AREA IS LOCATED
00
74
18
FA 03B4
02
02

MOV
OUT
MOV
CMP
JE
OR
RES_OOlA:
OUT

AL, LCD_FUNCT
LCD_INDX,AL
; SELECT LCD REG 0
AL, LCD_ENAB+LCD_FONT ; SET ENABLE WITH FONT ACCESS
DX ,MONO_CNTL-4
IS LCD SET IN MONO MODE?
RES_OOIA
JUMP I F YES
AL, LCD_CGA
NO, USE LCDC AS CGA
LCD_DATA,AL

SET LCD MODE FOR RESUME

RESTORE LCD CONTROL REGISTERS

;
BF 0783 R
B9 0014

095F
0962
0965
0965
0968
0969
096A
096B
096C
0960
096E

2E: 8A 05
47
EE
42
AC
EE
4A
E2 F5

0970
0971
0973
0975
0977
0978
097A
097B
097D
097E
0980
0981
0983
0984

AC
24
8A
E6
AC
8A
AC
8A
AC
8A
AC
8A
AC
8A

MOV
MOV
RES_002 :
MOV
INC
OUT
INC
LODSB
OUT
DEC
LOOP

DI,OFFSET LCDR_TABLE ; POINT TO LCD REG TABLE
CX, LCDR_L ENGTH
GET LENGTH OF TABLE
AL,CS: [DI]
DI
DX,AL
DX
DX,AL
DX
RES_002

; GET REGISTER ADDRESS
OUTPUT REG NUMBER
GET DATA PORT
RETRIEVE REGISTER VALUE
SET DX BACK TO INDEX PORT

RESTORE SYSTEM TIMERS
LODSB
AND
MOV
OUT
LODSB
MOV
LODSB
MOV
LODSB
MOV
LODSB
MOV
LODSB
MOV

3F
EO
43
D8
C8
FO
F8
E8

AL,3FH
AH,AL
TIMERJTL ,AL

GET TIMER 0 MODE
TURN OFF UPPER TWO BITS
AH HAS TIMER 0 MODE
WRITE TIMER 0 MODE

BL,AL

BL HAS TIMER 0 LSB

CL,AL

CL HAS TIMER 2 LSB

DH,AL

DH HAS TIMER 2 MODE

BH,AL

BH HAS TIMER 0 MSB

CH,AL

CH HAS TIMER 2 MSB

WRITE TIMER 0 COUNTER
0986
0989
098C
098E
0991
0993
0995
0997
0999
099B
0990
0990
099F

80
80
74
80
74
8A
E6
8A
E6
EB

E4 30
FC 10
OF
FC 20
10
C3
40
C7
40
OA

8A C3
E6 40

AND
CMP
JE
CMP
JE
MOV
OUT
MOV
OUT
JMP
RES_003 :
MOV
OUT

2-56 ROM BIOS

AH,30H
AH,lOH
RES_003
AH,20H
RES_004
AL, BL
TIMERO,AL
AL,BH
TIMERO,AL
SHORT RES_005

SAVE ONLY READ/WRITE TYPE
IS IT LSB ONLY?

AL,BL
TIMERO,AL

WRITE LSB ONLY

IS IT MSB ONLY?
OUT LSB FI RST THEN MSB

09Al
09A3
09A3
09AS

EB 04
8A C7
E6 40

JMP
RES_004:
MOV
OUT

SHORT RES_ODS
AL,BH
TIMERO,AL

WRITE MSB ONLY

AL,DH
AL, 3 FH
AL ,80H
TIMER_CTL,AL
AL ,30H
AL,10H
RES_006
AL,20H
RES_007
AL,CL
TIMER2,AL
AL,CH
TIMER2,AL
SHORT RES_008

SET TIMER 2 MODE
TURN OFF UPPER TWO BITS
SET TIMER 2

AL,CL
TIMER2,AL
SHORT RES_008

WRITE LSB ONLY

AL,CH
TIMER2,AL

WRITE MSB ONLY

RESTORE TIMER 2
09A7
09A7
09A9
09AB
09AD
09AF
09Bl
09B3
09B5
09B7
09B9
09BB
09BD
09BF
09Cl
09C3
09C3
09C5
0ge7
09C9
09C9
09CB

8A
24
DC
E6
24
3C
74
3C
74
8A
E6
8A
E6
EB

C6
3F
80
43
30
10
DE
20
10
Cl
42
CS
42
OA

8A Cl
E6 42
EB 04
8A C5
E6 42

RES_ODS:
MOV
AND
OR
OUT
AND
CMP
JE
CMP
JE
MOV
OUT
MOV
OUT
JMP
RES_006 :
MOV
OUT
JMP
RES_007 :
MOV
OUT

LEAVE ONLY READ/WRITE TYPE
IS IT LSB ONLY?
IS IT MSB ONLY?
OUT LSB FI RST THEN MSB

INITIALIZE INTERRUPT CONTROLLER
09CD
09CD
09CE
0900
0901
0903
0904

AC
8A EO
AC
8A F8
AC
8A 08

RES_008:
LODSB
MOV
LODSB
MOV
LODSB
MOV

AH,AL

GET INTERRUPT MASK
AH HAS INTERRUPT MASK
GET I NTERRUPT BYTE 0

BH,AL
GET INTERRUPT BYTE 1
BL,AL

BU I LD AND RESTORE ICW 1
0906
0908
09DA

24 08
DC 10
E6 20

09DC
09DE
09EO

8A C7
24 F8
E6 21

AND
OR
OUT

AL ,08H
AL,10H
INTAOO,AL

AND OFF ALL BUT LEVEL/EDGE
BIT 4 MUST BE 1
OUTPUT ICWI

BUILD AND RESTORE ICW 2
MOV
AND
OUT

AL, BH
AL ,OF8H
INTA01,AL

GET INTERRUPT TYPE ASSIGN
ONLY SAVE ICW2 INFO
SEND ICW 2

BUILD AND RESTORE ICW 4
09E2
09E4
09E6
09E8

8A
DO
24
E6

C3
E8
02
21

MOV
SHR
AND
OUT

AL, BL
AL,1
AL,02
INTA01,AL

GET INTERRUPT BYTE 1
GET AUTO EOI BIT CORRECT
SAVE ONLY AUTO EOI BIT
SEND ICW 4

RESTORE I NTERRUPT MASK REGI STER
09EA
09EC

8A C4
E6 21

09EE
09Fl
09F3
09F6
09F9

B8 0000
8E CO
BF 0000
B9 0040
F3/ AS

MOV
OUT

AL,AH
INTA01,AL

GET INTERRUPT MASK

RESTORE INTERRUPT VECTORS 0 -32 TO RAM
MOV
MOV
MOV
MOV
REP

AX,O
ES,AX
01,0
CX,64
MOVSW

SET SEGMENT 0
START AT VECTOR 0
RESTORE 32 VECTORS

RESTORE VECTOR 44H

ROM BIOS 2-57

09FB
09FE
09FF

BF 0110
A5
A5

MOV
MOVSW
MOVSW

DI,44H*4

RESTORE VECTOR 44H

RESTORE DATA AREA FROM 0300-3FFH
WARNING: CANNOT DO ANY STACK OPERATIONS FROM NOW UNTIL SS AND SP RESTORED
OAOO
OA03
OA06
OA08
OAOB
OAOE
OAOF

BF 0300
B9 0080
F3/ A5
83 C7 12
83 C6 10
AD
8B E8

MOV
MOV
REP
ADD
ADD
LODSW
MOV

DI,0300H
CX,128
MOVSW
DI,18
SI,16
BP ,AX

SET DESTINATION
128 WORDS
SKIP FROM 400H-410H
SOURCE ADDRESSES OLD EQUIP -FLAG
AX=PRE SUSPEND EQUIP_FLAG
SAVE OLD EQUIP_FLAG

RESTORE DATA AREA FROM 0412-053A
OAll
OA14

B9 0095
F3/ A5

OA16
OA18
OA1B
OA1D
OAIF
OA22
OA25
OA28
OA2B
OA2E
OA31

8C
B8
8E
2B
A3
A3
A2
A3
A2
A2
A2

MOV
REP

CX,149
MOVSW

RESTORE 149 WORDS

CLEAR KEYBOARD BREAK PENDING FLAGS
DB
---D8
CO
00B5
00B7
0018
0072
OOBA
0015
00B9

MOV
MOV
MOV
SUB
MOV
MOV
MOV
MOV
MOV
MOV
MOV

R
R
R
R
R
R

BX,DS
AX,DATA
DS,AX
AX,AX
B_PEND1,AX
B_PEND2,AX
KB-FLA~l,AL

RESELFLAG,AX
LASLCLICLKEY,AL
BALSTATUS,AL
P60_HOLD_BYTE ,AL

SAVE RESTORE SEGMENT
RESTORE DATA SEGMENT

CLEAR
CLEAR
CLEAR
CLEAR
CLEAR

KEY DEPRESSED BITS
RESET FLAG
KEY CLICK TRACKING
BATTERY STATUS FLAG
PORT 60 HOLDING REG

CLEAR BIOS STATUS FLAGS , CAUSE TIMEOUT COUNTERS TO BE RELOADED AND
A CHECK FOR DISKETTE CHANGE TO BE PERFORMED
OA34
OA39
OA3E
OMO
OM5
OM7
OMB

80
80
8B
80
24
08
8B

26
OE
C5
26
30
06
OE

OMF
OA51
OA53
OA56
OA57
OA59
OA5A
OA5C
OA5E
OA5F
OA60
OA61
OA62

8E
8B
BE
AD
8B
AD
8E
8B
AC
50
AD
50
8B

DB
FE
0000

OA64
OA66
OA68
OA6B
OA6D
OA6F

B4
8A
E8
FE
8A
E8

13
CI
0750 R
C4
C5
0750 R

0016 R 04
0016 R 22
0010 R CF
0010 R
0010 R

AND
OR
MOV
AND
AND
OR
MOV

BIOS_STATUS,DCL_SUPPORTED ; SAVE DCL SUPPORT FLAG
BIOS_STATUS, KYBD-ACTI VE+FORCE_DCL
AX,BP
; GET OLD EQUIPMENT INFO
BYTE PTR EQUIP-FLAG,NOT INILDISP ; CLR NEW VIDEO FLAGS
AL,INILDISP
; ONLY SAVE OLD VIDEO FLAGS
BYTE PTR EQUIP_FLAG,AL ; MOV OLD VIDEO FLAGS TO EQUI P
CX, EQUIP-FLAG
; CX <-- EQUIPMENT WORD

RESTORE APPLICATION PROGRAMS STACK POINTER
MOV
MOV
MOV
LODSW
MOV
LODSW
MOV
MOV
LODSB
PUSH
LODSW
PUSH
MOV

D8
03
EO

F7

DS, BX
DI,SI
SI,O
BX,AX
SS, BX
SP ,AX
AX
AX
SI,DI

RESTORE SAVE AREA SEGMENT
SAVE CURRENT PLACE
GET SS VALUE
SAVE IN BX
GET SP VALUE
RESTORE APPLICATION STACK
GET RTC
SAVE ON
GET LCD
SAVE ON
RESTORE

MODE
STACK
AND VIDEO CONTROL
STACK
POINTER

RESTORE EQUIP WORD IN RTC RAM FROM SAVED WORD IN REGISTER CX
MOV
MOV
CALL
INC
MOV
CALL

AH, RTCEQU I P_LO
AL,CL
PULRTCNMI
AH
AL,CH
PULRTCNMI

RELOAD KEYBOARD NMI CONTROL STATE

2-58 ROM BIOS

SAVE IN RTC EQUIPMENT AREA
SAVE EQUIPMENT INFO IN RTC

OA72
OA73
OA75
DAn
OA79
OA7S
OA7D

AC
24
SA
E4
24
OA
E6

LODSB
AND
MOV
IN
AND
OR
OUT

SO
OS
7C
7F
C3
7C

RETRIEVE FEATURE CONTROL
LEAVE ONLY KEYBOARD STATE
SAVE IN BL

AL,ENJYBD_NMI
BL,AL
AL, KYBD_CNTL
AL, NOT EN_KYBD_NMI
AL, BL
KYBD_CNTL,AL

MASK CURRENT NMI STATE
RESTORE KEYBOARD NMI STATE
OUTPUT FEATURE CONTROL

RESTORE 110 CHANNEL CHECK FLAG
OA7F
OASO

AC
E6 AD

LODSB
OUT

10NMLCNTL,AL

RESTORE NMI AND SPEAKER CONTROL REGISTER
OAS2
OAS3

AC
E6 61

OAS5
OAS7
OAS9

E4 7F
AS 40
75 13

OASB
OASD
OA90
OA92

B4
ES
AS
75

LODSB
OUT

NMLCNTL, AL

RESTORE POWER ENABLE TO
IN
TEST
JNZ

MODEM

AL,PWR_STAT
AL,EXLPWR
RES_009

GET CURRENT POWER STATUS
ON EXTERNAL POWER?
JUMP I F ON EXTERNAL POWER

CURRENTLY ON BATTERY POWER SO CHECK USER PROFILE FOR MODEM OPTIONS
17
0747
02
OA

MOV
CALL
TEST
JNZ

AH, RTCSYS_PROFI
GELRTCNMI
AL,MODEM_BATT
RES_009

; OPERATE COMI ON BATTERY?
; YES THEN JUMP

ON BATTERY POWER AND MODEM PROFILE INDICATES NO BATTERY OPERATION
OA94
OA96
OA9S
OA9B

B3
2A
ES
EB

02
FF
0000 E
09 90

MOV
SUB
CALL
JMP

BL,ACLMODEM
BH,BH
COM_POWER
RES_OlD

SPECI FY MODEM OFF
I NO I CATE POWER OFF REQUEST
TURN OFF PRIMARY COM POWER
SKI P MODEM _CONFIG

MODEM IS POWERED ON SO RESUME CONFIGURATION
OA9E
OA9E
OAAO
OAA3

RES_009 :
MOV
CALL
CALL

B4 10
ES 0747 R
ES 0000

AH, RTCMOD_PROFI
GELRTCNMI

GET MODEM PROFILE

MODE~CONFIG

GO SETUP MODEM CONFIGURATION

RESTORE COMMUNICATION CONTROLLERS STATE AT POWER OFF TIME
OAA6
OAA6
OAAS

2A DB
ES 0 B04 R

OAAB
OAAE
OABO
OABl
OAB3
OAB5
OAB7

BS
SE
5S
24
E6
AS
74

RES_OlD :
SUB
CALL

BL,BL
ASYNCSUSP END

SET RESUME CODE FOR RESTORING
OF COMMUNICATION STATE

TURN OFF FONT ACCESS AND ENABLE PANEL
MOV
MOV
POP
AND
OUT
TEST
JZ

---OS
BF
75
OS
04

AX,DATA
DS,AX
AX
AL,NOT PANEL_ENABLE
LCD_DATA,AL
AL,LCD_ENAB
RESOlDA

SET DATA SEGMENT ADDRESS
RETRIEVE VIDEO FLAGS
FORCE PANEL OFF
RESTORE LCD CONTROL
CHECK FOR LCD ENABLED
ONLY ENABLE PANEL I F LCD ENABLED

ENABLE PANEL I F LCD WAS ENABLED
OAB9
OABB

DC 60
E6 75

OR
OUT

AL,SYNCENABLE+PANELENABLE
LCD_DATA,AL

ENABLE PANEL

RESTORE ACTIVE VIDEO MODE CONTROL REGISTER
OABD
OABD
OACl
OAC4
OAC6

SB 16 0063 R
S3 C2 04
SA C4
EE

RESOIOA:
MOV
ADD
MOV
OUT

DX,ADDIL6S45
DX,4
AL,AH
DX,AL

GET RESTORE VIDEO MODE
RESTORE VIDEO MODE

ROM BIOS 2-59

ENABLE DISKETTE NMI'S
OAC7
OAC9
OACB

E4 77
OC 80
E6 77

IN
OR
OUT

AL, DSKLCNTL
AL,DSKLNMI
DSKLCNTL,AL

; ENABLE DISKETTE POWER ON NMI

SET REAL TIME CLOCK ALARM FLAG I F POWERED ON BY ALARM
OACD
OACF
OAD2
OAD4
OAD5
OAD8

B4
E8
8A
58
F6
74

21
0747
F8

DADA
OADF

80 OE OOAO R 02
24 DF

C7 10
07

OAEl

MOV
CALL
MOV
POP
TEST
JZ

AH,RTCSYS_STAT
GELRTCNMI
BH,AL
AX
BH, PON-ALRM
RES_Oll

OR
AND

RTCWAILFLAG,ALARM_PEND ; SET ALARM PENDING
AL, NOT AIE_ENABLE
TURN OFF ALARM I F POWERED
ON BY IT

GET SYSTEM STATUS
BH <-- SYS_STATUS
RETRI EVE RTC MODE
POWERED ON BY ALARM?

RES_Oll :

RESTORE REAL TIi·iE CLOCK I NTERRUPT MODE
OAEl
OAE3

B4 OB
E8 0750 R

MOV
CALL

AH, RTC.MODE
PULRTCNMI

ENABLE PRINTER PORTS
OAE6
OAE9
OAEB
OAEC
OAEF
OAFO
OAF3

BA
BO
EE
80
EE
BA
EE

027A
DC

OAF4
OAF6
OAF8
OAFA

E4
OC
24
E6

7F
04
F7
7F

MOV
MOV
OUT
ADD
OUT
MOV
OUT

C6 01
03BE

DX,27AH
AL ,OCH
DX,AL
DH,l
DX,AL
DX,03BEH
DX,AL

START WITH SECONDARY

DO PRIMARY
DO MONO PRINTER PORT

ENABLE SYSTEM SUSPEND NMI
IN
OR
AND
OUT

AL,PWILSTAT
AL, EN_SUS_NMI
AL, NOT HDWR_RESET
PWR_STAT ,AL

ENABLE SUSPEND NMI
RESET FLAG

ISSUE RESUME VECTOR CALL
OAFC
OAFC

E8 0000 E

RES_012 :
CALL

ENABLE_NMI

ENABLE NMI' S

ISSUE RESUME VECTOR CALL
OAFF

CD 6C

OB01
OB04

E9 0050 R

INT
JMP
RESUME
SUBTTL

2-60 ROM BIOS

6CH
NMIH_EXIT
ENDP
ASYNC SAVE/RESTORE

ALLOW OP /SYS TO CORRECT
REAL TIME INFORMATION
EX IT TO USERS PROGRAM

ASYNCSUSPEND
THIS SAVES OR RESTORES THE REGISTERS OF THE
8250 ASYNC CHIP. USED IN SUSPEND AND RESUME.
ES:DI MUST BE SET TO FIRST BYTE ON ENTRY FOR
SUSPEND, DS:SI MUST BE SET UP TO FIRST BYTE
FOR RESUME. SI OR DI IS INCREASED BY 14 ON EXIT.
THE DATA STATUS BYTE AND THE 8250 REGISTERS FOR
THE ASYNC PORT ARE STORED IN RAM AS FOLLOWS:
BYTE 1 - DATA STATUS (OAAH = GOOD)
BYTE 2 - 8250 LINE CONTROL REG
BYTE 3 - 8250 MODEM CONTROL REG
BYTE 4 - 8250 SCRATCH REG
BYTE 5 - 8250 INTERRUPT CTL REG
BYTE 6 - 8250 DIVISOR LATCH (MSB)
BYTE 7 - 8250 DIVISOR LATCH (LSB)
THE MODEM 8250 REGISTERS AND DATA STATUS BYTE
ARE STORED IN THE SAME FORMAT IN THE NEXT 7 BYTES.
INPUT

BL=O : RESTORES REGISTERS (RESUME)
BL=l : SAVE REGISTERS (SUSPEND)
DIRECTION FLAG=O
DS:SI = BEGINNING OF DATA AREA FOR RESUME.
ES:DI = BEGINNING OF DATA AREA FOR SUSPEND

REGI STERS USED

BX DESTROYED
14 ADDED TO SI (RESUME) OR DI (SUSPEND).

LOCAL EQUATES
= OOAA

GOOD_DATA

OB04
OB04
OB05

ASYNCSUSPEND
50
52

,

PUSH
PUSH

EQU

OAAH

PROC

NEAR

AX
DX

THIS MEANS THAT THE FOLLOWING 6
8YTES ARE VALID SUSPEND DATA

; SAVE REGISTERS USED

;-----GET RTCFEALCON AND KY8D_CNTL TO SEE WHO IS INSTALLED
OB06
OB08
OBOB
OBOD
OBlO
OB11
OB13

B4
E8
8A
BA
EC
86
50

IF
0747 R
EO
007C

0814
0817
081A
081C

BA
F6
74
81

02F8
C4 01
04
C2 0100

OB20
0822
0824

A8 80
75 02
2B CO

SV1:
JNZ
SUB

TEST
AL, SERPLLI NST
SV2
AX,AX

TEST FOR SER/PAR INSTALLED
YES, GO TO NEXT TEST
NO, FORCE TO FAIL NEXT TEST

OB26
OB29
OB28

F6 C4 04
74 02
BO AA

SV2:
JZ
MOV

TEST
AH, ACLRS232
SV3
AL,GOOD_DATA

TEST FOR ASYNC POWER ON
NO, AL=O TO INDICATE BAD
YES, SET AL TO INDICATE GOOD

082D

;-----DO THE SUSPEND OR RESUME
;
E8 OB47 R
SV3:
CALL
ASLRES3US

C4

,

MOV
CALL
MOV
MOV
IN
XCHG
PUSH

AH, RTCFEA LCON
GELRTCNMI
AH,AL
DX, KY8D_CNTL
AL,DX
AL,AH
AX

GET ASYNC INSTALLATION INFO
FROM REAL TIME CLOCK RAM
SAVE FEATURE REGISTER
ADDRESS THE POWER CONTROL REG
AND READ IT
EXCHANGE BYTES
SAVE FOR LATER (REST~ODEM)

;-----GET ADDRESS OF ASYNC PORT, EVEN IF NOT PRESENT
MOV
TEST
JZ
ADD

DX,2F8H
AH, SET_RS23LPRIM
SV1
DX,lOOH

ADDRESS OF SECONDARY PORT
TEST FOR ASYNC BEING PRIMARY
SKIP IF NOT
CHANGE TO PRIMARY ADDRESS I F SO

;-----IS ASYNC INSTALLED AND ON?

;

,

RESUME OR SUSPEND ASYNC

;-----IS MODEM INSTALLED AND ON?
0830
OB30
OB31

REST~ODEM:

58
A8 40

POP
TEST

AX
AL, I NTMOD_I NST

RETRIEVE FEATURE AND KYBD REGS
TEST FOR INTERNAL MODEM

ROM BIOS 2-61

OB33
OB35

75 02
2B CO

OB37
OB3A
OB3C

F6 C4 02
74 02
BO AA

OB3E

BA 03F8

OB41

E8 OB47

OB44
OB45
OB46

5A
58
C3

JNZ
SUB
SV4:
JZ
MOV

SV4
AX,AX

YES, DO NEXT TEST
NO, FORCE FAILURE OF NEXT TEST

TEST
AH, ACLMODEM
SV5
AL,GOOD_DATA

TEST FOR MODEM POWER ON
NO, LEAVE AL=O
YES, SET AL=GOOD_DATA

;-----GET ADDRESS OF MODEM EVEN IF NOT THERE
SV5:

MOV

DX,3F8H

; ADDRESS MODEM PORT

;-----CALL SUSPEND/RESUME
CALL

RESUME OR SUSPEND MODEM

; -----FINISHED
POP
POP
RET

OB47

OX
AX

RESTORE REGISTERS

ASYNCSUSPEND

ENDP

-- ---------- -------- --------- -- -- - - - - --- - -- - - - - - - - - - - - - - - -- - - - -- - - --

;ASLRES_SUS
INPUT

AL=O I F PORT I S NOT POWERED ON.
AL=GOOD_DATA BYTE IF PORT IS WORKING.
BL=O IF RESUME, BL!=O IF SUSPEND.
DX=PORT BASE ADDRESS

REGISTERS USED

AL,DX

-------- ----- ---------- -- - - - -- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -- - - - - - - -ASLRES_SUS

OB47
OB47
OB49

THIS PROCEDURE SAVES OR RESTORES THE ASYNC PORTS
REGISTERS.

02 DB
74 2B

ADD
JZ

PROC

BL, BL
ASLRESUME

NEAR

ARE WE RESUMING OR SUSPENDING?
RESUMING

; -----SUSPEND COMMAND
OB4B
OB4B
OB4C
OB4E

AA
22 CO
74 22

ASLSUSPEND:
STOSB
AND
AL,AL
JZ
AS1

OB50
OB51
OB52
OB53
OB54

42
42
42
EC
AA

INC
INC
INC
IN
STOSB

OX
OX
OX
AL,DX

ADDRESS THE LI NE CTL REG (XF9)
(XFA)
(XFB)
READ FROM 8250
AND STORE IN DATA AREA

OB55
OB57

24 7F
EE

AND
OUT

AL, 7 FH
DX,AL

ASSURE THAT DLAB BIT IS ZERO

OB58
OB59
OB5A

42
EC
AA

INC
IN
STOSB

OX
AL,DX

ADDRESS MODEM CONTROL REG (XFC)
READ
STORE IN DATA AREA

OB5B
OB5C
OB5D
OB5E
OB5F

42
42
42
EC
AA

INC
INC
INC
IN
STOSB

OX
OX
OX
AL,DX

ADDRESS SCRATCH REG

OB60
OB63
OB64

83 EA 06
EC
AA

SUB
IN
STOSB

DX,6
AL, OX

ADDRESS INTR ENABLE REG
READ FROM 8250
STORE IN RAM

OB65
OB66
OB67
OB69

42
42
BO 80
EE

INC
INC
MOV
OUT

OX
OX
AL ,80H
DX,AL

(XFA)
ADDRESS LINE CTL REG AGAIN (XFB)
SET DLAB BIT TO 1 TO READ BAUD

2-62 ROM BIOS

; STORE FI RST BYTE (GOOD OR BAD)
; IS PORT WORKING?
; NO, DO NOT STORE REGISTERS
YES, STORE ALL REGISTERS

(XFD)
(XFE)
(XFF)

READ FROM 8250
STORE IN RAM
(XF9)

OB6A
OB6B
OB6C
OB6D
OB6E
OB6F
OB70
OBll
OB72
OB75

4A
4A
EC
AA
4A
EC
AA
C3
83 C7 06
C3

DEC
OX
DEC
OX
IN
AL,DX
STOSB
DEC
OX
IN
AL,DX
STOSB
RET
ASI :
ADD
01,6
RET

ADDRESS BAUD MSB
READ FROM 8250
SAVE
ADDRESS OTHER BAUD BYTE
READ FROM 8250
SAVE
EXIT
SKIP OVER DATA AREA
EXIT

(XFA)
(XF9)
(XF8)

; -----RESUME COMMAND
OB76
OB76
OB78
OB7A
OB7B
OB7D

22
74
AC
3C
75

OB7F
OB80

AC
50

LODSB
PUSH

AX

IS PORT OPERATING?
NO, DO NOT RESTORE
YES, LOOK AT STORED DATA
IS IT GOOD?
NO, DO NOT RESTORE
YES, SO RESTORE 8250
GET LINE CONTROL REG FROM RAM
STORE ON STACK

OB81
OB82
OB83
OB84
OB86

42
42
42
2A CO
EE

INC
INC
INC
SUB
OUT

OX
OX
OX
AL,AL
DX,AL

(XF9)
(XFA)
ADDRESS LINE CTL REG (XFB)
SET DLAB BIT 0
TO ALLOW NORMAL ADDRESS I NG

OB87
OB88
OB89

42
AC
EE

INC
LODSB
OUT

OX
DX,AL

ADDRESS MODEM CONTROL REG (X FC)
GET FROM RAM
AND RESTORE 8250

OB8A
OB8B
OB8C
OB8D
OB8E

42
42
42
AC
EE

INC
INC
INC
LODSB
OUT

DX,AL

OB8F
OB92
OB93

83 EA 07
EC
EC

SUB
IN
IN

DX,7
AL,DX
AL,DX

ADDRESS DATA REG
GET ANY TRASH CHRS

OB94
OB95
OB96

42
AC
EE

INC
LODSB
OUT

OX
DX,AL

ADDRESS I NTR CTL REG (XF9)
GET FROM RAM
AND WRITE TO 8250

OB97
OB98
OB99
OB9B

42
42
BO 80
EE

INC
INC
MOV
OUT

OX
OX
AL ,80H
DX,AL

(XFA)
ADDR LINE CONTROL REG(XFB)
SET DLAB BIT = 1
IN 8250

OB9C
OB9D
OB9E
OB9F
OBAO
OBAI
OBA2

4A
4A
AC
EE
4A
AC
EE

DEC
DEC
LODSB
OUT
DEC
LODSB
OUT

OX
OX

DX,AL

(XFA)
(XF9)
GET BAUD MSB FROM RAM
AND INTO 8250
ADDR BAUD LSB
(XF8)
GET FROM RAM
AND INTO 8250

OBA3
OBA4
OBA5
OBA6
OBA7

42
42
42
58
EE

INC
INC
INC
POP
OUT

OX
OX
OX
AX
DX,AL

(XF9)
(XFA)
ADORE LINE CONTROL AGAIN (XFB)
PULL OFF STACK
AND PUT IN 8250

OBA8

C3

RET

OBA9

46
83 C6 06
C3

oBAA
OBAD

CO
2F
AA
2B

ASLRESUME:
AND
AL,AL
JZ
AS2
LODSB
AL,GOOD_DATA
CMP
JNE
AS3

AS2:
AS3:
RET

OX
OX
OX

ADDRESS SCRATCH REG
GET FROM RAM
AND WRITE TO 8250

DX,AL
OX

INC
ADD

SI
SI,6

(XFO)
(XFE)
(XFF)

(XF8)

CORRECT ADDRESS COUNT

ROM BIOS 2-63

OBAE
OBAE

ENDP
ROMCODE
END

2-64 ROM BIOS

ENDS

Keyboard Services (BIIKYBD)
TITLE BllKYBD BIOS KEYBOARD ROUTINES
ROMCODE SEGMENT BYTE PUBLIC
IDENT
BllKYBD,Il,OO

0000

; **********************************************************************
MODULE-NAME :

BllKYBD

DATE LAST MODI FI ED:

9/16/85

DESCRIPTIVE-NAME: THIS MODULE CONTAINS THE BIOS INTERRUPT 9
KEYBOARD HANDLER AND THE ASSOCIATED INTERRUPT 16
KEYBOARD SERVICE ROUTINES.
COPYRIGHT

7396-917 (C) COPYRIGHT IBM CORP. 1985
REFER TO COPYRIGHT INSTRUCTIONS FORM NUMBER G120-2083

CHANGE LEVEL: 0.0
KYBD_INT9
- INTERRUPT 9 KEYBOARD HANDLER (HARDWARE INT 1)
ROUTINE TO READ SCAN CODES FROM PORT 60H AND
CONVERT THEM TO ASCII CODES AND QUEUE IN THE
BIOS KEYBOARD BUFFER.

FUNCTION:

KYBD_IO
- KEYBOARD I/O ROUTINES TO ACCESS THE ASCI I
KEYBOARD BUFFER. (INT 16H)
MODULE SIZE:

945 BYTES

EXTERNALLY REFERENCED ROUTINES: REFER TO EXTRN LIST
EXTERNALLY REFERENCED DATA AREAS: REFER TO EXTRN LIST
CHANGE ACTIVITY:

NONE

; **********************************************************************
; *****************************************************************
;*

PUBLICS

; *****************************************************************
PUBLIC
PUBLIC

KYBD_IO
KYBD_INT9

; *****************************************************************
;*

EXT ERN A L

REF ERE N C E S

; *****************************************************************
ROUTINES
EXTRN
EXTRN
EXTRN

DCS: NEAR
START: NEAR
KB_NOISE:NEAR

EXTRN
EXTRN
EXTRN
EXTRN
EXTRN
EXTRN

K6: BYTE
K6L:ABS
K7: BYTE
K8: BYTE
K9: BYTE
KI0:BYTE

TABLES

ROM BIOS 2-65

EXTRN
EXTRN
EXTRN
EXTRN
EXTRN
EXTRN

Kll
K12
K13
K14
K15
K30

BYTE
BYTE
BYTE
BYTE
BYTE
BYTE

P60_SLASH_SC
P60...ASTRICSC
F1LMAKE_SC
FlLMAKE_SC
F1LBASE...ASCI I

EQU
EQU
EQU
EQU
EQU

LOCAL EQUATES
0035
0037
0057
0058
0085

P60
P60
Fll
F12
Fll

35H
37H
057H
058H
D85H

MAKE SC FOR BASE /
MAKE SC FOR BASE *
MAKE SC AT NMI & P60 LEVEL
MAKE SC AT NMI & P60 LEVEL
EXTENDED ASCI I (BASE)

Keyboard Interrupt Hex 16 (KYBD_IO)
; ****

I NT 16H

***********************************************************

ROUTINE NAME: KYBD_IO

(INT 16H)

FUNCTION: PROVIDE ACCESS TO THE ASCII KEYBOARD BUFFER AND CLICKER.
INPUT CONDITIONS:
(AH)=O PROCESS SYSTEM REQUEST KEY IF THE KEY IS ACTIVE ELSE
READ THE NEXT ASCI I CHARACTER STRUCK FROM THE KEYBOARD
RETURN THE RESULT IN (AL), SCAN CODE IN (AH)
(AH)=l

PROCESS SYSTEM REQUEST KEY IF THE KEY IS ACTIVE ELSE
RESET THE Z FLAG TO INDICATE IF AN ASCII CHARACTER IS
AVAILABLE TO BE READ.
(ZF) =1 -- NO CODE AVA I LABLE
(ZF) =0 -- CODE IS AVAILABLE
IF ZF = 0, THE NEXT CHARACTER IN THE BUFFER TO BE READ
IS IN AX, AND THE ENTRY REMAINS IN THE BUFFER
(AH)=2

RETURN THE CURRENT SHIFT STATUS IN AL REGISTER
THE BIT SETTINGS FOR THIS CODE ARE INDICATED IN THE
THE EQUATES FOR KBJLAG

(AH) =4

TURN ON/OFF KEYBOARD CLICK STATE BY THE VALUE IN AL
AS FOLLOWS:
TURN OFF KEYBOARD CLICK.
TURN ON KEYBOARD CLICK.
AL IS RANGE CHECKED. THE STATE IS UNALTERED IF
AL <> 1,0.

(AL)=O
(AL)=l

NOTE:

FUNCTION CALLS OTHER THAN THE ABOVE RESULT IN NO OPERATION

EXIT CONDITIONS:

FUNCTIONS 0, 2, 4
FUNCTION 1

REGISTERS MODIFIED:
INTERRUPTS:

IRET BACK TO CALLER
RET 2 BACK TO CALLER

AX, Z FLAG

FOR FUNCTIONS 2 AND 4, I FLAG IS LEFT AS IS
FOR FUNCTION 0, INTERRUPTS ARE FORCED OFF (CLI) AND FORCED 0
(STI) BEFORE DOING IRET
FOR FUNCTION 1, INTERRUPTS ARE FORCED OFF (CLI) AND FORCED 0
(STI) BEFORE DOING RET 2

INTERNALLY REFERENCED ROUTINES:
; EXTERNALLY REFERENCED ROUTINES:

PTR-INC
DDS, INT 15H

; ************************************************************************

2-66 ROM BIOS

0000
0000
0001
0002
0005
0007
0009
OOOB
0000
OOOF
0011
0014
0016

IE
53
E8
OA
74
FE
74
FE
74
80
74
EB

ASSUME cs: ROMCODE, CS : DATA
KYBD_IO PROC
FAR
PUSH
OS
PUSH
BX
CALL
DDS
OR
AH,AH
JZ
Kl
DEC
AH
JZ
K2
DEC
AH
JZ
K3
SUB
AH,2
JZ
K4
JMP
KYBD_END

0000 E
E4
10
CC
2B
CC
3B
EC 02
39
49 90

; SAVE CURRENT OS
; SAVE BX TEMPORARI LY
;
;
;
;

AH=O
ASCILREAD
AH=1
ASCI LSTATUS
AH=2
SHI FLSTATUS
,AH=4
CLICI<-STATE
EXIT

;

; ----- READ THE KEY TO FIGURE OUT WHAT TO DO
0019
0019
OOlA
OOlE
0022

Kl:
FA
8B IE OOIA R
3B IE OOlC R
75 08

CLI
MOV
CMP
JNE

BX, BUFFEILHEAD
BX, BUFFER_TAIL
KLA

; ASCI I READ
INTERRUPTS OFF
GET POINTER TO HEAD OF BUFFER
CHECK FOR HEAD = TAIL
JUMP IF SOMETHING IN BUFFER

ISSUE KEYBOARD BUSY WAIT
0024
0027
0029

B8 9002
CD 15
FB

002A

EB ED

MOV
INT
STI

CALL KEYBOARD BUSY HANDLER

AX,09002H
ISH

INTERRUPTS ON

BIOS INT ISH WILL RETURN HERE WHEN HEAD
JMP

Kl

<>

TAIL

; LOOP BACK TO WAIT FOR BFR NOT EMPTY

DATA IN KEYBOARD BUFFER
002C
002C
002E
0031
0035

8B
E8
89
EB

07
03A4 R
IE OOlA R
2A 90

KLA:
MOV
CALL
MOV
JMP

AX, [BX]
PTILINC
BUFFEILHEAD, BX
KYBD_END

;
;
;
;

GET SCAN CODE AND ASCI I CODE
MOVE POINTER TO NEXT POSITION
STORE VALUE IN VARIABLE
RETURN

;----- ASCII STATUS
0038
0038
0039
0030
0041
0043
0044
0045
0046

K2:
FA
8B
3B
8B
FB
5B
IF
CA

CLI
MOV
CMP
MOV
STI
POP
POP
RET

IE OOlA R
IE OOlC R
07

0002

,

BX, BUFFER_HEAD
BX, BUFFEILTAIL
AX, [BX]
BX
OS
2

I NTERRUPTS OFF
GET HEAD POINTER
I F EQUAL (Z=l) THEN NOTHING THERE
RE-ENABLE INTERRUPTS
RECOVER REGISTER
; RECOVER SEGMENT
; THROW AWAY FLAGS

;----- SHIFT STATUS
0049
0049
004C

K3:
AO 0017 R
EB 13 90

MOV
JMP

,

AL,KB_FLAG
KYBD_END

GET THE SHI FT STATUS FLAGS
RETURN

;----- CLICK STATE
004F
004F
0051
0053
0058
0058
005A
005C
0061
0061

K4:
OA CO
75 05
80 26 00B4 R F7

OR
JNZ
AND

AL,AL
; TURN OFF KEYBOARD CLICK?
; JUMP FOR RANGE CHECK
K5
KB_NMLCNTL, NOT CLI CI<-ON ; TURN OFF CLI CK

CMP
JNE
OR

AL,l
; RANGE CHECK
KYBD_END
; NOT I N RANGE, RETURN
KB_NMLCNTL,CLICI<-ON ; TURN ON KEYBOARD CLICK

K5:
3C 01
75 05
80 OE 00B4 R 08
5B

KYBD_END:
POP

BX

; RECOVER REGISTER

ROM BIOS 2-67

0062
0063

IF
CF

POP
IRET

RECOVER REGISTERS
RETURN TO CAllER

DS

KYBD_IO ENDP

0064

Level 1 Interrupt Hex 9 (KYBD_INT9)
** I NT 9 *************************************************************
ROUTINE-NAME:

KYBD_INT9

FUNCTION:
THIS ROUTINE IS ACTIVATED BY A INTERRUPT 9 (HARDWARE INT 1)
IT READS PORT 60 AND PROCESSES THAT SCAN CODE BY EITHER SETTING/
RESETTING ITS FLAG OR TRANSLATING THE SCAN CODE INTO AN EXTENDED
ASCII CODE AND PLACING IT IN THE ASCII BUFFER. THIS INTERRUPT
SERVICE ROUTINE TRIGGERS THE KYBD_ClR NMI. THE NMI DOES NOT
GO INTO EFFECT UNTIL A NON-SPECIFIC EO! !S DONE NEAR THE EXIT OF
THIS ROUTINE.
ENTRY CONDITIONS:
PURPOSE OF ENTRY: PROCESS THE SCAN CODE IN PORT 60H
INPUT CONDITIONS: cs: ROMCODE SEGMENT
RESTRI CTIONS:
EXIT CONDITIONS:
NORMAL EXIT CONDITIONS: ASCII BFR HAS 2 BYTE EXTENDED ASCII CODE
ERROR EXIT CONDITIONS: N/A
REGISTERS MODIFIED:
NONE
INTERRUPTS:

FORCED ON UPON ENTRY (STI)

INTERNAll Y REFERENCED ROUTINES:

PTR_I NC

EXTERNAllY REFERENCED ROUTINES:

DDS, INT 5H, KB_NOISE, INT 15H, INT IBH,

**********************************************************************
0064
0064
0065
0066
0067
0068
0069
006A
006B
006C
006D
006E
0071
0073
0074
0076
0078
007A
007C
007E

FB
50
53
51
52
56
57
IE
06
FC
E8
E4
50
E4
8A
OC
E6
86
E6

0080

58

0000
60
61
EO
80
61
EO
61

KYBD_INT9 PROC
FAR
STI
PUSH
AX
PUSH
BX
PUSH
CX
PUSH
DX
PUSH
51
PUSH
DI
PUSH
DS
PUSH
ES
ClD
CAll
DDS
Al,KB_DATA
IN
PUSH
AX
AL, KB_CTL
IN
MOV
AH,Al
OR
Al,80H
KB_CTL,Al
OUT
XCHG
AH,Al
KB_CTl,Al
OUT
POP

AX

AllOW FURTHER INTERRUPTS

FORWARD DIRECTION
READ I N THE CHARACTER
SAVE IT
GET THE CONTROL PORT
SAVE VALUE
RESET BIT FOR KEYBOARD
GET BACK ORIGINAL CONTROL
KB HAS BEEN RESET
NOTE: THIS WIll GENERATE A
KB_ClR NMI UPON INT9 EOI.
RECOVER SCAN CODE

ALLOW OPERATING SYSTEM INTERCEPT (INT 15 FUNCTION 4FH)
(AH = 4FH , Al = SCAN CODE)
0081

B4 4F

2-68 ROM BIOS

MOV

AH,4FH

0083
0084
0086

F9
CD 15
73 60

0088

8A EO

STC
INT
JNC

PRE SET CARRY FOR INTERCEPT CHECK

MOV
KEYPAD /, *

008A
008F
0091
0096
0099
0098
009E
OOAO
OOAO
00A5
00A7
OOAA
OOAF

F6
74
80
80
74
80
75

06
21
36
FC
05
FC
12

009

R 02

F6
75
E9
80
E9

06 0018 R 08
03
0320 R
26 0018 R F7
0396 R

00B2
00B4
00B6
OOBB

3C
75
80
E9

EO
08
OE 0096 R 02
0396 R

OOBE
OOCO
00C2

3C FF
75 03
E9 0386 R

0096 R 02
35
37

AH,AL

MAKES

KB_FLAL3, LCHC
TEST
HAS AN EOH 8EEN PROCESSED?
K9_1
JZ
NO, JUMP
XOR
KB_FLAL3, LCHC
YES, RESET FLAG
CMP
AH, P60_SLASH_SC
KEYPAD / KEY?
JE
K6_1
YES, JUMP
CMP
AH, P60J.STRICSC
KEYPAD * KEY?
K9_1
JNE
NO, JUMP
K6_1:
TEST
KLFLAL1,HOLD_STATE ; IN HOLD STATE?
K6_5
; YES,AROUND
JNZ
JMP
K55
; NO,JUMP LEAVING /, * AS IS
K6_5:
AND
KLFLAG_1,NOT HOLD_STATE; RST HLD ST, DISCARD KEY
JMP
KY8DLEXIT
; EXIT INT9 ROUTINE

, ----- -------------- - --; HIDDEN CODE

-

EOH

CMP

KL1:
JNE
OR
JMP

-

AL,HIDN_CODE_EO ; IS P60 SC A HIDDEN CODE?
K1O_1
NO, JUMP
KBJLAG_3,LCHC
; SET FLAG
KYBD9_EXIT
; EXIT ROUTINE

, -------- - -- - - - - -- - - - - - -; OVERRUN SC

-

K10_1:
JNZ
JMP

FFH
CMP

AL ,OFFH
K14_S1
K62

00E4
00E4
00E6
00E8
00E8

; IS THIS AN OVERRUN CHAR
; NO, TEST FOR SYS REQ KEY
; BUFFERJULL_BEEP

, -- -- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -- - - - - - - - -- - - - - - - -; SYSTEM REQUEST MAKE/BREAK

00C5
00C5
00C7
00C9
OOCE
0000
0005
0007
0009
0009
OODB
0000
00E2

IF NO CARRY THEN VECTOR INTERCEPT
ELSE PROCESS KEY HERE:
SAVE SCAN CODE IN AH ALSO

3C
75
F6
75
80
BO
EB

54
10
06 0018 R 04
18
OE 0018 R 04
00
OB

3C
75
80
BO

04
OE
26 0018 R FB
01

B4 85
CD 15
E9 0396

K14_S1 :
CMP
JNE
TEST
JNZ
OR
MOV
JMP
K14_S2 :
CMP
JNE
AND
MOV

(INT 15H

AL,SYSREQ~AKE

K14_S2
KB_FLAL1, SYS_SHI FT
K14_S4
KB_FLAG_1, SYS_SHI FT
AL,OO
SHORT K14_S3

FUNCTION 85H) SYSTEM REQUEST KEY MAKE
NO, GO LOOK FOR BREAK
ALREADY DEPRESSED?
IF SO THEN THROW AWAY MAKE
SET SYS REQ DEPRESSED FLAG
SET MAKE FLAG
GO DO THE INT 15H

AL,SYSREQ_BREAK
SYSTEM REQUEST KEY BREAK?
K16
; NO, GO TEST FOR SHIFT KEYS
KB_FLAG_1,NOT SYS_SHIFT ; RESET SYS REQ DEPRESSED FLAG
AL,Ol
SET REQUEST BREAK FLAG

K14_S3 :
MOV
INT
K14_S4 :
JMP

AH,85H
15H

SET SYSTEM REQUEST NOTI FI CAT! ON

KYBD9_EXIT

EXIT

TEST FOR SHI FT KEYS
OOEB
OOEB
OOED
OOEE
OOEF
00F2
00F5
00F7
00F9
OOFB

24 7F
OE
07
BF 0000
B9 0000
F2/ AE
8A C4
74 03
E9 0187

K16:
AND
PUSH
POP
MOV
MOV
REPNE
MOV
JE
JMP

OOFE
0102

81 EF 000 E
K17:
2E: 8A A5 0000 E
MOV

AL,07FH
CS
ES
DI,OFFSET K6
CX,OFFSET K6L
SCASB
AL,AH
K17
K24_0

TESLSHIFT
TURN OFF THE BREAK BIT
ESTABLISH ADDRESS OF SHIFT TABLE
SHI FT KEY TABLE
LENGTH
LOOK THROUGH THE TABLE FOR A MATCH
RECOVER SCAN CODE
JUMP I F MATCH FOUND
IF NO MATCH, THEN SHIFT NOT FOUND

SHI FT KEY FOUND
SUB

DI,OFFSET K6+1
AH,cs:K7[DI]

ADJUST PTR TO SCAN CODE MTCH
; GET MASK INTO AH

ROM BIOS 2-69

0107
0109

A8 80
75 54

010B
OlOE

80 FC 10
73 OA

TEST
AL ,80H
; TEST FOR BREAK KEY
JNZ
K23
; BREAICSHI FLFOUND
; ------ - -- - - - - - - - - ---- - - - - - - - - - - - - -- - - - --; SHI FT MAKE FOUND, DETERMINE SET OR TOGGLE

- ---

CMP
JAE

AH, SCROLLSHI FT
K18

; IF SCRL SFT OR ABOVE, TOGGLE KEY

PLAIN SHIFT KEY, SET SHIFT ON
0110
0114

08 26 0017 R
E9 0396 R

~----0117
OllA
OllA
OllF
0121
0123

F6
75
3C
75

06 0017 R 04
F6
52
22

0125
012A
012C
0131
0133
0138

F6
75
F6
75
F6
74

06 0017 R 08
EB
06 0017 R 20
OD
06 0017 R 03
OD

013A
013A
013D
0140
0140
0145
0147
0147
014B
014D
0151
0155
0157
0159
015C

E9 01C5 R

OR
JMP

K25_JMP: JMP
K25
K18:
KBJLAG, CTL_SH 1FT
TEST
K25_JMP
JNZ
AL, INS_KEY
CMP
JNE
K22

JUMP TO K25 FOR JNZ' s BELOW
SHI FT - TOGGLE
CHECK CTL SHI FT STATE
JUMP IF CTL STATE
CHECK FOR INSERT KEY
JUMP I F NOT I NSERT KEY
[[[[ INSERT KEY HIT llll
KB_FLAG, AL LSHIFT
CHECK FOR ALTERNATE SHI FT
TEST
K25_JMP
;
JUMP
IF ALTERNATE SHIFT
JNZ
KBJLAG, NUM_STATE ; CHECK FOR BASE STATE
K19 :
TEST
JNZ
K21
; JUMP IF NUM LOCK IS ON
TEST
KLFLAG, LEFLSHIFT+ RIGHLSHIFT
JZ
K22
JUMP I F BASE STATE

F6 06 0017 R 03
74 F3
84
75
08
30
3C
75
B8
E9

K22:
TEST
JNZ
OR
XOR
CMP
JNE
MOV
JMP

26 0018 R
37
26 0018 R
26 0017 R
52
2B
5200
0334 R

; TURN ON SHI FT BIT
; INTERRUPLRETURN

TOGGLED SHIFT KEY, TEST FOR 1ST MAKE OR NOT

K20:
MOV
JMP
K21 :
TEST
JZ

B8 5230
E9 0334 R

KLFLAG,AH
KYBD9_EXIT

NUMERIC ZERO, NOT INSERT KEY
PUT OUT AN ASCI I ZERO
BUFFERJI LL
; MIGHT BE NUMERIC
KLFLAG, LEFLSHIFTt RIGHLSHIFT
JUMP NUMERIC, NOT INSERT
K20

AX, 5230H
K57

AH, KB_FLAG_l
KYBD9_EXITl
KLFLAG_l,AH
KLFLAG,AH
AL, INS_KEY
KYBDLEXITl
AX, I NS_KEY*256
K57

SHFT TOGGLE KEY HIT; PROCESS
IS KEY ALREADY DEPRESSED
JUMP I F KEY ALREADY DEPRESSED
IND THAT THE KEY IS DEPRESSED
TOGGLE THE SHIFT STATE
TEST 1ST MAKE OF INSERT KEY
JUMP IF NOT INSERT KEY
SET CODE INTO AH, 0 INTO AL
PUT INTO OUTPUT BUFFER

--- - -- - - - - - - - - - - - - - -- - - - - - - - - - - - - - - - - -- - - - - - --

; SH I FT BREAK FOUND
015F
015F
0162
0164
0166
016A
016C

016E
0171
0173
0177
0179
017B

------------- - -- - - - - - - - - - - - - - - - -- - - - - -- - - - - - -K23:
CMP
JAE
NOT
AND
CMP
JNE

AH, SCROLL_SH I FT
K24
AH
KLFLAG,AH
AL ,AL LKEY+80H
KYBDLEXITl

BREAK-SH I FT - FOUND
IS THIS A TOGGLE KEY
YES, HANDLE BREAK TOGGLE
INVERT MASK
TURN OFF SHI FT BIT
IS THIS ALT SHIFT RELEASE
GO TO EOI EXIT

80
73
F6
20
3C
75

FC 10
lA
D4
26 0017 R
B8
16

AO
B4
88
3C
74
E9

; ALLSHIFT RELEASED, PROCESS ALT + KEYPAD (0-9) IF PENDING
; --------- ---------- - -- - - - - - - - - - - - - - - - - - - - - - - -- - - - - - - - - - - -' - - - -0019 R
MOV
AL,AL LINPUT
00
MOV
AH,O
BUILD PSEUDO SC
26 0019
MOV
AL LINPUT ,AH
CLEAR ALT_INPUT
00
CMP
AL,O
WAS ALT_INPUT HOLDING?
09
JE
KYBDLEXITI
NO, EOI EXIT
033D R
JMP
K58
YES, T, SO PUT IN BUFFER

- -- - -- - - - - - - - - - - - - - - - - - - - - - - -- - - - - - - - - -- - - - - - -- - - - - - - - - - - - - - - --

-

SHI FT BREAK IS A STATE KEY - TOGGLE FLAG
017E
017E
0180

F6 D4
20 26 0018 R

,

K24:
NOT
AND

; LINK TO KEYBOARD EXIT FOR SHORT JUMPS

2-70 ROM BIOS

BREAK-TOGGLE
INVERT MASK
INDICATE STATE EXITED

0184
0184

KYBD9_EXITl:
JMP
KY BDLEX IT

E9 0396 R

I NTERRUPLRETURN

; ----- TEST FOR Fll OR Fl2 MAKE
0187
0187
0189
018B
0180
018F
0191

0193
0193
0198
019A
019F
01A2
01A2
01A7
01A9
OIAC
OlBl
01B3
01B6
OIBB
OlBD
OICO
OICO
01C2

01C5
01C5
01C7
01C9

OICB
0100
0102
0104
0106
OIDB

K24_0:
AH HAS BASE Fll EXT ASCII
MOV
AH, FlLBASL.ASCI I
CMP
AL,FlLMAKE3C
F1l MAKE?
K24_l
YES, JUMP
JE
AH HAS BASE F12 EXT ASCI I
INC
AH
AL, FlLMAKE_SC
CMP
F12 MAKE?
JNE
K25
NO, JUMP
; -- -- ----- - -- - ---- -- - -- -- -- -- ------ - - ---- -- - -- -- - -- -- -- - -- -- --- - -- -; F1l / F12 FOUND CHECK FOR
ALT+, CTL+, SHIFT+ F1l/F12

B4
3C
74
FE
3C
75

85
57
06
C4
58
32

F6
74
80
E9

06 0018 R 08
08
26 0018 R F7
0396 R

K24_l:
TEST
JZ
AND
JMP
K24_5:
TEST

F6 06 0017 R OF
74
80
F6
75
80
F6
75
80

17
C4
06
00
EC
06
03
EC

01E8
01E8
OlEO
OIEF
01F1

K25:
MOV
CMP
JAE

8A EO
3C 80
73 B9

F6
74
3C
74
80
E9

AH,AL
AL,80H
KYBDLEXITl

TEST
JZ
CMP
JE
AND
JMP

06 0018 R 08
OC
45
AE
26 0018 R F7
0396 R

F6 06 0017 R 08
75 03
EB 60 90

F6
74
3C
75

06
00
53
09

CLEAR AL TO MAKE AX EXTNDED SC
GO BUFFER Fll/F12 EXT ASCI I

NO-SHI FT -FOUND
RESTORE AH AFTER Fll/ F12 TEST
8REAK SC?
; YES, EOI EXIT

; ««««<
; < NO BREAK
; ««««<

)»»>>
»
»»»)

CODES PAST HERE

KBJLAG....l,HOLD_STATE ; ARE WE IN HOLD STATE
K28
; BRANCH AROUND TEST I F NOT
AL,NUM-KEY
; CAN' T END HOLD ON NUtLLOCK
KYBDLEXITl
KB_FLAG_l,NOT HOLD3TATE ; TURN OFF HOLD STATE BIT
KYBDLEXIT
HOLD STATE, TEST FOR SPECIAL CHARS

K28:
TEST
JNZ
JMP

KB_FLAG,AL LSHI FT
K29
K38

;
;
;
;

NO-HOLD-STATE
ARE WE IN ALTERNATE SHI FT
JUMP IF ALTERNATE SH 1FT
JUMP I F NOT ALTERNATE

; - -- ----- --- -- --- -- -- --- ---- --- -- ---- -- --- - - - -- -- -- -- -- - -TEST -RESET
K29:
KB_FLAG,CTL_SHI FT
ARE WE IN CONTROL SHI FT ALSO
0017 R 04
TEST
NO_RESET
K3l
JZ
AL,DEL_KEY
SHI FT STATE THERE, TEST KEY
CMP
NO_RESET
JNE
K3l

,
01F3
01F9

KB_FLAG ,ALLSHI FT +CTL_SHI FT +LEFLSHI FT +RIGHT_SH I FT
ANY SHIFT STATES?
K24_7
NO, AROUND WITH BASE Fll/Fl2
AH,6
AH HAS ALT+F1l/F12 EXT ASCII
KB_FLAG, AL LSH I FT
ALT SHIFT CASE?
K24_7
YES, JUMP
AH,2
AH HAS CTL +Fll/F12 EXT ASCII
KB-FLAG, CTL_SHI FT
CTL SH I FT CAS E?
K24_7
YES, JUMP
AH HAS SHIFT+Fll/F12 EXT ASCII
AH,2

JZ
ADD
TEST
JNZ
SUB
02
0017 R 04
TEST
JNZ
02
SUB
K24_7 :
2A CO
SUB
AL,AL
E9 0364 R
JMP
K6l
, - -- - -- --- -- -- ---- -- -- -- --; TEST FOR HOLD STATE
06
0017 R 08

NOT IN
OlOE
OlOE
01E3
01E5

KB_FLAG_l,HOLD_STATE ; HOLD STATE?
K24_5
; NO, AROUND
KB_FLAG_l,NOT HOLD_STATE; YES, ENTERED KEY ONLY
KYBDLEXIT
; RESETS HOLD STATE

ClL-ALT -DEL

C7 06 0072 R 1234
E9 0000 E

MOV
JMP

ENTERED, DO I/O CLEANUP FOR SOFT START
RESELFLAG, l234H
START

; SET FLAG FOR RESET FUNCTION
; JUMP TO POWER ON DIAGNOSTICS

ROM BIOS 2-71

01FC
01FC
01FE
0200
0202

3C
75
80
E9

K31 :
CMP
JNE
MOV
JMP

39
05
20
0334 R

NO-RESET
TEST FOR SPACE KEY
NOT THERE
SET SPACE CHAR
BUFFERJILL

AL,57
K32

AL,

t

,

K57

LOOK FOR KEY PAD ENTRY
0205
0205
0208
0208
0200
020F
0213
0216
0218
021A
021C
021F

K32 :
MOV
MOV
REPNE
JNE
SUB
MOV
MOV
MUL
ADD
MOV
JMP

8F 0000 E
89 OOOA
F2/ AE
75 13
81 EF 0001
AO 0019 R
B4 OA
F6 E4
03 C7
A2 0019
E9 0396

--- ALT + (KEYPAD 0-9) MAKE --

DI,OFFSET K30
CX,10
SCASB
K33
DI,OFFSET K30+1
AL, AL LI NPUT
AH,10
AH
AX,DI
AL LINPUT ,AL
KYBDLEXIT

LOOK FOR SUPERSHI FT ENTRY
0222
0222
0227
022A
022C
022E
0230

C6 06 0019 R 00
89 001A
F2/ AE
75 05
BO 00
E9 0334 R

K33 :
MOV
MOV
REPNE
JNE
MOV
JMP

AL LINPUT,O
CX,26
SCASB
K34
AL,O
K57

CHECK FOR TOP ROW KEYS
0233
0233
0235
0237
0239
023B
023E
0240

3C
72
3C
73
80
80
E9

K34:
CMP
JB
CMP
JAE
ADO
MOV
JMP

02
DC
OE
08
C4 76
00
0334

0254
0254
0259

K35 :
CMP
JAE
K36:
JMP
K37:
CMP
JAE
MOV
JMP

3C 3B
73 03
E9 0396 R
3C
73
BB
E9

47
F9
0000
037C

F6 06 0017 R 04
74 65

K38:
TEST
JZ

ADD IN THE LATEST ENTRY
STORE IT AWAY
THROW AWAY THAT KEYSTROKE
-- AL T + A-Z TYPEWRITER MAKE NO-ALT -KEYPAD
ZERO PREVIOUS ENTRY IN INPUT
01, ES ALREADY POINTING
LOOK FOR MATCH IN ALPHABET
NOT FOUND, FN KEY OR OTHER
ASCI I CODE OF ZERO
PUT IT IN THE BUFFER
-- ALT + PCl (1-9,-,=) MAKE -

AL,2
K35
AL,14
K35
AH,118
AL,O
K57

KEY I N TOP ROW?
NO, JMP
NO, JMP
BUILD PSEUDO SC
BUFFER_FILL

CHECK FOR Fl - FlO
0243
0243
0245
0247
0247
024A
024A
024C
024E
0251

ALT -KEY-PAD
ALT -INPUT-TABLE
LOOK FOR ENTRY US I NG KEYPAD
LOOK FOR MATCH
NO--AL LKEYPAD
01 NOW HAS ENTRY VALUE
GET THE CURRENT BYTE
MUL TIPLY BY 10

--- ALT + (Fl - FlO) MAKE ---

AL, FLKEY
K37

SC POTENTIAL FUNCTION KEY?
YES, JMP
NO. THIS KEY NOT SUPPORTED
IN ALT_SHIFT. EOI RETURN.

AL,ll
K36
BX,OFFSET K13
K63

SC IN FI-FlO REGION?
NO, JMP TO EXIT
ALT+(Fl-FIO) EXT ASCII TABLE
GO XLATE & BUILD PSEUDO SC
««<
»»>
««>>

KBJLAG, CTL_SHI FT
K44

IN CTL_SHIFT?
NO, JMP

------------------- - -- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - --

; IN
025B
0250

3C 46
75 18

025F
0263
0267
026B
0270
0272

8B
89
89
C6
CD
2B

CTL_SHIFT
CMP
JNE

STATE

W/O ALLSHIFT

AL, SCROLL_KEY
K39

CTL+BREAK ENTERED
IE
IE
IE
06
lB
CO

0080
001A
001C
OOll

R
R
R
R 80

2-72 ROM BIOS

MOV
MOV
MOV
MOV
INT
SUB

-

; TEST FOR BREAK
; NO- BREAK

CLEAN UP & DO INT IBH - CTL + BREAK MAKE

BX,8UFFER_START
BUFFER_HEAD,BX
BUFFER_TAIL, BX
BIOS_BREAK,80H
lBH
AX,AX

RESET BUFFER TO EMPTY
TURN ON BIOS_BREAK BIT
BREAK INTERRUPT VECTOR
PUT OUT DUMMY CHARACTER

0274
0277
0277
0279

E9 0334 R

JMP
K39:
CMP
JNE

3C 45
75 2E

027B
0280
0282

80 OE 0018 R 08
BO 20
E6 20

OR
MOV
OUT

0292
0292
0295
0298
0299
029A
029D
029F
02M
02A6
02A9

B8
BB
IE
07
BF
CD
F6
75
E9

-

BUFFEILFI LL
NO-BREAK
LOOK FOR PAUSE KEY
NO-PAUSE

EOI & SLEEP UNTIL UNPAUSE - CTL + NUM_LOCK MAKE

KB_FLAG_1,HOLD_STATE ; TURN ON THE HOLD FLAG
AL,EOI
; EOI TO ALLOW MORE KEYSTROKES
020H,AL

DURING PAUSE INTERVAL, TURN CRT BACK ON

,
80
74
BA
AO
EE

AL,NUMJEY
K41

PAUSE ENTERED

,

0284
0289
028B
028E
0291

K57

3E 0049 R 07
07
03D8
0065 R

CMP
JE
MOV
MOV
OUT

CRT-HODE,7
K40
DX ,03D8H
AL, CRLMODE_SET
DX,AL

CURRENTLY USING MONO?
YES, JMP TO SLEEP
PORT FOR COLOR CARD
GET CURRENT MODE VAULE
SET THE CRT MODE ON

ISSUE SYS SERVICES INT, WAIT ON EXTERNAL EVENT FUNCTION
(WAIT UNTIL HOLD_STATE BIT OF KB_FLAG_1 IS RESET)
K40:
4104
MOV
AX, 4104H
FUNCTION 41H, AL=04=RETURN IF 0
0800
MOV
BX,HOLD_STATE*100H
BH=HOLD_STATE, BL=O=NO TIME OUT
PUSH
DS
MAKE ES:DI POINT TO KB_FLAIL1
POP
ES
0018 R
MOV
DI,OFFSET KBJLAG_1
15
INT
15H
; SLEEP UNTI L OUT OF HOLD
06 0018 R 08
TEST
KB_FLAG_1,HOLD_STATE; DID INT 15H RESET HOLD_STATE?
EC
JNZ
K40
; NO, KEEP LOOPING
039B R
JMP
KYBD9_RET
; YES, GO TO NON_EO I EXIT
K41:
;----- TEST FOR PRINT SWITCH TOGGLE CMD

02A9
02AB
02AD
02BO

3C
75
B8
E9

37
06
7200
0334 R

CMP
JNE
MOV
JMP

AL, P60--ASTRLSC
K42
AX ,114*256
K57

CHECK FOR TYPEWRITER KEYS
02B3
02B3
02B6
02B8

K42:
MOV
CMP
JB

BB 0000
3C 3B
72 76

BX,OFFSET K8
AL, FLKEY
K56

[[[ CTL + */PRTSC MAKE ]]]

* KEY HIT?
NO, JMP
YES, BUILD TOGGLE_PRLSW PSEUDO SC
BUFFER_FILL
[[[ CTL + TYPEWRITER KEY MAKE 1]]
BX <=== CTL + TYPEWRITER KEYS TABLE
SC BELOW TYPEWRITER REGION?
YES, GO TRANSLATE TO ASCII CODE

KEY IS IN FN OR KEYPAD REGION
[[[ CTL + (F1-F10) ]]]
[[[ CTL + PAGE/CURSOR KEY]]]
02BA
02BA
02BD

K43:
MOV
JMP

BB 0000 E
E9 037C R

BX,OFFSET K9
K63

CTL FN & CTL PAGE/CUR TBLS
GO XLATE & BUILD PSEUDO SC

<<<<<

««< NOT IN CTL_SHI FT
««<
NOR AL LSHI FT

>>>>>

»»>
»»>

CHECK IF KEY IN KEYPAD REGION (1-9,.,-,+)
02CO
02CO
02C2
02C4
02C9

3C
73
F6
74

47
2C
06 0017 R 03
5A
IN

K44:
CMP
JAE
TEST
JZ
SHIFT

STATE

AL,71
; KEY IN KEYPAD REGION?
K48
; YES, JMP
KB_FLAG,LEFLSHIFT+RIGHLSHIFT ; IN SHIFT STATE?
K54
; NO, JMP
,BUT KEY IS NOT IN KEYPAD REGION

CHECK FOR BACK TAB
02CB
02CD
02CF
02D2

3C
75
B8
EB

OF
05
OFOO
60

CMP
JNE
MOV
JMP

AL, TAB_KEY
K45
AX, TAB_KEY*256
SHORT K57

[[[[ SHIFT + TAB ]]]
TAB KEY?
NO ,JMP
BUILD BACK_TAB PSEUDO SC
BUFFER_FILL

ROM BIOS 2-73

CHECK FOR PRINT SCREEN
0204
0204
0206
0208
02DA
02DC
02DE

3C
75
BO
E6
CD
E9

K45:
CMP
JNE

37
09
20
20
05
039B R

-

EOI THEN INT 5H

Al, P60--ASTRLSC
K46
Al, EOI
INTAOO,Al
5H
KYBDLRET

MOV
OUT
INT
JMP

3C
72
BB
E9

K46:
CMP
JB

3B
06
0000 E
037C R

Al, FLKEY
K47
BX,OFFSET K12
K63

MOV
JMP

KEY IS IN TYPEWRITER REGION
02EB
02EB
02EE

PRINT SCREEN KEY?
NO, JMP
EOI TO AllOW MORE INTERRUPTS
ISSUE PRINT SCREEN INTERRUPT
GO TO NON_EO I EX IT
[[[ SHIFT + (Fl-FlO) ]]]

CHECK FOR FUNCTION KEY
02El
02El
02E3
02E5
02E8

- SHIFT + */PRTSC

Fl - FlO KEY?
NO, JMP
BX SHIFT F1-FlO EXT ASCII TBl
GO XLATE & BUilD PSEUDO SC
[[[ SHIFT + TYPEWRITER KEY]]]

K47 :
BB 0000
EB 40

MOV

BX,OFFSET Kll
SHORT K56

JMP

; BX=UPPERCASE ASCI I CODE TBl
; GO TRANSLATE TO ASCI I CODE

-- - -- - - - - - - - - - - - - - - - - - -- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; KEYPAD KEY:

NOT IN AlT OR CTl SHIFT:DETERMINE IF KEYPAD OR PG/CUR

----------- - -- - - - - - - - - -- - - - - - - - - - - -- - - - - -- - - - - - - - - - - - - - - - - - -- - - - - - --

02FO
02FO
02F5
02F7
02FC

F6
75
F6
75

06 0017 R 20
20
06 0017 R 03
20

K48:
TEST
JNZ
TEST
JNZ

KBJlAG,NUM_STATE
; IN NUM_STATE?
K52
; YES, JMP
KBJlAG, lEFLSHI FT +RIGHLSHI FT ; NUM_STATE?
K53
; YES, GO PROCESS

BASE CASE KEYPAD (PAGE/CURSOR) KEY -PAGE/CURSOR, DEL, -, + --02FE
02FE
0300
0302
0304
0306
0308
030B
0300
0300
0310
0312
0312
0315

3C
74
3C
74
2C
BB
EB

K49 :
CMP
JE
CMP
JE
SUB

4A
OB
4E
OC
47
0000
71

MOV
JMP
K50:

MOV

B8 4A2D
EB 22

JMP
K51 :

MOV

B8 4E2B
EB 10

JMP
IN NUM_STATE

0317
0317
031C

F6 06 0017 R 03
75 EO

031E
031E
0320
0323

2C 46
BB 0000
EB OB

K52 :
TEST
JNZ
K53:
SUB

MOV
JMP

Al,KYPDJ1INUS
K50
Al, KYPD_PlUS
K51
Al,71
BX,OFFSET K15
SHORT K64
AX,74*256+'SHORT K57

,

AX, 78*256+' +'
SHORT K57
-

KEYPAD MINUS KEY?
YES, JMP
KEYPAD PLUS KEY?
YES, JMP
ADUST SC FOR TABLE OFFSET
BX=KEYPAD AREA BASE CASE TBl
GO TRANSLATE & BUilD PSEUDO SC
BlD EXT ASCI I CODE FOR MINUS
BUFFEILFIll
BlD EXT ASCI I CODE FOR PLUS
BUFFEILFIll

CHECK IF TEMPORARilY SHIFTED OUT

KB_FlAG, lEFT _SHI FT +RI GHT_SHI FT
K49
Al,70
BX ,OFFSET K14
SHORT K56

; NOT NUM STATE?
; YES, JMP TO BASE
; KEYPAD XlAT
[[[ KEYPAD 0-9, ., -, + ]]]
ADJUST SC FOR TABLE OFFSET
BX=KEYPAD KEYS' ASCI I CODES
GO XLATE & BUilD ASCII CODE

-------------------------------------------------------

; NOT IN ANY SHI FT STATE
; KEYPAD REGION HAS BEEN PROCESSED (SC 69 & UP)
CHECK FOR F1-F10
0325
0325
0327
0329
032B

3C
72
BO
EB

3B
04
00
37

K54:
CMP
JB

MOV
JMP

Al,FLKEY
K55
Al,O
SHORT K61

-

[[[ BASE Fl - FlO ]]]
FUNCTI ON KEY?
NO, JMP
SCAN CODE IN AH ALREADY
BUFFER_Fill

KEY MUST BE FROM TYPEWRITER REGION -- BASE TYPEWRITER KEY ---

2-74 ROM BIOS

0320
0320

K55:
MOV

SS 0000

; T RAN S L ATE
0330
0330
0332

K56 :
DEC
XLAT

FE C8
2E: 07

; 8X=SASE CASE ASCI I TSL

8X,OFFSET K10

SC TO EXTENDTEO ASCII CODE

AL
cs: Kll

BUFFER

; ADJUST SC FOR TABLE OFFSET
; TRANSLATE FROM TABLE IN BX

PUT CHARACTER INTO BUFFER
0334
0334
0336
0338
0338

3C
74
80
74

K57 :
CMP
JE
CMP
JE

FF
IF
FC FF
1A

AL ,-1
K59
AH, -1
K59

IGNORE CODE XLATED FROM TABLE?
YES, GO TO EOI EXIT
IGNORE PSEUDO SCAN?
YES, GO TO EOI EXIT

CHECK FOR CAPS_STATE
0330
0330
0342

F6 06 0017 R 40
74 20

;

K58:
TEST
JZ

KB_FLAG,CAPS_STATE; ARE WE IN CAPS LOCK STATE
K61
; SKIP IF NOT

;----- DETERMINE WHICH WAY TO CONVERT
0344
0349

F6 06 0017 R 03
74 OF

034B
0340
034F
0351
0353
0355
0357
0357

3C
72
3C
77
04
EB

TEST
JZ

CMP
JB
CMP
JA
ADD
JMP
K59:
JMP

EB 3D 90

3C
72
3C
77
2C

61
06
7A
02
20

K60:
CMP
JB
CMP
JA
SUB

»»»
»»»

IN SHI FT STATE?
; NO, JMP

ALPHABETI C CHARS ONLY

AL, I AI

ALPHABETIC CHAR?
NO, JMP

K61
AL, 'Z'
K61
AL, I a ,_, AI
SHORT K61

NO, JMP
YES, CONVERT TO LOWER CASE.
GO BUFFER

KYBDLEXIT

CONVERT LOWER CASE TO UPPER
035A
035A
035C
035E
0360
0362

IN CAPS_STATE

KB_FLAG, LEFT _SHI FT +RI GHT_SH I FT
K60

CONVERT UPPER CASE TO LOWER
41
15
5A
11
20
00

«««
«««

INTERRUPT_RETURN
ALPHABETI C CHARS ONLY

AL, I a I
K61
AL, I z I
K61
AL, 'a'-'A'

ALPHABETIC CHAR?
NO, JMP
NO, JMP
YES, CONVERT TO UPPER CASE

, ---- ------------- - -- - - - - - - - - - - - -- - - - - - - - - - - - - - - - - - -; BUFFER EXTENDED ASCI I CODE I F NOT FULL

0364
0364
0368
036A
0360
0371
0373
0375
0379

-- ------------------------ -- - - - - - - - - - - - - - - - - - - - - -- --

8B
8B
E8
3B
74
89
89
EB

IE 001C R
F3
03A4 R
IE 001A R
13
04
IE 001C R
1B 90

K61 :
MOV
MOV
CALL
CMP
JE
MOV
MOV
JMP

BX,BUFFER_TAIL
SI, BX
PTR_INC
BX, BUFFER_HEAD
K62
[SI],AX
BUFFER_TAIL,BX
KYBD9_EXIT

GET BUFFER TAIL POINTER
SI <=== TAIL PTR
ADVANCE THE TAIL
HAS BUFFER WRAPPED AROUND?
YES, GO GIVE BUFFER_FULL_BEEP
NO, BUFFER THE CODE
UPDATE TAIL PTR
GO TO EOI EXIT

TRANSLATE F1-FlO SCAN CODES TO AN EXTENDED ASCII CODE
(FOR SHIFT, ALT, & CTL STATES)
037C
037C
037E
037E

2E: 07

0380
0382
0384

8A EO
BO 00
EB AE

2C 3B

K63:
SUB
K64:
XLAT
MOV
MOV
JMP

AL, FLKEY
cs :K9
AH,AL
AL,O
K57

-

; ADJUST SC FOR TABLE OFFSET
XLAT FROM TABLE IN BX
(K9,K12,K13)
BUILD EXTENDED ASCII CODE
GO BUFFER

ROM BIOS 2-75

BUFFER IS FULL, SOUND THE BEEPER
0386
0386
0388
038A
038D
0390
0393

BO
E6
BB
B9
E8
EB

20
20
0053
0081
0000 E
06 90

K62 :
MOV
OUT
MOV
MOV
CALL
JMP

AL, EO!
INTAOO,AL
BX,083
CX,081H
KB_NOISE
KYBD9_RET

, - - -- - - -- - - - - - -- - - - -- - - - - - --

END OF INTERRUPT COMMAND
SEND CMD TO INT CONTROL PORT
NO. CYCLES FOR 83 MSEC TONE
1/2 CYCLE FOR 1KHZ TONE
RETURN WITHOUT EOI

; ISSUE EOI & RETURN

----- - -- - - - - -- - - - - - -- -- - - --

0396
0396
0397
0399

KYBD9_EXIT :
CLI
MOV
AL,EOI
OUT
INTAOO,AL

FA
BO 20
E6 20

TURN OFF INTERRUPTS
ISSUE EOI

RETURN WITH EOI ALREADY ISSUED
039B
039B
039C
039D
039E
039F
03AO
03Al
03A2
03A3
03A4

KYBD9_RET:
POP
ES
POP
DS
POP
DI
POP
SI
POP
DX
POP
CX
POP
BX
POP
AX
IRET
KYBD_INT9 ENDP

07
IF
5F
5E
5A
59
5B
58
CF

RESTORE REGS

; RETURN:

I RPTS SET BACK AS WERE

; **********************************************************************
ROUTINE-NAME:
FUNCTION:

PTR_INC

INCREMENT THE KEYBOARD BUFFER POINTER AND WRAP THE BUFFER
I F NECESSARY.

ENTRY CONDITIONS:

DS= DATA SEGMENT
BX= POINTER TO INCREMENT

EXIT CONDITIONS:
BX INCREMENTED BY 2 AND I F BUFFER_END EXCEECE
BX IS SET TO BUFFER_START.
REGISTERS MODIFIED: BX
03A4
03A4
03A5
03A6
03AA
03AC
03BO
03BO
03B1
03B1

; **********************************************************************
43
43
3B IE 0082
75 04
8B IE 0080
C3

PTR_INC
PROC
NEAR
INC
BX
INC
BX
CMP
BX, BUFFER-END
PTR_Ol
JNE
MOV
BX, BUFFER-START
PTR_01 :
RET
PTR-INC ENDP
ROM CODE ENDS
END

2-76 ROM BIOS

MOV E TO NEXT WORD IN LIST
AT END OF BUFFER?
NO, CONTI NU E
YES, RESET TO BUFFER BEGINNING

Video I/O and Print Screen
(B12VIDEO)
ROMCOOE SEGMENT BYTE PUBLIC
ASSUME CS: ROMCODE
IDENT BI2VIDEO,12,00

0000

; ********************************************************************
MODULE-NAME:

B12VIDEO

DATE LAST MODI FlED:

09(12(85

DESCRIPTIVE-NAME: VIDEO_IO AND PRINT SCREEN BIOS
COPYRIGHT: 7396-917 (C) COPYRIGHT IBM CORP. 1985
REFER TO COPYRIGHT INSTRUCTIONS FORM NUMBER G120-2083
CHANGE LEVEL: 0.0
FUNCTION:

VIDEO_IO
HANDLES ALL BIOS VIDEO REQUESTS
HANDLES THE PRINT SCREEN FUNCTION
PRINLSCREEN

MODULE SIZE: 2829 BYTES
ENTRY CONDITIONS:
REFER TO ROUTINE PROLOGUES
EXIT CONDITIONS:
REFER TO ROUTINE PROLOGUES
ROUTINES IN MODULE:
VIDEO_IO
PRINLSCREEN
INTERNAL DATA AREAS

INT 10H DISPLAY INTERFACE ROUTINES
INT 5H PRINT SCREEN INTERRUPT HANDLER
TABLES:

MLl, REGS_PUSHD, VI

EXTERNALLY REFERENCED ROUTINES: REFER TO EXTRN LIST
EXTERNALLY REFERENCED DATA AREAS: DATA SEG, XXDATA SEG, VIDEO RAM

,

CHANGE ACTIVITY:

NONE

; ********************************************************************
; *****************************************************************
;*

EXT ERN A L

REF ERE N C E S

; *****************************************************************
ROUTINES
EXTRN
EXTRN
EXTRN
EXTRN
EXTRN
EXTRN

DDS: NEAR
BEEP:NEAR
KB_NOISE:NEAR
GELRTLREG: NEAR
PULRTLREG:NEAR
LCDINIT:NEAR

EXTRN
EXTRN
EXTRN
EXTRN
EXTRN
EXTRN

CHAILGEN_LO: BYTE
CHAR_GEN_HI: BYTE
M4 :ABS
M5:WORD
M6:BYTE
M7: BYTE

TABLES

ROM BIOS 2-77

MONO_TBL: WORD
CGA_TBL: WORD

EXTRN
EXTRN
EXTRN
EXTRN

LCD~ONO_TBL: WORD
LCD_CGA_TBL: WORD

*****************************************************************
PUBLICS

DECLARATION

*****************************************************************
PUBLIC
PUBLI C
PUBLIC
PUBLIC
PUBLIC
PUBLI C
PUBLIC
PUBLIC
PUBLIC
PUBLIC
PUBLI C
PUBLIC
PUBLIC

VIDEO_IO_l
PRLSCRN
SELMODE
SELCTYPE
SELCPOS
READ_CURSOR
READ_LPEN
ACLDISP_PAGE
SCROLLUP
SCROLL_DOWN
READ_ALCURRENT
WRITUILCURRENT
WRITE_LCURRENT

PUBLIC SET_COLOR

PUBLIC WRITE_DOT
PUBLIC READ_DOT
PUBLIC WRITE_TTY
SUBTTL

VIDEO BIOS

- INT lOH

; ********************************************************************
ROUTINE-NAME:
FUNCTION:

VIDEO_JO

THIS ROUTINE HANDLES THE VIDEO BIOS REQUESTS - INT lOH

ENTRY CONDITIONS:
PURPOSE OF ENTRY: SEE INT 10H DESCRIPTION
INPUT CONDITIONS: SEE INT 10H DESCRIPTION
RESTRICTIONS: NONE
EXIT CONDITIONS:
NORMAL EXIT CONDITIONS: SEE INT 10 DESCRIPTION
ERROR EXIT CONDITIONS: NO ERROR REPORTING INTERFACE IS DEFINED
REGISTERS MODIFIED: ALL REGISTERS EXCEPT AX ARE SAVED UNLESS
THEY ARE USED TO RETURN INFO AS DEFINE
IN THE INT 10H DESCRIPTION
RETURN TYPE: IRET (ALL FLAGS RESTORED)
INTERRUPTS: ENABLED OUR I NG PROCESSI NG
INTERNALLY REFERENCED ROUTINES:
ACLOISP _PAGE,
LCD_REQUEST,
PHYS_DSP _DESCR_REQ,
PRLSCREEN,
READ-ALCURRENT,
READ_CURSOR,
READ_DOT,
READ_LPEN,
SCROLL_UP,
SCROLL_DOWN,

SELCOLOR,
SELCPOS,
SELCTYPE,
SELMODE,
VIDEO_STATE,
WRITE-ALCURRENT,
WRITE_LCURRENT,
WRITE_DOT,
WRITE_STRI NG,
WRITE_TTY

EXTERNALL Y REFERENCED ROUTI NES:
DDS,
BEEP,
KB_NOISE,
GET _RTLREG,
PULRTLREG,
LCDINIT

; *********************************************************************

2-78 ROM BIOS

- - - I NT lOH - - -- - - -- -- - - -- - - - - - - -- - - - - - - - - - - -- -- - - - - - - - - -- - - - - - - - - - -VIDEO_IO
THESE ROUTINES PROVIDE THE CRT INTERFACE
THE FOLLOWI NG FUNCTIONS ARE PROV I OED:
(AH) =OOH

SET MODE (AL) CONTAINS MODE VALUE
TYPE
RES/DIM
DISPLAY
MAX PAGES

(AL)=O
(AL) =1
(AL)=2
(AL) =3
(AL)=4
(AL) =5
(AL) =6
(AL) =7
NOTE:

ALPHA
ALPHA
ALPHA
ALPHA
GRAPHICS
GRAPHICS
GRAPHICS
ALPHA

40X25
40X25
80X25
80X25
320X200
32DX200
640X200
80X25

COLOR - BW** 8
COLOR
8
COLOR - BW** 4
COLOR
4
COLOR
1
COLOR - BW
1
COLOR - BW
1
MONOCHROME
1/4

NOTES

*

DEFAULT

*

INTERNAL

IF HIGH BIT OF AL IS SET, THE REGEN BUFFER IS NOT CLEARED.

FOR MONOCHROME, CRT MODE WILL INTERNALLY DEFAULT TO 7.
FOR MONO ON LCD THE MAXIMUM PAGES ALLOWED IS 4, OTHERWISE
THE MAXIMUM PAGES ALLOWED IS 1.
FOR COLOR, AL=(7-255) WILL DEFAULT TO MODE 3
BW MODES OPERATE SAME AS COLOR MODES, BUT COLOR BURST IS
NOT ENABLED
(AH)=OlH SET CURSOR TYPE
(CH) = BITS 4-0 = START LINE FOR CURSOR
** HARDWARE WILL ALWAYS CAUSE BLINK
** SETTING BIT 5 OR 6 WILL CAUSE ERRATIC
** BLINKING OR NO CURSOR AT ALL
(CL)
BITS 4-0 = END LINE FOR CURSOR
(AH)=02H SET CURSOR POSITION
(BH) = PAGE NUMBER (MUST BE 0 FOR GRAPHICS MODES)
(DH,DL) = ROW,COLUMN (0,0) IS UPPER LEFT
ROW = (0 - 24), COL = (0 - (CRT COLUMNS-i))
CRT COLUMNS IS EITHER 80 OR 40
(AH)=03H READ CURSOR POSITION
(BH) = PAGE NUMBER (MUST BE 0 FOR GRAPHICS MODES)
ON EXIT:
(DH,DL) = ROW,COLUMN OF CURRENT CURSOR
(CH,CL) = CURSOR MODE CURRENTLY SET
(AH)=04H

READ LIGHT PEN POSITION
ON EXIT:
(AH) = 0 -- LIGHT PEN SWITCH NOT DOWN/NOT TRIGGERED
(AH) = 1 -- VALID LIGHT PEN VALUE IN REGISTERS
(DH,DL) = ROW,COLUMN OF CHARACTER LP POSN
(CH) = RASTER LINE (0-199)
(BX) = PIXEL COLUMN (0-319,639)

(AH)=05H

SELECT ACTIVE DISPLAY PAGE(VALID ONLY FOR ALPHA MODES)
(AL)=NEW PAGE VALUE
VALID PAGE VALUES: ALSO, SEE AH=OOH FOR PAGE INFO
MODES 0 & 1 - (0 - 7)
MODES 2 & 3 - (0 - 3)
MODE 7
0
MODE 7 & LCD CONFIGURED AS MONO - (0 - 3)

(AH)=06H

SCROLL ACTIVE PAGE UP
(AL) = NUMBER OF LINES, INPUT LINES BLANKED AT BOTTOM
OF WINDOW
AL = 0 MEANS BLANK ENTIRE WINDOW
(CH,CL) = ROW,COLUMN OF UPPER LEFT CORNER OF SCROLL
(DH,DL) = ROW,COLUMN OF LOWER RIGHT CORNER OF SCROLL
(BH) = ATTRIBUTE TO BE USED ON BLANK LINE

ROM BIOS 2-79

(AH) =07H

SCROLL ACTIVE PAGE DOWN
(AL) = NUMBER OF LINES, INPUT LINES BLANKED AT TOP
OF WINDOW
AL = 0 MEANS BLANK ENTI RE WI NDOW
(CH,CL) = ROW,COLUMN OF UPPER LEFT CORNER OF SCROLL
(DH,DL) = ROW,COLUMN OF LOWER RIGHT CORNER OF SCROLL
(BH) = ATTRIBUTE TO BE USED ON BLANK LINE

CHARACTER HANDLI NG ROUTI NES
(AH) =08H

READ ATTRI BUTE/CHARACTER AT CURRENT CURSOR POSITION
(BH) = DISPLAY PAGE (FOR ALPHA MODES ONLY)
ON EXIT:
(AL) = CHAR READ
(AH) = ATTRIBUTE OF CHAR READ (ALPHA MODES ONLY

(AH)=09H

WRITE ATTRIBUTE/CHARACTER AT CURRENT CURSOR POSITION
(BH) = DISPLAY PAGE (FOR ALPHA MODES ONLY)
(CX) = COUNT OF CHARACTERS TO WRITE
(AL) = CHAR TO WRITE
(BL) = ATTRIBUTE OF CHARACTER (ALPHA)/COLOR OF CHAR
(GRAPHICS)
SEE NOTE ON WRITE DOT FOR BIT 7 OF BL = l.

(AH) =OAH

WRITE CHARACTER ONLY AT CURRENT CURSOR POSITION
**** NOT VALID FOR MEDIUM RESOLUTION GRAPHICS ****
(BH) = DISPLAY PAGE (FOR ALPHA MODES ONLY)
(CX) = COUNT OF CHARACTERS TO WRITE
(AL) = CHAR TO WRITE
FOR READ/WRITE CHARACTER INTERFACE WHILE IN GRAPHICS MODE, THE
CHARACTERS ARE FORMED FROM A CHARACTER GENERATOR IMAGE
MAINTAINED IN THE SYSTEM ROM.
FOR WRITE CHARACTER INTERFACE IN GRAPHICS MODE, THE REPLICATION
FACTOR CONTAINED IN (CX) ON ENTRY WILL PRODUCE VALID
RESULTS ONLY FOR CHARACTERS CONTAI NED ON THE SAME ROW.
CONTINUATION TO SUCCEEDING LINES WILL NOT PRODUCE
CORRECTL Y.
GRAPH I CS INTERFACE
(AH)=OBH SET COLOR PALETTE
(BH) = PALETTE COLOR ID BEING SET (0-127)
(BL) = COLOR VALUE TO BE USED WITH THAT COLOR ID
NOTE: FOR THE CURRENT COLOR CARD, THIS ENTRY POINT
HAS MEANING ONLY FOR 320X200 GRAPHICS.
COLOR ID = 0 SELECTS THE BACKGND COLOR (0-15)
COLOR ID = 1 SELECTS THE PALETTE TO BE USED:
o = GREEN(1)/RED(2)/YELLOW(3)
1 = CYAN(I)/MAGENTA(2)/WHITE(3)
IN 40X25 OR 80X25 ALPHA MODES, THE VALUE SET
FOR PALETTE COLOR 0 INDICATES THE
BORDER COLOR TO BE USED (VALUES 0-31,
WHERE 16-31 SELECT THE HIGH INTENSITY
BACKGROUND SET.
(AH)=OCH

WRITE DOT
(DX) = ROW NUMBER
(CX)
COLUMN NUMBER
(AL) = COLOR VALUE
IF BIT 7 OF AL = 1, THEN THE COLOR VALUE IS
EXCLUSIVE OR' D WITH THE CURRENT CONTENTS OF
THE DOT

(AH)=ODH

READ DOT
(DX) = ROW NUMBER
(CX) = COLUMN NUMBER
ON EXIT:
(AL) = THE DOT READ

2-80 ROM BIOS

ASCI I TELETYPE ROUTINE FOR OUTPUT
(AH)=OEH

WRITE TELETYPE TO ACTIVE PAGE
(AL) = CHAR TO WRITE
(BL) = FOREGROUND COLOR I N GRAPH I CS MODE
NOTE --SCREEN WIDTH IS CTRLLED BY PREVIOUS MODE SET

(AH)=OFH

CURRENT VIDEO STATE
RETURNS THE CURRENT VIDEO STATE
ON EXIT:
(AL) = MODE CURRENTLY SET ( SEE AH=O FOR EXPL
(AH) = NUMBER OF CHARACTER COLUMNS ON SCREEN
(BH) = CURRENT ACTIVE DISPLAY PAGE

(AH)=lOH
(AH) =llH
(AH)=12H

RESERVED - NO OPERATION
RESERVED - NO OPERATION
RESERVED - NO OPERATION

(AH)=13H

WRITE STRING
(ES:BP) = POINTER TO STRING TO BE WRITTEN
(CX)
= LENGTH OF CHARACER STRING TO WRITTEN
IF CX = 0 NO OPERATION
(OX)
= CURSOR POSITION FOR STRING TO BE WRITTEN
(BH)
= PAGE NUMBER
(AL)

0
WRITE CHARACTER STRING
BL
- ATTRIBUTE
STRING IS {CHAR,CHAR, ... ,CHAR}
CURSOR NOT MOV ED
(AL) = 1
WRITE CHARACTER STRING AND MOVE CURSOR
BL
- ATTRI BUTE
STRING IS {CHAR,CHAR, ... ,CHAR}
CURSOR IS MOVED
(AL) = 2
WRITE CHARACTER AND ATTRI BUTE STRING
STRING IS {CHAR,ATTR,CHAR,ATTR.. ,CHAR,ATTR}
CURSOR IS NOT MOVED
(AL) = 3
WRITE CHARACTER AND ATTR STRING AND MOVE CURSO
STRING IS {CHAR,ATTR,CHAR,ATTR.. ,CHAR,ATTR}
CURSOR IS MOVED
(AL) = 4 - 255
NO OP ERA TI ON

NOTE:

CARRIAGE RETURN, LINE FEED, BACKSPACE, AND BELL ARE
TREATED AS COMMANDS RATHER THAN PRINTABLE CHARACTERS.

ROM BIOS 2-81

(AH) =14H

LCD REQUEST
LOAD LCD CHARACTER FONT / SET LCD HIGH INTENSITY
SUBSTITUTE
(AL) = 0
(ES)
(01)
(CX)

-

LOAD USER SPECIFIED FONT
SEGMENT ADDRESS OF USER CHARACTER TABLE
OFFSET TO FIRST CHARACTER TO BE STORED
NUMBER OF CHARACTERS TO STORE
(1 - 256) VALUE CHECKED
(DL) - CHAR OFFSET INTO RAM FONT STORAGE
(BH) - NUMBER OF BYTES PER CHARACTER
(1 - 255) VALUE CHECKED
(BL) - 0 = LOAD MAIN FONT (BLOCK 0)
1 = LOAD ALTERNATE FONT (BLOCK 1)
2 - 255 = NO OPERATION

(AL) = 1 - LOAD SYSTEM ROM DEFAULT FONT
(BL) - 0 = LOAD MAIN FONT (BLOCK 0)
1 = LOAD ALTERNATE FONT (BLOCK 1)
2 - 255 = NO OPERATION
(AL) = 2 -SET MAPPING OF LCD HIGH INTENSITY ATTRIBUTE
(BL) - INTENSIFY MAPPING INPUT REGISTER
o = IGNORE HIGH INTENSITY ATTRIBUTE
1 = MAP HIGH INTENSITY TO UNDERSCORE
2 = MAP HIGH INTENSITY TO REVERSE IMAGE
3 = MAP INTENSITY TO SELECT ALTERNATE FONT
4 - 255 = NO OPERATION
(AL) = 3 - 255
NO OPERATION
(AH) =15H

PHYS I CAL 01 SPLAY DESCRI PTI ON PARAMETER REQUEST
RETURNS THE ADDRESS OF A 7 WORD TABLE WHICH CONTAINS
THE DESCRIPTION PARAMETERS OF THE CURRENT DISPLAY.
IT ALSO RETURNS THE MONITOR NUMBER OF THE ALT DISPLAY
ON EXIT:
(ES: 01) = POINTS TO A 7 WORD PARAMETER TABLE
AX = MONITOR NUMBER OF ALT DISPLAY. IF THERE IS
NO ALTERNATE DISPLAY OR THE ALT DISPLAY IS
INOPERATIVE THEN AX = O.
THE 7 WORD TABLE CONTAINS THE FOLLOWING INFOMATION:
WORD
I NFORMATION
1
MONITOR MODEL NUMBER (5140,5153,5151)
NUMBER OF VERTICAL PELS / METER
2
3
NUMBER OF HORIZONTAL PELS / METER
4
TOTAL NUMBER OF VERTICAL PELS
5
TOTAL NUMBER OF HORIZONTAL PELS
6
HORIZONTAL PEL SPACING IN MICROMETERS
(CENTER TO CENTER)
VERTICAL PEL SPACING IN MICROMETERS
(CENTER TO CENTER)
DISPLAY TYPES AND TABLES

WORD

MONOCHROME

CGA

LCD AS CGA

LCD AS MONO

5140
08El
0987
00C8
0280
01BB
019A

5140 HEX
0
0
0
0
0
0

----------------------- ------------- - -- - - -- - - - -- -- - - - - -1
2
3

4
5

6
7

5151 HEX
0
0
0
0
0
0

5153
0498
OA15
00C8
0280
0352
0184

HEX
HEX
HEX
HEX
HEX
HEX
HEX

HEX
HEX
HEX
HEX
HEX
HEX
HEX

; *****************************************************************
;*

S TAR T

0 F

COD E

; *****************************************************************
ASSUME

2-82 ROM BIOS

CS: ROMCODE, OS: DATA, ES: VIDEO_RAM

0000
0000 0069
0002 OlBA
0004 0241
0006 0290
0008 0703
OOOA 026C
OOOC 02F7
OOOE 037A
0010 03B6
0012 03FC
0014 0430
0016 02AB
0018 0474
OOlA 0463
001C 074F
001E 0201
0020 016F
0022 016F
0024 016F
0026 0879
0028 0927
002A 09E6
= 002C
0000
0002
0004
0006
0008
OOOA
OOOC
OOOE
0010
0012
0014
0016
0018
002C
002C
0020
002E
002F
0030
0031
0032
0033
0034
0035
0036
0037
0039
003B
0030
003F
0042
0044
0045
0048
0048
004B
004E
0052
0056
0059
005B
0050
0050
005F
0060

R
R
R
R
R
R
R
R
R
R
R
R
R
R
R
R
R
R
R
R
R
R

0000
0000
0000
0000
0000
0000
0000
0000
0000
0000
0000
0000

MLI
OW
OW
OW
OW
OW
OW
OW
OW
OW
OW
OW
OW
OW
OW
OW
OW
OW
OW
OW
OW
OW
OW
M1L_1

TBL OF RTNS WITHIN VIDEO I/O
LABEL
WORD
OFFSET SELMODE
OFFSET SELCTYPE
OFFSET SELCPOS
OFFSET READ_CURSOR
OFFSET REAO_LPEN
OFFSET ACLOISP_PAGE
OFFSET SCROLL_UP
OFFSET SCROLL_DOWN
OFFSET REAO-ACCURRENT
OFFSET WRITUCCURRENT
OFFSET WRITE_CCURRENT
OFFSET SELCOLOR
OFFSET WRITLOOT
OFFSET READ_DOT
OFFSET WRITLTTY
OFFSET VIDEO_STATE
OFFSET VIDEO_RETURN
OFFSET VIDEO_RETURN
OFFSET VIDEO_RETURN
OFFSET WRITLSTRING
OFFSET LCD_REQUEST
OFFSET PHYS_OSP_DESCR-REQ
$-ML1
EQU

REGS_PUSHO
TEMPBP OW
BP _POS OW
DLPOS OW
SLPOS OW
BLPOS OW
CLPOS OW
OLPOS OW
DS_POS OW
ES_POS OW
IP_POS OW
CS_POS OW
FL_POS OW
REGS_PUSHO

STRUC
0
0
0
0
0

a
0
0
0

a
0
0
ENDS

06
IE
52
51
53
56
57
55

VIOEO_IO_1
PUSH
PUSH
PUSH
PUSH
PUSH
PUSH
PUSH
PUSH

FB
FC
50
8A
32
01
8B
3D
72
58
E9

STI
CLO
PUSH
MOV
XOR
SAL
MOV
CMP
JB
POP
JMP

AX
AL,AH
AH,AH
AX,l
SI,AX
AX ,M1L_1
M2
AX
VIDEO_RETURN

CALL
MOV
MOV
AND
CMP
JNE
MOV

DDS
AX ,OB800H
01, EQUIP-FLAG
01,30H
01,30H
M3
AH,OBOH

MOV
POP
MOV

ES,AX
AX
AH,CRLMODE

C4
E4
EO
FO
002C
04
016F R

PROC
ES
OS
OX
CX
BX
SI
DI
BP

NEAR
SAVE REGISTERS

SAVE AX VALUE
GET I NTO LOW BYTE
ZERO TO HIGH BYTE
*2 FOR TABLE LOOKUP
PUT INTO SI FOR BRANCH
TEST FOR WITHIN RANGE
BRANCH AROUND BRANCH
THROW AWAY THE PARAMETER
DO NOTHING IF NOT IN RANGE

M2:
E8
B8
8B
81
83
75
B4

0000 E
B800
3E 0010 R
E7 0030
FF 30
02
BO

SEGMENT FOR CGA CARD
GET EQUIPMENT SETTING
ISOLATE CRT SWITCHES
IS SETTING FOR MONO CARD?
SEGMENT FOR MONO CARD

M3:
8E CO
58
8A 26 0049 R

SET PTR TT VIDEO RAM AREAS
RECOVER VALUE
GET CURRENT MODE INTO AH

ROM BIOS 2-83

0064
0069

2E: FF A4 0000 R

JMP
VIDEO_IO~1

WORD PTR CS: [SI+OFFSET MLIJ
ENDP

SELMODE
THIS ROUTINE INITIALIZES THE ATTACHMENT TO
THE SELECTED MODE. THE SCREEN IS BLANKED.
IF CGA, THE ONLY VALID MODES ALLOWED ARE 0-6.
ALL OTHER MODES ARE DEFAULTED TO MODE 3.
IF MONO, MODE IS DEFAULTED TO 7.
INPUT
(AL) = MODE SELECTED
(DS) = DATA SEGMENT
(ES) = REGEN BUFFER SEGMENT
(DJ) = VIDEO SWITCHES FROM EQUIPMENT FLAG
OUTPUT
CURRENT DISPLAY INITIALIZED TO SELECTED MODE
INTERRUPTS
DISABLED DURING THE INITIALIZATION OF THE
6845 REGISTERS

-------- - -- - - ---------- ------ - -- - - - - - - -- - -- - - - - - - - - - - - -0069
0069
006A
006C
006F
0071
0074
0076
0078
007A
007C

50
24
BA
B3
83
74
3C
72
BO
EB

SETJ10DE
PUSH
AND
MOV
MOV
CMP
JE
CMP
JB
MOV
JMP

7F
0304
00
FF 30
08
07
OA
03
06

PROC
AX
AL, 7 FH
DX,03D4H
BL ,0
DI,30H
M8
AL,7
M8A
AL,3
SHORT M8A

NEAR
SAVE CLEAR REGEN BIT
TURN OFF CLEAR REGEN BIT
ADDRESS OF CGA CARD
MODE SET FOR CGA CARD
IS MONO CARD INSTALLED
YES, JUMP TO MONO SET
IS MODE 7 OR GREATER FOR CGA
CARD THEN DEFAULT TO
MODE 3 (80 x 25 COLOR)

MONOCHROME OPERATION SELECTED
007E
007E
0080
0082
0084
0084
0087
0089
008C
0090
0091
0092
0093
0096
0098

M8:

E8
8A
A2
89
IE
50
52
83
8A
EE

0099
009A
0090

5A
B8 ---8E 08

009F
00A3
00A4
00A7
OOAA
OOAC
OOAE
OOBI
00B3
00B5
00B8
OOBA

C5
58
B9
80
72
03
80
72
03
80
72
03

BO 07
B2 B4
FE C3
0178 R
EO
0049 R
16 0063

C2 04
C3

MOV
MOV
INC
M8A:
CALL
MOV
MOV
MOV
PUSH
PUSH
PUSH
ADD
MOV
OUT

IE 0074 R
0000 E
FC 02
10
09
FC 04
09
09
FC 07
02
09

2-84 ROM BIOS

AL,7
DL,OB4H
BL

INDICATE MONO CARD MODE
ADDRESS OF MONO CARD (3B4)
MODE SET FOR MONO CARD

LCD_MOVE
AH,AL
CRLMODE,AL
ADDL6845, OX
OS
AX
OX
DX,4
AL,BL
OX ,AL

CK FOR LCD ADA CHANGE REQ
SAVE MODE IN AH
SAVE IN GLOBAL VARIABLE
SAVE ADDRESS OF BASE
SAVE POINTER TO DATA SEGMENT
SAVE MODE
SAVE OUTPUT PORT VALUE
POINT TO CONTROL REGISTER
GET MODE SET FOR CARD
RESET VIDEO
AND CHANGE CONFIG IF REQD
BACK TO BASE REGISTER
SET UP FOR ABSO SEGMENT
ESTABLI SH VECTOR TBL ADDR

POP
MOV
MOV

OX
AX ,ABSO
DS,AX

ASSUME

OS: ABSO

LOS
POP
MOV
CMP
JC
ADD
CMP
JC
ADD
CMP
JC
ADD

BX, PARM_PTR
AX
CX, OFFSET M4
AH,2
M9
BX, CX
AH,4
M9
BX ,CX
AH,7
M9
BX, CX

GET POINTER TO VIDEO PARMS
RECOVER PARMS
LENGTH OF EACH ROW OF TABLE
DETERMINE WHICH ONE TO USE
MODE IS 0 OR 1
MOVE TO NEXT ROW OF INIT TBL
MODE IS 2 OR 3
MOVE TO GRAPHICS ROW OF TBL
MODE IS 4,5, OR 6
MOVE TO MONO CARD ROW OF TBL

BX POINTS TO CORRECT ROW OF INITIALIZATION TABLE
OOBC
OOBC
OOBD

M9:
50
32 E4

PUSH
XOR

AX
AH,AH

OULINIT
SAVE MODE IN AH
AH WILL SERVE AS REGISTER

LOOP THROUGH TABLE, OUTPUTTTING REG ADDR, THEN VALUE FROM TABLE
OOBF
OOCO
00C1
00C1
00C3
00C4
00C5
00C7
00C9
OOCA
OOCB
OOCC
OOCE
OOCF
OODO

PUSHF
CLI
MIa:
MOV
OUT
INC
INC
MOV
OUT
INC
DEC
LOOP
POPF
POP
POP
ASSUME

9C
FA
8A
EE
42
FE
8A
EE
43
4A
E2
9D
58
IF

C4
C4
07

F3

AL,AH
DX,AL
OX
AH
AL, [BX]
DX,AL
BX
DX
MIa
AX
DS
DS:DATA

SAVE CURRENT FLAGS
INHIBIT INTERRUPTS
INIT LOOP
GET 6845 REGISTER NUMBER
POINT TO DATA PORT
NEXT REGISTER VALUE
GET TABLE VALUE
OUT TO CHIP
NEXT IN TABLE
BACK TO POINTER REGISTER
DO THE WHOLE TABLE
RESTORE FLAGS
GET MODE BACK
REC+VER SEGMENT VALUE

FILL REGEN AREA WITH BLANKS
00D1
00D3
00D7
OODC
0000
OODF
ODE1
00E4
00E7
ODE9
OOEC
OOEE
OOFO
00F2
00F2
ODF4
00F7
00F9
OOFB
OOFD
OOFD
0100
0100

33
89
C6
59
DO
72
B9
80
72
80
74
33
EB

FF
3E 004E R
06 0062 R 00
El
21
2000
FC 04
14
FC 07
04
CO
OE

B4
E8
A8
75
B5

20
0000
02
02
08

XOR
MOV
MOV
POP
SHL
JC
MOV
CMP
JC
CMP
JE
XOR
JMP

DI,DI
CRLSTART, DI
ACTIVE_PAGE,O
CX
CL,l
Ml3A
CX,8192
AH,4
M12
AH,7
M11
AX,AX
SHORT Ml3

Ml1:
AH, RTCDSP _CON
GELRTCREG
AL, DSP~LCD
M12
CH,08H

MOV
CALL
TEST
JNZ
MOV
M12:
MOV
M13:
REP

B8 0720
F3/ AB

AX,' '+7*256
STOSW

SET UP POINTER FOR REGEN
START ADDR SAVED IN GLOBAL
SET PAGE VALUE
RESTORE CLEAR REGEN BIT
LOOK, DON'T CLR REGEN REQ
I F ON - DON'T CLEAR REGEN
NUMBER OF WORDS IN CGA CARD
TEST FOR GRAPHICS
NO_GRAPH I CS_I NIT
TEST FOR MONO CARD
MONO_CARD_I NIT
FILL FOR GRAPHICS MODE
CLEAR_BUFFER
MONO_CARD_I NIT
GET DISPLAY CONFIGURATION
IS LCD CONFIGURED AS MONO
YES, CLEAR ENTIRE BUFFER
BUFFER SIZE ON MONO CARD
NO_GRAPH I CS_I NIT
FILL CHAR FOR ALPHA
CLEAR_BUFFER
FILL REGEN BFR WITH BLANKS

ENABLE VIDEO AND CORRECT PORT SETTING
o lO2
OlO5
OlO7
0109

AO
32
8B
8B

0049 R
E4
FO
16 0063 R

OlOD
0110
0115
0116

83 C2 04
2E: 8A 84 0000
EE
A2 0065 R

Ml3A:
XOR
MOV
MOV
ADD
MOV
OUT
MOV

MOV

AL, CRLMODE
AH,AH
SI,AX
DX, ADDR_6845
DX,4
AL,CS: [SI+OFFSET M7]
DX,AL
CRLMODE_SET ,AL

GET THE MODE
INTO AX REGISTER
TBL POINTER, INDEXED BY MODE
PREPARE TO OUTPUT TO
VIDEO ENABLE PORT
SET VIDEO ENABLE PORT
SAVE THAT VALUE

DETERMINE NUMBER OF COLUMNS, BOTH FOR ENTIRE DISPLAY
; ----- AND THE NUMBER TO BE USED FOR TTY INTERFACE
0119
011E
0120

2E: 8A 84 0000
32 E4
A3 004A R

MOV
XOR
MOV

AL,CS: [SI + OFFSET M6]
AH,AH
CRLCOLS,AX
; NO. OF COLS IN THIS SCREEN

SET CRT LENGTH
0123
0127

81 E6 OOOE
2E: 8B 8C 0000 E

AND
MOV

SI,OEH
; WORD OFFSET IN CLR LEN TABLE
CX, CS: lSI + OFFSET M5] ; LENGTH TO CLEAR

ROM BIOS 2-85

012C
OBI
0133
0135
0138
OI3A
013C

80
75
B4
E8
A8
74
B9

3E 0049 R 07
OC
20
0000
02
03
1000

013F

89 OE 004C R

CRT~ODE, 7
M13C
AH, RTCDSP _CON
GELRTCREG
AL, DSP _MLCD
MI3C
CX ,4096

CMP
JNE
MOV
CALL
TEST
JZ
MOV
MI3C:

MOV

CRLLEN,CX

MONO MODE
GET DISPLAY CONFIGURATION
LCD CONFIGURED AS MONO
SET PG LEN TO 4096 TO ALLOW
MUL TI PG KEYS WHEN LCD MONO
SAVE LENGTH OF CRT

SET CURSOR POSITIONS
0143
0146
0149
014A
014B
0140

B9 0008
BF 0050 R
IE
07
33 CO
F3/ AB

014F

42
BO 30

MOV
MOV
PUSH
POP
XOR
REP

CX ,8
; CLEAR ALL CURSOR POSITIONS
DI,OFFSET CURSOR_POSN
OS
ESTABLISH SEGMENT
ES
ADDRESSING
AX,AX
STOSW
FILL WITH ZEROES

SET UP OVERSCAN REGISTER
0150
0152
0157
0159
015B
015B
015C

80 3E 0049 R 06
75 02
BO 3F

015F
0162
0167
0169
016C

B9
80
75
B9
EB

EE
A2 0066 R

INC

OX
AL,30H

MOV

MI4
AL, 3 FH

SET OVERSCAN PORT TO DEFAULT
VALUE OF 30H FOR ALL MODES
EXCEPT 640X200
SEE I F MODE IS 640X200 BW
I F NOT 640X200, GO TO REGULAR
I F IT IS 640X200, PUT IN 3FH

OX ,AL
CRLPALETTE,AL

SEND CORRECT VAL TO 309 PORT
SAVE THE VAL FOR FUTURE USE

CRT~oDE,6

CMP
JNZ
MoV
MI4 :
OUT
MOV

SET CURSOR TYPE TO DEFAULT VALUES.
0607
3E 0049 R 07
03
OBOC
4C 90

MOV
CMP
JNE
MOV
MI4A:

CX,0607H
CRT~ODE,7

JMP

MI4A
CX,OBOCH
SELCTYPE

CURSOR MODE FOR MODES 0-6
IS IT MODE 7
NO, JUMP ON
CURSOR MODE MONO (MODE 7)
SET CURoSR TYPE

NORMAL RETURN FROM ALL VIDEO RETURNS
016F
016F
0170
0171
0172
0173
0174
0175
0176
0177
0178

50
5F
5E
5B
59
5A
IF
07
CF

VIDEO_RETURN:
POP
BP
POP
OJ
POP
SI
POP
BX
POP
CX
POP
OX
POP
OS
POP
ES
JRET
SELMODE

2-86 ROM BIOS

ALL DONE
ENDP

LCD-MOVE
THIS ROUTINE CHECKS FOR MONOCHROME TO CGA OR VICE
VERSA CHANGE REQUESTED FOR THE LCD DISPLAY. IF LCD
IS THE ONLY DISPLAY, A CHANGE IS ALLOWED AND A CALL TO
LCD_INIT IS MADE TO SET THE CONTROL REGISTERS BEFORE
CONTINUING WITH THE MODE SET.
INPUT
AL HAS MODE SET VALUE
OUTPUT
IF LCD IS NOT THE ONLY DISPLAY THEN A RETURN IS MADE
WITH NO CHANGES. IF THE LCD IS THE ONLY DISPLAY AND A
CGA TO MONO OR MONO TO CGA CHANGE IS REQUESTED, THE
DISPLAY CONFIG BYTE (RTCDSP_CON) IS UPDATED TO REFLECT
THE CHANGE. AND, A CALL TO LCD_INIT IS MADE TO UPDATE
THE LCD CONTROL REGISTERS FOR THE NEW LCD MODE.
A RETURN IS THEN MADE TO FINISH THE SET MODE. IF NO
MONO TO CGA OR CGA TO MONO CHANGE IS REQUESTED - NO
ACTION IS TAKEN.
REGISTERS MODIFIED: SI
INTERRUPTS:

LCD_MOVE
PUSH
PUSH
PUSH
PUSHF
MOV
CLI
MOV
CALL
CMP
JE

0178
0178
0179
017A
017B
017C
017E
017F
0181
0184
0187

50
53
52
9C
8A
FA
B4
E8
80
74

0189

3C 82

CMP

018B
0180
018F
0192
0194

75
BO
BA
B3
EB

JNE
MOV
MOV
MOV
JMP

08
20
0000 E
FB 07
OE

DISABLED DURING PROCESSING
PROC

NEAR

AX
BX
OX
BL,AL
AH, RTCDSP _CON
GELRTCREG
BL,7
LCD_MOl

SAVE FLAGS
SAVE NEW MODE REQUEST
DISABLE INTERRUPTS
GET DISPLAY CONFIGURATION
DATA RETURNED IN AL
MONOCHROME MODE REQUESTED?

CGA MODE BEING REQUESTED

28
81
03B8
01
OC 90

AL,DSP_MLCD+DSP_LCD_PRES; IS LCD PRES & CONFIGURED
; MONO & NO OTHER ADA PRESENT
LCD_M03
; JUMP I F CAN'T EFFECT CHANGE
AL,DSP_CLCD+DSP_LCD_PRES; SET LCD TO CGA MODE
OX, MONO_CNTL
GET MONO CONTROL ADDRESS
BL ,01
; DISABLE VIDEO FOR MONOCHROME
LCD_M02
; GO CHANGE CONFIGURATION

MONOCHROME MODE IS BEING REQUESTED
0197
0197

3C 81

0199
019B
0190
01AO

75
BO
BA
2A

1A
82
0308
DB

LCD_MOl:
CMP
JNE
MOV
MOV
SUB

AL,DSP_CLCD+DSP_LCD_PRES; IS LCD PRES & CONFIGURED
; CGA & NO OTHER ADA PRESENT
LCD_M03
; NO THEN EXIT
AL,DSP-MLCD+DSP_LCD_PRES; SET CONFIG LCD MONO MODE
OX, CGA_CNTL
; MODE CTRL FOR PRESENT STATE
BL, BL
; DISABLE VIDEO FOR CGA

LCD ADAPTER CHANGE CAN BE MADE
01A2
01A2
01A5
01A7
01A8
01AB
01AD
OlAF
01B1
01B3

E8
8A
EE
E8
BO
E6
E4
OC
E6

01B5
01B5
01B6
0187
01B8

90
5A
58
58

0000
C3
0000 E
00
74
75
40
75

LCD-M02 :
CALL
MOV
OUT
CALL
MOV
OUT
IN
OR
OUT

PULRTCREG
AL, BL
DX,AL
LCDINIT
AL, LCD_FUNCT
LCD_I NDX, AL
AL,LCD_DATA
AL, PANEL_ENABLE
LCD_DATA,AL

LCD-M03 :
POPF
POP
POP
POP

OX
8X
AX

UPDATE DISPLAY CONFIGURATION
DISABLE VIDEO IN CRNT STATE
SET UP LCD
AL = 0
PORT 74
GET LCDC REGS
TURN ON PANEL POWER

RESTORE INTERRUPT FLAGS
RESTORE REGISTERS

ROM BIOS 2-87

01 B9
01BA

C3

RET
LCD~OVE

ENDP

SELCTYPE
THIS ROUTINE SETS THE CURSOR VALUE.
SPECIAL HANDLING OCCURS FOR THE LCD CURSOR.
IF THE LCD IS THE CURRENT DISPLAY THE FOLLOWING
FOR THE DISPLAY NO CURSOR MODE (BIT 5 = 1 & BIT
CH REGISTER) IS CONVERTED TO THE LCD CONTROLLER
CURSOR MODE (CX=0808H). ALSO, THE BLINKING MODE
AND BIT 6 OF THE CH REGISTER) ARE TURNED OFF.

OCCURS:
6 = 0 OF THE
DISPLAY NO
BITS (BIT 5

I F LCD CONFIGURED AS MONO IS THE CURRENT DISPLAY THEN THE
LCDC REGISTERS FOR LCD CURSOR START AND LCD CURSOR END ARE
REGISTERS 23 AND 24 RESPECTIVELY. AND THE CURSOR VALUES ARE
RESCALED TO FIT IN AN 8x8 CHARACTER BOX. THIS IS BECAUSE
THE MONO CHARACTER BOX IS 9x14 BUT THE LCD HAS AN 8x8
CHARACTER BOX.
INPUT
(ex) HAS CURSOR VALUE eH-START LINE, CL-STOP LINE
(OS) = DATA SEGMENT
OUTPUT
PHYSICAL CURSOR SET
01BA

SELCTYPE
MOV
MOV
CALL
MOV
CMP
JE

PROC
CURSOR~OD E,

NEAR

01BA
01BE
01CO
01C3
01C5
01CB

89
B4
E8
B4
81
74

OE 0060
20
0000 E
OA
3E 0063 R 0304
33

CX
AH, RTCDSP _CON
GELRTCREG
AH,10
ADDR_6845,03D4H
SEL2

01CD
01CF
OlD1
OlD3
0106
0108
OlDB
0100

A8
74
B4
F6
75
F6
75
80

02
45
17
C5 40
05
C5 20
36
E5 9F

OlEO
01E3
01E5
01E8
01 EA
01EB
01EE
01FO
01F3

80
77
80
77
50
BB
8A
E8
8A

WHEN THE LCD AS MONO IS CURRENT MODE THE CURS IS RESCALED TO FIT IN
A 8x8 CHARACTER BOX. THE CURSOR WILL ONLY BE RESCALED IF CURS START
(CH) AND CURSOR END (CL) VALUES ARE 8ETWEEN VALUES 0 - 13.
FD 00
CMP
CH,13
INVALID CURSOR START VALUE?
31
JA
SELC
YES, PROCESS AS IS.
F9 00
CMP
CL, 13
I NVALI 0 CURSOR END VALUE?
2C
JA
SELC
YES, PROCESS AS IS
PUSH
AX
SAVE LCDC CURSOR START REG
080E
MOV
BX,080EH
BH - MULT, BL - DIV FACTOR
C5
MOV
AL,CH
RESCALE CURSOR START
021C R
CALL
SELRESCALE
E8
MOV
CH,AL
NEW CUROSR START

01F5
01F7
01FA
01FC
01FD

8A
E8
8A
58
EB

SAVE CURSOR VAL IN DATA AREA
GET LCD CONFIGURATION
FROM RTC.
CURSOR START REGISTER
ARE WE IN CGA MODE
JUMP TO CGA MODE TEST

; MONO IS CURRENT MODE
AL, DSP _MLCD
SELC
MOV
AH,OllH
TEST
CH,40H
JNZ
SELl
TEST
CH ,20H
JNZ
SEL4
SELl: AND
eH, 09 FH
TEST

JZ

C1
021C R
C8

MOV
CALL
MOV
POP
JMP

17 90

AL,CL
SELRESCALE
CL,AL
AX
SELC

IS LCD AS MONO CRNT DISPLAY?
NO, JUMP ON IT I S MONO MNTR
LCDC CUR ST REG AS MONO
IS BIT 6 ON
YES , JUMP ON
IS BIT 5 ON (NO CURSOR)
YES, JUMP TO RST TO LCDC VAL
TURN OFF BLINK (BIT 5 & 6)

RESCALE CURSOR END
NEW CUROSR START
RESTORE LCDC CUSR START REG
CALL TO OUTPUT ex REG

CGA IS CURRENT MODE.
0200
0200
0202
0204
0207

A8
74
F6
74

01
12
C5 40
05

SEL2:
TEST
JZ
TEST
JZ

2-88 ROM BIOS

AL,DSP_CLCD
SELC
CH,40H
SEL3

IS LCD AS CGA CURRENT DSPL Y?
NO, ITS CGA MONITOR- AS IS
IS BIT 6 ON
NO, JUMP ON

0209
020C
020E
020E
0211
0213
0216
0216
0219

021C
021C
021E
0220
0223
0225
0227

80 E5 9F
EB 08

AND
CH,09FH
JMP
SHORT SELC
SEL3:
TEST
CH,20H
JZ
SELC
SEL4: MOV
CX,080SH
SELC:
CALL
M16
JMP
VIDEO_RETURN

F6 C5 20
74 03
B9 0808
E8 0228 R
E9 016F R

F6
F6
SO
72
FE
C3

E7
F3
FC 07
02
CO

TURN OFF BLINK (BIT 5 & 6)
IS BIT 5 ON (DSPLY NO CUSR)
NO, JUMP ON
LCDC VAL FOR DSPL Y NO CURSOR
OUTPUT CX REG

THE RESCALING FORMULA IS (( X * 8) / 14.) + ROUND UP. X IS EITHER
CH REGISTER OR CL REGISTER, 8 IS FOR THE LCD CHAR BOX HEIGHT(8 x 8),
AND 14 IS FOR THE MONO CHARACTER SOX HEIGHT(9 x 14). ROUND UP IS 1
IF THE REMAINDER IS GREATER THAN 6. AND, RND UP IS 0 IF REMNDR IS <
THAN 7. ON ENTRANCE AL WILL CONTAIN X, BH = SAND BL = 14.
SELRESCALE:
MUL
SH
MUL T SY LCD CHAR BX LEN S
OIV
BL
DIV BY MONO CHAR BX LEN 14
CMP
AH,7
AH = RMNDR , AL = QUOT! ENT
JS
SELRI
INC
AL
ADD 1 TO QUOTI ENT FOR RND UP
SELRl: RET
RETURN TO CALLER
TH I S ROUT! NE OUTPUTS TH E CX REGISTER TO THE REGS NAMED IN AH

0228
0228
0229
022A
022E
0230
0231
0232
0234
0235
0236
0238
023A
023B
023C
023E
023F
0240
0241

9C
FA
SB
8A
EE
42
SA
EE
4A
8A
FE
EE
42
8A
EE
9D
C3

M16:
PUSHF
CLI
MOV
MOV
OUT
INC
MOV
OUT
DEC
MOV
INC
OUT
INC
MOV
OUT
POPF
RET
SELCTYPE

16 0063
C4
C5
C4
CO
Cl

OX ,ADDR_6845
AL,AH
DX,AL
DX
AL,CH
DX,AL
OX
AL,AH
AL
OX ,AL
OX
AL,CL
DX,AL

SAVE CURRENT FLAGS
INHIBIT INTERRUPTS
ADDRESS REGISTER
GET VALUE
REGISTER SET
DATA REGISTER
DATA

POINT TO OTHER DATA REGISTER
SET FOR SECOND REGISTER
SECOND DATA VALUE
RESTORE FLAGS
ALL DONE

ENDP

SELCPOS
THIS ROUTINE SETS THE CURRENT CURSOR
POSITION TO THE NEW X-Y VALUES PASSED
INPUT
OX - ROW,COLUMN OF NEW CURSOR
BH - DISPLAY PAGE OF CURSOR
*** BH = 0 FOR GRAPH I CS
OS - DATA SEGMENT
OUTPUT
CURSOR IS SET AT 6845 I F DISPLAY PAGE
IS CURRENT DISPLAY
0241
0241
0243
0245
0247
0249
024D
0251
0253
0255
0258
0258
025B

8A
32
01
SB
89
38
75
SB
ES

CF
ED
El
Fl
94 0050 R
3E 0062 R
05
C2
025B R

E9 016F R

SET_CPOS
MOV
XOR
SAL
MOV
MOV
CMP
JNZ
MOV
CALL
M17 :
JMP
SELCPOS

PROC
NEAR
CL, BH
CH,CH
; ESTABLISH LOOP COUNT
CX,l
; WORD OFFSET
SI,CX
; USE INDEX REGISTER
[SI+OFFSET CURSOR_POSN],DX ; SAVE THE POINTER
ACTIVE_PAGE, BH
MI7
SELCPOS_RETURN
AX,DX
GET ROW/COLUMN TO AX
M18
CURSOILSET
SELCPOS_RETURN
VIDEO_RETURN
ENDP

ROM BIOS 2-89

SET CURSOR POSITION, AX HAS ROW/COLUMN FOR CURSOR
025B
025B
025E
0260
0264
0266
0268
026B
026C

MI8
E8
8B
03
01
B4
E8
C3

02E6 R
C8
OE 004E R
F9
OE
0228 R

CALL
MOV
ADD
SAR
MOV
CALL
RET
MI8

PROC
NEAR
POSITION
CX,AX
CX,CRLSTART
CX, I
AH,14
MI6

FIND LOCATION IN REGEN BFR
ADD START ADDR FOR THIS PAGE
DIVIDE BY 2 FOR CHAR COUNT
REGISTER NUMBER FOR CURSOR
OUTPUT THE VALUE TO THE 6845

ENDP

ACLDI SP_PAGE
THIS ROUTINE SETS THE ACTIVE DISPLAY PAGE, ALLOWING THE
FULL USE OF THE RAM SET ASIDE FOR THE VIDEO ATTACHMENT.
**** VALID ONLY FOR ALPHA MODES ****
INPUT
AL HAS THE NEW ACTIVE DISPLAY PAGE
(0-7) FOR MODES 0&1, (0-3) FOR MODES 2&3, AND
(0)
FOR MODE 7 WHEN MONOCHROME MONITOR
(0-3) FOR MODE 7 WHEN THE LCD IS CONFIGURED AS MONO
(OS)

=

DATA SEGMENT

OUTPUT
THE 6845 IS RESET TO DISPLAY THAT PAGE
026C
026C
026F
0273
0274
0275
0277
027A
027C
027E
0280
0283
0284
0286
028A
0280
0290

A2
8B
98
50
F7
A3

0062 R
OE 004C R

8B
01
B4
E8
5B
01
8B
E8
E9

C8
F9
OC
0228 R

El
004E R

ACLDISP_PAGE
PROC
NEAR
ACTIVE_PAGE,AL
MOV
MOV
CX,CRLLEN
CBW
PUSH
AX
MUL
CX
MOV
CRLSTART ,AX

SAVE ACTIVE PAGE VALUE
GET SAVED LEN OF REGEN BFR
CONVERT AL TO WORD
SAVE PAGE VALUE
DISPLAY PAGE TIMES REGEN LEN
SAVE START ADDRESS FOR
LATER REQUIREMENTS
START ADDRESS TO CX
DIVIDE BY 2 FOR 6845
6845 REGISTER FOR START ADDR

MOV
CX,AX
SAR
CX, I
MOV
AH,12
CALL
MI6
POP
BX
RECOVER PAGE VALUE
SAL
BX, I
; *2 FOR WORD OFFSET
MOV
AX, [BX + OFFSET CURSOR_POSN- ; GET CURSOR FOR PAGE
CALL
MI8
; SET THE CURSOR POSITION
VIDEO_RETURN
JMP
ACLDISP_PAGE
ENDP

E3
87 0050
025B R
016F R

READ_CURSOR
THIS ROUTINE READS THE CURRENT CURSOR VALUE FROM THE
6845, AND SENDS IT BACK TO THE CALLER
INPUT
BH - PAGE OF CURSOR, MUST BE 0 FOR GRAPHICS
OS - DATA SEGMENT
OUTPUT
OX - ROW, COLUMN OF THE CURRENT CURSOR POSITION
CX - CURRENT CURSOR MODE
0290
0290
0292
0294
0296
029A
029E
029F
02AI
02A4
02A7
02A8
02AB

8A
32
01
8B
8B
55
8B
89
89
50
E9

OF
FF
E3
97 0050 R
OE 0060 R
EC
56 OC
4E OA
0l6F R

READ_CURSOR
PROC
NEAR
MOV
BL,BH
XOR
BH,BH
SAL
BX, I
; WORD OFFSET
MOV
OX, [BX+OFFSET CURSOILPOSN]
MOV
CX, CURSOILMODE
PUSH
BP
MOV
BP ,SP
GET PTR TO STACK SAVE AREA
MOV
[BP] . DLPOS, OX
SETUP RETURN VALUES IN STACK
MOV
[BP] . CLPOS, CX
SAVE AREA
POP
BP
JMP
VIDEO_RETURN
READ_CURSOR
ENDP

2-90 ROM BIOS

SET COLOR
THIS ROUTINE WILL ESTABLISH BACKGND COLOR, THE OVERSCAN
COLOR, AND THE FOREGROUND COLOR SET FOR MEDIUM RESOLUTION
GRAPHICS
INPUT
(BH) HAS COLOR 10
IF BH=O, THE BACKGROUND COLOR VALUE IS SET
FROM THE LOW BITS OF BL (0-31)
IF BH=I, THE PALETTE SELECTION IS MADE
BASED ON THE LOW BIT OF BL:
O=GREEN, RED; YELLOW FOR COLORS 1,2,3
I=BLUE, CYAN, MAGENTA FOR COLORS 1,2,3
(BL) HAS THE COLOR VALUE TO BE USED
(OS) - DATA SEGMENT
OUTPUT
THE COLOR SELECTION IS UPDATED
02AB
02AB
02AF
02B2
02B5
02B7

8B
83
AO
OA
75

SELCOLOR
MOV
ADD
MOV
OR
JNZ

16 0063
C2 05
0066 R
FF
OE

NEAR
PROC
OX, ADDR_6845
DX,5
AL, CRLPALETTE
BH, BH
M20

I/O PORT FOR PALETTE
OVERSCAN PORT
GET THE CURRENT PALETTE VAL
IS THIS COLOR O?
OUTPUT COLOR 1

HANDLE COLOR 0 BY SETTING THE BACKGROUND COLOR
02B9
02BB
02BE
02CO
02CO
02Cl
02C4

24 EO
80 E3 IF
OA C3

AND
AND
OR
M19 :
OUT
MOV
JMP

EE
A2 0066 R
E9 016F R

AL,OEOH
BL,OIFH
AL, BL
DX,AL
CRLPALETTE,AL
VIDEO_RETURN

TURN OFF LOW 5 BITS OF CRNT
TURN OFF H 3 BITS INPUT VAL
PUT VALUE INTO REGISTER
OUTPUT THE PALETTE
SEND COLOR TO 309 PORT
SAVE THE COLOR VALUE

HANDLE COLOR 1 BY SELECTING THE PALETTE TO BE USED
02C7
02C7
02C9
02CB
02CD
02CF
0201

24
DO
73
OC
EB

M20:
AND
SHR
JNC
OR
JMP
SELCOLOR

OF
EB
F3
20
EF

AL ,ODFH
BL,1
M19
AL ,20H
M19
ENDP

TURN OFF PALETTE SELECT BIT
TEST THE LOW ORDER BIT OF BL
ALREADY DONE
TURN ON PALETTE SELECT BIT
GO DO IT

VIDEO STATE
RETURNS THE CURRENT VIDEO STATE INFORMATION
INPUT
OS = DATA SEGMENT
OUTPUT
AH = NUMBER OF COLUMNS ON THE SCREEN
AL = CURRENT VIDEO MODE
BH = CURRENT ACTIVE PAGE
0201
0201
0205
0208
02DC
0200
020F
02E2
02E3
02E6

8A
AO
8A
55
8B
89
50
E9

26 004A R
0049 R
3E 0062
EC
5E 08
016F R

VIDEO_STATE
PROC
NEAR
MOV
AH, BYTE PTR CRLCOLS ; GET NUMBER OF COLUMNS
MOV
AL, CRLMODE
CURRENT MODE
MOV
BH,ACTIVE_PAGE
GET CURRENT ACTIVE PAGE
PUSH
BP
MOV
BP, SP
GET PTR TO STACK SAVE AREA
MOV
[BP] .BLPOS,BX
SETUP RETURN VALUES IN STACK
POP
BP
JMP
VIDEO_RETURN
VIDEO_STATE
ENDP

ROM BIOS 2-91

POSITION
THIS SERVICE ROUTINE CALCULATES THE REGEN
BUFFER ADDRESS OF A CHARACTER IN THE ALPHA MODE
INPUT
AX

=

AX

= OFFSET

ROW, COLUMN POSITION

OUTPUT
02E6
02E6
02E7
02E9
02EB
02EF
02F1
02F3
02F5
02F6
02F7

53
8B
8A
F6
32
03
01
5B
C3

POSITION
PUSH
MOV
MOV
MUL
XOR
ADD
SAL
POP
RET
POSITION

08
C4
26 004A
FF
C3
EO

OF CHAR POSITION IN REGEN BUFFER

PROC
NEAR
BX
BX,AX
AL,AH
BYTE PTR CRLCOLS
BH,BH
AX,BX
AX,l
BX

SAVE REGISTER
ROWS TO AL
DETERMI NE BYTES TO ROW
ADD IN COLUMN VALUE
2 FOR ATTRI BUTE BYTES

*

ENDP

SCROLL UP
THIS ROUTINE MOVES A BLOCK OF CHARACTERS UP
ON THE SCREEN
INPUT
(AL) = NUMBER OF ROWS TO SCROLL
(CX) = ROW/COLUMN OF UPPER LEFT CORNER
(OX) = ROW/COLUMN OF LOWER RIGHT CORNER
(BH) = ATTRIBUTE TO BE USED ON BLANKED LINE
(AH) = CURRENT CRT MODE
(OS) = DATA SEGMENT
(ES) = REGEN BUFFER SEGMENT
OUTPUT
NONE -- THE REGEN BUFFER IS MODIFIED
02F7
02F7
02F9
02FC
02FE
0301
0303
0306
0306
0307
0309
030C
030E
0310
0312
0314
0314
0317
0319
031B
0310
031F
031F
0320
0322
0322
0325
0327
0329
0328
032B
032E
0333
0335
0338
033B
033C

8A
80
72
80
74
E9

08
FC 04
08
FC 07
03
04DA R

53
8B
E8
74
03
8A
2A

C1
0343
31
FO
E6
E3

E8
03
03
FE
75

036A R
F5
FD
CC
F5

58
BO 20
E8
03
FE
75

0373
FD
CB
F7

E8
80
74
AO
BA
EE

0000 E
3E 0049 R 07
07
0065 R
0308

ASSUME
SCROLL_UP
MOV
CMP
JC
CMP
JE
JMP
N1 :
PUSH
MOV
CALL
JZ
ADD
MOV
SUB
N2:
CALL
ADD
ADD
DEC
JNZ
N3:
POP
MOV
N4:
CALL
ADD
DEC
JNZ
N5 :
CALL
CMP
JE
MOV
MOV
OUT
N6:

2-92 ROM BIOS

CS: ROMCODE, OS: DATA, ES: DATA
PROC
NEAR
BL,AL
SAVE LINE COUNT IN BL
AH,4
TEST FOR GRAPH I CS MODE
N1
HANDLE SEPARATELY
AH,7
TEST FOR MONO CARD
N1
GRAPH I CS_UP
UP_CONTINUE
8X
SAVE FILL ATTRIBUTE IN BH
AX,CX
UPPER LEFT POSITION
SCROLLPOSITION
DO SETUP FOR SCROLL
N7
BLANICFI ELD
SI,AX
FROM ADDRESS
AH,DH
# ROWS I N BLOCK
AH, BL
# ROWS TO BE MOVED
ROW_LOOP
NlO
MOVE ONE ROW
SI,BP
01, BP
POINT TO NEXT LINE IN BLOCK
AH
COUNT OF LINES TO MOVE
N2
ROW_LOOP
CLEAILENTRY
AX
RECOVER ATTRIBUTE IN AH
,
AL, '
FILL WITH BLANKS
CLEAILLOOP
Nll
CLEAR THE ROW
01, BP
POINT TO NEXT LINE
BL
COUNTER OF LINES TO SCROLL
N4
CLEAR_LOOP
SCROLLEND
DDS
CRLMODE,7
IS THIS THE MONO CARD
N6
IF SO, SKIP THE MODE RESET
AL,CRLMODE_SET
GET VALUE OF THE MODE SET
OX ,03D8H
ALWAYS SET CGA CARD PORT
DX,AL
VIDEO_RELHERE

033C
033F
033F
0341
0343

JMP

E9 016F R

VIDEO_RETURN
BlANLFIElD
GET ROW COUNT
GO CLEAR THAT AREA

N7:
MOV
JMP
SCROll_UP

BA DE
EB DC

Bl,DH
N3
ENDP

HANDLE COMMON SCROll SET UP HERE
0343
0343
0346
034A
034C
034E
0350
0352
0354
0356
035A
035C
035E
0362
0364
0365
0366
0369
036A

E8
03
8B
8B
2B
FE
FE
32
8B
03
8A
F6
03
06
IF
80
C3

02E6 R
06 004E R
F8
FO
01
C6
C2
ED
2E 004A R
ED
C3
26 004A R
CO
FB 00

SCROll_POS ITI ON PROC
NEAR
CAll
POSITION
ADD
AX, CRLSTART
MOV
DI,AX
MOV
SI,AX
SUB
DX,CX
INC
DH
INC
Dl
XOR
CH,CH
MOV
BP ,CRLCOlS
BP, BP
ADD
MOV
Al, Bl
BYTE PTR CRLCOlS
MUl
ADD
AX,AX
PUSH
ES
POP
OS
CMP
Bl,O
RET
SCROll_POS IT I ON ENDP

CONVERT TO REGEN POINTER
OFFSET OF ACTIVE PAGE
TO ADDRESS FOR SCROll
FROM ADDRESS FOR SCROll
OX = #ROWS, #COlS IN BLOCK
INCREMENT FOR 0 ORIGIN
SET HIGH BYTE OF CNT TO ZERO
GET NO. OF COlS IN DISPLAY
TIMES 2 FOR ATTRI BUTE BYTE
GET LINE COUNT
FIND OFFSET TO FROM ADDRESS
*2 FOR ATTRIBUTE BYTE
ESTAB ADDSSNG TO REGEN BFR
FOR BOTH POINTERS
a SCROll MEANS BLANK FI ElD
RETURN WITH FLAGS SET

;----- MOVE_ROW
036A
036A
036C
0360
036E
0370
0371
0372
0373

NI0
8A CA
56
57
F3/ A5
5F
5E
C3

MOV
PUSH
PUSH
REP
POP
POP
RET

PROC
NEAR
Cl,Dl
SI
01
MOVSW
01
SI

GET # OF COlS TO MOVE
SAVE START ADDRESS
MOVE THAT LINE ON SCREEN
RECOVER ADDRESSES

ENDP

NI0
; ----- CLEAR_ROW

0373
0373
0375
0376
0378
0379
037A

Nll
8A CA
57
F3/ AB
5F
C3

MOV
PUSH
REP
POP
RET
Nll

PROC
NEAR
Cl,Dl
01
STOSW
01

GET # COLUMNS TO CLEAR
STORE THE FIll CHARACTER

ENDP

SCROll_DOWN
THIS ROUTINE MOVES THE CHARACTERS WITHIN A
DEFINED BLOCK DOWN ON THE SCREEN, FILLING THE
TOP LINES WITH A DEFINED CHARACTER
INPUT
(Al) = NUMBER OF LINES TO SCROll
(CX) = UPPER lEFT CORNER OF REGION
(OX) = lOWER RIGHT CORNER OF REGION
(BH) = FIll CHARACTER
(AH) = CURRENT CRT MODE
(OS) = DATA SEGMENT
(ES) = REGEN SEGMENT
OUTPUT
NONE -- SCREEN IS SCROllED
037A
037A

FD

SCROll_DOWN
STD

PROC

NEAR
; DIRECTION FOR SCROll DOWN

ROM BIOS 2-93

037B
0370
0380
0382
0385
0387
038A
038A
038B
0380
0390
0392
0394
0396
0398
0398
039B
0390
039F
03Al
03A3
03A3
03A4
03A6
03A6
03A9
03A8
03AD
03AF
03B2
03B2
03B4
03B6

8A
80
72
80
74
E9

08
FC 04
08
FC 07
03
0533 R

53
8B
E8
74
2B
8A
2A

C2
0343 R
20
FO
E6
E3

E8
2B
2B
FE
75

036A R
F5
FD
CC
F5

58
BO 20
E8
2B
FE
75
E9

0373 R
FD
CB
F7
032B R

8A DE
EB ED

MaV
BL,AL
CMP
AH,4
JC
N12
CMP
AH,7
JE
N12
JMP
GRAPH I CS_DOWN
N12 :
PUSH
BX
MOV
AX, OX
CALL
SCROLL_POS ITI ON
JZ
N16
SUB
SI,AX
MOV
AH,DH
SUB
AH,BL
N13 :
CALL
NI0
SUB
SI, BP
SUB
01, BP
DEC
AH
JNZ
N13
N14:
POP
AX
MOV
AL, '
N15 :
CALL
NIl
SUB
01, BP
DEC
BL
JNZ
N15
JMP
N5
N16 :
MOV
BL,DH
JMP
N14
SCROLL_DOWN
ENDP

LI NE COUNT TO BL
TEST FOR GRAPHICS
TEST FOR MONO CARD
CONTI NU E_DOWN
SAVE ATTRIBUTE IN BH
LOWER RIGHT CORNER
GET REGEN LOCATION
SI IS FROM ADDRESS
GET TOTAL # ROWS
COUNT TO MOVE IN SCROLL
MOVE ONE ROW

RECOVER ATTRI BUTE IN AH
CLEAR ONE ROW
GO TO NEXT ROW
SCROLL_END

--------------- ---------------- -- - - - - - - - - - - - - - - - - - - - - - --

READ--'lLCURRENT
THIS ROUTINE READS THE ATTRIBUTE AND CHARACTER
AT THE CURRErn CURSOR POSITION AND RETURNS THEM
TO THE CALLER
INPUT
(BH) = DISPLAY PAGE ( ALPHA MODES ONLY
(AH) = CURRENT CRT MODE
(OS) = DATA SEGMENT
( ES) = REGEN SEGMENT
OUTPUT
(AL) = CHAR READ
(AH) = ATTRI BUTE READ
INTERRUPTS: DISABLED DURING THE READ

------------ ----------- - -- - - - - -- - ------------------ - -- --

03B6
03B6
03B9
03BB
03BE
03CO
03C3
03C3
03C6

80
72
80
74
E9

FC 04
08
FC 07
03
066F R

E8 03EO R
8B F3

ASSUME CS: ROMCODE, OS: DATA, ES: DATA
READ--'lLCURRENT PROC
NEAR
CMP
AH,4
IS THIS GRAPHICS
JC
PI
CMP
AH,7
IS THIS MONO CARD
JE
PI
JMP
GRAPH I CS_READ
PI:
READ--'lLCONTI NUE
FIND_POSITION
CALL
MOV
SI, BX
ESTABLISH ADDRESSING IN SI

;----- WAIT FOR HORIZONTAL RETRACE
03C8
03CC
03CF
0300
0301
0301
0302
0304
0306
0307
0307

8B 16 0063
83 C2 06
06
IF

MaV
ADD
PUSH
POP

OX ,ADDR_6845
DX,6
ES
OS

IN
TEST
JNZ
CLI

AL,DX
AL,HORLRETRACE
P2

IN

AL,DX

P2 :
EC
A8 01
75 FB
FA
P3:
EC

2-94 ROM BIOS

GET BASE ADDRESS
POINT AT STATUS PORT
GET SEGMENT FOR QUICK ACCESS
WAIT FOR RETRACE LOW
GET STATUS
IS HORZ RETRACE LOW
WAIT UNTIL IT IS
NO MORE INTERRUPTS
WAIT FOR RETRACE HIGH
GET STATUS

0308
03DA
03DC
0300
03EO
03EO
03EO
03E2
03E4
03E6
03E8
03EC
03EE
03FO
03FO
03F4
03F6
03F6
03F9
03FB
03FC

A8 01
74 FB
AD
E9 016F R

8A
32
8B
01
8B
33
E3

TEST
AL, HORLRETRACE
JZ
P3
LODSW
VIDEO_RETURN
JMP
READ....ACCURRENT ENDP

CF
ED
F1
E6
84 0050 R
DB
06

03 1E 004C R
E2 FA
E8 02E6
03 08
C3

IS IT HIGH
WAIT UNTIL IT IS
GET THE CHAR/ATTR

FIND_POSITION
PROC
NEAR
CL, BH
DISPLAY PAGE TO CX
MOV
XOR
CH, CH
MOV
SI,CX
MOVE TO SI FOR INDEX
SAL
SI,I
; * 2 FOR WORD OFFSET
MOV
AX, [SI+ OFFSET CURSOR_POSN- ; GET ROW/COL OF PAGE
XOR
BX, BX
SET START ADDRESS TO ZERO
NO_PAGE
JCXZ
P5
PAGE_LOOP
P4:
LENGTH OF BUFFER
ADD
BX,CRLLEN
LOOP
P4
NO_PAGE
P5:
CALL
POSITION
DETERMINE LOCATION IN REGEN
ADD
BX ,AX
ADD TO START OF REGEN
RET
FI ND_POS IT ION
ENDP

WRITE....ACCURRENT
THIS ROUTINE WRITES THE ATTRIBUTE
AND CHARACTER AT THE CURRENT CURSOR
POSITION
INPUT
(AL) = CHAR TO WRITE
(BH) = DISPLAY PAGE
(BL) = ATTRIBUTE OF CHAR TO WRITE
(CX) = COUNT OF CHARACTERS TO WRITE
(AH) = CURRENT CRT MODE
(OS)
DATA SEGMENT
(ES)
REGEN SEGMENT
OUTPUT
NONE
INTERRUPTS: DISABLED DURING THE WRITE
03FC
03FC
03FF
0401
0404
0406
0409
0409
040B
040C
0400
0410
0412
0413
0414

80
72
80
74
E9

FC 04
08
FC 07
03
05BD R

8A E3
50
51
E8 03EO R
8B FB
59
5B

WRlTE....ACCURRENT
PROC
CMP
AH,4
P6
JC
CMP
AH,7
P6
JE
JMP
GRAPHICS_WRITE
P6:
MOV
AH, BL
PUSH
AX
PUSH
CX
FIND_POSITION
CALL
MOV
01, BX
POP
CX
POP
BX
P7 :

NEAR
IS TH I S GRAPH I CS
IS THIS MONO CARD
WRITE....ACCONTINUE
GET ATTRI BUTE TO AH
SAVE CHAR/ATTRIBUTE
SAVE WRITE COUNT
ADDRESS TO 01 REGISTER
WRITE COUNT
CHARACTER/ ATTR IN BX REG
WRITE_LOOP

;----- WAIT FOR HORIZONTAL RETRACE
0414
0418
041B
041C
041C
0410
041F
0421
0422
0422
0423
0425
0427
0429
042A

8B 16 0063 R
83 C2 06
9C

MOV
ADD
PUSHF

OX ,ADDR_6845
DX,6

GET BASE ADDRESS
POINT AT STATUS PORT
SAVE CURRENT FLAGS

IN
TEST
JNZ
CLI

AL,DX
AL, HORLRETRACE
P8

GET STATUS
IS IT LOW
WAIT UNTIL IT IS
NO MORE INTERRUPTS

IN
TEST
JZ
MOV
STOSW
POPF

AL,DX
AL, HORLRETRACE
P9
AX,BX

GET STATUS
IS IT HIGH
WAIT UNTIL IT IS
RECOVER THE CHAR/ATTR
PUT TH E CHAR/ ATTR
INTERRUPTS BACK ON - I F

P8:
EC
A8 01
75 FB
FA
P9:
EC
A8 01
74 FB
8B C3
AB
90

em

ROM BIOS 2-95

042B
0420
0430

E2 E7
E9 016F R

LOOP
P7
JMP
VIDEO_RETURN
WRITE-AC_CURRENT
ENDP

AS MANY TIMES AS REQUESTED

WRITE_CCURRENT
NOT VALID FOR MEDIUM RESOLUTION GRAPHICS **
THIS ROUTINE WRITES THE CHARACTER AT
THE CURRENT CURSOR POSITION, ATTRIBUTE
UNCHANGED
INPUT
(BH) = DISPLAY PAGE
(CX) = COUNT OF CHARACTERS TO WRITE
(AL) = CHAR TO WRITE
(AH)
CURRENT CRT MODE
(OS) = DATA SEGMENT
(ES) = REGEN SEGMENT
OUTPUT
NONE

**

INTERRUPTS: DISABLED DURING THE WRITE
0430
0430
0433
0435
0438
043A
0430
0430
043E
043F
0442
0444
0445
0446

80
72
80
74
E9

FC 04
08
FC 07
03
05BD R

50
51
E8 03EO
8B FB
59
5B

WRITE_CCURRENT PROC
NEAR
CMP
AH,4
JC
PI0
CMP
AH,7
JE
PI0
GRAPHICS_WRITE
JMP
PI0 :
PUSH
AX
PUSH
CX
CALL
FIND_POSITION
MOV
01, BX
POP
CX
POP
BX
Pll:

IS THIS GRAPHICS
IS THIS MONO CARD

SAVE CHAR ON STACK
SAVE WRITE COUNT
ADDRESS TO 01
WRITE COUNT
BL HAS CHAR TO WR I TE
WRITE_LOOP

; ----- WAIT FOR HORIZONTAL RETRACE
0446
044A
0440
044E
044E
044F
0451
0453
0454
0454
0455
0457
0459
045B
045C
0450
045E
0460
0463

8B 16 0063
83 C2 06
9C
EC
A8 01
75 FB
FA
EC
A8
74
8A
AA
90
47
E2
E9

01
FB
C3

E6
016F R

MOV
OX ,ADDR_6845
ADD
DX,6
PUSHF
P12 :
IN
AL,DX
TEST
AL,HORLRETRACE
JNZ
P12
CLI
P13 :
IN
AL,DX
TEST
AL,HORLRETRACE
P13
JZ
MOV
AL, BL
STOSB
POPF
INC
01
LOOP
Pll
VIDEO_RETURN
JMP
WRITE_CCURRENT ENDP

2-96 ROM BIOS

GET BASE ADDRESS
POINT AT STATUS PORT
SAVE CURRENT FLAGS
GET STATUS
IS IT LOW
WAIT UNTIL IT IS
NO MORE INTERRUPTS
GET STATUS
IS IT HIGH
WAIT UNTI L IT IS
RECOVER CHAR
WRITE CHAR
I NTERRUPTS BACK ON - I F ON
BUMP POINTER PAST ATTRIBUTE
AS MANY TIMES AS REQUESTED

READ DOT
ENTRY --

-- WRITE DOT
THESE ROUTINES WILL WRITE A DOT, OR READ THE DOT AT
THE INDICATED LOCATION

ox

= ROW (0-199)
(THE ACTUAL VAL DEPENDS ON THE MODE)
COLUMN ( 0-639) ( THE VALUES ARE NOT RANGE CHECKED)
OOT VALUE TO WRITE (1,2 OR 4 BITS OEPENOING ON MODE,
REQ'D FOR WRITE DOT ONLY, RIGHT JUlTIFIED)
BIT 7 OF AL=l INDICATES XOR THE VAL INTO LOCATION
OS
DATA SEGMENT
ES
REG EN SEGM ENT

CX
AL

EXIT
AL = DOT VALUE READ, RIGHT JUSTIFIED, READ ONLY

-- - -- - - - - - - - - - -- - - - - - - - - -- - - - - - - - - - - - - - - - - - - - - -- - - - -- - - - - - -- - - -0463
0463
0466
0469
046B
0460
046F
0471
0474
0474
0474
0475
0476
0479
047B
0470
0480
0481
0484
0486
0488
048A
048C
048C
048F
0490
0493
0493
0495
0497

E8 0497 R
26: 8A 04
22 C4
02 EO
BA CE
02 CO
E9 016F R

50
50
E8 0497
02 E8
22 C4
26: 8A DC
58
F6 C3 80
75 00
F6 04
22 CC
OA C1
26: 88 04
58
E9 016F R
32 C1
EB F5

ASSUME
READ_DOT
CALL
MOV
AND
SHL
MOV
ROL
JMP
READ_DOT

CS: ROMCODE, OS: DATA, ES: DATA
PROC
NEAR
R3
; FIND BYTE POSITION OF DOT
AL,ES:-SIGET THE BYTE
MASK OFF OTHER BITS IN BYTE
AL,AH
LEFT JUSTI FY THE VALUE
AL, CL
GET NUMBER OF BITS IN RESULT
CL,DH
AL,CL
RIGHT JUSTIFY THE RESULT
VIDEO_RETURN
RETURN FROM VIDEO 10
ENDP

WRITE_DOT
PUSH
PUSH
CALL
SHR
AND
MOV
POP
TEST
JNZ
NOT
AND
OR
R1 :
MOV
POP
JMP
R2:
XOR
JMP
WRITE_DOT

PROC
AX
AX
R3
AL, CL
AL,AH
CL,ES:-SIBX
BL ,80H
R2
AH
CL,AH
AL,CL
ES:-SI-,AL
AX
VIDEO_RETURN
AL,CL
R1

NEAR
SAVE DOT VALUE
TWICE
FIND BYTE POSITION OF DOT
SHIFT TO SET UP OUT BITS
; STRI P OFF THE OTHER BITS
GET THE CURRENT BYTE
RECOVER XOR FLAG
IS IT ON
YES, XOR THE DOT
SET THE MASK TO REMOVE THE
INDICATED BITS
OR IN THE NEW VALUE OF BITS
; FINISH_DOT
RESTORE THE BYTE IN MEMORY
RETURN FROM VIDEO 10
XOR_DOT
EXCLUSIVE OR THE DOTS
FINISH UP THE WRITING

ENDP

R3 PROCEDURE
THIS SUBROUTINE DETERMINES THE REGEN BYTE LOCATION
OF THE INDICATED ROW COLUMN VALUE IN GRAPHICS MODE.
ENTRY -DX = ROW VALUE (0-199)
CX = COLUMN VALUE (0-639)
EXIT -SI
OFFSET INTO REGEN BUFFER FOR BYTE OF INTEREST
AH = MASK TO STRIP OFF THE BITS OF INTEREST
CL
BITS TO SHIFT TO RIGHT JUSTIFY THE MASK IN AH
DH = # BITS IN RESULT
0

0

0497
0497
0498

53
50

R3 PROC
PUSH
PUSH

NEAR
BX
AX

; SAVE BX DURING OPERATION
; SAVE AL DURING OPERATION

DETERMINE 1ST BYTE IN INDICATED ROW BY MULTIPLY ROW VALUE BY 40
LOW BIT OF ROW DETERMINES EVEN/ODD, 80 BYTES/ROW
0499
0498
049C
049F

BO 28
52
80 E2 FE
F6 E2

MOV
PUSH
AND
MUL

AL,40
OX
DL,OFEH
DL

SAVE ROW VALUE
STRIP OFF ODD/EVEN BIT
AX HAS ADDRESS OF 1ST BYTE

ROM BIOS 2-97

04Al
04A2
04A5
04A7
04AA
04AA
04AC
04AD

5A
F6 C2 01
74 03
05 2000

POP
TEST
JZ
ADD

OX
DL,1
R4
AX,2000H

MaV
POP
MOV

SI,AX
AX
DX,CX

OF INDICATED ROW
RECOVER IT
TEST FOR EVEN/ODD
JUMP I F EVEN ROW
OFFSET TO LOC OF ODD ROWS
EVEN_ROW
MOVE PO I NTER TO SI
RECOVER AL VALUE
COLUMN VALUE TO OX

R4:
8B FO
58
8B 01

DETERMI NE GRAPH I CS MODE CURRENTLY I N EFFECT
SET UP THE REGISTERS ACCORDING TO THE MODE
CH = MASK FOR LOW OF COLUMN ADDRESS ( 7/3 FOR HIGH/MED RES)
CL = # OF ADDRESS BITS IN COLUMN VALUE ( 3/2 FOR H/M)
BL = MASK TO SELECT BITS FROM POINTED BYTE (80H/COH FOR H/M)
BH = NUMBER OF VALID BITS IN POINTED BYTE ( 1/2 FOR H/M)
04AF
04B2
04B5
04BA
04BC
04BF

BB
89
80
72
BB
B9

02CO
0302
3E 0049 R 06
06
0180
0703

MOV
MOV
CMP
JC
MOV
MOV

BX,2COH
CX,302H
CRLMODE,6
R5
BX,180H
CX,703H

SET PARMS FOR MED RES
HANDLE IF MED ARES
SET PARMS FOR HIGH RES

DETERMINE BIT OFFSET IN BYTE FROM COLUMN MASK
04C2
04C2

R5 :
22 EA

AND

CH,DL

; AD DR OF PEL IN BYTE TO CH

DETERMINE BYTE OFFSET FOR THIS LOCATION IN COLUMN
04C4
04C6
04C8

03 EA
03 F2
8A F7

SHR
ADD
MOV

OX ,CL
SI,DX
DH, BH

SH I FT BY CORRECT AMOUNT
INCREMENT THE POINTER
GET # BITS IN RESULT TO DH

04CA
04CC
04CC

2A C9

SUB

CL ,CL

ZERO INTO STORAGE LOCATION

DO C8

ROR

AL,l

04CE
0400
0402

02 CD
FE CF
75 F8

ADD
DEC
JNZ

CL, CH
BH
R6

0404
0406
0408
0409
04DA

8A E3
02 EC
5B
C3

LEFT JUSTI FY THE VALUE
IN AL (FOR WRITE)
ADD IN THE BIT OFFSET VALUE
LOOP CONTROL
ON EX IT, CL HAS SH I FT COUNT
TO RESTORE BITS
GET MASK TO AH
MOVE MASK TO CORRECT LOCAT
RECOVER REG
RETURN WITH SET UP

MULTIPLY BH (VALID BITS IN BYTE) BY CH (BIT OFFSET)
R6:

MOV
SHR
POP
RET
R3 ENDP

AH,BL
AH,CL
BX

GRAPHICS UP
THIS ROUTINE SCROLLS UP THE INFORMATION ON THE CRT
ENTRY
CH, CL = UPPER LEFT CORNER OF REGION TO SCROLL
DH,DL = LOWER RIGHT CORNER OF REGION TO SCROLL
BOTH OF THE ABOVE ARE IN CHARACTER POSITIONS
BH = FILL VALUE FOR BLANKED LINES
AL = # LINES TO SCROLL (AL=O MEANS BLANK THE ENTIRE
FIELD)
OS = DATA SEGMENT
ES = REGEN SEGMENT
EXIT
NOTHING, THE SCREEN IS SCROLLED
04DA
04DA
04DC

8A 08
8B Cl

GRAPHICS_UP
PROC
MOV
BL,AL
MaV
AX,CX

NEAR
; SAVE LINE COUNT IN BL
; GET UPPER LEFT POS IN AX REG

USE CHARACTER SUBROUTINE FOR POSITIONING

2-98 ROM BIOS

;----- ADDRESS RETURNED IS MULTIPLIED BY 2 FROM CORRECT VALUE
04DE
04El

EB 073C R
8B F8

CALL
MOV

GRAPH_POSN
DI,AX

; SAVE RESULT AS DEST ADDRESS

DETERMINE SIZE OF WINDOW
04E3
04E5
04E9

2B 01
81 C2 0101
DO E6

SUB
ADD
SAL

OX ,CX
DX,101H
DH,l

04EB

DO E6

SAL

DH,l

04ED
04F2

80 3E 0049 R 06
73 04

04F4
04F6

DO E2
01 E7

ADJUST VALUES
MUL TIPL Y # ROWS BY 4
SINCE 8 VERT DOTS/CHAR
AND EVEN/ODD ROWS

DETERMINE CRT MODE
CMP
JNC

CRLMODE,6
R7

TEST FOR MEDIUM RES
FIND_SOURCE

MEDIUM RES UP
SAL
SAL

; # COL * 2 SINCE 2 BYTES/CHAR
; OFFSET *2 SINCE 2 BYTES/CHAR

DL,l
01,1

DETERMINE THE SOURCE ADDRESS IN THE BUFFER
04F8
04F8
04F9
04FA
04FC
04FE
0500
0502
0504
0506
0508
050A
050C
050E

R7:
06
IF
2A
DO
DO
74
8A
B4
F6
8B
03
8A
2A

PUSH
POP
SUB
SAL
SAL
JZ
MOV
MOV
MUL
MOV
ADD
MOV
SUB

ED
E3
E3
20
C3
50
E4
F7
FO
E6
E3

FIND_SOURCE
GET SEG BOTH POINTING REGEN

ES
OS
CH,CH
BL,l
BL,l
Rll
AL, BL
AH,80
AH
SI,DI
SI,AX
AH,DH
AH,BL

ZERO TO HIGH OF COUNT REG
MUL TI PL Y NO. OF LI NES BY 4
IF ZERO, BLANK ENTIRE FIELD
GET NUMBER OF LINES IN AL
80 BYTES/ROW
DETERMINE OFFSET TO SOURCE
SET UP SOURCE
ADD IN OFFSET TO IT
NUMBER OF ROWS IN FIELD
DETERMINE NUMBER TO MOVE

LOOP THROUGH, MOVING ONE ROW AT A TIME, BOTH EVEN & ODD FIELDS
0510
0510
0513
0517
051B
0510

R8:
E8
81
81
FE
75

0593 R
EE IFBO
EF IFBO
CC
Fl

CALL
SUB
SUB
DEC
JNZ

R17
SI,2000H-80
DI,2000H-80
AH
R8

ROW_LOOP
MOVE ONE ROW
MOVE TO NEXT ROW
NUMBER OF ROWS TO MOVE
CONTINUE TILL ALL MOVED

FILL IN THE VACATED LINE(S)
051F
051F
0521
0521
0524
0528
052A
052C
052F
052F
0531
0533

8A C7
E8
81
FE
75
E9

05AC R
EF IFBO
CB
F5
016F R

8A DE
EB EC

R9:
MOV
RlO:
CALL
SUB
DEC
JNZ
JMP
Rll:
MOV

CLEAR-ENTRY
ATTRIBUTE TO FILL WITH

AL, BH
R18
DI,2000H-80
BL
RIO
VIDEO_RETURN
BL,DH

JMP
R9
GRAPHICS_UP

CLEAR THAT ROW
POINT TO NEXT LINE
NUMBER OF LI NES TO FILL
CLEAR_LOOP
EVERYTHING DONE
BLANK_FI ELD
SET BLANK COUNT TO
EVERYTHING IN FIELD
CLEAR THE FI ELD

ENDP

ROM BIOS 2-99

GRAPHICS DOWN
THIS ROUTINE SCROLLS DOWN THE INFORMATION ON THE CRT
ENTRY
CH,CL = UPPER LEFT CORNER OF REGION TO SCROLL
DH,DL = LOWER RIGHT CORNER OF REGION TO SCROLL
BOTH OF THE ABOVE ARE IN CHARACTER POSITIONS
BH = FILL VALUE FOR BLANKED LINES
AL = # LINES TO SCROLL (AL=O MEANS BLANK THE ENTIRE
FI ELD)
OS = DATA SEGMENT
ES = REGEN SEGMENT
EXIT
NOTHING, THE SCREEN IS SCROLLED
0533
0533
0534
0536

GRAPH I CS_DOWN
PROC
STD
MOV
BL,AL
MOV
AX,DX

FD
8A 08
8B C2

NEAR
; SET DIRECTION
; SAVE LINE COUNT IN BL
; GET LOWER RIGHT POS INTO AX

;----- USE CHARACTER SUBROUTINE FOR POSITIONING
;----- ADDRESS RETURNED IS MULTIPLIED BY 2 FROM CORRECT VALUE
0538
053B

onc

E8
8B F8

R

CALL
MOV

GRAPH_POSN
DI,AX

; SAVE RESULT AS DEST AD DR

DETERMINE SIZE OF WINDOW
0530
053F
0543

2B 01
81 C2 OlD1
DO E6

0545

DO E6

SUB
ADD
SAL

OX, CX
DX,101H
DH,l

SAL

DH,l

ADJUST VALUES
MUL TIPLY # ROWS BY 4
SINCE 8 VERT DOTS/CHAR
AND EVEN/ODD ROWS

DETERMINE CRT MODE
0547
054C

80 3£ 0049 R 06
73 05

054E

DO E2

SAL

DL,l

0550
0552

01 E7
47

SAL
INC

01,1
01

CMP
JNC

CRLMODE,6
R12

TEST FOR MEDIUM RES
FIND_SOURCE_DOWN

;----- MEDIUM RES DOWN

# COLUMNS * 2, SINCE
2 BYTES/CHAR (OFFS,ET OK)
OFFSET *2 SINCE 2 BYTES/CHAR
PO I NT TO LAST BYT E

DETERMINE THE SOURCE ADDRESS IN THE BUFFER
0553
0553
0554
05.55
0557
055B
0550
055F
0561
0563
0565
0567
0569
056B
0560

06
IF
2A
81
DO
DO
74
8A
B4
F6
8B
2B
8A
2A

ED
C7 OOFO
E3
E3
2E
C3
50
E4
F7
FO
E6
E3

R12 :
PUSH
POP
SUB
ADD
SAL
SAL
JZ
MOV
MOV
MUL
MOV
SUB
MOV
SUB

ES
OS
CH,CH
01,240
BL,l
BL,l
R16
AL,BL
AH,80
AH
SI,DI
SI,AX
AH,DH
AH,BL

FIND_SOURCLDOWN
BOTH SEGMENTS TO REGEN
ZERO TO HIGH OF COUNT REG
POINT TO LAST ROW OF PIXELS
MUL TIPLY NO. OF LINES BY 4
IF ZERO, BLANK ENTIRE FIELD
GET NUMBER OF LINES IN AL
80 BYT ES / ROW
DETERMINE OFFSET TO SOURCE
SET UP SOURCE
SUBTRACT THE OFFSET
NUMBER OF ROWS IN FIELD
DETERMINE NUMBER TO MOVE

LOOP THROUGH, MOVING ONE ROW AT A TIME, BOTH EVEN & ODD FI ELDS
056F
056F
0572
0576
057A
057C

E8
81
81
FE
75

0593 R
EE 2050
EF 2050
CC
F1

R13 :
CALL
SUB
SUB
DEC
JNZ

R17
SI,2000H+80
DI,2000H+80
AH
R13

FILL IN THE VACATED LINE(S)

2-100 ROM BIOS

ROW_LOOP _DOWN
MOVE ONE ROW
MOV E TO NEXT ROW
NUMBER OF ROWS TO MOVE
CONTINUE TILL ALL MOVED

057E
057E
0580
0580
0583
0587
0589
058B
058C
058F
058F
0591
0593

8A C7
E8
81
FE
75
FC
E9

05AC R
EF 2050
CB
F5
016F R

8A DE
EB EB

R14:
MOV
R15:
CALL
SUB
DEC
JNZ
CLD
JMP
R16 :
MOV

AL, BH
R18
DI ,2000H+80
BL
R15
VIDEO_RETURN
BL,DH

JMP
R14
GRAPH I CS_DOWN

CLEAR_ENTRLDOWN
ATTRIBUTE TO FILL WITH
CLEAR_LOOP_DOWN
CLEAR A ROW
POINT TO NEXT LINE
NUMBER OF LINES TO FILL
CLEAR_LOOP_DOWN
RESET THE DIRECTION FLAG
EVERYTHING DONE
BLANILFI ELD_DOWN
SET BLANK COUNT TO EVERYTHNG
IN FIELD
CLEAR THE FI ELD

ENDP

ROUTINE TO MOVE ONE ROW OF I NFORMA TI ON
0593
0593
0595
0596
0597
0599
059A
059B
059F
05A3
05A4
05A5
05A7
05A9
05AA
05AB
05AC

R17
8A CA
56
57
F3/ A4
5F
5E
81 C6 2000
81 C7 2000
56
57
8A CA
F3/ A4
5F
5E
C3

MOV
PUSH
PUSH
REP
POP
POP
ADD
ADD
PUSH
PUSH
MOV
REP
POP
POP
RET
R17

PROC
NEAR
CL, DL
SI
DI
MOVSB
DI
SI
SI,2000H
DI,2000H
SI
DI
CL,DL
MOVSB
DI
SI

NUMBER OF BYTES IN THE ROW
SA VE PO INTERS
MOVE THE EVEN FI ELD

POINT TO THE ODD FIELD
SAVE THE POINTERS
COUNT BACK
MOVE THE ODD FI ELD
POINTERS BACK
RETURN TO CALLER

ENDP

CLEAR A SINGLE ROW
05AC
05AC
05AE
05AF
05Bl
0582
05B6
05B7
05B9
05BB
05BC
05BD

RIB
MOV
PUSH
REP
POP
ADD
PUSH
MOV
REP
POP
RET

8A CA
57
F3/ AA
5F
81 C7 2000
57
8A CA
F3/ AA
5F
C3
R18

PROC
NEAR
CL, DL
DI
STOSB
DI
DI,2000H
DI
CL, DL
STOSB
DI

NUMBER OF BYTES IN FI ELD
SAVE POINTER
STORE THE NEW VALUE
POINTER BACK
POINT TO ODD FIELD
FILL THE ODD FILELD
RETURN TO CALLER

ENDP

GRAPHICS WRITE
THIS ROUTINE WRITES THE ASCI I CHARACTER TO THE
CURRENT POSITION ON THE SCREEN.
ENTRY
AL = CHARACTER TO WRITE
BL = COLOR ATTRIBUTE TO BE USED FOR FOREGROUND COLOR
IF BIT 7 IS SET, THE CHAR IS XOR'D INTO THE REGEN
BUFFER (0 IS USED FOR THE BACKGROUND COLOR)
CX = NUMBER OF CHARS TO WRITE
OS = DATA SEGMENT
ES = REGEN SEGMENT
EXIT
NOTHING IS RETURNED
FOR THIS ROUTINE, THE IMAGES USED TO FORM CHARS ARE CONTAINED
IN ROM.

ROM BIOS 2-101

05BD
05BD
05BF

B4 00
50

05CO
05C3

E8 0739
8B F8

ASSUME CS: ROMCODE, OS: DATA, ES: DATA
GRAPH I CS_WR ITE PROC
NEAR
MOV
AH,O
; ZERO TO HIGH OF CODE POINT
PUSH
AX
; SAVE CODE POINT VALUE
DETERMINE POSITION IN REGEN BUFFER TO PUT CODE POINTS
CALL
MOV

S26
DI,AX

; FIND LOC IN REGEN BUFFER
; REGEN POINTER IN 01

DETERMINE REGION TO GET CODE POINTS FROM
05C5
05C6
05C7
05C9

58
IE
2B F6
8E DE

05CB
05CD
05CF
0503
0506
0508
05DC

3C
73
C5
EB
2C
C5
8C

05DE
05DF

IF
52

80
07
36 0110
07 90
80
36 007C
DA

POP
AX
PUSH
OS
SUB
SI,SI
MOV
OS ,SI
ASSUME OS :ABSO
CMP
AL,80H
JAE
SO
LOS
SI,CSELPTR
JMP
SI
SO:
SUB
AL,80H
LOS
SI, EXLPTR
SI :
MOV
DX,DS
ASSUME DS:DATA
POP
OS
PUSH
OX

; RECOVER CODE POINT

IF IT IS IN SECOND HALF
JUMP
IT'S IN FIRST HALF
ZERO ORIGIN FOR SECOND HALF
GET POINTER TO 2ND HALF
SAVE THE SEGMENT OF THE TBL
RECOVER DATA SEGMENT
SAVE TABLE SEGMENT ON STACK

DETERMINE GRAPHICS MODE IN OPERATION
05EO
05EO
05E2
05E4
05E6
05E8
05ED
05EE

S2:
01
01
01
03
80
IF
72

EO
EO
EO
FO
3E 0049 R 06

SAL
SAL
SAL
ADD
CMP
POP
JC

2C

AX,1
AX,1
AX,1
SI,AX
CRLMODE,6
OS
S7

DETERMINE-MODE
MUL TI PL Y CODE PO I NT
VALUE BY 8
SI HAS OFFSET OF CODES
RECOVER TBL POINTER SEGMENT
TEST FOR MEDIUM RESOLUTION

HIGH RESOLUTI ON MODE
05FO
05FO
05F!
05F2
05F4
05F4
05F5
05F8
05FA
05FB
05FC
05FC
0601
0604
0606
0608
0609
060A
060B
0600
0610
0610
0613
0614
0615
061A

S3 :
57
56
B6 04

PUSH
PUSH
MOV

01
SI
DH,4

HIGH_CHAR
SAVE REGEN POINTER
SAVE CODE POINTER
NUMBER OF TIMES THROUGH LOOP

S4:
AC
F6 C3 80
75 16
AA
AC

LODSB
TE5T
JNZ
STOSB
LOD5B

BL,80H
56

GET BYTE FROM CODE POINTS
SHOULD WE USE THE FUNCTION
TO PUT CHAR IN
STORE IN REGEN BUFFER

55:
26: 88 85 IFFF
83 C7 4F
FE CE
75 EC
5E
5F
47
E2 E3
E9 016F R

MOV
ADD
DEC
JNZ
POP
POP
INC
LOOP
JMP

ES: [DI+2000H-l] ,AL ; STORE IN SECOND HALF
01,79
MOVE TO NEXT ROW IN REGEN
DH
DONE WITH LOOP
54
51
01
RECOVER REGEN POINTER
01
POINT TO NEXT CHAR POSITION
S3
MORE CHARS TO WRITE
VIDEO_RETURN

XOR
STOSB
LODSB
XOR
JMP

AL,ES:[DI]

56:
26: 32 05
AA
AC
26: 32 85 IFFF
EB EO

EXCLUSIVE OR WITH CURRENT
5TORE THE CODE POINT
AGAI N FOR ODD FI ELD
AL,ES: [DI+2000H-l]
S5
BACK TO MAINSTREAM

;----- MEDIUM RESOLUTION WRITE
061C
061C
061E
0620

57 :
8A 03
01 E7
E8 06F7

2-102 ROM BIOS

MOV
5AL
CALL

DL,BL
01,1
S19

MED_RES_WRITE
SAVE HIGH COLOR BIT
OFF5ET*2 SINCE 2 BYTE5/CHAR
EXPAND BL TO FULL WORD

0623
0623
0624
0625
0627
0627
0628
062B
062D
0630
0632
0635
0639
0639
063C
0640
0641
0644
0646
0649
064B
0650
0655
0655
065A
065F
0662
0664
0666
0667
0668
0669
066A
066C
066F

MED_CHAR
SAVE REGEN POINTER
SAVE THE CODE POINTER
NUMBER OF LOOPS

S8:
57
56
B6 04

PUSH
PUSH
MOV

DI
SI
DH,4

LODSB
CALL
AND

S21
AX,BX

S9:
AC
E8 070C R
23 C3
F6 C2 80
74 07
26: 32 25
26: 32 45 01
26: 88 25
26: 88 45 01
AC
E8 070C R
23 C3
F6 C2 80
74 OA
26: 32 A5 2000
26: 32 85 2001
26 : 88 A5 2000
26: 88 85 2001
83 C7 50
FE CE
75 Cl
5E
5F
47
47
E2 B7
E9 016F R

GET CODE POI NT
DOUBLE UP ALL THE BITS
CONVERT THEM TO FOREGROUND
COLOR ( 0 BACK )
IS THIS XOR FUNCTION
NO, STORE IT IN AS IT IS
; DO FUNCTION WITH HALF
AND WITH OTHER HALF

TEST
DL,80H
JZ
S10
XOR
AH,ES:[DIJ
XOR
AL,ES: [DI+IJ
SlO:
ES:-DI-,AH
STORE FI RST BYTE
MOV
MOV
ES: [DI+IJ ,AL
STORE SECOND BYTE
LODSB
GET CODE POINT
CALL
S21
AND
AX,BX
CONVERT TO COLOR
TEST
DL,80H
AGAIN, IS THIS XOR FUNCTION
JZ
Sl1
; NO, JUST STORE THE VALUES
AH, ES: -DI +2000HFUNCTION WITH FIRST HALF
XOR
AL, ES: -D I +2001HAND WITH SECOND HALF
XOR
Sl1:
MOV
ES: [D I +2000HJ , AH
ES: -DI +2000H+ 1-, AL
MOV
PUT I N 2ND BU FR PART
ADD
DI,80
POINT TO NEXT LOCATION
DEC
DH
JNZ
S9
KEEP GOING
POP
SI
RECOVER CODE PONTER
POP
01
RECOVER REGEN POINTER
DI
POINT TO NEXT CHAR POSITION
INC
INC
DI
LOOP
S8
MORE TO WRITE
JMP
VIDEO_RETURN
GRAPHICS_WRITE ENDP

GRAPH I CS READ
THIS ROUTINE READS THE ASCII CHARACTER AT THE CURRENT
CURSOR POSITION ON THE SCREEN BY MATCHING THE DOTS ON
THE SCREEN TO THE CHARACTER GENERATOR CODE POINTS
ENTRY
( 0 IS ASSUMED AS THE BACKGROUND COLOR
DS
DATA SEGMENT
ES
REGEN SEGMENT
EXIT
AL
CHARACTER READ AT THAT POSITION (0 RETURNED IF
NONE FOUND)
0

0

0

FOR THIS ROUTINE, THE IMAGES USED TO FORM CHARS ARE CONTAINED
IN ROM.
066F
066F
0672
0674

E8 0739 R
8B FO
83 EC 08

0677

8B EC

GRAPH I CS_READ
PROC
CALL
S26
MOV
SI,AX
SUB
SP,8
MOV

BP ,SP

NEAR
CONVERTED TO OFFSET IN REGEN
SAVE IN SI
ALLOCATE SPACE TO SAVE THE
READ CODE POINT
POINTER TO SAVE AREA

DETERMINE GRAPHICS MODES
0679
067E
067F
0680

80 3 E 0049 R 06
06
IF
72 lA

CMP
PUSH
POP
JC

CRLMODE,6
ES
DS
S13

POINT TO REGEN SEGMENT
MEDIUM RESOLUTION

HIGH RESOLUTION READ
GET VALUES FROM REGEN BUFFER AND CONVERT TO CODE POINT
0682
0684
0684

B6 04
8A 04

MOV
S12:
MOV

DH,4

NUMBER OF PASSES

AL, [SIJ

GET FIRST BYTE

ROM BIOS 2-103

06F4
06F7

E9 016F R

VIDEO_RETURN
JMP
GRAPHICS_READ
ENDP

ALL DONE

-------- - -- - - - - - -- - - - - - -- -- - - -- - - - -- - - - - - - - - - -- - - -- -- --EXPAND_MED_COLOR - S19
THIS ROUTINE EXPANDS THE LOW 2 BITS IN BL TO
FILL THE ENTIRE BX REGISTER
ENTRY
BL = COLOR TO BE US ED ( LOW 2 BITS )
EXIT
BX = COLOR TO BE USED ( 8 REPLICATIONS OF THE
2 COLOR BITS )

06F7
06F7
06FA
06FC
06FD
0700
0700
0702
0704
0706
0708
070A
070B
070C

------- ----- - - - - - - - - - -- - - - - - - - - - - - - - - - - - - - - - -- - - - - - -- - -S19
80 E3 03
8A C3
51
B9 0003
DO
DO
OA
E2
8A
59
C3

EO
EO
08
F8
FB

PROC
NEAR
AND
BL,3
MOV
AL,BL
PUSH
CX
MOV
CX,3
S20:
SAL
AL,1
SAL
AL,1
OR
BL,AL
LOOP
S20
MOV
BH, BL
POP
CX
RET
519
ENDP

EXPAND_BYTE

070C
070C
0700
0710
0710
0712
0714
0716
0718
071A
071B
071C

ISOLATE THE COLOR BITS
COPY TO AL
SAVE REGISTER
NUMBER OF TIMES TO DO THIS
LEFT SHI FT BY 2
ANOTHER COLOR VERS ION INTO BL
FI LL ALL OF BL
FILL UPPER PORTION
REGISTER BACK
ALL DONE

- 521
THIS ROUTINE TAKES THE BYTE IN AL AND DOUBLES
ALL OF THE BITS, TURNING THE 8 BITS INTO
16 BITS. THE RESULT IS LEFT IN AX

PROC
NEAR
PUSH
OX
MOV
DX ,8000H
DBLBIT4:
SHR
AL,1
RCR
DX,1
SAR
DX,1
JNB
DBLBIT4
MOV
AX,DX
POP
DX
RET
521
ENDP
521

52
BA 8000
DO
01
01
73
8B
5A
e3

E8
DA
FA
F8
C2

SAVE REGISTER
BIT TO TERMINATE LOOP
LOW ORDER BIT TO CARRY FLAG
FROM CARRY TO HIGH OF RESULT
DBL HIGH ORDER BIT -SIGN EXT
TERM WHEN BIT SHIFTED OUT
PUT RESULT I NTO AX
RESTORE REGISTER
RETURN

MED_READ_BYTE - S23
THIS ROUTINE WILL TAKE 2 BYTES FROM THE REGEN
BUFFER, COMPARE AGAINST THE CURRENT FOREGROUND
COLOR, AND PLACE THE CORRESPONDING ON/OFF BIT
PATTERN INTO THE CURRENT POSITION IN THE SAVE
AREA
ENTRY
SI,DS = POINTER TO REGEN AREA OF INTEREST
BX = EXPANDED FOREGROUND COLOR
BP = POINTER TO SAVE AREA
EXIT
BP IS INCREMENT AFTER SAVE
D71C
071C
071E
0721
0724
0726
0726
0728
0729
072B
072C
072E
0730
0732
0734

PROC
NEAR
MOV
AH, [SIJ
MOV
AL, [SI+IJ
MOV
CX,OCOOOH
MOV
DL,O
S24 :
TEST
AX, ex
CLC
JZ
S25
STC
S25 :
RCL
DL,1
SHR
eX,1
eX,1
SHR
JNC
524
MOV
[BPJ ,DL

523
8A
8A
B9
B2

24
44 01
COOO
00

85
F8
74
F9
DO
01
01
73
88

Cl
01
02
E9
E9
F2
56 00

2-104 ROM BIOS

GET FI RST BYTE
GET SECOND BYTE
2 BIT MASK TO TEST ENTRIES
RESULT REGISTER
IS THIS SECTION BACKGROUND?
CLEAR CARRY
I F ZERO, IT IS BACKGROUND
WASN'T, SO SET CARRY
MOVE THAT BIT INTO RESULT
MOVE MASK RIGHT BY 2 BITS
AGAI N [F MASK NOT FALL OUT
STORE RESULT IN SAVE AREA

0686
0689
068A
068E
0691
0692
0695
0697
0699

88
45
8A
88
45
83
FE
75
EB

46 00
84 2000
46 00
C6 50
CE
EB
17 90

MOV
INC
MOV
MOV
INC
ADD
DEC
JNZ
JMP

[BP],AL
BP
AL, [S I +2000H]
[BP],AL
BP
SI,80
DH
S12
S15

SAVE IN STORAGE AREA
NEXT LOCATION
GET LOWER REGION BYTE
ADJUST AND STORE
POINTER INTO REGEN
LOOP CONTROL
DO IT SOME MORE
GO MATCH SAVED CODE POINTS

;----- MEDIUM RESOLUTION READ
069C
069C
069E
06AO
D6AO

E8 07lC R

06A3
06A7
06AA
06AE
06BO

81
E8
81
FE
75

01 E6
B6 04

C6 2000
07lC R
EE 1FBO
CE
EE

S13 :
SAL
MOV
S14 :
CALL
ADD
CALL
SUB
DEC
JNZ

,. MED_RES_READ
51,1
DH,4

OFFSET*2 SINCE 2 BYTES/CHAR
NUMBER OF PASSES

523

GET PAIR BYTES FROM REGEN
INTO SINGLE SAVE
GO TO LOWER REGION
GET THIS PAIR INTO SAVE
ADJUST PTR BACK INTO UPPER

SI,2000H
S23
SI, 2000H-80
DH
S14

KEEP GOING UNTIL ALL 8 DONE

SAVE AREA HAS CHARACTER IN IT, MATCH IT
06B2
06B2
06B4
06B6
06BB
06BE
06CO
06C1
06C3
06C3
06C4
06C5
06C8
06C8
06C9
06CA
06CD
06CF
0600
0601
0603
0605
0608
0609

; FIND_CHAR

S15 :
SUB
MOV
ASSUME
26: C4 3E 0110 R
LES
ASSUME
83 ED 08
SUB

01,01
ES,DI
ES: ABSO
DI,CSELPTR
ES: NOTHING
BP ,8

8B F5
FC
BO 00

AL,O

ENSURE 01 RECTI ON
CURRENT CD PT BEING MATCHED

SS
OS
DX,128

ESTAB ADDRESSING TO STACK
FOR THE STRING COMPARE
NUMBER TO TEST AGAINST

SI
01
CX,8
CMPSB
01
SI
S18
AL
01,8
OX
S17

SAVE SAVE AREA POINTER
SAVE CODE POINTER
NUMBER OF BYTES TO MATCH
COMPARE THE 8 BYTES
RECOVER THE POINTERS

2B FF
8E C7

16
IF
BA 0080
56
57
B9 0008
F3/ A6
5F
5E
74 IE
FE CO
83 C7 08
4A
75 ED

MOV
CLD
MOV
S16:
PUSH
POP
MOV
S17 :
PUSH
PUSH
MOV
REPE
POP
POP
JZ
INC
ADD
DEC
JNZ

ESTABLI SH ADDRESS I NG
ADJUST POINTER TO BEGINNING
OF SAVE AREA

SI, BP

I F ZERO FLAG SET, MATCH
NO MATCH, MOVE ON TO NEXT
NEXT CODE POINT
LOOP CONTROL
DO ALL OF THEM

CHAR NOT MATCHED, MIGHT BE IN USER SUPPLI ED SECOND HALF
06DB
0600
06DF
06El

3C
74
2B
8E

00
12
CO
08

06E3
06E7
06E9
06EB
06ED
06EF

C4
8C
OB
74
BO
EB

3E 007C
CO
C7
04
80
02

CMP
JE
SUB
MOV
ASSUME
LES
MOV
OR
JZ
MOV
JMP
ASSUME

AL,O
S18
AX,AX
DS,AX
OS :ABSO
DI,EXLPTR
AX, ES
AX,DI
S18
AL,128
S16
DS:DATA

AL <> 0 I F 1ST HALF SCANNED
IF" 0, IF ALL SCANNED
ESTAB ADDRESSING TO VECTOR
GET POINTER
SEE I F POINTER REALLY EXISTS
IF ALL 0, THEN DOESN'T EXIST
NO SENSE LOOKING
ORIGIN FOR SECOND HALF
GO BACK AND TRY FOR IT

CHARACTER IS FOUND ( AL"O IF NOT FOUND )
06F1
06Fl

83 C4 08

S18:
ADD

SP ,8

; READJUST, THROW AWAY SAVE

ROM BIOS 2-105

0737
0738
0739

45
C3

INC
RET
S23

BP

; ADJUST PO INTER
; ALL DONE

ENDP

V4_POSITION - S26
THIS ROUTINE TAKES THE CURSOR POSITION
CONTAINED IN THE MEMORY LOCATION, AND
CONVERTS IT INTO AN OFFSET INTO THE
REGEN BUFFER, ASSUMING ONE BYTE/CHAR.
FOR MEDIUM RESOLUTION GRAPHICS,
THE NUMBER MUST BE DOUBLED.
ENTRY
NO REGISTERS, MEMORY LOCATION
CURSOR_POSN I S USED
EXIT
AX CONTAINS OFFSET INTO REGEN BUFFER
0739
0739
073C
073C
0730
073F
0741
0745
0747
0749
074B
0740
074E
074F

Al 0050 R
53
8B
8A
F6
01
01
2A
03
5B
C3

08
C4
26 004A R
EO
EO
FF
C3

S26
PROC
NEAR
MOV
AX, CURSOR_POSN
GRAPH_POSN
LABEL
NEAR
PUSH
BX
MOV
BX,AX
MOV
AL,AH
MUL
BYTE PTR CRLCOLS
SHL
AX,1
SHL
AX,1
SUB
BH, BH
ADD
AX,BX
POP
BX
RET
S26
ENDP

GET CURRENT CURSOR
SAVE REGISTER
SAVE COPY OF CURRENT CURSOR
GET ROWS TO AL
MULTIPLY BY BYTES/COLUMN
MTPLY * 4 SINCE 4 ROWS/BYTE
ISOLATE COLUMN VALUE
DETERMINE OFFSET
RECOVER POINTER
ALL DONE

THIS INTERFACE PROVIDES A TELETYPE LIKE INTERF TO VIDEO
CARD. THE INPUT CHARACTER IS WRITTEN TO CURRENT CURSOR
POSITION, AND THE CURSOR IS MOVED TO NEXT POSITION. IF
CURSOR LEAVES THE LAST COLUMN OF THE FIELD, COLUMN IS SET
TO ZERO, AND THE ROW VALUE IS INCREMENTED. IF ROW VALUE
LEAVES THE FIELD, CURSOR IS PLACED ON LAST ROW, FIRST
COLUMN, AND ENTIRE SCREEN IS SCROLLED UP ONE LINE. WHEN
THE SCREEN IS SCROLLED UP, THE ATTRIBUTE FOR FILLING NEW
BLANKED LINE IS READ FROM THE CURSOR POSITION ON PREVIOUS
LINE BEFORE SCROLL, IN CHARACTER MODE. IN GRAPHICS MODE,
THE 0 COLOR IS USED. FOR BKSP, THE CURSOR COLUMN POSITION
I S DECREMENTED BY 1. I F THE CURSOR COLUMN ISO AND A BKSP
OCCURS CURSOR COLUMN REMAINS O. IT DOES NOT BACKSPACE TO
THE PREVIOUS LINE.
ENTRY
(AL) = CHARACTER TO BE WRITTEN
NOTE: BACK SPACE, CR, BELL AND LINE FEED ARE HANDLED
AS COMMANDS RATHER THAN AS DISPLAYABLE GRAPHICS
(BL) = FOREGROUND COLOR FOR CHAR WRITE IF CURRENTLY I N A
GRAPHICS MODE
(OS) = DATA SEGMENT
EXIT
ALL REGI STERS SAVED
074F
074F
0750
0751
0753
0757
0759

50
50
B4 03
8A 3E 0062
CD 10
58

075A
075C
075E
0760
0762

3C
74
3C
74
3C

ASSUME
WRITE_TTY
PUSH
PUSH
MOV
MOV
INT
POP

CS: ROMCODE, OS: DATA
PROC
NEAR
AX
AX
AH, GELCURSOILINFO
BH,ACTIVE_PAGE
VIDEO_FN
AX

SAVE REGISTERS
SAVE CHAR TO WRITE
READ CURRENT CURSOR POSITION
SET CURRENT ACTIVE PAGE
I NT 10H
RECOVER CHAR

OX NOW HAS THE CURRENT CURSOR POSITION
08
52
00
57
OA

2-106 ROM BIOS

CMP
JE
CMP
JE
CMP

AL,8
U8
AL ,DOH
U9
AL,OAH

IS IT A BACKSPACE
BACICSPACE
IS IT CARRIAGE RETURN
CAR_RET
IS IT A LINE FEED

0764
0766
0768

74 57
3C 07
74 5A

JE
CMP
JE

UlO
AL,07H

Ull

LINE_FEED
IS IT A BELL
BELL

; ----- WRITE THE CHAR TO THE SCREEN
076A
076C
076F

B4 OA
B9 0001
CD 10

0771
0773
0777
0779
077B
077E

FE
3A
75
B2
80
75

MOV
MOV
INT

AH,WRITE_CHAILONLY
CX,l
VIDEO_FN

WRITE CHAR ONLY TO ACTIVE PG
ONLY ONE CHARACTER
INT 10H

POSITION THE CURSOR FOR NEXT CHAR
C2
16 004A R
33
00
FE 18
2A

INC
CMP
JNZ
MOV
CMP
JNZ

DL
DL, BYTE PTR CRLCOLS ; TEST FOR COLUMN OVERFLOW
U7
SELCURSOR
DL,O
COLUMN FOR CURSOR
DH,24
U6
SELCURSOR_INC

SCROLL REQUIRED
0780
0780
0782

U1:
B4 02
CD 10

MOV
INT

AH,SELCURSOR_POS
VIDEO_FN

; SET THE CURSOR

DETERMINE VALUE TO FILL WITH DURING SCROLL
0784
0787
0789
078B
0780
078F
0791
0791
0793
0795
0797
0797
079A
079C
079E
07A2
07M
07M
07A6
07A6
07A7
07AA
07AA
07AC
07AC
07AE

AO
3C
72
3C
B7
75

0049
04
06
07
00
06

MOV
CMP
JC
CMP
MOV
JNE
U2:

B4 08
CD 10
8A FC

MOV
INT
MOV
U3 :

B8
2B
B6
8A
FE

0601
C9
18
16 004A R
CA

MOV
SUB
MOV
MOV
DEC
U4:

CD 10

INT
U5 :

58
E9 016F R

POP
JMP
U6:

FE C6

INC
U7:

B4 02
EB F4

MOV
JMP

AL,cn...MODE
AL,4
U2
AL,7
BH,O
U3

GET THE CURRENT MODE
READ-CURSOR

FI LL WITH BACKGROUND
SCROLL-UP
READ-CURSOR
AH, READ.J\ TLCHAR
READ CHAR/ATTR AT CURSOR
VIDEO_FN
I NT 10H
BH,AH
STORE IN BH
; SCROLL-UP
AX,SCROLL_WINDOW_UP*256+01H ; SCROLL UP ONE LINE
CX, CX
; UPPER LEFT CORNER
DH,24
; LOWER RIGHT ROW
DL,BYTE PTR CRLCOLS ; LOWER RIGHT COLUMN
DL
VI DEO-CALL-RETURN
VIDEO_FN
PROCESS VIDEO FUNCTION
TTY-RETURN
AX
RESTORE THE CHARACTER
VIDEO_RETURN
RETURN TO CALLER
SET-CURSOR-INC
DH
NEXT ROW
SET -CURSOR
AH, SELCURSOR_POS
SET CURSOR POSITION
U4
ESTABLISH THE NEW CURSOR

BACK SPACE FOUND
BACK SPACE DOES NOT BACK SPACE TO PREVIOUS LINE I F AT BEG OF LINE
07BO
07BO
07B3
07B5
07B7

U8:
80
74
FE
EB

FA 00
F7
CA
F3

CMP
JE
DEC
JMP

DL,O
U7
DL
U7

ALREADY AT BEGINNING OF LINE
SELCURSOR
NO -- JUST MOVE IT BACK
SELCURSOR

CARRIAGE RETURN FOUND
07B9
07B9
07BB

U9 :
B2 00
EB EF

MOV
JMP

DL,O
U7

MOVE TO FI RST COLUMN
SELCURSOR

LINE FEED FOUND
07BD
07BD

80 FE 18

U10:
CMP

DH,24

BOTTOM OF SCREEN

ROM BIOS 2-107

07CO
07C2

75 ES
EB BC

JNE
JMP

U6
UI

YES, SCROLL THE SCREEN
NO, JUST SET THE CURSOR

BL ,2
BEEP
U5

SET UP COUNT FOR BEEP
SOUND THE POD BELL
TTLRETURN

BELL FOUND
07C4
07C4
07C6
07C9
07CB

Ull:
MOV
CALL
JMP
WRITE_TTY

B3 02
ES 0000 E
EB DB

ENDP

LIGHT PEN
THIS ROUTINE TESTS THE LIGHT PEN SWITCH AND THE LIGHT
PEN TRIGGER. IF BOTH ARE SET, THE LOCATION OF THE LIGHT
PEN IS DETERMINED. OTHERWISE, A RETURN WITH NO
INFORMATION IS MADE.
ON ENTRY
(OS)

= DATA

(AH)

=0

SEGMENT

ON EXIT
IF NO LIGHT PEN INFORMATION IS AVAILABLE
aX,ex,ox ARE DESTROYED
(AH) = 1 IF LIGHT PEN IS AVAILABLE
(DH,DL) = ROW,COLUMN OF CURRENT LIGHT PEN
POSITION
(CH) = RASTER POSITION
(BX) = BEST GUESS AT PIXEL HORIZONTAL POSITION

07CB
07CB
0703

ASSUME CS:ROMCODE,DS:DATA
;----- SUBTRACLTABLE
VI LABEL
BYTE
03 03 05 05 03 03
DB
3,3,5,5,3,3,3,4
03 04
PROC
NEAR
;----- WAIT FOR LIGHT PEN TO BE DEPRESSED

0703
0705
0709
07DC
0700
07DF

B4
SB
83
EC
AS
75

00
16 0063
C2 06

07E!
07E3
07E5

AS 02
75 03
E9 OS69 R

04
7E

MOV
MOV
ADD
IN
TEST
JNZ

AH,O
OX, ADDR_6S45
DX,6
AL,DX
AL, LIGHLPEN_SWITCH
V6

SET NO LIGHT PEN RETURN CODE
GET BASE ADDRESS OF 6S45
POINT TO STATUS REGISTER
GET STATUS REGISTER
TEST LI GHT PEN SWITCH
NOT SET, RETURN
.

NOW TEST FOR LIGHT PEN TRIGGER
TEST
JNZ
JMP

AL ,2
V7A
V7

TEST LIGHT PEN TRIGGER
RETURN WIO RESETTING TRIGGER

TRIGGER HAS BEEN SET, READ THE VALUE IN
07E8
07ES

B4 10

07EA
07EE
07FO
07Fl
07F2
07F3
07F5
07F6
07F8
07FA
07FB
OlFC
07FD

8B
SA
EE
42
EC
8A
4A
FE
SA
EE
42
EC
SA

V7A:
MOV

AH,16

; LIGHT PEN REGISTERS ON 6845

INPUT REGS POINTED TO BY AH, AND CONVERT TO ROW COLUMN IN OX
16 0063
C4

E8
C4
C4

E5

MOV
MOV
OUT
INC
IN
MOV
DEC
INC
MOV
OUT
INC
IN
MOV

DX,ADDR_6S45
AL,AH
OX ,AL
DX
AL,DX
CH,AL
OX
AH
AL,AH
DX,AL
OX
AL,DX
AH,CH

ADDRESS REGISTER FOR 6845
REGISTER TO READ
SET IT UP
DATA REGISTER
GET THE VALUE
SAVE IN CX
ADDRESS REGISTER
SECOND DATA REGISTER
POINT TO DATA REGISTER
GET SECOND DATA VALUE
AX HAS INPUT VALUE

; ----- AX HAS THE VALUE READ IN FROM THE 6S45

2-108 ROM BIOS

07FF
0803
0805
080A
080C
0810
0812
0814
0816

MOV
SUB
MOV
SUB
MOV
SHR
SUB
JNS
SUB

8A 1E 0049 R
2A FF
2E: 8A 9F 07CB R
2B C3
8B 1E 004E R
01 EB
2B C3
79 02
2B CO

BL,CRLMODE
BH,BH
BL,CS:V1[BX]
AX,BX
BX,CRLSTART
BX,l
AX, BX
V2
AX,AX

MODE VALUE TO BX
DETERMINE AMOUNT TO SUBTRACT
TAKE IT AWAY

IF POSITIVE, DETERMINE MODE
<0 PLAYS AS 0

DETERMINE MODE OF OPERATION
0818
0818
081A
081F
0821
0826

V2 :
B1
80
72
80
74

MOV
CMP
JB
CMP
JE

03
3E 0049 R 04
2A
3E 0049 R 07
23

CL,3
CRLMODE,4
V4
CRLMODE,7
V4

DETERMINEjlODE
SET *8 SHIFT COUNT
DETERMINE IF GRAPHICS OR ALPHA
ALPHA_PEN
ALPHA_PEN

GRAPHICS MODE
0828
082A

MOV
DIV

B2 28
F6 F2

DL,40
DL

DIVISOR FOR GRAPHICS
DETERMINE ROW(AL) AND COLUMN(AH)
AL RANGE 0-99, AH RANGE 0-39

DETERMINE GRAPHIC ROW POSITION
082C
082E
0830
0832
0834
0839
083B
0830
083F
083F

8A
02
8A
2A
80
75
B1
DO

E8
ED
DC
FF
3E 0049 R 06
04
04
E4

MOV
ADD
MOV
SUB
CMP
JNE
MOV
SAL

CH,AL
CH,CH
BL,AH
BH, BH
CRLMODE,6
V3
CL,4
AH,l

SHL

BX,CL

V3:
03 E3

SAVE ROW VALUE IN CH
*2 FOR EVEN/ODD FI ELD
COLUMN VALU E TO BX
MUL TI PL Y BY 8 FOR MEDIUM RES
DETERMINE MEDIUM OR HIGH RES
NOLH I GH_RES
SHI FT VALUE FOR HIGH RES
COL VAL TIMES 2 FOR HIGH RES
NOLHIGH_RES
MULTIPLY *16 FOR HIGH RES

DETERMINE ALPHA CHAR POSITION
0841
0843
0845
0847
0849

8A
8A
DO
DO
EB

04
FO
EE
EE
12

MOV
MOV
SHR
SHR
JMP

DL,AH
DH,AL
DH,l
DH,l
SHORT V5

COLUMN VALUE FOR RETURN
ROW VALUE
DIVIDE BY 4
FOR VALUE IN 0-24 RANGE
LIGHT_PEN_RETURN_SET

;----- ALPHA MODE ON LIGHT PEN
084B
084B
084F
0851
0853
0855
0857
0859
085B
0850
0850
085F
085F
0860
0864
0867
0868
0869
0869
086A
086C
086F
0872
0875
0876
0879

V4:
F6
8A
8A
02
8A
8A
32
03

36 004A R
FO
04
EO
E8
DC
FF
E3

DIV
MOV
MOV
SAL
MOV
MOV
XOR
SAL

BYTE PTR CRLCOLS
DH,AL
DL,AH
AL,CL
CH,AL
BL,AH
BH, BH
BX,CL

MOV

AH,l

PUSH
MOV
ADD
OUT
POP

OX
OX ,ADDR_6845
DX,7
DX,AL
OX

V5:
B4 01

V6:
52
8B 16 0063
83 C2 07
EE
5A

V7:
55
8B
89
89
89
50
E9

EC
5E 08
4E OA
56 DC
016F R

PUSH
MOV
MOV
MOV
MOV
POP
JMP
READ_LPEN

BP
BP ,SP
[BP] • BX-POS, BX
[BP] • CX-POS, CX
[BP] . DX-POS, OX
BP
VIDEO_RETURN
ENDP

ALPHA_PEN
DETERMINE ROW,COLUMN VALUE
ROWS TO DH
COLS TO DL
MUL TI PL Y ROWS * 8
GET RASTER VAL TO RETURN REG
COLUMN VALUE
TO BX
LI GHT_PEN_RETURN_SET
INDICATE EVERTHING SET
LIGHT _PEN_RETURN
SAVE RETURN VALUE (IN CASE)
GET BASE ADDRESS
POINT TO RESET PARM
ADDR, NOT DATA, IS IMPORTANT
RECOVER VALUE
RETURN_NO_RESET
GET PTR TO STACK SAVE AREA
SETUP RETURN VALUES IN STACK
SAVE AREA

ROM BIOS 2-109

WRITE_STRING
THIS ROUTINE WRITES A STRING OF CHARACTERS TO THE CRT.
INPUT
(AL) ~ WRITE STRING COMMAND 0 - 3
(BH)
DISPLAY PAGE
(Bl) ~ ATTRIBUTE OF CHAR TO WRITE IF AL ~~ 0 OR AL ~~ 1
(CX) ~ COUNT OF CHARACTERS TO WRITE, IF CX~O THEN RETURN
(OX) ~ CURSOR POSITION FOR STRING TO BE WRITTEN
ROW ~ (0-24), COL ~ (0- (CRT COLUMNS-I))
CRT COLUMN SIZE IS EITHER 80 OR 40
(ES) ~ STRING SEGMENT
(BP) ~ STRING OFFSET
(OS) ~ DATA SEGMENT
OUTPUT
N/A
0879
0879
087A
087C
087F
0880
0882
0884
0887
0889
088B
088E
088F
0891
0893
0895
0899
089A

55
8B
8E
50
3C
72
E9
OB
75
E9
53
8A
32
01
8B
5B
56

089B
089C
089E
08AO

50
B4 02
CD 10
58

08A1
08A1
08A2
08A3
08M

51
53
50
06

08A5
08A7
08AB

86 EO
26: 8A 46 00
45

08AC
08AE
08BO
08B2
08B4
08B6
08B8
08BA
08BC

3C
74
3C
74
3C
74
3C
75

EC
46 10
04
03
0924 R
C9
03
0924 R
OF
FF
E3
B7 0050

WRITE_STRING
PROC
NEAR
PUSH
BP
MOV
BP, SP
MOV
ES, [BP] . ES_POS
RECOVER STRING SEG ADDRESS
POP
BP
TEST FOR INVAL STRING OPTION
CMP
Al,04
IF OPTION INVAL THEN RETURN
JB
WO
JMP
DONE
TEST FOR 0 LENGTH STRING
WO:
OR
CX,CX
JNZ
WI
JMP
IF 0 LENGTH STRING, RETURN
DONE
SAVE PAGE AND POSSIBLE ATTR
WI:
PUSH
BX
GET CURRENT CURSOR POSITION
MOV
BL, BH
XOR
BH, BH
SAL
BX ,I
MOV
SI, [BX+OFFSET CURSOR_POSN]
RESTORE BX
POP
BX
SAVE CURRENT CURSOR POSITION
PUSH
SI
PUSH
MOV
INT
POP

AX
AH, SELCURSOR_POS
VIDEO_FN
AX

SAVE WRITE STRING OPTION
SET NEW CURSOR POSITION
RESTORE WRITE STRING OPTION

WRITE_CHAR:
PUSH
CX
PUSH
BX
PUSH
AX
PUSH
ES
XCHG
MOV
INC

AH,AL
AL,ES: [BP]
BP

PUT WRT STRING OPTION IN AH
GET CHAR FROM INPUT STRING
BUMP POINTER TO CHARACTER

; ----- TEST FOR SPECIAL CHARACTER'S
08
OC
OD
08
OA
04
07
1C

CMP
JE
CMP
JE
CMP
JE
CMP
JNE
DO_TTY:

2-110 ROM BIOS

AL,8
DO_TTY
AL ,ODH
DO_TTY
AL ,OAH
DO_TTY
AL ,07H
GELATTRI BUTE

IS IT A BACKSPACE
BACK-SPACE
IS IT CARRIAGE RETURN
CAR_RET
IS IT A LINE FEED
LINE_FEED
IS IT A BELL
I F NOT THEN DO WRITE CHAR

----- WRITLTTY IS CALLED TO PROCESS THE SPECIAL CHAR. WRITE_TTY WRTS
TO THE CURRENT ACTIVE PAGE DEFINED BY GLOBAL VAR ACTIVE_PAGE.
WRITLSTRING WRITES TO THE PAGE DEFINED BY USER IN BH REGISTER.
THE ACTIVE_PAGE VARIABLE MAY NOT BE SAME PG AS DEFINED BY USER
IN BH REGISTER. THE ACTIVE_PAGE VAR MUST BE TEMP SET TO
BH REGISTER BEFORE CALLING WRITE_TTY. AND, BOTH ACTIVE-PAGE AND
BH REGISTER MUST BE RESTORED AFTER.
08BC
08CO
08C2
08C4
08C8
08CA
08CC
08CE
08D2
0803
08D4
08D5
08D6

86
B4
CD
86
8A
32
01
8B
07
58
5B
59
EB

3E 0062 R
OE
10
3E 0062 R
DF
FF
E3
97 0050 R

08D8
08D8
08DB
08DE
08EO
08E4

B9 0001
80 FC 02
72 05
26: 8A 5E 00
45

GELATTRIBUTE:
MOV
CX ,I
CMP
AH,2
JB
GOLIT
MOV
BL,ES: [BP]
INC
BP

08E5
08E5
08E7
08E9
08EA
08EB
08EC

B4 09
CD 10
07
58
5B
59

GOLIT:
MOV
INT
POP
POP
POP
POP

08 ED
08EF

FE C2
3A 16 004A R

INC
CMP

08F3
08F5
08F7
08F9
08FC

72 1A
FE C6
2A D2
80 FE 19
72ll

JB
INC
SUB
CMP
JB

37

XCHG
MOV
INT
XCHG
MOV
XOR
SAL
MOV
POP
POP
POP
POP
JMP

ACTIVE_PAGE,BH
TEMPORARILY EXCHANGE VALUES
AH, WRITE_TEL ETYPE
WRITE TTY CHAR TO THE ACT PG
VIDEOJN
INT 10H
ACTIVE_PAGE, BH
RESOTRE VALUES
BL, BH
GET CURRENT CURSOR POSITION
BH, BH
; INTO THE OX REGISTER
BX ,I
DX, [BX+OFFSET CURSOILPOSN]
ES
AX
; RESTORE REGISTERS
BX
CX
SHORT ROWS_SET

AH, WR ITE_ATLCHAR
VIDEO_FN
ES
AX
BX
CX

SET CHAR WRITE AMOUNT TO ONE
IS ATTRIBUTE IN THE STRING
I F NOT THEN JUMP
ELSE GET IT
BUMP STRING POINTER
WRITE CHAR AND ATTRI BUTE
RESTORE REGISTERS

DL
; INCREMENT COLUMN COUNTER
DL, BYTE PTR CRLCOLS ;. I F COLS ARE I N RANGE FOR
THIS MODE THEN
COLUMNS_SET
GOTO COLS SET
BUMP ROW COUNTER BY ONE
DH
SET COLUMN COUNTER TO ZERO
DL,DL
I F ROWS ARE < 25 THEN
DH,25
GOTO ROWS_SET
ROWS_SET

WRITLTTY IS CALLED TO PROCESS SCROLL LINE CMD. WRITE_TTY WRITES
TO THE CURRENT ACTIVE PAGE DEFINED BY GLOBAL VARIABLE ACTIVE_PAGE.
WRITE_STRING WRITES TO THE PAGE DEFINED BY USER IN BH REGISTER.
THE ACTIVE_PAGE VARIABLE MAY NOT BE THE SAME PAGE DEFINED BY USER
IN BH REGISTER. ACTIVE_PAGE VARIABLE MUST BE TEMPORARILY SET TO
BH REGISTER BEFORE CALLING WRITLTTY. AND, BOTH ACTIVE-PAGE AND
BH REGISTER MUST BE RESTORED AFTER.
08FE
08FF
0903
0906
0908
090C
090E
090F
090F
090F
0910
0912
0914
0915

50
86
B8
CD
86
FE
58

0917
0918
09lA
091C

5A
3C 01
74 08
3C 03

3E 0062
OEOA
10
3E 0062
CE

50
B4 02
CD 10
58
E2 8A

AX
SAVE WRITE STRING PARM REGS
PUSH
ACTIVE_PAGE,BH
; TEMPORARILY EXCHANGE VALUES
XCHG
MOV
AX,WRITE_TELETYPE*256+0AH ; SCROLL 1 LINE
VIDEO_FN
FEED COMMAND TO WRITE TTY FN
INT
ACTIVE_PAGE, BH
XCHG
RESTORE TO ORIG VALUES
DEC
DH
RESET ROW COUNTER TO 24
POP
AX
RESTORE REG'S
ROWS_SET:
COLUMNS_SET:
PUSH
AX
SAVE WRITE STRING OPTION
MOV
AH, SELCURSOR_POS
SET NEW CURSOR POSITION
VIDEO_FN
INT
AND RESTORES VIDEO PAGE
POP
AX
WRITE_CHAR
LOOP
DO IT UNTIL CX = ZERO
POP
CMP
JE
CMP

DX
AL,l
DONE
AL,3

RESTORE OLD CURSOR COORDIN
I F CURSOR WAS TO BE MOVED
WE'RE DONE

ROM BIOS 2-111

091E
0920
0922
0924
0924

74 04
B4 02
CD 10

JE
MOV
INT
DONE:
JMP

E9 016F R

DONE
AH ,S ELCURSOR_POS
VIDEO_FN

ELSE RESTORE OLD CURSOR POS

VIDEO_RETURN

RETURN TO CALLER

0927

ENDP
LCD_REQUEST
THESE ROUTINES PERFORM FUNCTIONS SPECIFIC TO THE LCD
CONTROLLER.
INPUT
AL - LCD REQUEST NUMBER
o " LOAD USER SPECI FI ED FONT
1 " LOAD SYSTEM ROM DEFAULT FONT
2 " SET LCD HIGH INTENSITY ATTRIBUTE MAPPING
3 - 255 " NO OPERATION
(OS) " DATA SEGMENT
ADDITIONAL INPUTS ARE REQUIRED FOR EACH REQUEST
LCD MUST BE PRESENT. IF NOT, NO OPERATION IS PERFORMED
OUTPUT
LCD SPECIFIC FUNCTION WILL BE PERFORMED IF A LCD
IS PRESENT

0927
0927
0928
092A
0920
092F

50
B4 20
E8 0000
A8 03
58
75 03
E9 016F R

PUSH
MOV
CALL
TEST
POP
JFZ
JNZ
JMP

PROC
NEAR
AX
AH, RTCDSP _CON
GELRTCREG
;
AL, DSP_CLCD+DSP ~LCD
AX
VIDEO_RETURN
$+5
VIDEO_RETURN

0930
0932
0935
0937

3C 00
75 5A

CMP
JNE

AL,O
DEFONT

SAVE LCD_REQUEST
GET DISPLAY CONFIGURATION
RESTORE LCD REQUEST
LCD IS NOT AVAILABLE - EXIT
I F NOT ZERO JUMP AROUND JUMP
ELSE TAKE A LONG JUMP
I F LOAD USER FONT REQUEST

LOAD_USERJONT
THIS ROUTINE ACCESSES THE LCD FONT STORAGE AND ALTERS
ONE OR MORE CHARACTERS, ALLOWING THE USER TO CAUSE DIFFERENT CHARACTERS TO BE DISPLAYED IN ALPHA/NUMERIC MODE
INPUT
ES:DI - POINT TO CHARACTER FONT IN USER TABLE WHERE
LOADING IS TO START FROM
CX - NUMBER OF CHARACTERS TO STORE (1-256) VALUE CHECKED
DL - CHAR OFFSET INTO RAM FONT AREA
BH - NUMBER OF BYTES PER CHARACTER (1-255) VALUE CHECKED
BL - 0 " LOAD MAIN FONT (BLOCK 0)
1 " LOAD ALTERNATE FONT (BLOCK 1)
2-255 " NO OPERATION
OUTPUT
THE USER SPECI FI ED FONT IS LOADED
ALTERED CHARACTERS WILL DISPLAY DIFFERENTLY IN A/N MODE
INTERRUPTS:
DISABLED DURING THE LOADING OF THE FONT
0939
093B

B4 20
E8 0000

MOV
CALL

AH, RTCDSP _CON
GELRTCREG

093E
0940
0943
0945

A8
B8
75
B8

TEST
MOV
JNZ
MOV

AL,DSP_CLCD
AX,CGA_RAM
LCDI
AX ,MONO_RAM

USE CGA REGEN ADDRESS
IS LCD CONFIGURED AS CGA ?
NO, USE MONO REGEN ADDRESS

0948
0948

8E CO

LCD 1 :
MOV

ES,AX

LCD REGEN ADDR IS FONT SEG "
DEST SEG FOR FONT MOVE

094A
094C
094E

OA FF
74 43
8A C7

OR
JZ
MOV

BH, BH
LCD3
AL,BH

IS # OF BYTES PER CHAR> 0
NO, IT IS 0 THEN END
BYTES PER CHARACTER TIMES

01
B800
03
BOOO

2-112 ROM BIOS

; GET DISPLAY CONFIGURATION

0950
0952

F6 E2
8B F8

0954
0957
0959
095C
095E
0962
0962
0963
0965
0968
096B

80
74
80
75
81

096C
096E
0970
0974

OB
74
81
77

C9
21
F9 0100
1B

0976
0978
097A
097C

8A
2A
F7
8B

C7
E4
El
C8

097E
097E
0980
0982
0984
0986
0988
098A
098C
098E
0990
0991
0991
0993
0993
0995

9C
FA
BO 00
E6 74
E4 75
OC 10
E6 75
F3/ A4
24 EF
E6 75
90

FB 00
09
FB 01
33
C7 1000

55
8B EC
8E 5E 10
8B 76 04
5D

EB 50
3C 01
75 1D

MUL
MOV

DL
DI,AX

CHARACTER OFFSET EQUALS
DESTINATION INDEX

BL,O
LCD2
BL,l
LCD3
DI,1000H

REQUEST TO LOAD MAIN FONT
YES, JUMP TO LOAD
REQUEST TO LOAD ALT FONT
NO, JUMP TO END
YES ADJ DEST. IX AL T FONT

BP
BP, SP
DS, [BP] . ES_POS
SI, [BP] • DLPOS
BP

RECOVER ES & DI VAL FROM STK
SOURCE SEGMENT FOR FONT MOVE
SET UP SOURCE IX FOR MOVE

OR
JZ
CMP
JA

CX, CX
LCD3
CX,256
LCD3

IS # OF CHARS TO STORE> 0
NO, IT IS 0 THEN EXIT
MAX CHARS ALLOWED IS 256
IF> 256 THEN EXIT

MOV
SUB
MUL
MOV

AL, BH
AH,AH
CX
CX,AX

NUMBER OF CHARS TO STORE
NUMBER OF BYTES TO STORE

CMP
JE
CMP
JNE
ADD
LCD2:
PUSH
MOV
MOV
MOV
POP

PUSHF
CLI
MOV
AL, LCDJUNCT
OUT
LCD_I NDX, AL
IN
AL,LCD_DATA
OR
AL, LCD_FONT
LCD_DATA,AL
OUT
REP
MOVSB
AND
AL,OFFH-LCD_FONT
LCD_DATA,AL
OUT
POPF
LCD3 :
JMP
SHORT LCDXIT
DE FONT :
CMP
AL,l
JNE
INTENS

BYTES PER CHARACTER TIMES

=

ACCESS LCD FN CONTROL REG
ACCESS DISPLAY FONT STORAGE
MOVE THE FONT
RETURN FROM FONT TO REGEN
END LOAD USER SPECI FI ED FONT
I F LOAD DEFAULT FONT REQUEST

--- -- ------ ----- ---- --- - -- -- - --------- ---- ------- ---------------

LOAD_DEFAUL LFONT
THIS ROUTINE CAUSES THE LCD FONT STORAGE TO BE REINITIALIZED WITH THE SYSTEM ROM DEFAULT FONT
INPUT
BL - o = LOAD MAIN FONT (BLOCK 0)
1 = LOAD ALTERNATE FONT (BLOCK 1)
2 - 255 = NO OPERATION
OUTPUT
DEFAULT CHARACTERS WILL BE DISPLAYED IN A/N MODE

----------------- --- - -- - -- - - - - - ---- ---- ---------- --------------0997
0998
0999
099C
099E
09A1
09A4
09A6
09A8
09AB
09AE
09BO
09B2
09B4
09B4
09B6

OE
07
B9
B7
B8
BF
B2
CD
B8
BF
B2
CD
EB

0080
08
1400
0000
00
10
1400
0000
80
10
2F

3C 02
75 2B

PUSH
POP
MOV
MOV
MOV
MOV
MOV
INT
MOV
MOV
MOV
INT
JMP
INTENS:
CMP
JNE

CS
; PREPARE TO ISSUE LOAD
ES
; USER FONT = DEFLT BIOS FONT
CX,128
; NO. OF CHARS TO WRITE = 128
BH,8
; 8 BYTES PER CHAR
AX,256*LCD_REQ+LOAD_USER ; SETUP LD USR FONT REQ
DI,OFFSET CHAR_GEN_LO ; LOAD LOWER 128 CHARS
; CHAR OFFSET IN FONT STORAGE
DL,O
VIDEO_FN
; IRPT TO VIDEO I/O TO LD FONT
AX,256*LCD_REQ+LOAD_USER ; SETUP LD USER FONT REQ
DI,OFFSET CHAR_GEN_HI ; LOAD UPPER 128 CHARACTERS
CHAR OFFSET IN FONT STORAGE
DL,128
VIDEO_FN
IRPT TO VIDEO I/O TO LD FONT
SHORT LCDX IT
AL ,2
LCDXIT

SET HIGH INTEN MAP REQUEST

ROM BIOS 2-113

SET_H I GH_I NTENSITY _MAPP ING
THIS ROUTINE MAPS THE LCD HIGH INTENSITY ATTRIBUTE.
THIS ROUTINE ACCESSES THE LCD INTENSIFY REGISTER AND
CAUSES CHARACTERS WITH THE INTENSI FI ED ATTRI BUTE TO
BE DISPLAYED 01 FFERENTL Y
INPUT
BL - INTENSIFY MAPPING INPUT REGISTER
o = IGNORE HIGH INTENSITY ATTRIBUTE
1 = MAP INTENSITY TO UNDERSCORE
2 = MAP INTENSITY TO REVERSE IMAGE
3 = MAP INTENSITY TO SELECT ALTERNATE FONT
4 - 255 = NO OPERATION
OUTPUT
INTENSIFIED CHARACTERS WILL DISPLAY DIFFERENTLY
INTERRUPTS:
DISABLED DURING PROCESSING
09B8
09B3
09BD
09CO
09C2
09C5
09C7
09C9
09CB
09CB
09CC
09CD
09CF
0900
0902
0905
0907
0909
09DC
09DE
09EO
09E1
09E2
09E3

80
73
BA
B4
E8
A8
74
B2
9C
FA
BO
EE
BO
F6
74
OC
F6
74
OC
42
EE
90

FB 04
26
03B4
20
0000
01
02
04

CMP
BL ,04H
JAE
LCDXIT
MOV
DX,3B4H
AH, RTCDSP _CON
MOV
CALL
GELRTCREG
TEST
AL,DSP_CLCD
JZ
LCD4
MOV
DL ,OD4H
LCD4 :
PUSHF
CLI
MOV
AL,14H
OUT
DX,AL
MOV
AL,77H
TEST
BL,02H
JZ
LCD5
OR
AL ,80H
LCD5:
TEST
BL,OIH
JZ
LCD6
OR
AL,8
LCD6 :
INC
DX
OUT
DX,AL
POPF

14
77
C3 02
02
80
C3 01
02
08

;
E9 016F R

09E6

LCDXIT: JMP

VIDEO_RETURN

LCD_REQUEST

ENDP

; ONLY OPERATION 0 - 3 ALLOWED
; ALL OTHERS EX IT

GET LCD CTRL PORT ADDRESSES
IF EMULATING MONO = 3B4
IF EMULATING COLOR = 304

REQUEST TO WRT TO REG 20
FOREGND RGB ON, BKGND RGB ON
SET UP H ORDER BIT OF INTEN
SET UP L ORDER BIT OF INTEN
WRT INTENSI FY DATA TO REG 20

PHYS_DSP._DESCR_REQ
THIS ROUTINE RETURNS THE ADDRESS OF A 7 WORD TABLE
CONTAINING THE PHYSICAL DISPLAY DESCRIPTION PARAMETERS OF
CURRENT DISPLAY. IT ALSO RETURNS THE MONITOR NUMBER OF
AL TERNATE OPERATIONAL DISPLAY.
THE TABLE CONTAINS THE FOLLOWING:
WORD
1
2
3
4
5
6

INFORMATION
MONITOR MODEL NUMBER (5140,5153,5151)
NUMBER OF VERTICAL PELS I METER
NUMBER OF HORIZONTAL PELS I METER
TOTAL NUMBER OF VERTICAL PELS
TOTAL NUMBER OF HORIZONTAL PELS
HORIZONTAL PEL SPACING IN MICROMETERS
(CENTER TO CENTER)
VERTICAL PEL SPACING IN MICROMETERS
(CENTER TO CENTER)

INPUT
NONE
OUTPUT
ES:DI
AX

09E6

2-114 ROM BIOS

POINTER TO DISPLAY DESCRIPTION TABLE
CONTAINS THE MONITOR NUMBER OF THE ALTERNATE
OPERATIONAL DISPLAY. IF THERE IS NO ALTERNATE
DISPLAY OR ITS INOPERABLE, AX = 0

09E6
09E8
09EB
09ED
09EE
09EF
09F5

B4
E8
8A
OE
07
81
75

FIGURED OUT WHAT DISPLAY IS CURRENTLY ACTIVE
MOV
AH, RTCDSP_CON
GET DISPLAY CONFIGURATION
CAll
GELRTCREG
SAVE DISPLAY CON FIG
MOV
Bl,Al
PUSH
CS
ES = CS
POP
ES
3E 0063 R 0304
CMP
ADD1L6845, 03D4H
IS CGA CURRENT MODE?
JNE
PHYS_MONO
NO, JUMP TO MONO TEST
14

20
0000
08

COLOR IS CURRENT MODE. SEE IF COLOR DISPLAY OR LCD CONFIG AS COLOR
IS THE CURRENT DISPLAY. SET ES:DI TO POINT TO TBl OF CRNT DSPlY.
ALSO TURN OFF CURRENT DISPLAY BIT IN THE DISPLAY CONFIG BYTE.
09F7
09F9
09FB
09FE
OAOI
OA03
OA03
OA06
OA09

A8
74
BF
80
EB

01
08
0000 E
E3 7E
lA

BF 0000 E
80 E3 FB
EB 12

TEST
JZ
MOV
AND
JMP
PHYS_CGAl:
MOV
AND
JMP

Al,DSP_ClCD
; IS LCD CONFIGURED AS CGA?
PHYS_CGAI
; NO, JUMP TO COLOR DISPLAY
DI,OFFSET lCD_CGILTBl ; SET ADDR TO LCD AS CGA TBl
Bl,NOT DSP_ClCD+DSP_lCD_PRES ; TURN OFF LCD BITS
YES, JUMP TO TEST AlT DSPlY
SHORT PHY~-.Al T
CURRENT DSPlY IS COLOR DSPlY
DI,OFFSET CGILTBl
SET ADDRESS TO CGA TABLE
Bl, NOT DSP_CGA
TURN OFF CURRENT DISPLAY BIT
SHORT PHYS-.Al T
YES, JUMP TO TEST ALT DSPl Y

MONO IS CURRENT MODE. SEE IF MONOCHROME DSPlY OR LCD CONFIG AS MONO
IS CURRENT DISPLAY. SET ES:DI TO POINT TO TABLE OF CURRENT DISPLAY.
ALSO TURN OFF CURRENT DISPLAY BIT IN THE DISPLAY CONFIG BYTE.
OAOB
OAOB
OAOD
OAOF
OAl2
OAl5
OAl7
OAl7
OAIA

OAID
OAlD
OAIF
OA21
OA24
OA26
OA2A
OA2C
OA2C
OA2E
OA31
OA34
OA36
OA38
OA3A
OA3E
OA40
0A40
OA43
0A45
0A47
0A49
OA4D
OA4F
OA4F
OA51
OA51
OA52
OA54
OA57
OA5A

A8
74
BF
80
EB

02
08
0000 E
E3 70
06

BF 0000 E
80 E3 F7

PHYS.Jo10NO:
TEST
Al,DSP.Jo1lCD
; IS LCD CONFIGURED AS MONO?
JZ
PHYS.Jo10NOl
; NO, JUMP TO COLOR DISPLAY
MOV
DI,OFFSET lCD.Jo10NO_TBl ; DEFAULT TO LCD MONO TABLE
AND
Bl,NOT DSP_MlCD+DSP_lCD_PRES ; TURN OFF LCD BITS
JMP
SHORT PHYS-.Al T
YES, JUMP TO TEST ALT DSPlY
PHYS_MONOl:
; CURRENT DSPl Y MONO MONITOR
MOV
DI,OFFSET MONO_TBl ; NO, CURRENT DSPlY MONO MNTR
AND
Bl,NOT DSP.Jo10NO
; TURN OFF CURRENT DISPLAY BIT

TEST FOR THE ALTERNATE DISPLAY AND SET AX TO THE MONITOR NUMBER OF
Al TERNATE DISPLAY. Bl SHOULD CONTAIN THE ALTERNATE DISPLAY CONFIG.
IF THERE IS NO ALTERNATE DISPLAY OR THE ALTERNATE IS INOPERATIVE
THE MONITOR NUMBER IS O.
PHYS-.Al T:
; TEST FOR ALTERNATE DISPLAY
84 DB
TEST
Bl, Bl
; ANY ALTERNATE DSPS PRESENT?
74 2E
JZ
PHYS-.Al LNONE
; NO, JUMP TO SET MNTR # TO 0
F6 C3 03
TEST
Bl,DSP_ClCD+DSP.Jo1lCD ; IS AlT MONITOR THE LCD
74 06
JZ
PHYS-.Al Tl
NO, JUMP TO CHECK OTHER DSPlY
2E: Al 0000
MOV
AX ,lCDJGILTBl [OJ
YES, SET LCD MONITOR #
EB 25
JMP
SHORT PHYS_END
JUMP TO EXIT
PHYS-.Al Tl:
TEST FOR THE COLOR DISPLAY
B4 22
AH, RTCDSP _STAT
MOV
GET THE DISPLAY STATUS
E8 0000 E
CAll
GELRTCREG
F6 C3 04
Bl ,DSP_CGA
TEST
IS ALT DSP COLOR MONITOR?
74 OA
JZ
JUMP TO TEST MONO MON ITOR
PHYS-.Al T2
A8 02
Al, CGA_BAD
TEST
IS THE CGA BAD?
75 15
JNZ
PHYS-.Al LNONE
YES, SET FOR NO ALTERNATE
2E: Al 0000
MOV
AX , CGA_TBl [0]
NO, SET CGA MONITOR #
SHORT PHYS_END
EB 11
JMP
JUMP TO EXIT
PHYS-.Al T2:
TEST FOR MONOCHROME MON ITOR
F6 C3 08
Bl, DSP_MONO
IS AlT DSPAY MONO MONITOR?
TEST
74 OA
PHYS-.Al T_NONE
JUMP NO Al T DISPLAY
JZ
A8 04
TEST
Al, MONO_BAD
IS THE MONOCHROME BAD?
75 06
PHYS-.Al T_NONE
YES, SET FOR NO ALTERNATE
JNZ
2E: Al 0000
MOV
AX ,MONO_TBl [0]
NO, SET MONOCHROME MONITOR #
SHORT PHYS_END
EB 02
JMP
JUMP TO EXIT
PHYS-.Al T_NONE:
Al T NOT THERE OR INOPERATIVE
2B CO
SET MON ITOR # TO 0
SUB
AX,AX
PHYS_END:
55
PUSH
BP
8B EC
MOV
BP ,SP
GET PTR TO STACK SAVE AREA
8C 46 10
MOV
[BP] • ES_POS, ES
SET UP RETURN VAL IN STACK
89 7E 04
MOV
[BP] .DLPOS,DI
5D
POP
BP

ROM BIOS 2-115

OA5B
OA5E

E9 016F R

JMP
VIDEO_RETURN
PHYS_DSP _DESCR_REQ ENDP

Print Screen Interrupt Hex 05
(PRT_SCRN)
SUBTTL

PRINT SCREEN BIOS

INT 05H HANDLER

; *********************************************************************
ROUTINE-NAME:
FUNCTION:

PRLSCRN

THIS ROUTINE PRINTS THE SCREEN

ENTRY CONDITIONS:
PURPOSE OF ENTRY: PRINT SCREEN
INPUT CONDITIONS: NONE
RESTRICTIONS: ONLY ONE PRINT SCREEN REQUEST AT A TIME
EXIT CONDITIONS:
NORMAL EXIT CONDITIONS:
STATUS_BYTE (50:0) " 0
THE SCREEN IS PRINTED OR IF CTRc BREAK IS
PRESSED THE PRINT IS TERMINATED.
ERROR EXIT CONDITIONS:
STATUS_BYTE (50:0) "OFFH (PRINTER ERROR)
THE PRINT IS TERMINATED.
STATUS_BYTE (50:0) "01 (PRINT SCREEN IN PROG.)
PRINT SCREEN IS ALREADY IN PROGRESS AND ANOTHER
PRINT SCREEN IS REQUESTED THE LATEST PRINT
SCREEN REQUEST IS IGNORED.
REGISTERS MODIFIED: ALL SAVED
RETURN TYPE: IRET (ALL FLAGS RESTORED)
INTERRUPTS: ENABL ED OUR I NG PROCESSI NG
INTERNALLY REFERENCED ROUTINES: CRLF
EXTERNALLY REFERENCED ROUTINES: INT 10H (VIDEOJN)
INT 17H (PRINTER_FN)

; ******************************************************************************
I NT 5H - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -- - - - - - - - - - - - - - - -- - - -- - - - -THIS LOGIC WILL BE INVOKED BY INTERRUPT 05H TO PRINT THE
SCREEN. CURSOR POSITION AT THE TIME THIS ROUTINE IS INVOKED
WILL BE SAVED AND RESTORED UPON COMPLETION. THE ROUTINE IS
INTENDED TO RUN WITH INTERRUPTS ENABLED. I F A SUBSEQUENT
'PRINT SCREEN' KEY IS DEPRESSED DURING THE TIME THIS ROUTINE
IS PRINTING IT WILL BE IGNORED.
IF THE CONTROL BREAK KEYS ARE PRESSED DURING THE PRINTING, THE
PRINT SCREEN REQUEST IS TERMINATED.
ERRORS ENCOUNTERED DURING PRINT (RETURN BY INT 17H) CAN BE
OUT OF PAPER, I/O ERROR AND TIME OUT.
STATUS BYTE IS UPDATED ON EACH CALL TO PRINT SCREEN.
ADDRESS 50:0 CONTAINS THE STATUS OF THE PRINT SCREEN:
50: 0

EITHER PRINT SCREEN HAS NOT BEEN CALLED
OR UPON RETURN FROM A CALL THIS INDICATES
A SUCCESSFUL OPERATION.
PRINT SCREEN IS IN PROGRESS
ERROR ENCOUNTERED DURING PRINTING

"0
"1
"255

ASSUME
OA5E
OA5E
OA5F

FB
06

PRLSCRN
STI
PUSH

2-116 ROM BIOS

CS: ROMCODE, OS: DATA, ES: XXDATA
PROC
ES

FAR
MUST RUN WITH INTERRUPTS ENABLED
MUST USE 50:0 FOR DATA AREA

OA60
OA61
OA62
OA63
OA64
OA65
OA68
OA6A

IE
50
53
51
52
B8 ---8E CO
26: 80 3E 0000 R 01

OA70
OA72
OA75
OA7B
OA7E
OA80

75 03
E9 OB07 R
26: C6 06 0000 R 01
B8 ---- R
8E 08
83 3E 0008 R 00

OA85
OA87
OA8A
OA8C

75
EB
B4
CD

03
6F 90
OF
10

;-

PUSH
PUSH
PUSH
PUSH
PUSH
MOV
MOV
CMP
JFZ
JNZ
JMP
MOV
MOV
MOV
CMP
JFZ
JNZ
JMP
MOV
INT

MUST USE 40:0 FOR DATA AREA
OS
AX
BX
FOR CURSOR LIMITS
CX
CURRENT CURSOR POSITION
OX
AX,XXDATA
HEX 50
ES,AX
STATUS_BYTE,PRTSLJlCTIVE; PRINT IN PROGRESS?
; YES, JUMP TO END
EXIT
; I F NOT ZERO JUMP AROUND JUMP
$+5
; ELSE TAKE A LONG JUMP
EXIT
STATUS_BYTE,PRTSLJlCTIVE; SHOW PRNT IN PROGRESS
HEX 40
AX,DATA
DS,AX
IS PRINTER ATTACHED?
PRI NTER_BASE [OJ, 0
NO, ERROR EX IT
ERR20
I F NOT ZERO JUMP AROUND JUMP
$+5
ELSE TAKE A LONG JUMP
ERR20
AH ,GELVIDEO_STATE
REQUEST CURRENT SCREEN MODE
[ALJ = MODE,
VIDEO_FN
ON RETURN
[AHJ=NUMBER COLUMNS/LINE,

------- ----- -- - - - - - - -- - - - - - -- - - - - - -- -- - - - - - - - - - - - -- - - - - -- - - -- --

AT THIS POINT WE KNOW THE COLUMNS/LINE ARE IN
[AXJ AND THE PAGE IF APPLICABLE IS IN -BH-. THE STACK
HAS DS,AX,BX,CX,DX PUSHED. -AL- HAS VIDEO MODE
OA8E
OA90
OA92
OA95

8A
B5
E8
F6

OA98
OA9A
OA9B
OA9D
OA9F
OAAO
OAAI

CC
19
OBOE R
C4 29

MOV
MOV
CALL
TEST

CL,AH
CH,25
CRLF
AH,29H

75 5E
51
B4 03
CD 10

JNZ
PUSH
MOV
INT

ERR20
CX
AH,GELCURSOR_INFO
VIDEO_FN

59
52
33 02

POP
PUSH
XOR

CX
OX
DX,DX

USE OF -CX- REGISTER TO
CONTROL ROW & COLUMNS
CR LF ROUTINE
TEST FOR PRINTER ERRORS
OUT OF PAPER, I/O & TIME OUT
JUMP I F ERROR DETECTED
SAVE SCREEN BOUNDS
WILL NOW READ THE CURSOR.
ON RETURN: CX=CRNT CRSR MODE,
OX = ROW, COL OF CRNT CURSOR
RECALL SCREEN BOUNDS
SAVE CURRENT CURSOR POSITION
WILL SET CURSOR POS TO -0,0-

THE LOOP FROM PRII0 TO THE INSTRUCTION PRIOR TO PRI20
IS THE LOOP TO READ EACH CURSOR POSITION FROM THE
SCREEN AND PRINT.
OAA3
OAA3
OAA8
OAAA
OAAF
OABI
OABI
OAB3
OAB5
OAB7
OAB9
OABB
OABD
OABF
OABF
OACO
OAC2
OAC4
OAC6
OAC7
OACA
OACC
OACE
OADO
OAD2
OAD4
OAD6
OAD7

F6
74
80
EB

06 0071 R 80
07
26 0071 R 7F
35

B4
CD
B4
CD
OA
75
BO

02
10
08
10
CO
02
20

52
33
32
CD
5A
F6
75
FE
3A
75
32
8A
52
E8

02
E4
17
C4 29
27
C2
CA
01
02
E2
OBOE R

PRIlO:
TEST
JZ
AND
JMP
PRI 12:
MOV
INT
MOV
INT
OR
JNZ
MOV
PRIl5 :
PUSH
XOR
XOR
INT
POP
TEST
JNZ
INC
CMP
JNE
XOR
MOV
PUSH
CALL

BIOS_BREAK, BREAK-HIT ; HAS BREAK KEY BEEN PRESSED?
; NO KEY, JUMP AROUND
PRIl2
BIOS_BREAK,NOT BREAK-HIT; YES, TURN 8REAK KEY OFF
; JUMP TO END
SHORT PRI20
AH, SELCURSOR_POS
VIDEOJN
AH, READ--.ATLCHAR
VIDEO_FN
AL,AL
PRIl5
AL,' ,

TO SHOW CURSOR SET REQUEST
NEW CURSOR POSITION
TO INDICATE READ CHARACTER
CHARACTER NOW IN [ALJ
SEE IF VALID CHAR
JUMP IF VALID CHAR
MAKE A BLANK

OX
DX,DX
AH,AH
PRINTERJN
OX
AH, 29H

SAVE CURSOR POSITION
INDICATE PRINTER 1
TO SHOW PRINT CHAR IN -ALPRINT THE CHARACTER
RECALL CURSOR POSITION
TEST FOR PRINTER ERRORS
OUT OT PAPER, I/O & TIME OUT
JUMP I F ERROR DETECTED
ADVANCE TO NEXT COLUMN
SEE IF AT END OF LINE
I F NOT PROCEED
BACK TO COLUMN 0
[AHJ =0
SAVE NEW CURSOR POSITION
LINE FEED CARRIAGE RETURN

ERRI0
DL
CL,DL
PRII0
DL,DL
AH,DL
OX
CRLF

ROM BIOS 2-117

OADA
OADB

5A
F6 C4 29

OADE
OAEO
OAE2
OAE4
OAE6
OAE6
OAE7
OAE9
OAES
00
OAF1
OAF3
OAF3
OAF4
OAF6
OAF8
OAF8
OAFB
OAFE
OB01
FF
OB07
OB07
OB08
OB09
OBOA
OBOB
OBOC
OBOD
OBOE

75
FE
3A
75

13
C6
EE
BD

5A
B4 02
CD 10
26: C6 06 0000
EB 14
5A
B4 02
CD 10
BB 0053
B9 0081
E8 0000 E
26: C6 06 0000

POP
TEST
JNZ
INC
CMP
JNE
PR120:
POP
MOV
INT
MOV
JMP
ERR10 :
POP
MOV
INT
ERR20 :
MOV
MOV
CALL
MOV
EXIT:
POP
POP
POP
POP
POP
POP
IRET
PRLSCRN

5A
59
5B
58
IF
07
CF

DX
AH,29H
ERR10
DH
CH,DH
PRI10

RECALL CURSOR POSITION
TEST FOR PRI NTER ERRORS
OUT OF PAPER, I/O & TIME OUT
JUMP I F ERROR DETECTED
ADVANCE TO NEXT LINE
FINISHED?
I F NOT CONTINUE

DX
AH, SELCURSOR_POS
VIDEO_FN
STATUS_BYTE,O

RECALL CURSOR POSITION
TO SHOW CURSOR SET REQUEST
CURSOR POSITION RESTORED
INDICATE
FINISHED

SHORT EXIT

EXIT THE ROUTINE

DX
AH, SELCURSOR_POS
VIDEO-FN

GET CURSOR POSITION
TO REQUEST CURSOR SET
CURSOR POSITION RESTORED

BX,083
NO. CYCLES FOR 83MSEC TONE
CX,081H
1/2 CYCLE FOR 1KHZ TONE
KB_NOISE
; SOUND BEEP FOR ERROR
STATUS_BYTE,PRTSCERROR ; INDICATE
ERROR
DX
CX
BX
AX
DS
ES

; RESTORE ALL REGISTERS USED

ENDP

CARRIAGE RETURN, LINE FEED SUBROUTINE
OBOE
OBOE
OBlO

33 D2
32 E4

OB12
OB14
OB16

BO OA
CD 17
F6 C4 29

OB19
OB1B
OBlO
OB1F
OB21
OB22
OB22

75
32
BO
CD
C3

06
E4
OD
17

CRLF
XOR
XOR
MOV
INT
TEST

PROC
NEAR
DX,DX
AH,AH
AL,12Q
PRINTEfLFN
AH,29H

JNZ
CRLFl
XOR
AH,AH
MOV
AL,15Q
INT
PRINTER-FN
CRLFl : RET
CRLF
ENDP
ROMCODE ENDS
END

2-118 ROM BIOS

PRINTER 0
WILL NOW SEND INITIAL LF ,CR
TO PRINTER
LF
SEND THE LINE FEED
TEST FOR PRINTER ERRORS
OUT OF PAPER, I/O & TIME OUT
EX IT I F ERROR
NOW FOR TH E CR
CR
SEND THE CARRIAGE RETURN

Diskette Support (B13DSKT)
**********************************************************************
PUBLICS

**********************************************************************
PUBLIC
PUBLIC
PUBLIC
PUBLIC
PUBLIC
PUBLIC
PUBLIC
PUBLIC
PUBLIC
EXTERNAL

DSKLIO
SEEK
DSKLINTE
SYS_BOOT
DISK-RESET
NECOUTPUT
RESUL TS
SEEK
GELPARM
REFERENCES

**********************************************************************
EXTRN
EXTRN
EXTRN
EXTRN
EXTRN
EXTRN
EXTRN
EXTRN
EXTRN
EXTRN
EXTRN
EXTRN
EXTRN
EXTRN
EXTRN
EXTRN

0000

DDS: NEAR
DSKLBASE: BYTE
GELRTCREG: NEAR
PULRTCREG: NEAR
PARMS_TPI48: BYTE
PARMS_TP 1135: BYTE
DSP_FSETM: NEAR
DSP _I NIT: NEAR
ICON_PR:NEAR
EXLEVENT: NEAR
FLI CON: BYTE
SYS_DSKLI CON: BYTE
DSKT_I CON: BYTE
BAD_DSKLI CON: BYTE
RES_ERR-CHK: NEAR
POSLLOOP: NEAR

ROMCODE SEGMENT BYTE PUBLIC

ROM BIOS 2-119

**********************************************************************
MODULE-NAME :

B13DSKT

DATE LAST MODI FI ED:

09/12/85

DESCRIPTIVE-NAME: BIOS DISKETTE SERVICE ROUTINES
COPYRIGHT: 7396-917 (C) COPYRIGHT IBM CORP. 1985
REFER TO COPYRIGHT INSTRUCTIONS FORM NUMBER G120-2083
CHANGE LEVEL: 0.0
FUNCTION:

THIS MODULE PROVIDES INPUT/ OUTPUT SERVICE FUNCTIONS TO THE
FLOPPY DISKETTE CONTROLLER / DISKETTE DRIVES AND ASSOCIATE
HARDWARE.

MODULE SIZE: 1761 BYTES
INPUT PARAMETERS: SEE LIST PROVIDED FOR EACH FUNCTION CALL BELOW
OUTPUT PARAMETERS: SEE LIST PROVIDED FOR EACH FUNCTION CALL BELOW
ROUTINES IN MODULE:

DSKLIO - COMMON ENTRY FOR ALL OTHER ROUTINES
FOR DISKETTE SERVICES
SYS_BOOT - ENTRY FOR LOADING
THE DISKETTE BOOT PROGRAM

INTERNAL DATA AREAS / TABLES: BIOS DATA AREA AT SEGMENT 40H
EXTERNALL Y REFERENCED ROUTINES: REFER TO EXTRN LIST
EXTERNALL Y REFERENCED DATA AREAS:

REFER TO EXTRN LIST

CHANGE ACTI VITY:

**********************************************************************

Diskette I/O Interrupt Hex 13
(DSKT_IO)
- - I NT 13H - - - - - - - - - - - - -- - - - - - - - - - - - - - - - - - - -- - - - - - - - - - - - - - - - - - - - -- - - -- -DISKETTE I/O - DSKLIO
INPUT:
(AH)"O

RESET DISKETTE SYSTEM
HARD RESET TO NEC, PREPARE COMMAND, SET RECAL REQUIRED
ON ALL DRIVES

(AH)"1

READ THE STATUS OF THE SYSTEM INTO (AL)
DISKETTE_STATUS FROM LAST OPERATION IS USED

(AH)=2

READ THE DESIRED SECTORS INTO MEMORY

(AH)=3

WRITE THE DESIRED SECTORS FROM MEMORY

(AH)"4

VERIFY THE DESIRED SECTORS

2-120 ROM BIOS

(AH)=5

FORMAT THE DESIRED TRACK
FOR THE FORMAT OPERATION, BUFFER POINTER (ES,BX)
MUST POINT TO COLLECTION OF DESIRED AD DR FIELDS
FOR THE TRACK. EACH FIELD IS COMPOSED OF 4 BYTES,
(C,H,R,N), WHERE C = TRACK NUMBER, H=HEAD NUMBER,
R = SECTOR NUMBER, N= NUMBER OF BYTES PER SECTOR
(00=128, 01=256, 02=512, 03=1024). THERE MUST BE ONE
ENTRY FOR EVERY SECTOR ON THE TRACK. THIS INFORMATION
IS USED TO FIND THE REQUESTED SECTOR DURING READ/WRITE
ACCESS.

REGISTERS FOR READ/WRITE/VERIFY /FORMAT
INPUT:
(DL) - DRIVE NUMBER (0-3 ALLOWED, VALUE CHECKED)
(DH) - HEAD NUMBER (0-1 ALLOWED, NOT VALUE CHECKED)
(CH) - TRACK NUMBER (0-4F, NOT VALUE CHECKED)
(CL) - SECTOR NO. (NOT VALUE CHKD, NOT USED FOR FORMAT)
(AL) - NO. OF SECTORS ( NOT VALUE CHKD, NOT USED FOR FMT)
(ES:BX) - ADDRESS OF BUFFER ( NOT REQUIRED FOR VERIFY

TI

DATA VARIABLE -- DISK-POINTER
DOUBLE WORD POINTER TO CURRENT SET OF DSKT PARAMETERS
OUTPUT:
AH = STATUS OF OPERATION
GOOD RETURN
OOH
TIME_OUT
80H
BAD_SEEK
40H
BAD_NEe
20H
BAD_CRC
10H
DMA_BOUNDARY
09H
BAD_DMA
08H
MEDIA-CHANGE
06H
RECORD_NOLFND 04H
WRITE_PROTECT 03H
BAD~DDR_MARK
02H
BAD_CMD
01H

NO ERROR DETECTED
ATTACHMENT FAILED TO RESPOND
SEEK OPERATION FAILED
NEC CONTROLLER HAS FAILED
BAD CRC ON DISKETTE READ
ATMPT TO DMA CROSS 64K BNDRY
DMA OVERRUN ON OPERATION
MEDIA HAS BEEN CHANGED
REQUESTED SECTOR NOT FOUND
WRT ATMPTD ON WRT PROT DISK
ADDRESS MARK NOT FOUND
BAD CMD PASSED TO DSKT I/O

AL = NUMBER OF SECTORS ACTUALLY TRANSFERRED
OS, BX,DX,CX PRESERVED
CY = 0
CY = 1

SUCCESSFUL OPERATION (AH=O ON RETURN)
FAILED OPERATION (AH HAS ERROR CODE)

************

ERROR RETRY PROCEDURE

*************

NOTE:
I F AN ERROR IS REPORTED BY THE DISKETTE CODE, THE
APPROPRIATE ACTION IS TO RESET THE DISKETTE, THEN RETRY
THE OPERATION. MEDIA CHANGE ERRORS NEED NOT BE RETRIED.

ROM BIOS 2-121

(AH)'8 READ DRIVE PARAMETERS
DL • DRIVE NUMBER (0-3)
OUTPUT PARAMETERS:
IF DRIVE INSTALLED:
ES:DI • POINTER TO DR1VE PARAMETERS TABLE
CH • MAXIMUM TRACK NUMBER / SIDE (LOWER 8 BITS)
CL (BITS 7-6) • TWO MOST SIGNIFICANT BITS OF
10 BIT TRACK NUMBER
CL (bits 5-0) • MAXIMUM 512 BYTE SECTOR NUMBER
(6 BITS) PER TRACK
DH • MAXIMUM HEAD NUMBER
DL • NUMBER OF DISKETTE DRIVES INSTALLED ON
SYSTEM (1 - 2)
AX • 0
BH • 0
BL • DRIVE TYPE (1 - 360K 40 TRACK DRIVE)
(2 - 1.2 Meg 80 TRACK DRIVE)
(3 - 720K 80 TRACK DRIVE)
DISKETTE_STATUS IS CLEARED, CARRY FLAG IS RESET.
IF DRIVE NOT INSTALLED:
ES ,AX, BX, CX, DH, 01 • 0
DL • NUMBER OF DISKETTE DRIVES INSTALLED
DISKETTE_STATUS' 0
CARRY FLAG IS RESET.
(AH) • 15H CHECK FOR CHANGE LINE SUPPORT (READ DASD)
DL • DRIVE NUMBER (0-3)
OUTPUT PARAMETERS:
AH • 00 - NO DRIVE PRESENT
01 - DSKT DRV WITH NO CHANGE LINE SUPPORT INSTALLED
02 - DSKT DRV WITH CHANGE LINE SUPPORT INSTALLED
03 - FIXED DISK
DISKETTE_STATUS' 0, CARRY FLAG CLEAR
(AH)'16H READ DISKETTE CHANGE LINE STATUS
DL • DRIVE NUMBER (0-3)
OUTPUT PARAMETERS:
IF DRIVE INSTALLED:
• OOH06H-

DISK CHANGE LINE NOT ACTIVE
CARRY FLAG IS CLEARED
DISK CHANGE LINE ACTIVE
CARRY FLAG IS SET
DISKETTE HEAD STEPPED TO
TRACK 1 THEN 0 TO RESET CHANGE LINE
80H- DISK CHANGE LINE ACTIVE AND
CANNOT BE RESET
(NO DISKETTE IN DRIVE)
- CARRY FLAG IS SET

IF DRIVE NOT INSTALLED:
DISKETTE_STATUS' TIMEOUT
(80H)
CARRY FLAG IS CLEARED
IF DRIVE DOES NOT SUPPORT CHANGE LINE:
DISKETTLSTATUS • MEDIA CHANGE (06)
CARRY FLAG IS CLEARED
(AH)'17H
SET DASD TYPE FOR FORMAT
DL • DRIVE NUMBER (0-3)
AL • FORMAT TYPE
00 • NOT USED
01 • DISKETTE 320/360K IN 360K DRIVE
02 • DISKETTE 360K IN 1. 2MEG DRIVE
03 • DISKETTE 1.2MEG IN 1.2MEG DRIVE
04 • DISKETTE 720K IN 720K DRIVE
OUTPUT PARAMETERS:
AH'DISKETTE_STATUS' 0
NO FUNCTION PERFORMED

2-122 ROM BIOS

CARRY FLAG CLEAR

(AH) = ALL OTHER VALUES
OUTPUT:
AH=DISKETTLSTATUS = 01 (BAD COMMAND) CARRY FLAG SET
ASSUME

CS: ROMCODE, OS: DATA

STRUCTURE DEFINING SAVE AREA ON STACK
REGSAVE
OX SAVE
BPSAVE
DISAVE
SISAVE
DSSAVE
CXSAVE
BXSAVE
AXSAVE
REGSAVE

0000
0002
0004
0006
0008
OOOA
OOOC
OOOE
0010
0000
0001
0002

STRUC
OW
OW
OW
OW
OW
OW
OW
OW
ENDS

REGHSAV STRUC
DLSAVE DB
DHSAVE DB
DB

??
??
08 -

OX
BP
01
SI
OS
CX
BX
AX

?
8 DUP(?)

SAVE
SAVE
SAVE
SAVE
SAVE
SAVE
SAVE
SAVE

AREA
AREA
AREA
AREA
AREA
AREA
AREA
AREA

ON
ON
ON
ON
ON
ON
ON
ON

STACK
STACK
STACK
STACK
STACK
STACK
STACK
STACK

DL SAVE AREA ON STACK
DH SAVE AREA ON STACK

??
243
OOOA
OOOB
OOOC
0000
OOOE
OOOF
0010

??
??
??
??
??
??

CLSAVE
CHSAVE
BLSAVE
BHSAVE
ALSAVE
AHSAVE
REGHSAV

0000
0000
0002
0004
0006
0008
OOOA
OOOC
OOOE
0010

0082
00F6
OOFD
0139
010F
0122
007C
007C
0494

0012
0014
0016

04E3 R
050B R
0580 R

0018
0018

FB

0019
001A
001B
001C
0010
001E
001F
0020
0021
0023
0026
0028

50
53
51
1E
56
57
55
52
8B
E8
2A
8A

002A
0020
002F
0032
0034
0037

80
76
80
72
80
72

R
R
R
R
R
R
R
R
R

DB
DB
DB
DB
DB
DB
ENDS

DSKLTABLE
OW
OW
OW
OW
OW
OW
OW
OW
OW
OW
OW
OW

CL
CH
BL
BH
AL
AH

LABEL
WORD
OFFSET DISICRESET
OFFSET DISICSTATUS
OFFSET DISICREAD
OFFSET DISICWRITE
OFFSET DISICVERF
OFFSET DISICFORMAT
OFFSET DSKLINLCMD
OFFSET DSKLINLCMD
OFFSET DSKLRDPARM
OFFSET DSKLRDDASD
OFFSET DSKLCHANGE
OFFSET DSKLSETDASD

DSKLIO PROC
STI

SAVE
SAVE
SAVE
SAVE
SAVE
SAVE

AREA
AREA
AREA
AREA
AREA
AREA

AH=O
AH=l
AH=2
AH=3
AH=4
AH=5
AH=6
AH=7
AH=8
AH=9 THRU
AH=15
AH=16
AH=17

ON
ON
ON
ON
ON
ON

STACK
STACK
STACK
STACK
STACK
STACK

DISK RESET COMMAND -DISK STATUS COMMAND -DISK READ COMMAND
DISK WRITE COMMAND -DISK VERIFY COMMAND -DISK FORMAT COMMAND -INVALID COMMAND -INVALID COMMAND -READ DISKETTE DRIVE PARMS -12 AND <17 ARE ALSO INVALID
DETERMINE SUPPORT OF DCL -DISKETTE CHANGE LINE STAT -DISKETTE SET OASD TYPE

FAR
I NTERRUPTS BACK ON

AX
BX
CX
OS
SI
01
BP
OX
BP,SP
DDS
BH, BH
BL,AH

TEMPORARY SAVE AREA
SAVE ADDRESS

EC
0000
FF
DC

PUSH
PUSH
PUSH
PUSH
PUSH
PUSH
PUSH
PUSH
MOV
CALL
SUB
MOV

FC 08
15
FC 15
05
FC 18
08

CMP
JBE
CMP
JB
CMP
JB

AH,8
010_1
AH,15H
DIO_INLCMD
AH,18H
010_0

CHECK FUNCTION RANGE
JUMP I F OKAY
CHECK FUNCTION RANGE
JUMP I F ERROR
JUMP I F BELOW LIMIT
JUMP IF OKAY AND IN 15-17 RANGE

SAVE SEGMENT REGISTER VALUE
SAVE ALL REGISTERS DURING OPERATION

SET UP POINTER TO HEAD PARM
SET FUNCTION CODE IN LOW BYTE

FUNCTION CODE OUT OF RANGE

ROM BIOS 2-123

0039
0039
003E
0041
0041
0044
0044
0047

DIO_INLCMD:
MOV
DISKETTE_STATUS,BAD_CMD ; INDICATE INVALID COMMAND
JMP
DIO_2
GET STATUS AND EXIT

C6 06 0041 R 01
EB 26 90

DIO_O:
SUB
DIO_l :
CMP
JBE

80 EB OC
80 FC 01
76 05

BL,12

CORRECT FUNCTION CODE FOR 15,16
RESET COMMAND OR STATUS COMMAND?
JUMP AROUND DRIVE RANGE CHECK IF SO

RANGE CHECK DRIVE NUMBER
0049
004C

80 FA 03
EB

004E
004E
0050
0055

Dl E3
80 26 003F R 7F
2E: FF 97 0000 R

005A
005B
005E
0061
0065

91
BB 0004
E8 0259 R
88 26 0040
91

0066
0066
006A
006D
0070
0071
0071
0072
0073
0074
0075
0076

oon

0078
0079
007C

CMP
JA

n

DIO_11:
SHL
AND
CALL
XCHG
MOV
CALL
MOV
XCHG

DL ,3
DIO_INLCMD

BX,l
; DOUBLE LINK TABLE OFFSET
MOTOR_STATUS, NOT WRITE_OP ; RESET WRITE OPERATION FLAG
DSKLTABLE[8X]
CALL PROPER ROUTINE
CX,AX
BX,4
GELPARM
MOTOR_COUNT, AH
AX,CX

DIO_2 :
MOV
AH, DI SKETTE_STATUS
MOV
AHSAVE [BP] ,AH
CMP
AH,l
CMC
DIO_3:
POP
DX
POP
BP
POP
DI
POP
SI
POP
DS
POP
CX
POP
BX
POP
AX
RET
2
DSKLIO ENDP

8A 26 0041
88 66 OF
80 FC 01
F5
5A
5D
5F
5E
IF
59
5B
58
CA 0002

JUMP IF INVALID

SAVE AX
GET THE MOTOR WAIT PARAMETER
SET THE TIMER COUNT FOR TH E MOTOR
RESTORE AL
GET STATUS OF OPERATION
SAVE RETURN CODE ON STACK
SET THE CARRY FLAG FOR FAILURE
RESTORE ALL REGISTERS

RECOVER ADDRESS
RESTORE AX REGISTER
THROW AWAY SAVED 'flAGS

******************************
INVALID COMMAND RECEIVED

007C
007C
0081
0082

******************************
C6 06 0041 R 01
C3

DSKLINLCMD PROC NEAR
MOV
DISKETTCSTATUS, BAD_CMD
RET
DSKLI NLCMD ENDP

SV STAT & ST CRY FOR ERR

. ***********************************************************

~-----

0082
0082
0085
0086
008B
008E
0090
0092
0094
0096
0098
009A
009C
009E
OOAO
OOAO
00A2
00A2

RESET THE DISKETTE SYSTEM

; ***********************************************************
BA
FA
C6
AO
Bl
D2
A8
75
A8
75
A8
74
FE

03 F2
06 0040 R FF
003F R
04
EO
20
OC
40
06
80
06
CO

FE CO
FE CO

DISK_RESET
MOV
CLI
MOV
MOV
MOV
SAL
TEST
JNZ
TEST
JNZ
TEST
JZ
INC
J4:
INC
J5:
INC

2-124 ROM BIOS

NEAR
PROC
DX, DRIVE_CNTL

MOTOR_COUNT ,OFFH
AL,MOTOILSTATUS
CL,4
AL, CL
AL, 20H
J5
AL, 40H
J4
AL, 80H
J6
AL
AL
AL

ADAPTER CONTROL PORT
NO INTERRUPTS
SET LONG MOTOR ON TIME
WHICH MOTOR IS ON
SHI FT COUNT
MOVE MOTOR VALUE TO HIGH NYBBLE
SELECT CORRESPONDING DRIVE
JUMP I F MOTOR ONE IS ON
JUMP I F MOTOR TWO IS ON
JUMP I F MOTOR ZERO IS ON

00A4
00A4
00A6

DC 08
EE

J6:

00A7

C6 06 003E R 00

OOAC
OOBI
00B3
00B4
00B7
00B9
OOBC
OOBD

C6
DC
EE
E8
72
B8
50
B9

06 0041 R 00
04

oDeD
OOCO
00C2
00C5
00C8
OOCB
OOCD
OOCF
0001
0003

B4
E8
E8
AO
24
3C
El
DB
74

08
022C R
03B3 R
0042 R
F8
CO
EF
C9
08

STALLOOP:
MOV
CALL
CALL
MOV
AND
CMP
LOOPZ
OR
JZ

0005
0006
OODB

58
80 OE 0041 R 20
EB 18

OR
OUT

0373
3C
00F5 R
0004

AL, FDCDMA.-ENAB
DX,AL

TURN ON INTERRUPT ENABLE
RESET THE ADAPTER

MOV

SEEICSTATUS,O

SET RECAL REQUIRED ON ALL DRIVES

MOV
OR
OUT
CALL
JC
MOV
PUSH
MOV

DISKETTE_STATUS,O
AL, FDCRUN
DX,AL
WAILINT
J8
AX,OFFSET J8
AX
CX,4

SET OK STATUS FOR DISKETTE
TURN OFF RESET
TURN OFF THE RESET
WAIT FOR INTERRUPT
IF NO INTERRUPT THEN EXIT
SET ERROR RETURN ADDRESS FOR NECOUT

AH, READ_INLSTATUS
NECOUTPUT
RESULTS
AL, NECSTATUS
AL,OF8H
AL ,OCOH
STALLOOP
cX,ex
J7

SENSE INTERRUPT STATUS
COMMAND TO NEC
GET THE RESULTS
IGNORE ERROR RETURN AND DO OWN TEST
IGNORE DRIVE SPECIFIER
TEST FOR DRIVE READY TRANSITION
IF OKAY GET NEXT DRIVE READY INFO
ALL BYTES PICKED UP?
I F SO THEN OKAY

READ RESET STATUS FOR ALL 4 DRIVES

NEC ERROR: ALL 4 DRIVE STATUSES NOT CORRECT AFTER RESET
POP
OR
JMP

; DISCARD ERROR ADDRESS ON STACK
AX
DISKETTE_STATUS,BAD_NEC ; SET ERROR CODE
SHORT J8
; EXIT

SEND SPECI FY COMMAND TO NEC
0000
0000
OODF
00E2
00E5
00E8
OOEB
OOEE
OOF!
00F4
00F5
00F5
00F6

J7:
B4
E8
BB
E8
E8
BB
E8
E8
58

03
022C
0001
0259
022C
0003
0259
022C

MOV
CALL
MOV
CALL
CALL
MOV
CALL
CALL
POP

R
R
R
R

AH,SPECIFY
NECOUTPUT
BX,l
GELPARM
NECOUTPUT
BX,3
GELPARM
NECOUTPUT
AX

J8:
C3

DRIVE_READY
SPECI FY COMMAND
OUTPUT THE COMMAND
FIRST BYTE PARM IN BLOCK
TO THE NEC CONTROLLER
SECOND BYTE PARM IN BLOCK
TO THE NEC CONTROLLER
DISCARD ERROR RETURN ADDRESS
RESELRET
RETURN TO CALLER

RET
DISICRESET

ENDP

***********************************************************
----- DISKETTE STATUS ROUTINE
00F6
00F6
00F9
OOFC
OOFD

***********************************************************
AD 0041 R
88 46 DE
C3

DISICSTATUS
PROC
NEAR
AL, 01 SKETTE_STATUS
MOV
ALSAVE[BP] ,AL
MOV
RET
DISICSTATUS
ENDP

MOVE STATUS IN AL SAVE AREA

; ***********************************************************
;----- DISKETTE READ
OOFD
OOFD
0100
0102
0104
0107
0109
0100
010F

; ***********************************************************
E8
72
BO
E8
72
C6
EB

050B R
IF
46
02Fl
18
46 OF E6
41

DISICREAD
CALL
JC
MOV
CALL
JC
MOV
JMP
DISICREAD

PROC
NEAR
DSKLCHANGE
DSKLERR
AL,DMA_READ
DMA_SETUP
DSKLERR
;
AHSAVE[BP] ,READ_CMND
SHORT RW_OPN
;
ENDP

CHECK FOR MEDIA CHANGE
READ COMMAND FOR DMA
SET UP THE DMA
JUMP I F ERROR
; RD COMMAND (AH SAVE)
GO DO THE OPERATION

; ***********************************************************
DISKETTE VERI FY

ROM BIOS 2-125

010F
010F
Oll2
Oll4
Oll6
Oll9
OllB
OllF
0121

; ***********************************************************
DISICVERF
CALL
JC
MOV
CALL
JC
MOV
JMP
DISK_VERF

E8 050B R
72 00
BO 42
E8 02Fl
72 06
C6 46 OF E6
E8 2F

PROC
NEAR
DSKLCHANGE
DSKLERR
AL, DMILVERI FY
DMA_SETUP
DSKLERR
AHSAVE[BP] ,READ_CMND
SHORT RW_OPN
;
ENDP

CHECK FOR MEDIA CHANGE
VERI FY COMMAND FOR DMA
SET UP THE DMA
; RD COMMAND (AH SAVE)
GO DO THE OPERATION

; ***********************************************************
; DISKETTE ERROR OCCURRED

; ***********************************************************
0121
0121

DSKLERR:
RET

C3

; RETURN TO MAIN ROUTINE

; ***********************************************************
; ----- DISKETTE FORMAT

; ***********************************************************
0122
0122
0125
0127
012C
0l2E
0131
0133
0137
0139

DISKJORMAT
PROC
NEAR
CALL
DSKLCHANGE
CHECK FOR MEDIA CHANGE
JC
DSKT _ERR
OR
MOTOR_STATUS, WRITE_OP ; INDICATE WRITE OPERATION
MOV
AL, DMA_WRlTE
WILL WRITE TO THE DISKETTE
CALL
DMILSETUP
SET UP THE DMA
JC
DSKLERR
MOV
AHSAVE [BP] ,FORMALCMND ; FORMAT COMMAND (AH SAVE)
JMP
SHORT RW_OPN
; DO THE OPERATION
DISICFORMAT
ENDP

E8
72
80
BO
E8

0508 R
FA
OE 003F R 80
4A
02F1 R
72 EE
C6 46 OF 40
EB 17

; ***********************************************************

;----- DISKETTE WRITE ROUTINE

; ***********************************************************
0139
0139
Ol3C
Ol3E
0143
0145
0148
014A
014E
0150

DISICWRITE
CALL
JC
OR
MOV
CALL
JC
MOV
JMP
DISICWRITE

E8 050B R

72 E3
80
BO
E8
72
C6
EB

OE 003F R 80
4A
02F1 R
07
46 OF C5
00

PROC
NEAR
DSKLCHANGE
CHECK FOR MEDIA CHANGE
DSKLERR
MOTOILSTATUS,WRlTE_OP ; INDICATE WRITE OPERATION
AL,DMILWRITE
DMA WRITE COMMAND
DMA_SETUP
DSKLERR
AHSAVE[BP] ,WRITE_CMND
WRITE COMMAND (AH SAVE)
SHORT RW_OPN
ENDP

; ****************************************************************

; RW_OPN

THIS ROUTINE PERFORMS THE READ/WRITE/VERIFY
AND FORMAT OPERATIONS

; ****************************************************************
RW_OPN PROC
NEAR
CALL
MOTOILSTARTUP

0150
0150

E8 041B R

0153
0156

88 4E OA
E8 0268 R

MOV
CALL

CX,CXSAVE[BP]
SEEK

GET TRACK/ SECTOR PARMS
MOVE TO CORRECT TRACK

0159

C6 46 OE 00

MOV

ALSAVE[BP] ,0

0150

72 79

JC

J17

SET NO SECTORS READ IN CASE OF ERROR
IN AL SAVE AREA
I F ERROR, THEN EXIT AFTER MOTOR OFF

CHECK MOTOR STATE AND WAIT
FOR STARTUP I F NECESSARY

DO THE SEEK OPERATION

NECOUTPUT WILL POP RETURN ADDRESS AND RETURN TO THE 1ST LEVEL CALLER
015F
0162

B8 0221 R
50

0163
0166
0169

8A 66 OF
E8 022C R
8A 66 01

MOV
PUSH

AX,OFFSET J20
AX

DUMMY RETURN ON STACK FOR NECOUTPUT
SO THAT IT WILL EXIT ROUTINE IF
ERROR

SEND OUT THE PARAMETERS TO THE CONTROLLER
MOV
CALL
MOV

2-126 ROM BIOS

AH ,AHSAVE [BP]
NECOUTPUT
AH, DHSAVE [BP]

GET NEC COMMAND (AH SAVE)
OUTPUT THE OPERATION COMMAND
GET THE CURRENT HEAD NUMBER

016C
016E
0170
0173
0175

DO
DO
80
OA
E8

E4
E4
E4 04
E2
022C R

SAL
SAL
AND
OR
CALL

AH,l
AH,l
AH,4
AH,DL
NECOUTPUT

MOVE IT TO BIT 2
ISOLATE THAT BIT
OR IN THE DRIVE NUMBER

; ----- TEST FOR FORMAT COMMAND
0178
017C

80 7E OF 40
75 20

CMP
JNE

AHSAVE[BP] ,FORMALCMND ; IS THIS A FORMAT OPERATION
J15
; NO. CONTINUE WITH R/W/V

GET THE DATA FOR A FORMAT OPERATION
017E
0181
0184
0187
0l8A
0180
0190
0193
0196
0199
019C

BB
E8
E8
BB
E8
E8
BB
E8
E8
BB
EB

0007
0259
022C
0009
0259
022C
OOOF
0259
022C
0011
30

R
R
R
R
R
R

MOV
CALL
CALL
MOV
CALL
CALL
MOV
CALL
CALL
MOV
JMP

BX,7
GELPARM
NECOUTPUT
BX,9
GELPARM
NECOUTPUT
BX,15
GELPARM
NECOUTPUT
BX,17
SHORT J16

GET THE
BYTES/SECTOR VALUE TO NEC
GET THE
SECTORS/TRACK VALUE TO NEC
GET THE
GAP LENGTH VALUE TO NEC
GET THE FILLER BYTE
TO THE CONTROLLER

SEND THE DATA FOR A READ/WRITE/VERIFY OPERATION
019E
019E
01Al
01M
01A7
01AA
01AD
01BO
01 B3
01B6
01B9
01 BC
01 BF
01C2
01C5
01C8
OlCB

8A
E8
8A
E8
8A
E8
B8
E8
E8
BB
E8
E8
BB
E8
E8
BB

66 OB
022C R
66 01
022C R
66 OA
022C R
0007
0259 R
022C R
0009
0259 R
022C R
'OOOB
0259 R
022C R
0000

J15:
MOV
CALL
MOV
CALL
MOV
CALL
MOV
CALL
CALL
MOV
CALL
CALL
MOV
CALL
CALL
MOV

AH,CHSAVE[BP]
NECOUTPUT
AH, DHSAVE [BP]
NECOUTPUT
AH,CLSAVE[BP]
NECOUTPUT
BX,7
GELPARM
NECOUTPUT
BX,9
GELPARM
NECOUTPUT
BX,l1
GELPARM
NECOUTPUT
BX,13

CYLINDER NUMBER (CH SAVE)
HEAD NUMBER FROM STACK
SECTOR NUMBER

(CL SAVE)

BYTES/SECTOR PARM FROM BLOCK
TO THE NEC
EOT PARM FROM BLOCK
TO THE NEC
GAP LENGTH PARM FROM BLOCK
TO THE NEC
DTL PARM FROM BLOCK

COMPLETE SETUP TO NEC AND WAIT FOR INTERRUPT
OlCE
01CE
OlD1
OlD4

E8 0259 R
E8 022C R
58

J16:
CALL
CALL
POP

GELPARM
NECOUTPUT
AX

RW_OPN_F I NI SH
TO THE NEC
CAN NOW DISCARD THAT DUMMY
RETURN ADDRESS

LET THE OPERATION HAPPEN
0105
0108
0108
OlDA
0100

E8 0373 R

OlDF
OlEO
01E3
01E4

FC
BE 0042
AC
24 CO

01E6
01E8
OlEB
OlED

75
EB
3C
75

72 49
E8 03B3 R
72 42

CALL
J17 :
JC
CALL
JC

WAILINT
J21
RESUL TS
J20

WAIT FOR THE INTERRUPT
MOTOR_OFF
LOOK FOR ERROR
GET THE NEC STATUS
LOOK FOR ERROR

CHECK THE RESULTS RETURNED BY THE CONTROLLER

03
3E 90
40
29

CLD
MOV
LODS
AND
JFZ
JNZ
JMP
CMP
JNZ

; SET THE CORRECT DIRECTION
SI,OFFSET NEC_STATUS ; POINT TO STATUS FIELD
NECSTATUS
GET STO
AL,OCOH
TEST FOR NORMAL TERMINATION
J22
OPN_OK
$+5
I F NOT ZERO JUMP AROUND JUMP
J22
ELSE TAKE A LONG JUMP
AL,040H
TEST FOR ABNORMAL TERMINATION
J18
NOT ABNORMAL, BAD NEC

;----- ABNORMAL TERMINATION, FIND OUT WHY

ROM BIOS 2-127

01EF
01FO
01F2
01F4
01F6
01F8
01FA
01FC
01FE
0200
0202
0204
0206
0208
020A
020C
020E
0210
0212
0214
0216

AC
00
B4
72
DO
DO
B4
72
DO
B4
72
DO
DO
B4
72
DO
B4
72
DO
B4
72

EO
04
24
ED
EO
10
lC
EO
08
16
ED
ED
04
OE
EO
03
08
EO
02
02

LODS
SAL
MOV
JC
SAL
SAL
MOV
JC
SAL
MOV
JC
SAL
SAL
MOV
JC
SAL
MOV
JC
SAL
MOV
JC

NELSTATUS
AL,1
AH, RECORO_NOT _FND
J19
AL,1
AL,1
AH,BAD_CRC
J19
AL,1
AH, BAD_DMA
J19
AL,1
AL,1
AH, RECORD_NOTJND
J19
AL,1
AH, WRITE_PROTECT
J19
AL,1
AH, BAD--ADDR~ARK
J19

GET STl
TEST FOR EDT FOUNO
RW_FAIL
TEST FOR CRC ERROR
RWJAIL
TEST FOR DMA OVERRUN
RW_FAIL
TEST FOR RECORD NOT FOUND
RW_FAIL
TEST FOR WRITE_PROTECT
RWJAIL
TEST MISSING ADDRESS MARK
RWJAIL

NEC MUST HAVE FAILED
0218
0218
021A
021A
021E
0221
0221
0223
0223
0226

B4 20
08 26 0041
E8 03F5 R
EB 08
E8 03B3
EB 03

J18:
MOV
J19 :
OR
CALL
J20:
JMP
J21 :
CALL
JMP

RW-NEC-FAIL
AH,BAD_NEC
RW-FAIL
01 SKETTE_STATUS ,AH
NUM_TRANS
SHORT RW_EX IT
RESUL TS
SHORT RW_EXIT

HOW MANY WERE REALLY TRANSFERRED
RW_ERR
RETURN TO CALLER
RW_ERR_RES
FLUSH THE RESULTS BUFFER

OPERATION WAS SUCCESSFUL
0228
0228
022B
022B
022C

E8 03F5 R
C3

J22 :
CALL

NUM_TRANS

OPN_OK
HOW MANY GOT MOVED

RW_EXIT:
RET
RW_OPN ENDP
NECOUTPUT
THIS ROUTINE SENDS A BYTE TO THE NEC CONTROLLER AFTER TESTING
FOR CORRECT DIRECTION AND CONTROLLER REAOY THIS ROUTINE WILL
TIME OUT IF THE BYTE IS NOT ACCEPTEO WITHIN A REASONABLE
AMOUNT OF TIME, SETTING THE DISKETTE STATUS ON COMPLETION.
INPUT
(AH)
BYTE TO BE OUTPUT
OUTPUT
CY = 0 SUCCESS
CY = 1 FAILURE -- DISKETTE STATUS UPOATED
IF A FAILURE HAS OCCURRED, THE RETURN IS MADE ONE LEVEL
HIGHER THAN THE CALLER OF NECOUTPUT.
THIS REMOVES THE REQUIREMENT OF TESTING AFTER EVERY
CALL OF NELOUTPUT.
(AL) DESTROYED

022C
022C
022D
022E
0231
0233
0233
0234
0236
0238
023A

52
51
BA 03F4
33 C9
EC
A8 40
74 OE
E2 F9

NECOUTPUT
PUSH
PUSH
MOV
XOR
J23 :
IN
TEST
JZ
LOOP
J24:

2-128 ROM BIOS

PROC
NEAR
DX
CX
DX, FDCSTATUS
CX,€X
AL, DX
AL,DATLREADY
J25
J23

SAVE REGISTERS
STATUS PORT
COUNT FOR TIME OUT
GET STATUS
TEST DIRECTION BIT
DIRECTION OK
TIME_ERROR

023A
023F
0240
0241
0244
0245
0246
0246
0248
0248
0249
024B
0240
024F
0251
0251
0253
0255
0256
0257
0258
0259

C6 06 0041 R 80
59
5A
83 C4 02
F9
C3
33 C9
EC
A8
75
E2
EB

80
04
F9
E9

8A C4
B2 F5
EE
59
5A
C3

MOV
POP
POP
ADD
STC
RET
J25:
XOR
J26:
IN
TEST
JNZ
LOOP
JMP
J27 :
MOV
MOV
OUT
POP
POP
RET
NECOUTPUT

DISKETTLSTATUS, TIME_OUT
CX
SET ERROR CODE AND RESTORE REGS
OX
DISCARD THE RETURN ADDRESS
SP,2
INDICATE ERROR TO CALLER
CX,CX

RESET THE COUNT

AL,DX
AL, REQ~ASTER
J27
J26
J24

GET THE STATUS
IS IT READY
YES, GO OUTPUT
COUNT DOWN AND TRY AGAIN
ERROR COND IT I ON
OUTPUT
GET BYTE TO OUTPUT
DATA PORT (3F5)
OUTPUT THE BYTE
RECOVER REGISTERS

AL,AH
DL ,OF5H
DX,AL
CX
OX

CY = 0 FROM TEST INSTRUCTION
ENDP

--- - -- - - - - - - - - - - - - - - - - - - - - - - - -- - - - - - - -- - - - - -- - - - - -- - - - - - - - - - - - - - - - - - - - -GELPARM
THIS ROUTINE FETCHES THE INDEXED POINTER FROM THE DSKLBASE
BLOCK POINTED AT BY THE DATA VARIABLE DISK-POINTER. A BYTE FROM
THAT TABLE IS THEN MOVED INTO AH, THE INDEX OF THAT BYTE BEING
THE PARM IN BX
ENTRY -BX = INDEX OF BYTE TO BE FETCHED * 2
EX IT -AH = THAT BYTE FROM BLOCK

- -- - - - - - - - -- - - -- - - - - -- - - - - - - -- - - - - - - - - -- - - - - - - - - - -- - - - - - - - - - - - - - - - - - - --0259
0259
025A
025C

IE
2B CO
8E 08

025E
0262

C5 36 0078 R
01 EB

0264
0266

8A 20
IF

0267
0268

C3

GELPARM
PUSH
SUB
MOV
ASSUME
LOS
SHR

PROC
NEAR
OS
AX,AX
DS,AX
OS: ABSO
SI,DISK-POINTER
BX,1

MOV
POP
ASSUME
RET
GELPARM

AH, [SI+BX]
OS
DS:DATA

SAVE SEGMENT
ZERO TO AX
POINT TO BLOCK
DIVIDE BX BY 2, AND SET FLAG
FOR EXIT
GET THE WORD
RESTORE SEGMENT
RETURN TO CALLER

ENDP

SEEK
THIS ROUTINE WILL MOVE THE HEAD ON THE NAMED DRIVE TO THE
NAMED TRACK. IF THE DRIVE HAS NOT BEEN ACCESSED SINCE THE
DRIVE RESET COMMAND WAS ISSUED, THE DRIVE WILL BE RECALIBRATED.
FOR DRIVES 0,1 NO SEEK PERFORMED I F ALREADY ON TRACK
INPUT
(DL) = DRIVE TO SEEK ON
(CH) = TRACK TO SEEK TO
OUTPUT
CY = 0 SUCCESS
CY = 1 FAILURE -- DISKETTE_STATUS SET ACCORDINGLY
(AX, OJ) DESTROYED

-- ---- -- - - - - - - -- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -- - - - - - - - - - - - - - - - -0268
0268
026B
026C
026E
0270
0272
0274
0278
027A
027E
0281
0281

B8
50
BO
8B
8A
02

02EE R

84
75
08
B9

06 003E R
IB
06 003E R
0002

01
F9
CA
CO

B4 07

SEEK
PROC
NEAR
MOV
AX,OFFSET J32
PUSH
AX
MOV
AL,1
MOV
OJ, CX
MOV
CL,DL
AL,CL
ROL
TEST
JNZ
OR
MOV
J27A:
MOV

SET ERROR EXIT FOR NECOUTPUT
ESTABLISH MASK FOR RECAL TEST
SAVE TRACK NUMBER (01 HIGH)
GET DRIVE VALUE INTO CL
SHIFT IT BY THE DRIVE VALUE

AL,SEEK-STATUS
J28
SEEK-STATUS,AL
CX,02H

TEST FOR RECAL REQU I RED
NO_RECAL
TURN ON THE NO RECAL BIT IN FLAG
# RECALS ATTEMPTS FOR 80 TRACKS

AH,RECALIBRATE

RECAll BRATE COMMAND

ROM BIOS 2-129

0283
0286
0288
0288
028E
0290
0292
0293

E8
8A
E8
E8
73
E2
58
EB

022C R
E2
022C R
0340 R
05
EF

CALL
MOV
CALL
CALL
JNC
LOOP
POP
JMP

59

NELOUTPUT
AH,DL
NELOUTPUT
CHK-STAL2
J28
J27A
AX
SHORT J32

OUTPUT THE DRIVE NUMBER
GET THE INTERUPT AND SENSE INT STATU~
RECAL SUCCESSFUL
RETRY I F MORE THAN 77 STEPS NEEDED
DISCARD ERROR RETURN ADDRESS
SEEK-ERROR

DRIVE IS IN SYNC WITH CONTROLLER, SEEK TO TRACK
0295
0295
029A
0290

C6 06 0041 R 00
80 FA 01
77 20

J28:
MOV
CMP
JA

DISKETTLSTATUS ,0
DL ,01
J28_3

CLEAR DISKETTE STATUS
CHECK FOR ABOVE DRIVE

CHECK FOR CURRENT TRACK = DESIRED TRACK
029F
02Al
02A3
02A5
02A6
02A8
02AB
02AD
02AF
02AF
02Bl
02B3
02B5
02B7
02B8
02BA

E4
A8
74
50
24
80
75
OC

77
80
lA

E6
8B
E4
3A
58
E6
75

77
CF
77
C5

02BC
02BD

F8
EB 2F

02BF
02Cl
02C4
02C6
02C9
02CB
02CE
02CF

B4
E8
8A
E8
8B
E8
58
E8

0202
0203
0206
0209
02DC
02DE
02EO
02EO
02E2
02E4
02E7
02E9
02E8
02ED
02ED

9C
BB
E8
80
73
B4

0012
0259 R
FC OF
02
OF

OA
74
B9
E2
FE
EB

E4
09
0102
FE
CC
F3

IN
TEST
JZ
PUSH
AND
CMP
JNE
OR
J28_2 :
OUT
MOV
IN
CMP
POP
OUT
JNE

E2
FA 00
02
08

77
03

AL,DSKLCNTL
AL,DSKLNMI
; IS DISKETTE CONTROL REG CORRECT?
J28_3
; JUMP I F NOT
AX
AL, DSKLNMI +FDLPWR+DSKLDEGATE+CNTL_SEL ; READ DRI TRK
DL,O
J28_2
AL,DRO_TRK-SEL
SET TRACK SENSE FOR DRIVE 0
DSKT_CNTL, AL
CX,DI
AL,DSKLCNTL
AL,CH
AX
DSKLCNTL, AL
J28_3

SELECT DRIVE # FOR TRACK SENSE
GET TRACK NUMBER IN CH
READ TRACK POSITION
COMPARE TRACK ON WITH DESIRED TRACK
RESTORE SENSE REGISTER

ON SAME TRACK SO JUST EXIT WITH NO ERROR
CLC
JMP

OF
022C
E2
022C R
C7
022C R
0340 R

SHORT

J32

J28_3: MOV
AH,SEEK-CMD
CALL
NELOUTPUT
MOV
AH,DL
CALL
NELOUTPUT
MOV
AX,DI
CALL
NELOUTPUT
POP
AX
CALL
CHK-STAL2

EXIT
SEEK COMMAND TO NEC
DRIVE NUMBER
TRACK NUMBER
DISCARD ERROR RETURN ADDRESS
GET ENDING INTERRUPT AND

;----- WAIT FOR HEAD SETTLE

02EE
02EE
02FO
02Fl

9D
8B CF
C3

PUSHF
MOV
CALL
CMP
JAE
MOV
J29 :
OR
JZ
MOV
LOOP
DEC
JMP
J31 :
POPF
J32 :
MOV
RET
SEEK

2-130 ROM BIOS

BX,18
GELPARM
AH,15
J29
AH,15

SAVE STATUS FLAGS
GET HEAD SETTLE PARAMETER
CHECK FOR AT LEAST 15 MSEC
SET IT TO 15 I F NOT = OF ABOVE
HEAD_SETTLE

AH,AH
J31
CX, MS_DELAY

EXIT LOOP IF NO WAIT

$
AH
SHORT J29

CX, DI
ENDP

cn

DO IT SOME MORE

SEEK-ERROR
RESTORE CX
RETURN TO CALLER

-- -- -

- - -- - - - - - - - -- -- - - - - - -- - - - - - - - - - - - - - -- - - - - - - - - - - - - - -- - - - - - - -- - - - - - --

DMiLSETUP
THIS ROUTINE SETS UP THE DMA FOR READ/WRITE/VERIFY OPERATIONS.
INPUT
(AL) = MODE BYTE FOR THE DMA
(ES) - SEGMENT TO READ/WRITE THE DATA
(BP) - STACK POINTER (TO GET INPUT PARAMETERS)
OUTPUT
(AX,CX) DESTROYED

--- - -- -- -- -- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -- - - - - - - - - - - -- - - - - - -02Fl
02Fl
02F2
02F4
02F6
02F8
02F9
02FB
02FD
02FF
0301
0303
0306
0308
030A
030A
030B
0300
030F
0311
0313
0315

FA
E6
EB
E6
50
8C
Bl
03
8A
24
03
73
FE
50
E6
8A
E6
8A
24
E6

OC
00
OB
CO
04
CO
E8
FO
46 OC
02
C5
04
C4
04
C5
OF
81

DMiLSETUP
CLI
OUT
JMP
OUT
PUSH
MOV
MOV
ROL
MOV
AND
ADD
JNC
INC
J33 :
PUSH
OUT
MOV
OUT
MOV
AND
OUT

PROC
DMA+12,AL
$+2
DMA+11,AL
AX
AX, ES
CL,4
AX,CL
CH,AL
AL,OFOH
AX,BXSAVE[BP]
J33
CH
AX
DMA+4,AL
AL,AH
DMA+4,AL
AL,CH
AL ,OFH
DMiLPAGE2,AL

NEAR
NO MORE INTERRUPTS
SET THE FIRST/LAST F/F
DELAY FOR DMA CONTROLLER
OUTPUT THE MODE BYTE
SAVE COMMAND
GET THE ES VALUE
SHI FT COUNT
ROTATE LEFT
GET HIGHEST NYBLE OF ES TO CH
ZERO THE LOW NYBBLE FROM SEGMENT
ADD ADDRESS OFFSET
TEST FOR CARRY FROM ADDITION
CARRY MEANS HIGH 4 BITS MUST BE INC
SAVE START ADDRESS
OUTPUT LOW ADDRESS
OUTPUT HIGH ADDRESS
GET HIGH 4 BITS
OUTPUT THE HIGH 4 BITS TO

DETERMINE COUNT
0317
031A
031C
031E
031F
0322
0325
0327
0328
032A
032B
032C
032E
0330
0332
0333
0334
0335
0337
0339
033B
033C

8A
2A
01
50
BB
E8
8A
58
03
48
50
E6
8A
E6
FB
59
58
03
BO
E6
58
73

033E
0340

3C 42
74 OA

0342
0347
034B
034C
034C

C6 06 0041 R 09
C6 46 OE 00
F9

0340

C3

66 OE
CO
E8
0006
0259 R
CC
EO
05
C4
05

Cl
02
OA
OE

MOV
SUB
SHR
PUSH
MOV
CALL
MOV
POP
SHL
DEC
PUSH
OUT
MOV
OUT
STI
POP
POP
ADD
MOV
OUT
POP
JNC

AH,ALSAVE[BP]
AL,AL
AX,1
AX
BX,6
GELPARM
CL,AH
AX
AX,CL
AX
AX
DMA+5,AL
AL,AH
DMA+5,AL

CMP
JE

AL,42H
DMiLOUT

MOV
MOV
STC
DMA_OUT:
RET
DMiLSETUP

CX
AX
AX,CX
AL,2
DMA+lO,AL
AX
DMiLOUT

NUMBER OF SECTORS (AL SAVE)
TIMES 256 INTO AX
SECTORS * 128 INTO AX
GET THE BYTES/SECTOR PARM
USE AS SHIFT COUNT (0=128, 1=256 ETC)
MUL TIPLY BY CORRECT AMOUNT
-1 FOR DMA VALUE
SAVE COUNT VALUE
LOW BYTE OF COUNT
HIGH BYTE OF COUNT
I NTERRUPTS BACK ON
RECOVER COUNT VALUE
RECOVER ADDRESS VALUE
ADD, TEST FOR 64K OVERFLOW
MODE FOR 8237
INITIALIZE THE DISKETTE CHANNEL
RESTORE COMMAND
NON-DMA OPERATION?
I F SO THEN NO BOUNDRY ERROR

DISKETTE_STATUS,DMA_BOUNDARY ; SET DMA BOUNDRY ERROR
BYTE PTR [BP+14] ,0
NO SECTORS TRANSFERRED (AL SAVE)
SET CARRY TO INDICATE ERROR
RETURN TO CALLER,
CARRY SET BY ABOV ElF ERROR
ENDP

ROM BIOS 2-131

CHLSTAL2
THIS ROUTINE HANDLES THE INTERRUPT RECEIVED AFTER A
RECALIBRATE, SEEK, OR RESET TO THE ADAPTER.
THE INTERRUPT IS WAITED FOR, THE INTERRUPT STATUS SENSED,
AND THE RESULT RETURNED TO THE CALLER.
INPUT
NONE
OUTPUT
CY = 0 SUCCESS
CY = I FAILURE -- ERROR IS IN DISKETTE_STATUS
(AX) DESTROYED
0340
0340
0350
0352
0355
0356
0358
035B
035E
0360
0361
0364
0366
0368
036A
036B
036B
036C
036C
0371
0372
0373

E8 0373 R
72 19
B8 036B R
50
B4
E8
E8
72
58
AO
24
3C
74
F8

08
022C R
03B3 R
OB
0042 R
60
60
02

C3
80 OE 0041 R 40
F9
C3
; --

CHLSTAL2
CALL
JC
MOV
PUSH

PROC
NEAR
WAILINT
J34
AX,OFFSET J34
AX

MOV
CALL
CALL
JC
POP
MOV
AND
CMP
JZ
CLC
J34:
RET
J35 :
OR
STC
RET
CHLSTAL2

AH, READ_INLSTATUS
NECOUTPUT
RESUL TS
J34
AX
AL,NECSTATUS
AL ,060H
AL,060H
J35

WAIT FOR THE INTERRUPT
I F ERROR, RETURN IT
SET ERROR RETURN ADDRESS
SENSE INTERRUPT STATUS COMMAND
READ IN THE RESULTS
CHKLRETURN
DISCARD ERROR RETURN ADDRESS
GET THE FIRST STATUS BYTE
ISOLATE THE BITS
TEST FOR CORRECT VALUE
I F ERROR, GO MARK IT
GOOD RETURN

RETURN TO CALLER
; CHKLERROR
DISKETTE_STATUS, BAD_SEEK
; ERROR RETURN CODE
ENDP

--- - -- - - - - - - - - - - - - - - - -- - - - - - - - - -- - - - -- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ---

WAILINT
THIS ROUTINE WAITS FOR AN INTERRUPT TO OCCUR. A TIME OUT
ROUTINE TAKES PLACE DURING THE WAIT, SO THAT AN ERROR MAY BE
RETURNED I F THE DRIVE IS NOT READY.
INPUT
NONE
OUTPUT
CY = 0 SUCCESS
CY = I FAILURE -- DISKETTE_STATUS IS SET ACCORDINGLY
(AX, BX) DESTROYED
; -- -

0373
0373
0374
0375

-------------------- -------- ----- ---- ---- - -- - - - - - - - -- - - - - - - -- - - - - - - -WAILINT
STI
PUSH
CLC

FB
51
F8

PROC

NEAR

CX

; TURN ON INTERRUPTS, JUST IN CASE
; SAVE REGISTERS

CALL DEVICE BUSY SERVICE ROUTINE
0376
0379
037B

B8 9001
CD 15
7211

MOV
INT
JC

AX,D900IH
15H

CALL DEVICE BUSY (DISKETTE)

J36~

JUMP I F TIMEOUT OCCURRED

BIOS WILL PASS CONTROL HERE WITH CARRY FOR TIMEOUT OR WITH NO CARRY FOR
OPERATION COMPLETE.
0370
037F
0381
0381
0386
0388
038A
038C

B3 04
2B C9
F6
75
E2
FE
75

06 003E R 80
OC
F7
CB
F3

MOV
SUB
J36:
TEST
JNZ
LOOP
DEC
JNZ

BL,4
CX,CX

SEELSTATUS,INLFLAG ; TEST FOR INTERRUPT COMPLETE
JUMP I F INTERRUPT COMPLETE
J37
I NNER LOOP COUNT
J36
BL
OUTER LOOP COUNT
J36

NO INTERRUPT RECEIVED TIMEOUT ERROR
038E

J36~:

2-132 ROM BIOS

; WAIT FOR 2 SECONDS
; CLEAR THE COUNTER

038E
0393
0394
0394
0395
039A
039B
039C

80 OE 0041 R 80
F9
9C
80 26 003E R 7F
9D
59
C3

039D

OR
STC
J37 :
PUSHF
AND
POPF
POP
RET
WAILINT

DISKETTLSTATUS, TIMLOUT; NO INTERRUPT OCCURRED ERROR
; ERROR RETURN
; SAVE CURRENT CARRY
SEEICSTATUS, NOT INLFLAG ; TURN OFF INTERRUPT FLAG
RECOVER CARRY
CX
GOOD RETURN CODE COMES
FROM TEST I NST
ENDP

, ----- -- - - - - - -- - - - - - - - -- - - - - - - - - - -- - - - - - -- - -- - -- - - - - -- - -; DSKLINTE
THIS ROUTINE HANDLES THE DISKETTE INTERRUPT
; INPUT
;
NONE
; OUTPUT
THE INTERRUPT FLAG IS SET IS SEEICSTATUS
; - - -- - - - - - - -- - - - - -- -- - - - -- -- - - - - - - - - - - - - -- - - - - - - - -- -- - - -039D
039D
039E
039F
03A2
03A7
03A9
03AB
03AE
03BO
03B1
03B2
03B3

1E
50
E8
80
BO
E6
B8
CD
58
1F
CF

0000 E
OE 003E R 80
20
20
9101
15

DSKLINTE
PUSH
PUSH
CALL
OR
MOV
OUT
MOV
INT
POP
POP
IRET
DSKLINTE

FAR
PROC
DS
AX
DDS
;
SEEICSTATUS,INLFLAG
AL,EOI
INTAOO,AL
AX,09101H
15H
AX
DS

SET UP DATA SEGMENT
END OF INTERRUPT MARKER
I NTERRUPT CONTROL PORT
SIGNAL DEVICE OPERATION COMPLETE
RECOVER SYSTEM
RETURN FROM INTERRUPT

ENDP

RESULTS
THIS ROUTINE WILL READ ANYTHING THAT THE NEC CONTROLLER HAS
TO SAY FOLLOWING AN INTERRUPT.
INPUT
NONE
OUTPUT
CY = 0 SUCCESSFUL TRANSFER
CY = 1 FAILURE -- TIME OUT IN WAITING FOR STATUS
NECSTATUS AREA HAS STATUS BYTE LOADED INTO IT
(AH,BX,Si) DESTROYED
03B3
03B3
03B4
03B7
03B8
03B9

FC
BE 0042
51
52
B3 07

; -- - - - - - - - - - - - - - - - - - - - - - -- - - - - - -- -- - - - - - - - - -- --- - - - - - - - - - - -- - - - -- - - - - - - -RESUL TS PROC
NEAR
CLD
MOV
SI,OFFSET NECSTATUS ; POINTER TO DATA AREA
PUSH
CX
SAVE COUNTER
PUSH
DX
; MAX STATUS BYTES
MOV
BL,7
; ----- WAIT FOR REQUEST FOR MASTER

03BB
03BB
03BD
03CO
03CO
03C1
03C3
03C5
03C7
03CC
03CC
03CD
03CE
03CF

33 C9
BA 03F4
EC
A8
75
E2
80
F9
5A
59
C3

80
OB
F9
OE 0041 R 80

J38:
XOR
MOV
J39:
IN
TEST
JNZ
LOOP
OR
J40:
STC
POP
POP
RET

INPULLOOP
COUNTER
STATUS PORT
WAIT FOR MASTER
AL,DX
GET STATUS
AL, REQ~ASTER
MASTER READY
J40A
TESLDIR
J39
; WAILMASTER
DISKETTE_STATUS, TIME_OUT
; RESULTS_ERROR
; SET ERROR RETURN
DX
CX
CX,CX
DX, FDCSTATUS

;----- TEST THE DIRECTION BIT

ROM BIOS 2-133

0300
0300
0301
0303
0305
0305
03DA

EC
A8 40
75 07
80 DE 0041 R 20
EB FO

J40A:
IN
TEST
JNZ
J41 :
OR
JMP

AL,DX
AL,DATA_READY
J42

GET STATUS REG AGAIN
TEST DIRECTION BIT
OK TO READ STATUS
; NECFAIL
DISKETTE_STATUS, BAD_NEC
; RESULTS_ERROR
J40

READ IN THE STATUS
03DC
03DC
0300
03DE
03EO
03El
03E4
03E6
03E7
03E8
03EA
03EC
03EE
03FO

42
EC
88
46
B9
E2
4A
EC
A8
74
FE
75
EB

J42:
INC
OX
IN
AL,DX
MOV
[SI] ,AL
INC
SI
MOV
CX,10
J43:
LOOP
J43
DEC
OX
IN
AL,DX
TEST
AL, FDCBUSY
JZ
J44
DEC
BL
JNZ
J38
JMP
J41

04
OOOA
FE
10
06
CB
CB
E3

INPULSTAT
POINT AT DATA PORT
GET THE DATA
STORE THE BYTE
INCREMENT THE POINTER
LOOP TO KILL TIME FOR NEC
POINT AT STATUS PORT
GET STATUS
TEST FOR NEC STI LL BUSY
RESULTS DONE
DECREMENT THE STATUS COUNTER
GO BACK FOR MORE
CHIP HAS FAILED

RESUL T OPERATION I S DONE
03F2
03F2
03F3
03F4
03F5

J44:
POP
OX
POP
CX
RET
RESUL TS ENDP

5A
59
C3

RECOVER REGI STERS
GOOD RETURN CODE FROM TEST INST

NUM_TRANS
THIS ROUTINE CALCULATES THE NUMBER OF SECTORS THAT
WERE ACTUALLY TRANSFERRED TO/FROM THE DISKETTE
INPUT
(BP) = POINTER TO ORIGINAL STACK ENTRIES
OUTPUT
(BP+14) = AL SAVE AREA ON STACK = # ACTUALLY TRANSFERRED
NO OTHER REGISTERS MODIFIED
03F5
03F5
03F8
03FB
03FE
0401
0405
0407
040B
040E
0410
0412
0412
0414
0414
0417
041A
041B

BB
E8
AO
8A
3A
75
8A
3A
74
02

0008
0259 R
0047 R
7E 01
3E 0046 R
DB
3E 0045 R
7 E DB
04
C4

02 C4
2A 46 OA
88 46 DE
C3

NUM_TRANS
MOV
CALL
MOV
MOV
CMP
JNZ
MOV
CMP
JZ
ADD
DIF_HD:
ADD
SAMLTRK:
SUB
MOV
RET
NUM_TRANS

2-134 ROM BIOS

PROC
NEAR
BX,8
GELPARM
AL,NECSTATUS+5
BH, DHSAVE [BP]
BH,NECSTATUS+4
01 F_HD
BH,NECSTATUS+3
BH,CHSAVE[BP]
SAME_TRK
AL,AH

SECTORS/TRACK OFFSET TO DL
AH = SECTORS/TRACK
GET ENDING SECTOR
BH = STARTING HEAD #
GET HEAD ENDED UP ON
I F ON SAME HEAD, THEN NO ADJUS
GET TRACK ENDED UP ON
SEE I F TRACK SWITCH
IF SAME TRACK NO INCREASE
ADD SECTORS/TRACK

AL,AH

ADD SECTORS/TRACK

AL, CLSAVE [BP]
ALSA VE [BP] ,AL

SUBTRACT START FROM END SECTORS
SAVE RESULTS IN STACK SAVE AREA

ENDP

MOTOILSTARTUP
FUNCTION: TO CHECK FOR MOTOR STATE, TURN ON MOTOR OF REQUESTED DRIVE
AND WAIT THE NECESSARY STARTUP TIME BEFORE RETURNING
TO CALLER.
I NPUT PARAMETERS:
DL = 0-3 (DISKETTE DRIVE NUMBER)
OUTPUT PARAMETERS:
MOTOILSTATUS FLAGS UPDATED
MOTOR OF DRIVE IS TURNED ON
REGISTERS MODIFIED: AX,BX,CX,DH
041B

MOTOILSTARTUP

PROC

NEAR

;----- TURN ON THE MOTOR AND SELECT THE DRIVE
041B

B6 00

MOV

041D

DH,O

; SET FIRST TIME THROUGH FLAG

MOL01:
GET MOTOR STARTUP TI ME

0410
0420
0423
0426
0428
042A
042A
042C
042E
0430

BB
E8
80
73
B4

0014
0259 R
FC 04
02
04

MOV
CALL
CMP
JAE
MOV
MOLOll:
MOV
MOV
MOV
SAL

8A
8A
BO
D2

EC
CA
01
EO

0432

FA

CLI

0433
0437

84 06 003F R
75 IB

TEST
JNZ

0439
043E
0442
0.4.44
0446
0448
044A
044C
044D
0450
0451
0452

80
08
BO
8A
D2
OA
OC
52
BA
EE
5A
EB

BX,20
GELPARM
AH,04
MOLOn
AH,04

GET THE MOTOR WAIT
CH HAS MOTOR START UP DELAY
MUST BE MINIMUM OF 500 MSECS
JUMP IF OKAY
DEFAULT TIME TO 500 MSECS

CH,AH
CL,DL
AL,l
AL,CL

SAVE MOTOR START UP DELAY
GET DRIVE NUMBER AS SHIFT COUNT
MASK FOR DETERMINING MOTOR BIT
SHI FT THE MASK BIT

AL ,MOTOR_STATUS
MOL02

NO INTERRUPTS WHILE DETERMINING
MOTOR STATUS
TEST THAT MOTOR FOR OPERATING
IF RUNNING GO CHECK TIME

; TURN ON MOTOR
26 003F R FO
06 003F R
10
CA
EO
C2
OC
03F2
07

AND
OR
MOV
MOV
SAL
OR
OR
PUSH
MOV
OUT
POP
JMP

MOTOR_STATUS,OFOH
TURN OFF ALL MOTOR BITS
MOTOILSTATUS, AL
TURN ON THE CURRENT MOTOR
AL,10H
MASK BIT
CL,DL
GET DRIVE NUMBER AS SHI FT COUNT
AL,CL
DEVELOP BIT MASK FOR MOTOR ENABLE
AL,DL
; GET DRIVE SELECT BITS IN
AL,FDCDMILENAB+FDCRUN ; NO RESET, ENABLE DMA/INT
DX
SAVE REG
DX,DRIVE_CNTL
CONTROL PORT ADDRESS
DX,AL
DX
RECOVER REGISTERS
SHORT MOL04
GO DELAY FOR STARTUP

CHECK TO SEE I F MOTOR ON LONG ENOUGH
0454
0454
0459

F6 06 003F R 20
75 24

,

MOL02:
TEST
JNZ

MOTOILSTATUS,MOTOILOK ; CHECK FOR MOTOR RUNNING LONG ENOUGH
MOL08
IF MOTOR OKAY THEN EXIT

; CH HAS TIME TO WAIT IN 1/8 SECONDS
045B
045B C6 06 0040 R FF
0460 FB
0461 OA ED
0463 74 1A
0465 OA F6
0467 75 08

MOL04:
MOV
STI
OR
JZ
OR
JNZ

MOTOILCOUNT,OFFH
CH,CH
MOL08
DH,DH
MOL06

SET LONG MOTOR DELAY
I NTERRUPTS BACK ON
DON'T WAIT IF NO WAIT SET
CHECK FOR FIRST TIME THROUGH WAIT
I F NOT FIRST TIME BYPASS OP _SYS HOOK

NOTIFY OPERATING SYSTEM OF WAIT FOR MOTOR STARTUP
0469

F8

CLC

; RESET TIMEOUT INDICATOR

ROM BIOS 2-135

046A
0460
046F

B8 90FD
CD 15
72 OE

MOV
INT
JC

AX ,90FDH
15H
MOL08

SET WAIT ON DISKETTE MOTOR
SLEEP OR DO OTHER WORK
BYPASS TIME DELAY I F TIMEOUT

TIME DELAY LOOP TO WAIT FOR MOTOR STARTUP
0471
0471
0473
0475
0475
0477
0479
047B
0470

MOL06:
MOV
OR
MOL07:
JZ
SUB
LOOP
DEC
JMP

8A E5
OA E4
74
2B
E2
FE
EB

08
C9
FE
CC
F6

AH,CH
AH,AH
MOL08
CX, CX

$
AH
SHORT MOL07

MOVE TIME IN AH
TEST FOR NO WAIT
TESLWAILTIME
EXIT WITH TIME EXPIRED
SET UP 1/8 SECOND LOOP TIME
WAIT FOR THE REQUIRED TIME
DECREMENT TIME VALUE
ARE WE DONE YET

MOTOR IS RUNNING SO CONTINUE WITH OPERATION
047F
047F
0484
0486
048B

C6
B6
F6
74

06 0040 R FF
01
06 003F R OF
90

MOL08:
MOV
MOV
TEST
JZ

MOTOR_COUNT,OFFH
DH,Ol
MOTOR_STATUS,OFH
MOLOI

SET LARGE COUNT AFTER WAIT
SET 2ND TIME THROUGH FLAG
TEST FOR MOTORS STILL ON
I F NOT OKAY THEN GO BACK AND RESTART

; MOTORS STI LL ON AFTER WAIT
0480
0492
0493
0494

80 OE 003F R 20
FB
C3

OR
MOTOR_STATUS,MOTOR_OK ; SET MOTOR ON LONG ENOUGH FLAG
STI
; ALLOW INTERRUPTS
RET
MOTOR_STARTUP ENDP

;-~ -~ -~ -~ --~ -i-;; -K- ~ -~ -~ -E-- ~ - ~ -i-v -E--P-~ - ~ - ~ -M-E- ~ -E-R-;; -- ~ -a-u-~ -i-N-E
; -- -------- ----------- ------------- ----------- ----- ----- -- - - - - - - -

0494
0494
0497
0499
049B
0490
049F
04Al
04A3
04A5
04A8
04AA
04AC
04AF
04Bl
04B3
04B3
04B6
04BA
04BE
04C2
04C2
04C5
04C8
04CB
04CD
0400
0404
0406
0408
04DA
0400
04E2
04E3

E8
2B
2B
2B
8E
8A
3C
74
BE
3C
74
BE
3C
75
2E
2E
2E
2E
89
89
89
2B
89
8A
Bl
02
FE
89
C6
C3

0586 R
FF
C9
02
C2
E6
00
10
0000
03
07
0000
01
OF
8E
8B
8B
8B
7E
4E
46
CO
46
16
06
EA
C2
56
06

04
7C 02
4C 04
54 06
04
OA
OC
OE
0010 R

00
0041 R 00

- -- - -

DSKLRDPARM
PROC
NEAR
CALL
GELDRLCONFIG
GET DRIVE CONFIGURATION IN AL
SUB
01,01
CLEAR REGISTERS
SUB
CX,CX
SUB
DX,DX
MOV
ES,DX
CLEAR ES
MOV
AH,DH
CLEAR AH
CMP
AL,NO_DRIVE
DRIVE PRESENT?
JE
RDPARM_02
MOV
SI,OFFSET PARMS_TPIl35 ; SET 720K DRIVE
CMP
AL, TPL135
JE
RDPARM_Ol
MOV
SI,OFFSET PARMS_TPI48
SET 360K DRIVE
CMP
AL, TPL48
JNE
RDPARM_02
IF NOT VALID SET NO DRIVE
RDPARM_Ol :
MOV
ES,CS:[SI]
SETUP SEG TO DSKLPARMS
MOV
DI,CS: [SI+2]
POINTER TO PARMS
MOV
CX,CS: [SI+4]
TRACKS AND SECTORS
MOV
DX,CS: [SI+6]
GET HEADS
RDPARM_02 :
MOV
DISAVE[BP] ,01
MODIFY REGISTERS ON STACK
MOV
CXSAVE [BP], CX
MOV
BXSAVE[BP] ,AX
SET DRIVE TYPE IN BL
SUB
AX,AX
MOV
AXSAVE [BP],AX
; CLEAR AL
MOV
DL,BYTE PTR EQUIP_FLAG; GET LOW BYTE OF EQUIPMENT
MOV
CL,6
GET # DISKETTES IN LOW
SHR
DL, CL
BITS
INC
DL
CORRECT FOR AT LEAST 1 DRIVE
MOV
DXSAVE [BP], OX
SAVE # HEADS AND # DRIVES
MOV
DISKETTE_STATUS,O
GET RETURN CODE
RET
DSKLRDPARM
ENDP

2-136 ROM BIOS

DSKLREADDASD
INPUT PARAMETERS:
AH = 15H
Dl = DRIVE NUMBER (0-3)
OUTPUT PARAMETERS:
AH = 00 - NO DRIVE PRESENT
01 - DISKETTE DRVIE WITH NO CHANGE LINE SUPPORT INSTAllED
02 - DISKETTE DRIVE WITH CHANGE LINE SUPPORT INSTAllED
03 - FIXED DISK
DISKETTLSTATUS = 0
04E3
04E3

80 OE 0016 R 04

04E8
04ED
04FO
04F2
04F4
04F6
04F8

C6
E8
B4
3C
74
3C
74

06 0041 R 00
0586 R
00
00
OB
03
05

DSKLRDDASD
PROC
NEAR
OR
BIOS_STATUS,DCl_SUPPORTED ; SET CHANGE LINE
SUPPORTED FLAG
MOV
DISKETTLSTATUS,O
SET GOOD RETURN CODE
GET DRIVE CONFIGURATION
CAll
GELDRLCONFIG
MOV
AH,O
CLEAR RETURN CODE
Al,NO_DRIVE
CHECK FOR DRIVE PRESENT
CMP
DASD_EXIT
JUMP I F NOT PRESENT
JE
CMP
Al, TPL135
3 1/2 DRIVES?
DASD_Ol
JE
YES THEN JUMP

SET NO CHANGE LINE AVAILABLE
04FA
04FC

B4 01
EB 03 90

MOV
JMP

AH,OI
DASD_EXIT

SET NO CHANGE LINE AVAIL

SET CHANGE LINE AVAILABLE
04FF
04FF
0501
0501
0504
0507
0508
050B

DASD_Ol :
MOV
AH,02
DASD_EXIT :
MOV
AHSAVE[BP] ,AH
ADD
SP,2
ClC
DIO_3
JMP
DSKLRDDASD
ENDP

B4 02
88 66 OF
83 C4 02
F8
E9 0071

CHANGE LINE AVAILABLE
SAVE VALUE IN AH SAVE AREA
THROW AWAY RETURN ADDRESS
GO BACK TO MAIN ROUTINE

; *******************************************************************
;DISKETTE
050B
050B
050E
0510
0512
0514
0516

CHANGE

lINE

STATUS

ROUTINE

; *******************************************************************
E8
OA
74
3C
75
E8

DSKLCHANGE
PROC
NEAR
CAll
GELDRVJONFIG
OR
Al,Al
JZ
DCl_06
CMP
Al, TP L135
JNE
DCLI0
CAll
MOTOILSTARTUP

0586 R
CO
41
03
63
041B R

GET DRIVE CONFIGURATION
CHECK FOR DRIVE NO THERE
IF SO THEN SET TIMEOUT STATUS
CHECK FOR 3.5
JUMP IF NO CHANGE lINE
TURN ON MOTOR AND SELECT

CHECK CHANGE LINE
0519
0519
051A
0510
051E
0521
0522
0523
0525
0527
052C

52
BA
EC
BA
EC
5A
A8
75
F6
75

03F4
03 F7
80
OF
06 0016 R 02
2C

DCl_Ol :
PUSH
MOV
IN
MOV
IN
POP
TEST
JNZ
TEST
JNZ

OX
OX, FDCSTATUS
Al,DX
DX,DRIVE_SENSE
Al,DX
OX
Al,CHG_LINE
DCl_03
;
BIOS_STATUS, FORCLDCl
DCl_07
;

ENSURE CONTROllER IS ON
DIGITAL INPUT PORT
RESTORE DRIVE NUMBER
TEST FOR DISKETTE CHANGE
JUMP IF ACTIVE
; FORCE CHANGE ERROR
AFTER RESUME? - JUMP IF YES

CHANGE LINE NOT ACTIVE
052E
052E
0533
0534

C6 06 0041 R 00
F8
EB 49

DCl_02:
MOV
ClC
JMP

DISKETTE_STATUS,O
SHORT DCl_EXIT

SET GOOD RETURN
RESET ERROR FLAG
RETURN

CHANGE LINE ACTIVE

ROM BIOS 2-137

SEEK TO 1 THEN TO 0 TO RESET CHANGE LINE
0536
0536
0538
053B
0530
053F
0542

B5
E8
72
B5
E8
73

DCl_03:
MOV
CAll
JC
MOV
CAll
JNC

01
0268 R
07
00
0268 R
05

CH,OlH
SEEK
DCl_04
CH,OOH
SEEK
DCL05

SET UP TO SEEK TO TRACK 1
TO RESET CHANGE LINE
JUMP I F ERROR ON THE SEEK
NOW SET TO SEEK TO ZERO
DO THE SEEK

SEEKS FAilED SO SET RECAl REQUIRED
0544
0544

C6 06 003E R 00

DCl_04:
MOV

SEEICSTATUS,O

; SEEK FAilED RECAl REQUIRED

CHECK TO SEE I F CHANGE LINE WAS SUCCESSFUllY RESET
0549
0549
054A
0540
054E

52
BA 03F7
EC
5A

054F
0551

A8 80
74 07

DCl_05:
PUSH
MOV
IN
POP
TEST
JZ

OX
DX,DRIVE_SENSE
Al,DX
OX
Al, CHG_LI NE
DCl_07

DIGITAL INPUT PORT
RESTORE DRIVE NUMBER
TEST FOR DISKETTE CHANGE
I F RESET THEN MEDIA CHANGE

CHANGE LINE DID NOT RESET SO SET TIMEOUT ERROR
0553
0553
0558

C6 06 0041 R 80
EB 17

DCl_06:
MOV
JMP

DISKETTE_STATUS, TIMLOUT ; NO DISKETTE IN DRIVE
SHORT DCl_09
; EXIT WITH TIMEOUT ERROR

MEDIA CHANGE WAS ACTIVE, AND RESET SUCCESSFUllY, IF CHANGE LINE NOT
SUPPORTED AND NO READ DCl STATUS DON'T REPORT THE ERROR
055A
055A
055F
0561
0565

F6
75
80
75

06 0016 R 04
06
7E OF 16
C7

DCl_07:
TEST
JNZ
CMP
JNE

BIOS_STATUS,DCl_SUPPORTED ; CHANGE LINE SUPPORTED
DCl_08
JUMP IF YES
AHSAVE[BP], 16H
; FUNCTION" READ DCl STATUS?
DCl_02
; NO THEN INDICATE INACTIVE

0567
0567
056C

80 26 0016 R FD
C6 06 0041 R 06

DCL08:
AND
MOV

BIOS_STATUS,NOT FORCLDCl ; RESET RESUME FLAG
DISKETTLSTATUS,MEDIA-CHANGE ; SET RETURN CODE

0571
0571

80 26 003F R OF

DCL09:
AND

0576
0577

F9
EB 06

STC
JMP

MOTOILSTATUS,NOT MOTOILOK ; ACTIVATE STARTUP DELAY
ON NEXT OPERATION
; SET INTERNAL ERROR FLAG
SHORT DCl_EXIT
; RETURN TO CAllER

NO CHANGE LINE AVAilABLE
(NOT AN INTERNAL FLAGGED ERROR)
0579
0579
057E
057F
057F
0580

C6 06 0041 R 06
F8

DCl_lO:
MOV
ClC
DCl_EXIT:
RET
DSKLCHANGE

C3

DISKETTE~TATUS,MEDIA-CHANGE

; DEFAULT TO DISKETTE CHG
RESET INTERNAL ERROR FLAG
RETURN TO CAllER

ENDP

; ***********************************
; SET DASD TYPE FOR FORMAT

; ***********************************
0580
0580
0585
0586

C6 06 0041 R 00
C3

DSKLSETDASD
PROC
NEAR
MOV
DISKETTE_STATUS,O
RET
DSKLSETDASD
ENDP

2-138 ROM BIOS

SET OKAY RETURN CODE

********************************************
GELDRLCONFIG
GET DRIVE INFORMATION SUBROUTINE

INPUT CONDITIONS: DL = DRIVE NUMBER 0-3
OUTPUT CONDITIONS: AL (LOW NI BBLE CONTAINS DRIVE TYPE)
CARRY FLAG SET I F DRIVE # OUT OF RANGE
REGISTERS MODIFIED: AX,BX,CX

********************************************
05S6

GELDRLCONFIG PROC NEAR

05S6
05SS
05SB
05SD
05SF
0592
0594
0596
059S
059A
059C
059E

B4
ES
SA
FE
E8
SA
Bl
2A
74
DO
DO
03

10
0000 E
FS
C4
0000
E7
03
CA
06
El
El
ES

05AO
05AO
05A2
05A3

24 OF
C3

MOV
CALL
MOV
INC
CALL
MOV
MOV
SUB
JZ
SHL
SHL
SHR

AH, RTCDSKLCON
GELRTCREG
BH,AL
AH
GELRTCREG
AH, BH
CL,3
CL,DL
GELDRVOI
CL,1
CL,1
AX,CL

GELDRVOI :
AND
AL,OFH
RET
GELDRY..-CONFIG ENDP

GET DRIVE INFORMATION
DRIVE 0,1 IN BH
DRIVE 2,3 IN AL
DRIVE 0-3 INFO IN AX (NIBBLES)
SET SHIFT COUNT
SUBTRACT DRIVE NUMBER
MULTIPLY BY 4 (BITS/ DRIVE)
SHI FT TO GET DRIVE INFO
SAVE ONLY LOW NIBBLE

Bootstrap Loader Interrupt Hex 19
(SYS-BOOT)
;--- INT 19H -------------------------------------------BOOT STRAP LOADER
TRACK 0, SECTOR 1 IS READ INTO THE
BOOT LOCATION (SEGMENT 0, OFFSET 7COO)
AND CONTROL IS TRANSFERRED THERE.
IF THERE IS A HARDWARE ERROR CONTROL IS
TRANSFERRED TO THE ROM BASIC ENTRY POINT.
ASSUME CS: ROMCODE, OS: DATA, ES: ABSO
SYS_BOOT PROC
NEAR
CLD
; SET FORWARD 01 RECTI ON

05A3
05A3

FC

05A4
05A7

B8 ---- R
SE os

MOV
MOV

AX, DATA
DS,AX

05A9

ES 0000

CALL

DSP_INIT

CLEAR THE SCREEN

05AC
05AF

ES 0000
75 4C

CALL
JNZ

RES_ERR_CHK
HL3

CHECK AND DISPLAY RESUME ERRORS
JUMP I F ANY RESUME ERRORS

05Bl
05Bl
05B2
05B4

FB
2B CO
SE CO

FORCE DCL SUPPORT FOR BOOTSTRAP

RETRLBOOT:
STI
SUB
AX,AX
MOV
ES,AX

ENABLE INTERRUPTS
ESTABLI SH ADDRESS I NG

RESET THE DSKT PARAMETER TABLE VECTOR

ROM BIOS 2-139

05B6
05BD

26: C7 06 0078 R 0000 E
26: 8C DE 007A R
MOV

05C2
05C5
05C8
05CA

B9 0100
BF 7COO R
2B CO
F3/ AB

05CC
05CF
05CF
05DO
05DO
05D2
05D4
05D6
05D7

B9 0002

MOV
WORD PTR DISK-POINTER, OFFSET DSKLBASE
WORD PTR DISK-POINTER+2,CS

CLEAR THE BOOT LOCATION (256 WORDS)
MOV
MOV
SUB
REP

CX,256
DI,OFFSET BOOLLOCN
AX,AX
STOSW

LOAD SYSTEM FROM DISKETTE

05D9
05DC
05DC
05DF
05El
05E4
05E7
05E9
05EA
05EC
05EF
05EF
05F1
05F3
05F6
05F8
05FA
05FD
05FD
0602
0604

MOV

CX,2

RETRY COUNTER

HO:
51

PUSH

CX

MOV
INT
JNC
POP
LOOP

AH,O
13H
HL1
CX
HO

HI:
B4
CD
73
59
E2

00
13
06
F6

EB 7C 90

JMP
HL1:
MOV
SUB
MOV

B8 0201
2B D2
BB 7COO R
B9 0001
CD 13
59
72 03
EB 76 90
B4
CD
F6
75
E2
E9

16

13
C4 80
05
D5
068C R

F6 06 0016 R 10
74 03
EB 51 90

MOV
INT
POP
JC
JMP
HL2:
MOV
INT
TEST
JNZ
LOOP
JMP
HL3:
TEST
JZ
JMP

RESET THE DISKETTE SYSTEM
DISKETTE_IO
I F ERROR, TRY AGAIN
IF RETRY EXCEEDS TWO

THEN BASIC

HBASI C
AX,201H
DX,DX
BX,OFFSET BOOLLOCN
CX ,I
13H
CX
HL2
H4
AH ,16H
13H
AH, TIMeOUT
HL3
HO
H10

READ IN THE SINGLE SECTOR
TO THE BOOT LOCATION
DRIVE 0, HEAD 0
SECTOR I, TRACK 0
DISKETTE_IO
GET RETRY COUNT
GO CHECK BOOT IF READ OKAY
CHECK FOR NO MEDIA IN DRIVE BY
CHECKING CHANGE LINE
CHECK FOR NO MEDIA IN DRIVE
IF NO MEDIA THEN SHOW ICON
ELSE GO RETRY ERROR
RETRY EXCEEDED GO SHOW BAD DISKETTE

BIOS_STATUS,BOOLF1HIT ; DID THE USER INDICATE BASIC OPTIOI
HL1
; JUMP I F NOT
HBASIC
; EXIT TO BASIC

SHOW DISKETTE
0607
0607 80 26 0016 R EF
OGOC
060C BA 1200
060 F 8D 0000 E
0612 E8 06BE R
0615
0615 BA OllF
0618 BD 0000 E
061B E8 06BE R
061E BA OE21
0621 BD 0000 E
0624 E8 06BE R
0627
0627 B3 05
0629 E8 06C4 R

HL1:
AND
H3:
MOV
MOV
CALL
H3_1 :
MOV
MOV
CALL
MOV
MOV
CALL
H3_2:
MOV
CALL

BIOS_STATUS,NOT BOOLFlHIT ; RESET Fl KEY HIT FLAG
DX ,1200H
BP,OFFSET FLICON
DSPLICON

DX POINTS TO DISPLAY POSITION
POINT THE Fl I CON

DX,OllFH
; DX POINTS TO
BP ,OFFSET SYS_DSKLICON ; POINT TO
DSPLICON
DX,OE21H
DX POINTS TO
BP ,OFFSET DSKLICON
POINT TO THE
DSPLICON
BL,05
KELWAIT

DISPLAY POSITION
THE DISKETTE ICON
DISPLAY POSITION
DISKETTE ICON

SET TIMEOUT TO 275 MSECS
WAIT FOR Fl KEY OR TIME

WAIT TIMEOUT OR Fl KEY OCCURRED
062C
062C
062D
0630
0633
0636
0637
0639

TO:
52
BA
BD
E8
5A
FE
80

OllF
0000 E
06BE R
CE
FE 06

2-140 ROM BIOS

PUSH
MOV
MOV
CALL
POP
DEC
CMP

DX
; SAVE DISKTETTE POINTER
DX,OllFH
; DX POINTS TO DISPLAY POSITION
BP ,OFFSET SYS_DSKLICON ; POINT TO THE DISKETTE ICON
DSPLICON
DX
DH
DH,06H

063C
063E
0641
0644

74
8D
E8
EB

08
0000 E
06BE R
El

JE
MOV
CALL
JMP

TO_l
BP ,OFFSET DSKLICON
DSPLICON
H3_2

YES THEN REDISPLAY ICONS
OTHERWISE JUST MOVE DISKETTE
WAIT AGAIN

CHECK FOR Fl HIT AND IF SO THEN RETRY DISKETTE
0646
0646
064B
0640
064F
0652

F6
75
B3
E8
EB

0654

E9 05Bl

06 0016 R 10
07
14
06C4 R
Cl

TO_I:
TEST
JNZ
MOV
CALL
JMP
TO_3:

BIOS_STATUS,BOOLFlHIT ; Fl KEY WAS HIT?
TO_3
NO THEN KEEP DISPLAYING ICONS
.DELAY LONGER FOR NO DISKETTE
BL,20
WAIT TIME
KELWAIT
SHORT H3_1
GO RE DISPLAY ICONS
JMP

RETRLBOOT

GO RETRY BOOT

USER WANTS BASIC OR CONTROLLER FAILURE
0657
0657
065C
065 F
0662

80
E8
E8
CD

26 0016 R EF
0000 E
0000 E
18

HBASIC:
AND
CALL
CALL
INT

BIOS_STATUS,NOT BOOLFlHIT ; RESET Fl HIT FLAG
DSP_INIT
CLEAR THE DISPLAY
DSP_FSETM
; SET MODE TARGET DISPLAY
18H
; GO TO RES I DENT BAS I C

I PL WAS SUCCESSFUL
NOW CHECK BOOLLOCN FOR NON ZERO DATA
0664
0664
0667
066A
066E
0670

BF 7COO R
B9 OOOA
26: Al 7COO
OB CO
74 lA

H4:

0672
0675
0678
067A

83 C7 02
26: 3B 05
E1 F8
74 10

067C
0681
0684
0687

80
E8
E8
EA

MOV
MOV
MOV
OR
JE

DI,OFFSET BOOLLOCN
CX,10
AX, WORD PTR BOOLLOCN
AX,AX
HI0
I F ZERO BAD BOOT RECORD

NOW CHECK NEXT 10 WORDS FOR NOT EQUAL
H4_LP: ADD
DI,2
CMP
AX, ES: [DI]
LOOPZ
H4_LP
JZ
HIO

26 0016 R EB
0000 E
0000 E
7COO ---- R

AND
CALL
CALL
JMP

; LOOP I F DATA SAME
; BAD BOOT RECORD I F ALL DATA SAME

BIOS_STATUS, NOT BOOLFIHIT+DCL_SUPPORTED ; RESET BIOS FLAGS
DSP_INIT
; CLEAR THE DISPLAY
DSP_FSETM
; CLEAR THE TARGET DISPLAY
BOOLLOCN

; SHOW DISKETTE EXITING DRIVE AND SPLITTING APART
068C

80 26 0016 R EF

HI0:

0691
0694
0694
0695
0698
069B
069E
069F
06Al
06A3

BA 0621
52
BA
BD
E8
5A
FE
B3
BD

MOV
HI0_2 :
PUSH
MOV
MOV
CALL
POP
INC
MOV
MOV

OllF
0000 E
06BE R
C6
05
0000

AND

BIOS_STATUS, NOT BOOLFIHIT ; RESET KEY HIT FLAG
DX,0621H

START INITIAL DISPLAY

DX
SAVE DISKTETTE POINTER
DX,OllFH
; DX POINTS TO DISPLAY POSITION
BP,OFFSET SYS_DSKLICON ; POINT TO THE DISKETTE ICON
DSPLICON
OX
DH
BL,05
; SET TIMEOUT TO 275 MSECS
BP ,OFFSET DSKLICON ; WITH GOOD DISKETTE ICON

CHECK FOR LAST POSITION FOR DISKETTE BEFORE BROKEN DISKETTE IS SHOWN
06A6
06A9
06AB
06AE
0680
0680
0683
0686
06B9
068B

80
75
BD
B3

FE OE
05
0000 E
28

E8
E8
80
75
E9

068E R
06C4 R
FE OE
D9
060C R

CMP
JNE
MOV
MOV
HI0_3 :
CALL
CALL
CMP
JNE
JMP

DH ,OEH
HI0_3
; YES THEN DISPLAY BROKEN ICON
BP ,OFFSET BAD_DSKLICON ; OTHERWISE SHOW BAD DISKETTE
BL,40
TIME DELAY FOR BROKEN DISKETTE
DSPLICON
KELWAIT
DH,OEH
HlO_2
H3

WAIT FOR TIME OR Fl KEY
AT LAST ICON
NO THEN KEEP MOVING DISKETTE
YES THEN SHOW DISKETTE GOING IN

ROM BIOS 2-141

DISPLAY BROKEN ICON
SYS_BOOT ENDP

06BE
06BE
06BE
06BF
06CO
06C3
06C4

DSPLICON PROC
NEAR
PUSH
CS
POP
ES
CALL
ICON_PR
RET
DSPLICON ENDP

OE
07
E8 0000 E
C3

POINT ES TO CODE SEGMENT
DISPLAY THE INSERT DISKETTE ICON

THIS CODE WAITS FOR THE Fl KEY TO BE DEPRESSED OR THE TIME LIMIT EXPIRED
WHICH EVER COMES FIRST
06C4
06C4
06C5
06C6
06C9
06CD

IE
07
BF OOIC R
8A 3E OOIA R
BO 02

06CF

E8 0000

06D2

72 22

0604
06D6
0608
06DB

B4
CD
80
74

00
16
FC 3B
00

0600
06DF
06El
06E7

3C
75
C7
E9

OC
E3
06 0072 R ABCD
0000 E

06EA
06EB
06ED
06EF

FB
E4 60
3C 3B
74 F9

KELWAIT PROC NEAR
PUSH
OS
POP
ES
; POINT ES TO DATA SEGMENT
MOV
DI,OFFSET BUFFER_TAIL; GET ADDRESS OF BUFFER_TAIL
MOV
BH,BYTE PTR BUFFEILHEAD ; GET DATA IN BUFFER HRAD
MOV
AL, 02H
COMPARE RETURN NOT EQUAL
USING BH AND DATA AT DI
CALL
EXLEVENT
WILL RETURN AFTER TIME LIMIT OR WHEN
THERE IS DATA IN KEYBOARD BUFFER
JC
KW_EXIT
I F TIMEOUT THEN JUMP

A KEY WAS HIT
MOV
INT
CMP
JE

AH,O
l6H
AH,3BH
FlBRK

OTHERWISE PURGE THE KEY
Fl KEY?
YES THEN WAIT FOR BREAK

CHECK FOR POWER ON SELF TEST LOOP MODE REQUEST
AL,OCH
; CNTL + L KEY?
KELWAIT
; NO THEN WAIT SOME MORE
RESELFLAG,LOOP_MODE ; SET POST LOOP MODE ACTIVE
POSLLOOP
; EXIT BACK TO POST

CMP
JNE
MOV
JMP

WAIT FOR BREAK OF Fl KEY
Fl BRK:
IN
CMP
JE

STI
AL,KLDATA
AL,03BH
FlBRK

ENABLE INTERRUPTS
READ KEYBOARD PORT
CHECK FOR STILL Fl KEY
WAIT UNTIL NOT Fl KEY MAKE

Fl KEY WAS DEPRESSED THEN RELEASED
06Fl

80 OE 001

R 10

OR

BIOS_STATUS,BOOLFlHIT

RETURN TO CALLER
06F6
06F6
06F7
06F7

C3

KW_EXIT:
RET
KELWAIT ENDP
ROMCODE ENDS
END

2-142 ROM BIOS

SET Fl HIT FLAG

Communications and Printer BIOS
(B14COMMO)
0000

ROMCODE SEGMENT BYTE PUBLIC
ASSUME CS:ROMCODE,DS:DATA
IDENT BI4COM,14,00

; *********************************************************************
ROUTINE-NAME:

B14COMMO

DATE LAST MODIFIED:

09/12/85

DESCRIPTIVE-NAME: INT 14H CALLS COMMUNICATION BIOS FUNCTIONS.
INT 17H CALLS PRINTER BIOS ROUTINES.
COPYRIGHT: 7396-917 (C) COPYRIGHT IBM CORP. 1985
REFER TO COPYRIGHT INSTRUCTIONS FORM NUMBER G120-2083
CHANGE LEVEL: 0.0
FUNCTIONS:
COMMO_IO
PRLIO
COM_POWER
MODULE SIZE:

COMMUNICATIONS BIOS
PRINTER BIOS
POWER ON/OFF COM DEVICES

550 BYTES (DECIMAL)

ENTRY CONDITIONS:
EXIT CONDITIONS:

REFER TO PROLOGUES
REFER TO PROLOGUES

ROUTINES IN MODULE:
COMMO_IO
PRLIO
COM_POWER
INTERNAL DATA AREAS

COMMUNICATIONS BIOS
PRINTER BIOS
POWER ON/OFF COM DEVICES
TABLES:

NONE

EXTERNALL Y REFERENCED ROUTINES:
EXTERNALL Y REFERENCED DATA AREAS:
, CHANGE ACTIVITY:

REFER TO EXTRN LIST
BIOS DATA SEGMENT

NONE

; *********************************************************************

ROM BIOS 2-143

Communications Interrupt Hex 14
(COMMO_IO)
; -----INT 14H -------------------------------------------------------COMMO_IO
THIS ROUTINE PROVIDES BYTE STREAM I/O TO THE COMMUNICATIONS
PORT ACCORDING TO THE PARAMETERS:
(AH)~O
INITIALIZE THE COMMUNICATIONS PORT
(AL) HAS PARAMETERS FOR INITIALIZATION

7
----000 001 010 011 100 101 110 111 -

6
5
BAUD RATE -110
150
300
600
1200
2400
4800
9600

4
3
-PARITY-XO - NONE
01 - ODD
11 - EVEN

2
STOP BIT
o- 1

1 - 2

1
0
--WORD LENGTH10 - 7 BITS
11 - 8 BITS

ON RETURN, CONDITIONS SET AS IN CALL TO COMMO STATUS (AH~3)
(AH)~l
SEND THE CHARACTER IN (AL) OVER THE COMMO LINE
(AL) REGISTER IS PRESERVED
ON EXIT, BIT 7 OF AH IS SET IF THE ROUTINE WAS UNABLE
TO TRANSMIT THE BYTE OF DATA OVER THE LINE.
I F BIT 7 OF AH IS NOT SET, THE REMAINDER OF AH
IS SET AS IN A STATUS REQUEST, REFLECTING THE
CURRENT STATUS OF THE LINE.
(AH)~2
RECEIVE A CHARACTER IN (AL) FROM COMMO LINE BEFORE
RETURNING TO CALLER
ON EXIT, AH HAS THE CURRENT LINE STATUS, AS SET BY THE
THE STATUS ROUTINE, EXCEPT THAT THE ONLY BITS
LEFT ON ARE THE ERROR BITS (7,4,3,2,1)
IF AH HAS BIT 7 ON (TIME OUT) THE REMAINING
BITS ARE NOT PREDICTABLE.
THUS, AH IS NON ZERO ONLY WHEN AN ERROR
OCCURRED.
(AH)~3
RETURN THE COMMO PORT STATUS IN (AX)
AH CONTAINS THE LINE STATUS
BIT 7 ~ TIME OUT
BIT 6 ~ TRANS SH I FT REGISTER EMPTY
BIT 5 ~ TRAN HOLDING REGISTER EMPTY
BIT 4 ~ BREAK DETECT
BIT 3 ~ FRAMING ERROR
BIT 2 ~ PARITY ERROR
BIT 1 ~ OVERRUN ERROR
BIT 0 ~ DATA READY
AL CONTAINS THE MODEM STATUS
BIT 7 ~ RECEIVED LINE SIGNAL DETECT
BIT 6 ~ RING INDICATOR
BIT 5 ~ DATA SET READY
BIT 4 ~ CLEAR TO SEND
BIT 3 ~ DELTA RECEIVE LINE SIGNAL DETECT
BIT 2 ~ TRAILING EDGE RING DETECTOR
BIT 1 ~ DELTA DATA SET READY
BIT 0 ~ DELTA CLEAR TO SEND
(AH) ~OTHER
NO ACTI ON TAKEN.
(DX)

~

PARAMETER INDICATING WHICH RS232 CARD (0,1 ALLOWED)

DATA AREA RS23LBASE CONTAINS THE BASE ADDRESS OF THE 8250 ON THE
CARO. LOCATION 400H CONTAINS UP TO 4 RS232 ADDRESSES POSSIBLE.
DATA AREA LABEL RS23LTIILOUT (BYTE) CONTAINS OUTER LOOP COUNT
VALUE FOR TIMEOUT (DEFAULT~l).
REGISTERS MODIFIED
AX MODIFIED ACCORDING TO PARMS OF CALL
ALL OTHERS UNCHANGED

2-144 ROM BIOS

INTERRUPTS:
INTERRUPTS ARE ENABLE UPON ROUTINE ENTRY.

; **********************************

,

PUBLICS

; **********************************
PUBLI C COMMO_IO
PUBLI C PRLIO
PUBLIC COfLPOWER

; **********************************

,

EXTERNALS

; **********************************
EXTRN
EXTRN
EXTRN
EXTRN
EXTRN
EXTRN

DDS: NEAR
BAUD_TABLE: BYTE
GELRTCREG: NEAR
GELVECTOR@:NEAR
Dll:NEAR
CHECLFOR_8250: NEAR

; **********************************
;

EQUATES

; **********************************
DSR_BIT
CTS_B IT
DTR_BIT
RTS_BIT
RCLERR
DLAB

0020
0010
0001
0002
001E
0080

EQU
EQU
EQU
EQU
EQU
EQU

20H
lOH
01H
02H
OOOllllOB
80H

RECV ERROR BITS
DIVISOR LATCH ACCESS BIT

; **********************************
START

OF

CODE

; **********************************
0000

PROC

FAR

VECTOR TO APPROPRIATE ROUTINE
0000
0001
0002
0003
0004
0005
0006
0008
OOOA
OOOC
OOOF
0013
0015

IE
52
56
57
51
53
8B
8B
01
E8
8B
OB
74

0017

8A 08

F2
FA
E6
0000 E
94 0000
02
28

83
E8
FB
72

0022
0025

80 CC 80
EB 18

0027
002A
002C
002E
0030
0032
0034
0036
0038
003A
003C

83
8A
OA
74
FE
74
FE
74
FE
75
E9

003F
0040

OS
OX
SI
01
CX
BX
SI,DX
DI,DX
SI,l
DDS
OX, RS23LBASE [S I]
DX,DX
A3

PORT NUMBER TO SI
AND 01
MAKE WORD OFFSET
BIOS DATA SEG INTO DS
GET PORT BAS E ADDRESS
TEST FOR 0 (NO PORT)
RETURN

MOV

BL ,AL

SAVE SEND CHAR IF IS ONE

EA 03
C3
E4
16
CC
47
CC
6C
CC
03
00C6 R

OR
JMP
AO:
AI:

AH ,80H
SHORT
SUB
MOV

A3

DX,3
AL, BL

NO, SET TIMEOUT ERROR
EXIT

OR
JZ
DEC
JZ
DEC
JZ
DEC
JNZ
JMP

AH,AH
A4
AH
A5
AH
A12
AH
A3
A18

RESTORE ADDRESS
RESTORE SEND CHAR IF IS ONE
TEST FOR AH=O
YES, COMMO INIT
TEST FOR AH= 1
YES, SEND CHAR
TEST FOR AH=2
YES, RECEIVE CHAR
TEST FOR AH=3
NO, EXIT
YES, GET PORT STATUS

POP
POP

BX

RESTORE REGISTERS

A3:
5B
59

SAVE SEGMENT
AND REGISTERS USED

;-----CHECK FOR PRESENSE OF 8250 AT THIS PORT
C2 03
ADD
DX,3
ADDRESS 8250 LINE CTRL REG
0000 E
CALL
CHECLFOR_8250
CARRY SET IF PRESENT
STI
SHIELDS DOWN
05
JC
AO
YES, GO ON IF PRESENT

0019
001C
001F
0020

003F

PUSH
PUSH
PUSH
PUSH
PUSH
PUSH
MOV
MOV
SHL
CALL
MOV
OR
JZ

RETURN FROM RS232

cx

ROM BIOS 2-145

0041
0042
0043
0044
0045

5F
5E
5A
IF
CF

POP
POP
POP
POP
IRET

DI
SI
DX
DS
; RETURN TO CALLER

INITIALIZE THE COMMUNICATIONS PORT

M:

0046
0046
0048
004B
004D

8A EO
83 C2 03
BO 80
EE

004E
0050
0052
0054
0058
005B
005D
0061
0062
0066
0067
0068
006B
006C
006F
0071
0073
0074
0075
0076
0078
0079

8A D4
Bl 04
D2 C2
81 E2 OOOE
BF 0000 E
03 FA
8B 94 0000 R
42
2E: 8A 45 01
EE
4A
2E: 8A 05
EE
83 C2 03
8A C4
24 IF
EE
4A
4A
BO 00
EE
EB 4B

MOV
ADD
MOV
OUT

AH,AL
DX,3
AL,DLAB
DX,AL

SAVE INIT PARMS IN AH
POINT TO 8250 CONTROL REG
ACCESS BAUD RATE BY
SETTING DLAB=1

DETERMINE BAUD RATE DIVISOR
MOV
MOV
ROL
AND
MOV
ADD
MOV
INC
MOV
OUT
DEC
MOV
OUT
ADD
MOV
AND
OUT
DEC
DEC
MOV
OUT
JMP

DL,AH
GET PARMS TO DL
CL,4
DL,CL
DX,OEH
; ISOLATE THEM
DI,OFFSET BAUD_TABLE; BASE OF TABLE
DI,DX
PUT INTO INDEX REGISTER
DX,RS23LBASE[SIJ
POINT TO HIGH ORDER OF DIV
DX
AL,CS: [DIJ+l
GET HIGH ORDER OF DIVISOR
DX,AL
SET HIGH OF DIVISOR
DX
GET LOW ORDER OF DIVISOR
AL,CS: [DIJ
SET LOW OF DIVISOR
DX,AL
ADDRESS LINE CTR REG
DX,3
GET PARMS BACK
AL,AH
AL,OIFH
STRIP OFF THE BAUD BITS
DX,AL
SET LINE CTRL TO WORD LENGTH
DX
PARITY AND # STOP BITS
DX
ADDRESS INTR ENABLE REG
AL,O
DX,AL
DISABLE INTERRUPTS (IER)
COM_STATUS
SHORT AI8

SEND CHARACTER IN (AL) OVER COMMO LINE
007B
007B
007C
007F
0081
0082
0083
0084
0086
0089
008B
008B
008C
008E
008E
0091
0093
0093
0094
0096
0099
009B
009E
009F
OOAI
00A2

AS:
50
83
BO
EE
42
42
B7
E8
74

C2 04
03

30
0158 R
08

PUSH
ADD
MOV
OUT
INC
INC
MOV
CALL
JZ

AX
;
DX,4
;
AL, DTR_BIT OR RTS_BIT
DX ,AL
;
DX
;
DX
BH, DSR_BIT OR CTS_BIT
WAILFOR_STATUS
A9

POP
MOV

CX
AL,CL

OR
JMP

AH ,80H
A3

DEC
MOV
CALL
JNZ
SUB
POP
MOV

DX
BH,DSILBIT
WAILFOR_STATUS
A7
DX,5
CX
AL,CL

OUT
JMP

DX,AL
A3

SAVE CHAR TO SEND
ADDRESS MODEM CONTROL REG
; SET DTR AND RTS
DATA TERM RDY, REO TO SEND
MODEM STATUS REGISTER
; DATA SET RDY & CLR TO SEND
ARE BOTH TRUE
YES, READY TO TRANSMIT CHAR

A7:
59
8A Cl

RELOAD DATA BYTE

A8:
80 CC 80
EB AC
A9:
4A
B7
E8
75
83
59
8A

20
0158 R
FO
EA 05
Cl

EE
EB 9B

INDICATE TIME OUT
RETURN
CLEAILTO_SEND
ADDRESS LINE STATUS REGISTER
IS TRANSMITTER READY
TEST FOR TRANSMITTER READY
NO, RETURN WITH TIME OUT SET
ADDRESS DATA PORT
RECOVER IN CX TEMPORARI LY
MOV E CHAR TO AL FOR OUT,
STATUS IN AH
OUTPUT CHARACTER
RETURN

RECEIVE CHARACTER FROM COMMO LINE
00A4
00A4
00A7

83 C2 04
BO 01

A12:
ADD
MOV

2-146 ROM BIOS

DX,4
AL,DTILBIT

MODEM CONTROL REGISTER
SET DATA TERM I NAL READY

00A9
OOAA
OOAB
OOAC
OOAE
OOBI
00B3
00B4
00B6
00B9
OOBB
OOBE
00C2
00C3

EE
42
42
B7
E8
75
4A
B7
E8
75
80
8B
EC
E9

OUT
INC
INC
MOV
CALL
JNZ
DEC
MOV
CALL
JNZ
AND
MOV
IN
JMP

20
0158 R
DB
01
0158 R
03
E4 lE
94 0000
003F R

DX,AL
OX
OX
BH,DSR_BIT
WAILFOILSTATUS
A8
OX
BH,1
WAILFOILSTATUS
A8
AH,RCLERR
OX, RS23LBASE [S I]
AL,DX
A3

MODEM STATUS REGISTER
DATA SET READY
TEST FOR DSR
NO, RETURN WITH ERROR
LINE STATUS REGISTER
RECEIVE BUFFER FULL
TEST FOR REC. BUFF. FULL
NO, SET TIME OUT ERROR
SAVE ERR ON RECV CHAR
DATA PORT
GET CHARACTER FROM LINE
RETURN

COMMO PORT STATUS ROUTINE
00C6
00C6
OOCA
OOCD
OOCE
0000
0001
0002

8B
83
EC
8A
42
EC
E9

94 0000 R
C2 05
EO
003F R

A18:
MOV
ADD
IN
MOV
INC
IN
JMP

OX, RS23LBASE [SI]
DX,5
AL,DX
AH,AL
OX
AL,DX
A3

LINE STATUS REGISTER
GET LINE CONTROL STATUS
PUT IN AH FOR RETURN
~I~

ro

~D~ ~MUS

Rffi

GET MODEM CONTROL STATUS
RETURN

COM_POWER
TURN POWER ON/OFF TO COMMO CARD
ENTRY:
BL = MODEM/ASYNC POWER BIT IN FEATURE CONFIGURATION REGISTER
( =02 FOR MODEM, =04 FOR ASYNC SEC, =05 ASYNC PRIMARY
BH = 0 - TURN POWER OFF
= 1 - TURN POWER ON
EXIT: AH = 0 AND CF = 0 IF OPERATION OKAY
AH = 80 AND CF = 1 I F POWER ON REQSTED AND NO RESP FROM 8250
WITHIN 500 MSEC
REGISTERS USED:
AX IS DESTROYED. ALL OTHERS ARE NOT MODIFIED.
INTERRUPTS:
INTERRUPTS ARE ENABLED WITHIN ROUTINE, RESTORED UPON EXIT.

--- - -- - - - - -- -- - - - -- -- -- -- - -- - ------ ---- - - - - -- ---------------- ------ --

; LOCAL EQUATES
= 03FB
0005

COM-POWER

0005
0006
0007
0008
OODA
0000
OODF
OOEl
00E4
00E6
00E8
OOEA

53
51
52
E4
BA
B4
Bl
F6
75
FE
DO
FE

7C
03FB
10
04
C3 03
06
CE
EC
C9

OOEC
OOEE
OOFO
00F2
00F4

OA
74
OA
E6
EB

FF
06
C3
7C
47

PUSH
PUSH
PUSH
IN
MOV
MOV
MOV
TEST
JNZ
DEC
SHR
DEC
CPO:
JZ
OR
OUT
JMP

EQU

3FBH

PROC

NEAR

BX
SAVE REGISTERS
CX
OX
AL,KYBD_CNTL
GET INITIAL REG CONTENTS
DX,LINE_CTL_REG
PRI PORT LINE CONTROL REG
AH,10H
SET FOR LVL 4 SYSTEM IRPT
CL,4
; PARM FOR GELVECTOR CALL
BL,SELRS23LPRIM+ACLMODEM; PRIMARY ASYNC?
CPO
DH
NO - POINT TO SEC INT 10 REG
AH,1
SET FOR LEVEL 3 SYSTEM IRPT
CL
ADJUST PARM FOR LEVEL 3 I RPT
OR

BH, BH
CPl
AL,BL
KY BD_CNTL, AL
SHORT
CP2

CHECK REQUEST CODE
JUMP I F A POWER OFF REQUEST
TURN POWER ON

BE ABLE TO HANDLE ANY PENDING INTERRUPT WHEN POWER IS TURNED OFF

ROM BIOS 2-147

00F6
00F7
00F8
OOFA
OOFC
OOFE
OOFF
0102

9C
FA
F6
22
E6
56
E8
IE

0103
0106
0108
010A
OlOB
OlOE
010F
0113

B9
BE
8B
51
88
51
C7
8C

CP1 :

PUSHF

CLI
03
C3
7C
0000
---09
OC
4C 02
04 0000 E
4C 02

SAVE FLAGS
SHI ELOS UP
TURN POWER OFF

NOT
AND
OUT
PUSH
CALL
PUSH

8L
AL, BL
KYBO_CNTL ,AL
SI
GELVECTOR@
OS

MOV
MOV
MOV
PUSH
MOV
PUSH
MOV
MOV

CX ,ABSO
OS,CX
SEGMENT THAT CONTAINS VECTOR
CX, [SIJ
CX
SAVE OFFSET
CX,[SI+2J
CX
; SAVE SEGMENT
WORD PTR[SIJ ,OFFSET D11 ; SET UP DUMMY IRPT HNDLER
[SI+2J ,CS

SAVE SI
SI CONTAINS VECTOR OFFSET
SAVE OS

UNMASK INTERRUPT LEVEL 3/4
0116
0118
011A
011C
011E

F6
E4
8A
22
E6

04
21
08
C4
21

NOT
IN
MOV
AND
OUT

AH
AL,INTA01
BL,AL
AL,AH
INTA01,AL

GET CURRENT SYSTEM IRPTS
SAVE CURRENT SYSTEM IRPTS
LEVEL 3/4 INTERRUPT
UNMASK INTERRUPT

ENA8LE SYSTEM INTERRUPTS
0120
0121
0124

F8
89 64C8
E2 FE

STI
MOV
LOOP

CX,100*MS_DELAY

SH I ELDS DOWN
DELAY lOOms

$

RESTORE INTERRUPT MASK
0126
0127
0129
0128
0120
012F

FA
E4
F6
22
OA
E6

CLI
21
04
DC
C3
21

IN
NOT
AND
OR
OUT

SHI ELDS UP
CURRENT INTERRUPTS
MASK INTERRUPT LEVEL 3/4 IF
UNMASKED DURING THIS ROUTINE

AL,INTA01
AH
BL,AH
AL,BL
INTA01,AL

MASK INTERRUPT

RESTORE INTERRUPT VECTOR
0131
0132
0135
0136

59
89 4C 02
59
89 OC

POP
MOV
POP
MOV

CX
[Sl+2J ,CX
CX
[SI],CX

0138
0139
o13A
0138

1F
5E
90
E8 15

POP
POP
POPF
JMP

DS
SI

0130

83 05

CP2 :

013F
0142

B9 64C8
E2 FE

CP2_1: MOV
LOOP

0144
0147
0149
014B

E8
72
FE
75

SHORT

RESTORE I RPT VECTOR SEGMENT
RESTORE IRPT VECTOR OFFSET

CP3

; EXIT GOOD

WAIT FOR RESPONSE FROM 8250 UP TO 500 msec
MOV

BL,5

; LOOP COUNT FOR 500 MSEC

CX,lOO*MS_OELAY ; INNER LOOP COUNT

CHECK FOR RESPONSE FROM 8250
0000
09
CB
F2

CALL

JC
DEC
JNZ

CHECKJOL8250
CP3
BL
CPL1

SETS CARRY I F PRESENT
YES, GO ON.
NO, TRY TIL TIMES UP

NO RESPONSE FROM 8250 - TIMEOUT
0140
014F
0150

B4 80
F9
EB 02

MOV
STC
JMP
RESET ASYNC

2-148 ROM BIOS

AH,80H
SHORT CP4

SET TIMEOUT
SET CARRY FLAG

0152

2A E4

CP3:

SUB

AH,AH

GOOD RETURN

0154
0155
0156
0157

5A
59
58
C3

CP4:
POP
POP
RET

POP

OX

RESTORE REGISTERS

CX
BX

COM_POWER

0158

ENDP

- --- ------- - - ---- - -- - - - -- - - - -- - - - - - - - - -WAIT FOR STATUS ROUTINE
ENTRY:
BH=STATUS BIT(S) TO LOOK FOR,
DX=ADDR. OF STATUS REG
EXIT:
ZERO FLAG ON = STATUS FOUND
ZERO FLAG OFF = TIMEOUT.
AH=LAST STATUS READ

0158
0158
015C
015C
015E
015E
015F
0161
0163
0165
0167
0169
016B
0160
016F
016F
0170
0170

---- -- -- - - - - - - - - - - - - - -- -- - - - - - - - - - - - -- -8A 90 007C R
2B C9
EC
8A
22
3A
74
E2
FE
75

EO
C7
C7
08
F5
CB
EF

OA FF
C3

WAILFOR_STATUS PROC
NEAR
MOV
BL, RS23LTIM_OUT[DI]
WFSO:
SUB
CX,CX
WFS1:
IN
AL,DX
MOV
AH,AL
AND
AL,BH
CMP
AL,BH
WFS_END
JE
LOOP
WFSI
BL
DEC
JNZ
WFSO
BH, BH
OR
WFS_END:
RET
WAILFOR_STATUS ENDP
COMMO_IO
ENDP

LOAD OUTER LOOP COUNT

GET STATUS
MOVE TO AH
ISOLATE BITS TO TEST
EXACTL Y = TO MASK
RETURN WITH ZERO FLAG ON
TRY AGAIN

SET ZERO FLAG OFF

ROM BIOS 2-149

Printer Interrupt Hex 17 (PRT_IO)
; - - - I NT 17 H - - - - - - - - - - - - - - - - - - -- - - - - - - - -- - - - - - - -- - - - - - - - - - - - - - - - - -- -PRLIO
THIS ROUTINE PROVIDES COMMUNICATION WITH THE PRINTER
INPUT
(AH) =0 PRINT THE CHARACTER IN (AL)
ON RETURN, AH=l IF CHARACTER COULD NOT BE PRINTED
(TIME OUT). OTHER BITS SET AS ON NORMAL STATUS CALL
(AH) =1 INITIALIZE THE PRINTER PORT
RETURNS WITH (AH) SET WITH PRINTER STATUS
(AH)=2 READ THE PRINTER STATUS INTO (AH)
7
6
5
4
3
2-1 0
I
I
I
I
I
I_TIMEOUT
I
I
I
I
I_UNUSED
1_ 1 I (0 ERROR
I
I
I
I
I
1_ 1 SELECTED
I
1_ 1 = OUT OF PAPER
1_ 1 = ACKNOWLEDGE
= NOT BUSY
(AH)=OTHER
NO ACTION TAKEN.
(OX) = PRINTER TO BE USED (0,1,2) CORRESPONDING TO ACTUAL
VALUES IN PRINTEILBASE AREA
DATA AREA PRINTER_BASE CONTAINS THE BASE ADDRESS OF THE PRINTER
CARD(S) AVAILABLE (LOCATED AT BEGINNING OF DATA SEGMENT,
408H ABSOLUTE, 3 WORDS).
DATA AREA PRINLTIM_OUT (BYTE) MAY BE CHANGED TO CAUSE DIFFERENT
TIME-OUT WAITS. DEFAULT=20.
IF NO PRINTER ATTACHED OR INVALID FUNCTION CODE RECEIVED, A RETURN
IS MADE WITH AH= PRINTER TIMEOUT (01)
REGISTERS USED
AH IS MODIFIED
ALL OTHERS UNCHANGED
INTERRUPTS:
INTERRUPTS ARE ENABLE UPON ROUTINE ENTRY, RESTORED ON EXIT.
0170
0170
0171
0172
0173
0174
0175
0176
0179
017B
017F
0181
0185
0187
0189
018B
0180
018F
0191
0193

FB
IE
52
56
51
53
E8
8B
8A
01
8B
OB
74
OA
74
FE
74
FE
74

0000
F2
9C 0078 R
E6
94 0008 R
02
OC
E4
10
CC
57
CC
3F

ASSUME CS: ROMCODE, OS: DATA
PRLIO PROC
FAR
STI
SHIELDS DOWN
PUSH
SAVE SEGMENT
OS
PUSH
OX
SAVE REGISTERS USED HERE
PUSH
SI
PUSH
CX
PUSH
BX
CALL
DDS
; BIOS DATA SEG TO OS
MOV
SI,DX
; GET PRINTER PARM
MOV
BL,PRINLTIM_OUT[SI] ; LOAD TIME-OUT PARM
SHL
SI,l
WORD OFFSET INTO TABLE
MOV
OX, PRINTER_BASE [SI]
GET BASE ADDRESS FOR PRINTER
OR
DX,DX
ANY PRINTERS PRESENT?
JZ
BO
NO,SIGNAL ERROR
OR
AH,AH
TEST FOR (AH) =0
JZ
B2
YES, PRINT CHAR
DEC
AH
TEST FOR (AH)=l
JZ
B8
YES, INIT PRINTER
TEST FOR (AH) =2
DEC
AH
JZ
B5
YES, GET STATUS

INVALID COMMAND OR NO PRINTER ATTACHED; SIGNAL TIMEOUT

2-150 ROM BIOS

0195

B4 01

BO:

MOV

AH,OlH

NO, RETURN TIMEOUT STATUS

COMMON EXIT FOR ALL PRINTER FUNCTIONS
0197
0198
0199
019A
019B
019C

5B
59
5E
5A
IF
CF

B1 :

POP
POP
POP
POP
POP
IRET

BX
CX
SI
DX
DS

RECOVER REGISTERS
RECOVER REGISTERS

PRINT THE CHARACTER IN (AL)
019D
019D
019E

B2 :
50
42

PUSH
INC

SAVE VALUE TO PRINT
POINT TO STATUS PORT

AX
DX

CHECK FOR PRINTER BUSY
019F
01AO
01A2

IN

EC
A8 80
75 23

AL,DX
AL,NOLBUSY
B4

TEST
JNZ

GET STATUS
IS PRINTER CURRENTLY BUSY?
NO THEN OULSTROBE

NOTIFY OPERATING SYSTEM THAT A PRINTER BUSY WAIT IS IN AFFECT
01A4
01A5
01A8
01AA
01AC
01AC
01AE
01AE
OlAF
01B1
01B3
01B5
01B7
01B9
01BB
01BD

F8
B8 90FE
CD 15
72 13

CLC
MOV
INT
JC

AX,90FEH
15H
B3_2

JUMP I F TIMEOUT OCCURRED

B3 :
2B C9
EC
8A
A8
75
E2
A8
74
FE
75

SUB
BL1:
IN
MOV
TEST
JNZ
LOOP
TEST
JZ
DEC
JNZ

EO
80
12
F7
08
07
CB
ED

CX, CX

WAIT_BUSY

AL,DX
AH,AL
AL,NOLBUSY
B4
B3_1
AL, NOLERROR
B3_3
BL
B3

GET STATUS
STATUS TO AH ALSO
IS PRINTER CURRENTLY BUSY
NO, OULSTROBE
YES, TRY AGAIN
CHECK FOR I (0 ERROR
YES, JUMP
FINISHED 500 MS DELAY?
NO, DO AGAIN

BUSY TIMEOUT OCCURRED
01BF
01BF
01C2
01C2
01C5

***INT 15 DEVICE BUSY
FUNCTION 90 PRINTER ID

BL2:
OR
B3_3:
AND
JMP

80 CC 01
80 E4 F9
EB 19

YES, TIMEOUT

AH,l

SET ERROR FLAG

AH,OF9H
SHORT B7

TURN OFF THE OTHER BITS
RETURN WITH ERROR FLAG SET

PRINTER IS NOT BUSY SO STROBE OUT CHARACTER
01C7
01C8
01C9
01CA
01CB

58
4A
EE
42
50

01CC
01CE
01CF
01DO
0102
01D3

BO OD
42
EE
24 FE
EE
58

POP

B4 :

AX

GET VALUE TO PRINT
POINT TO DATA REG
OUTPUT VALUE TO DATA REG
POINT TO STATUS PORT
SAVE VALUE TO PRINT

DEC
OUT
INC
PUSH

DX
DX,AL
DX
AX

MOV
INC
OUT
AND
OUT
POP

; OULSTROBE
AL,SELECT+NO_INIT+STROBE ; SET THE STROBE HIGH
OX
STRB IS BIT 0 OF PORT C
DX,AL
AL,NOT STROBE
SET THE STROBE LOW
DX,AL
AX
RECOVER THE OUTPUT CHAR

PRINTER STATUS
01D4
01D4
0105
01D5
0109

B5:
50

PUSH
B6:

8B 94 0008 R
42

MOV
INC

DX, PRINTEILBASE [S I]
OX

ROM BIOS 2-151

01DA
01DB
0100
OlEO
OlEO
01El
01E3
01E6

EC
8A EO
80 E4 F8

IN
MOV
AND

AL,DX
AH,AL
AH ,OF8H

POP
MOV
XOR
JMP

OX
AL,DL
AH ,ACK+NOLERROR
B1

B7 :
5A
8A C2
80 F4 48
EB AF

GET PRINTER STATUS
TURN OFF UNUSED BITS
STATUS_SET
RECOVER AL REG
GET CHARACTER INTO AL
FLIP A COUPLE OF BITS
RETURN FROM ROUTINE

INITIALIZE THE PRINTER PORT
01E8
01E8
01 E9
OlEA
01EB
OlEO
01EE

88:
50
42
42
BO 08
EE
B9 0352

PUSH
INC
INC
MOV
OUT
MOV

AX
OX
OX
AL,SELECT
DX,AL
CX ,850

SAVE AL
POINT TO OUTPUT PORT
SET INIT LINE LOW, SLCT HIGH
SET MAX TIME CNT TO 4.25 SEC

WAIT FOR UP TO 4 SECONDS FOR COMPACT PRINTER TO DROP BUSY
I F PARALLEL PRINTER THEN JUST WAIT 5 MSECS AND EXIT
01F1
01 F2
01F5
01F7
01F8
01FB

51
B9
E2
59
83
75

PUSH
CX
BlO:
CX,5*MS_DELAY
MOV
LOOP
$
POP
CX
OX, CPRT _MODE
CMP
JNE
B11

050A
FE
FA 7A
1B

DELAY FOR 5 MSECS
COMPACT PRINTER?
EX IT LOOP I F NOT

WAIT FOR COMPACT PRINTER TO DROP BUSY
01FD
01FF
0201

E4 79
A8 02
El EE

0203
0205
0208
020A
020C

B3
B9
E2
FE
75

IN
TEST
LOOPZ
DELAY

08
FBF4
FE
CB
F7

AL, CPRLSTAT
AL,02
B10

, CHK FOR BUSY DROP IN STATUS
; NOT BUSY?
; LOOP I F STILL BUSY

SECONDS AFTER BUSY DROP TO LET PRINTER MOVE HEAD TO HOME
MOV
BL, SELECT
BlO_1: MOV
CX, 250*MS_DELAY
LOOP
$
DEC
BL
JNE
B10_1

ACTIVATE PRINTER POWER
020E
0210

BO OC
EE

MOV
OUT

AL,SELECT+NO_INIT
DX,AL

; NO INTERRUPTS, NON AUTO LF,
; SELECT AND INIT LINE HIGH

DELAY 60 MSEC AFTER PRINTER POWER HAS BEEN ENABLED
0211
0214
0216

B9 3C78
E2 FE
EB BD

0218
021A
021B
0210

BO OC
EE
EB B8

0210

MOV
LOOP
JMP
B11:
OUT
JMP
PRLIO

CX,60*MS_DELAY
SHORT B6
MOV

EXIT ROUTINE

AL, SELECT+NO_I NIT ; NO I RPTS, NON AUTO LF,
DX,AL
; SELECT AND INIT LINE HIGH
SHORT B6
; PRLSTATUS_l
ENDP

ROMCODE ENDS
END

2-152 ROM BIOS

60 MSEC DELAY

$

Time of Day (B15TOD)
0000

ROMCODE SEGMENT BYTE PUBLIC
ASSUME CS:ROMCODE,DS:DATA
IDENT
BI5TOD,15,00

; *********************************************************************
MODULE-NAME :

B15TOD

DATE LAST MODIFIED:

9/12/85

DESCRIPTIVE-NAME: TIME OF DAY SUPPORT
COPYRIGHT: 7396-917 (C) COPYRIGHT IBM CORP. 1985
REFER TO COPYRIGHT INSTRUCTIONS FORM NUMBER G120-2083
CHANGE LEVEL: 0.0
FUNCTION:

TOD_PROC
SELTOD
TMRO_INT8
INITIALIZLSTATUS
RTCLTST

MODULE SIZE:

ALLOW READ/SET OF REAL TIME CLOCK
INITIALIZE TIMER DATA AREA
SYSTEM TIMER INTERRUPT HANDLER
INITIALIZE REAL TIME CLOCK
TEST REAL TIME CLOCK FOR TIME UPDATE

936 BYTES

ENTRY CONDITIONS:
REFER TO ROUTINE PROLOGUES
EXIT CONDITIONS:
REFER TO ROUTINE PROLOGUES
ROUTINES IN MODULE:
TOD_PROC
SELTOD
TMRO_INT8
INTERNAL DATA AREAS

ALLOW READ/SET OF REAL TIME CLOCK
INITIALIZE TIMER DATA AREA
TIMER 0 INTERRUPT HANDLER
TABLES:

NONE

EXTERNALL Y REFERENCED ROUTINES: REFER TO EXTRN LIST
EXTERNALL Y REFERENCED DATA AREAS:
CHANGE ACT I VITY:

TIMER DATA AREA

NONE

; *********************************************************************
*****************************************************************
EXTERNAL

REFERENCES

*****************************************************************
EXTRN
EXTRN
EXTRN
EXTRN
EXTRN
EXTRN

GELRTCNMI: NEAR
PULRTCNMI : NEAR
DDS:NEAR
ENABLE_NMI :NEAR
DISABLLNMI: NEAR
KB_NOISE:NEAR

ROM BIOS 2-153

*****************************************************************
PUBLICS

DECLARATION

*****************************************************************
PUBLIC
PUBLIC
PUBLIC
PUBLIC
PUBLI C

TOD_PROC
SELTOD
TMRO_INT8
INITIALIZE-STATUS
RTCLTST

; *****************************************************************
;*

S TAR T 0 F COD E

*

; *****************************************************************

Time of Day Interrupt Hex lA
(TOD_PROC)
SUBTTL

TOD_PROC

; *********************************************************************
ROUTINE-NAME:

TOD_PROC

([NT IAH)

FUNCTION:
ALLOW REAL TIME CLOCK TO BE READ/SET
ALLOW TIMER DATA AREA TO BE READ/SET
ENTRY AND EXIT CONDITIONS:
1.

READ THE CURRENT CLOCK SETTING
(TIMER DATA AREA)
INPUT CONDITIONS:
AH = OOH
NORMAL EXIT CONDITIONS: AL = 0 IF TIMER HAS NOT PASSED
24 HRS SINCE LAST READ.
<>0 I F ON ANOTHER DAY.
ex = HIGH WORD OF COUNT
OX = LOW WORD OF COUNT
REGISTERS MODIFIED:
AL, CX, OX

2.

PURPOSE OF ENTRY:
INPUT CONDITIONS:

PURPOSE OF ENTRY:

REGISTERS MODIFIED:

SET CURRENT CLOCK (TIMER DATA AREA)
AH
OIH
CX = HIGH WORD OF COUNT
OX = LOW WORD OF COUNT
AH

3.

PURPOSE OF ENTRY:
READ TIME OF REAL TIME CLOCK
INPUT CONDITIONS:
AH = 02H
NORMAL EXIT CONDITIONS: CH
HOURS IN BCD
CL
MINUTES IN BCD
DH
SECONDS IN BCD
DL
00 - NOT DAYLIGHT SAVINGS
01 - DAYLIGHT SAVINGS
ERROR EXIT CONDITIONS:
CF FLAG SET IF CLK NOT OPERATING
REGISTERS MODIFIED:
AX, CX, OX

4.

PURPOSE OF ENTRY:
INPUT CONDITIONS:

2-154 ROM BIOS.

SET TIME OF REAL TIME CLOCK
AH
03H
CH
HOURS IN BCD
CL
MINUTES IN BCD
DH
SECONDS IN BCD
DL
I IF DAYLIGHT SAVINGS OPTION.
ELSE O.
RESTRICTIONS:
DL SHOULD = I OR = 0 ONLY.
DL MADE TO = ITS OWN BITO.
REGISTERS MODIFIED:
AX

5.

PURPOSE OF ENTRY:
READ DATE FROM REAL TIME CLOCK
INPUT CONDITIONS:
AH = 04H
NORMAL EXIT CONDITIONS: CH = CENTURY IN BCD (19H OR 20H)
Cl = YEAR IN BCD
DH = MONTH IN BCD
Dl = DAY OF MONTH IN BCD
ERROR EXIT CONDITIONS:
CF FLAG SET IF ClK NOT OPERATING
REGISTERS MODIFIED:
AX, CX, OX

6.

PURPOSE OF ENTRY:
INPUT CONDITIONS:

REGISTERS MODIFIED:

SET DATE OF REAL TIME CLOCK
AH = 05H
CH = CENTURY IN BCD (19H OR 20H)
Cl = YEAR IN BCD
DH = MONTH I N BCD
Dl = DAY OF MONTH IN BCD
AX

7.

SET ALARM TIME OF REAL TIME CLOCK
AH = 06H
CH = HOURS I N BCD
Cl = MINUTES IN BCD
DH = SECONDS I N BCD
NORMAL EXIT CONDITIONS: CF FLAG = 0
ERROR EXIT CONDITIONS:
CF FLAG SET IF ClK NOT OPERATING
CF FLAG SET I F ALARM ALREADY ENABLED
RESTRICTIONS:
THE USER MUST CODE A RTN AND PUT
CORRECT ADDRESS IN THE VECTOR TABLE
FOR INT 4AH.
REGISTERS MODIFIED:
AX

8.

PURPOSE OF ENTRY:
RESET THE ALARM
INPUT CONDITIONS:
AH = 07H
NORMAL EXIT CONDITIONS: NONE
ERROR EXIT CONDITIONS:
NONE
REGISTERS MODIFIED:
AX

9.

PURPOSE OF ENTRY:
INPUT CONDITIONS:

SET ALARM TIME OF RTC FOR POWER ON
AH = 08H
CH = HOURS IN BCD
Cl = MINUTES IN BCD
DH = SECONDS I N BCD
NORMAL EXIT CONDITIONS: CF FLAG = 0
ERROR EXIT CONDITIONS:
CF FLAG SET IF ClK NOT OPERATING
CF FLAG SET I F ALARM ALREADY ENABLED
REGISTERS MODIFIED:
AX

10.

PURPOSE OF ENTRY:
READ ALARM TIME OF RTC AND STATUS
INPUT CONDITIONS:
AH = 09H
NORMAL EXIT CONDITIONS:
CH = HOURS I N BCD
Cl = MINUTES IN BCD
DH = SECONDS IN BCD
Dl = ALARM STATUS
00 - ALARM NOT ENABLED (AI E=O)
01 - ALARM ENABLED BUT Will NOT POWER
ON SYSTEM (AIE=l, EN_PON-'llRM=O)
02 - ALARM ENABLED AND WILL POWER ON
SYSTEM (AIE=l, EN_PON_AlRM=l)
ERROR EXIT CONDITIONS:
CF FLAG SET IF CLK NOT OPERATING
REGISTERS MODIFIED:
AX, CX, OX

NOTE:

INTERRUPTS:

PURPOSE OF ENTRY:
INPUT CONDITIONS:

FUNCTION CALLS WITH AH NOT EQUAL TO THE
ABOVE RESULT IN NO OPERATION
WITH THE CARRY FLAGE BEING CLEARED
FUNCTIONS 0, 1
FORCED OFF (CLI)
FUNCTIONS 2 - 9 FORCED ON (STI)
ON EXIT RESTORED AS WERE

ROM BIOS 2-155

I NTERNALL Y REFERENCED ROUTINES:
INITIALIZE_STATUS
INITIALIZES RTC REGISTERS A THRU D
UPD_IN_PR
WAITS UNTIL CLOCK NOT BEING UPDATED
SELALRM
SETS RTC ALARM TIME BYTES AND ENABLES
THE RTC ALARM
EXTERNALL Y REFERENCED ROUTI NES:
DDS
GELRTCNMI
PULRTCNMI
ENABLCNMI
DISABLE_NMI

ESTABLISH SEGMENT
ADDRESSES AND READS A RTC REGISTER
AH = REGISTER #, AL = DATA READ
ADDRESSES AND PUTS A RTC REGISTER
AH = REGISTER #, AL = DATA PUT
ENABLE NMI' S
DISABLE NMI'S

*********************************************************************
= 0001
0000
0000
0001
0002

SELCF
TOD_PROC
STI
PUSH
CALL

FB
IE
E8 0000

01H

EQU

PROC

FAR
INTERRUPTS ON FOR TIMER
SAVE SEGMENT
SET DATA SEGMENT

OS
DDS

;-------CHECK FOR FUNCTION REQUESTS 0 AND 1- - - - - - - - - - - - - - - - - - - - - - - - -RTCCHKO:
OR
JZ
DEC
JZ
CMP

0005
0005
0007
0009
OOOB
0000

OA
74
FE
74
80

0010
0012
0015

73 06
E8 0000 E
EB 40 90

E4
2B
CC
3A
FC 09

AH,AH
RTCO
AH
RTCI
AH,9
TOD_NRET
DISABLE_NMI
RTCCHKl

JAE
CALL
JMP

I F PARAMETER AH=O
THEN READ TIMER
I F PARAMETER AH=l
THEN SET TIME
CHECK IF VALID DATA PASSED IN AH
(0 <= AH <= 9)
NORMAL RETURN IF NOT VALID
DISABLE NMI' S
GO CHECK FOR OTHER FUNCTIONS

; ---- --- TOD_PROC NORMAL RETURN- ---- ----------------------------------0018
0018
OOIB
001B
ODIC
0010
OOIE
0020

FB
IF
55
8B EC
80 66 06 FE

0024
0025

50
CF

E8 0000

TOD_NRET:
CALL
TOO_RET:
STI
POP
PUSH
MOV
AND
POP
IRET

ENABLE_NMI

RE-ENABLE NMI' S

ENABLE INTERRUPTS FOR TIMER
OS
RECOVER SEGMENT
BP
BP ,SP
BYTE PTR SS: [BP+6], NOT SELCF
RST CARRY OF FLAGS I N STACK
BP
; RETURN WITH GOOD CODE (CF=O)

; ------- TOD_PROC ERROR RETURN---- -------- -------------- - ------- ---- --0026
0026
0029
002A
002B
002C
002E
0032
0033

E8 0000
FB
IF
55
8B EC
80 4E 06 01
50
CF

TOD_ERET:
CALL
STI
POP
PUSH
MOV
OR
POP
IRET

;-------G E T
0034
0034
0035
0038
0030
0041
0045

FA
AO
C6
8B
8B
EB

0070 R
06 0070 R 00
OE 006E R
16 006C R
04

T

RTCO:
CLI
MOV
MOV
MOV
MOV
JMP

;-------S E T

2-156 ROM BIOS

ENABLE_NMI
ENABLE INTERRUPTS FOR TIMER
OS
RECOVER SEGMENT
BP
BP, SP
BYTE PTR 55: [BP+6-,SELCF ; SET CARRY OF FLAGS
BP
; RETURN WITH ERROR CD (CF=l)
MER

OAT A----- FUNCTION DOH

AL, TIMER_OFL
TIMER_OFL,O
CX, TIMEILHIGH
OX, TIMEILLOW
TOD_RET
T

- ----- - -- - - - - - --

DISABLE INTERRUPTS FOR READ
GET OVERFLOW, AND
RESET THE FLAG
CX RETURNS TIMER_HIGH DATA
OX RETURNS TIMER_LOW DATA
NORMAL RETURN WITH TMR DATA

M E R--------------- FUNCTION

OlH --------------

0047
0047
0048
004C
0050
0055

FA
89
89
C6
EB

16 006C R
OE 006E R
06 0070 R 00
C4

RTC1:
CLI
MOV
MOV
MOV
JMP

TIMEILLOW, OX
TIMEILHIGH,CX
TIMEILOFL,O
TOO_RET

DISABLE INTERRUPTS FOR READ
SET TIMEILLOW = TO PARAM OX
SET TIMER_HIGH = TO PARAM CX
RESET OVERFLOW
NORMAL RTN AFTER SETTING TMR

; -------CHECK FOR FUNCTION REQUESTS 2 AND 3-------------------------0057
0057
0059
005B
0050
005F

FE
74
FE
74
E9

CC
07
CC
20
OOEE R

RTCCHK1:
DEC
JZ
DEC
JZ
JMP

;-------G E T
0062
0062
0065
0067
0069
0069
006B
006E

AH
RTC2
AH
RTC3
RTCCHK2

IF PARAMETER
THEN GET RTC
I F PARAMETER
THEN SET RTC
GO CHECK FOR

AH=2
TIME
AH=3
TIME
OTHER FUNCTIONS

TIM E--------- FUNCTION 02H ---------------

RT

UPD_IN_PR
RTC2A
TOD_ERET

CLOCK OPERATING?
YES, GO AROUND
NO, ERROR RETURN

B4 00
E8 0000
8A FO

RTC2:
CALL
JNC
JMP
RTC2A:
MOV
CALL
MOV

AH,RTCTSEC
GELRTCNMI
DH,AL

ADDRESS AND
GET RTCTSEC (RegO)
DH RETURNS TSEC DATA

0070
0072
0075

B4 02
E8 0000
8A C8

MOV
CALL
MOV

AH,RTCTMIN
GELRTCNMI
CL ,AL

ADDRESS AND
GET RTCTMIN (Reg2)
CL RETURNS TMIN DATA

0077
0079
D07C

B4 04
E8 0000
8A E8

MOV
CALL
MOV

AH,RTCTHRS
GELRTCNMI
CH,AL

ADDRESS AND
GET RTCTHRS (Reg4)
CH RETURNS THRS DATA

007E
0080
0082
0085
0087
0089
008A

2A
B4
E8
A8
74
42
EB

E8 OlFE R
73 02
EB BD

02
DB
0000
01
01

SUB
DL,DL
MOV
AH,RTCMODE
CALL
GELRTCNMI
TEST
AL,SELDAYLIGHT
JZ
RTC2B
INC
OX
TOD_NRET
RTC2B: JMP

8C

;-------S E T

RT C

SET NOT -DAYLIGHT -SAVINGS
GET RTCMODE (RegB)
DAYLIGHT SAVINGS SET?
NO, JUMP AROUND
YES, SET DL=Ol
NORMAL RETURN WITH TIME

TIM E--------- FUNCTION 03H ----------------

008C
008C
008F
0091

E8 OlFE R
73 03
E8 01E5 R

RTC3:
CALL
JNC
CALL

UPD_IN_PR
RTC3A
IN ITIALI ZE_STATUS

CLOCK OPERATING?
YES, GO AROUND
NO, INIT CONTROL/STATUS
REG. S (A-D)

0094
0094
0096
0098

B4 00
8A C6
E8 0000

RTC3A:
MOV
MOV
CALL

AH,RTCTSEC
AL,DH
PULRTCNMI

ADDRESS AND SET
RTCTSEC (RegO) = TO
TSEC PARAMETER, CH

009B
0090
009F

B4 02
8A C1
E8 0000

MOV
MOV
CALL

AH,RTCTMIN
AL,CL
PULRTCNMI

ADDRESS AND SET
RTCTMIN (Reg2) = TO
TMIN PARAMETER, CL

00A2
00A4
00A6

B4 04
8A C5
E8 0000

MOV
MOV
CALL

AH,RTCTHRS
AL,CH
PULRTCNMI

ADDRESS AND SET
RTCTHRS (Reg4) = TO
THRS PARAMETER, CH

00A9
OOAB
OOAE

B4 DB
E8 0000
24 71

MOV
CALL
AND

OOBO
ODB3
00B5
00B7

80
OA
OC
E8

AND
OR
OR
CALL

ADDRESS AND
AH,RTCMODE
; GET RTCMODE (RegB)
GELRTCNMI
AL ,AI E_ENABLE+U I E_ENABLE+P I LENABLE+S ELDAYL IGHT
RESET UNUSED FLAGS
CLEAR ALL OTHERS.
DL,SELDAYLIGHT
SET DL = TO ITS BITO
AL,DL
IF DSE=l, KEEP, ELSE DSE=DL.
AL,SEL24HR
TURN ON 24HR-MODE
ADDR AND SET RTC_MODE (REG B)
PULRTCNMI

E2 01
C2
02
0000

ROM BIOS 2-157

OOBA
OOBC
OOBF
OOCl
00C4

B4
E8
24
E8
E9

OE
0000
7F
0000 E
0018 R

MOV
CALL
AND
CALL
JMP

; -------G E T

00C7
00C7
OOCA
OOCC
OOCF
OOCF
00D1
00D4

B4 07
E8 0000 E
8A DO

00D6
00D8
OODB

AH,RTCDIALSTAT
GELRTCNMI
AL,NOT RTCTIMLBAD
PULRTCNMI
TOD_NRET
R T C

ADDRESS AND
GET RTCDIAG_STAT (RegE)
RESET RTCTIME_BAD FLAG (=0)
PUT BACK RTCDIAG_STAT (RegE)
NORMAL RTN AFTER SETTING TIME

D A T E--------- FUNCTION 04H ----------------

RTC4:
CALL
JNC
JMP
RTC4A:
MOV
CALL
MOV

UPD_IN_PR
RTC4A
TOD_ERET

CLOCK OPERATING?
YES, GO AROUND
NO, ERROR RETURN

AH,RTCMDAY
GELRTCNMI
DL,AL

ADDRESS AND
GET RTCMDAY (Reg?)
DL RETURNS DAY OF MON. DATA

B4 08
E8 0000
8A FO

MOV
CALL
MOV

AH,RTCMON
GELRTCNMI
DH,AL

ADDRESS AND
GET RTL...MON (Reg8)
DH RETURNS MONTH DATA

OODD
OODF
00E2

B4 09
E8 0000
8A C8

MOV
CALL
MOV

AH,RTCYEAR
GELRTCNMI
CL,AL

ADDRESS AND
GET RTCYEAR (Reg9)
CL RETURNS YEAR DATA

00E4
00E6
00E9

B4 32
E8 0000
8A E8

MOV
CALL
MOV

AH, RTCCENTURY
GELRTCNMI
CH ,AL

ADDRESS AND
GET RTCCENTURY (Reg50/32H)
CH RETURNS CENTURY DATA

OOEB

E9 0018 R

JMP

TOD_NRET

NORMAL RETURN WITH DATE

E8 01FE R
73 03
E9 0026 R

:-------CHECK FOR FUNCTION REQUESTS 4, 5, AND 6---------------------OOEE
OOEE
OOFO
00F2
00F4
00F6
00F8
OOFA

FE
74
FE
74
FE
74
EB

RTCCHK2:
DEC
JZ
DEC
JZ
DEC
JZ
JMP

CC
D5
CC
07
CC
3B
59 90

;-------S E T
OOFD
OOFD
0100
0102

AH
RTC4
AH
RTC5
AH
RTC6
RTCCHK3

RT C

I F PARAMETER
THEN GET RTC
I F PARAMETER
THEN SET RTC
I F PARAMETER
TH EN SET RTC
GO CHECK FOR

AH=4
DATE
AH=5
DATE
AH=6
ALARM
REMAINING FUNCT

D A T E--------- FUNCTION 05H ----------------

E8 01FE R
73 03
E8 01E5 R

RTC5:
CALL
JNC
CALL

UPD_IN_PR
RTC5A
IN ITIALI ZE_STATUS

CLOCK OPERATING?
YES, GO AROUND
NO, INIT CONTROL/STATUS
REG.S (A-D)

0105
0105
0107
0109

B4 06
BO 00
E8 0000

RTC5A:
MOV
MOV
CALL

AH,RTCWDAY
AL,O
PULRTCNMI

ADDRESS AND
CLEAR
RTCWDAY (Reg6)

OlOC
OlOE
0110

B4 07
8A C2
E8 0000

MOV
MOV
CALL

AH,RTCMDAY
AL,DL
PULRTCNMI

ADDRESS AND SET
RTCMDAY (Reg?) = TO
DAY OF MON. PARAMETER, DL

0113
0115
0117

B4 08
8A C6
E8 0000

MOV
MOV
CALL

AH, RTC...MON
AL,DH
PULRTCNMI

ADDRESS AND SET
RTC...MON (Reg8) = TO
MONTH PARAMETER, DH

OllA
OllC
OllE

B4 09
8A Cl
E8 0000 E

MOV
MOV
CALL

AH,RTCYEAR
AL,CL
PULRTCNMI

ADDRESS AND SET
RTC YEAR (Reg9) = TO
YEAR PARAMETER, CL

0121
0123
0126
0128

B4
E8
24
E8

OB
0000
7F
0000

MOV
CALL
AND
CALL

AH,RTCMODE
GELRTCNMI
AL,NOT SELCLOCK
PULRTCNMI

ADDRESS AND
GET RTCMODE (RegB)
TURN OFF SET -MODE ONLY
ADDR AND SET RTC...MODE (RegB)

012B
012D
012F

B4 32
8A C5
E8 0000

MOV
MOV
CALL

AH, RTCCENTURY
AL,CH
PULRTCNMI

ADDRESS AND SET
RTCCENTURY (Reg50/32H) = TO
CENTURY PARAMETER, CH

2-158 ROM BIOS

0132

E9 0018 R

,

0135
0135
0138
013B
0130
0140
0140

E8
3D
75
E9

01A9 R
0000
03
0026 R

E9 0018 R

TOD_NRET

JMP

;-------S E T

R T C

RTC6:
CALL
CMP
JNE
JMP
RTC6A:
JMP

; IiML RTN AFTER SETTING DATE

A L A R M------- FUNCTION 06H ----------------

SELALRM
AX,O
RTC6A
TOD_ERET

SET ALARM REGISTERS
GOOD RELCODE RETURNED?
.•. YES, CONTINUE.
... NO, ERROR RET.

TOD_NRET

; -------R ESE T
RTC_7:
MOV
CALL
AND
CALL

R T C

NtoIL RTRN AFTER SETTING ALARM
A L A R M--- FUNCTION 07H ----------------

0143
0143
0145
0148
014A

B4
E8
24
E8

0140

80 26 OOAO R F8

AND

RTCWAILFLAG,NOT

0152

E9 0018 R

JMP

TOD_NRET

OB
0000
OF
0000

AH,RTCMODE
GELRTCNMI
AL,NOT AIE_ENA8LE
PULRTCNMI

ADDRESS AND
GET RTCMODE (Reg8)
RESET ALARM INT ENA8LE
ADDR & PUT RTCMODE (RegB)
PON~LRM_PEND

; RST PWR BY ALARM

NML RTRN RESETTING ALARM

;-------CHECK FOR FUNCTION REQUESTS 7, 8, AND 9---------------------0155
0155
0157
0159
0158
0150

FE
74
FE
74
EB

RTCCHK3 :
DEC
JZ
DEC
JZ
JMP

CC
EA
CC
03
14 90

AH
RTC7
AH
RTC8
RTC9

IF PARAMETER AH=7
THEN RESET ALARM
I F PARAMETER AH=8
THEN SET RTC ALARM POWER-ON
PARAM AH=9, GET ALARM TIME &
STATUS

RT C
A L ARM
FOR
POW E R o N----------FUNCTION 08H
RTC8:
CALL
SET~LRM
; SET ALARM REGISTERS
CMP
AX,O
; GOOD RELCODE RETURNED?
RTC8A
JNE
; ... YES, CONTINUE.
TOD_ERET
JMP
; .•. NO, ERROR RET.
RTC8A: OR
RTCWAI T_FLAG, PON~LRtLPEND
; SET PWR ON BY ALARM PENDING
TOD_NRET
JMP
; NML RTRN AFTER SETTING ALARM

;-------S E T
0160
0160
0163
0166
0168
016B

E8
3D
75
E9
80

0170

E9 0018 R

01A9 R
0000
03
0026 R
OE OOAO R 04

;-------G E T

RT C

S TAT U S--------------A L ARM
AND
FUNCTI ON 09H

0173
0173
0176
0178
017B
017B
0170
0180

B4 01
E8 0000
8A FO

RTC9:
CALL
JNC
JMP
RTC9A:
MOV
CALL
MOV

0182
0184
0187

84 03
E8 0000
8A C8

MOV
CALL
MOV

AH,RTC~MIN

0189
0188
018E

84 05
E8 0000
8A E8

MOV
CALL
MOV

AH,RTC~HRS

0190
0192
0194
0197
0199
0198
0190

2A
84
E8
A8
74
FE
F6

SUB
MOV
CALL
TEST
JZ
INC
TEST

DL,DL
SET DL TO ZERO
AH,RTCMODE
ADDRESS AND
GET RTCMODE (Reg8)
GELRTCNMI
RTC ALARM DISABLED (AIE=O)?
AL,AIE_ENA8LE
YES, RETURN DL=O
EXIT9
DL
; DL=l
RTCWAI T_FLAG, PON~LRtLPEND

E8 01FE R
73 03
E9 0026 R

02
OB
0000
20
08
C2
06 OOAO R 04

UPD_IN_PR
RTC9A
TOD_ERET

CLOCK OPERATING?
YES, GO AROUND
NO, ERROR RETURN

AH,RTC~SEC

ADDRESS AND
GET RTC~SEC (Reg1)
DH RETURNS ASEC DATA

GELRTCNMI
DH,AL
GELRTCNMI
CL,AL
GELRTCNMI
CH,AL

ADDRESS AND
GET RTC~MIN (Reg3)
CL RETURNS AMIN DATA
ADDRESS AND
GET RTC~HRS (Reg5)
CH RETURNS AHRS DATA

ROM BIOS 2-159

01A2
01A4
01A6

74 02
FE C2
E9 0018 R

JZ
INC
EXIT9 :

EXIT9
DL
TOD_NRET

JMP

IS PWR ON BY ALARM PENDING?
NO, RETURN DL=l
YES, RETURN DL=2
NML RTRN W/ALRM TIME & STAT

- - - - - --SU BROUT I NES- - - - - - - -- - - - - -- - - -- - - - - - -- - - - - - - - - - - - -- -- - -- - - - - --

-- -- - - - - - -- - - - - - - -- - - - - - - - - - - - - - - - - -- - - - - - - - - - - - - - - - - - - - - -- - - - - - ---SELALARM
IF RTC ALARM IS DISABLED AND THE CLOCK IS OPERATING, SET
THE ALARM TIME AND ENABLE THE RTC ALARM.

FUNCTION:
INPUT:

DH = ALARM SECONDS IN BCD
CL = ALARM MINUTES IN BCD
CH = ALARM HOURS I N BCD

OUTPUT:

AX = 0 ERROR RETURN CODE
AX <> 0 GOOD RETURN CODE

REGISTERS MODIFIED:

AX

- --- - -- - - - - - - - - - -- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -- - - - - - - - - - - - - - - - -- -01A9
01A9
01AB
01AE
01BO
01B2
01B4
01B5
01B5
OlB8
01BA

E8 01FE R
73 03
E8 OlE5 R

SELALRM
MOV
CALL
TEST
JZ
XOR
RET
CONTI:
CALL
JNC
CALL

01BD
01BD
01BF
01C1

B4 01
8A C6
E8 0000 E

01C4
01C6
01C8

B4
E8
A8
74
33
C3

OB
0000
20
03
CO

PROC NEAR
AH,RTCMODE
GELRTCNMI
AL ,AI LENABLE
CONTI
AX,AX

ADDRESS AND
GET RTCMODE (RegB)
I F ALARM DISABLED (AIE=O)
THEN CONTINUE
ELSE CLEAR AX AND
RETURN

UPD_IN_PR
CONT2
I NIT IALI ZE_STATUS

CLOCK OPERATING?
YES, GO AROUND
NO, INIT CONTROL/STATUS
REG. S (A-D)

CONT2 :
MOV
MOV
CALL

AH,RTCASEC
AL,DH
PULRTCNMI

ADDRESS AND SET
RTCASEC (Reg1) = TO
ASEC PARAMETER, DH

B4 03
8A Cl
E8 0000

MOV
MOV
CALL

AH,RTCAMIN
AL, CL
PULRTCNMI

ADDRESS AND SET
RTU\MIN (Reg3) = TO
AMIN PARAMETER, CL

01CB
01CD
01CF

B4 05
8A C5
E8 0000 E

MOV
MOV
CALL

AH,RTCAHRS
AL,CH
PULRTCNMI

ADDRESS AND SET
RTU\HRS (Reg5) = TO
AHRS PARAMETER, CH

01D2
0104
0107
0109
01DB

B4
E8
24
OC
E8

MOV
CALL
AND
OR
CALL

AH,RTCMODE
GELRTCNMI
AL,NOT SELCLOCK
AL,AIE_ENABLE
PULRTCNMI

ADDRESS AND
GET RTCMODE
SET MODE OFF
ENABLE ALARM
ADDR AND SET

010E
OlEO
01E2

E4 61
24 F7
E6 61

IN
AND
OUT

AL,NMLCNTL
AL,NOT DIS_ALARM
NMLCNTL,AL

ENABLE RTC NM I FOR ALARM

01E4
01E5

C3

DB
0000 E
7F
20
0000

RET
SET...ALRM

2-160 ROM BIOS

(RegB)
(SET=O)
INT. (AI E=l)
RTCMODE (RegB)

RETURN TO RTC6 OR RTC8
ENDP

INITIALIZE_STATUS
FUNCTION:

INITIALIZE RTC CONTROL AND STATUS REGISTERS
REG A = 976.6 USEC PERIODIC INTERRUPT
32.768 KHZ TIME BASE
REG B = ENABLE SET, 24HR, BCD MODES
DISABLE ALL INTERRUPTS AND DAYLIGHT SAVINGS
READ REG C AND D TO CLEAR STATUS

INPUT:

NONE

OUTPUT:

NONE

REGISTERS MODIFIED:
01E5
01E5
01E7
01E9

B4 OA
BO 26
E8 0000

OIEC
OlEE
OIFO

B4 OB
BO 82
E8 0000

DIF3
01F5
01F8
OIFA
OlFD
OIFE

B4
E8
B4
E8
C3

AX

INITIALIZE_STATUS
PROC
MOV
AH, RTCUP _STAT
MOV
AL, 26H
CALL
PULRTCNMI
MOV
MOV
CALL

OC
0000
00
0000

NEAR
ADDRESS AND INITIALIZE
; RTCUP_STAT (RegA) TO GIVE
; **INT.=976.6 MICRO SEC.

AH,RTCMODE
; ADDRESS AND INITIALIZE
AL,SELCLOCK+SEL24HR ; RTCMODE (RegB): (=82H)
PULRTCNMI
* MODES ON ... SET, 24HR, BCD
* DSABLE ALL OTH (NO DYLGHT)

MOV
AH,RTCINLSTAT
CALL
GELRTCNMI
AH,RTCCOND_STAT
MOV
CALL
GELRTCNMI
RET
INITIALIZLSTATUS
ENDP

GET RTCINLSTAT (RegC)
TO INITIALIZE IT
GET RTCCOND_STAT (RegD)
TO INITIALIZE IT
RETURN TO CALLER

UPD_IN_PR
FUNCTION: WAIT FOR RTC CLOCK TO UPDATE TIME. SET CARRY IF CLK NOT
OPERATING (DOESN'T LEAVE UPDATE MODE AFTER 600 MSEC).
INPUT:

NONE

OUTPUT:

AX = 0
CLOCK NOT UPDATING
CARRY FLAG = 1 CLOCK NOT OPERATING
= 0 CLOCK HAS BEEN UPDATED

REGISTERS MODIFIED:
01FE
01FE
01FF
0202
0202
0204
0207
0209
020B
0200
020F
0210
0210
0211
0212
0212

51
B9 0258
B4
E8
A8
74
E2
33
F9
59
C3

OA
0000
80
05
F5
CO

AX

UPD_IN_PR
PROC NEAR
PUSH
CX
MOV
CX ,600
UPDATE :
AH,RTCUP _STAT
MOV
CALL
GELRTCNMI
TEST
AL,RTCUIP
UPD_I N_PREND
JZ
LOOP
UPDATE
XOR
AX,AX
STC
UPD_IN_PREND:
POP
CX
RET
UPD_IN_PR
ENDP
TOD_PROC
SUBTTL

SAVE CX
SET LOOP COUNT
ADDRESS AND
GET RTCUP _STAT (RegA)
IF NOT UPDATING (UIP=O)
THEN RETURN
ELSE IF CX <> 0 THEN LOOP
ELSE CLEAR AX AND
SET CARRY FOR ERROR SIGNAL
RESTORE CX
RETURN TO CALLER

ENDP
SET TIME OF DAY

ROM BIOS 2-161

******'It*********************************************** ***************
ROUTINE-NAME:
FUNCTION:

SELTOD

SET TIMER DATA AREA FROM RTC TIME OR INITIAL TO ZERO
(FOR COLD~DE)

ENTRY CONDITIONS:
PURPOSE OF ENTRY: SET TIMER DATA AREA
INPUT CONDITIONS: NONE
RESTRI CTI ONS:
NONE
EXIT CONDITIONS:
NORMAL EXIT CONDITIONS: TIMER DATA AREA SET FROM RTC TIME
ERROR EXIT CONDITIONS: TIMER DATA AREA SET TO ZERO
REGISTERS MODIFIED:
AX RETURNS STATUS CODE FOR DISPATCHER
AX = 4000 NON-FATAL ERROR AX = 0 GOOD
INTERRUPTS:

LEFT AS ARE

INTERNALLY REFERENCED ROUTINES: CVLBINARY
EXTERNALLY REFERENCED ROUTINES: DDS, GELRTCNMI, PULRTCNMI,
INLIA

*********************************************************************
0212

SELTOO PROC

0212

IE

PUSH

0213
0215
0218
021B

28
A2
A3
A3

021E
0220
0223

B4 OE
E8 0000
24 84

0225

75 56

;-------RESET TIMER
CO
SUB
0070 R
MaY
006C R
MOV
006E R
MaV
MOY
CALL
AND
JNZ

NEAR

OS

SAVE SEGMENT

DATA AREA
AX,AX
TIMER_OFL,AL
TIMER_LOW,AX
TIMEILHIGH,AX

RESET
TIMER
DATA
AREA

AH,RTCOIAG_STAT
ADDRESS AND
GELRTCNMI
; GET RTCDIAI'--STAT (RegE)
AL, RTCTIMLBAD+RTCFAILED
TIME BAD OR CLOCK ERROR?
TOD_NOTSET
YES. TIMER SET TO ZERO

0227
0228
022A
022C

F8
B4 02
CD lA
72 3F

; -------GET RTC TIME
CLC
MOV
AH,GELRTCTIME
INT
lAH
JC
SELRET

022E
0231
0233
0236
0238
023B

80
77
80
77
80
77

FE 59
3E
F9 59
39
FD 23
34

;-------CHECK VALIDITY OF RTC TIME
CMP
DH,SECMALLIMIT
BAD_TIME
JA
CL, MIN_MALL I MIT
CMP
BAD_TIME
JA
CH,HRS~ALLIMIT
CMP
BAD_TIME
JA

0230
023F
0242
0244
0246

8A
E8
B3
F6
8B

;-------SET
C6
0286 R
12
E3
DO

TIMER FROM RTC TIME
MOV
AL,DH
CVT_BINARY
CALL
BL, COUNTS_SEC
MOV
MUL
BL
MOV
DX,AX

BCD TSEC INTO AL
BINARY TSEC RETURNED IN AL
BL <-- # OF COUNTS PER SEC
AX <-- # OF CNTS IN RTCTSEC
OX IS TOTAL-CNTS ACCUMULATOR

0248
024A
0240
0250
0251
0253
0254

8A
E8
BB
52
F7
5A
03

Cl
0286
0444

MOV
CALL
MOV
PUSH
MUL
POP
ADD

BCD TMIN INTO AL
BINARY TMIN RETURNED IN AL
BX <-- # OF COUNTS PER MIN
SAVE TOTAL
AX <-- # OF CNTS IN RTCTMIN
RETRI EVE TOTAL
ADD TMIN-CNTS TO TOTAL-CNTS

E3
DO

2-162 ROM BIOS

AL,CL
CVLBINARY
BX, COUNTS~I N
OX
BX
OX
DX,AX

SET CF=O "NO ERROR" STATE
FOR INLIA, AH=2=GET RTC
GET RTC TIME: CH=H CL=M DH=S
IF CF=I, NML RETURN. CF=1
CLK NOT OPERATING (UIP=I)
IF RTCTSEC NOT IN LIMITS
THEN RETURN
IF RTCTMIN NOT IN LIMITS
THEN RETURN
IF RTCTHRS NOT IN LIMITS
THEN RETURN

0250

B3 07

MOV

BL, COUNTS_HOUR

025F

F6 E3

MUL

BL

0261
0263

03 C2
83 01 00

ADD
ADC

AX,DX
CX,OOOOH

BCD THRS INTO AL
BINARY THRS RETURNED IN AL
CX = HIGH WO (THRS-CNTS
# OF COUNTS PER HR.)
BL <-- # CHTS PER H (LOW WO)
**TRUE CNTS/H IS 17 BIT VAL
AX <-- # OF COUNTS IN
RTCTHRS (LOW WORD)
AX = TOTAL-COUNTS (LOW WORD)
CX = TOTAL-COUNTS (HIGH WD)

0266
026A

89 OE 006E R
A3 006C R

MOV
MOV

TIMER_HIGH,CX
TIMER_LOW,AX

MOV E TOTAL - COUNTS
TO TIMER DATA AREA

0260
0260
026F
0270

2B CO
IF
C3

0271
0271
0273
0276
0278
027B

B4
E8
DC
E8
EB

0270
0270
027F
0281
0284
0285

A8 04
75 EC
B8 4000
IF
C3

0256
0258
025B

MOV
CALL
MOV

8A C5
E8 0286 R
8B C8

AL,CH
CVLBINARY
CX,AX

;-------RETURN ROUTINES
SELRET:
SUB
AX,AX
POP
OS
RET
BAD_TIME:
MOV
CALL
OR
CALL
JMP

OE
0000
04
0000
FO

SET GOOD RETURN CODE
RETSORE SEGMENT
RETURN TO CALLER

AH, RTCDIAG_STAT
GELRTCNMI
AL,RTCFAILED
PULRTCNMI
SELRET

TOO_NOTS ET:
TEST
AL,RTCFAILEO
JNZ
SELRET
;
MOV
AX,NON_FATALERR*100H
POP
OS
;
RET
;

ADDRESS AND
GET RTCDIAG_STAT (RegE)
SET RTCFAILED BIT (=1)
PUT RTCOIAli-STAT (RegE)
RETURN WITH GOOD RETURN CODE
IS RTCFAILED SET (=1)?
YES, RTN WITH GOOD RTN CODE
; NO, RTN WITH ERR CD IN AH
RESTORE SEGMENT
RETURN TO CALLER

-------SUBROUTI NES
CVLBINARY
FUNCTION:
INPUT:
OUTPUT:

CONVERT A 1 BYTE BCD NUMBER TO BINARY
AL = BCD NUMBER
AH = 0, AL = BINARY NUMBER

RESTRI CTIONS:

0286

I NVALI 0 BCD NUMBER RESULTS I N I NVALI 0 BI NARY NUMBER.
NO RANGE CHECKING DONE

CVLBINARY

0286
0288
0289
028B
0280
028E
0290

BA
51
Bl
02
59
24
05

0292
0293
0293

C3

EO
04
EC
OF
OA

MOV
PUSH
MOV
SHR
POP
AND

PROC
AH,AL
CX
CL,4
AH,CL
CX
AL,OFH

AAD
RET
CVT_BINARY
SELTOD ENDP

NEAR

INPUT:
AL = BCD NUMBER
OUTPUT: AH = 0, AL = BINARY
PLACE LEFT
BCD DIGIT
INTO RIGHT
NIBBLE OF
AH
GET RID OF LEFT BCD DIGIT AL
CONVERT UNPACKED BCD TO BIN
(BINARY # IN AL, AH=O)
RETURN TO CALLER

ENDP

ROM BIOS 2-163

********************************************************************
ROUTINE-NAME:

RTC2_TST

FUNCTION:
CHECK REAL TIME CLOCK FOR TIME UPDATE FUNCTION.
IF RTCTlME_BAD FLAG IS SET INDICATED INVALID TIME, A
CALL TO INITIALIZE_STATUS IS MADE TO SET THE RTC REGISTERS
AND THE TlME,DATA, AND ALARM REGISTERS ARE SET TO O.
ENTRY CONDITIONS:
PURPOSE OF ENTRY: CALLED BY POST TO CHECK RTC TIME FUNCTION
INPUT CONDITIONS: OS: DATA
RESTRI CTI ONS:
NONE
EXIT CONDITIONS:
NORMAL EXIT CONDITIONS: AX = 0
ERROR EXIT CONDITIONS: AH=40 (NON_FATAL ERR) AL=63 (RTC ERR)
REGISTERS MODIFIED:
AX RETURNS STATUS CODE FOR POST
INTERRUPTS:

LEFT AS ARE

I NTERNALL Y REFERENCED ROUTI NES: INITIALIZLSTATUS
EXTERNALL Y REFERENCED ROUTINES:

GELRTCNMI, PULRTCNMI

*********************************************************************
0293

RTCZ-TST PROC NEAR

0293
0295
0298
029A

B4
E8
A8
74

OE
0000
80
11

029C
029F
02A)
02A3

E8
B4
BO
B9

;
OlE5 R
00
00
OOOA

MOV
CALL
TEST
JZ

AH,RTCDIAG_STAT
GELRTCNMI
AL ,RTCTlME_BAD
RTC2_02

CHECK FOR CLOCK NOT SET
JUMP IF CLOCK IS SET

MUST INITIALIZE AND SET TIME TO 0:0:0 DATE TO 0:0:0

02A6
02A6
02A9
02AB

E8 0000
FE C4
E2 F9

CALL
MOV
MOV
MOV
RTCZ-O) :
CALL
INC
LOOP
INSURE SELCLOCK

02AD
02AD
02AF
02B2
02B4

B4
E8
24
E8

02B7
02B9

B3 02
2B C9

OB
0000
7F
0000

RTCZ-02:
MOV
CALL
AND
CALL
MOV
SUB

I NITIALI ZE_STATUS
AH,RTCTSEC
AL,O
CX, )0
PULRTCNMI
AH
RTCZ-O)

SET TIME AND DATE TO 0
SET REGISTER TO 0
INCREMENT REGISTER NUMBER

BIT IS RESET
AH,RTCMODE
GELRTCNMI
AL,NOT SELCLOCK
PULRTCNMI
BL,02
CX,CX

TURN OFF SELCLOCK
OUTER LOOP COUNTER
SET MAX LOOP TO 1. 3

SECONDS

WAIT FOR UPDATE IN PROGRESS FLAG TO BE SET
02BB
02BB
02BD
02BF
02C)
02C3
02C5
02C7
02C9
02CB

BO
E6
E4
A8
75
E2
FE
75
EB

OA
70
71
80
09
F4
CB
FO
)0 90

RTCZ-03:
MOV
OUT
IN
TEST
JNZ
LOOP
DEC
JNE
JMP

AL,RTCUP_STAT
RTCR_PORT ,AL
AL, RTCD_PORT
AL,RTCUIP
RTCZ-04
RTCZ-03
BL
RTC2_03
RTC2JAIL

READ CLOCK UPDATE STATUS
UPDATE IN PROGRESS?
JUMP I F YES
KEEP LOOKING
JUMP I F NEVER CAME ON

WAIT FOR UPDATE IN PROGRESS FLAG TO BE RESET
02CE
02CE

B9 0258

RTCZ-04:
MOV

2-164 ROM BIOS

CX,600

SET LOOP FOR 6 MSEC

02Dl
02Dl
02D3
02D5
02D7
02D9
02DB

BO
E6
E4
A8
74
E2

RTCL05:
MOV
OUT
IN
TEST
JZ
LOOP

OA
70
71
80
14
F4

AL,RTCUP_STAT
RTCILPORT ,AL
AL, RTCD_PORT
AL,RTCUIP
RTCLINTS
RTCL05

READ CLOCK UPDATE STATUS
UPDATE IN PROGRESS?
JUMP I F RESET
KEEP LOOKING

RTC FAILED TO UPDATE
02DD
02DD
02DF
02E2
02E4
02E7
02EA
02EC

B4
E8
OC
E8
B8
B3
EB

RTCLFAIL:
MOV
CALL
OR
CALL
MOV
MOV
JMP

OE
0000
04
0000 E
4063
01
46 90

AH,RTCDIAG_STAT
GELRTCNMI
AL,RTCFAILED
PULRTCNMI
AX ,4063H
BL ,01
RTCLEXIT

SET CLOCK FAILED FLAG
SET NON-FATAL ERROR FLAG
SET MFG ERROR CODE

TEST PERIODIC INTERRUPT FOR POST AFTER 100 MSECS
02EF
02EF
02FO
02Fl
02F4
02F7
02FA
02FD
02FF

IE
07
BB
B9
BA
B8
CD
B2

RTCLINTS:
PUSH
POP
MOV
MOV
MOV
MOV
INT
MOV

OOAO R
0001
86AO
8300
15
52

; SET ES: BX PTR RTCWAILFLAG
DS
ES
BX,OFFSET RTCWAILFLAG ; SET UP FOR INT 15 CALL
CX,OI
POST AFTER 100 MSECS
DX ,86AOH
POST ON EVENT FUNCTION CALL
AX ,8300H
ISH
SET MAX TIME CNT TO 110 MSEC
DL,82

WAIT FOR POST FLAG TO BE SET BY NMI HNDLR - EACH CNT ON DL = 1. 35MS
0301
0301
0305
0307
030A
030C
030E
0310
0312
0312
0315
0317
031B
031D

26: F6 07 80
75 OB
B9 0102
E2 FE
FE CA
75 Fl
EB 00

RTCLWAIT:
TEST
JNZ
MOV
LOOP
DEC
JNE
JMP

DL
RTCLWAIT
SHORT RTCLBAO

80 FA OF
77 08
26: 80 27 7F
2B CO
EB 15

INLOONE:
CMP
JA
AND
SUB
JMP

OKAY IF> = 90 MSECS
DL,15
RTCLBAD
BYTE PTR ES: [BX-,NOT PSTD ; CLR POSTED FLAG
; SET GOOD RETURN CODE
AX,AX
SHORT RTCLEX IT
; EXIT TEST

BYTE PTR ES: [BX-,PSTD ; WAIT FOR POSTED FLAG
INLDONE
CX ,MS_DELAY
; DELAY FOR 1 MSEC

$
BAD IF> 110 MSECS

PERIODIC INTERRUPT TEST FAILED
031F
031F
0321
0323
0326
0328
032B
032F
0332

B4 OB
BO 00
E8 0000
FE C4
E8 0000 E
26: C6 07 00
B8 4063
B3 02

RTCLBAD:
MOV
MOV
CALL
INC
CALL
MOV
MOV
MOV

AH,RTCMODE
AL,O
PULRTCNMI
AH
GELRTCNMI
BYTE PTR ES: [BX], 0
AX,4063H
BL,02

CLEAR ALL INTERRUPT ENABLES
RD STAT TO CLR PENDING INTS
CLEAR WAIT FLAG
SET NON-FATAL ERROR FLAG
SET MFG ERR CODE
I NTS BAD

PERIODIC INTERRUPT TEST PASSED
0334
0334
0335
0337
0339
033B
033C
033D

50
E4 61
OC 08
E6 61
58
C3

RTCLEXIT:
PUSH
AX
IN
AL,NMLCNTL
OR
AL , 0 I S..J\LARM
OUT
NMLCNTL,AL
POP
AX
RET
RTCLTST ENDP

DISABLE ALARM NMI

ROM BIOS 2-165

Timer 0 Interrupt S (TMRO_INTS)
; *********************************************************************
TMRO_INT8
DESCRIPTION:
THIS ROUTINE HANDLES THE TIMER INTERRUPT FROM
CHANNEL 0 OF THE 8253 TIMER. INPUT FREQUENCY
IS 1.19318 MHZ AND THE DIVISOR IS 65536, RESULTING
IN APPROX. 18.2 INTERRUPTS EVERY SECOND.
THE INTERRUPT HANDLER MAINTAINS A COUNT OF INTERRUPTS
SINCE POWER ON TIME, WHICH MAY BE USED TO ESTABLISH
TIME OF DAY.
THE INTERRUPT HANDLER ALSO DECREMENTS THE MOTOR
CONTROL COUNT OF THE DISKETTE, AND WHEN IT EXPIRES,
WILL TURN OFF THE DISKETTE MOTOR, AND RESET THE
MOTOR RUNNING FLAGS.
THE INTERRUPT HANDLER WILL ALSO INVOKE A USER ROUTINE
THROUGH INTERRUPT lCH AT EVERY TIME TICK. THE USER
MUST CODE A ROUTINE AND PLACE THE CORRECT ADDRESS IN
THE VECTOR TABLE.
INPUT:

OS = DATA

OUTPUT:

AX=O (GOOD RETURN)
AH=40 (NON_FATAL ERROR) AL=63 (RTC ERROR)

RESTRICTIONS:

NONE

REGISTERS MODIFIED:
INTERRUPTS:

NONE

FORCED ON (STI)

I NTERNALL Y REFERENCED ROUTI NES:

NONE

; EXTERNALLY REFERENCED ROUTI NES:

DDS, INT lCH, I NT 4AH

; **********************************************************************

0330
0330
033E
033F
0340
0341
0344
0348
034C

FB
IE
50
52
E8
FE
FF
75

034E

FF 06 006E

0000 E
OE 007B R
06 006C R
04

TMRO_INT8
STI
PUSH
PUSH
PUSH
CALL
DEC
INC
JNZ
INC

PROC

FAR

I NTERRUPTS BACK ON
OS
AX
OX
DDS
EVENLTIM_OUT
TIMER_LOW
T4
TlMEILHIGH

SAVE MACHINE STATE
DEC WAIT ON EVNT TIMEOUT CTR
INCREMENT TIME
TESLDAY
INCREMENT HIGH WORD OF TIME

CHECK TIMER FOR 24 HOUR ROLL OVER
0352
0352
0357
0359
035F

T4:
83
75
81
75

3E 006E R 18
15
3E 006C R OOBO
00

CMP
JNZ
CMP
JNZ

; TESLDAY
TIMER_HIGH,COUNTS_DALHI ; TST FOR CNT
T5
; DISKETTE_CTL
TIMER_LOW, COUNTS_DAY_LO
T5
; DISKETTE_CTL

24 HOURS

TIMER HAS GONE 24 HOURS
0361
0363
0366
0369

2B
A3
A3
C6

CO
006E R
006C R
06 0070 R 01

SUB
MOV
MOV
MOV

AX,AX
TlMER_HIGH,AX
TIMER_LOW,AX
TIMEILOFL,1

TEST FOR DISKETTE TIME OUT
036E
036E

T5:
80 3E 0040 R 00

2-166 ROM BIOS

CMP

DISKETTE_CTL
SKI P MOTOR OFF I F ALREADY 0

0373
0375
0379

74 ID
FE OE 0040 R
75 17

JE
DEC
JNZ

T6
MOTOILCOUNT
T6

; RETURN I F COUNT NOT OUT

DEGATE DISKETTE DRIVES BEFORE TURNING OFF MOTOR TO INSURE THAT A
RE-SELECT OF A DRIVE WITHIN 800 USECS OF MTR OFF WILL NOT GLITCH DRV
LINES
037B
037D
037F
0381
0383
0385

E4
A8
74
24
OC
E6

77
80
06
BF
20
77

IN
TEST
JZ
AND
OR
OUT

0387
038C
038E
0391
0392
0392

80 26 003F R CO
BO 04
BA 03F2
EE

0394
0396

BO 20
E6 20

AL, DSKLCNTL
AL,DSKLNMI
T5A
AL ,NOT FDLPWR
AL, DSKLDEGATE
DSKLCNTL, AL

DEGATE DISKETTE DRIVES
DISKETTE POWER NMIS ENABLED?
JUMP I F NOT
ONLY DEGATE IF NMI ENABLED

TURN OFF DISKETTE MOTORS AND DESELECT DRIVE

CD lC

T5A:
MOV
MOV
OUT
T6:
INT

AND

MOTOILSTATUS,OCOH ; TURN OFF MTR STATUS BITS
AL, FDLRUN
; TRN OFF MTRS SLCTS & DMAII NTS
DX,DRIVE_CNTL
DX,AL
lCH

XSFER CONTROL TO A USER RTNE

END OF INTERRUPT
MOV
OUT

AL,EOI
INTAOO,AL

; END OF INTERRUPT TO CNTLR

CHECK FOR ANY OTHER INTERRUPTS IN SERVICE
0398
039A
039C
039E
03AO

BO
E6
E4
OA
75

OB
20
20
CO
OE

MOV
OUT
IN
OR
JNZ

AL, READ_I SR
INTAOO,AL
AL,INTAOO
AL,AL
T7

SET TO READ INSERVICE REG
READ IN-SERVICE-REG
ANYTHING IN SERVICE?
YES, ALARM SERVICE MUST WAIT

CHECK FOR USER RTC ALARM ROUTINE PENDING ACTIVATION
03A2
03A7

F6 06 OOAO R 02
74 07

03A9
03AE
03BO
03BO
03Bl
03B2
03B3
03B4

80 26 OOAO R FD
CD 4A

TEST
JZ

RTLWAILFLAG,ALARM_PEND ; ALRM INTERRUPT PENDING?
T7
; JUMP IF NOT

CALL USER ALARM ROUTINE DUE TO RTC ALARM PENDING FLAG BEING SET

03B4

AND
INT

RTLWAILFLAG, NOT
4AH

ALAR~PEND

; TURN OFF FLAG
; XSFER CTOL TO USR ALARM RTNE

T7 :
5A
58
IF
CF

POP
POP
POP
IRET
TMRO_INT8

DX
AX
DS

RESET MACHINE STATE
RETURN FROM INTERRUPT
ENDP

ROMCODE ENDS
END

ROM BIOS 2-167

System Services (B16SYSV)
0000

ROMCODE SEGMENT BYTE PUBLIC
ASSUME CS: ROMCODE
IDENT
BI6SYSV,16,00

*****************************************************************************
I NT 15H
MODULE-NAME:

B16SYSV

CHANGE LEVEL:

0.0

DATE LAST MODIFIED:

9/12/85

DESCRIPTIVE-NAME,
COPYRIGHT:

SYSTEM SERVICES (INT 15H) FUNCTiON CALL SUPPORT
ROUTINES.
7396-917 (C) COPYRIGHT IBM CORP. 1985
REFER TO COPYRIGHT INSTRUCTIONS FORM NO. G120-2083

FUNCTION:

REFER TO ROUTINE PROLOGUE BELOW.

MODULE SIZE:

1014 BYTES.

ENTRY CONDITIONS:
PURPOSE OF ENTRY: EXECUTE SYSTEM SERVICE INDICATED BY INPUT PARAM.
INPUT CONDITIONS: REFER TO ROUTINE PROLOGUES BELOW.
RESTRICTIONS: FOR SPECIAL RESTRICTIONS REFER TO INDIVIDUAL FUNCTION
ROUTI NE PROLOGUES.
INTERNALLY
REFERENCED ROUTINES: SYS_PROF, EXLEVENT, SYS_POWER_OFF, SYS_STAUS,
POSLINTV, WAIT_INTV, DELBUSY, TMRO_CHK,
INLCOMPLETE
EXIT CONDITIONS:
NORMAL EXIT
CONDITIONS:
REFER TO ROUTINE PROLOGUE BELOW.
ERROR EXIT
CONDITIONS: CARRY FLAG AND AH = B6H IS SET FOR INVALID FUNCTION
REQUEST OR INVALID PARAMETER ERROR.
REGISTERS MODIFIED:

AH &. RETURNED OUTPUT PARAM (REFER TO PLOGUES).

INTERNAL DATA AREAS/
TABLES

SYS_TABLE.

EXTERNALL Y
REFERENCED ROUTINES:

REFER TO EXTERNAL REFERENCES LIST.

EXTERNALL Y REFERENCED
DATA AREAS
REFER TO EXTERNAL REFERENCES LIST
CHANGE ACTIVITY: NONE

*********************************************************************

2-168 ROM BIOS

*********************************************************************
EXTERNAL

REFERENCES

*********************************************************************
EXTRN
EXTRN
EXTRN
EXTRN
EXTRN
EXTRN
EXTRN
EXTRN
EXTRN
EXTRN
EXTRN
EXTRN
EXTRN
EXTRN

GELRTLREG
PULRTLREG
DISABLLNMI
ENABLE_NMI
DDS
VIDEO_IO_1
COM_POWER
BALSALSETUP
TMRO_INT8
SYS_DESCILTABLE
COMMO_IO
MODEM_POWEILON
SEND_COM
MODEM_CON FIG

:NEAR
:NEAR
:NEAR
:NEAR
:NEAR
:NEAR
:NEAR
:NEAR
:NEAR
:NEAR
: NEAR
:NEAR
:NEAR
:NEAR

*********************************************************************
PUBLICS

*********************************************************************
PUBLIC SYS_SERVICES
PUBLI C EXLEVENT
SUBTTL
0000

SYSTEM SERVICE ROUTINES

SYS_TABLE LABEL

0000
0002
0004
0006
0008

0083
OlBE
0298
02C1
030F

R
R
R
R
R

; ENTRI ES FOR 40H - 44H
OFFSET
DW
OFFSET
DW
OFFSET
DW
DW
OFFSET
OFFSET
DW

OOOA
OOOC
OOOE
0010
0012
0014
0016

0472
0472
0472
032A
007F
0472
0380

R
R
R
R
R
R
R

; ENTRI ES FOR 80H - 86H
OFFSET
DW
OFFSET
DW
DW
OFFSET
DW
OFFS ET
DW
OFFSET
OW
OFFSET
DW
OFFSET

0018
001A

03DB R
0472 R

WORD
SYS_PROF
; 40H - READ/MOO SYS PROFILE
EXLEVENT
; 41H - WAIT ON EXTERNAL EVENT
SYS_POWER_OFF ; 42H - SYSTEM POWER OFF
SYS_STATUS
; 43H - READ SYSTEM STATUS
SYS-.MODEM_PWR ; 44H - MODEM POWER CONTROL
RETURN
RETURN
RETURN
POSLI NTV
JOYSTI CK
RETURN
WAILI NTV

; ENTRI ES FOR 90H - 91H
DW
OFFSET DELBUSY
DW
OFFSET INLCOMPLETE

80H
81H
82H
83H
84H
85H
86H

DEVICE OPEN
DEVICE CLOSE
PROGRAM TERMINATION
POST ON ELPS TME I NTV
JOYSTI CK SUPPORT
SYSTEM REQUEST
WAIT ON ELPS TME INTV

90H
91H

DEVICE BUSY
DEV INTERRUPT COMPLETE

System Services Interrupt Hex 15
(SYS_SERVICES)
ROUTINE-NAME

INT 15H, SYSTEM SERVICES

FUNCTION:

PROVIDES ACCESS TO SYSTEM SERVICES.

ENTRY /EXIT CONDITIONS
INPUT:

OUTPUT:

ROM BIOS 2-169

CASSETTE I/O:
AH

= 0-3

AH = 86H, CARRY SET
PORT NOT PRESENT

READ/MODI FY
SYSTEM PROFILE: AH = 40H
AL = 0 READ

BX,CX CONTAINS
PROFILE INFORMATION
PROFILE IS MODIFIED
AND EXECUTED

AL = 1 MODIFY
BX,CX CONTAINS PROFILE
AL = 2 READ MODEM CONFIG
AL = 3 MODI FY MODEM CON FIG
(REFER TO SYS_PROF PROLOG FOR DETAILS)

EXTERNAL EVENT: AH = 41H
(REFER TO EXLEVENT PROLOG FOR DETAILS)
SYSTEM POWER OFF:
AH = 42H
(REFER TO SYS_POWER_OFF PROLOG FOR DETAILS)
SYSTEM STATUS:

AH = 43H
(REFER TO SYS_STATUS PROLOG FOR DETAILS)

MODEM POWER:

AH = 44H
(REFER TO SYS_MODEM_POWER PROLOG FOR DETAILS)

KEYBOARD INTERCEPT:
AH = 4FH
ENTRY CONDITION: AL = SCAN CODE OF KEY FROM I NT 9 (PORT 60)
EXIT CONDITION: CARRY SET IF INT 9 SHOULD PROCESS KEY
CARRY CLEAR IF INT 9 SHOULD NOT PROCESS
KEY BUT JUST ISSUE EOI AND EXIT LEVEL.
(RESERVED FOR OPERATING SYSTEM USE - THIS BIOS WILL RETURN WITH
CARRY SET TO
ENABLE INT 9 TO HANDLE KEY)
DEVICE OPEN:
AH
BX
CX

= 80H
= DEVICE ID
= PROCESS I D

IMMEDIATE RETURN

DEVICE CLOSE:

PROGRAM
TERMINATION:
POST ON TIME
INTERVAL

JOYSTICK
SUPPORT:
SYSTEM REQ.
KEY CHANGE:

2-170 ROM BIOS

AH = 81H
BX = DEVICE ID
CX = PROCESS ID

IMMEDIATE RETURN

= 82H
= DEVICE

IMMEDIATE RETURN

AH
BX

ID

AH = 83H
AH = 0 SET INTERVAL
ES. BX PTR TO BYTE IN CALLERS
STORAGE FOR POST NOTI FI CATON
CX,DX NUMBER OF MICROSECONDS TO
ELAPSE BEFORE POSTING.
AL = I CANCEL THE INTERVAL POST

BIT 7 SET IN ES:-BXWH EN I NTERVAL HAS
ELAPSED
POST IS CANCELLED

AH = 84H

AH = 86H, CARRY SET
PORT NOT PRESENT

AH = 85H
AL = 00 - MAKE OF KEY
AL = 01 - BREAK OF KEY

IMMEDIATE RETURN

WAIT ON
TIME INTERVAL:

AH = S6H
CX,DX NUMBER OF MSECONDS
TO ELAPSE BEFORE RETURN
TO CALLER

RETURN AFTER TIME
ELAPSED XXX

DEVICE BUSY:
AH = 90H
AL = DEVICE TYPE (SEE CODE)
01 - DISKETTE

DEVICE
INTERRUPT
COMPLETE:

02 - KEYBOARD

RETURN WHEN KEYBOARD
BUFFER TAIL <>
CURRENT VALUE

03 - FFH ALL OTHERS

IMMEDIATE RETURN

AH = 91H
IMMEDIATE RETURN
AL = DEVICE TYPE
OOH -> 7FH
SERIALLY REUSABLE DEVICES
OPERATING SYSTEM MUST SERIALIZE
ACCESS
SOH -> BFH
REENTRANT DEVICES; ES:BX IS
USED TO DISTINGUISH DIFFERENT
CALLS (MULTIPLE I/O CALLS ARE
ALLOWED SIMUL TANEUSLY)
COH -> FFH
WAIT ONLY CALLS; THERE IS NO
COMPLEMENTARY 'POST' FOR THESE
WAITS - - THESE ARE TIMEOUT
ONLY. TIMES ARE FUNCTION NUMBER
DEPENDENT.
DEVICE
OOH
01H
02H
FDH

READ SYSTEM
DESCRIPTION
TABLE

RETURN AFTER IRPT
RECEIVED OR 2 SECOND
TIMEOUT HAS OCCURRED
CARRY SET I F TIMEOUT

TYPE
=
=
=
=

DESCRIPTION

TIMEOUT

DISK
DISKETTE
KEYBOARD
DISKETTE MOTOR START

YES
YES
NO
YES

AH = COH
AH=O, CARRY CLEAR
ES: BX TABLE POINTER
TABLE DEFINED AS FOLLOWS:
BYTE 1&2: LENGTH OF TABLE IN BYTES
STARTING AT BYTE 3
3: SYSTEM MODEL BYTE
BYTE
4: SECONDARY MODEL BYTE
BYTE
BYTE
5: BIOS REVISION NUMBER
BYTE
6: FEATURE INFORMATION BYTE 1:
MSB:
BIT 7 = 1 - BIOS USES DMA CHANNEL 3
o - DMA CHANNEL 3 NOT USED
BIT 6 = 1 - 2ND INTERRUPT CONTROLLER INSTALLED
o - 2ND INTERRUPT CNTLR NOT INSTALLED
BIT 5 = 1 - REAL TIME CLOCK PRESENT
o - REAL TIME CLOCK NOT PRESENT
BIT 4 = 1 - INT 15H FUNCTION 4FH LINKAGE FROM
BIOS INT9 SUPPORTED
o - LI NKAGE NOT SUPPORTED
Bi t 3 = 1 - INT 15H FUNCTION 41H WAIT ON
EXTERNAL EVENT SUPPORTED
o - INT 15H FUNCTION 41H NOT SUPPORTED
Bit 2-0= RESERVED
BYTES
7-10: RESERVED FOR FUTURE FEATURE EXPANSION

ROM BIOS 2-171

REGISTERS MODI FI ED : AH AND RETURNED PARAMETER REGISTERS
INVALID FUNCTION REQUESTS (INVALID REGISTER AH VALUES) WILL RETURN
AND THE CARRY FLAG WILL BE SET.
ASSUME
001C
001C
OOlD
001F
0023
0024
0025
0026
0029
002B
002E

53
8B DC
36: 8B 5F 06
53
90
5B
80 FC 40
72 4E
80 FC 80
73 OA

0030
0033
0035
0038

80 FC 44
n 44
80 EC 40
EB 17

OS: OATA, ES: NOTH I NG

SYS_SERVICES PROC
FAR
PUSH
BX
MOV
BX,SP
MOV
BX,SS: [BX+6]
PUSH
BX
POPF
POP
BX
CMP
AH,40H
JB
INLFUN
CMP
AH ,80H
JAE
SYS_SV2

CHECK FOR SYSTEM SERVICES
CMP
JA
SUB
JMP

80 FC
n 2C
80 EC
80 FC
72 05
80 EC
EB 05

SYS_SV2 :
CMP
JA
SUB
CMP
JB
SUB
JMP

91
7B
15
09

(AH = 40-44H)

AH,44H
INLFUN
AH ,40H
SHORT SYS_SVC

CHECK FOR SYSTEM SERVICES
003A
003A
0030
003F
0042
0045
0047
004A

GET POINTER TO SYSTEM STACK
GET FLAGS FROM SYSTEM STACK
& SAVE IN STK FOR FLG REG LD
RETORE FLAGS
RESTORE BX
BELOW SYS SVCS 1 (CSST I/O)?
INVLD PARM OR UNSUPTD CSST
IS SELECT PARM ABOVE 80H?
YES, CK SYS SVCS 2 REQUEST

IN VALID SYS SVCS UP RANGE?
NO, INVALID FUNCTION
YES, SET TABLE OFFSET
GO LINK TO PROPER ROUTINE •..

(AH = 80-91H)

AH,91H
CHLDESCR
AH,7BH
AH,15H
SYS_SV3
AH,9
SHORT SYS_SVC

IN VlD SYS SVCS 2 UP RANGE?
YES, CK READ DESCRIPTOR ...
MAKE REL TO 4TH ENTRY IN TBl
FUNCTION> = 90H?
NO, GO SYS SERV 3 REQUEST •..
YES, CORRECT THE OFFSET
GO LINK TO THE ROUTINE ..•

CHECK FOR FUNCTIONS 87H-8FH THAT ARE INVALIO
004C
004C
004F

SYS_SV3 :
CMP
JAE

80 FC OC
73 28

AH,12
INLFUN

IS PARM = 87H - 8FH CODE?
YES, INVALID PARAMETER ...

LINK TO PROPER ROUTINE
0051
0051
0052
0053
0054
0057
0059
005B

1E
55
50
BD
8E
2A
86

SYS_SVC:
PUSH
PUSH
PUSH
MOV
MOV
SUB
XCHG

0050
005F
0061
0062
0067
0068
0069

01 EO
8B E8
58
2E: FF 96 0000 R
50
1F
EB 11

---DO
CO
EO

SHL
MOV
POP
CALL
POP
POP
JMP

OS
BP
AX
BP,DATA
OS, BP
Al,Al
AH,AL
AX,l
BP ,AX
AX
SYS_TABLE[BP]
BP
OS
SHORT IMM_RET

SAVE DS, BP ,AX USE IN SY SERV
SET OS

<--

DATA SEGMENT - BP

SET AL TO 0
& FUNCT CODE IN LOW BYTE &
AH=O RET CODE CLR
DOUBLE LINK TABLE OFFSET
GET OFFSET IN BP
RESTORE AX
JUMP TO PROPER ROUTINE
RESTORE BP, OS
SERVICE EXECUTED LEAVE ...

CHECK FOR READ SYSTEM DESCRIPTOR TABLE ADDRESS
006B
006B
006E
0070
0071
0072

0075

oon

80
75
OE
07
BB
2A
EB

FC CO
09
0000 E
E4
03

CHLDESCR:
CMP
JNE
PUSH
POP
MOV
SUB
JMP

2-172 ROM BIOS

AH,OCOH
IS REQ PARM SYS DESC READ?
INLFUN
NO, INVALID FN PARM REQUEST
CS
SAVE CURRENT CODE SEGMENT
ES
; SET ES TO POINT TO TABLE
BX,OFFSET SYS_DESCILTABLE ; POINT TO TABLE
AH ,AH
CLEAR RETURN CODE
SHORT IMM_RET
; EXIT

AH = 86H

INVALID FUNCTION CODE RETURN POINT
0079
0079
007B
007C
007C
007F
007F
007F
0081
0082
0083

INLFUN:
MOV
AH,86H
STC
IMM_RET:
RET
2
SYS_SERVICES ENDP

B4 86
F9
CA 0002

SET BAD COMMAND RETURN CODE
SET CARRY FLAG ON - ERROR
RETURN WITH CURRENT FLAGS

JOYSTICK
PROC
MOV
AH,86H
STC
RET
JOYSTI CK ENDP

B4 86
F9
C3

NEAR
SET JOYSTI CK NOT SUPPORTED
SET CARRY FLAG - ERROR

System Profile Services (SYS_PROF)
INT 15H
ROUTINE-NAME:

SYS_PROF

FUNCTION:

ROUTINE TO ALLOW READ/MODIFY OPS ON THE SYS PROFILE
INFORMATION. SYS PROFILE IS STORED IN CLK CHIP RAM.

INPUT:

(AH = 40H)

AL = 0 READ SYSTEM PROFILE INTO BX AND CX
AL = 1 MODIFY SYSTEM PROFILE FROM BX AND CX
AL = 2 READ MODEM SWITCH SETTING INTO BX
AL = 3 WRITE MODEM SETTINGS FROM BX AND TURN ON MODEM

DEFINITION OF BITS IN SYSTEM PROFILE REGISTERS (AL = 0,1)
BH:

BIT 7 - 0 = SET SYSTEM COLD START MODE
*1 = SET SYSTEM WARM START MODE
BIT 6 - 0 = DISABLE LOW BATTERY WARNING MESSAGE
*1 = ENABLE LOW BATTERY WARNING MESSAGE
BITS 5,4 - INITIAL VIDEO MODE
00 = RESERVED
01 = 40 X 25 MONOCHROME USING CGA/LCO
*10 = 80 X 25 MONOCHROME USING CGA/LCD
11 = 80 X 25 MONOCHROME USING MONO/LCD
BITS 3,2 - *00 = IGNORE LCD HIGH INTENSITY
01 = MAP LCD HIGH INTENSITY TO
10 = MAP LCD HIGH INTENSITY TO
11 = MAP LCD HIGH INTENSITY TO

ATTRIBUTE
UNDERSCORE
REVERSE VIDEO
ALTERNATE FONT

BIT 1 - *0 = INTERNAL MODEM NOT AVAILABLE ON BATTERY PWR
1 = INTERNAL MODEM AVAILABLE ON BATTERY POWER
BIT 0 - *0 = RS232/PARALLEL NOT AVAILABLE ON BATTERY
1 = RS232/PARALLEL AVAILABLE ON BATTERY
BL:

BITS 7-0

RESERVED

CH:

BITS 7-0 - KEYBOARD INACTIVITY TIME BEFORE LCD BLANKING.
(TIME IN MINUTES, *0 = DISABLE BLANKING).

ROM BIOS 2-173

CL:

BITS 7-0 - KEYBOARD INACTIVITY TIME BEFORE SYSTEM POWER
OFF (TIME IN MINUTES, *0 = DISABLE POWER OFF).
DEFINITION OF BITS IN MODEM PROFILE REGISTER (AL = 2,3)

BL:

BIT 6,7 - NOT USED.
BIT 5 -

*0 = MANUAL ANSWER. / 1 = AUTO ANSWER.

BITS 4-2 - B4

B3

B2

PARITY AND FRAMING

- -- -- - - - - - - - -- -

0
0
0
*0
1
1
1
1
BITS 1-0 - B1

0
0
1
1
0
0
1
1

- - - - - - - -- --- -- - -- --

MARK, 7 BITS DATA
SPACE, 7 BITS DATA
ODD, 7 BITS DATA
EVEN, 7 BITS DATA
NONE, 8 BITS DATA
RESERVED
RESERVED
RESERVED

0
1
0
1
0
1
0
1

BO

MODEM DATA RATE

------- - -- --- - -- - --------- - -- - - - - -110 BITS PER SECOND
o
o

*1
**1

300 BITS PER SECOND
1200 BITS PER SECOND
2400 BITS PER SECOND

*DEFAULT SETTINGS AFTER STANDY POWER LOST
**NOT PRESENTLY SUPPORTED
BH:

RESERVED FOR FUTURE USE.

OUTPUT: AL = 80H IF MODEM CANNOT BE CONFIGURED OR IS NOT PRESENT.
AL = OOH IF MODEM CONFIGURATION IS PERFORMED OK.
AL
UNDEFINED FOR OTHER FUNCTIONS.
REGISTERS
MODIFIED:

0083
0083
0085
0087
008A
008e
008E
0090
0092
0094
0096
0097

3C
75
E9
3C
74
3C
74
3C
74
F9
E9

01
03
0125 R
00
57
02
08
03
15
01BD R

SYS_PROF
CMP
JNE
JMP
SYS1 :
JE
CMP
JE
CMP
JE
STC
JMP

AX

PROC
AL,l
SYS1
SPROF_MODI FY
CMP
SPROF_READ
AL,2
MPROF_READ
AL,3
MPROF...MODI FY
SPROF_OUT

NEAR
IS REQUEST FOR MODIFY?
AL,O

YES, GO SYS PROF MODI FY •.
NO, REQUEST FOR SYS READ?
YES, EXECUTE SYS PROF READ ..
NO, IS REQ FOR MODEM READ?
YES
NO, IS REQ FOR MODEM WRITE?
YES
SET ERROR RETURN CODE
EX IT ROUTI NE

READ MODEM PROFILE
009A
009C
009F
00A1
00A3
00A6
00A8

B4
E8
8A
FE
E8
8A
E9

10
0000
08
C4
0000
F8
01BB R

OOAB
OOAD
OOAF
00B2
0084
00B6

B4
8A
E8
FE
8A
E8

10
C3
0000 E
C4
C7
0000

MPROF_READ:
MOV
CALL
GELRTCREG
MOV
BL ,AL
INC
AH
CALL
GELRTCREG
MOV
BH ,AL
SPROF_EXIT
JMP

AH,RTCMOD_PROF1 ; ADDR PROFILE BYTE
READ IT
ADDRESS NEXT BYTE
READ IT
RETURN TO CALLER

WRITE MODEM PROFILE AND CONFIGURE MODEM (IF POWER ON)
MPROF...MODI FY:
MOV
MOV
AL, BL
CALL
PULRTCREG
INC
AH
MOV
AL,BH
PULRTCREG
CALL

2-174 ROM BIOS

AH,RTCMOD_PROF1 ; ADDR PROFILE BYTE
WRITE IT
ADDRESS NEXT BYTE
PROFILE IS NOW STORED

CHECK TO SEE I F MODEM IS PRESENT
00B9
OOBC
OOBF

A1 0010 R
F6 C4 20
74 19

MOV
TEST

JZ

AX, EQU I P_FLAG
AH,20H
MODEM_ERROR

GET EQUIPMENT FLAG
TEST MODEM INSTALLED BIT
EXIT WITH ERROR

IF PRESENT, CHECK BATT PWR AND MODEM POWER-ON-BATT ALLOWED BIT
00C1
00C3
00C5

E4 7F
A8 40
75 09

IN
TEST

00C7
00C9
OOCC
OOCE

B4
E8
A8
74

MOV
CALL
TEST

17
0000 E
02
OA

JNZ

JZ

AL,PWR_STAT
AL, EXLPWR
MPROFl

YES, SKIP NEXT TEST

AH, RTCSYS_PROF1
GELRTCREG
AL,MODEM_BATT
MODEM_ERROR

FIND PWR_ON_BATT BIT
FROM PROFILE
IS BATT PWRED MODEM OK?
NO, TURN OFF MODEM

EXTERNAL POWER?

SET UP CONFIG DATA IN AL, AND CALL SET ROUTINE
0000
0002
0005
0007

8A
E8
72
E9

C3
0000
03
01BB R

MPROFl :
CALL
JC
JMP

MOV
MODEMJONFIG
MODEM_ERROR
SPROF_EXIT

AL,BL

GET CONFIG INPUT DATA
AND DO IT
ERROR OUT I F PROBLEM
INT RETURN

ERROR FOUND IN CONFIGURING MODEM, TURN OFF AND EXIT
OODA
OODA
0000
OOEO
00E2

BB
E8
BO
E9

0002
0000
80
01BD R

MODEM_ERROR:
MOV
BX, 0002H
CALL
COM_POWER
MOV
AL,80H
JMP
SPROF_OUT

MODEM POWER OFF
NOW
ERROR RETURN

READ PROFILE ONLY
00E5
00E7
OOEA
OOEC
OOEE
00F1
00F3

B4
E8
8A
FE
E8
8A
FE

17
0000
F8
C4
0000
08
C4

SPROF_READ:
MOV
CALL
GELRTCREG
MOV
BH,AL
INC
AH
CALL
GELRTCREG
MOV
BL,AL
INC
AH

AH,RTCSYS_PROF1

GET HIGH PROF BYTE

GET LCD TIMEOUT VALUE
00F5
00F6
00F9
OOFB
OOFD
0100
0102
0104
0106
0108

52
E8
8A
FE
E8
8A
B1
8B
F6
8A

0000
DO
C4
0000
FO
3C
C2
F1
E8

PUSH
CALL
MOV
INC
CALL
MOV
MOV
MOV
DIV
MOV

OX
GELRTCREG
DL ,AL
AH
GELRTCREG
DH,AL
CL,60
AX,DX
CL
CH,AL

SAVE OX
GET DISPLAY TIMEOUT (LO)
GET DISPLAY TIMEOUT (HI)
DIVIDE TO GET MINUTES
SAVE

TIMEOUT IN SECS

GET SYSTEM OFF TIMEOUT VALUE

alOA
010C
010F
0111
0113
0116
0118
0119
011B

onc
011E
011F
0121
0122

B4
E8
8A
FE
E8
8A
51
B1
92
F6
59
8A
5A
E9

1B
0000
DO
C4
0000
FO
3C
F1
C8
01BB R

MOV
CALL
MOV
INC
CALL
MOV
PUSH
MOV
XCHG
DIV
POP
MOV
POP
JMP

AH, RTCSYS_I NACT
GELRTCREG
DL,AL
AH
GELRTCREG
DH,AL
CX
CL,60
AX,DX
CL
CX
CL,AL
OX
SPROF_EXIT

GET SYSTEM INACTIVITY VALUE
GET DISPLAY TIMEOUT (LO)
GET DISPLAY TIMEOUT (HI)
SAVE CX REG
DIVIDE TO GET MINUTES
RESTORE CX
SAVE TIMEOUT IN SECS
RESTORE OX REGISTER

MODIFY PROFILE

ROM BIOS 2-175

0125
0126
0129
012B
0120
0130
0132
0134
0137
0138

9C
E8
B4
8A
E8
FE
8A
E8
53
52

0000
17
C7
0000
C4
C3
0000

SPROF_MODI FY:
PUSHF
CALL
DISABLE_NMI
MOV
AH,RTCSYS_PROFI
MOV
AL, BH
CALL
PULRTCREG
INC
AH
MOV
AL, BL
CALL
PULRTCREG
PUSH
BX
PUSH
OX

DISABLE INTERRUPTS
SELECT HIGH PROFILE BYTE

; SAVE REGISTERS

CONVERT UNITS FROM MINUTES TO SECONDS FOR LCD INACTIVITY
0139
0139
013B
0130
013F
0141
0143
0145
0148
014A
014C

8A
2A
B3
F6
8B
B4
E8
FE
8A
E8

C5
E4
3C
E3
08
19
0000
C4
C7
0000

014F
0151
0153
0155
0157
0159
0158
015E
0160
0162
0165
0168
016B
016C
0160

8A
2A
B3
F6
8B
84
E8
FE
8A
E8
E8
E8
5A
5B
90

CI
E4
3C
E3
08
IB
0000
C4
C7
0000
0000
0000

SPROF_MOl:
MOV
AL,CH
SUB
AH,AH
MOV
BL,60
MUL
BL
MOV
BX,AX
AH, RTCLCD_I NACT
MOV
CALL
PULRTCREG
INC
AH
MOV
AL, BH
CALL
PULRTCREG

GET TIMEOUT IN MINUTES
MULTIPLY TO GET SECONDS
GET INACT VALUE ADDRESS
INCREMENT ADDRESS
WRITE HIGH VALUE

CONVERT UNITS FROM MINUTES TO SECONDS FOR SYSTEM OFF INACTIVITY
MOV
SUB
MOV
MUL
MOV
MOV
CALL
INC
MOV
CALL
CALL
CALL
POP
POP
POPF

AL, CL
AH,AH
BL,60
BL
BX,AX
AH, RTCSYS_I NACT
PUT_RTCREG
AH
AL, BH
PUT_RTCREG
BALSALSETUP
ENABLE_NMI
OX
BX

GET TIMEOUT IN MINUTES
MUL TIPL Y TO GET SECONDS
GET INACT VALUE ADDRESS
INCREMENT ADDRESS
WRITE HIGH VALUE
SETUP FOR BATTERY SAVE
RESTORE REGISTERS
RESTORE INTERRUPTS

SET MODEM AND RS-232 POWER STATE IF ON BAT PWR ACCORDING TO PROFILE
I F ON EXTERNAL POWER THEN FORCE MODEM AND RS-232 ON
016E
0170
0172
0174
0177
0178
017A
017C
017F
0181
0184
0184
0186

E4
AS
74
80
52
8B
2A
F6
74
80

7F
40
03
CF 03

0189
018B
018E
0190
0193
0193
0195
0197
019A
019C
019E
01AI

2A
F6
74
80

FF
C6 01
03
CF 01

B3
B4
E8
A8
74
80
E8

04
IF
0000 E
10
03
CB 01
0000 E

03
FF
C6 02
03
CF 01

B3 02
E8 0000

IN
AL,PWILSTAT
TEST
AL, EXLPWR
JZ
EXECPROF
OR
BH ,03
EXECPROF :
PUSH OX
MOV
OX, BX
SUB
BH, BH
TEST
DH,MODEM_BATT
JZ
SETJoIOD
OR
BH ,01
SELMOD:
MOV
BL ,ACTJoIODEM
COM_POWER
CALL

; GET POWER STATUS
; ON EXTERNAL POWER?
NO, GO ACCORDING TO PROF
YES, SELECT FORCE TO POWER
SAVE REGISTER
SAVE & SET UP SYS PROF TEST
SET DEFAULT TO POWER OFF
PROF MODEM BAT POWER ACTIVE?
NO, EXECUTE MODEM POWER OFF
YES, ACTIVATE MODEM BAT PWR
SELECT MODEM
SET CORRESPONDING PWR STATE
IN DEVICE SPECIFIED BY BL

SUB
BH, BH
SET DEFAULT TO POWER OFF
TEST
DH, RS232_BATT
PROF RS-232 BATT PWR ACTIVE?
JZ
SELRSP
NO, EXECUTE RS-232 POWER OFF
OR
BH ,01
YES, ACTIVATE RS-232 BAT PWR
SELRSP:
MOV
BL ,ACLRS232
SET DEFAULT
MOV
AH,RTCFEALCON
SELECT FEATURE CONFIG
CALL
GELRTCREG
GET FEATURE CON FIG
TEST
AL,PRLINST
IS RS-232 PRIMARY COM PORT?
JZ
SELRS232
NO, ITS NOT PRIMARY
OR
BL,SELRS23LPRIM
; YES, SELECT RS-232 PRIMARY
SELRS232 :
CALL
COM_POWER ; SET POWER STATE

2-176 ROM BIOS

01M
01A6

8B OA
5A

MOV
POP

BX, OX
OX

RESTORE SYS PROF
SAVE REGISTER

SET LCD HIGH INTENSITY SUBSTITUTE
01A7
01A7
0lA8
01AA
01AC
01AE
01B1
01B3
01B5
01B6
01B7
01BA
01BB
01BB
OIBO
01BO
01BE

53
8A
DO
DO
80
B4
BO
9C
DE
E8
5B

OF
EB
EB
E3 03
14
02
0000 E

2A CO
C3

SELLCO_OPT:
PUSH
BX
MOV
BL, BH
SHR
BL,l
SHR
BL,l
AND
BL,03H
MOV
AH,20
MOV
AL,2
PUSHF
PUSH
CS
CALL
VIDEO_IO_I
POP
BX
SPROF_EXIT:
SUB
AL,AL
SPROF_OUT:
RET
SYS_PROF
ENOP

SAVE BX REG

SAVE ONLY LCD SUBSTITUTE TYP
VIDEO FUNCTION CALL 20
SET LCD HIGH INTENSITY SUB
I NT 10 CALL
RESTORE BX REG
SET GOOD RETURN

External Event Services (EXT _EVENT)
INT 15H
ROUTINE-NAME:
FUNCTION:

EXLEVENT (AH " 41H)

TO WAIT FOR A SPECIFIC STATUS CHANGE AFTER AN EXT EVENT
(OMA OR INTERRUPT) WHILE KEEPING THE SYS CLKS STOPPED TO
CONSERVE BATTERY POWER.

ROM BIOS 2-177

INPUT:

ES:DI CONTAINS POINTER TO BYTE IN USERS STORAGE FOR
EVENT DETERMINATION (FOR AL:01-04)
- 0 R OX CONTAINS ADDRESS OF 1/0 PORT ADDRESS TO BE READ FOR
EVENT DETERMINATION (FOR AL:11-14)
AL - EVENT
00
01
02
03
04
11-14

TYPE CODE
- RETURN AFTER ANY EVENT HAS OCCURRED
- COMPARE: RETURN I F EQUAL
- COMPARE: RETURN I F NOT EQUAL
- TEST: RETURN I F NOT ZERO
- TEST: RETURN I F ZERO
- SAME FUNCTION AS ABOVE EXCEPT OX CONTAINS
1/0 PORT ADDRESS FOR EVENT DETERMINATION

BH - CONDITION COMPARE OR MASK VALUE
BL - TIMEOUT VALUE (IN 55 MSEC UNITS)
BL : 0 - NO TIME LIMIT
OUTPUT:

CARRY FLAG: SET
- TIMEOUT REACHED
CLEAR - EVENT OCCURRED

REGISTERS
MODIFIED:

AX

RESTRICTIONS:

THIS ROUTINE WILL ENABLE PROC IRPTS NO TIMEOUT WILL
OCCUR IF TMR 0 IS NOT ENABLED WAITING ON NMI IRPTS
I S NOT ALLOWED.

-- --------- --- ----------- --- --- --------------- --- -- -- - - - ----- - -- - - - - -- - - - - - - -01BE

EXLEVENT PROC NEAR

01BE
01CO
01C3
01C5
01C8

8A
80
74
80
88

EO
FB 00
07
CC 20
IE 007B R

01CC
01CC
01CE
0100
0102

24
3C
75
E9

OF
00
03
0259

0105
0105
0107
0109
01DB
OlDD
01DF
OlEl
01E3

3C
74
3C
74
3C
74
3C
75

01
64
02
44
03
24
04
1C

MOV
CMP
JE
OR
MOV

AH,AL
BL,O
EXLWTl
AH,20H
EVENLTIM_OUT ,BL

SAVE TYPE CODE
NO TIME LIMIT FOR TIMEOUT?
NO, GO CHECK FOR WAIT TYPE
YES, SET NO TIMEOUT FLAG
SAVE TIMEOUT VALUE

EXLWTl:
AND
CMP
JNE
JMP

AL ,OFH
AL,O
EXLWT2
ANLWAIT

SAVE ONLY TYPE
WAIT ON ANY EVENT?
NO, CHECK FOR SPECIFIC EVENT
YES, WA IT ON ANY EVNT TO RET

EXLWT2 :
CMP
JE
CMP
JE
CMP
JE
CMP
JNE

AL,Ol
CEQ_WAIT
AL,02
CNEQ_WAIT
AL,03
TNLWAIT
AL,04
I NY-EVENT

COMPARE, RETURN EQUAL?
COMPARE , RETURN NOT EQUAL
TEST, RETURN NOT ZERO
I F NOT 4 THEN INVALID EVENT

TEST, RETURN I F ZERO
01E5
01E5
01E8
01EB
OlEO
01FO
01F2

E8 026B R
F6 C4 10
75 08
26: 84 3D
74 70
EB 06 90

TLWAIT:
CALL
TEST
JNZ
TEST
JZ
JMP

2-178 ROM BIOS

PREP_WAIT
AH,10H
TLWTl
BYTE PTR ES: [01], BH
WAIT_DONE
TLWT2

PREPARE FOR WAIT
TEST FOR 110 PORT READ
RETURN I F ZERO

01F5
01F5
01F6
01F8

EC
84 C7
74 68

TLWTl:
IN
TEST
JZ

AL,DX
AL,BH
WAILDONE

01FA
01FA
01FD
01FF

E8 0277
72 64
EB E4

TLWT2:
CALL
JC
JMP

EVENLWAIT
WAIT_EXIT
TLWAIT

READ FROM I/O PORT

INVALID EVENT SO SET CARRY AND EXIT
0201
0201
0202

F9
EB 5F 90

INLEVENT:
STC
WAIT_EXIT
JMP

SET CARRY FOR INVAL EVNT TVP

TEST, RETURN I F NOT ZERO
0205
0205
0208
020B
020D
0210
0212
0215
0215
0216
0218

EC
84 C7
75 48

TNLWAIT:
CALL
TEST
JNZ
TEST
JNZ
JMP
TNLWTl:
IN
TEST
JNZ

021A
021A
0210
021F

E8 0277 R
72 44
EB E4

TNLWT2:
CALL
JC
JMP

E8 026B R
F6 C4 10
75 08
26: 84 3D
75 50
EB 06 90

PREP _WAIT
AH,10H
TNLWTl
BYTE PTR ES: [DI], BH
WAIT_DONE
TNLWT2

PREPARE FOR WAIT
TEST FOR I/O PORT READ

AL,DX
AL,BH
WAIT_DONE

READ FROM I/O PORT

RETURN I F ZERO

EVENLWAIT
WAILEXIT
TNLWAIT

COMPARE, RETURN I F NOT EQUAL
0221
0221
0224
0227
0229
022C
022E

E8 026B R
F6 C4 10
75 08
26: 38 3D
75 34
EB 06 90

CNEQ_WAIT :
CALL
TEST
JNZ
CMP
JNE
JMP

PREP_WAIT
AH,10H
CNEQ_WTl
BYTE PTR ES: [Dll ,BH
WAIT_DONE
CNEQ_WT2

PREPARE FOR WAIT
TEST FOR I/O PORT READ

0231
0231
0232
0234

EC
3A C7
75 2C

CNEQ_WTl :
IN
CMP
JNE

AL,DX
AL, BH
WAILDONE

READ FROM I/O PORT

0236
0236
0239
023B

E8 0277 R
72 28
EB E4

CNEQ_WT2 :
CALL
JC
JMP

EVENLWAIT
WAILEXIT
CNEQ_WAIT

RETURN I F ZERO

COMPARE, RETURN I F ZERO
023D
023D
0240
0243
0245
0248
024A

E8 026B R
F6 C4 10
75 08
26: 38 3D
74 18
EB 06 90

CEQ_WAIT :
CALL
TEST
JNZ
CMP
JE
JMP

PREP_WAIT
AH,10H
CEQ_WTl
BYTE PTR ES: [DI],BH
WAIT_DONE
CEQ_WT2

PREPARE FOR WAIT
TEST FOR I/O PORT READ

024D
024D
024E
0250

EC
3A C7
74 10

CEQ_WTl :
IN
CMP
JE

AL,DX
AL,BH
WAIT_DONE

READ FROM I/O PORT

0252
0252

E8 0277 R

CEQ_WT2:
CALL

EVENLWAIT

RETURN I F ZERO

ROM BIOS 2-179

0255
0257

72 OC
EB E4

JC
JMP

WAILEXIT
CEQ_WAIT

WAIT ON ANY EVENT
0259
0259
025C
025F

E8 026B R
E8 0277 R
EB 02 90

ANLWAIT:
CALL
CALL
JMP

0262
0262

F8

WAILDONE:
CLC

9C
BO 27
E6 72
9D
FB
C3

WAILEXIT:
PUSHF
; SAVE FLAGS
AL,DISABLE_SLEEP+CLOCK_RUN+GLOBALNMI ; ON NMIS
MOV
OUT
CLOCICCTL ,AL
; RESTORE FLAGS
POPF
; RE-ENABLE INTERRUPTS
STI
;
EXIT
RET

0263
0263
0264
0266
0268
0269
026A

PREP_WAIT
EVENLWAIT
WAIT_EXIT

SET UP FOR CLOCK STOP
EXECUTE CLOCK STOP

CLEAR CARRY FLAG

THIS ROUTINE ENABLES THE SLEEP CLOCK BUT SETS THE STATE TO CLOCK RUN
THIS MUST BE DONE IN ORDER TO COVER THE TIMING PROBLEM OF THE IRPT
OCCURRING AFTER THE CONDITION TEST BUT BEFORE THE CLOCKS ARE STOPPED
026B
026B
026C
026E
0270
0272
0274
0276
0277

PREP _WAIT
FA
BO
E6
EB
24
E6
C3

CLI
MOV
OUT
JMP
AND
OUT
RET
PREP _WAIT

07
72
00
FB
72

PROC NEAR
; DISABLE INTERRUPTS
AL,CLOCK_RUN+DISABLCSLEEP ; DSABL NMI ST FL SPEED
CLOCICCTL,AL
; NO ENABLE SLEEP CLOCK
$+2
; DELAY
AL,NOT DISABLE_SLEEP; ENABLE SLEEP CLOCK
CLOCICCTL, AL
ENDP

THIS SUBROUTINE STOPS THE SYSTEM CLOCKS AND RTN AFTER THEY HAVE BEEN
RESTARTED. IF AN INTERRUPT HAS OCCURRED BTWN PREP_WAIT & EVENLWAIT
THE SLEEP CLOCK WILL HAVE BEEN DISABLED BY HARDWARE & THE EVENLWAIT
ROUTINE WILL "FALL THROUGH" WITHOUT STOPPING THE CLOCKS.
ONCE THE CLOCKS HAVE RESUMED, THE TIMEOUT VALUE IS CKED (IF USED) &
THE CARRY FLAG SET I F TIMEOUT
0277
0277
0279
027B
027D
027E
0280

EVENLWAIT
IN
AND
OR
STI
OUT
JMP

E4
24
OC
FB
E6
EB

72
FC
20
72
00

F6
74
38
77
80
75

C4 20
OF
IE 007B R
07
3E 007B R 00
02

PROC NEAR
AL, CLOCICCTL
AL, NOT CLOCK_RUN
AL,GLOBALNMI
CLOCICCTL,AL
$+2

TURN ON NMIS
ENABLE INTERRUPTS
STOP CLOCKS
DELAY

CLOCKS HAVE RESTARTED
0282
0285
0287
028B
028D
0292
0294
0294
0295
0296
0296
0297
0298
0298

F9
C3
F8
C3

TEST
JZ
CMP
JA
CMP
JNZ
TIMEOUT:
STC
RET

AH,20H
NO_TIMEOUT
EVENLTlM_OUT ,BL
TIMEOUT
EVENLTlM_OUT ,0
NO_TIMEOUT

NO_TIM EOUT:
CLC
RET
EVENLWAIT ENDP
EXLEVENT ENDP

2-180 ROM BIOS

TIMEOUT TO BE TAKEN
JUMP I F NOT
CHECK ENOUGH TIME
I F ORIGINAL TIME THEN ERROR
CHECK FOR TIME ELAPSED
TIMEOUT - SET CARRY
RETURN
NO TIME_OUT SO CLEAR CARRY
RETURN

System Power Off Services
(SYS_POWER_OFF)
I NT ISH
ROUTINE-NAME:

THIS ROUTINE POWERS THE SYSTEM DOWN BY THE REQUEST OF THE
APPLICATION PROGRAM. IF WARM START WAS SELECTED THE PGM
WILL RESUME IN THIS ROUTINE AND RETURN TO THE CALLER.

INPUT:

= 00
= 01

AL
AL

3C 01
75 05
80 OE 0016 R 40
80 26 003F R CO
BA 03F2
BO 04
EE
E4
24
OC
E6
EB
OC
E6
B9
E2

7F
F7
04
7F
00
02
7F
0102
FE

FOR IPL/RESUME DETERMINED BY PROFILE
FOR RESUME MODE FORCED

THE SYSTEM IS POWERED OFF. IF SYS SUCCESSFULLY SUSPENDED,
THIS ROUTINE WILL RETURN CONTROL TO THE USER WHEN THE POWER
IS RE-ACTIVATED.

REGISTERS
MODIFIED:

02AC
02AE
02BO
02B2
02B4
02B6
02B8
02BA
02BD

(AH = 42H)

FUNCTION:

OUTPUT:

0298
0298
029A
029C
02Al
02Al
02A6
02A9
02AB

SYS_POWEILOFF

AX

SYS_POWEILOFF
PROC
NEAR
CMP
AL,OI
SYS_POFFl
JNE
BIOS_STATUS, F_RESUME
OR
SYS_POFFI :
MOTOR_STATUS,OCOH
AND
MOV
OX, 03 F2H
MOV
AL,04H
OUT
DX,AL
IN
AND
OR
OUT
JMP
OR
OUT
MOV
LOOP

AL, PWR_STAT
AL,NOT HDWR_RESET
AL,EN_SUS_NMI
PWR_STAT ,AL
$+2
AL, REQ_POFF
PWR_STAT ,AL
CX ,MS_D ELA Y
$

REQUEST FOR RESUME MODE?
SET FORCE RESUME FLAG
RESET DISKETTE MOTORS
TURN OFF MOTORS/SELECT
ENSURE SUSPEND NMI ENABLED
TURN OFF RESET FLAG
DELAY
REQUEST SYSTEM POWER OFF
DELAY 1 MSEC

POWER HAS BEEN RESTORED
02BF
02CO
02Cl

F8
C3

CLC
RET
SYS_POWER_OFF

SET GOOD RETURN
ENDP

ROM BIOS 2-181

System Status Services (SYS-STATUS)
INT 15H
ROUTINE-NAME:
FUNCTION:

SYS_STATUS

(AH

= 43H)

THIS ROUTINE RETURNS THE CURRENT SYSTEM STATUS IN THE
AL REGISTER AS DEFINED BELOW.

INPUT:

NONE.

OUTPUT:

AL CONTAINS SYSTEM STATUS AS FOLLOWS:
17161514131211101
1

1
----> LCD DETACHED
----> RESERVED
1
----> RS-232 POWERED ON
----> MODEM POWERED ON
----> POWER ACTIVATED BY RTC ALARM
----> STANDBY POWER LOST (RTC TIME BAD)
----> OPERATING ON EXTERNAL POWER
----> LOW BATTERY
1

REGISTERS
MODIFIED:

02Cl
02Cl
02C2
02C4
02C7
02C9
02CB
02CD
02CF
0201
0203
0206
0208
02DA
0200
0200

53
B4
E8
24
8A
E4
24
OA
B4
E8
AS
74
80

21
0000
10
08
7F
CO
08
OE
0000
80
03
CB 20

E4 7C

AX

SYS_STATUS
PROC
NEAR
PUSH
BX
MOV
AH, RTCSYS_STAT
CALL
GELRTCREG
AND
AL, PON_ALRM
MOV
BL,AL
IN
AL,PWR_STAT
AND
AL,LOW_BAT+EXLPWR
OR
BL,AL
MOV
AH, RTCDIAG_STAT
CALL
GELRTCREG
TEST
AL, RTCTIME_BAD
JZ
SYS_STATl
OR
BL,20H
SYS_STATl :
IN
AL,KYBD_CNTL

2-182 ROM BIOS

SAVE BX
SELECT POWER ON STAT
GET POWER ON STAT
SAVE ONLY POWER ON
ALARM STATUS
GET CURRENT POWER STATUS
SAVE ONLY POWER STATUS
SET COMBINED POWER STATS
SELECT RTC TIME
GET RTC TIME
IS RTC TIME BAD?
NO, THEN GO READ SETTINGS
YES, SET RTC TIME BAD
STANDBY POWER LOST
GET COMMO POWER STATUS

02DF
02El
02E3
02E6
02E8

8A
B4
E8
A8
74

02EA
02ED
02EF

F6 C7 02
74 03
80 CB 08

MOV
MOV
CALL
TEST
JZ

F8
IF
0000 E
40
08

SAVE THE STATUS
SELECT FEATURE CONFIG
GET FEATURE CON FIG
I NTERNAL MODEM PRESENT?
NO, CHECK FOR RS-232

BH,AL
AH,RTCFEALCON
GELRTCREG
AL,INTMOD_INST
CHLFOILRS

TEST MODEM FOR POWER ACTIVE
TEST
JZ
OR

YES, IS MODEM POWER ON?
NO, CHECK FOR RS-232 CARD
YES, SET MODEM ACTIVE

BH ,ACLMODEM
CHLFOILRS
BL,08

TEST RS-232 FOR POWER ACTI VE
02F2
02F2
02F4
02F6
02F9
02FB

A8
74
F6
74
80

CHLFOR_RS:
AL, SERPLL_INST
TEST
JZ
CHLFOILLCD
TEST
BH, ACLRS232
JZ
CHLFOILLCD
OR
BL,04

80
08
C7 04
03
CB 04

IS RS-232 CARD INSTALLED?
NO, JUMP TO LCD CHECK
YES, IS RS-232 POWER ON?
NO, JUMP TO LCD CHECK
YES, SET RS POWER ACTIVE

TEST I F LCD IS OPERATIVE
02FE
02FE
0300
0303
0305
0307
030A
030A
030C
0300
030E
030F

B4
E8
A8
75
80

CHLFOR_LCD:
AH, RTCDSP _CON
MOV
CALL
GELRTCREG
AL, DSP~LCD+DSP _CLCD
TEST
SYS_STALEXIT
JNZ
OR
BL,OI
SYS_STALEXIT:
MOV
AL,BL
POP
BX
CLC
RET
SYS_STATUS
ENDP

20
0000 E
03
03
CB 01

8A C3
5B
F8
C3

LOOK AT THE DISPLAY
CONFIGURATION
IS LCD CONFIGURED?
YES, THEN LEAVE ROUTINE
NO, LCD IS INOPERATIVE
RESTORE STATUS BACK TO AL
RESTORE BX REG
SET NORMAL GOOD RETURN

Modem Power Services
(SYS_MODEM_PWR)
; -- - - --- --- -- -- -- -- - - ---- - - -- -- -- - - - -- - -- - - - - - -- -- - - - - - - - - - -- - - - - -- ---

INT 15H

(AH = 44H)

SYS_MODE~PWR:

INPUT:

THIS PROCEDURE TURNS ON OR OFF THE MODEM

<>

AL = 0, POWER OFF; AL

0, POWER ON.

OUTPUT: AL = 0 IF SUCCESSFUL; AL = 80H IF NOT SUCCESSFUL
REGISTERS USED:
SYS~ODEM_PWR

030F
030F
0311

OA co
74 OE

0313
0313
0315
0318
031B

B4
E8
E8
73

0310
031F

BO 80
EB 08

OR
JZ

AX DESTROYED.

PROC

NEAR

AL,AL
SYS~OD_OFF

; TEST AL FOR COMMAND
; TURN MODEM OFF

SYS~OD_ON:

10
0000 E
0000 E
OA

AH, RTC~OD_PROFl
GELRTCREG

MOV
CALL
CALL
JNC

MODE~CONFIG
SYS~OD_END

MOV
JMP

AL,80H
SHORT SYS~OD_EXIT

GET THE PROFI LE REG
PLACE PROFILE IN AL
CONFIGURE AND POWER MODEM
ERROR EXIT

ROM BIOS 2-183

0321
0321
0324
0327
0327
0329
0329
032A

BB 0002
E8 0000 E
2A CO
C3

SYS_MOD_OFF:
MOV
BX ,0002H
COM_POWER
CALL
SYSjlOD_END:
SUB
AL,AL
SYS_MOD_EX IT:
RET
SYSjlODEM_PWR

2-184 ROM BIOS

SELECT MODEM
AND TURN OFF
RETURN WIO ERROR

ENDP

POST Interval Services (POST_INTV)
I NT 15H
ROUTINE-NAME:
FUNCTION:

INPUT:

POSLINTV

(AH = 83H)

POST USER WHEN ELAPSED TIME INTERVAL HAS EXPIRED WITH NO
WAIT. (RETURNS IMMEDIATELY AND POSTS OCCURRENCE VIA RTC
INTERRUPTS)

AL = 0 SET UP FOR POST ON ELAPSED TIME INTERVAL
ES: BX POINTER TO BYTE IN CALLERS STORAGE FOR POST
CX,DX NUMBER OF MICROSECONDS TO ELAPSE BEFORE POSTING
(CX MOST SIGNIFICANT)
AL

=

1 CANCEL THE INTERVAL POST

OUTPUT: FOR POST SET - RTC PERIODIC INTERRUPT IS ACTIVATED TO KEEP
TRACK OF ELAPSED TIME. INTERRUPTS AT
APPROXIMATELY A 1 MILLISECOND RATE. WHEN TIME
HAS ELAPSED THE USER FLAG POINTED BY ES:BX WILL
HAVE BIT 7 SET TO A 1. THE PERIODIC INTERRUPT
WILL THEN BE TURNED OFF.
FOR CANCEL - RTC PERIODIC INTERRUPT IS TURNED OFF AND THE
POST ACTIVE FLAG IS RESET.
REGISTERS
MODIFIED:

032A
032A
032C
032E

B4 OB
3C 00
74 14

0330
0331
0334
0337
0339
033C
0341

9C
E8
E8
24
E8
80
EB

AX

POSLINTV
MOV
CMP
JE

PROC
NEAR
AH, RTCMODE
AL,O
POSTLI

SET REGISTER NUMBER FOR RTC
CHECK FOR SET
MUST BE CLEAR

CANCEL ANY OUTSTANDING INTERVAL
0000 E
0000 E
BF
0000 E
26 OOAO R FE
37 90

PUSHF
CALL
CALL
AND
CALL
AND
JMP

DISABLE INTERRUPTS
AND 8259 INTERRUPTS
GELRTCREG
GET MODE
AL, NOT PIE_ENABLE
RESET PERIODIC IRPT ENABLE
PULRTCREG
; SET MODE
RTCWAILFLAG,NOT INTERVAL_WAIT; RST INTVL ACTIVE
POSTL3
; ENABLE INTERRUPTS AND EXIT

oI SA BL E_NM I

; SET INTERVAL UNLESS ALREADY ACTIVE
0344
0344
0349

F6 06 OOAO R 01
74 04

034B
034C

F9
EB 31 90

POSTLI :
TEST
JZ

RTCWAILFLAG, INTERVAL_WAIT
POSTL2

CHECK WAIT IN PROG

WAIT IS ACTIVE SO SIGNAL ERROR
STC
JMP

POSTI_EXIT

SET ERROR
RETURN

ACTIVATE RTC PERIODIC INTERRUPT
034F
034F
0350
0353
0357
035B
035F

9C
E8
8C
89
89
89

0000 E
06 009A
IE 0098
DE 009E
16 009C

R
R
R
R

POSTL2:
PUSHF
CALL
MOV
MOV
MOV
MOV

DISABLLNMI
USER-FLAG....SEG, ES
USER_FLAG, BX
RTCHIGH,CX
RTCLOW,DX

DISABLE INTERRUPTS
SET UP TRANSFER TABLE

ROM BIOS 2-185

0363
0368
036C
036F
0371
0374
0376
0378
037A
037A
0370
037E
037F
037 F
0380

80 OE OOAO R 01
26: 80 27 7F
E8 0000 E
OC 40
E8 0000
E4 61
24 F7
E6 61
E8 0000
90
F8

OR
AND
CALL
OR
CALL
IN
AND
OUT
POSTL3:
CALL
POPF
CLC

RTCWAILFLAG,INTERVALWAIT ; SET INTVL POST ACT
BYTE PTR ES: [BX-,NOT POSTED; RST POST FLAG
GELRTCREG
GET MODE
AL,PILENABLE
ENABLE RTC PERIODIC IRPT
PULRTCREG
SET MODE
AL,NMLCNTL
ENABLE ALARM INTERRUPT
AL,NOT DIS-.ALARM
NMLCNTL,AL
ENBL RTC ALARM AND SUSP NMIS
RESTORE INTERRUPT STATUS
SET GOOD RETURN

POSTLEXIT:
RET
POSLINTV ENDP

C3

Wait Interval Services (WAIT_INTV)
-

; ---------------------------- - ----- - ----- - -- - -- - - - - - - - - - - - -- - - - - -

-- --

INT 15H
ROUTINE-NAME: WAILINTV

WAIT FOR ELAPSED TIME TO EXPIRE BEFORE PASSING CONTROL
THE USER. THIS FUNCTION USES THE RTC PERIODI C IRPT AND
WAIT ON EXTERNAL EVENT TO CONSERVE BATTERY POWER.

INPUT:

CX,DX NUMBER OF MICROSECONDS TO ELAPSE BEFORE RETURNING.

OUTPUT:

RETURN WITH CARRY CLEAR DONE AFTER ELAPSED TIME REACHED.

06 OOAO R 01
04
50 90
0000 E
IE 009A R
06 0098 R
OE 009E
16 00ge
OE OOAO
26 OOAO
OB
0000
40
0000
61
F7
61
0000

= 86H)

FUNCTION:

REGISTERS
MODIFIED:

0380
0380 F6
0385 74
0387 F9
0388 EB
038B
038B 9C
038C E8
038F 8C
0393 C7
OOAO R
0399 89
039D 89
03Al 80
03A6 80
03AB B4
03AD E8
03BO OC
03B2 E8
03B5 E4
03B7 24
03B9 E6
03BB E8
03BE 9D

(AH

R
R
R 01
R 7F

AX

WAILINTV
TEST
JZ
STC
JMP
WAILl:
PUSHF
CALL
MOV
MOV
MOV
MOV
OR
AND
MOV
CALL
OR
CALL
IN
AND
OUT
CALL
POPF

PROC
NEAR
RTCWAILFLAG, INTERVAL_WAIT; TEST INTERVAL ACTIVE
WAILI
; SET ERROR
WINTLEXIT
; RETURN
DISABLE_NMI
USEILFLAG...SEG,DS
; SET UP TRANSFER TABLE
US ER_FLAG, 0 FFS ET RTCWA I LFLAG
RTCHIGH,CX
RTCLOW,DX
RTCWAILFLAG, INTERVAL_WAIT; SET FUNCTION ACTIVE
RTCWAILFLAG,NOT POSTED; RESET POST FLAG
AH, RTCMODE
GET MODE REGISTER
GELRTCREG
AL, PI E_ENABLE
ENABLE RTC PERIODIC IRPT
SET MODE
PULRTCREG
ENABLE ALARM INTERRUPT
AL,NMLCNTL
AL,NOT DIS-.ALARM
NMLCNTL,AL
ENABLE_NMI
RE-ENABLE NMI'S
RESTORE FLAGS

WAIT ON EXTERNAL EVENT TO CONSERVE BATTERY PWR FOR THE ALLOTTED TIME

2-186 ROM BIOS

03BF
03CO
03C1

06
57
53

PUSH
PUSH
PUSH

ES
01
BX

SAVE REGISTERS

03C2
03C3
03C4
03C8
03CA
03CC
03CE

IE
07
8B
BO
B7
2A
E8

PUSH
POP
MOV
MOV
MOV
SUB
CALL

OS
ES
01 ,USER_FLAG
AL,03
BH, POSTED
BL,BL
EXLEVENT

SET ES TO DATA SEGMENT

0301
0302
0303
0304
0309

5B
5F
07
80 26 OOAO R 7E
F8

03DA
030A
03DB

C3

3E 0098 R
03
80
DB
01BE R

GET POSTED BYTE ADDR IN ES:DI
SET TEST & RTRN I F NOT ZERO
SET RTRN FOR INTERVAL POSTED
SET NO TIME LIMIT
WAIT ON EVENT

TIME HAS ELAPSED, RESTORE REGISTERS AND TURN OF PERIODIC INTERRUPT
POP
POP
POP
AND
CLC

BX
; RESTORE REGISTERS
01
ES
RTCWAILFLAG, NOT POSTED+ INTERVAL_WAIT

WINTLEXIT:
RET
WAILINTV

RST FUNCT

ENDP

Device Busy Services (DEV_BUSY)
INT 15H
ROUTINE-NAME:
FUNCTION:

DELBUSY

(AH

THIS ROUTINE IS CALLED TO INDICATE THAT A DEV IS BUSY.
FOR THE DEVICE TYPE = DISKETTE, A RTRN IS NOT MADE UNTIL
A DISKETTE INTERRUPT HAS BEEN RECEIVED OR 2 SECONDS HAVE
ELAPSED (WHICHEVER IS FIRST). FOR THE DEV TYPE = KYBRD A
RETURN WILL NOT BE MADE UNTIL T*HE KYBD BFR IS IN A NOT
EMPTY CONDITION.

ENTRY IEXIT
CONDITIONS:
INPUT:
AL = DEVICE TYPE:
01 - DISKETTE

RETURN AFTER IRPT RECEIVED OR 2
SECOND TIMEOUT HAS OCCURRED CARRY
SET I F TIMEOUT

02 - KEYBOARD

RETURN WHEN KEYBOARD
BUFFER HEAD <> BUFFER TAIL

FD - WAIT FOR
MOTOR STARTUP

RETURN WHEN TIME HAS EXPIRED IF
TIMER 0 IS RUNNING OR IMMEDIATE
RETURN WHEN NOT RUNN I NG ON ENTRY CH
CONTAINS TIME TO WAIT IN 1/8 SEC
UNITS

ALL OTHERS
REGISTERS
MODIFIED:

= 90H)

IMMEDIATE RETURN WITH CARRY CLEAR
AX

ROM BIOS 2-187

03DB
03DB
03DC
0300
03DE
03El
03E3
03E5
03E7
03E9
03EB
03ED

57
06
53
BF
8E
3C
74
3C
74
3C
75

DELBUSY
PUSH
PUSH
PUSH
MOV
MOV
CMP
JE
CMP
JE
CMP
JNE

---C7
01
4B
02
3A
FD
33

PROC
01
ES
BX
DI,DATA
ES,DI
AL,OI
DSKLBUSY
AL,02
KYBD_WAIT
AL ,OFDH
DEVB_CLEAR

NEAR
SAVE REGISTERS

SET ES TO DATA
IS DEVICE TYPE = DISKETTE?
YES, GO SERVICE FOR DISKETTE
NO, DEVICE TYPE = KEYBOARD?
YES, GO SERVICE FOR KEYBOARD
DEV TYPE = DSKT MTR STARTUP?
NO, RETURN WITH CARRY CLEAR

WAIT FOR DISKETTE MOTOR STARTUP TIME TO ELAPSE
WAIT TIME IS IN 125 MILLISECOND UNITS IN CH
03EF
03F2
03F4
03F5
03F7
03F9

E8
73
51
8A
DO
02

0442 R
4A

CALL
JNC
PUSH
MOV
SHL
ADD

DO
E5
DO

TMRO_CHK
DEVB_EXIT
CX
BL ,CH
CH,1
BL ,CH

CHECK FOR TIMER 0 RUNNING
I F NOT RUNN I NG THEN EX IT, NO
WAIT
COPY TIME IN CH
MULTIPLY BY 3
WAIT TIME is IN BL

REQUEST CONTROLLER POWER ON TO OVERLAP PWR ON SEQ WITH MOTOR STARTUP
DELAY
03FB
03 FF
0400
0401
0404

88 IE 007B R
59
52
BA 03F4
EC

MOV
POP
PUSH
MOV
IN

0405

90

NOP

0406
0407
040B
0400
0411
0413
0415
0416
0418
0418
041A
041B
041C

5A
38
77
8A
OA
75
F9
EB

B7 00
OE
07
2B FF

POP
eMP
JA
MOV
OR
JNE
STC
JMP
DEVB_Ol :
MOV
PUSH
POP
SUB

041E
0420

BO 01
EB 19

MOV
JMP

IE 007B R
31
IE 007B R
DB
03
26

EV ENT _TIM_OUT, BL
CX
OX
DX,3F4H
AL,DX

SAVE TIME DLY IN TIMEOUT CTR
RESTORE CX
SAVE OX
DO DUMMY READ TO PWR ON CNTL
FOR MOTOR WAIT OVERLAP
TIMER 0 ROUTINE WILL DECRMNT
TIME VAL EVENLTIM_OUT WHILE
CNTLR IS BEING POWERED ON
BE BACK FROM NMI IF PWR WAS
OFF HERE
RESTORE OX

OX
EVENLTIM_OUT, BL
DEVLEXIT
BL, EV ENLTI M_OUT
BL, BL
DEVLOI

EXIT I F MORE THAN ENOUGH TME
RETRI EVE ADJUSTED WAIT TIME
DON'T WAIT IF TIME EXPIRED
SET CARRY TO SHOW TIMEOUT
EXIT WITH TIME EXPIRED

SHORT DEVB_EXIT
BH,O
CS
ES
01,01

SET COMPARE MASK TO 0
SET ES TO ROM SEGMENT
SET ADDR 0 IN ROM FOR DUMMY
COMPARE
RETURN ON COMPARE EQUAL
WAIT FOR TIMEOUT TO OCCUR

AL,OI
SHORT BUSLWAIT

RETURN WITH CARRY CLEAR
0422
0422
0423

DEVBJLEAR:
CLC
JMP
SHORT DEVLEXIT

F8
EB 19

WAITING FOR KEY IN KEYBOARD BUFFER
PERFORM WAILON_EVENT FOR BUFFEILHEAD
0425
0425
0428
042C
042E
0430

BF
8A
BO
2A
EB

001C R
3E 001A R
02
DB
09

KYBD_WAIT:
MOV
MOV
MOV
SUB
JMP

; EXIT ROUTINE

<>

BUFFER TAIL

(LOW BYTES)

DI,OFFSET BUFFER_TAIL; POINT ES:DI TO BFR HEAD
BH,BYTE PTR BUFFER_HEAD; MASK TO CURRENT BFR TAIL
AL,02
; FN CODE=CMP, RTRN NOT EQUAL
BL, BL
; NO TIMEOUT
SHORT BUSLWAIT

WAIT FOR DISKETTE INTERRUPT COMPLETE
(INLFLAG TO BE SET IN SEEK-STATUS)
0432
0432

BF 003E R

DSKLBUSY:
MOV
DI,OFFSET SEEK-STATUS

2-188 ROM BIOS

GET ADD OF DSKT INTR FLAG

0435
0437
0439

B7 80
BO 03
B3 25

043B
043B

E8 01BE R

043E
043E
043F
0440
0441
0442

MOV
MOV
MOV

BH,INLFLAG
AL,03
BL,25H

INTERRUPT COMPLETE FLAG
FN CODE = TEST, RETURN NOT 0
SET TWO SECOND TIMEOUT

BUSLWAIT:
CALL
EXLEVENT
DEVB_EXIT:
POP
BX
POP
ES
POP
01
RET
DEY-BUSY ENDP
---------------------------------------------------------------------

5B
07
5F
C3

INT 15H
ROUTINE-NAME: TMRO_CHK
FUNCTION: THIS ROUTINE CHECKS TO SEE I F TIMER 0 IS SET UP AS FOLLOWS
IRPT ENABLED TIMER COUNTING INT 8 VECTOR=TMRO_INT8 ADDR
INPUT:

NONE.

OUTPUT:

CARRY FLAG

REGISTERS
MODIFIED:

SET
- TIMER IS RUNNING
CLEAR - TIMER NOT RUNNING

NONE.

----------------------------_ .... _------------------------------------0442
0442
0443
0444
0445
0448
044A
0440
044E
0451
0453
0455
0457
0459
045B
0450
045F
0460
0461
0463
0465
0467
0469
046B
0468
046C
046E
046E
046F
046F
0470
0471
0472

50
53
1E
88
8E
A1
1F
3D
75
E4
A8
75
E4
8A
E4
50
58
E4
8A
E4
38
74

0000
08
0020 R
0000 E
1B
21
01
15
40
EO
40
40
EO
40
C3
03

F9
EB 01
F8
58
58
C3

ASSUME DS:ABSO
TMRO_CHK PROC NEAR
PUSH
AX
PUSH
8X
PUSH
OS
MOV
AX,O
MOV
DS,AX
MOV
AX,INT...ADDR
POP
OS
CMP
AX,OFFSET TMRO_INT8
JNE
TMRO_NORUN
IN
AL,INTA01
TEST
AL,Ol
JNE
TMRO_NORUN
IN
AL, TIMERO
MOV
AH,AL
IN
AL, TIMERO
PUSH
AX
POP
8X
IN
AL, TIMERO
MOV
AH,AL
IN
AL, TIMERO
CMP
AX,8X
TMRO_NORUN
JE
TMRO_OK:
STC
SHORT TMRO_EXT
JMP

CK FOR TMR 0 I RPT ENABLED
EXIT IF DISABLED
MAKE SURE TIMER IS RUNNING

TMRO_NORUN:
CLC
TMRO_EXT:
POP
8X
POP
AX
RET
TMRO_CHK ENDP

RESTORE REGS

GET INT 8 OFFSET ADDRESS
CHECK FOR OUR TIMER ROUTINE
IF NOT THEN EXIT

SAVE CURRENT TMR 0 TIME CNT
RETRI EVE ORIGINAL COUNT
RE-READ TIMER LOW
RE-READ TIMER HI
COMPARE WITH ORIGINAL
JUMP I F TIMER NOT RUNNING
SET CARRY TO INDICATE OKAY

CLEAR CARRY

ROM BIOS 2-189

Interrupt Complete Services
(INT_COMPLETE)
I NT 15H
ROUTINE-NAME: INLCOMPLETE

0472
0472
0472
0473
0474
0474

FB
C3

(AH

= 91H)

FUNCTION:

DUMMY INTERRUPT RETURN (FUNCTION NOT HANDLED BY BIOS)

INPUT:

NONE.

OUTPUT:

NONE.

REGISTERS
MODI FI ED:

NONE.

INLCOMPLETE PROC NEAR
RETURN:
CLC
RET
INLCOMPLETE ENDP
ROMCODE ENDS
END

2-190 ROM BIOS

SET GOOD RETURN CODE

General Subroutines and Tables
(B17TABLE)
ROMCODE SEGMENT BYTE PUBLIC

0000

ASSUME CS:ROMCOOE, OS:DATA
IDENT
BIlTABLE,O,O

*********************************************************************
MODULE-NAME:
BllTABLE
DATE LAST MODIFIED: 09/13/1985
DESCRIPTIVE-NAME: MODULE CONTAINING ALL TABLES USED BY POST/ BIOS,
GENERAL USE SUBROUTINES AND COMPATABLE LINK ADDRESSES
COPYRIGHT: 7396-918 (Cl COPYRIGHT IBM CORP. 1985
REFER TO COPYRIGHT INSTRUCTIONS FORM NUMBER G120-2083
CHANGE LEVEL: ECOOO
MODULE SIZE: 8K BYTES
EXTERNALLY REFERENCED ROUTINES: REFER TO EXTRN LIST
SUBROUTINES:
DDS
ERILBEEP
BEEP
DSP _BYTE
XLALNIB
DSP_HEX
GELRTCREG
PULRTCREG

011
E_MSG
ICON_PR
STR_CON
ENABLE_NMI
DISABLE_NMI
BALSALSETUP
GELVECTOR@
RES_ERR_CHK
TABLES:
PRLTAB
VECTOR_TABLE
BAUD_TABLE
DSKLBASE
VIDEO_PARMS
MI-M7

CHAR_GEN_LO
CHAR_GEN_HI
K6-K30
KBPAD_TBL
KBFUN_TBL
KBNMLTBL
DEF_SYS_PROF

-

SET DATA SEGMENT TO BIOS DATA AREA
BEEP THE SPEAKER FOR POST ERROR CONDITIONS
BBEP THE SPEAKER
TRANSLATE AND DISPLAY HEX BYTE TO SCREEN
TRANSLATE HEX NIBBLE TO ASCII CHARACTER
WRITE HEX BYTE TO SCREEN
READ REAL TIME CLOCK REGISTER
WRITE REAL TIME CLOCK REGISTER
DEFAULT INTERRUPT HANDLER
POST ERROR MESSAGE HANDLER
ICON DISPLAY PROCESSING ROUTINE
CONVERT HEX WORD TO ASCI I STRING
ENABLE KEYBOARD,RTC, AND SUSPEND NMIS
DISABLE KEYBOARD, RTC, AND SUSPEND NMIS
ENABLES/DISABLES THE RTC 1 SECOND BAT SAVING
INTERRUPT
- GET ABSOLUTE VECTOR ADDRESS FOR HARDWARE LEVEL
- CHECK AND DISPLAY ANY RESUME ERRORS
-

PRINTER PORT SEARCH TABLE
INTERRUPT VECTOR INITIALIZATION TABLE
COMMUNICATION BAUDE RATE SELECT TABLE
DISKETTE DRIVE TIMING PARAMETERS
VIDEO 10 PARAMETER TABLES
VIDEO LINKAGE TABLE
LOWER 128 DISPLAY CHARACTER SET
UPPER 128 DISPLAY CHARACTER SET
KEYBOARD TRANSLATE TABLES
PREPROCESSOR KEYPAD XLATE TABLE
PREPROCESSOR FUNCTION KEY XLATE TABLE
PREPROCESSOR NORMAL KEY XLATE TABLE
DEFAULT SYSTEM PROFILE

ROM BIOS 2-191

MESSAGES AND ICONS:
MEM.-MSG
- 'KB OK' MEMORY MESSAGE
ROM.-MSG
- 'XXXXX ROM' MESSAGE
SYS_UNIT
SYSTEM UNIT ICON
FEALICON
FEATURE DEVICE ICON
CLOCK
SYSTEM CLOCK NOT SET ICON
BALI CON
- BATTERY LOW ICON
PAR_CHK
- PARITY CHECK (I/O CHANNEL CHECK) ICON
FLICON
PRESS Fl TO CONTINUE ICON
CHANGE ACTIVITY:

,

NONE

; *********************************************************************
; *****************************************************************

..

EXTERNAL

REFERENCES

; *****************************************************************
PRIVATE BIOS AND POST ROUTINE NAMES
POSTMA! N: NEAR
NMLFLIH: NEAR
SYS_BOOT: NEAR
KYBD_JO: NEAR
KYBD_INT9:NEAR
DSKLIO: NEAR
DSKLINTE:NEAR
PRLIO:NEAR
VIDEO_IO_l:NEAR
SYS_SERV ICES: NEAR
TOD_PROC:NEAR
TMRO_INT8: NEAR
COMMO_JO: NEAR
PRLSCRN: NEAR
COM_POW ER: NEAR
MODEM_CON FIG : NEAR

EXTRN
EXTRN
EXTRN
EXTRN
EXTRN
EXTRN
EXTRN
EXTRN
EXTRN
EXTRN
EXTRN
EXTRN
EXTRN
EXTRN
EXTRN
EXTRN

VIDEO I/O SUBROUTI NES EXTERNALS
EXTRN
EXTRN
EXTRN
EXTRN
EXTRN
EXTRN
EXTRN
EXTRN
EXTRN
EXTRN
EXTRN
EXTRN
EXTRN
EXTRN
EXTRN
EXTRN

SELMODE: NEAR
SELCTYPE: NEAR
SELCPOS: NEAR
READ_CURSOR: NEAR
READ_LPEN: NEAR
ACLDISP_PAGE:NEAR
SCROLL_UP: NEAR
SCROLL_DOWN: NEAR
READ-ACCURRENT: NEAR
WRITE-ACCURRENT:NEAR
WRITE_CCURRENT: NEAR
SELCOLOR:NEAR
WRITE_DOT: NEAR
READ_DOT: NEAR
WRITE_TTY:NEAR
VIDEO_STATE:NEAR

*****************************************************************
PUBLICS

*****************************************************************
; PRINTER, VECTOR, COMMUNICATION AND DISKETTE TABLE PUBLICS
PUBLIC PRLTAB
PUBLIC PRLTAB_END
PUBLIC VECTOR_TABLE
PUBLIC BAUD_TABLE
PUBLIC PARMS_TPI48
PUBLI C PARMS_TP I 135
PUBLIC DSKLBASE
;VIDEO PUBLICS
PUBLIC

2-192 ROM BIOS

VIDEO_PARMS

PUBLIC
PUBLIC
PUBLIC
PUBLIC
PUBLIC
PUBLIC
PUBLIC
PUBLIC
PUBLIC
PUBLIC
PUBLIC
PUBLI C

MI
MIL
M4
M5
M6
M7
CHAR_GEN_LO
CHAILGEN_H I
MONO_TBL
CGA_TBL
LCD_CGA_TBL
LCD_MONO_TBL

KEYBOARD PUBLICS
PUBLIC
PUBLIC
PUBLIC
PUBLIC
PUBLIC
PUBLIC
PUBLIC
PUBLI C
PUBLIC
PUBLI C
PUBLIC
PUBLIC
PUBLIC
PUBLIC
PUBLIC
PUBLIC
PUBLIC

K6
K6L
K7
K8
Kg
KIO
Kll
KI2
K13
KI4
KI5
K30
KBPAD_TBL
KBPADL
KBFUN_TBL
KBFUNL
KBNMLTBL

COMPATABILITY ENTRY POINTS
PUBLIC
PUBLIC
PUBLIC
PUBLIC
PUBLIC
PUBLIC
PUBLIC
PUBLIC
PUBLIC
PUBLIC
PUBLIC
PUBLIC
PUBLIC
PUBLIC
PUBLI C
PUBLIC
PUBLIC
PUBLIC
PUBLIC

RESET
START
RS23LIO
DUMMLRETURN
NMLINT
BOOLSTRAP
KEYBOARD_IO
KLINT
DISKETTE_IO
DSKLINT
PRINTER_IO
VIDEO_IO
MEMORLSIZE_DET
EQUIPMENT
CASSETTLIO
PRINLSCREEN
TIME_OF_DAY
TIMER_I NT
P_O_R

GENERAL PURPOSE SUBROUTINES
PUBLIC
PUBLIC
PUBLIC
PUBLIC
PUBLIC
PUBLIC
PUBLI C
PUBLIC
PUBLI C
PUBLIC
PUBLI C
PUBLIc
PUBLIC
PUBLIC
PUBLIC
PUBLIC
PUBLIC

DDS
ERILBEEP
BEEP
BEEP _SUB
DSP_BYTE
XLALNIB
DSP_HEX
GELRTCREG
PULRTCREG
011
E_MSG
ICON_PR
STILCON
KB_NOISE
DISABLE--.NMI
ENABLE_NMI
SYS_SETUP

ROM BIOS 2-193

PUBLIC
PUBLIC
PUBLIC
PUBLIC
PUBLIC
PUBLIC

SYS_CHK
KYBD_RESET
BALSALSETUP
VECTOILSETUP
GELVECTOR@
RES_ERILCHK

POST ICONS AND MESSAGES
AND TABLES
PUBLIC
PUBLIC
PUBLIC
PUBLIC
PUBLIC
PUBLI C
PUBLIC
PUBLIC
PUBLIC
PUBLIC

MEM...MSG
ROM...MSG
DEF_SYS_PROF
PAR_CHK
RTCSIILSAVE
FLI CON
SYS_DSKLICON
DSKLICON
BAD_DSKLICON
SYS_DESCR_TA6LE

; *******************************************************

,

IBM

COPYRIGHT

STATEMENT

; *******************************************************
0000

373339
38 20 43
2E 20 49
31 39 38

36 39 31
4F 50 52
42 4D 20
35

DB

'7396918 COPR. IBM 1985' ; COPYRIGHT NOTICE

Software Reset Routine
;ORG
005B
005B
005B
0056
005D
005F
0061
0063
0065
0067
0069

BO
E6
E4
24
E6
BO
E6
EB

00
74
75
BF
75
08
7F
FE

OE05BH
ORG
RESET
START:
MOV
OUT
IN
AND
OUT
MOV
OUT
JMP

0005BH
LABEL

FAR

AL,O
LCD_I NDX ,AL
AL,LCD_DATA
AL,NOT PANEL_ENABLE
LCD_DATA,AL
AL, HDWILRESET
PWILSTAT ,AL

SET LCD INDEX
TURN OFF PANEL POWER

$

WAIT FOR RESET

CAUSE HARDWARE RESET

- --- - ------- -- -- - ------- -- ---- - --

~ POST ERROR ICONS AND MESSAGES
006B
0066

LABEL
BYTE
, Kb OK '

MEMORY OK MESSAG

0072

MEMJlSG
20 46 62 20 4F 4B
DB
20
30 20 52 4F 4D 04 ROM...MSG DB

'0 ROM' ,4

ROM CHECKSUM ERROR MSG

0078

00 00 14 28 3C

0,0,20,40,60

VALUES FOR LMSG ROUTINE

. **************************************************
~POWER ON SELF TEST ICONS
; **************************************************
007D
007D
0081
0086
008D
0098

01
C9
04
BA
C7
DA
C7

LABEL
BYTE
1,04,11,8
OC9H ,01 ,09 ,OCDH, OBBH
4,2,OBAH, 1,9 ,ODBH, OBAH

04 OB 08
01 09 CD BB
02 BA 01 09 DB
C4 (}C C4 BF 20
C4 DC C4 B6
C4 C4 C4 Cl C4

DB

OC7H, OC4H, ODCH, OC4H, OBFH, 020H, ODAH, OC4H, O(}CH, OC4H, OB6H

DB

OClH, OC4H, OC4H, OC4H, OCIH, OC4H, OCIH, OC4H, OC4H, OC4H, 066H

2-194 ROM BIOS

00A3
OOAA
OOAF
OOAF
00B3
00B6
OOCO

OOCD
00D5
00D5
00D9
OODE
00E8
OOED
00F8
OOFD
0107
OlOC
OlOC
0110
0116
011C

Cl C4 C4 C4 B6
04 02 BA 01 09 FE
BA
C8 01 09 CD BC

DB

4,2, OBAH, 1,9, OFEH, OBAH

DB

OC8H, 1,9, OCDH, OBCH

FEALI CON
LABEL
BYTE
DB
05,OFBH,15,04
DB
OB9H,OBBH,03
05 20 C9 DB
020H,OBAH,01,05,020H,OC9H,01,06,OCDH,OBBH
BB
05 CD B9 DB
020H,OC8H,01,05,OCDH,OBgH,020H,049H,
02FH ,04FH, 020H, 020H, OBAH
20 49 2F 4F 20 20
BA
01 07 20 C8 01 06 DB
01,07, 020H, OC8H, 01,06, OCDH, OBCH
CD BC
05
B9
20
01
20

FB
BB
BA
06
C8

OF
03
01
CD
01

04

02
C9
BA
20
BA
BA
87
BA
BA
20
C8

05
01
5C
20
01
39
3F
01
2F
20
01

OA
08
20
2F
08
20
20
08
20
5C
08

07
CD
20
BA
20
01
33
20
20
BA
CD

06
C4
20
B3

BALI CON
DB
07
C4 CA BF DB
20 2D B3 DB
01 04 20 DB

07
CA
2B
04

CLOCK
DB
BB
OB
31 32 DB

LABEL
BYTE
02,05,10,07
OC9H, 01,8 ,OCDH ,OBBH
OBAH, 05CH, 020H, 020H, 031H, 032H, 020H, 020H, 02FH, OBAH

BA
04 02
BA
BA
20 36

DB
DB

OBAH,Ol, 8 ,020H ,OBAH
OBAH, 039H, 020H ,01,04,02, 087H, 03 FH, 020H, 033H, OBAH

DB
DB

OBAH, 01,8 ,020H ,OBAH
OBAH, 02FH, 020H, 020H, 020H, 036H, 020H, 020H, 05CH, OBAH

BC

DB

OC8H ,01,8, OCDH ,OBCH
LABEL
BYTE
02,07,06,07
ODAH, OCAH, OC4H, OC4H, OCAH, OBFH
OB3H, 02BH, 020H, 020H, 02DH, OB3H
04,04,OB3H,01,04,020H,OB3H

0123

02
DA
B3
04
B3
CO

0128
0128
012C

02 OF 33 04
20 20 46 31 20 20

013B

20 46 32 20 20 20
46 33 20
20 20 46 34 20 20

DB

020H, 020H, 46H, 34H, 2QH, 20H, 20H, 46H,
35H, 20H, 20H, 20H, 46H, 36H, 20H

014A

20 46 35 20 20 20
46 36 20
20 20 46 37 20 20

DB

020H, 020H, 46H, 37H, 20H, 20H, 20H, 46H,
38H, 20H, 20H, 20H, 46H, 39H, 20H

0159

20 46 38 20 20 20
46 39 20
20 46 31 30 20 20

DB

020H, 46H, 31H, 30H, 20H, 20H

015F

20 02 87 19 20 20

DB

020H, 2 ,87H, 19H, 20H, 20H, 2, 87H, 19H,
ODAH, 5,8,5, OC4H, OC4H, OC4H, OC4H, OC2

DB

1,4,OC4H,OBFH

01 04 C4 D9

DB
FLICON
DB
DB

OCOH, 01,04, OC4H, OD9H
LABEL
BYTE
02,15,51,4
020H, 020H, 46H, 31H, 20H, 20H, 20H, 46H,
32H, 20H, 20H, 20H, 46H, 33H, 20H

H
0171

02 87 19 DA 05 08
05 C4 C4 C4 C4 C2
01 04 C4 BF

0175

DA 01 04 C4 B4 05
09 05 20 20 20 20
B3

DB

OOAH, 1 ,4,OC4H,OB4H, 5,9, 5,20H, 20H, 20H ,20H ,OB3H

0182

CO 05 09 05 C4 C4
C4 C4 C1 01 04 C4
D9

DB

OCOH, 5,9,5, OC4H, OC4H, OC4H, OC4H, OClH, 1,4, OC4H, 009H

018F
018F
0193
0198
019E

02
01
01
01

07
09
08
07

OB
20
20
20

07
FB FB
FB FB 03
Fa FB 03

PAR_CHK
DB
DB
DB
DB

LABEL
BYTE
02,07,11,07
1/0 CHANNEL CHECK ICON
01,09, 020H, OFBH, OFBH
01,08, 020H, OFBH, OFBH, 03
01,07, 020H, OFBH, OFBH, 03

ROM BIOS 2-195

01A4
01AA
01B2
01B9

01
FB
FB
20
03
20

06 20 FB FB 03
FB 20 20 20 FB
03
FB FB 20 FB FB

DB
DB

01,06, 020H, OFBH, OFBH ,03
OFBH, OFBH, 020H, 020H, 020H, OFBH, OFBH, 03

DB

020H ,OFBH ,OFBH, 020H,OFBH, OFBH ,03

20 20 FB FB 03

DB

020H ,020H ,020H, OFBH,OFBH,03

~ SYSTEM UNIT WITH INSERT DISKETTE ICON (USED DURING BOOT)
01BF
01BF
01C3
01C8
OlDl
01D8
01DF
01E5
01EB
01Fl
01F8
01FF
0208
020F

0000
C9 01
04 04
DB 20
C8 D1
20
20 D5
BC
20 B3
DC C3
DC FO
20 C3
C4
C4 Cl
20
04 03
FE B3
20 D4
20
04 OS

12
10
BA
BA
01

11
CD BB
20 01 OE

SYS_DSKLICON
LABEL
BYTE
DB
0,0,18,17
DB
OC9H,01,16,OCDH,OBBH
DB
04,04,OBAH,20H,01,14,ODBH,20H,OBAH

OS CD B8

DB

OC8H,OD1H,01,05,OCDH,OB8H,20H

01 OS CD 01

DB

20H,OD5H,01,05,QCDH,OD1H,OBCH

DC
C4
DC
01

DC
DC
20
Cl

DB
DB
DB
DB

20H,OB3H,ODCH,ODCH,OFOH,ODCH
ODCH,OC3H,OC4H,OC4H,OB4H,ODCH
ODCH,OFOH,ODCH,ODCH,OB3H,20H
20H,OC3H,01,05,OC4H,OCIH,OC4H

01 OS C4 B4

OB

OC4H,OC1H,01,05,OC4H,OB4H,20H

20 B3 01 OE
20
01 OE CD BE

DB

04,03,20H,OB3H,01,14,OFEH,OB3H,20H

OB

20H,OD4H,01,14,OCDH,OBEH,20H

01 12 20

OB

04,05,01,18,020H

DC
C4
DC
OS

FO
84
B3
C4

,

; DISKETTE ICON (USED DURING BOOT)
0214
0214
0218
021B
0210
0224

00
OA
C4
04
B3
CO

00 OS 04
C4 DC
BF
02 B3 20 20 20
01 03 C4 D9

DSKLICON
LABEL
BYTE
OB
0,0,5,4
OB
ODAH, OC4H, ODCH
DB
OC4H,OBFH
flB
04H, 02H, OB3H, 20H, 20H ,020H ,OB3H
DB

OCOH, 01H, 03H,OC4H, OD9H

; BAD DISKETTE ICON
0229
0229
022D
0234
023B
0242

00
DA
BF
B3
B3
B3
B3
CO
09

00 07 04
BF 20 DA C4 C4

(USED DURING BOOT)

BAD_DSKLI CON
LABEL
BYTE
DB
0,0,7,4
DB
218,191,32,218,196,196,191

CO BF CO BF 20

DB

179,192,191,192,191,32,179

20 CO BF CO BF

DB

179,32,192,191,192,191,179

C4 C4 0920 CO

DB

192,196,196,217,32,192,217

~ TABLE OF ICON ADDRESSES USED BY LMSG ROUTINE
0249
0249
0251

0000
0005
OlOC
0128

ICON-ADR
LABEL
WORD
0070 R OOAF R OW
OO,OFFSET SYS_UNIT ,OFFSET FEALICON,OFFSET CLOCK
R
R 018F R
OW
OFFSET BAT_ICON,OFFSET PAILCHK,OFFSET F_ICON
R

2-196 ROM BIOS

System Descriptor Table
SYSTEM DESCRIPTOR TABLE
ACCESSED VIA INT 15H FUNCTION OCOH
0257
0257
0259
025A
025B
025C
025D
025E
025F
0260

SYS_DESCR_TABLE LABEL
DW
8
DB
OF9H
DB
0
DB
0
DB
00111000B
DB
0
DB
0
DB
0
DB
0

0008
F9
00
00
38
00
00
00
00

BYTE
DESCRIPTOR TABLE LENGTH
SYSTEM MODEL BYTE
SECONDARY MODEL BYTE
BIOS REVISION LEVEL
FEATURE INFORMATION BYTE
FEATURE INFORMATION BYTE
FEATURE INFORMATION BYTE
FEATURE INFORMATION BYTE
FEATURE INFORMATION BYTE

1
2
3
4
5

Default System Profile
DEFAULT SYSTEM PROFILE
THIS IS THE SET OF PARAMETERS DEFINING THE
DEFAULT SYSTEM PROFILE WHICH IS LOADED AFTER
STANDBY POWER LOST CONDITIONS
DEF_SYS_PROF
LABEL
DB
OEOH,O

0261
0261

EO 00

0263

0000 0000

DW

0,0

0267

OE 00

DB

OEH,O

BYTE
; PROFILE BYTE 1 AND 2
; WARMSTART, LOW BAT WNG ENAB
INIT VIDEO MODE = CGA 80X25
LCD HIGH INT = NO OPERATION
RS232 AND MOM NOT AV ON BATT
KYBD INACT TIMEOUT VALUES
LCD BLANK = NO TIMEOUT
SYSTEM OFF = NO TIMEOUT
DFL T MDM SET 1200BPS, E-PRTY
NO AUTO-ANSWER

REAL TIME CLOCK VALID SIGNATURE
0269
0269

52 54 43 47

RTCSIG_SAVE
LABEL
DB
"RTCG"

BYTE
REAL TIME CLOCK SIGNATURE
WRTN & CKO BY POST (POIMAIN)

Printer Configuration Table (PRT_TAB)
----- --- -- - - - - - - - - -- - - - - - -- - - - - - - - - - - - -- - --; PRINTER PORT SEARCH TABLE USED DURING POST
026D
0260
026F
0271
0273
0275

0078
0378
03BC
0278

PRLTAB
078H
OW
OW
378H
OW
3BCH
OW
278H
PRLTAB_END

LABEL

WORD
COMPACT PRINTER PORT
PRIMARY PRINTER PORT
MONO ADAPTER PRINTER PORT
ALTERNATE PRINTER PORT

LABEL

WORD

ROM BIOS 2-197

ASCII Conversion (STR_CON)
******************************************************************
ROUTINE-NAME:
FUNCTION:

STR_CON

THIS ROUTINE CONVERTS HEX NUMBERS TO ASCII AND STORES
THEM AT ADDRESS ES: DI .

ENTRY CONDITIONS:
PURPOSE OF ENTRY:
INPUT CONDITIONS:
RESTRICTIONS:

TO POST ERROR MESSAGES IN MEMORY
DX = HEX NUMBER TO BE CONVERTED
ES: DI = PLACE I N MEMORY TO PUT ASC I I STRNG

NONE

EXIT CONDITIONS:
NORMAL EXIT CONDITIONS:
ERROR EXIT CONDITIONS:
REGISTERS MODIFIED:

CX,DX,ES,DI

INTERNALLY REFERENCED ROUTINES:

NONE

EXTERNALLY REFERENCED ROUTINES:

NONE

******************************************************************
0275
0275
0276
0278
027C
027D
027E
0280
0283
0286
0288
028B
028E
0291
0292
0293
0296
0299
029B
029C
029D

STR_CON
51
B1 OC
26: C6 05 20
47
52
D3 EA
80 E2 OF
80 FA 09
7E 03
80 C2 07
80 C2 30
26: 88 15
47
5A
80 E9 04
80 F9 00
7D E2
59
C3

PROC

NEAR

PUSH
CX
MOV
CL,12
; CONVERT 2 BYTES
MOV
BYTE PTR ES: [DI-, 020H ; INSERT ASCII BLANK
INC
INC POINTER
DI
SAVE COUNT
SClO:
PUSH
DX
MOVE HIGH NIBBLE TO LOW NIB
SHR
DX,CL
MASK OUT NEW HIGH NIBBLE
AND
DL,OFH
ALPHA OR NUMERIC
CMP
DL,09
NO ADJUST FOR ALPHA
JLE
SC24
ADD
ADJUST FOR ALPHA
DL,07
SC24 :
ADD
CONVERT TO ASCI I
DL ,30H
MOV
ES:[DI],DL
SEND ERROR TO SCREEN
POINT TO NEXT MEMOERY LOCAT
INC
DJ
RESTORE AX
POP
DX
SUB 4 FROM SH I FT COUNT
SUB
CL,4
SEE I F MINUS
CMP
CL,O
JGE
SClO
LOOP
POP
CX
SCRET: RET
RETURN
STR_CON
ENDP

NMI Handler Entry Point Address
(NMI_INT)
; *************************************
NMI HANDLER ENTRY POINT ADDRESS

; *************************************
;ORG
02C3
= 02C3
02C3 E9 0000

OE2C3H
ORG
NMLJNT
JMP

2-198 ROM BIOS

002C3H
EQU
NMLFLIH

Character Generator Graphics 128-255
(CHAR_GEN_HI)
; ******************************************************************

;
;

CHARACTER GENERATOR GRAPHICS FOR 320X200 AND 640X200
GRAPHICS FOR CHARACTERS 80H THROUGH FFH AND FOR DEFAULT
LCD CHARACTER GENERATOR

; ******************************************************************
02C6
02C6
02CE
0206
02DE
02E6
02EE
02F6
02FE
0306
030E
0316
031E
0326
032E
0336
033E
0346
034E
0356
035E
0366
036E
0376
037E
0386
038E
0396

10
OE
6C
3B
OE
3E
18
78
36
7B
30
7B
18
7B
00
lC
18
3E
36
3E
30
3E
6C
3C
10
3C
30
3C
36
63
lC
63
07
7F
00
77
3F
6F
18
3C
66
3C
70
3C
18
3B
70
3B
36
6C
63
Ie
36

33
lC
00
00
18
00
3C
00
00
00
18
00
18
00
00
38
3C
00
00
00
18
00
00
00
38
00
18
00
08
00
14
00
OC
00
00
00
3D
00
3C
00
00
00
18
00
3C
00
18
00
00
38
lC
00
41

61 60 60 31

CHAR_GEN_HI
LABEL
BYTE
DB
OlDH, 033H, 061H, 060H, 060H, 031H, OOEH, OlCH

66 66 66 66

DB

06CH, OOOH, 066H, 066H, 066H, 066H, 03BH, OOOH

3C 66 7E 60

DB

OOEH, 018H, 03CH, 066H, 07EH, 060H, 03 EH, OOOH

3C 66 IE 66

DB

018H, 03CH, 03CH, 066H, OlEH, 066H, 07BH, OOOH

3C 66 IE 66

DB

036H, OOOH, 03CH, 066H, 0IEH, 066H, 07 BH, OOOH

3C 66 1 E 66

DB

030H, 018H, 03CH, 066H, 01 EH, 066H, 07BH, OOOH

3C 66 IE 66

DB

018H, 0 18H, 03CH, 066H, 01 EH, 066H, 07BH, OOOH

3E 66 60 36

DB

OOOH, OOOH, 03EH, 066H, 060H, 036H, 0ICH, 038H

3C 66 7 E 60

DB

018H, 03CH, 03CH, 066H, 07 EH, 060H, 03 EH, OOOH

3C 66 7 E 60

DB

036H, OOOH, 03CH, 066H, 07EH, 060H, 03EH, OOOH

3C 66 7E 60

DB

030H, 0l8H, 03CH, 066H, 07 EH, 060H, 03EH, OOOH

38 18 18 18

DB

06CH, OOOH, 038H, 018H, 018H ,018H, 03CH, OOOH

08 38 18 18

DB

010H, 038H, 008H, 038H, 018H, 018H, 03CH, OOOH

08 38 18 18

DB

030H, 018H, 008H, 038H, 018H, 018H, 03CH, OOOH

lC 16 36 3F

DB

036H, 008H, 0ICH, 016H, 036H, 03FH, 063H, OOOH

lC IE 36 3F

DB

0ICH, 014H, 0ICH, 0IEH, 036H, 03FH, 063H, OOOH

7 F 31 3C 31

DB

007H, OOCH, 07 FH, 031H, 03CH, 031H, 07FH, OOOH

76 1B 3 F 6C

DB

OOOH, OOOH, 076H, 0IBH, 03 FH, 06CH, 077H, OOOH

2C 3E 6C 60

DB

03 FH, 03DH, 02CH, 03EH, 06CH, 06DH, 06FH, OOOH

3C 66 66 66

DB

018H, 03CH, 03CH, 066H, 066H, 066H, 03CH, OOOH

3C 66 66 66

DB

066H, OOOH, 03CH, 066H, 066H, 066H, 03CH, OOOH

3C 66 66 66

DB

070H, 018H, 03CH, 066H, 066H, 066H, 03CH, OOOH

42 66 66 66

DB

018H, 03CH, 042H, 066H, 066H, 066H, 03 BH, OOOH

66 66 66 66

DB

070H, 0l8H, 066H, 066H, 066H, 066H, 03BH, OOOH

77 33 lA OC

DB

036H, OOOH, 077H, 033H, 0IAH, OOCH, 06CH, 038H

36 63 63 36

DB

063H, 0ICH, 036H, 063H, 063H, 036H, 0ICH, OOOH

63 63 63 63

DB

036H, 041H, 063H, 063H, 063H, 063H, 03EH, OOOH

ROM BIOS 2-199

039E
03A6
03AE
03B6
03BE
03C6
03CE
03D6
03DE
03E6
03EE
03F6
03FE
0406
040E
0416
041E
0426
042E
0436
043E
0446
044E
0456
045E
0466
046E
0476
047E
0486
048E
0496
049E
04A6
04AE
04B6
04BE

3E 00
06 04 3C 6E
3C 30
IE 33 33 7C
76 00
66 66 3C 7E
18 00
78 6C 6C 7A
66 03
OE IB IB 3E
58 70
OE 18 3C 66
7B 00
lC 30 18 38
3C 00
OE 18 3C 66
3C 00
OE 18 66 66
3B 00
lA 2C 76 3B
73 00
lA 2C 73 I~
63 00
1E 36 36 IF
00 00
lC 36 36 lC
00 00
18 00 18 30
3C 00
00 00 00 7 E
00 00
00 00 00 7 E
00 00
60 66 6C 7 E
4C OF
60 66 6C 7B
4F 03
30 00 30 30
30 00
00 IB 36 6C
IB 00
006C361B
6C 00
11 44 11 44
11 44
55 AA 55 AA
55 AA
EE BB EE BB
EE BB
18 18 18 18
18 18
18 18 18 F8
18 18
18 18 F8 F8
18 18
34 34 34 F4
34 34
00. 00 00 F8
34 34
00 00 FO F8
18 18
34 34 F4 F4
34 34
34 34 34 34
34 34
00 00 F8 FC
34 34
34 34 F4 F4
00 00
34 34 34 FC
00 00
18 18 F8 F8
00 00
00 00 00 F8

68 6A

DB

006H, 004H, 03CH, 06EH, 068H, 06AH, 03CH, 030H

D_9B

39 5B

DB

01 EH, 033H, 033H, 07CH, 039H, 05BH, 076H, OOOH

D_9C

18 7 E

DB

066H, 066H, 03CH, 07EH, 018H, 07 EH, 018H, OOOH

D_9D

66 6F

DB

078H, 06CH, 06CH, 07 AH, 066H, 06FH, 066H, 003H

D_9E

18 18

DB

OOEH, 01BH, 018H, 03EH, 018H, 018H, 058H, 070H

D_9F

IE 66

DB

OOEH, 018H, 03CH, 066H, 01EH, 066H, 07BH, OOOH

D~O

18 18

DB

0ICH, 030H, 018H, 038H, 018H, 018H, 03CH, OOOH

D~l

66 66

DB

OOEH, 018H, 03CH, 066H, 066H, 066H, 03CH, OOOH

D~2

66 66

DB

OOEH, 018H, 066H, 066H, 066H, 066H, 03BH, OOOH

D_A3

33 33

DB

0IAH, 02CH, 076H, 03BH, 033H, 033H, 073H, OOOH

D~4

6F 67

DB

olAH, 02CH, 073H, 07BH, 06FH, 067H, 063H, OOOH

D~5

00 3F

DB

01 EH, 036H, 036H, 0IFH, OOOH, 03 FH, OOOH, OOOH

D~6

00 3E

DB

01CH, 036H, 036H, 0ICH, OOOH, 03EH, OOOH, OOOH

D~7

64 66

DB

018H, OOOH, 018H, 030H, 064H, 066H, 03CH, OOOH

D~8

60 60

DB

OOOH, OOOH, OOOH, 07EH, 060H, 060H, OOOH, OOOH

D~9

06 06

DB

OOOH, OOOH, OOOH, 07 EH, 006H, 006H, OOOH, OOOH

D~A

3 B 66

DB

060H, 066H, 06CH, 07EH, 03BH, 066H, 04CH, OOFH

D~B

37 6B

DB

060H, 066H, 06CH, 07BH, 037H, 06BH, 04FH, 003H

D~C

30 30

DB

030H, OOOH, 030H, 030H, 030H, 030H, 030H, OOOH

D~D

6C 36

DB

OOOH, 01BH, 036H, 06CH, 06CH, 036H, 01 BH, OOOH

D~E

IB 36

DB

OOOH, 06CH, 036H, 0IBH, 01 BH, 036H, 06CH, OOOH

D~F

11 44

DB

011H, 044H, 011H, 044H, 011H, 044H, 011H, 044H

D_BO

55 AA

DB

055H, OAAH, 055H, OAAH, 055H, OAAH, 055H, OAAH

D_Bl

EE BB

DB

OEEH, OBBH, OEEH, OBBH, OEEH, OBBH, OEEH, OBBH

D_B2

18 18

DB

018H, 018H, 018H, 018H, 018H, 018H, 018H, 018H

D_B3

F8 18

DB

018H, 01BH, 018H, OF8H, OF8H, 018H, 018H, 018H

D_B4

18 F8

DB

018H, 018H, OF8H, OF8H, 018H, OF8H, 018H, 018H

D_B5

F4 34

DB

034H, 034H, 034H, OF4H, OF4H, 034H, 034H, 034H

D_B6

FC 34

DB

OOOH, OOOH, OOOH, DF8H, OFCH, 034H, 034H, 034H

D_B7

18 F8

DB

OOOH, OOOH, OFOH, OF8H, 018H, OF8H, 018H, 018H

D_B8

04 F4

DB

034H, 034H, OF4H, OF4H, 004H, OF4H, 034H, 034H

D_B9

34 34

DB

034H, 034H, 034H, 034H, 034H, 034H, 034H, 034H

D_BA

04 F4

DB

OOOH, OOOH, OF8H, OFCH, 004H, OF4H, 034H, 034H

D_BB

04 FC

DB

034H, 034H, OF4H, OF4H, 004H, OFCH, OOOH, OOOH

D_BC

FC 00

DB

034H, 034H, 034H, OFCH, OFCH, OOOH, OOOH, OOOH

D_BD

18 F8

DB

018H ,018H, OF8H, 0 F8H, 018H, OF8H, OOOH, OOOH

D_BE

F8 18

DB

OOOH, OOOH, OOOH, OF8H, OF8H, 018H, 018H, 018H

D_BF

2-200 ROM BIOS

04C6
04CE
0406
040E
04E6
04EE
04F6
04FE
0506
050E
0516
051E
0526
052E
0536
053E
0546
054£
0556
055£
0566
056£
0576
057E
0586
058E
0596
059E
05A6
05AE
05B6
05B£
05C6
05CE
0506
050£
05E6

18
18
00
18
00
00
18
18
18
00
00
18
18
18
18
34
34
34
00
00
34
34
00
00
34
34
34
00
00
34
34
18
00
34
00
00
18
00
34
34
00
18
00
00
18
00
34
34
34
18
18
18
00
00
18
FF
FF
00
FF
FO
FO
OF
OF
FF
00
00
3B
OE
6E
7F
78
00
CC
FE

18
18
00
18
00
00
18
18
18
00
00
18
18
18
18
34
34
34
00
00
34
34
00
00
34
34
34
00
00
34
34
18
00
34
00
00
18
00
34
34
00
18
00
00
18
00
34
34
34
18
18
18
00
00
18
FF
FF
00
FF
FO
FO
OF
OF
FF
00
00
00
IB
60
33
00
7E
00
66

18 1 F IF 00

DB

018H, 018H, 018H ,01 FH, 01 FH, OOOH, OOOH, OOOH

O_CO

18 FF FF 00

DB

018H, 018H, 018H, OFFH, OFFH, OOOH, OOOH, OOOH

O_Cl

00 FF FF 18

DB

OOOH, OOOH, OOOH, OFFH, OFFH, 018H, 018H, 018H

OJ2

18 IF IF 18

DB

018H, 0ISH, 018H ,01 FH, 01 FH, 0ISH, 018H, 018H

0_C3

00 FF FF 00

DB

OOOH, OOOH, OOOH ,OFFH, OFFH, OOOH, OOOH, OOOH

0_C4

18 FF FF 18

DB

018H, 018H, 0 18H, OFFH, OFFH, 018H, 018H, 018H

0_C5

IF IF 18 IF

DB

018H, 018H, 0 1FH ,01 FH, 018H, 01 FH, 018H, 018H

0_C6

34 37 37 34

DB

034H, 034H, 034H, 037H, 037H, 034H, 034H, 034H

O_Cl

37 37 30 IF

DB

034H, 034H, 037H, 037H, 030H, 01 FH, OOOH, OOOH

0_C8

3 F 3 F 30 37

DB

OOOH, OOOH, 03 FH, 03FH, 030H, 037H, 034H, 034H

0_C9

F7 F7 00 FF

DB

034H, 034H, OF7H, OF7H, OOOH, OFFH, OOOH, OOOH

O_CA

FF FF 00 F7

DB

OOOH, OOOH, OFFH, OFFH, OOOH, OF7H, 034H, 034H

O_CB

37 37 30 37

DB

034H, 034H, 037H, 037H, 030H, 037H, 034H, 034H

OJC

FF FF 00 FF

DB

OOOH, OOOH, 0 FFH, OFFH, OOOH ,OFFH, OOOH, OOOH

O_CO

F7 F7 00 F7

DB

034H, 034H, 0 F7H, OF7H, OOOH, OF7H, 034H, 034H

O_CE

FF FF 00 FF

DB

018H, 018H, 0 FFH, OFFH, OOOH, OFFH, OOOH, OOOH

O_CF

34 FF FF 00

DB

034H, 034H, 034H, OFFH, OFFH, OOOH, OOOH, OOOH

0_00

FF FF 00 FF

DB

OOOH, OOOH, OFFH, OFFH, OOOH, OFFH, 018H, 018H

0_01

00 FF FF 34

DB

OOOH, OOOH, OOOH, OFFH, OFFH, 034H, 034H, 034H

0_02

34 3 F IF 00

DB

034H, 034H, 034H, 03 FH, 01 FH, OOOH, OOOH, OOOH

0_03

IF IF 18 OF

DB

018H, 018H, 01FH, 01 FH, 018H, OOFH, OOOH, OOOH

0_04

1F 1 F 18 1 F

DB

OOOH, OOOH, 01 FH, 01 FH, 018H, 01FH, 018H, 018H

0_05

00 3 F 3 F 34

DB

OOOH, OOOH, OOOH ,03 FH, 03 FH, 034H, 034H, 034H

0_06

34 FF FF 34

DB

034H, 034H, 034H, OFFH, OFFH, 034H, 034H, 034H

0_07

FF FF 18 FF

DB

018H, 018H, OFFH, OFFH, 018H, OFFH, 018H, 018H

0_08

18 F8 F8 00

DB

018H, 018H, 018H, OF8H, OF8H, OOOH, OOOH, OOOH

0_09

00 1 F 1 F 18

DB

OOOH, OOOH, OOOH, 01 FH, 01 FH, 018H, 018H, 018H

O_OA

FF FF FF FF

DB

OFFH, OFFH, OFFH, OFFH, OFFH, OFFH, OFFH, OFFH

O_OB

00 00 FF FF

DB

OOOH, OOOH, OOOH, OOOH, OFFH, OFFH, OFFH, OFFH

O_OC

FO FO FO FO

DB

OFOH, OFOH, OFOH, OFOH, OFOH, OFOH, OFOH, OFOH

0_00

OF OF OF OF

DB

OOFH ,OOFH, OOFH, OOFH, 00 FH, OOFH, OOFH, OOFH

O_OE

FF FF 00 00

DB

OFFH, OFFH, OFFH, OFFH, OOOH, OOOH, OOOH, OOOH

O_OF

3D 6E 66 6E

DB

OOOH, OOOH, 030H, 06EH, 066H, 06EH, 03BH, OOOH

O_EO

33 3£ 33 73

DB

OOEH, 01 BH, 033H, 03EH, 033H, 073H, 06EH, 060H

O_El

31 30 30 30

DB

07FH, 033H, 031H, 030H, 030H, 030H, 078H, OOOH

0_E2

FC A8 28 6C

DB

OOOH, 07 EH, OFCH, OA8H, 028H, 06CH, OCCH, OOOH

0_E3

30 18 30 66

DB

OF£H, 066H, 030H, 018H, 030H, 066H, OFEH, OOOH

0_E4

ROM BIOS 2-201

05EE
05F6
05FE
0606
060E
0616
061E
0626
062E
0636
063E
0646
064E
0656
065E
0666
066E
0676
067E
0686
068E
0696
069E
06A6
06AE
06B6
06BE

FE
00
38
00
60
00
OC
IC
IC
IC
IC
IC
77
IC
3C
00
36
01
3E
00
IE
3C
66
00
00
18
7E
60
7E
06
7E
OE
18
18
70
18
18
00
00
IC
00
00
00
00
00
03
18
76
00
3C
00
00
00
00
00

00
00
00
00
60
3F
00
08
00
36
00
36
00
30
00
36
00
03
40
00
00
66
00
7E
00
18
00
38
00
IC
00
IB
18
18
00
18
00
3B
00
36
00
00
00
00
00
02
10
3B
00
66
00
00
00
00
00

3 F 6C 6C 6C

DB

OOOH, OOOH, 03 FH, 06CH, 06CH, 06CH, 038H, OOOH

0_E5

33 33 33 37

DB

OOOH, OOOH, 033H, 033H, 033H, 037H, 060H, 060H

0_E6

7E 50 18 IC

DB

OOOH, 03 FH, 07EH, 050H, 018H, OICH, OOCH, OOOH

0_E7

3E 6B 3E 08

DB

OICH, 008H, 03EH, 06BH, 03EH, 008H, OICH, OOOH

0_E8

63 7 F 63 36

DB

OICH, 036H, 063H, 07FH, 063H, 036H, OICH, OOOH

0_E9

63 63 36 55

DB

OICH, 036H, 063H, 063H, 036H, 055H, 077H, OOOH

O_EA

18 2C 66 66

DB

OICH, 030H, 018H, 02CH, 066H ,066H, 03CH, OOOH

O_EB

7 F 40 59 7 F

DB

OOOH, 036H, 07 FH, 040H, 059H, 07 FH, 036H, OOOH

D_EC

3E 67 6B 73

DB

OOIH, 003H, 03EH, 067H, 06BH, 073H, 03EH, 040H

O_ED

IE 30 3E 30

DB

OOOH, OOOH, 01 EH, 030H, 03 EH, 030H, 01 EH, OOOH

D_EE

66 56 66 66

DB

03CH, 056H, 066H, 066H, 066H, 066H, 066H, OOOH

D_EF

00 7E 00 7E

DB

OOOH, 07EH, OOOH, 07EH, OOOH, 07EH, OOOH, OOOH

D_FO

7 E 18 18 00

DB

018H, 018H, 07EH, 018H, 018H, OOOH, 07EH, OOOH

D_FI

OE 38 60 00

DB

060H, 038H, OOEH, 038H, 060H, OOOH, 07EH, OOOH

D_F2

70 IC 06 00

DB

006H, OICH, 070H, OICH, 006H, OOOH, 07EH, OOOH

D_F3

IA 18 18 18

DB

OOEH ,01 BH,O IAH ,018H, 018H, 018H,0 18H, 018H

D_F4

18 18 58 08

DB

018H, 018H, 018H, 018H, 058H, OD8H, 070H, OOOH

D_F5

00 7E 00 18

DB

018H, 018H, OOOH, 07EH, OOOH, 018H, 018H, OOOH

DJ6

6 E 00 3 B 6 E

DB

OOOH, 03BH, 06EH, OOOH, 03BH, 06EH, OOOH, OOOH

0_F7

36 IC 00 00

DB

OICH, 036H ,036H, OICH, OOOH, OOOH, OOOH, OOOH

0_F8

08 IC IC 08

DB

OOOH, OOOH, 008H, OICH, OICH, 008H, OOOH, OOOH

0_F9

00 18 18 00

DB

OOOH, OOOH ,OOOH, 018H, 018H, OOOH, OOOH, OOOH

D_FA

06 24 6C 38

DB

003H, 002H, 006H, 024H, 06CH, 038H, 018H, OlOH

D_FB

33 33 33 00

DB

076H, 03BH, 033H, 033H, 033H, OOOH, OOOH, OOOH

D_FC

OC 38 7E 00

DB

03CH, 066H, OOCH, 038H, 07EH, OOOH, OOOH, OOOH

DJD

3C 3C 3C 3C

DB

OOOH, OOOH, 03CH, 03CH, 03CH, 03CH, OOOH, OOOH

D_FE

00 00 00 00

08

OOOH, OOOH, OOOH, OOOH ,OOOH, OOOH, OOOH ,OOOH

DJF

2-202 ROM BIOS

Convert AX to ASCII (DSP_BYTE)
*********************************************************************
ROUTINE-NAME:

DSP_BYTE

FUNCTION: THIS ROUTINE Will CONVERT THE BYTE IN Al INTO TWO ASCII
CHARACTERS IN AX AND DISPLAY THEM AT THE CURRENT
CURSOR lOCATION. THE CURSOR Will BE MOVED TWO CHARACTERS
TO THE RIGHT.
ENTRY CONDITIONS:
INPUT CONDITIONS: DSP_BYTE: Al
XlALNIB: Al
DSP_HEX: Al
RESTRICTIONS:

BYTE TO BE CONVERTED
lOW NI BBlE TO BE CONVERTED
BYTE TO BE DISPLAYED

NONE

EXIT CONDITIONS:
DSP_BYTE: BYTE IS CONVERTED AND PRINTED, ASCII IN AX
XlALNIB: ASCII RETURNED IN Al
DSP_HEX: CHARACTER DISPLAYED AND CURSOR ADVANCED
REGISTERS MODIFIED:

AX

*********************************************************************
06C6
06C6
06C7
06C8
06CA
06CC
06CF
0602
0604
0605
0607
06DA
06DC
0600
06EO

51
50
B1
02
E8
E8
8A
58
24

04
E8
06EO R
06E7 R
E8
OF

E8 06EO R
8A E5
59
EB 08 90

DSP _BYTE
PUSH
PUSH
MOV
SHR
CAll
CAll
MOV
POP
AND

PROC
CX
AX
Cl,4
Al,Cl
XlALNIB
DSP_HEX
CH,Al
AX
Al,OFH

CAll
MOV
POP
JMP
DSP _BYTE

XlALNIB
AH,CH
CX
DSP_HEX
ENDP

NEAR
SAVE FOR lOW NIBBLE DISPLAY
SHI FT COUNT
NYBBlE SWAP
CONVERT THE HIGH NI BBlE
DISPLAY THE FIRST CHARACTER
SAVE UPPER ASCI I CHARACTER
RECOVER THE NIBBLE
ISOLATE TO lOW NIBBLE
DO lOW NIBBLE CONVERSION
2ND ASCII CHARACTER IN Al
RESTORE 1ST ASCI I CHAR TO AH
DISPLAY SECOND CHARACTER

CONVERT BYTE IN lOW NIBBLE IN Al TO ASCII IN Al
06EO
06EO
06E2
06E3
06E5
06E6
06E7

04 90
27
14 40
27
C3

XlALNIB
PROC
ADD
Al,090H
DAA
ADC
Al,040H
DAA
RET
XlALNIB
ENDP

NEAR
ADD
ADJ
ADD
ADJ

FIRST CONVERSION FACTOR
FOR NUM AND ALPHA RANGE
CONV AND ADJ lOW NI BBlE
HIGH NIB TO ASCHI RANGE

PRINT CHARACTER IN Al USING TELETYPE INTERFACE TO VIDEO 1(0
06E7
06E7
06E8
06E9
06EB
06ED
06EF
06FO
06Fl
06F2

50
53
B4 DE
B7 00
CD 10
5B
58
C3

DSP _HEX
PUSH
PUSH
MOV
MOV
INT
POP
POP
RET
DSP_HEX

PROC
AX
BX
AH,14
BH,O
10H
BX
AX

NEAR
SAVE REGS
DISPLAY CHARACTER IN Al
CAll VIDEO_IO
RESTORE REGS

ENDP

ROM BIOS 2-203

Boot Strap Loader Entry Address
(BOOT_STRAP)
; ************************************
BOOT STRAP LOADER ENTRY ADDRESS

; *************************************
;ORG
06F2
= 06F2
06 F2 E9 0000 E

OE6F2H
ORG
006F2H
BOOLSTRAP
EQU
JMP
SYS_BOOT

Keyboard Noise (KB_NOISE)
-- - - - - - - -

- - - - - - - - - - - - -- - - - - - -- - - -- - - - - - - - - - - - - - - - -- - - - -- - - - - - - - - --

;KB_NOISE
THIS ROUTINE IS CALLED WHEN GENERAL BEEPS ARE REQUIRED FROM
THE SYSTEM.
; INPUT
DS= BIOS DATA SEGMENT
BX=LENGH OF THE TONE
;
CX=CONTAINS THE FREQUENCY
;OUTPUT
ALL REGISTERS ARE MAINTAINED.
;HINTS
AS CX GETS LARGER THE TONE PRODUCED GETS LOWER IN PITCH.
KB_NOISE

06F5

PROC

NEAR

06F5
06FA
06FC
0701
0702
0703

F6 06 0016 R 01
75 29
80 OE 0016 R 01
50
53
51

TEST
JNZ
OR
PUSH
PUSH
PUSH

BIOS_STATUS,KB_NOISU\CT ; ROUTINE ALREADY ACTIVE?
KBN_EXIT
; I F SO THEN EXIT
BIOS_STATUS,KB_NOISU\CT ; SET ROUTINE ACTIVE FLAG
AX
BX
CX

0704
0706
0707
0707

E4 61
50
24 FC

PUSH
LOOPOI :
AND

IN

AL,NMLCNTL
AX

0709
070B
070C

E6 61
51
E2 FE

OUT
PUSH
LOOP

070E
0710
0712
0713
0714

OC 02
E6 61
59
51
E2 FE

OR
OUT
POP
PUSH
LOOP

AL,SPKR_DATA
NMLCNTL,AL
CX
CX

$

RETRI EVE FREQUENCY
ANOTHER HALF CYCLE

0716
0717
0718

59
4B
75 ED

POP
DEC
JNZ

CX
BX
LOOPOI

RETRI EVE FREQ.
TOTAL TIME COUNT
DO ANOTHER CYCLE

071A

58

POP

AX

RECOVER CONTROL

071B
0710
0722
0723
0724
0725

E6 61
80 26 0016 R FE
59
5B
58

OUT
AND
POP
POP
POP
KBN_EXIT:

2-204 ROM BIOS

; GET CONTROL INFO
; SAVE

AL, NOT SPKR_DATA+ TMR2_GATE ; TURN OFF SPEAKER
DATA
NMLCNTL ,AL
OUTPUT TO CONTROL
CX
HALF CYCLE TIME FOR TONE
$
SPEAKER OFF
TURN ON SPEAKER
OUTPUT TO CONTROL

NMLCNTL,AL
; RESTORE TH E CONTROL REGI STER
BIOS_STATUS,NOT KB_NOISE...ACT ; RESET ACTIVE FLAG
CX
BX
AX

0725
0726

C3

RET
KLNOISE

ENDP

Communications Baud Rate Table
(BAUD_TABLE)
*************************************
COMMUNICATIONS BAUD RATE TABLE

*************************************
ORG

0729
0729
0729
072B
072D
072F
0731
0733
0735
0737

0417
0300
0180
OOCO
0060
0030
0018
OOOC

OE729H
ORG
00729H
BAUD_TABLE
DW
1047
DW
768
DW
384
DW
192
DW
96
DW
48
DW
24
DW
12

LABEL

WORD
llO BAUD
150
300
600
1200
2400
4800
9600

TBL OF INIT VAL

RS-232 I/O Entry Point (RS232_10)
*************************************
RS232 1/0 ENTRY POINT

*************************************
ORG
0739
= 0739
0739 E9 0000 E

OE739H
ORG
00739H
RS23LIO
EQU
JMP
COMMO_IO

Indicate POST Error (ERR_BEEP)
; *********************************************************************
ROUTINE-NAME:

ERR_BEEP

FUNCTION: THIS ROUTINE WILL ISSUE LONG (3 SEC) AND/OR SHORT (1 SEC)
TONES TO THE SPEAKER TO INDICATE POST STATUS TO THE OPERATOR
ENTRY CONDITIONS:
PURPOSE OF ENTRY: SEND BEEP TONES TO THE SPEAKER
INPUT CONDITIONS: DH = NUMBER OF LONG TONES TO SOUND
DL = NUMBER OF SHORT TONES TO SOUND
RESTRICTIONS:
NONE
EXIT CONDITIONS:
NORMAL EXIT CONDITIONS: SPEAKER IS SOUNDED
ERROR EXIT CONDITIONS: NONE

ROM BIOS 2-205

REGISTERS MODIFIED:

**********************************************************************

= 0080
073C
.073C
073E

AX,BX,CX,DX

FRCBEP

ERR_BEEP
OR
DH,DH
JZ
EB_03

OA F6
74 OD

80H ; FORCED BEEP BIT

EQU
PROC NEAR

ANY LONG TONES?
NO THEN DO SHORT

ISSUE LONG BEEPS
0740
0740
0742
0745
0747
0749
074B

B3
E8
2B
E2
FE
75

86
075F R
C9
FE
CE
F3

EB_Ol :
MOV
CALL
SUB
EB_02 :
DEC
JNZ

BL, FRCBEP+6
BEEP
CX, CX
LOOP
EB_02
DH
EB_Ol

SET BEEP CNTR LNG & FRC BEEP
CLEAR CX REGI STER
DELAY BETWEEN BEEPS
DECREMENT LONG BEEP COUNTER
I SSUE NEXT LONG BEEP

ISSUE SHORT BEEPS
074D
074D
074F
0751
0751
0753
0756
0758
075A
075C
075E
075E
075F

OA D2
74 OD
B3
E8
2B
E2
FE
75

81
075F R
C9
FE
CA
F3

C3

EB_03 :
OR
JZ
EB_04 :
MOV
CALL
SUB
EB_05 :
DEC
JNZ
EB_EXIT :
RET
ERR_BEEP

DL ,DL
ELEXIT

ANY SHORT BEEPS?

BL, FRCBEP+l
BEEP
CX ,CX
LOOP
EB_05
DL
EB_04

SET BEEP CNTR FOR SHORT BEEP
CLEAR CX REGISTER
DELAY BETWEEN BEEPS
NEXT SHRT BEEP IF NOT COMPLT
RETURN TO CALLER

ENDP

Beep to Speaker (BEEP)
; *********************************************************************
ROUTINE-NAME:
FUNCTION:

BEEP

TO BEEP THE SPEAKER

ENTRY CONDITIONS:
PURPOSE OF ENTRY: TO BEEP THE SPEAKER
INPUT CONDITIONS: BL CONTAINS THE COUNT FOR THE LENGTH OF TIME
MULTIPLIED BY 500 MSECS FOR THE SPEAKER TO SOUND. IF THE MSB
IN BL IS SET THE SPEAKER IS SOUNDED WHETHER OR NOT IT WAS
DISABLED.
RESTRI CTIONS: NONE
EXIT CONDITIONS:
NORMAL EXIT CONDITIONS:
ERROR EXIT CONDITIONS:
REGISTERS MODIFIED:
NONE
INTERNALLY REFERENCED ROUTINES: NONE
EXTERNALLY REFERENCED ROUTINES:

; *********************************************************************
075F
075F
0760
0761
0762
0762

50
53
51
BO B6

BEEP
PUSH
PUSH
PUSH
BEEP_SUB:
BPI:

2-206 ROM BIOS

PROC
AX
BX
CX

NEAR

MOV

AL,OB6H

SAVE REGISTERS
NO STACK ENTRY POINT
TIMER 2,MSB,LSB,BINARY

0764
0766
0769
076B
076D

E6
BB
E6
8A
E6

43
0533
42
C4
42

OUT
MOV
OUT
MOV
OUT

TI MER_CTL ,AL
AX,533H
TIMER2,AL
AL,AH
TIMER2,AL

076F

E4
8A
DC
F6
74

61
EO
03
C3 80
02

IN
MOV
OR
TEST
JZ

AL, NMLCNTL
GET SPEAKER ENABLE BIT
AH,AL
; SAVE SPEAKER ENABLE SETTING
AL,SPKR_DATA+TMRLGATE ; ENABLE SPEAKER
BL, FRCBEP
; CHECK FOR FORCED BEEP BIT
BP10
; JUMP I F NOT FORCED BEEP

anA
onE

DC 04
E6 61
BO E3 7F

BP5 :
BPI0:
AND

OR
AL, EN_SPKR ; SET SPEAKER ENABLE BIT
OUT
NMLCNTL,AL ; TURN ON SPEAKER ENABLE
MASK OUT FORCED BEEP BIT
BL, a FFH- FRCBEP

0781
0784
0786
0788

B9
E2
FE
75

MOV
BP15:
DEC
JNZ

CX,O
LOOP
BL
BP15

078A
078C

8A C4
E6 61

BP20 :
OUT

MOV
AL,AH
NMLCNTL ,AL

SET PREVIOUS PORT SETTING
SEND TO PPI

078E
0791
0793
0795

B8
8C
3B
74

AX ,OFOOOH
BX,SS
AX,BX
BEEP _EXT

CH ECK FOR ROM STACK

0797
0798
0799
079A
079A
079B

59
5B
58

CX
BX
AX

RESTORE REGISTERS

Onl
on3
On5
On8

onc

0000
FE
CB
FA

FOOD
D3
C3
03

C3

MOV
MOV
CMP
JE
POP
POP
POP
BEEP _EXT:
RET
BEEP

WRITE TO TIMER CONTROL PORT
DIVISOR FOR 1000 HZ
TIMER 2 COUNT LSB
TIMER 2 COUNT MSB

BP15

SET CNT TO WAIT 500 MSECS
WAIT 500 MSECS
DECREMENT COUNTER
LOOP I F COUNT NOT ZERO

IF ROM STACK THEN RETURN

RETURN
ENDP

Disable All Interrupts (DISABLE_NMI)
DISABLE ALL INTERRUPTS
079B
079B
079C
079D
079F
07 Al
07 A2
07A3

**************************
DISABLE_NMI

FA
50
80 07
E6 72
58
C3

NEAR
PROC
; DISABLE MASKABLE INTERRUPTS
CLI
PUSH
AX
AL,DISABLE_SLEEP+CLOCLRUN ; DISABLE NMIS
MOV
OUT
CLOCLCTL,AL
; WRITE TO PORT
POP
AX
RET
DISABLE_NMI
ENDP

Enable Global NMIs (ENABLE_NMI)
*************************************************************
ENABLE GLOBAL NMI' S

07A3
07A3

*************************************************************
50

ENABLE_NMI
PUSH
AX

PROC

NEAR

ROM BIOS 2-207

07A4
07A6
07A8
07A9
07AA

BO 27
E6 72
58
C3

MOV
AL,DISABLE_SLEEP+CLOCK-RUN+GLOBAL_NMI
OUT
CLOCK-CTL ,AL
; WRITE TO PORT
POP
AX
RET
ENABLE_NMI
ENDP

ENABLE NMIS

Get RTC Register (GET_RTC_REG)
; *********************************************************************
ROUTINE-NAME:

GELRTCREG

FUNCTION: THIS ROUTINE WILL GET THE DESIGNATED RTC REGISTER LOCATION
INTO THE AL REGISTER. ALL INTERRUPTS WILL BE DISABLED DURING
THIS PROCESS AND RESTORED WHEN COMPLETE.
ENTRY CONDITIONS:
INPUT CONDITIONS: AH = REAL TIME CLOCK REGISTER NUMBER
RESTRICTIONS:
NONE
AL

EXIT CONDITIONS:
REGISTERS MODIFIED:

=

CONTENTS OF SPECIFIED REGISTER

AL

. *********************************************************************
07AA
07AA
07AB
07AC
07AD
07AF
07Bl
0783
0785
0787
0789
0788
0780
078F
07Cl
07C3
07C5
07C6
07C7
07C8

9C
FA
53
E4
8A
24
E6
SA
E6
EB
E4
8A
8A
E6
SA
5B
90
C3

GELRTCREG
PUSHF

PROC

NEAR

CLI
72
08
OF
72
C4
70
00
71
F8
C3

72
C7

PUSH
IN
MOV
AND
OUT
MOV
OUT

JMP

DISABLE INTERRUPTS
BX
AL, CLOCKJTL
BL,AL
AL,NOT GLOBAL_NMI
CLOCKJTL, AL
AL,AH
RTCRjORT ,AL
$+2
AL, RTCD_PORT
BH,AL
AL, BL
CLOCK-CTL ,AL
AL, BH
BX

IN
MOV
MOV
OUT
MOV
POP
POPF
RET
GELRTCREG

BL (-- NMI CONTROL STATE
DISABLE NMI
WRITE RAM ADDRESS
READ DATA
BH <-- DATA
RESTORE NMI STATE
RESTORE DATA
RESTORE INTERRUPT STATE

ENDP

Put RTC Register (PUT _RTC_REG)
; *********************************************************************
ROUTINE-NAME:

PULRTCREG

FUNCTION: THIS RTNE WILL WRITE THE DESIGNATED RTC REGISTER LOCATION
WITH THE CONTENTS OF THE AL REGISTER. ALL INTERRUPTS WILL BE
DISABLE DURING THIS PROCESS AND RESTORED WHEN COMPLETE.
ENTRY CONDITIONS:
INPUT CONDITIONS: AH = REAL TIME CLOCK REGISTER NUMBER
AL = DATA TO BE STORED INTO REGISTER
RESTRICTIONS:
NONE

2-208 ROM BIOS

EXIT CONDITIONS:

DATA IN REGISTER MODIFIED

REGISTERS MODIFIED:
07C8
07C8
07C9
07CA
OlCB
07CD
07CF
0701
07D3
07D5
07D7
0709
07DB
07DD
07DF
07El
07E3
07E4
07E5
07E6

NONE

*********************************************************************
9C
FA
53
8A
E4
8A
24
E6
8A
E6
8A
E6
8A
E6
8A
5B
90
C3

08
72
F8
OF
72
C4
70
C3
71
C7
72
C3

PULRTCREG
PROC
NEAR
PUSHF
CLI
PUSH
BX
MOV
BL,AL
IN
AL, CLOCK-CTL
MOV
BH,AL
AND
AL,NOT GLOBAL_NMI
OUT
CLOCK-CTL, AL
MOV
AL,AH
RTCR_PORT ,AL
OUT
MOV
AL,BL
RTCD_PORT ,AL
OUT
MOV
AL,BH
OUT
CLOCK_CTL, AL
AL,BL
MOV
POP
BX
POPF
RET
PULRTCREG
ENDP

01 SABL E INTERRUPTS
BL

<--

DATA

BH <-- NMI CONTROL SAVE
DISABLE NMI
GET ADDRESS
WRITE RAM ADDRESS
GET DATA
WRITE DATA
RESTORE NMI STATE
RESTORE DATA
RESTORE INTERRUPT STATE

Setup for Battery Savings
(BAT_SAV -SETUP)
******************************************************************
BALSALSETUP
THIS ROUTINE ENABLES THE RTC 1 SEC UPDATE ENDED INTERRUPT AS A
TIME BASE FOR THE LCD BLANK AND THE SYSTEM POWER OFF OPTIONS
IF THE SYSTEM PROFILE INDICATES THAT ONE OR BOTH OF THESE
OPTIONS ARE ENABLED. I F NOT OR WE ARE ON EXTERNAL PWR THEN THE
INTERRUPT IS DISABLED.
RESTRICTIONS: RTC, AND SYSTEM SUSPEND NMIS MUST BE DISABLED
BEFORE CALL TO THIS ROUTINE
REGISTERS MODIFIED:
AX,BX,CX
07E6
07E6
07E8
07EB

B4 OB
E8 07AA R
8B 08

07ED
D7FO
07F3

80 CB 10
B9 0004
B4 19

D7F5
07F8
07FA
07FC
07FE

E8
3C
75
FE
E2

07AA R
00
10
C4
F5

0800
0802
0805
0807

B4
E8
A8
75

17
07AA R
40
03

BALSALSETUP
PROC
MOV
AH, RTCMODE
CALL
GELRTCREG
MOV
BX,AX
OR
MOV
MOV
BALSOI :
CMP
JNE
INC
LOOP
MOV
CALL
TEST
JNZ

NEAR
GET CURRENT MODE
SAVE ADDRESS AND MODE

BL,UIE_ENABLE
CX,4
AH, RTCLCD_I NACT
CALL
AL,O
BALS02
AH
BALSOI

DEFAULT TO SET ENABLE ON
CHECK THE FOUR TIME VALUES
SPECIFY BEG @ OF PROFILE

GELRTCREG
CHECK TIME FOR 0
I F NOT 0, OPTION ACTIVATED
LOOP TO CHECK NEXT BYTE

AH,RTCSYS_PROFl
GELRTCREG
AL,LOWBALENABLE
BALS02

GET LOW BAT WARNING STATE
JUMP IF WARNING ENABLED

DISABLE UPDATE ENDED INTERRUPT (BATTERY SAVINGS MODE IS DISABLED)
0809

80 E3 EF

AND

BL, NOT UI E_ENABL E

; TURN OFF INTERRUPT

ROM BIOS 2-209

UPDATE MODE REGISTER IN RTC
080C
080E
0811
0813
0815
0817
0818

88
E8
E4
24
E6
IE
E8

C3
07C8
61
F7
61

081B
0820
0821
0822

80 OE 0016 R 20
IF
C3

085C

BALS02 :
MOV
AX, BX
CALL
PULRTC_REG
IN
AL,NMLCNTL
AND
AL,NOT DIS~LARM
OUT
NMLCNTL ,AL
PUSH
OS
CALL
DDS
ASSUME DS:DATA
BIOS_STATUS, KYBD~CTIVE
OR
POP
DS
RET
BALSALSETUP
ENDP

RESTORE MODE AD DR AND DATA
ENABLE RTC INTERRUPT
SET OS TO DATA SEGMENT
; FORCE RELOAD OF COUNTERS

Keyboard I/O Entry Point
(KEYBOARD_IO)
KEYBOARD 1(0 ENTRY POINT

; *************************************
;ORG
082E
= 082E
082E E9 0000

OE82 EH
ORG
0082EH
KEYBOARD_IO
EQU
JMP
KYBD_IO

Keyboard Reset (KYBD_RESET)
SUBTTL

KYBD_RESET

; *********************************************************************
ROUTINE-NAME:

KYBD_RESET

FUNCTION: THIS ROUTINE INITIALIZES THE KEYBOARD CONTROL AREA TO A
NO KEY CONDITION.
ENTRY CONDITIONS:
PURPOSE OF ENTRY: PERFORM KEYBOARD DATA AREA INITIALIZATION
INPUT CONDITIONS: DS:DATA, NMI MUST BE DISABLED
RESTRI CTI ONS:
KEYBOARD NMI' S MUST BE DISABLED
EXIT CONDITIONS:
NORMAL EXIT CONDITIONS: KEYBOARD DATA AREA INITIALIZED
ERROR EXIT CONDITIONS:
REGISTERS MODIFIED:

NONE
ES,SI ,DI ,AX,CX

;*********************************************************************
KYBD_RESET

0831

0831
0832

IE
07

2B CO
BF 0017 R
B9 0027

NEAR

ASSUME

ES:DATA,DS:DATA

PUSH
POP

DS
ES

CLEAR INTERRUPT
0833
0835
0838

PROC

SUB
MOV
MOV

2-210 ROM BIOS

AND INTERRUPT 16 BUFFER AND CONTROL FLAGS
AX,AX
DI,OFFSET KB_AREAl
CX, KB~REALLNG

CLEAR KEYBOARD AREA 1

083B
0830
0840

F3/ AA
A2 0096 R
89 3E 0082 R

REP
MOV
MOV

,

STOSB
KLFLAG_3 ,AL
BUFFEILEND,DI

; CLEAR ADDITIONAL FLAGS
; SET UP BUFFER_END ADDR

; SETUP UP DEFAULT KEYBOARD BUFFER POINTERS

;
0844
0847
084B
084F

BE
89
89
89

OOlE R
36 OOlA R
36 OOlC R
36 0080 R

SI,OFFSET KB_BUFFER ; SETUP KEYBOARD PARAMETERS
BU FFER_H EAD, SI
BUFFER_TAIL,SI
BUFFER_START ,SI

MOV
MOV
MOV
MOV

INITIALIZE KEYBOARD NMI CONTROL AREA AND BUFFER (KB-AREA2)
0853
0856
0859
085B
085C

BF 00B4 R
B9 0019
F3/ AA
C3

MOV
MOV
REP
RET
KYBD_RESET

DI,OFFSET KB-AREA2
CX, KB-AREALLNG
STOSB
ENDP

Set Data Segment (DDS)
;*********************************************************************
ROUTINE-NAME:

DDS

FUNCTION: SET DATA SEGMENT (OS) TO BIOS DATA AREA
ENTRY CONDITIONS:
INPUT CONDITIONS: NONE
RESTRI CTIONS:
NONE
EXIT CONDITIONS:
OS = SET TO BIOS DATA SEGMENT
REGISTERS MODI FlED: OS
085C
085C
0850
0860
0862
0863
0864

;*********************************************************************
50
B8
8E 08
58
C3

R

DDS
PUSH
MOV
MOV
POP
RET
DDS

PROC
AX
AX,DATA
DS,AX
AX

NEAR

SAVE AX
SET SEGMENT
RESTORE AX

ENDP

Calculate Absolute Vector Offset
(GET_VECTOR@)
**************************************************
ROUTINE: GELVECTOR@
FUNCTION: CALCULATE ABSOLUTE VECTOR OFFSET OF
HARDWARE INTERRUPT LEVELS.
INPUT:
OUTPUT:

CL = HARDWARE INTERRUPT LEVEL # 0-7
SI = ABSOLUTE OFFSET ADDRESS OF VECTOR

REGISTERS MODIFIED:
0864
0864
0865
0867
0869
086B
0860

SI

***************************************************
50
2A
E4
24
E6
E4

E4
72
BF
72
63

GELVECTOR@
PROC
PUSH AX
SUB
AH,AH
IN
AL,CLOCLCTL
AND
AL,OBFH
OUT
CLOCLCTL,AL
IN
AL,63H

NEAR

SET READ INTERRUPT REG 0
READ CURRENT I RPT TYPE BITS

ROM BIOS 2-211

086F
0871
0873
0875
0877
0879
087A
087B

24
02
01
01
8B
58
C3

AL ,OF8H
AND
ADD
AL,CL
SHL
AX,l
SHL
AX,l
MOV
SI,AX
POP
AX
RET
GELVECTOR@
ENDP

F8
Cl
EO

EO
FO

CLEAR UNUSED BITS
ADD OFFSET TO LEVEL '#
MUL TI PL Y BY 4
MOVE INTO OUTPUT REGISTER

Keyboard Support Tables
; *****************************************************
KEYBOARD SUPPORT TABLES

NOTE: A -1 ENTRY INDICATES THE CORRESPONDING KEY IS
EXCLUDED FROM THE TABLE

; *************************************************71:***
;ORG
087E

OE87 EH
ORG

0087EH

---- - ------ ----- ------------ ------ ------------- --------- - -- - - - - - --

; ----- SHI FT & STATE KEY PCl SCAN CODES
087E
087E 52 3A 45 46
0882 38 10 2A 36
= 0008

K6 LABEL
DB
DB
K6LEQU

BYTE
I NSJEY , CAPS_KEY, NUM_KEY ,SCROLL_KEY
AL LKEY, CTL_KEY, LEFLKEY ,RIGHLKEY
$-K6

--------- ----- -------------------------------------- - -- - - - - - - - - - --

; ----- SHI FT & STATE KEY "MASKS"
0886
0886
088A

80 40 20 10
08 04 02 01

K7 LABEL
DB
DB

BYTE
INS_SHIFT,CAPS_SHIFT,NUM_SHIFT,SCROLl_SHIFT ; KB
ALLSHIFT,CTL_SHIFT,LEFLSHIFT,RIGHLSHIFT ; KB

---------------------- ------ ----------- ------ ------ ------ - -- - - - - --

; ----- CTL + TYPEWRITER KEYS
088E
0896
089E
08A6
08AD
08B6
08BE
08C6

IB
IE
FF
FF
17
09
10
13
04
OC
FF
16
OE
FF
20

-

ASCI I CODES

----------- ----------- ------- ----- -------- ----------- ----- ------ --

FF 00 FF FF FF K8
FF
FF FF IF FF 7F DB

DB

ESC,-1 ,NUL ,-1 ,-1 ,-1 ,RS,-1

-1,-I,-I,US,-I,DEL,-l,DCl ; 890

ESC 1 2 3 4 5 6 7
BKSPC TAB Q

11
05 12 14 19 15
OF
IBID OA FF 01
06
FF
FF
02
00
FF
FF

DB

ETB,ENQ,DC2,DC4,EM,NAK,HT,SIOI5 ; W E R T Y U I 0

DB

DLE,ESC,GS,LF,-I,SOH,DC3 ; P [

07 08 OA OB
FF
lC lA 18 03

DB

EOT,ACK006,BEL,BKSPC,LF,VT,FF,-I,-1 ; 0 F G H J K L

DB

-1,-I,FS,SUB,CAN,ETX,SYN,STX ;

FF FF FF FF

DB

SO,ENTER,-I,-I,-l,-I,-I,-1 ; B N M

DB

SPACE,-1

J

n

ENTER CTL A S

LSHFT \ Z

xCV B

/ RSHFT ALT

; SPACE CAPS lOCK

---------------------- ------- ------- ------------- - -- - - - - - - - - - - - - --

:----- CTL + (F KEYS) & (CURSOR KEYS) - EXTENDED ASCII CODES
K9 LABEL

08C8

BYTE
CTL + (Fl - FlO)

08C8
08CD

5E 5F 60 61 62
63 64 65 66 67

DB
DB

94,95,96,97,98
99,100,101,102,103

0802
0807
08DB

FF FF 77 FF 84
FF 73 FF 74
FF 75 FF 76 FF FF

DB
DB
DB

; CTl + CURSOR KEYS
-1, -1, CTL_HOME, -1, CTL_PGUP
-1, CTL_CUR_L FT , -1, CTL_CUR_RHT
-1, CTL_END, -1, CTL_PGDN, -1,-1

; -- -- ----- -- ---- -- -- ------ -- --- --- -- --- -- ------ ------------ --------

; ----- LOWER CASE TYPEWRITER KEYS - ASCII CODES
; --- -- --- -- -- -

08El
08El

--- ------- - -- ----- ----- --------- -- -- ---------- --- ----

KI0LABEL
BYTE
IB 31 32 33 34 35 DB
ESC,' 1234567890-=', BKSPC, TAB
36 37 38 39 30 20

2-212 ROM BIOS

08FO

0909

091B
091B
OnA

0944
0952

3D
71
75
00
67
27
60
76
2F

08
77
69
FF
68

09
65
6F
61
6A

72
70
73
6B

74
5B
64
6C

79
50
66
3B

'qwertyui op [] , , ENTER, -I, 'asdfghj kl; ',APOSTR

DB

IQI ,-1, '\zxcvbnm,.J I ,-1, 1*1 ,-l,SPACE,-l
FF 5C 7A 78 63 OB
62 6E 60 2C 2E
FF 2A FF 20 FF
-----------------------------------------------------------------;----- UPPER CASE TYPEWRITER KEYS - ASCI I CODES

1B 21 40 23 24 25
5E 26 2A 28 29 5F
2B 08 00
515745525459
55 49 4F 50 7B 70
00 FF 41 53 44 46
47 48 4A 4B 4C 3A
22 7E
FF 7C 5A 58 43 56
42 4E 40 3C 3E 3F
FF 00
FF 20 FF

KlILABEL
BYTE
DB
ESC,' !@#$%--,&*()_+',BKSPC,PSEUDO ; PSEUDO SHFLTAB
DB

'QWERTYUIOP{}',ENTER,-I,'ASDFGHJKL:"-'

DB

-I,' IZXCVBNM<>?' ,-I,PSEUDO

DB

-I,SPACE,-I

PSEUDO FOR PRTSC

~ == == =- SH j FT -:-(Fi -=- Fia) --=--EXTENDEii-ASC j j- CODES ----------------0955
0955
095A

KI2LABEL
BYTE
54 55 56 57 58
DB
84,85,86,87,88
59, 5A 5B 5C 50
DB
89,90,91,92,93
-----------------------------------------------------------------;----- ALT + (F1 - flO) - EXTENDED ASCII CODES

095F
095F
0964

KI3LABEL
BYTE
68 69 6A 6B 6C
DB
104,105,106,107, lOB
60 6E 6F 70 71
DB
109,110, 111,112,113
----------------- .. -----------------------------------------------;----- KEYPAD KEYS - ASCI I CODES
; .... -- -- --_ ........ -- --- -- ---_ .... - ---- -- -- -- -- -_ .. -_ .. -_ ........ -- -_ .. -_ ........ - ... - ..
KI4LABEL
BYTE
; IN KEYPAD_STATE
37 38 39 20 34 35 DB
'789-456+1230.'
36 2B 31 32 33 30
2E

0969
0969

, ------------------------------------------------------------------

;----- BASE CASE KEYPAD KEYS - EXTENDED ASCII CODES
; -- --- .. -- .......... -- .. -- .. -- .. - -- --_ ...... -........ ............
KI5LABEL
BYTE
47 48 49 FF
DB
HOME_KEY, CUILUP, PGUP,-I
4B FF 40 FF
DB
CUILLFT,-I,CUR_RHT,-I
4F 50 51
DB
END_KEY,CUR_DN,PGDN
52 53
DB
INS_KEY, DEL_KEY

-_

0976
0976
097A
097E
0981

-_

-- -_

-_

-_ ............ ---_ ...

KEYBOARD INTERRUPT 9 ENTRY POINT
ORG
0987
= 0987
0987 E9 0000

OE987H
ORG
KB_INT
JMP

00987H
EQU
KYBD_INT9

ROM BIOS 2-213

System Setup (SYS_SETUP)
SUBTTL

SYS_SETUP

*********************************************************************
ROUTINE-NAME:

SYS_SETUP

FUNCTION: THIS ROUTINE INITIALIZES INTRPT VECTORS AND SETS UP DATA
AREAS FOR DEVICES PRIOR TO BOOTING FROM DISKETTE.
ENTRY CONDITIONS:
PURPOSE OF ENTRY: PERFORM SYSTEM SETUP PRIOR TO BOOT
INPUT CONDITIONS: NONE
RESTRICTIONS:
NONE
EX IT CONDIT IONS:
NORMAL EXIT CONDITIONS: RETURN
ERROR EXIT CONDITIONS:
REGISTERS MODIFIED:

NONE
AX,BX,CX,DX

*********************************************************************
ASSUME
098A

DS:DATA,ES:ABSO
PROC

NEAR

CLEAR THE RESET FLAG I F NOT LOOP MODE
098A
0990
0992

81 3E 0072 R ABCD
74 06
C7 06 0072 R 0000

CMP
JE
MOV

RESELFLAG, LOOP_MODE
SYS_SETO
RESELFLAG,O

SET UP THE INTERRUPT VECTORS TO TEMP INTERRUPT
0998
0998

E8 OAOC

099B
0990
099F
09A6
09AB
09B2

2B CO
8E CO
26 C7
26 8C
26 C7
26 8C

SYS_SETO:
CALL

VECTOR_SETUP

SETUP INTERRUPT VECTORS

COMPLETE THE VECTOR SETUP

06
OE
06
OE

01BO
01B2
0128
012A

R
R
R
R

SUB
MOV
IF53 R
MOV
IF53 R
MOV

AX,AX
ES,AX
WORD PTR[RESUME_PTR] ,OFFSET DUMMLRETURN
MOV
WORD PTR [RESUME_PTR+2] ,CS ; SET SEGMENT
WORD PTR [RTCA_PTR] ,OFFS ET DUMMLRETURN
MOV
WORD PTR[RTCA_PTR+2] ,CS ; SET SEGMENT

SET UP KEYBOARD DATA AREA
09B7
09BA

E8 0831 R
80 OE 00B4 R 08

09BF
09Cl
09C4
09C6
09C9

B4
E8
24
E8
E8

CALL
OR

KYBD_RESET
; RESET KEYBOARD
KB_NMLCNTL, CLI CK_ON ; ACT I VATE KEYBOARD CLI CKER

DISABLE RTC PERIODIC,ALARM AND UPDATE INTERRUPTS AND RESET SET
OB
07AA
OF
07C8 R
07E6 R

MOV
CALL
AND
CALL
CALL

AH, RTCMODE
; GET RTC MODE CONTROL
GELRTCREG
AL, NOT PI E_ENABLE+SELCLOCK+AI E_ENABLE+U IE_ENABLE
PULRTCREG
; UPDATE RTC MODE CONTROL
BALSALSETUP
; SETUP FOR BATTERY SAVINGS

TURN OFF MODEM I F ON BATTERY POWER AND PROFILE SO INDICATES
09CC
09CE
0900

E4 7F
A8 40
75 13

IN
TEST
JNZ

AL, PWR_STAT
AL,EXLPWR
SYS_SET2

0902
0904

B4 17
E8 07AA

MOV
CALL

AH, RTCSYS_PROFI
GELRTCREG

2-214 ROM BIOS

; CHECK FOR BATTERY OPERATION

GET SYSTEM PROFILE

09D7
09D9

A8 02
75 OA

09DB
09DD
09DF
09E2

B3
2A
E8
EB

TEST
JNZ

AL,MODEM_BATT
SYS_SET2

; OPERATE MODEM ON BATTERY?
; YES THEN JUMP

ON BATTERY POWER AND MODEM PROFILE INDICATES NO BATTERY OPERATION
02
FF
0000 E
09 90

MOV
SUB
CALL
JMP

BL,ACLMODEM
BH,BH
COM-POWER
SYS_SET3

SPECI FY MODEM OFF
INDICATE POWER OFF REQUEST
TURN OFF PRIMARY COM POWER

MODEM POWER LEFT ON SO SET MODEM ACCORDING TO CONFIGURATION
09E5
09E5
09E7
09EA

B4 1D
E8 07AA R
E8 0000 E

SYS_SET2 :
MOV
CALL
CALL

AH, RTCMOD_PROFl
GELRTCREG
MODEM_CONFIG

RETRIEVE MODEM PROFILE
GET PROFILE IN AL REGISTER
GO SETUP MODEM

ENABLE DISKETTE NMIS
09ED
09ED
09EF
09F1

E4 77
OC 80
E6 77

SYS_SET3 :
IN
OR
OUT

AL,DSKLCNTL
AL,DSKLNMI
DSKLCNTL , AL

READ FROM DISKETTE PORT
SET ON DISKETTE NMI ENABLE
OUT IT

ENABLE KEYBOARD NMIS
09F3
09F5
09F7

E4 7C
OC 80
E6 7C

IN
OR
OUT

AL,KYBD_CNTL
AL, EN-KYBD_NMI
KYBD_CNTL,AL

; ENABLE KEYBOARD NMI' S

ENABLE SPEAKER, RTC ALARM NMI, AND I/O CHECK NMI
09F9
09FB
09FD
09FF

E4
24
OC
E6

61
D7
04
61

OA01
OA03

BO 80
E6 AO

IN
AND
OR
OUT

AL,NMLCNTL
; ENABLE RTC INTERRUPT
AL , NOT 0 I S_ALARM+D I S_IOCHK
AL, EN_SPKR
; ENABLE SPEAKER
NMLCNTL,AL

ENABLE I/O CHANNEL CHECK
MOV
OUT

AL, EN_IOCHK
IONMLCNTL,AL

ENABLE KEYBOARD, TIMER 0 AND DISKETTE INTERRUPTS
OAOS
OA07
OA09
OAOB
OAOC

E4 21
24 BC
E6 21
C3

IN
AL,INTA01
AND
AL ,OBCH
INTA01,AL
OUT
RET
SYS_SETUP ENDP

ENABLE KEYBOARD AND TIMER
AND DISKETTE INTERRUPTS

Vector Setup (VECTOR_SETUP)
SUBTTL

VECTOR_SETUP

*********************************************************************
ROUTINE-NAME:

VECTOILSETUP

FUNCTION: THIS ROUTINE INITIALIZES INTERRUPT VECTORS 0-32 AND THE
PRINTER AND RS232 TIMEOUT VALUES. VIDEO VECTORS lOH,lDH,lFH,44H
ARE NOT INITIALIZED BY THIS ROUTINE. THEY ARE INITIALIZED IN
THE LCD_CONFIG ROUTINE DURING POST.
ENTRY CONDITIONS:
INPUT CONDITIONS: DS:DATA
RESTRICTIONS:
NMI' S MUST BE DISABLED
EX IT CONDITIONS:
NORMAL EXIT CONDITIONS: INTERRUPT VECTORS AND TIMEOUTS SET

ROM BIOS 2-215

ERROR EXIT CONDITIONS:
REGISTERS MODIFIED:

NONE
ES,SI,DI,AX,CX

*********************************************************************
VECTOR_SETUP PROC NEAR

OAOC

OAOC
OAOD
OAIO
OAl2

IE
B9 OOIF
2B FF
8E C7

ASSUME

DS:DATA,ES:ABSO

PUSH
MOV
SUB
MOV

OS
CX,31
01,01
ES,DI

SAVE OS
FILL ALL 31 INTERRUPTS
FIRST INTERRUPT LOCATION
SET ES=ABSO

INITIALIZE FIRST 31 VECTORS TO 011 (TEMPORARY INTERRUPT HANDLER)
VECTORS 0-lEH SET TO 011
SETUP _1:
MOV

OAl4
OAl4

B8 I F23 R

OAl7
OA1A
OA1C
OA1F

83
74
83
75

OA21
OA21
OA24

83 C7 04
E2 EE

SETUP _lA:
ADD
LOOP

OA26
OA26
OA27
OA29
OA2A

AB
8C C8
AB
E2 E8

SETUP_IB:
STOSW
MOV
STOSW
LOOP

FF 40
05
FF 74
05

cr~p

JE
CMP
JNE

AX,OFFSET 011

MOVE ADDR OF INTR PROC TO TBL

01, 10H*4
SETUP_lA
01, 1DH*4
SETUP_1B

VIDEO INT 10H?
YES THEN SKIP
VIDEO INT IDH?
YES THEN SKIP

01,4
SETUP_1

SKI P VECTORS

AX,CS

SET VECTORS
GET ADDR OF INTR PROC SEG

SETUP_1

-INITIALIZE BIOS VECTORS 8-1EH FROM VECTOR_TABLE
SKIPPING VIDEO VECTORS 10H AND IDH
OA2C B9
OA2 FOE
OA30 1 F
OA31 BE
OA34 BF
OA37
OA37 83
OA3A 74
OA3C 83
OA3F 75

MOV
PUSH
POP
MOV
MOV
SETUP_2:
CMP
JE
CMP
JNE

0017
1EF3
0020
FF 40
05
FF 74
08

CX ,23
; GET VECTOR COUNT
CS
; SETUP OS SEG REG
OS
SI,OFFSET VECTOR_TABLE
DI,OFFSET INLPTR
DI,10H*4
SETUP _2A
DI,lDH*4
SETUP _2B

VIDEO INT lOH?
YES THEN SKIP
VIDEO INT 1DH?
YES THEN SKIP
SKIP VIDEO VECTORS

OM1
OM1
OM4
OM7

83 C7 04
83 C6 02
E2 EE

SETUP_2A:
ADD
ADD
LOOP

01,4
SI,2
SETUP _2

0A49
0A49
OMA
OMD
OMF

A5
83 C7 02
E2 E8
1F

SETUP_2B:
MOVSW
ADD
LOOP
POP

01,2
SETUP_2
OS

SET UP NMI,PRINT SCREEN, BASIC SEGMENT,
USER REAL TIME CLOCK ALARM VECTORS
OA50
OA57
OA5E

26: C7 06 0008 R
0000 E
26: C7 06 0014
1 F54 R
26: C7 06 0062
F600

SET VECTORS
SKI P OVER SEGMENT
RESTORE OS
RESUME VECTOR, AND

MOV

NMLPTR,OFFSET NMLFLIH ; NMI INTERRUPT HANDLER

MOV

INT5_PTR,OFFSET PRINLSCREEN ; PRINT SCREEN

MOV

BASICPTR+2,OF600H

ASSUME

ES:DATA,DS:DATA

2-216 ROM BIOS

; SEGMENT FOR RESIDENT BASIC

PUSH
POP

OA65
OA66

1E
07

OA67
OA6A
OA6D
OA70
OA75
OA77

A2
BF
B8
83
75
BO

OA79
OA79
OA7A
OA7C
OA7D
OA80
OA81
OA82
OA83

AB
8A C4
AA
B8 OlD1
AS
AB
C3

OS
ES

SET INITIAL RS232 AND PRINTER TIMEOUT VALUES
006B R
0078 R
1414
3E OOOB R 78
02
23

MOV
MOV
MOV
CMP
JNE
MOV

I NTR_FLAG, AL
; CLEAR STRAY INTERRUPT FLAG
DI,OFFSET PRINLTlM_OUT ; SET DEFAULT PTR TIMEOUT
DEFAUL T = 20
AX,1414H
PRI NTER_BASE, 078H
PORTABLE PRINTER INSTALLED?
SETUP _3
JUMP I F NOT
SET PORTABLE TO 25 SECS
AL,23H

SETUP_3:
STOSW
MOV
AL,AH
STOSB
MOV
AX,0101H
STOSW
STOSW
RET
VECTOR_SETUP ENDP

THREE TIMEOUT VALUES
USE LPT2 TIMEOUT VALUE
RS232 TIMEOUTS
4 TIMEOUTS

= 01

RETURN TO CALLER

KEYBOARD TABLES CONTINUED
ORG

OEA87H
ORG

OA87

00A87H

------------------------------------------------------------------

~----OA87
OA87
OA8C

ALT + (KEYPAD 0 - 9) - EXTENDED ASCII CODES
K30

52 4F 50 51 4B
4C 40 47 48 49

DB
DB

LABEL
BYTE
82,79,80,81,75
76,77,71,72,73

; 10 NUMBERS ON KEYPAD

-----------------------------------------------------------------~----- ALT + (A - Z)
EXTENDED ASCI I CODES
-- SUPER SHIFT --

OA91
OA99
OAA1
OAA9

10
16
18
22
24
2F
31

- - - -- - - - - - - - - - --------- - - - - - -- - -- - - - - --- - - - ---- -- --- - --- -- - ----- --

11 12 13 14 15
17
19 IE IF 20 21
23
25 26 2C 20 2E
30
32

DB

16,17,18,19,20,21,22,23 ; A-Z TYPEWRITER CHARS

DB

24,25,30,31,32,33,34,35

DB

36,37,38,44,45,46,47,48

DB

49,50

; *******************************************************************
;

KEY TRANSLATION TABLE - INTERNAL SCAN CODES TO PC! SCAN CODES WHILE
THE KEYPAD STATE IS ACTIVE (KEY PAD SCAN CODES).

; *******************************************************************
TABLE CONTAINS INTERNAL AND PC! SCAN CODE PAIRS. HIGH BYTE IS INTNL
SCAN CODE AND THE LOW BYTE IS THE PC1 EQUIVALENT.
OAAB
OAAB
OABB

= 001E

1847
1D4E
384F
4A53

1948
284B
3950
4B35

KBPAD_TBL LABEL WORD
1A49 1C4A
OW
1847H, 1948H, 1A49H, 1C4AH, 1D4EH, 284BH, 294CH, 2A4DH
294C 2A4D
3A51 4852
384FH, 3950H, 3A51H, 4B52H, 4A53H, 4B35H, 4E37H
OW
4E37
KBPADL EQU $-KBPAD_ TBL

; *******************************************************************
KEY TRANSLATION TABLE - INTERNAL SCAN CODES TO PC1 SCAN CODES WHILE
THE FUNCTION KEY IS HELD.

; *******************************************************************
FIRST 6 ENTRIES OF THIS TABLE CONTAIN INTNL AND PC1 SCAN CODE PAIRS.
HIGH BYTE IS THE INTERNAL SCAN CODE AND THE LOW BYTE IS THE PC1
EQUIVALENT. ENTRIES 5-8 CONTAIN INTERNAL SCAN CODES AND THEIR STATE
BIT IN KB_NMLCNTL. HIGH BYTE IS THE INTERNAL SCAN CODE AND LOW BYTE
CONTAINS STATE BIT FOR KEYPAD STATE, CLICKER STATE, AND AUDIO STATE

change made for speaker from Fn+A to Fn+Scrol LLock

ROM BIOS 2-217

OAC9
OAC9

KBFUN_TBL LABEL WORD
5B47 5C49 5F4F 5E51
OW
5B47H,5C49H,5F4FH,5E51H,0257H,0358H
0257 0358
OAD5 0108 OC04 3102 0001
OW
0108H,OC04H,3102H,ODOIH
KBFUNL EQU $-KBFUN_TBL
" 0014

; *******************************************************************
KEY TRANSLATION TABLE
TABLE DISPLACEMENT 52H IS THE FUNCTION KEY AND IS SET TO 52H.
THIS WILL ALLOW TESTING OF THE FUNCTION KEY EVEN THOUGH IT DOES
NOT HAVE A PC! SCAN CODE EQUIVALENT.
change made for bksp and \ change
EX PLANA TI ON
Each entry is the P60 make scan code for the NMI scan code
corresponding to this position.
P60 sc
P60 sc
P60 sc

OFFH

> 080H
< 080H

means no such NMI scan code
means the key may be a FN+key or Keypad key.
means the key is a base key

; *******************************************************************
;------ TABLE OF INTERNAL SCAN CODES TO PC! SCAN CODES
DADO
DADO
OAE5
OAED
OAF5
OAFO
OB05
OBOO
OB15
OB10
OB25
OB2D
OB35

FF
3F
41
52
FF
06
88
2B
FF
14
96
FF
FF
22
A4
lC
FF
30
B2
B7
FF
39
FF
DO

81
40
42
53
29
07
89
DE
OF
15
97
FF
BA
23
A5
FF
2A
31
33
FF
10
FF
FF
CD

BB BC 3D 3 E

KBNMLTBL LABEL BYTE
OFFH, 081H, OBBH, OBCH, 03DH, 03EH, 03 FH, 040H
DB

43 44 C5 C6

DB

041H, 042H, 043H, 044H, OC5H, OC6H, 052H, 053H

02 03 04 05

DB

OFFH, 029H, 002H, 003H, 004H ,005H, 006H, 007H

8A OB 8C 80

DB

088H, 089H, 08AH, OOBH, 08CH, 08DH, 02BH, OOEH

10 11 12 13

DB

OFFH, OOFH, OlOH, 011H, 012H, 013H, 014H, 015H

98 19 lA lB

DB

096H, 097H, 098H, 019H ,0IAH, 01 BH, OFFH ,OFFH

1E 1F 20 21

DB

OFFH, OBAH, 01 EH, 01 FH, 020H, 021H, 022H, 023H

A6 27 28 2B

DB

OMH, OA5H, OA6H, 027H, 028H, 02BH, 0ICH, OFFH

2C 20 2E 2F

DB

OFFH ,02AH, 02CH, 02DH, 02EH, 02FH, 030H, 031H

B4 B5 36 FF

DB

OB2H, 033H, OB4H, OB5H, 036H, OFFH, OB7H, OFFH

02 38 56 FF

DB

OFFH, 010H, OD2H, 038H, 056H, OFFH, 039H, OFFH

38 CB C8 FF

DB

OFFH, OFFH, 038H, OCBH, OC8H, OFFH, ODOH, OCDH

2-218 ROM BIOS

Error Message Routine (SYS_CHK)
*********************************************************************
ROUTINE-NAME:

SYS_CHK

FUNCT ION: TH I S ROUTI NE DSPL YS ERROR MESSAGES ACCORD I NG TO FLAGS SET
IN THE RTCDIAG_STAT SAVE AREA. ONCE THE FLAG HAS BEEN FOUND
IT IS CLEARED IF AN ASSOCIATED ERROR CODE IS PRESENT.
ENTRY CONDITIONS:
PURPOSE OF ENTRY: DISPLAY ERROR MESSAGES
INPUT CONDITIONS: DS:DATA
RESTRICTIONS:
NONE
EXIT CONDITIONS:
NORMAL EX IT CONDITIONS: RETURN
ERROR EXIT CONDITIONS: NON FATAL ERROR RETURN CODE WITH ERROR CODE
I F ASSOCIATED BIT SET. RE_DISPATCH FLAG SET
IF ALL BITS IN RTCDIAG_STAT NOT YET CHECKED.
REGISTERS MODIFIED:

AX, BX, CX, OX

*********************************************************************
OB3D
OB3D
OB3F
OB41
0843
0843
0845
0848
OB4B
084E
084E
0851
OB53
0856
0858
085A

40 73
20 71
10 75
B4
E8
B9
BE

OE
07AA R
0003
0830 R

2E: 84 04
75 OA
83 C6 02
E2 F6
2B CO
EB 00 90

ERROR_TABLE
LABEL WORD
DB
BAD_RTCSIG,73H
DB
BAD_STORJKSUM, 7lH
DB
LCD-ALLFAILED,75H

RTC SIGNATURE BAD
STG CHECKSUM BAD ON RESUME
ALTERNATE LCD MODE FAILED

SYS_CHK PROC
NEAR
MOV
AH,RTCDIAG_STAT
CALL
GELRTCREG
MOV
CX,3
; THREE ENTRI ES IN TABLE
MOV
SI,OFFSET ERROR_TABLE
SYS_LP:
TEST
AL, BYTE PTR CS: [SI] ; CHECK FOR BIT ON
SYS_ERR
JNZ
ADD
SI,2
LOOP
SYS_LP
; CLEAR ERROR CODE
SUB
AX,AX
JMP
SYS_EXIT
ERROR MATCH FOUND SO CHECK FOR ERROR CODE

0850
0850
0860
0862
0865
0867
; SET

SYS_ERR:
2E: 8B lC
MOV
32 C3
XOR
E8 07C8 R
CALL
B4 50
MOV
8A C7
MOV
ERROR CODE FROM TABLE

0869
0869
086A

C3

BX,WORD PTR CS: [SI] ; GET CODE FROM TABLE
AL, BL
; RESET ERROR BIT
PULRTCREG
; SAVE IN RTCDIAG STAT
AH,NON_FATAL_ERR+RE_DISPATCH ; SET ERR AND REDISP
AL, BH

SYS_EXIT:
RET
SYS_CHK ENDP

ROM BIOS 2-219

Resume Error Check (RES_ERR_CHK)
*********************************************************************
ROUTINE-NAME:

RES_ERILCHK

FUNCTION: THIS ROUTINE CHKS AND DSPLYS ANY ERROR MESGS ASSOCIATED
WITH OPERATOR CAUSED RESUME ERRORS. THIS IS DONE AT BOOT TIME
AFTER AN ABORTED RESUME.
ENTRY CONDITIONS:
PURPOSE OF ENTRY: DISPLAY ERROR MESSAGES
INPUT CONDITIONS: DS:DATA
RESTRI CTIONS:
NONE
EXIT CONDITIONS:
NORMAL EXIT CONDITIONS: RETURN

WITH ZERO FLAG SET

ERROR EXIT CONDITIONS: ERROR NO. IS DISPLAYED ON ROW XX COLUMN XX
OF THE SCREEN AND THAT ERROR FLAG IS RESET
RETURN IS MADE WITH ZERO FLAG RESET
REGISTERS MODIFIED:
OB6A
OB6A
OB6C
OB6E

AX,BX,CX,DX,ES,SI,DI,BP

*********************************************************************
02 70
01 72
08 74

OB70
0870
OB73
0873
OB75
OB78
OBlB
OB7E
OB7E
OB81
OB83
OB86

2E: 84 04
75 OB
83 C6 02
E2 F6

OB88
OB8B

80 FE 06
EB 2C 90

BA 0632
B4
E8
B9
BE

OE
07AA R
0003
OB6A R

ERRLTABLE
DB
DB
DB

LABEL WORD
LCD_NOLACTlVE,70H
DSKLACTIVE,72H
LCO_CHANGE,74H

RES_ERILCHK PROC NEAR
MOV
DX, 0632H
RES_LPO:
AH, RTC_DIAi>-STAT
MOV
CALL
GELRTCR£G
MOV
CX,3
;
SI,OFFSET ERR2_TABLE
MOV
RES_LP:
TEST
AL,BYTE PTR CS: [SI]
RES_ERR
JNZ
ADD
SI,2
RES_LP
LOOP
CMP
JMP

SET ROW =

6 COLUMN=50 FOR MSG

GET THE ERROR FLAGS FROM RTC
THREE ENTRIES IN TABLE
CHECK FOR BIT ON

SAME ROW AS STARTED ON?
I F SO NO ERRORS· A Z FLAG 5 ET
ELSE ERROR & Z FLAG CLEARED

ERROR MATCH FOUND SO CHECK FOR ERROR CODE
OB8E
OB8E
OB91
OB93

2E: 8B 1C
32 C3
E8 07C8 R

OB96
OB99
OB9B
OB9C
OB9E
OBAO
OBA3
OBA6
OBA7
OBAA
OBAD
OBBO
OBB3
OBB5

B8
8E
52
B6
8A
BF
E8
5A
BB
B9
BD
B8
CD
FE

---CO
01
D7
0009
0275
0007
0004
OOOA R
1300
10
C6

RES_ERR:
MOV
XOR
CALL

BX,WORD PTR CS: [51]
AL,BL
PULRTCREG

ASSUME

ES:XXDATA

MOV
MOV
PUSH
Mav
MOV
MOV
CALL
POP
MOV
MOV
MOV
MOV
INT
INC

AX,XXDATA
ES,AX
DX
DH,Ol
OL,BH
OI,OFFSET TEMP
STILCON
DX
BX,0007H
CX,4
BP,OFFSET TEMP+1
AX,1300H
10H
DH

2-220 ROM BIOS

GET CODE FROM TABLE
RESET ERROR BIT
SAVE IN RTCOIAG STAT

SAVE COORDINATES
SET HIGH BYTE OF ~RROR CODE
SET ERROR CODE FROM TABLE
POINT TO MESSAGE SAVE AREA
CONVERT CODE TO·ASCI I
RESTORE COORDINATES
SET ATTRIBUTE AND PAGE
SET STRING LENGTH
GET ADDRESS OF STRING
SET WRITE STRING REQUEST
OISPLAY ERROR CODE
POINT TO NEXT ROW

OBB7
OBB9
OBB9
OBBA

GO LOOK FOR MORE ERRORS

JMP
SHORT RES_LPO
RES_EXIT:
RET
RES_ERR_CHK ENDP

EB BA
C3

Diskette I/O Entry (DISKETIE-IO)
; *****************************************************
; DISKETTE I/O ENTRY POINT

; *****************************************************
;ORG
OC59
= OC59
OC59 E9 0000

OEC59H
ORG
00C59H
DISKETTE_IO
EQU
JMP
DSKLIO

Icon and Error Message Routine
(E_MSG)
******************************************************************
ROUTINE-NAME:

LMSG

FUNCTION: THIS ROUTINE DISPLAYS ICONS AND ERROR MESSAGES FOR POST
ENTRY CONDITIONS:
PURPOSE OF ENTRY: TO DISPLAY A POST ICON AND/OR ERROR MESSAGE
INPUT CONDITIONS: AX = ERROR CODE
; IF AH = 0 THEN NO ERROR
CODE , ONLY AN ICON
ES:DI = POINTS TO AN ADDITIONAL ASCII ERROR
MESSAGE. IF 01 = 0 THEN NO MESSAGE
CL = I CON NUMBER TO 01 SPLAY
RESTRICTIONS: NONE
EXIT CONDITIONS:
NORMAL EXIT CONDITIONS:
ERROR EX IT COND IT IONS:

REGISTERS MODIFIED: AX,BX,CX,DX,BP,DI,SI
INTERNALL Y REFERENCED ROUTI NES:

NONE

EXTERNALL Y REFERENCED ROUTI NES:

STR_CON

******************************************************************
ASSUME CS: ROMCODE
ASSUME DS:XXDATA
ASSUME ES:NOTHING
OCSC
OC5C
OC5D

LMSG
IE
06

PUSH
PUSH

PROC
OS
ES

NEAR
SAVE SEGMENT REGS

ROM BIOS 2-221

OC5E
OC5F
OC60

57
06
50

PUSH
PUSH
PUSH

01
ES
AX

OC61
OC62
OC63
OC66
OC68

OE
07
B8 ---8E 08
B5 00

PUSH
POP
MOV
MOV
MOV

CS
ES
AX,XXDATA
DS,AX
CH,O

SAVE PTR TO ASCI I ERROR MSG
SAVE ERROR CODE
POINT ES TO CODE SEGMENT
SET OS TO XXDATA SEGMENT
CLEAR CH

CHECK FOR NEED TO DISPLAY I CON AND DO SO I F NECESSARY
OC6A
OC6C
OC6E
OC73
OC75
OC78

8B F9
01 E7
2E: 8B AD 0249
8B F9
83 FF 06
75 52

EMlO:
SHL
MOV
MOV
CMP
JNE

MOV

DI,CX
01,1
BP,ICONJDR[DI]
DI,CX
01,6
EM15

; SAVE ICON NUMBER
; MULTIPLY BY 2
BP POINTS TO ICON DATA
; Fl ICON

DISPLAY Fl ICON AND WAIT FOR F1 TO BE PRESSED IF SYS UNIT DISPLAYED
OTHERWISE WAIT 10 SECONDS AND THEN RETURN
OC7A
OC7F

80 3E 002B R 00
74 29

CMP
JE

ICON_DIS+l,O
EM13

SYSTEM UNIT DISPLAYED?
JUMP I F NO SYSTEM UN IT

OC81
OC84

BA 1200
E8 OD5F R

MOV
CALL

DX,01200H
ICON_PR

OX POINTS TO DSPLY POSITION
DISPLAY F1 ICON

KEYSTROKE FOUND SO CHECK FOR CORRECT KEYS
OC87
OC87
OCB9
OC8B
OC8E
OC90
OC92

B4
CD
80
74
3C
75

00
16
FC 3B
11
OC
F3

OC94
OC97
OC99
OC9F

88
8E
C7
EB

---- R
08
06 0072 R ABCD
25

OCA1
OCA2
OCM
OCA6
OCA8

FB
E4
3C
74
EB

EMIl :
MOV
INT
CMP
JE
CMP
JNE

AH,O
16H
AH,03BH
EM12
AL,OOCH
EMIl

SET GET KEYSTROKE FN CODE
GET A KEYSTROKE
Fl KEY?
YES THEN WAIT FOR REL OF KEY
CTL +L FOR LOOP MODE?
NO LOOK FOR NEXT KEY SEQ

ASSUME

DS:DATA

MOV
MOV
MOV
JMP

AX,DATA
; SETUP DATA SEGMENT
DS,AX
RESELFLAG,LOOP_MODE ; SET POST LOOP MODE
SHORT EM14
; EXIT

WAIT FOR BREAK OF F1 KEY
60
3B
F9
1C

EM12 :
IN
CMP
JE
JMP

STI
AL,KB-DATA
AL,03BH
EM12
SHORT EM14

ENABLE INTERRUPTS
READ KEY BOARD PORT
CHECK FOR STI LL Fl KEY
WAIT UNTI L NOT Fl KEY MAKE
EXIT IF Fl KEY RELEASED

NO SYSTEM UNIT SO ONLY WAIT 10 SECONDS OR UNTIL KEY HIT
OCAA
OCAA
OCAD
OCAE
OCBO
OCB2
OCB4
OCB6
OCB8
OCBA
OCBA
OCBC
OCBE
OCCO
OCC2
OCC4

BA
EC
8A
B3
BO

0060
F8
B5
12

B4 41
CD 15
72 OC
B4
CD
74
B4
CD
EB

01
16
06
DO
16
F4

EMl3 :
MOV
IN
MOV
MOV
MOV
MOV
INT
JC
EMl3_1 :
MOV
INT
JZ
MOV
INT
JMP

2-222 ROM BIOS

DX,KB_DATA
Al,DX
BH,Al
Bl,OBSH
AL,12H
AH,41H
ISH
EM14
AH,l
16H
EM14
AH,O
16H
SHORT EMILI

KEYBOARD PORT
GET PRESENT PORT 60 VALUE
SET TIMEOUT TO 10 SECONDS
COMPARE RETURN NOT EQUAL
USING BH AND PORT READ (OX)
WAIT ON EXTERNAL EVENT
WILL RETURN AFTER 10 SECS
I F TIMEOUT THEN JUMP
CHECK FOR KEY IN BUFFER
JUMP I F NO KEY IN BUFFER
OTHERWISE. PURGE THE KEY
LOOP UNTIL NO MORE KEYS

Fl WAIT COMPLETED SO EXIT
OCC6
OCC6
OCC9

EM14 :
ADD
JMP

83 C4 06
E9 005C R

BALANCE STACK
EXIT WHEN PRESSED

NOT REQUEST TO DISPLAY Fl PROMPT
ASSUME
OCCC
OCOO
OC03
OC05
OC07
OCOB
OCOO
OCE1
OCE5
OCE7
OCEC
OCEE

8A 80 002A R
EM15 :
80 F9 00
CMP
8B F1
MOV
75 lA
JNE
8A OE 002A R
MOV
FE Cl
INC
88 80 002A R
MOV
88 OE 002A R
MOV
8B F1
MOV
2E: 8A 94 0078 R
MOV
B6 00
MOV
E8 005F R
CALL

OCFl
OCF2
OCF4

58
OA E4
74 3C

OCF6
OCF7
OCF9
OCFC
OCFE
0001
0004
0005
0009
0000
0012
0015
0013
ODIA

57
8B DO
B8 ---8E CO
BF 0009
E8 0275
5F
8A 90 0031
FE 85 0031 R
2E: 8A 94 0073 R
30 C2 08
83 FF 02
75 03
80 EA 04

OOlD
ODIF

B6 09
02 F3

0021
0024
0027
0029
002B
0020
0030

B9
BD
B4
CD
B3
B8
CD

MOV

OS:XXOATA
CL,ICON_OIS[OI- ; MOVE OSPLY SQUARE NO. TO SI
HAS ICON BEEN DISPLAYED?
CL ,0
SI, CX
SAVE DISPLAY SQUARE NO.
EM20
CL,ICON_OIS[O]
GET NO. ICONS ALREADY DSPLYD
CL
ICON_OIS[OI] ,CL
STORE DSPLY SQUARE WITH ICON
ICON_DIS [O],CL
SAVE NO. OF ICONS DISPLAYED
SI, CX
SAVE DISPLAY SQUARE
OL, 0 I S_POS [S I]
GET COL NUMBER FOR DISPLAY
PUT ROW NUMBER IN DH
OH,O
ICON_PR
DISPLAY ICON

CONVERT AND DISPLAY ERROR MESSAGE IN AX IF REQUIRED
EM20 :
OR

POP

JZ
PUSH
MOV
MOV
MOV
MOV
CALL
POP
MOV
INC

01
OX ,AX
AX,XXDATA
ES ,AX
OI,OFFSET TEMP
STR_CON
01
BL,ICON_MSG[OI]

MOV

DL,DIS_POS[SI]
DL,8
01,2
EM25
DL,4

ICON~SG[DI]

ADD
CMP
JNE
SUB
EM25:
ADD

MOV

OH,9
OH,BL

MOV

0004
OOOA R
OF
10
07
1300
10

AX
AH,AH
EM30

CX,4
BP,OFFSET TEMP+l
AH,15
10H
BL, 07H
AX,01300H
10H

MOV
MOV
I NT
MOV
MOV
I NT

RESTORE ERROR CODE
ERROR MESSAGE?
SAVE ICON NUMBER
MOVE ERROR CODE
ES POINTS TO XXOATA
PO I NTER FOR CONVERS ION RTN E
CONVERT ERROR CODE TO ASCI I
RESTORE I CON NUMBER
GET NO. OF MSGD UNDER ICON
I NCREMENT NO. OF MESSAGES
GET SCREEN POSITION
CENTER MESSAGE
FEATURE ICON?
ADJ OSPLY POS FOR FEAT ICON
FIRST MESSAGE GOES AT ROW 9
ERROR MSG. lSI ROW BELOW
PREVIOUS ONE
LENGTH OF STRING IS 4 CHARS
POINT TO ASCII ERROR CODE
GET CURRENT PAGE NUMBER
NORMAL ATTRI BUTES
WRITE STRING FOR INT 10
DISPLAY ERROR MESSAGE

DISPLAY ASCI I MESSAGE I F NECESSARY
0032
0033
0034
0036

07
5B
OB DB
74 24

EM30:
POP
OR
JE

POP

ES
BX
BX, BX
EMSG_RET

GET ASCI I ERROR MSG POINTER
ASCI I ERROR MESSAGE

SCAN TO GET LENGTH
0038
003A
OD3B
003F

8B EB
43
26: 80 3F 04
75 F9

MOV
EM35:
CMP
JNE

0041
0043
0045
004A

2B DO
EM40:
8B CB
MOV
2E: 3A 94 0078 R
MOV
80 C2 OC
ADD

BP, BX
INC

SUB

;
BX
;
BYTE PTR ES: [BX],04H
EM35

BX,BP
CX, BX
DL,DIS_POS[SI]
OL,12

POINT TO MESSAGE FOR INT 10
INC POINTER
; END OF MESSAGE?
I F NOT END LOOK AT NEXT BYTE
LENGTH OF STRING FOR INT 10
GET COLUMN FOR DISPLAY
MOVE OVER 9 COLUMNS

ROM BIOS 2-223

004D
OD50
OD52
OD55
OD55
OD57
OD5A
OD5C
OD5C
OD5D
OD5E
OD5F

83 FF 02
75 03
80 EA 04
B3 07
B8 1300
CD 10
07
IF
C3

CMP
JNE
SUB
EM45:
MOV
MOV
INT

DI,2
EM45
DL,4

FEATURE ICON?
NO THEN DONT COLUMN CORRECT
MOVE BACK 4 COLUMNS

BL,07H
AX,01300H
10H

SET NORMAL ATTRI Bun
WRITE STRING FOR INT 10
DS I PLAY ERROR MESSAGE

EMSG_RET:
POP
ES
POP
DS
RET
E_MSG
ENDP

2-224 ROM BIOS

RESTORE SEGMENT REGS
RETURN TO CALLER

Icon Display Routine (ICON_PR)
******************************************************************
ROUTINE-NAME:

lCON_PR

FUNCTION: THIS ROUTINE DISPLAYS ICONS ON THE SCREEN
ENTRY CONDITIONS:
PURPOSE OF ENTRY: TO DISPLAY AN ICON
INPUT CONDITIONS: DH = ROW NUMBER TO DISPALY ICON
DL = COLUMN NUMBER TO DISPLAY ICON
ES: BP POINTS TO THE DATA TO DISPLAY
ICON FORMAT: DB
DB

ROW OFFSET,cOLUMN OFFSET,WIDTH,DEPTH
ASCI I DATA BYTES FOR I CON AND CONTROL CODES

CONTROL CODES:
01 XX YY

REPEAT CHARACTER
XX= NUMBER OF TIMES TO REPEAT CHARACTER
YY= CHARACTER TO REPEAT

02 XX YY
03
04 XX YY

zz

DISPLAY CHARACTER WITH ATTRI BUTE
XX= ATTRIBUTE AS DEFINED BY PC
YY= CHARACTER
NEXT ROW
NEXT BYTE WILL BE DISPLAYED ONE ROW DOWN
.... REPEAT THE FOLLOWING ROW
XX= NUMBER OF TIMES TO REPEAT THE ROW
YY ZZ ... = DATA FOR THE ROW TO REPEAT

05 XX YY STR ..

REPEAT STRING FUNCTION
WHERE
XX = THE NO. OF TIMES TO REPEAT STRING
YY = THE LENGTH OF THE STRING
STR .. = THE STRING TO REPEAT
THE STRING MUST NOT CONTAIN ANY REPEAT CHARACTER
CONTROL CODES
06 XX YY ZZ STR .. : REPEAT
WHERE
XX = THE NUMBER OF
YY = THE LENGTH OF
ZZ = THE ATTRI BUTE
STR •. = THE STRING

STRING WITH COMMON ATTRIBUTE
TIMES TO REPEAT THE STRING
THE STRING
FOR THE ENTIRE STRING
TO REPEAT

RESTRICTIONS: CONTROL CODE TO REPEAT A CHARACTER MUST NOT REPEAT
THE CHARACTER PAST THE RIGHT MARGIN OF THE ICON.
THE CONTROL CODE TO REPEAT A ROW MUST NOT REPEAT
THE ROW PAST THE BOTTOM OF THE ICON.
REPEAT CODES CANNtlT BE IMBEDDED IN STRINGS TO BE
REPEATED.
EXIT CONDITIONS:
NORMAL EX IT COND IT IONS:
ERROR EXIT CONDITIONS:
REGISTERS MODIFIED: NONE
INTERNALLY REFERENCED ROUTINES:

NONE

EXTERNALL Y REFERENCED ROUTI NES:

******************************************************************
0000
0001
0002

00
00
00

lCON_PL
STR_ROW
STR_COL
MALROW

STRUC
DB
DB
DB

; defi nes resrvd area on stack

ROM BIOS 2-225

0003
0004
0005
0006

00
00
00

MALCOL
REPILNO
RSTILNO
I CON_PL

DB
DB
DB
ENDS

ASSUME CS: ROMCOOE
ASSUME OS: NOTH I NG
ASSUME ES: NOTH ING
005F

ICON_PR PROC
NEAR
SAVE
PUSH
AX
BX
PUSH
PUSH
CX
OX
PUSH
BP
PUSH
SI
PUSH
01
PUSH
ES
PUSH
OS
PUSH
SUB
SP ,6
MOV
SI,SP
PUSH
SS
POP
OS
MOV
BH,O
AH,Ol
MOV
CH,20H
MOV
INT
10H
MOV
BL,07H
CH,O
MOV
MOV
OI,CX
01,1
SHL
MOV
AH, ES: [BP]
ADD
OH,AH
[S I] . STR_ROW, OH
MOV
INC
BP
MOV
AL, ES: [BP]
ADD
OL,AL
MOV
lSI] .STR_COL,OL
INC
BP
MOV
AL,ES:[BP]
ADD
AL,OL
MOV
[SIj.MALCOL,AL
INC
BP
MOV
AH, ES: [BP]
ADD
AH,OH
MOV
lSI] .MALROW,AH
MOV
[51] .REPR_NO,O
MOV
lSI] .RSTR_NO,O

005F
0060
0061
0062
0063
0064
0065
0066
0067
0068
0066
0060
006E
006F
OOll
0073
0075
0077
0079
007B
0070
007F
0083
0085
0087
0088
008C
008E
0091
0092
0096
0098
009B
009C
OOAO
00A2
00A5
00A9

50
53
51
52
55
56
57
06
IE
83 EC 06
86 F4
16
IF
B7 00
B4 01
B5 20
CO 10
B3 07
B5 00
8B F9
01 E7
26: 8A 66 00
02 F4
88 34
45
26: 8A 46 00
02 DO
88 54 01
45
26: 8A 46 00
02 C2
88 44 03
45
26: 8A 66 00
02 E6
88 64 02
C6 44 04 00
C6 44 05 00

OOAO
OOAE
00B1
00B4
00B6
00B9
OOBB
OOBE
OOCO

45
B9
3A
7C
8A
FE
3A
7C
E9

I PR20:
MOV
CMP
JL
MOV
INC
CMP
JL
JMP

INC

0001
54 03
1A
54 01
C6
74 02
03
OEB9 R

BP
CX,l
OL, lSI] . MALCOL
I PR23
OL, lSI] .STRJOL
OH
OH, lSI] .MALROW
IPR22
IPILRET

POINT TO NEXT LOCATION
LENGTH OF STRING IS 1
I S PO I NTER PAST MAX COLUMN
JUMP I F NOT
POINT TO 1ST POS OF NEXT ROW
POINT TO NEXT ROW
ARE WE PAST THE LAST ROW?

00C3
00C6
OOCA
OOCC
OOCE

FE
80
7E
8B
EB

4C 04
7C 04 00
04
EF
DO

IPR22 :
CMP
JLE
MOV
JMP

DEC

lSI] .REPR_NO
lSI] .REPR_NO,O
IPR23
BP,OI
IPR20

DEC NO. OF ROWS TO REPEAT

0000
0004
0006
0008
0008
OOOA

26: 8A 46 00
3C 07
72 12

IPR23 :
CMP
JB
IPR30:
MOV
INT

MOV

AL, ES: [BP]
AL,7
I PR_CNT

GET NEXT BYTE OF DATA

AH,02
10H

POSITON CURSOR

MAKE ROOM FOR TEMP PARMS
PO I NT SI TO TEMPORARY AREA
SET OS TO STACK SEGMENT
SET CURRENT DISPLAY PAGE
TURN OFF CURSOR
SET NORMAL ATTRIBUTES
INIT CH TO 0
MOVE I CON NO. TO 01
MULTIPLY BY 2
MOVE ROW OFFSET OF ICON TO AH
ADD TO OFFSET SENT BY CALLER
SAVE STARTING ROW
POINT TO NEXT LOCATION
MOVE COLUMN OFFSET OF ICON TO AL
ADD TO OFFSET SENT BY CALLER
SAVE STARTING COLUMN
POINT TO NEXT LOCATION
MOVE WIDTH OF ICON TO AL
GET MAX. TOTAL COLUMN NUMBER
SAVE MAXIMUM COLUMN NO.
POINT TO NEXT LOCATION
MOVE DEPTH OF ICON TO AL
ADD TO OFFSET SENT BY CALLER
SAVE MAXIMUM ROW NUMBER
CLEAR LINE REPEAT COUNTER

WRITE STRING LOOP

B4 02
CD 10

2-226 ROM BIOS

RETURN TO CALLER

JUMP iF NO REPEAT ROWS
POINT BEG OF ROW TO REPEAT
CONTINUE

JUMP I F CONTROL CHARACTER

ODDC
ODDE

B3 07
26: 8A 46 00

ODE2
ODE4
ODE6
ODE8

B4
CD
FE
EB

09
10
C2
C3

3C
74
3C
74
3C
74
3C
74
3C
74
E9

01
13
02
2F
03
33
04
47
05
50
OE90 R

MOV
MOV
IPR40:
INT
INC
JMP

BL,07H
AL, ES: [BP]
MOV

AH,09
10H
DL
I PR20

NORMAL ATTRI BUTES
WRITE AT CURSOR
DISPLAY CHARACTER
POINT TO THE NEXT COLUMN
LOOP UNTI L LAST CHARACTER

ODEA
ODEA
ODEC
ODEE
ODFO
ODF2
ODF4
ODF6
ODF8
ODFA
ODFC
ODFE
OEOI
OEOI
OE02
OE06
OE07
OEOB
OEOD

45
26: 8A 4E 00
45
26: 8A 46 00
3C 05
72 12

IPLCNT:
CMP
JE
CMP
JE
CMP
JE
CMP
JE
CMP
JE
JMP
IPLREP:
INC
MOV
INC
MOV
CMP
JB

OEOF
DEll
OE13
OEl7
OEl9
OElB
OElD
OElF

B4 02
CD 10
26: 8A 46 00
B4 09
CD 10
02 01
B3 07
EB 8C

REPIO:
INT
MOV
MOV
INT
ADD
MOV
JMP

OE21
OE21
OE22
OE26
OE27

45
26: 8A 5E 00
45
EB E6

IPR_ATT:
INC
MOV
INC
JMP

BP
BL, ES: [BP]
BP
REPI0

POINT TO NEXT BYTE
STORE ATTRIBUTE IN BL

OE29
OE29
OE2B
OE2E
OE31
OE35
OE37

FE
8A
FE
80
7C
8B

IPR_NXRW:
INC
MOV
DEC
CMP
JL
MOV

DH
DL, [51] .STR_COL
[SI]. REPR_NO
[SI]. REPR_NO,O
NXlO
BP,DI

INCREMEMT ROW POINTER
START AT RIGHT MARGIN
DEC NO. OF ROWS TO REPEAT

OE39
OE3C
OE3E

3A 74 02
70 7B
E9 ODAD R

NXlO:
JGE
JMP

DH, [SI] . MAX-ROW ; ARE WE PAST THE LAST ROW?
IPR_RET
RETURN TO CALLER
I PR20
CONTINUE

OE41
OE41
OE42
OE46
OE49
OE4B

45
26: 8A 46 00
88 44 04
8B FD
E9 ODAD R

IPR_REPR:
INC
MOV
MOV
MOV
JMP

OE4E
OE4E
OE4F
OE53
OE56
OE57
OE5B
OE5C
OE5E
OE5E
OE5F

C6
54 01
4C 04
7C 04 00
02
EF

45
26: 8A 46 00
88 44 05
45
26: 8A 4E 00
45
8B FD
51
26: 8A 46 00

AL,1
I PR_REP
AL,2
IPR_ATT
AL,3
IPR_NXRW
AL,4
I PR_REPR
AL,5
I PR_REPS
I PR_RSTA
BP
CL,ES: [BP]
BP
AL,ES: [BP]
AL,5

REPEAT CHARACTER FUNCTION
ATTRIBUTE OTHER THAN NORMAL
NEXT ROW
REPEAT ROW FUNCTION
REPEAT STRING
REPEAT STRING WITH ATTRIBUTE
INC POINTER
GET MODIFIER FOR REPITITIONS
INC POINTER
GET CHARACTER TO DISPLAY
CHECK FOR ATTRIBUTE FUNCTION

IPR~TT

MOV

CMP

AH,02
10H
AL,ES: [BP]
AH,09H
10H
DL, CL
BL,07H
IPR20

BP
AL, ES: [BP]
[SI]. REPR_NO,AL
01, BP
IPR20

IPR_REPS:
BP
INC
MOV
AL, ES: [BP]
[SI] .RSTR_NO,AL
MOV
BP
INC
MOV
CL,ES: [BP]
INC
BP
MOV
01, BP
REPS09 :
PUSH
CX
REPSIO: MOV
AL, ES: [BP]

PSN CURSOR MODE FOR I NT 10
POSITION CURSOR
WRITE CHAR/ATT AT CURSOR
DISPLAY
ADD REPITIONS TO POSTION PTR
RETURN ATTRI BUTE TO NORMAL
CONTINUE

CONTINUE

JUMP I F NO REPEAT ROWS
POINT BEG OF ROW TO REPEAT

INC POINTER
SAVE NO. TO REPEAT ROW
SAVE START OF ROW
CONTINUE
INC POINTER
GET NO. TO REPEAT ROW
SAVE NO. TO REPEAT ROW
INC POINTER
GET LENGTH OF STRING
INC POINTER
SAVE START OF STRING
SAVE LENGTH OF STRING
GET CHARCTER

ROM BIOS 2-227

OE63
OE65

3C 02
77 06

OE67
OE68
OE6C
OE6D
OE6F
OEll
OE72
OE75
OE78
OE7A
OE7B
OE7D
OE7F
OE80
OE82
OE83
OE86
OE88
OE8A

45
26: 8A 5E 00
45
B4 02
CD 10
51
B9 0001
B8 1300
CD 10
59
FE C2
B3 07
45
E2 DD
59
FE 4C 05
74 04
8B EF
EB 02

REPS20: INC
BP
MOV
BL,ES: [BP]
INC
BP
REPS30 : MOV
AH,2
INT
10H
PUSH
CX
MOV
CX,l
MOV
AX,1300H
INT
10H
POP
CX
INC
DL
MOV
BL ,07
INC
BP
LOOP
REPS10
POP
CX
DEC
[SI]. RSTILNO
JZ
REPS50
MOV
BP ,DI
JMP
REPS09

INC POINTER
MOVE ATTRI BUTE TO BL
INCREMENT BP

OE8C
OE8D
OE90
OE90
OE91
OE95
OE98
OE99
OE9D
OE9E
OEA2
OEA3
OEA5
OEA7
OEAA
OEAC
OEAE
OEB1
OEB3
OEB3
OEB5
OEB6

4D
E9 ODAD R

REPS50 : DEC
BP
JMP
IPR20
I PR_RSTA:
INC
BP
MOV
AL, ES: [BP]
MOV
[SI] . RSTR_NO,AL
INC
BP
MOV
CL,ES: [BP]
INC
BP
MOV
BL,ES: [BP]
INC
BP
MOV
DI, BP
RSTA10: MOV
BP,DI
MOV
AX,01300H
INT
lOH
ADD
DL, CL
DEC
[SI] . RSTR_NO
JNZ
RSTA10
RSTA_RET:
BP, CX
ADD
BP
DEC
JMP
IPR20

DECREMENT POINTER
CONTINUE

45
26: 8A 46 00
88 44 05
45
26: 8A 4E 00
45
26 : 8A 5E 00
45
8B FD
8B EF
B8 1300
CD 10
02 D1
FE 4C 05
75 F2
03 E9
4D
E9 ODAD R

OEB9
OEB9

83 C4 06

OEBC
OEBD
OEBE
OEBF
OECO
OECl
OEC2
OEC3
OEC4
OEC5

1F
07
5F
5E
5D
5A
59
5B
58
C3

OEC6

CMP
JA

I PR_RET:
ADO
RESTORE
POP
POP
POP
POP
POP
POP
POP
POP
POP
RET

AL ,02
REPS30

SP,6

SET CURSOR POSITION
SAVE LOOP COUNT
LENGTH OF STRING IS 1 BYTE
WRITE STRING FOR INTlO
WRITE CHARACTER/ATTRIBUTE
RESTORE LOOP COUNT
I NC COLUMN PO INTER
SET ATTRI BUTE TO NORMAL
INC DATA POINTER
WRITE CHAR TIL END OF STRING
RESTORE LENGTH OF STRING
DEC NO. TO REPEAT STRING
CONT IF NO MORE REPITITIONS
POINT TO BEGINNING OF STRING
REPEAT STRING

INC POINTER
GET NO. TO REPEAT ROW
SAVE
INC POINTER
GET LENGTH OF STRING
INC POINTER
GET ATTRI BUTE
INC POINTER
SAVE START OF ROW
RESET POINTER
WRITE STRING FOR INT 10
DISPLAY STRING
ADD TO COLUMN PO INTER
DEC NO. TO REPEAT STRING
PRINT STRING AGAIN
PO I NT TO POSTI ON IN DATA
CONTINUE
DE-ALLOCATE STACK SPACE

OS
ES
01
SI
BP
OX
CX
BX
AX

I CON_PR ENDP

2-228 ROM BIOS

CONTROL CODE
JUMP I F NOT

RETURN TO CALLER

Diskette Interrupt Entry (DSKT_INT)
; *************************************
DISKETTE INTERRUPT ENTRY ADDRESS

; *************************************
;ORG

OF57
= OF57
OF57 E9 0000

OEF57H
ORG
00F57H
DSKLINT
EQU
JMP
DSKLI NTE

Diskette Drive Parameters
. *****************************************************************
~ DISKETTE DRIVE TYPE PARAMETERS (FOR READ DRIVE PARAMETERS CALL)
; *****************************************************************
TWO SIDED 5 1/4" DRIVE PARMS
OF5A
OF5A
OF5C
OF5E
OF60

PARMS_TPI48
LABEL
BYTE
OW
OFOOOH
OW
OFFSET DSKLBASE
OW
2709H
OW
0100H

FOOO
OFC7 R
2709
0100

POINTER TO DRIVE PARMS (SEG)
POINTER TO DRIVE PARMS (OFF)
MAX TRK #/S IDE,SECTOR/TRACK
MAX HEAD #, FILL

TWO SIDED 3 1/2" DRIVE PARMS
OF62
OF62
OF64
OF66
OF68

PARMS_TPIl35
LABEL
BYTE
OW
OFOOOH
OW
OFFSET DSKLBASE
OW
4F09H
OW
0100H

FOOO
OFC7 R
4F09
0100

POINTER TO DRIVE PARMS (SEG)
POINTER TO DRIVE PARMS (OFF)
MAX TRK #/SIDE,SECTOR/TRACK
MAX HEAD #, FI LL

; *********************************
; DISKETTE PARAMETER TABLE

; *********************************
;ORG

OFCl

OEFC7H
ORG

00FC7H

Diskette Timing Parameters
(DSKT_BASE)
DSKLBASE
THIS IS THE SET OF PARAMETERS REQUIRED FOR
DISKETTE OPERATION. THEY ARE POINTED AT BY THE
DATA VARIABLE DISLPOINTER. TO MODIFY THE PARAMETERS,
BUILD ANOTHER PARAMETER BLOCK AND POINT AT IT

**************************************************
OFC7
OFC7
OFC8
OFC9
OFCA
OFCB
OFCC

DO
02
25
02
09
2A

DSKLBASE
DB
DB
DB
DB
DB
DB

LABEL
11010000B

2
MOTOR_WAIT

2
9
02AH

BYTE
SRT=D, HD UNLD=OO - 1ST
HD LOAD=I, MODE=DMA - 2ND
WAIT AFTER OPN TIL MOTOR OFF
512 BYTES/SECTOR
EDT ( LAST SECTOR ON TRACK)
GAP LENGTH

ROM BIOS 2-229

OFCO
OFCE
OFCF
OFOO
OFDI

FF
50
F6
OF
04

DB
DB
DB
DB
DB

OFFH
050H
OF6H
15
4

DTL
GAP LENGTH FOR FORMAT
FILL BYTE FOR FORMAT
HEAD SETTLE TIME (MSEC)
MOTOR START TIME (1/8 SEC)

Printer I/O Entry (PRINTER_IO)
*********************************
PRINTER_IO ENTRY POINT

OEF02H
ORG
00FD2H
PRINTER_IO
EQU
JMP
PRLIO

ORG
OFD2
= OF02
OFD2 E9 0000 E

Video Parameters
***************************************

VIDEO DISPLAY TYPE PARAMETER TABLES

***************************************
WORD
WORD
WORD
WORD
WORD
WORD
WORD

1
2
3
4
5
6
7

IBM DISPLAY NUMBER

# VERTICAL PELS / MICROMETER
# HORIZONTAL PELS / MICROMETER
TOTAL # OF VERTICAL PELS
TOTAL # OF HORIZONTAL PELS
HEIGHT OF PEL IN MICROMETER (VERTICAL DIRECTION)
WIDTH OF PEL IN MICROMETER (HORIZONTAL DIRECTION)

OFD5
OFD5

MONO_TBL
LABEL
WORD
5151 0000 0000
OW
5151H,0,0,0,0,0,0
0000 0000 0000 0000

OFE3
OFE3

CGA_TBL
LABEL
WORD
51530498 OA15
OW
5153H,498H,OAl5H,OC8H,280H,352H,184H
00C8 0280 0352 0184

OFF1
OFF1

LCO_CGA_TBL
LABEL
WORD
5140 08El 0987
OW
5140H,8ElH,987H,OC8H,280H,172H,172H ; TABLE FOR LCD
00C8 0280 0172 0172
AS A CGA DISPLAY
LCD_MONO_TBL
LABEL
WORD
5140 0000 0000
OW
5140H,0,0,0,0,0,0
TABLE FOR LCD AS A MONO
0000 0000 0000 0000
DISPLAY

OFFF
OFFF

TABLE FOR MONO DISPLAY

RGB DISPLAY

***************************************
VIDEO_IO

SUBROUTINE ADDRESS TABLE

***************************************

ORG
1045
1045
1045
1047
1049
104B
1040
104F
1051
1053
1055
1057

0000
0000
0000
0000
0000
0000
0000
0000
0000
0000

OF045H
ORG
01045H
ASSUME CS: ROMCODE, OS: DATA, ES: VIDEO_RAM
M1 LABEL
; TBL OF RTNS WITHIN VIDEO I/O
WORD
OW
OFFSET SET~OOE
OW
OFFSET SELCTYPE
OW
OFFSET SELCPOS
OW
OFFSET READ_CURSOR
OW
OFFSET REAO_LPEN
OW
OFFS ET ACLDISP_PAGE
OW
OFFS ET SCROLL_UP
OW
OFFSET SCROLL_DOWN
OW
OFFSET REAO_ACCURRENT
OW
OFFSET WRITE_ACCURRENT

2-230 ROM BIOS

1059 0000
105B 0000
1050 0000
105F 0000
1061 0000
1063 0000
= 0020

OW
OW
OW
OW
OW
OW
MIL

OFFSET WRITE_CCURRENT
OFFSET SELCOLOR
OFFSET WRITE_DOT
OFFSET READ_DOT
OFFSET WRITE_TTY
OFFSET VIDEO_STATE
$-M1
EQU

Video I/O Entry (VIDEO_IO)
. ***************************************
:

VI DEO_I 0 ROUT! NE ENTRY PO I NT

; ** **** ******* * ** **** ** * ** ** ************
;ORG

OF065H
ORG
01065H
VIDEO_IO
EQU
JMP
VIDEO_IO_1

1065
1065
1065 E9 0000

=

Video Parameters
; VIDEO PARMAMETER TABLE

; ***************************************
;ORG

OFOMH
ORG
010MH
VIDEO_PARMS
LABEL

10M
10M

BYTE

INILTABLE
10M
lOAB
lOBO
= 0010
10B4

38 28 20 OA 1F 06
19
1C 02 07 06 07
00 00 00 00

DB
DB
DB
M4 EQU

38H ,28H, 2DH ,OAH, 1FH, 6, 19H

71 50 5A OA IF 06
19
1C 02 07 06 07
00 00 00 00

DB

7lH, 50H, 5AH, OAH, 1FH, 6, 19H

DB
DB

1CH,2,7,6,7
0,0,0,0

38 28 20 OA 7 F 06
64
70 02 01 06 07
00 00 00 00

DB

38H, 28H, 2DH, OAH, 7 FH, 6, 64H

DB
DB

70H,2,1,6,7
0,0,0,0

61 50 52 OF 19 06
19
19 02 00 08 OC
00 00 00 00

DB

61H, 50H, 52H ,OFH, 19H, 6, 19H

10DB
10EO

08
DB

19H, 2, ODH,OBH ,OCH
0,0,0,0

10E4
10E4
10E6
10E8
10EA

0800
1000
4000
4000

10BB
lOCO
10C4
10CB
1000
1004

M5 LABEL
OW
OW
OW
OW

SET UP FOR 40X25

1CH,2,7,6,7
0,0,0,0
$- VIDEO_PARMS

WORD
2048
4096
16384
16384

SET UP FOR 80X25

SET UP FOR GRAPH I CS

SET UP FOR 80X25 B&W

TABLE OF REGEN LENGTHS
40X25
80X25
GRAPH I CS

COLUMNS
10EC
10EC

28 28 50 50 28 28
50 50

M6 LABEL
DB

BYTE
40,40,80,80,40,40,80,80

ROM BIOS 2-231

LREG_TAB
10F4
10F4

2C 28 20 29 2A 2E
IE 29

M7 LABEL
DB

BYTE
; TABLE OF MODE SETS
2CH,28H,2DH,29H,2AH,2EH,IEH,29H

Memory Interrupt Hex 12
(MEMORY_SIZE_DET)
; - - - I NT 12 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -MEMORLS I ZCDET
THIS ROUTINE DETERMINES THE AMOUNT OF MEMORY IN THE SYSTEM
AS REPRESENTED BY MEMORLSIZE WORD. THE MEMORLSIZE WORD IS SET
BY POST WHEN IT HAS DETERMINED HOW MUCH MEMORY IS USABLE. IT IS
SET IN lK INCREMENTS ON 8K BYTE BOUNDRIES
INPUT
NO REGISTERS
OUTPUT
(AX) = NUMBER OF CONTIGUOUS lK BLOCKS OF MEMORY
AS DETERMINED BY THE POWER ON SELF TEST ROUTINE
;
1841
1841
1841
1842
1845
1848
1849
184A

IE
E8 085C R
Al 0013 R
IF
CF

ORG

ASSUME OS: DATA
OF841H
ORG
01841H
MEMORLSIZE_DET PROC
FAR
PUSH
OS
CALL
DDS
MOV
AX,MEMORLSlZE
POP
OS
IRET
MEMORLSIZE_DET ENDP

SAVE SEGMENT
GET VALUE
RECOVER SEGMENT
RETURN TO CALLER

Equipment Interrupt Hex 11
(EQUIPMENT)
;--- INT 11 ----------------------------------------------------EQUIPMENT DETERMINATION
THIS ROUTINE ATEMPTS TO DETERMINE WHAT OPTIONAL
DEVICES ARE ATTACHED TO THE SYSTEM.
INPUT
NO REGISTERS
THE EQUIPJLAG VARIABLE IS SET DURING THE POWER ON
DIAGNOSTICS USING THE FOLLOWING HARDWARE ASSUMPTIONS:
PORT 3FA = INTERRUPT ID REGISTER OF 8250
BITS 7-3 ARE ALWAYS 0
PORT 378 = OUTPUT PORT OF PRINTER -- 8255 PORT THAT
CAN BE READ AS WELL AS WRITTEN
OUTPUT
(AX) IS SET, BIT SIGNIFICANT, TO INDICATE ATTACHED 1/0
BIT 15,14 = NUMBER OF PRINTERS ATTACHED
BIT 13 = INTERNAL MODEM INSTALLED
BIT 12 = GAME 1/0 ATTACHED
BIT 11,10,9 = NUMBER OF SERIAL COMM DEVICES ATTACHED
BIT 8 UNUSED
BIT 7,6 = NUMBER OF DISKETTE DRIVES
00=1, 01=2
BIT 5,4 = INITIAL VIDEO MODE
00
UNUS ED
01 - 40X25 BW USING COLOR CARD

2-232 ROM BIOS

10 - 80X25 BW USING COLOR CARD
11 - 80X25 BW US I NG BW CARD
BIT 3,2,1 = RESERVED
BIT 0 = IPL FROM DISKETTE -- ALWAYS A 1 (SYSTEM DISKETTE
INSTALLED)
NO OTHER REGISTERS AFFECTED
ORG
1840
1840
1840
184E
1851
1854
1855
1856

IE
E8 085C
Al 0010
IF
CF

OF840H
ORG
EQUIPMENT
PUSH
CALL
MOV
POP
IRET
EQUIPMENT

01840H
FAR
PROC
05
ODS
AX,EQUIPJLAG
OS

SAVE SEGMENT REGISTER
GET THE CURRENT SETTINGS
RECOVER SEGMENT
RETURN TO CALLER

ENOP

Cassette I/O Entry (No BIOS Support)
. *************************************************
~CASSETTE I/O ENTRY POINT (NO 8105 SUPPORT)
. *************************************************
;ORG
1859
= 1859

1859

E9 0000

OF859H
ORG
01859H
CASSETTE_IO
EQU
JMP
SYS_SERVICES

Character Generator Graphics 0-127
(CHAR_GEN_LO)
SUBTTL

;
;
;

CHARACTER GENERATOR GRAPHICS FOR 320X200 AND 640X200 GRAPHICS
AND DEFAULT LCD CHARACTER GENERATOR
FOR CHARACTERS OOH - 7 FH

- - - - ------ - --- - - - - - - - - - - ---- - --- - - - --- - ------- -- ----------- - ------ --

;ORG
1A6E
1A6E
1A6E
1A76
1A7E
1A86
1A8E
1A96
1A9E
1AA6
1AAE

00
00
3C
5A
3C
66
36
08
08
08
1C
08
08
08
00
00
FF

CHARACTER GENERATOR LOW

-- - ----- - - - - - - - --- - ---- -- --- - - - - - ------------- - ----- - ---- - - - - - --- ---

OFA6EH
ORG

01A6EH

CHAR_GEN_LO
LABEL
BYTE
00 00 00 00 00
DB
OOOH,OOOH,OOOH,OOOH,OOOH,OOOH,OOOH,OOOH
00
42 A5 A5 81 BO
DB
03CH, 042H, OA5H, OA5H, 081H, OBOH, 05AH, 03CH
3C
7E DB DB FF C3
DB
03CH, 07EH, OOBH, OOBH, OFFH, OC3H, 066H, 03CH
3C
7F 7F 7F 3E 1C
036H, 07 FH, 07 FH, 07 FH, 03EH, 01CH, 008H, OOOH
DB
00
1C 3E 7F 3E 1C
008H, 01CH, 03 EH, 07 FH, 03EH, 01CH, 008H, OOOH
DB
00
3E 1C 7F 7F 36
01CH, 03EH, 01CH, 07 FH, 07 FH, 036H, 008H, 01CH
DB
1C
1C 3E 7F 7F 36
DB
008H, 01CH, 03EH, 07 FH, 07 FH, 036H, 008H, OICH
1C
00 18 3C 3C 18
DB
OOOH, OOOH, 018H, 03CH, 03CH, 018H, OOOH, OOOH
00
FF E7 C3 C3 E7
DB
OFFH, OFFH, OE7H, OC3H, OC3H, OE7H, OFFH, OFFH

0_00
0_01
0_02
0_03
0_04
0_05
0_06
0_07
0_08

ROM BIOS 2-233

lAB6
lABE
lAC6
lACE
lAD6
lADE
lAE6
lAEE
lAF6
lAFE
lB06
lBOE
lB16
lB1E
lB26
lB2E
lB36
lB3E
lB46
lB4E
lB56
lB5E
lB66
lB6E
lB76
lB7E
lB86
lB8E
lB96
189E
lBA6
lBAE
IBB6
lBBE
lBC6
lBCE
IBD6

FF FF
00 00 3C 66 66 3C
00 00
FF FF C3 99 99 C3
FF FF
07 03 3E 66 66 66
3C 00
3C 66 66 66 3C 18
3C 18
08 DC 0 E OA OA 08
38 30
18 16 19 17 71 61
07 06
48 6B 3E E4 27 7C
D6 12
40 70 7C 7F 7C 70
40 00
01 07 IF 7F IF 07
01 00
18 3C 7E 18 18 7E
3C 18
6C 6C 6C 6C 6C 00
6C 00
3 F 6A 6A 3A OA OA
lA 00
78 EC 70 D8 6C 38
DC 78
00 00 00 00 7E 7E
7E 00
183C7E18 7E 3C
18 FF
18 3C 7E 5A 18 18
18 00
18 18 18 5A 7E 3C
18 00
00 DC 06 7 F 7F 06
OC 00
00 18 30 7F 7F 30
18 00
00 00 60 60 7F 7F
00 00
00 14 36 7F 7F 36
14 00
08 08 lC lC 3E 3E
7F 00
7F 3E 3E lC lC 08
08 00
00 00 00 00 00 00
00 00
30 30 30 30 30 00
30 00
36 36 14 00 00 00
00 00
OA OA 3F 14 7E 28
28 00
08 3E 68 3E DB 7E
08 00
01 3F 52 6C IB 35
76 00
lC 36 lC 3B 6E 66
38 00
18 18 30 00 00 00
00 00
06 DC 18 18 18 OC
06 00
30 18 DC DC OC 18
30 00
00 36 lC7F1C36
00 00
00 18 18 7E 18 18
00 00
00 00 00 00 00 18
18 30
00 00 00 7E 00 00

DB

OOOH, OOOH, 03CH, 066H, 066H, 03CH, OOOH, OOOH

D_09

DB

OFFH, OFFH, OC3H, 099H, 099H, OC3H, OFFH, OFFH

o_OA

DB

007H, 003H, 03EH, 066H ,066H, 066H, 03CH, OOOH

o_OB

DB

03CH, 066H, 066H, 066H ,03CH, 018H, 03CH ,018H

D_OC

DB

008H, OOCH, OOEH, OOAH, OOAH, 008H, 038H, 030H

D_Oo

DB

018H, 016H, 019H, 017H, 071H, 061H, 007H, 006H

D_OE

DB

048H, 06BH, 03EH, OE4H, 027H, 07CH, 006H, 012H

D_OF

DB

040H, 070H, 07CH, 07 FH, 07CH, 070H, 040H, OOOH

0_10

DB

001H, 007H, 01 FH, 07 FH, 0IFH, 007H, 00 lH, OOOH

D_11

DB

018H, 03CH, 07 EH, 018H, 018H, 07 EH, 03CH, 018H

D_12

DB

06CH, 06CH. 06CH, 06CH, 06CH, OOOH, 06CH, OOOH

D_13

DB

03 FH, 06AH, 06AH, 03AH, OOAH, OOAH, 0IAH, OOOH

0_14

DB

078H ,OECH, 070H, OD8H, 06CH, 038H, ODCH, 078H

0_15

DB

OOOH, OOOH, OOOH, OOOH, 07EH, 07 EH, 07EH ,OOOH

0_16

DB

018H, 03CH, 07 EH, 018H, 07EH, 03CH, 018H, OFFH

D_17

DB

018H, 03CH, 07EH, 05AH, 018H, 018H, 018H, OOOH

D_18

DB

018H, 018H, 018H, 05AH, 07 EH, 03CH, 018H, OOOH

0_19

DB

OOOH, OOCH, 006H, 07 FH, 07 FH, 006H, OOCH, OOOH

D_1A

DB

OOOH, 018H, 030H, 07 FH, 07 FH ,030H, 0 18H, OOOH

o_IB

DB

OOOH, OOOH, 060H, 060H, 07 FH, 07 FH, OOOH, OOOH

D_1C

DB

OOOH, 014H, 036H, 07 FH, 07 FH, 036H, 014H, OOOH

o_ID

DB

008H, 008H, 01 CH, 0ICH, 03EH, 03EH, 07 FH, OOOH

o_IE

DB

07 FH, 03 EH, 03 EH, 0ICH, 0ICH, 008H, 008H, OOOH

D_1F

DB

OOOH, OOOH, OOOH, OOOH ,OOOH, OOOH ,OOOH ,OOOH

SP D_20

DB

030H, 030H, 030H, 030H, 030H, OOOH, 030H, OOOH

D_21

DB

036H, 036H, 014H, OOOH, OOOH, OOOH, OOOH, OOOH

" D_22

DB

OOAH, OOAH, 03 FH, 014H, 07 EH, 028H, 028H, OOOH

# D_23

DB

OOSH, 03EH, 068H, 03EH, OOBH, 07 EH, OOSH, OOOH

$ D_24

DB

001H, 03 FH, 052H, 06CH, 01 BH, 035H, 076H, OOOH

% D_25

DB

01 CH, 036H, 0ICH, 03BH, 06EH, 066H, 03BH, OOOH

D_26

DB

018H, 018H, 030H, OOOH, OOOH, OOOH, OOOH, OOOH

D_27

DB

006H, OOCH, 018H, 0 18H, 018H, OOCH, 006H, OOOH

D_28

DB

030H, 018H, OOCH, OOCH ,OOCH, 018H, 030H, OOOH

DB

OOOH, 036H, 0ICH, 07 FH, 0ICH, 036H, OOOH, OOOH

*

DB

OOOH, 018H, 018H, 07EH, 018H, 018H, OOOH, OOOH

+ D_2B

DB

OOOH, OOOH, OOOH, OOOH, OOOH, 018H, 018H, 030H

D_2C

DB

OOOH, OOOH, OOOH, 07 EH, OOOH, OOOH, OOOH, OOOH

- D_20

2-234 ROM BIOS

D_29
D_2A

IBDE
IBE6
IBEE
IBF6
IBFE
lC06
lCOE
lC16
lCIE
lC26
lC2E
lC36
lC3E
lC46
lC4E
lC56
lC5E
lC66
lC6E
lC76
lC7E
lCS6
lC8E
lC96
lC9E
lCA6
ICAE
lCB6
lCBE
lCC6
lCCE
lC06
lCDE
lCE6
lCEE
lCF6
lCFE

00
00
18
03
40
IS
18
IS
3C
3C
7E
3C
3C
OC
IE
7E
3C
lC
3C
7E
38
3C
3C
3C
38
00
18
00
18
06
06
00
00
30
30
3C
18
3E
3E
lC
63
7C
7E
10
IE
7C
7C
7F
7F
7F
78
10
IF
66
66
3C
3C
1F
3C
67
67
78
7F
41
63
43
63
lC
lC
7E
78
lC
lC
7C

00
00
00
06
00
2C
00
18
00
66
00
66
00
lC
00
60
00
30
00
66
00
66
00
66
00
18
00
18
30
OC
00
00
00
18
00
66
00
41
00
OC
00
36
00
33
00
36
00
31
00
31
00
33
00
66
00
18
00
06
00
66
00
30
00
63
00
63
00
36
00
33
00
36
07
66

00 00 00 18

DB

OOOH, OOOH, OOOH, OOOH, OOOH, 018H, 018H, OOOH

D_2E

DC 18 30 60

DB

003H, 006H, OOCH, 018H, 030H, 060H, 040H, OOOH

D_2F

66 66 66 34

DB

018H, 02CH, 066H, 066H, 066H, 034H, 018H, OOOH

o 0_30

38 18 18 18

DB

018H, 018H, 038H, 018H, 018H, DI8H, 03CH, OOOH

D_31

66 OC 18 32

DB

03CH, 066H, 066H, OOCH, 0ISH, 032H, 07 EH, OOOH

D_32

OC lC 06 66

DB

03CH, 066H, OOCH, 0ICH, 006H, 066H, 03CH, OOOH

D_33

2C 6C 7E OC

DB

OOCH, 0ICH, 02CH, 06CH, 07EH, OOCH, 01 EH, OOOH

4 D_34

7C 66 06 66

DB

07EH, 060H, 07CH, 0,66H, 006H, 066H, 03CH, OOOH

5 0_35

60 7C 66 66

DB

0ICH, 030H, 060H, OlCH, 066H, 066H, 03CH, OOOH

6 0_36

4C OC 18 18

DB

07EH, 066H, 04CH, OOCH, 0 18H, 018H, 038H, OOOH

7 0_37

76 3C 6E 66

DB

03CH, 066H, 076H, 03CH, 06EH, 066H, 03CH, OOOH

8 0_38

66 3E 06 OC

DB

03CH, 066H, 066H, 03 EH, 006H, OOCH, 038H, OOOH

0_39

18 00 00 18

DB

OOOH, 018H, 018H, OOOH, OOOH, 018H, 018H, OOOH

0_3A

18 00 00 18

DB

OOOH, 018H, 018H, OOOH, OOOH, 0l8H, 018H, 030H

0_3B

18 30 18 OC

DB

006H, OOCH, 018H, 030H, 0 ISH, OOCH, 006H, OOOH

< D_3C

7E 00 7E 00

DB

OOOH, OOOH, 07 EH, OOOH, 07 EH, OOOH, OOOH, OOOH

D_30

OC 06 OC 18

DB

030H, 018H, OOCH, 006H, OOCH, 0 18H, 030H, OOOH

D_3E

26 OC 18 00

DB

03CH, 066H, 026H, OOCH, 018H, OOOH, 018H, OOOH

D_3F

5D 55 5F 40

DB

03EH, 041H, 050H, 055H, 05FH, 040H, 03 EH, OOOH

@

lC 16 3E 23

DB

0ICH, OOCH, 0ICH, 016H, 03 EH, 023H, 063H, OOOH

A D_41

0_40

36 3E 33 33

DB

07CH, 036H, 036H, 03 EH, 033H, 033H, 07EH, OOOH

B 0_42

61606031

DB

OlDH, 033H, 061H, 060H, 060H, 031H, 01 EH, OOOH

C 0_43

33 33 33 36

DB

07CH, 036H, 033H, 033H, 033H, 036H, 07CH, OOOH

o D_44

34 3C 34 31

DB

OlFH, 031H, 034H, 03CH, 034H, 031H, 07FH, OOOH

E 0_45

34 3C 34 30

DB

07 FH, 031H, 034H, 03CH, 034H, 030H, 078H, OOOH

F D_46

61 60 67 33

DB

OlDH, 033H, 061H, 060H, 067H, 033H, 01 FH, OOOH

G D_47

66 7 E 66 66

DB

066H, 066H, 066H, 07EH, 066H, 066H, 066H, OOOH

H D_48

18 18 18 18

DB

03CH, 018H, 018H, 0 18H, 018H, 018H, 03CH, OOOH

0_49

06 06 66 66

DB

01 FH, 006H, 006H, 006H, 066H, 066H, 03CH, OOOH

0_4A

6C 78 6C 66

DB

067H, 066H, 06CH, 078H, 06CH, 066H, 067H, OOOH

K D_4B

30 30 31 33

DB

078H, 030H, 030H, 030H, 031H, 033H, 07 FH, OOOH

L 0_4C

77 7 F 6B 63

DB

041H, 063H, 077H, 07 FH, 06BH, 063H, 063H, OOOH

M 0_4D

73 7B 6F 67

DB

043H, 063H, 073H, 07 BH, 06 FH, 067H, 063H, OOOH

N 0_4E

63 63 63 36

DB

0ICH, 036H, 063H, 063H, 063H, 036H, OICH, OOOH

o 0_4F

33 3E 30 30

DB

07 EH, 033H, 033H, 03 EH, 030H, 030H, 078H, OOOH

PO_50

63 63 6B 36

DB

0ICH, 036H, 063H, 063H, 06BH, 036H, 0ICH, 007H

Q 0_51

66 7C 6C 66

DB

07CH, 066H, 066H, 07CH, 06CH, 066H, 067H, OOOH

R 0_52

ROM BIOS 2-235

ID06
IDOE
ID16
IDlE
ID26
ID2E
ID36
ID3E
1046
ID4E
ID56
ID5E
ID66
ID6E
ID76
ID7E
ID86
1D8E
ID96
ID9E
IDA6
IDAE
lDB6
lOBE
IDC6
IDCE
lDD6
lODE
lDE6
IDEE
lDF6
IDFE
1 E06
lEOE
lE16
lElE
lE26

67
3E
7C
7E
3C
63
3E
77
08
63
22
66
66
E7
3C
7E
7E
IE
IE
60
01
3C
3C
08
00
00
00
18
00
00
7B
70
6E
00
3C
OE
3B
00
3E
OE
3C
00
63
70
73
18
3C
OC
6C
70
77
38
3C
00
6B
00
73
00
3C
00
30
00
06
00
78
00
7C
08
OC
00
3B
00
08
00

00
66
00
5A
00
63
00
62
00
63
00
66
00
66
00
66
00
18
00
30
00
DC
00
lC
00
00
FE
18
00
00
00
30
00
00
00
06
00
00
00
1B
00
00
3E
30
00
00
00
00
38
30
00
18
00
00
00
00
00
00
00
00
78
00
OF
00
00
00
00
18
00
00
00
00
00
00

70 3C OE 66

DB

03EH, 066H, 070H, 03CH, OOEH, 066H, 07CH, OOOH

S D_53

18 18 18 18

D8

07 EH, 05AH, 018H, 018H, 018H, 018H ,03CH, OOOH

T D_54

63 63 63 63

DB

063H ,063H, 063H, 063H, 063H, 063H, 03EH, OOOH

U D_55

36 34 lC 18

DB

077H, 062H, 036H, 034H, 0ICH, 018H, 008H, OOOH

V 0_56

6B 6B 3E 36

DB

063H, 063H, 06BH, 06BH ,03EH, 036H, 022H, OOOH

W 0_57

3C 18 3C 66

DB

066H, 066H, 03CH, 018H, 03CH, 066H, 066H, OOOH

X 0_58

34 18 18 18

DB

OE7H, 066H, 034H, 018H, 018H, 018H, 03CH, OOOH

Y D_59

4C 18 32 66

DB

07 EH, 066H ,04CH, 018H, 032H, 066H, 07 EH ,OOOH

Z D_5A

18 18 18 18

DB

01 EH, 018H, 018H, 018H, 018H, 018H, 0 1EH, OOOH

[ D_5B

18 OC 06 03

DB

060H, 030H, 018H, OOCH, 006H, 003H, 001H, OOOH

BSL D_5C

DC DC OC OC

DB

03CH, OOCH ,OOCH, OOCH, OOCH, OOCH, G3CH ,GOOH

J

36 63 00 00

DB

008H, 0 lCH, 036H, 063H, OOOH, OOOH, OOOH, OOOH

CIR D_5E

0_50

00 00 00 00

DB

OOOH, OOOH, OOOH, OOOH, OOOH, OOOH, OOOH, OFEH

_ D_5F

OC 00 00 00

DB

018H ,018H, OOCH ,OOOH, OOOH ,OOOH, OOOH, OOOH

n

3C 66 IE 66

DB

OOOH, OOOH, 03CH, 066H, 01 EH, 066H, 07BH, OOOH

LC A D_61

3E 3B 33 3B

DB

070H, 030H, 03EH, 03BH, 033H, 03BH, 06EH, OOOH

LC B D_62

3E 66 60 66

DB

OOOH, OOOH, 03EH ,066H, 060H, 066H, 03CH, OOOH

LC C D_63

36 6E 66 66

DB

OOEH, 006H, 036H, 06EH, 066H, 066H, 03BH, OOOH

LC D D_64

D_60

3C 66 7E 60

DB

OOOH, OODH, 03CH, 066H, 07EH, 060H, 03EH, OOOH

LC E D_65

18 3E 18 18

DB

OOEH, 01BH, 018H, 03 EH, 018H, 018H, 03CH, OOOH

LC F D_66

3D 66 38 3 E

DB

OOOH, OOOH, 03DH, 066H, 038H, 03 EH, 063H, 03EH

LC G D_67

36 3B 33 33

DB

070H, 030H, 036H, 03 BH, 033H, 033H ,073H, OOOH

LC H 0_68

38 18 18 18

DB

018H, OOOH, 038H, 018H, 018H, DI8H, 03CH, OOOH

LC I D_69

lC OC OC 6C

DB

OOCH, OOOH, 0ICH, OOCH, OOCH, 06CH, 06CH, 038H

LC J D_6A

33 36 3C 36

DB

070H, 030H, 033H ,036H, 03CH ,036H, 077H, OOOH

LC K D_6B

18 18 18 18

DB

038H, 018H ,D18H, 018H, 018H, 018H, 03CH, OOOH

LC L D_6C

76 7F 6B 6B

DB

OOOH, OOOH, 076H, 07 FH, 06BH, 06BH, 06BH, OOOH

LC M D_6D

76 3B 33 33

DB

OOOH, OOOH, 076H, 03BH, 033H ,033H, 073H, OOOH

LC N D_6E

3C 66 66 66

DB

OOOH, OOOH, 03CH, 066H, 066H, 066H, 03CH, OOGH

LC 0 D_6F

6E 33 33 3E

DB

OOOH, OOOH, 06EH, 033H, 033H, 03EH, 030H, 078H

LC P D_70

3A 66 66 3E

DB

OOOH, OOOH, 03AH, 066H, 066H, 03EH, 006H ,OOFH

LC Q D_71

6E 3B 33 30

DB

OOOH, OOOH, 06EH, 03BH, 033H, 030H, 078H, OOOH

LC R D_72

3E 70 3C OE

DB

OOOH, OOOH, 03EH, 070H, 03CH, OOEH, 07CH, OOOH

LC S D_73

3 E 18 18 lA

DB

008H, 018H, 03EH, 018H, 018H, 01AH, OOCH, OOOH

LC T D_74

66 66 66 66

DB

OOOH, OOOH, 066H, 066H, 066H, 066H, 03BH, OOOH

LC U D_75

73 32 36 lC

DB

OOOH, OOOH, 073H, 032H, 036H, 01CH, 008H, OOOH

LC V D_76

68 6B 7F 36

DB

OOOH, OOOH, 06BH, 06BH, 07 FH, 036H, 022H, OOOH

LC W D_77

2-236 ROM BIOS

lE2E
lE36
lE3E
lE46
lE4E
lE56
lE5E
lE66

22
00
67
00
6C
00
7E
OE
OE
18
18
70
70
39
00
08
7F

00
00
00
00
38
00
00
18
00
18
00
18
00
4E
00
lC
7F

73 36 lC 36

DB

OOOH, OOOH, 073H, 036H, 0 lCH, 036H, 067H, OOOH

LC X D_78

77 33 lA OC

DB

OOOH, OOOH ,077H, 033H, 0 lAH, OOCH, 06CH, 038H

LC Y D_79

7E 4C 18 32

DB

OOOH, OOOH, 07EH, 04CH, 018H, 032H, 07EH, OOOH

LC Z D_7A

18 70 18 18

DB

OOEH, 018H, 018H, 070H, 0 18H, OI8H, OOEH, OOOH

D_7B

18 00 18 18

DB

o18H, 018H, 018H, OOOH, 0 18H, 018H, 018H, OOOH

D_7C

18 OE 18 18

DB

070H, 018H, 018H, OOEH, 018H, 018H, 070H, OOOH

D_7D

00 00 00 00

DB

039H, 04EH, OOOH ,OOOH, OOOH, OOOH, OOOH, OOOH

-

008H, 0ICH, 0ICH, 036H, 026H, 063H, 07FH, 07 FH

DELTA D_7F

IC 36 26 63

DB

D_7E

Time of Day Entry (TIME_OF_DAY)
. ***************************************
TIME_OF _DAY ROUT! NE ENTRY PO I NT

. ***************************************
;ORG
lE6E
= lE6E
lE6E E9 0000

OFE6EH
ORG
01E6EH
T!ME_OF_DAY
EQU
JMP
TOD_PROC

Timer 0 Interrupt Handler
(TIMER_INT)
; ***************************************
; TIMER 0 INTERRUPT HANDLER ADDRESS

; ***************************************
;ORG

lEA5
lEA5
lEA5 E9 0000

=

OFEA5H
ORG
01EA5H
TI MER_I NT
EQU
JMP
TMRO_I NT8

BIOS Vector Table (VECTOR_TABLE)
; ***************************************
BIOS VECTOR TABLE

; *******.********************************
;ORG
lEF3
lEF3

OFEF3H
ORG
01EF3H
VECTOILTABLE
LABEL

WORD

HARDWARE INTERRUPTS

ROM BIOS 2-237

1EF3
1EF5
1EF7
1EF9
1EFB
1EFD
1EFF
1F01

0000
0000
1F23
1F23
1F23
1F23
0000
1F23

DW
DW
OW
OW
OW
DW
OW
OW

OFFSET TMRO_INT8
OFFSET KYBD_INT9
OFFSET 011
OFFSET 011
OFFSET 011
OFFSET Dll
OFFSET DSKLINTE
OFFSET Dll

VECTOR TABLE
INTERRUPT 8 TIMER 0
INTERftUPT 9 KEYBOARD
INTERRUPT A
INTERRUPT B
INTERRUPT C
INTERRUPT D
INTERRUPT E DISKETTE
INTERRUPT F

SOFTWARE INTERRUPTS
1F03
1F05
1F07
1 F09
1 FOB
1FOD
1 FOF
1Fll
1F13

1065
1840
1841
0000
0000
0000
0000
0000
0000

R
R
R
E
E
E
E
E

DW
DW
DW
DW
DW
DW
OW
OW
OW
OF6DDH

;DW
1Fl5
1Fl?
1F19
1FlB
1FlD
1FlF
1F21

0000
0000
1F53
1F53
10M
OFC7
02C6

OW
OW
OW
OW
DW
OW
DW

R
R
R
R
;ORG

1F23

OFF23H
ORG

OFFSET VIDEO_IO
; INT 10H
OFFSET EQUIPMENT
; INT llH
OFFSET MEMORLSIZE_DET ; INT 12H
OFFSET DSKLIO
INT 13H
OFFSET COMMO_IO
I NT 14H
SYS_SERVICES
I NT 15H
OFFSET KYBD_IO
INT 16H
OFFSET PRLIO
INT 17H
OOOOOH
I NT ISH (RESIDENT BASIC ST)
; SEGMENT (INT ISH FILLED IN
BY SYS_SETUP ROUTINE)
OFFSET SYS_BOOT
INT 19H
TOD_PROC
I NT 1AH
TIME OF DAY
DUMMY_RETURN
I NT 1BH
KYBD BREAK AD DR
DUMMY _RETURN
TIMER BREAK ADDR
INT 1CH
VIDEO_PARMS
VIDEO PARAMETERS
I NT 1DH
OFFSET DSKLBASE
I NT 1EH
DSKT PARAMETERS
CHAR_GEN_HI
I NT 1 FH
PTR TO CHAR-GEN
OlF23H

Default Interrupt Services (DII)
~ **********************************************************************

ROUTINE-NAME:

011

FUNCTION: THIS ROUTINE IS UNUSED INTERRUPT LEVEL HANDLER INSTALLED
BY POST FOR INTERRUPTS NOT USED BY BIOS. THIS ROUTINE RECORDS
THE OCCURRENCE OF AN INTERRUPT IN INTR_FLAG AND PERFORMS A
NON_SPECIFIC END_OF_INTERRUPT TO RESET THE INTERRUPT SERVICE.
ENTRY CONDITIONS:
PURPOSE OF ENTRY: UNUSED I NTERRUPT OCCURRED
INPUT CONDITIONS: NONE
RESTRICTIONS:
NONE
EXIT CONDITIONS:
NORMAL EXIT CONDITIONS: INTRJLAG = 00-07 TO INDICATE IRPT #
INTR_FLAG = OFFH WHEN NO HARDWARE IRPT
FOUND ACTIVE
THE INTERRUPTING LEVEL WILL BE MASKED IN
THE INTERRUPT CONTROLLER IF POST IS NOT ACTIVE.
ERROR EXIT CONDITIONS: NONE
REGISTERS MODIFIED:

NONE

. *********************************************************************
IF23
1 F23
1F24
IF25
1F26

1E
52
50
E8 085C

011
PROC
ASSUME OS: DATA
PUSH
OS
PUSH
OX
PUSH
AX
CALL
DDS

2-238 ROM BIOS

NEAR

SAVE REG AX CONTENTS

IF29
IF2B
IF2D
IF2E
IF30
IF32

BO
E6
90
E4
OA
75

IF34
IF36

OB
20

AL ,OBH
INTAOO,AL

20
CO
05

MOV
OUT
NOP
IN
OR
JNZ

B4 FF
EB 08 90

MOV
JMP

AH,OFFH
DILEXIT

READ IN-SERVICE REG
(FIND OUT WHAT LEVEL BEING
SERVICED)
GET LEVEL
NO HARDWARE IN SERVICE?

AL,INTAOO
AL,AL
HW_INT

SET NO LEVEL IN SERVICE FLAG
SET FLAG TO FF IF NON-HDWARE

HARDWARE INTERRUPT OCCURRED
IF39
IF39

E8 IF57

IF3C
IF3E

BO 20
E6 20

HW_INT:
CALL
MOV
OUT

GO MASK LEVEL, RETURN WITH
AH INDICATING LEVEL MASKED
SEND END OF INTERRUPT

MASK-LEVEL
AL, EOI
INTAOO ,AL

SAVE I NTRJLAG AND EX IT
IF40
IF40
IF44
IF45
IF46
IF47
IF48

88 26 006B R
58
5A
IF
CF
;ORG

IF53

Dll_EX IT:
I NTR_FLAG, AH
MOV
POP
AX
POP
DX
DS
POP
IRET
Dll
ENDP
OFF53H
ORG

SET FLAG
RESTORE REG AX CONTENTS

01F53H

; *********************************************************************
; DUMMY INTERRUPT RETURN

; *********************************************************************
IF53
IF53
1F54

DUMMY _RETURN
IRET
DUMMY _RETURN

CF

PROC

FAR

ENDP

; ***************************************
PRINT SCREEN ROUTINE ENTRY ADDRESS

; ***************************************
;ORG

IF54
= IF54
1 F54 E9 0000

OFF54H
ORG
01 F54H
PRINLSCREEN
EQU
JMP
PRT _SCRN

; **********************************************************************
; ROUTINE USED BY Dll HANDLER TO MASK THE INTERRUPT LVL BEING SERVICED

IF57
IF57
IF58
IF5A
IF5C
IF5E
IF60
1 F62
IF67
IF69
IF6B
IF6D
IF6F
IF6F
1F70
IF71

; *********************************************************************
51
B4
E4
24
8A
D2
F6
75

01
AO
07
C8
E4
06 0012 R 01
06

E4 21
OA C4
E6 21
59
C3

MASK-LEVEL
PROC
NEAR
PUSH
CX
MOV
AH,OI
IN
AL,IONMLCNTL
AND
AL,07
MOV
CL, AL
SHL
AH,CL
TEST
POSLSTATUS, POSLACTIVE
JNZ
MASK_EXIT

IN
AL,INTAOI
OR
AL,AH
OUT
INTAOl,AL
MASK-EXIT:
POP
CX
RET
MASK-LEVEL
ENDP

START AT LEVEL 0
READ HIGHEST LVL IN SERVICE
JUST KEEP LEVEL BITS
GET LEVEL AS SH I FT COUNT
AH CONTAINS MASK FOR LEVEL
; POWER_ON_SELF_TEST ACTIVE?
JUMP I F POST ACTIVE
GET MASK VALUE
MASK OFF LVL BEING SERVICED

ROM BIOS 2-239

Hardware Power-on Reset Address
*****************************************
POWER ON RESET VECTOR

****************************************
ORG

IFFO
IFFO
I FFO
IFFI
I FF3
IFF5

EA
0000
FOOO

OFFFOH
ORG
P_O_R
DB
OW
OW

ROMCODE
END

2-240 ROM BIOS

oI FFOH
LABEL
OEAH
OFFSET
OFOOOH

FAR

POSTMAIN
ENDS

HARD CODE JUMP FAR
OFFSET
SEGMENT

Release Date Marker
TITLE

BLDMARK.ASM

ROMCODE SEGMENT BYTE PUBLI C

0000

; *****************************************
MODULE RELEASE DATE MARKER

. ****************************************
0000
OOOB

30 39 2F 31 33 2F
38 35
4C

DB

'09/13/85'

; REL EASE MARKER

DB

'L'

;BUILD NUMBER

System Model Byte
; *****************************************
P. C. MODEL BYTE FOR TH I S MODEL

. ****************************************
;ORG

0009
OOOA

F9

OFFFEH
DB
ROMCODE
END

OF9H

;THIS PC'S 10
ENDS

ROM BIOS 2-241

2-242 ROM BIOS

Notes:

Notes:

Notes:

Notes:

---- ----- --- - ---------,-

Hardware Reference
Library

Reader's Comment Form
IBM PC Convertible
Technical Reference
Volume 2

55X8817

Your comments assist us in improving our
publication; they are an important part of the input
used for revisions.
IBM may use and distribute any of the information
you supply in any way it believes appropriate
without incurring any obligation whatever. You
may, of course, continue to use the information you
supply.
Please do not use this form for questions regarding
setup, operation, or program support or for requests
for additional publications. Instead, contact your
authorized IBM PC Convertible dealer in your area.
Comments:

111111

NO POSTAGE
NECESSARY
IF MAILED
IN THE
UNITED STATES

BUSINESS REPLY MAIL
FIRST CLASS

PERMIT NO. 40

ARMONK, NEW YORK

POSTAGE WILL BE PAID BY ADDRESSEE

IBM CORPORATION
DEPARTMENT 95H
11400 BURNET ROAD
AUSTIN, TEXAS 78758

......................................................................... ..... .
,'"'

aJa4 PIO::I

B.l

alde~s ~ou

op aseald

ade.l

© IBM Corp. 1986
All rights reserved.
International Business
Machines Corporation
Po. Box 1328-W
Boca Raton,
Florida 33429-1328
Printed in the
United States of America

55X8817

---- - -----------, -®



Source Exif Data:
File Type                       : PDF
File Type Extension             : pdf
MIME Type                       : application/pdf
PDF Version                     : 1.3
Linearized                      : No
XMP Toolkit                     : Adobe XMP Core 4.2.1-c043 52.372728, 2009/01/18-15:56:37
Create Date                     : 2013:05:24 12:15:40-08:00
Modify Date                     : 2013:05:24 12:10:12-07:00
Metadata Date                   : 2013:05:24 12:10:12-07:00
Producer                        : Adobe Acrobat 9.53 Paper Capture Plug-in
Format                          : application/pdf
Document ID                     : uuid:de1bfe11-d7d5-2749-bf19-a97d2e2834a2
Instance ID                     : uuid:778d6855-374c-e94e-9a43-973aad34b0e1
Page Layout                     : SinglePage
Page Mode                       : UseNone
Page Count                      : 275
EXIF Metadata provided by EXIF.tools

Navigation menu