19790620_Z IOP_1.5_ls 19790620 Z IOP 1.5 Ls

19790620_Z-IOP_1.5_ls 19790620_Z-IOP_1.5_ls

User Manual: 19790620_Z-IOP_1.5_ls

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

Z-IOP.ls
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
1
2
3
4
5
6
7
8
9
10
11
12
13
14
1000
15
16
1000
17
1002
18
1004
19
1006
20
1008
21
100A
22
100C
23
100E
24
1010
25
1012
26
1014
27
28
1020
29
1022
30
1024 31
1026 32
1028 33
34
35
1030 36
1032 37
1034 38
1036 39
1038
40
103A
41
103C
42
103E
43
1040
44
1042
45
1044
46
1048
47
104A
48
104C
49
104E
50
1050
51
1052
52
1054
53
1056
54
1057
55
1058
56
105A
57
20-Jun-79
10:23:38
Page
BCA/l/e
Z-IOP.bca;pnew
z-iop.mb@P@
Current
version
is
version
1.5
last
change:
moved
interrupt
vectors
to
RAM
to
allow
disk
programs
to
use
interrupts
not
used
by
rom
This
file
contains
the
code
that
will
be
resident
in
the
lOP
rom
with
BOOTABlE
disks--Interim
arrangement
Author:
Bruce Horn
last
changed:
June
18, 1979
3:19
PM
.Predefine
"8086Predefs.sr"
.Get
"Z-IOPRamDefs.bca"
;Ram
locations
...
Z-IOPRamDefs.bca
This
file
contains
the
lOP
Ram
locations
and
symbols.
The
lOP
can
address
ram
beginning
at
1000H
All
state
is
booted
from
the
disk
Author:
Bruce Horn
last
changed:
June
18, 1979 3:
04
PM
;RAM
definitions
fol1ow--
;The
following
is
PRIVATE
to
the
10
processor
IOPRam=
B itsGone=
Count=
Mask=
Offset=
Templ=
IRR=
Portl00=
Port60=
Port20=
KbdOffset=
OldKbdData=
RO=
Rl=
R2=
R3=
1000
IOPRam
BitsGone+2.
Count+2.
Mask+2.
Offset+2.
Templ+2.
1RR+2.
Portl00+2.
Port60+2.
Port20+2.
KbdOffset+2.
OldKbdData+12.
RO+2.
R1+2.
R2+2.
;IOP
Ram
begins
at
this
address
;Kbd
Handler
temp
;temp
;temp
;temp {Meta keys modify
this}
;Temp
for
interrupt
routine
;1nterrupt
mask
(IntsOn/Off)
;portlOO
settings
;Port60
settings
;port20
settings
;current
byte
address
on
input
;6 word
keyboard
input,
old
;various
temporary
registers
;
for
rom
to
use
1
BitE
rrors=
R3+2.
;following
8
bytes
are
bit
errors
;from
mem
test
.ShowNewCursor=
. DisplayOn=
.DisplayOff=
. WaitBug=
.
Wa
itNoBug=
.1ntsOn=
.
1ntsOff=
. SetP60=
.
10Init=
DStatus=
JumpTo=
NextDisk=
ReTry=
BeginAdr=
BeginSeg=
OldAdr=
OldSeg=
Blocks=
Track=
Sector=
.
Buffer=
Buffer=
BitErrors+8.
;Other
useful
rom
routines
.ShowNewCursor+2 .
.DisplayOn+2.
-.DisplayOff+2 .
.WaitBug+2.
.WaitNoBug+2.
.1ntsOn+2 .
.lntsOff+2
.
.SetP60+2 .
.IOInit+2.
DStatus+2.
JumpTo+4.
NextDisk+2.
ReTry+2.
BeginAdr+2.
BeginSeg+2.
01dAdr+2.
OldSeg+2.
Blocks+2.
Track+l.
Sector+l
.
.Buffer+2.
;disk
status
on
fail
;
Byte/Seg'
add
ress
of
in
it
rout
i
ne
;another
disk
after
this
one?
;Retry
counts/sector
rlw
;Begin
loading
address
;Begin
loading
segment
;last
address
since
R/W
sector
;
Last
segment
;Blocks
to
read
;Current
track
;Current
sector
;location
of
disk
buffer
;128
char
disk
buffer
Z-IOP.ls
2000
2000
2002
2004
2006
2008
200A
200C
200E
2010
2012
2014
2016
2018
201A
201C
20lE
2020
2022
2024
2026
2028
202A
202B
202C
2020
202F
2031
2033
2036
2038
203A
207A
207C
2094
2000
210C
210E
211E
2120
2122
2126
2I2A
212£
2136
2136
213E
2140
214E
215E
2160
2162
2164
2I6C
22AO
22AO
22A5
22AA
22AF
22B4
22B9
22BE
22C3
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
20-Jun-79
10:23:38
Page 2
;The
following
is
PUBLIC
information--The
emulator
processor
can
;address
this
information,
and
possibly
alter
it
EPRam=
2000
;Routines
available
in
ROM
· B
itBlt=
.SetP100=
· SetP20=
.InitDC=
·
Hi
deCu
rsor=
.ShowCursor=
·
RomIn
it=
EPRam
.BitBlt+2.
.SetP100+2.
.SetP20+2.
·
In
itDC+2.
·
HideCursor+2.
.ShowCursor+2.
;Other
reserved
locations
QByte=
QSeg=
Qlock=
ICount=
OldICount=
KbdStatus=
MouseX=
MouseY=
RMX=
RMY=
RMW=
RMH=
OldMX=
OldMY=
KbdData=
MYDelta=
MXDelta=
KWO=
KW1=
KW2=
KW3=
ReadPtr=
WritePtr=
KbdBuffer=
IntKey=
DC
In
its=
CDF=
ADF=
NIChars=
ICl
ist=
.
Cursor=
.Display=
.CursorTable=
.BBTable=
.KbdMap=
CTHeader=
CursorTable=
Dis
play
Bits
=
Cu
rsorX=
CursorY=
CursorBits=
Cu
rsorXOff=
CursorYOff=
Cursorlock=
BBHeader=
BBTable=
RamInts=
IROO=
IR01=
IR02=
IR03=
IR04=
IR05=
IR06=
IR07=
·
RomI
n
it+2.
QByte+2.
QSeg+2.
QLock+2.
ICount+2.
OldICount+2.
KbdStatus+2.
MouseX+2
MouseY+2.
RMX+2.
RMY+2.
RMW+2.
RMH+2.
OldMX+2.
OldMY+2.
KbdDa
ta+1.
KbdData+2.
KbdData+3.
KbdData+5.
KbdOata+7.
KbdData+9.
KbdData+12.
ReadPtr+2.
WritePtr+2.
KbdBuffer+64.
IntKey+2.
DCIn
i
ts+24.
CDF+60.
ADF+60.
NIChars+2.
ICList+16
.
.Cursor+2.
.Display+2.
.CursorTable+4.
.BBTable+4.
.KbdMap+4.
CTHeader+8.
CursorTabl
e+O.
CursorTable+8.
CursorX+2
CursorTabl
e+24.
CursorTable+40.
CursorXOff+2.
CursorYOff+2.
Cu
rso
rTab 1 e+46.
BBHeader+8.
22AO
RamInts
IROO+5.
IR01+5.
IR02+5.
IR03+5.
IR04+5.
IR05+5.
IR06+5.
;EP can
address
ram
starting
here
;address
of
BitBLT
routine
;address
of
portlOO
routine
;port
20
;display
controller
init
;hides,
locks
cursor
;unlocks,
shows
cursor
;initializes
rom
;TRB
Queue
Header
;segment
of
last
block
;Queue
locked-->negative
;60hz
interrupt
counter
;old
interrupt
count
for
change
;#chars
in
bufferlmouse
buttons
;Mouse X
position
;Mouse Y
position
Defines
restricted
rectangle
for
mouse--X.
Y.
Width.
Heiaht
Mouse
cannot
move
outside
-
this
rectangle
;old
MouseX
since
cursor
;Old
MouseY
since
cursor
;Keyboard
data
from
Kbd
UART
(6w)
;
Mouse
Y de
lta
;Mouse X
delta
;Keyboard
word
zero
;Keyboard
word
one
;Keyboard
word two
;Keyboard
word
three
;Read
Pointer
for
kbd
buffer
;Write
Pointer
;32
character
kbd
buffer
;has
an
interrupt
key been
hit?
;Display
controller
init
table
;Current
Disk
Format
;Alternate
Disk
Format
;number
of
interrupt
keys
;[char],[char]
...
[char]
<=8
;2
byte
oop
;2
byte
oop
of
display
;2
word
addr.
to
cursor
bb
table
;2
word
addr.
to
display
bb
table
;2
word
address
to
Keyboard
Map
;TRB
header
for
Cursor
table
;Cursor
bitblt
table
;display
bitmap
loc
in
table
;Cursor
X
position
;Cursor
Y
position
;cursor
bitmap
loc
in
table
;cursor
x
offset
;cursor
y
offset
;should
cursor
change?
;TRB
header
for
BB
table
;Display
bitblt
table
;
ParErrInt
;IPSysInt
;DiskInt
;
EIAInt
;OddInt
;ADClnt
;Kbdlnt
;VSyncInt
Z-IOP.ls
0000
0002
FFFF
0000
OOOC
0000
0002
0004
0006
0008
OOOA
OOOC
OOOE
0010
0012
0014
0016
0018
001A
1'\1'\11"
VVJ.
...
001E
0020
0022
0024
0026
FFFC
FFFB
FFC7
FE3F
FlFF
EFFF
DFFF
3FFF
FCFF
E3FF
BFFF
DFFF
-
7HF
FHO
FFEF
FFOF
FFBF
FF7F
0000
0002
OOEF
OOBF
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
20
21
1
20-Jun-79
10:23:38
Page 3
;The
following
are
some
useful
constants
that
should
be
listed
;as
external:
Cu
rren-toS=
XorBB=
Black=
Wh
ite=
StcBB=
o
02
OFFFF
o
DC
;BitBLT
table
offsets--
BBDB=
O.
BBOS=
2.
DRast= 4.
DField=
6.
DestX= 8.
DestY= 10.
DestW=
12.
OestH= 14.
C1
ipX=
16.
C1ipY=
18.
C1ipW=
20.
C1ipH=
22.
BBSB=
24.
BBSS=
26.
SRast=
28.
SFie1d= 30.
SourceX= 32.
SourceY= 34.
Function= 36.
GrayBits= 38.
;current
code,
data
segment
;bitblt
XOR
;B1ack
;White
for
bitb1t
store
constant
;Store
constant
;BitBLT
Destination
Byte
address
;BB
Destination
Segment
address
;Destination
raster
;Destination
field
size
;Destination
X
;Oestination
Y
;Destination
Width
;Oestination
Height
;C1ip X
;Clip
Y
;C1ip Width
;C1ip
Height
;BitBLT
Source
Byte
address
;BitB1t
Source
Segment
address
;SCUfCC
raster
;Source
Field
size
;Source
X
; Source Y
;Function
;Gray
bits
;Portl00
Fields:
{Disk/ADC
selects}
DiskPower=
DiskSide=
DiskDrive=
ADCOevice=
B itC1
k=
OiskMR=
GoWordClock=
AOCSpeed=
OFFfC
OFFFB
OFFC7
OFE3F
OFlFF
OEFFF
ODFFF
03FFF
;+5=2,
+12=1
;
Side
ze r.olone
;01=4,
02=2, 03=1
;Device
select
;Bit
clock
field
;Disk
Controller
master
reset
;StopWordClock'
;AOC
sampling
rate
;Port60
Fields:
(DAC/Tablet
selects)
TabletSelect=
OACSpeed=
SampleHoldA=
Samp1eHo1dB=
SampleNotHo1d=
OFCFF
OE3FF
OBFFF
ODFFF
07FFF
;2=Tablet
X,
l=Tablet
Y
;DAC
sampling
rate
;Sample/Ho1d
channel
A
;Sample/Ho1d
channel
B
;Sample/Ho1d'
;Port20
Fields:
(lOP
Processor
selects)
LEDSOn=
Oisab1eRom=
CharCtr=
IOPLock=
BootSeqDone=
OFFFO
OFFEF
OFFOF
OFFBF
OFF7F
;Ports
and
other
port
fields
ic= 0
ocwl= 2
ir4=
OEF
ir6=
OBF
.ENO
.Get
"Z-Boot.bca"
Z-Boot.BCA
;Light
LEOs.
1111
lights
all
;Run
out
of
main
mem
only
; Char
counter
;IOP
Processor
lock
;Stop
mapping
mem
req
into
Rom
;interrupt
controller
;interrupt
controller
wordl
;defines
Oddlnt
field
;defines
Kbdlnt
field
;debugger
Z-IOP.ls
20-Jun-79
10:23:38
Page 4
0000
0000
;
mem
test
range
1000
fi
rst
1000
3000
past
= 3000
2EOO
FirstSP=
2EOO
;8086
Interrupt
vector
0000
.loc
a ;
interrupt
vector
(if
sys=O)
0000
9F
01
.
adr
OivErr
;
type
0
divide
error
0002
00
00
.adr
ram
0004
B7
01
.adr
SST
;
type
single
step
0006
00
00
.adr
ram
0008
CF
01
.adr
NMI
;type
2
nmi
aOOA
00
00
.ad!"
ram
OOOC
E7
01
.adr
BPT
;
type
3
breakpoint
OOOE
00
00
.adr
ram
0010
FF
01
.
adr
OVF
;
type
4
overflow
0012
00
00
.adr
ram
;8259
Interrupt
vector
0080
.loc
4*020
0080
AO
22
.adr
IROO
;ParErrInt
0082
00
00
.adr
Ram
0084
A5
22
.adr
IROl
;IPSysInt
0086
00
00
.adr
Ram
0088
AA
22
.adr
IR02
;Oisklnt
008A
00
00
.adr
Ram
008C
AF
22
.adr
IR03 ;
EIAlnt
008E
00
00
.adr
Ram
0090
B4
22
.adr
IR04
;Oddlnt
0092
00
00
.adr
Ram
0094
B9
22
.adr
IR05 ;ADClnt
0096
00
00
.adr
Ram
0098
BE
22
.adr
IR06
;Kbdlnt
009A
00
00
.adr
Ram
009C
C3
22
.adr
IR07
;VSyncInt
009E
00
00
.adr
Ram
IntVectors:
OOAO
EA
A7
07
00
00 jmps
ParErrInt
Rom
00A5
EA
BF
07
00
00 jmps
IPSysInt
Rom
OOAA
EA
07
07
00
00 jmps
OiskInt
Rom
OOAF
EA
EF
07
00
00 jmps
EIAInt
Rom
00B4
EA
46
07
00
00 jmps
Oddlnt
Rom
00B9
EA
07
08
00
00 jmps AOClnt
Rom
OOBE
EA
76
07
00
00 jmps
Kbdlnt
Rom
00C3
EA
1F 08
00
00 jmps
VSynclnt
Rom
OFFO
.loc
OFFO
reset
vector
OFFO
EA
DO
00
00
00 jmps
restart
rom
sets
CS=FOOO(O)
OODO
.loc
000
;********Boot********
Restart:
Z-lOP.1s
20-Jun-19
10:23:38
Page 5
18
;First,
disable
interrupts
and
zero
all
segment
registers
0000
FA
79
cli
0001
88
00
00
80
mov
aX,HO
0004
8E
DO
81
mov
sS,ax
0006
8E
08 82
mov
dS,ax
0008
8E
CO
83
mov
eS,ax
84
;Stop
mapping
all
mem
requests
into
Rom--
OODA
BO
88 85
mov
al,H88
;BootSequenceDone and
OODC
BA
20
00
86
mov
dX,H20
OODF
EE
87
outd
;ErrorCorrectionOff
OOEO
BB
00
00
88
mov
bx,UO
;start
dispatch
with
2
00E3
EB
08 89 j
waitSec
90
91
X:
00E5
00
00
92
.adr
0
;not
used
00E7 04
01
93
.adr
plus5
00E9 00
01
94
.adr
plus12
OOEB
16
01
95
.adr
start
;
ramtes·t
1
abel
96
97
wa
itsec:
OOED
B9
01
00
98
mov
cX,Ul
OOFO
B8
00
70
99
mov
ax,U7000
100
LP:
00F3
FF
C8
101
dec
ax
00F5
75
FC
102
jnz
LP
00F7
B8
00
70
103
mov
aX,U1000
OOFA
E2
F1
104
loop
LP
OOFC
FF
C3
105
inc
bx
OOFE
FF
C3
106
inc
bx
0100
FF
A7
E5
00
107
jmpi
Xibx ;jump
to
routine
108
109
plus5:
0104
B8
02
00
110
mov
aX,U2 ;+5
volts
on
0107
BA
00
01
111
mov
dX,UI00
010A
EF
112 outdw
010B
EB
EO
113 j
waitSec
114
plus12:
0100
B8
03
00
115
mov
aX,U3 ;+12
volts
on
0110
SA
00
01
116
mov
dX,#100
0113
EF
117 outdw
0114
EB
07 118 j
waitSec
119
120
;Test
low
ram
for
errors--
121
0116
B2
00
122
start:
mov
dl,UO
;test
number
in
dl
0118
BF
00
00
123
mov
di
,UO
; and
offset
in
di
124
011B
FE
C2
125
again:
inc
dl
;on
to
the
next
test
0110
FF
C7
126
inc
di
;and
the
next
offset
01H
FF
C7
127
inc
di
;
incremented
by 2
for
word
0121 80
FA
01
128
cmp
dl,Ul
;dispatch
on
dl
0124
74
lC 129
je
Xtest
;it
fits
0126 80
FA
02
130
cmp
dl,U2
;test
2
0129
74
17
131
je
Xtest
;it
fits
012B
80
FA
03
132
cmp
dl,U3
;
test
3
012E
74
12 133
je
Xtest
;it
fits
0130 80
FA
04
134
cmp
dl,U4
;
test
4
0133
74
00 135
je
Xtest
;
it
fits
0135
E9
39
00
136 jmp
Bootlt
;assume
the
RAM
works
137
138
139
BitsTable:
0138 00 00 140
.adr
0
;not
used
013A
FF
Ff
141
.adr
OFFFF
;Ones
013C
00
00 142
.adr
00000
;Zeroes
013E
AA AA
143
.adr
OAAAA
;AAAA
0140 55 55 144 .
adr
05555 ;5555
145
146 ;
write
bits
in
location
and
read
back
0142
BE
00
10
147
Xtest:
mov
s i
,Hf
i
rs
t
;ram
address
~
0
0145
8B
90
38
01
148
mov
bX,BitsTable!di
0149 89
lC
149 13:
mov
O!si,bx
;write
in
bits
014B
FF
C6
150
inc
si
0140
FF
C6
151
inc
si
014F 81
FE
00
30 152
cmp
si,Upast
;end
or
ram
0153
72
F4
153
jb
13
;
11
op
if
below
Z-IOP.1s
20-Jun-79
10:23:38
Page 6
154
0155
B9
00
00
155
mov
cx,HO ;mask
of
which
bits
are
bad
0158
BE
00
10
156
mov
si,Hfirst
;
ram
address
0
015B
8B
04 157 14 :
mov
ax,Olsi
;
read
back
ram
1
ocat
ion
contents
0150
33
C3
158
xor
ax,bx
;any
bits
different?
015F
08
C8
159
or
cX,ax
;or
them
into
mask
0161
FF
C6
160
inc
si
0163
FF
C6
161
inc
si
0165
81
FE
00
30
162
cmp
si,Hpast
; end
of
ram
0169 72
Fa
163
jb
14
;next
164
016B
89
80 28
10
165
mov
BitErrors!di
,cx
;Save
error
log
in
low
mem
016F
EB
AA
166
jmp
again
;
start
all
over
167
168
169 ;The
ram
wo
rks,
so
now
boot
from
the
disk
170
171
BootIt
:
172
0171
BC
00
2E
173
mov
sp,HfirstSP
;initia1ize
SP
174
0174
B8
00 00
175
mov
ax,HO ;
zero
f1
ags
0177
50
176 push ax
0178
90
177
popf
0179
FC
178 c1d
017A
BE
AO
00 179
mov
si
,#IntVectors
0170
BF
AO
22
180
mov
d i , HRamlnts
0180
B9
28 00
181
mov
cx,H40.
0183
F2
182 rep
(\10",
A4
10')
movb
.!:lIT
up
interrupt
tables
VolO,",
.Luv
,LlLI
0185
E8
78
OA
184
call
Romln
it
0188
E8
7C
08
185
call
LoadFloppy
018B
2E
186 seg
cs
018C
C7
06 46
10
00
00
187
mov
JumpTo+2,HHO
;set
segment
to
zero
188 RunAgain:
0192
2E
189
seg
cs
0193
FF
1E 44
10
190
callis
JumpTo ;
call
the
routine
0197
E8
AO
04
191
call
Wa
itNoBug ;and
in
case
it
returns
..
OlgA
E8
94
04
192
call
Wa
itBug
;wait
for
no
bug
first,
then
0190
fB
F3
193
jmp
RunAgain
;run
prog
again
on
next
bug
194
195
OivErr:
019F
B8
00
00 196
mov
ax,HO
01A2
BB
FO
FF
197
mov
bx,HLedsOn
01A5
E8
B8
04 198
call
SetP20
01A8
E8
60 04
199
call
IntsOn
01AB
E8
7B
04
200
call
Oisp1ayOn
01AE
2E
201
seg
cs
OlAF
Al
A9
00
202
mov
ax,
.ErrorCursor
01B2
E8
8E
04
203
call
ShowNewCursor
01B5
EB
FE
204
HO:
j
HO
205
206
SST:
01B7
B8
01
00
207
mov
ax.Hl
01BA
BB
FO
FF
208
mov
bx,HLedsOn
01BO
E8
AO
04 209
call
SetP20
01CO
E8
55 04 210
call
IntsOn
01C3
E8
63 04
211
call
OisplayOn
01C6
2E
212 seg
cs
o lC7
Al
A9
00 213
mov
ax,
.ErrorCursor
01CA
E8
76
04 214
call
ShowNewCursor
01CO
EB
FE
215
Hl : j Hl
216
217
NMI:
01CF
B8
02
00 218
mov
ax,H2
0102
BB
FO
FF
219
mov
bx,HLedsOn
0105
E8
88 04
220
call
SetP20
0108
E8
3D
04
221
call
IntsOn
010B
E8
48
04
222
call
DisplayOn
alOE
2E
223
seg
cs
010F
Al
A9
00 224
mov
ax,
;ErrorCursor
OlE2
E8
5E
04
225
call
ShowNewCursor
01E5
EB
FE
226
H2:
j
H2
227
228
BPT:
OlE7
88
03 00 229
mov
ax,H3
Z-IOP.ls
OlEA
BB
FO
FF
OlEO
E8
70
04
OHO
to
25
04
OlF3
E8
33
04
OlF6
2E
01F7
Al
A9
00
OlFA
E8
46
04
OlFO
EB
FE
OlFF
B8
04 00
0202
BB
FO
FF
0205
E8
58
04
0208
E8
00
04
020B
E8
IB
04
020E
2E
020F
Al
A9
00
0212
E8
2E
04
0215
EB
FE
0002
0004
0006
0008
OOOA
OOOC
OOOE
0010
0012
0014
0016
0018
001A
001C
OOlE
0020
0022
0024
0026
0028
0014
0000
002A
0032
0034
0036
0038
003A
003C
003E
0040
0042
004A
004C
004E
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
22
23
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
20-Jun-79
10:23:38
H3:
OVF:
H4:
mov
bx,#LedsOn
call
SetP20
call
IntsOn
call
OisplayOn
seg
cs
mov
ax,
.ErrorCursor
call
ShowNewCursor
j
H3
mov
ax,#4
mov
bx,#LedsOn
call
SetP20
call
IntsOn
call
OisplayOn
seg
cs
mov
ax,
.ErrorCursor
call
ShowNewCursor
j
H4
.END
.Get
"Z-BitBLT.bca"
;bitblt
code
Z-BitBLT.bca
This
file
contains
BitBLT
for
the
8086
Version
2.0
Allthor'
n;!n
Tnf1;!ll~
.--_
..
_-.
-_
..
-""-"-
Last
changed:
March
8,
1979
3:54
PM
-
fixed
minx/y
clipping
-
fixed
destination
segment
-
saves/restores
OS
-
uses
fast
shift
2
;TEMPS
BEGIN
ABOVE
SAVED
BP
OESBYTE+2
OESSEG+2
DESRAST+2
OESFLD+2
OESX+2
OESY+2
WIDTH+2
HEIGHT+2
CLPX+2
CLPY+2
CLPWIO+2
CLPHT+2
SRCBYTE+2
SRCSEG+2
SRCRAST+2
SRCFLD+2
SRCX+2
SRCY+2
Page 7
OESBYTE=
OESSEG=
OESRAST=
DESFLD=
OESX=
OESY=
WIDTH=
HE
IGHT=
CLPX=
CLPY=
CLPWID=
CLPHT=
SRCBYTE=
SRCSEG=
SRCRAST=
SRCFLD=
SRCX=
SRCY=
FUNC=
GRAY=
TABSIZ=
FUNC+2
GRAY+2-0ESBYTE/2
;NO.
WORDS
IN
CALLER'S
TABLE
NOTE:
PARALLEL
TABLES
...
meaning
that
the
source
parmeters
must
lie
the
same
distance
from
the
destination
parameters
in
both
tables.
So
check
in
the
.LS
file
that
zero=
SRCBYTE-DESBYTE-SRCDEL+DESDEL
TEMP
FRAME
FORMAT
OESDEL=
GRAY+2
;4
VALS
FOR
Y
MOD
4
OESWA=
OESOEL+8
STARTBITS=
OESWA+2
SKEW=
STARTBITS+2
SKMSK=
SKEW+2
HBAK=
SKMSK+2
VBAK=
HBAK+2
MASK1=·
VBAK+2
MASK2=
MASK1+2
SRCDEL=
MASK2+2
;4
VALS
FOR
Y
MOD
4
SRCWA=
SRCDEL+8
PRELD=
SRCWA+2
HCQUNT=
PRELD+2
Z-IOP.ls
20-Jun-79
10:23:38
Page 8
0050
53
NWORDS=
HCOUNT+2
0052
54
SRCN=
NWORDS+2
0054
55
SHIFTS=
SRCN+2
0056
56
OPN=
SHIFTS+2
0058
57
GRAYS=
OPN+2
;4
VALS
FOR
Y
MOD
4
0060
58
NTEI~PS=
GRAYS+8
59
;
0008
60
BRUSHFUNC=
8
OOOC
61
CONSTFUNC=
OC
62
0218
63
.LOC
.+1/2*2
;
EVENWORD
ALIGNMENT
64
65
; 1*
TABLE
OF
SOURCE
ft0UTINES
0218
07
05
66
SOURCES:
.ADR
SRCOOPO
021A
DO
04
67
.ADR
SRCO
021C
DO
04
68
.ADR
SRCO
021E
DO
04
69
.ADR
SRCO
0220
E3
04
70
.AOR
SRCl
0222
E3
04
71
.AOR
SRCl
0224
E3
04
72
.AOR
SRCl
0226
E3
04
73
.AOR
SRCl
0228
EB
04
74
.AOR
SRC2
022A
EB
04
75
.ADR
SRC2
022C
EB
04
76
.AOR
SRC2
022E
EB
04 77
.ADR
SRC2
0230
03
05
78
.ADR
SRC30PO
0232
FO
04
79
.ADR
SRC3
0/34
FO
04
80
.AOR
SRC3
0236
FO
04
81
.ADR
SRC3
82
83
;
1*
TABLE
OF
OPERATIONS
0238
17
05
84
OPS:
.ADR
OPO
023A
18
05
85
.ADR
OPl
023C
lC
05
86
.AOR
OP2
023E
20
05
87
.ADR
OP3
88
89
;
1*
TABLE
OF
MASKS
0240
00
00
90
MASKTAB:
.ADR
0
0242
01
00
91
.ADR
1
0244
03
00
92
.AOR
3
0246
07
00
93
.ADR
7
0248
OF
00
94
.ADR
OF
024A
1F
00
95
.ADR
IF
024C
3F
00
96
.AOR
3F
024E
7F
00
97
.ADR
7F
0250
FF
00
98
.AOR
OFF
0252
FF
01
99
.ADR
IFF
0254
FF
03
100
.ADR
3FF
0256
FF
07
101
.ADR
7FF
0258
FF
OF
102
.AOR
OFFF
025A
FF
1F
103
.ADR
lFFF
025C
FF
3F
104
.ADR
3FFF
025E
FF
7F
105
.AOR
7FFF
0260
FF
FF
106
.ADR
OFFFF
107
108
; 1*
TABLE
OF
SHIFTS
(LEFT
ROTATES)
0262
CA
05
109
SHIFTTABLE:
.ADR
SHO
0264
C8
05
110
.AOR
SHl
0266
C6
05
111
.ADR
SH2
0268
C4
05
112
.ADR
SH3
026A
C2
05
113
.ADR
SH4
026C
CB
05
114
.AOR
SH5
026E
CD
05
115
.AOR
SH6
0270
CF
05
116
.AOR
SH7
0272
D1
05
117
.ADR
SH8
0274
D8
05
118
.AOR
SH9
0276
06
05
119
.ADR
SH10
0278
D4
05
120
.ADR
SHll
027A
DO
05
121
.AOR
SH12
027C
OF
05
122
.ADR
SH13
027E
E1
05
123
.AOR
SH14
0280
E3
05
124
.AOR
SH15
125
;
0282
E9
52
02
126
JDONE:
JMP
DONE
127
128
1*
...
and
now,
here's
BITBLT!
*/
Z-IOP.ls
0285
83
EC
60
0288
55
0289
88
EC
028B
IE
028C
8C
DO
028E
8E
CO
0290
88
FD
0292
83
C7
02
0295 89 14
00
0298
FC
0299
F2
029A
A5
0298
BE
02
00
029E
8B
42
OA
-a2Al
8B
4A
22
02A4
8B
52
OE
02A7
88
5A
12
02AA
3B
08
02AC
7E
13
02AE
28
08
02BO
03
CB
02B2
2B
03
02B4
03
C3
0286
88
D8
02B8
89
42
OA
0288
89
4A
22
02BE
89
52
OE
02C1
03
C2
02C3
03
5A
16
02C6
2B
08
02C8
70
05
02CA
03
03
02CC
89
52
OE
02CF
85
02
0201
7E
AF
0203
83
EE
02
0206
74
C6
0208
8B
46
22
020B
8B
56
OA
020E
2B
C2
02EO
25
OF
00
02E3
89
46
36
02E6
2B
CO
02E8
89
46
3A
02EB
FC
02EC
89
46
3C
02EF
8B
C2
02F1
25
OF
00
02F4
SB
10
00
02F7
2B
08
02F9
89
5E
34
02FC
Dl
E3
02FE
2E
02FF
8B
87
40
02
0303 89
46
3E
0306
03
56
OE
0309
FF
CA
030B
81
E2
OF
00
030F
SB
OF
00
0312
2B
OA
0314
Dl
E3
0316
2E
0317
8B
87
40
02
031B
F7
DO
0310 89
46
40
**&15)
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
i58
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
20-Jun-79
10:23:38
Page 9
BITBL
T:
SUB
PUSH
MOV
PUSH
MOV
MOV
MOV
ADD
MOV
CLO
REP
MOVW
SP,HNTEMPS
BP
BP
,SP
OS
;NEW
FRAME
;SAVE
OS
AX,SS
;BLT
CALLER'S
TABLE
TO
LOCAL
MEMORY
ES,AX
01,BP
01,HOESBYTE
;STARTS
AT
OFFSET
2
ex
,HTABSIZ
1*
MAKE
LOCAL
COPY
OF
RECTANGLES,
CHECKING
BOUNDS
SI
offset
=DESY-DESX
for
Y/HT,
=0
for
X/WID
in
this
MOV
SI,HDESY-DESX
;SI
-)
y and
height
section:
YTHENX:
MOV
AX,DESX!BP!SI
XYOK:
WHOK:
,
FHX:
MOV
CX,SRCX!BP!SI
MOV
OX,WIOTH!BP!SI
MOV
BX,CLPX!BP!SI
CMP
BX,AX
;CHECK
FOR
DEST
ORIGIN
<
CLIPPING
JLE
XYOK
SUB
BX
,AX
ADD
CX,BX
;INCREASE
SOURCE
ORIGIN
SUB
OX,BX
;DECREASE
EXTENT
ADD
AX,BX
;ANO
MOVE
DEST
ORIG
TO
CLIP
ORIGIN
MOV
BX,AX
MOV
OESX!BP~SI,AX
MOV
SRCXiBP!SI,CX
MOV
WIOTH!BP!SI,OX
ADD
AX,OX
ADD
BX,CLPWID!BP!SI
SUB
BX,AX
;CHECK
FOR
DEST
EXTENT
TOO
BIG
JGE
WHOK
ADD
OX,BX
;REOUCE
WIDTH
THAT
MUCH
MOV
WIOTH!BP!SI,DX
TEST
OX,DX
JLE
JDONE
;NO
BLT
IF
WIDTH
OR
HEIGHT
.LE. 0
SUB
S1,HOESY-DESX
;Now
S1
-)
x and
width
JZ
YTHENX
;BACK
AGAIN
TO
DO·
THE
X'S
1*
CALCULATE
SKEW
FROM
X'S
MOV
AX,SRCX!BP
MOV
OX,DESX!BP
SUB
AX,DX
AND
AX,HOF
MOV
SKEW!BP,AX
;skew =
(sourcex-destx)
&
15
1*
SET
SUB
MOV
CLD
MOV
MOV
AND
MOV
SUB
MOV
SHL
SEG
MOV
MOV
ADD
DEC
AND
MOV
SUB
SHL
SEG
MOV
NOT
MOV
UP
1NCS
AND
MASKS
ASSUMING
NO
OVERLAP
AX,AX
;zero
HBAK!BP,AX
VBAK!BP,AX
AX,DX
AX,HOF
BX,HI0
BX,AX
;normal r
to
1
(-1
means
back)
;same
for
hardware
direction
flag
;normal
top-to-bottom
STARTBITS!BP,BX
;startbits~
16-(destx&15)
[1-16]
BX
;WORO
INDEX
CS
AX,MASKTAB!BX
MASK1!BP,AX
OX,WIOTH!BP
OX
OX,HOF
BX,HOF
;mask1~
MASKS!STARTBITS
BX,DX
BX
;WORO
INDEX
CS
AX,MASKTAB!BX
AX
MASK2!BP,AX
;mask2 =
NOT
MASKS!
(15-{destx+width-l)
1*
CHECK
FOR
POSSIBLE
OVERLAP
OF
SOURCE
AND
DEST
Z-IOP.ls
0320
8B
46
04
0323
3B
46
1C
0326
75
OB
0328
8B
46
02
032B
3B
46
1A
032E
75
03
0330
E8
3A
02
0333
8B
4E
36
0336
85
C9
0338
74
16
033A
8B
5E
22
0330
81
E3
OF
00
0341
2B
CB
0343
FF
C9
0345
01
C1
0347
81
El 01 00
034B
03
4E
3A
034E
01
El
0350
89
4E
4C
0353
8B
4E
26
0356
81
El
OF
00
035A
89
4E
26
0350
8B
Fl
035F
01
E6
0361
2E
0362
88
84
18 02
0366
89
46
52
0369
81
E6
06
00
0360
2E
036E
8B
84 38
02
0372
89
46
56
0375
83
F9
08
0378
7C
00
037A
83
F9
OC
037D
7e
05
037F
C7
46
4C
00 00
0384
E8
9F
01
0387
8B
46
OE
038A
2B
46
34
0380
FF
C8
038F
70
OE
0391
8B
4E
40
0394
21
4E
3E
0397
C7
46
40
00
00
039C
B8
FO
FF
039F
01
F8
03Al
01
F8
03A3
01
F8
03A5
01
F8
03A7
05
02
00
03AA
89
46
50
03AD
BE
18
00
03BO
8B
46
4C
03B3
25
02
00
03B6
01
E8
03B8
03
46
50
03BB
8B
56
3A
03BE
F7
02
03CO
33
C2
03C2
2B
C2
03C4
8B
4A
08
03C7
8B
5A
06
03CA
2B
09
03CC
8B
56
3C
03CF
33
CA
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
20-Jun-79
10:23:38
Page 10
MOV
AX,OESSEG!BP
CMP
AX,SRCSEG!BP
JNE
NOLAP
MOV
AX,OESBYTE!BP
CMP
AX,SRCBYTE!BP
JNE
~JOLAP
CALL
OlAP
,
1*
CALCULATE
PRELD
(NEED
FOR
EXTRA
INITIAL
WORD
OF
SOURCE)
NOLAP:
MOV
CX,SKEW!BP
TEST
CX
,CX
JZ
SPRELO
MOV
BX,SRCX!BP
AND
BX,NOF
SUB
CX,BX
DEC
CX
ROL
CX
AND
CX,N1
;=0
if
skew
gr
(sourcex&15)
else
1
ADD
CX,HBAKIBP
;=0
if
above
XOR
hbak=O
SHL
CX
;
el
se
= +-2 dep
on
hbak
SPRELD:
MOV
PRELD!BP,CX
GRAYP:
CNW:
SNW:
STHEND:
1*
SET
MOV
AND
MOV
MOV
SHL
SEG
UP
SOURCES,
OPS,
AND
GRAYS
IF
NECESSARY
CX
,FUNC!
BP
CX,NOF
FUNC!BP,CX
SI,CX
SI
;FUNC
INDEXES
WORD
OF
TABLE
CS
MOV
AX,SOURCES!SI
MOV
SRCN!BP,AX
AND
SI,#6
;OP
INDEXES
OPS
SEG
CS
MOV
AX,OPS!SI
MOV
OPN!BP,AX
CMP
CX,#BRUSHFUNC
JL
CNW
;NO
GRAY
NEEDED
CMP
CX,NCONSTFUNC
JL
MOV
CALL
GRAYP
PRELD!BP,N#O
GRAYPREP
;NO
PRELOAD
FOR
CONST
SOURCE
;PREPARE
4-WORD
TABLE
OF
GRAYS
1*
CALC
MOV
NWORDS
(no.
words
AX,WIDTH!BP
stored),
MERGE
MASKS
IF
NEG
SUB
DEC
JGE
MOV
AND
MOV
MOV
SAR
SAR
SAR
SAR
ADD
MOV
AX,
ST
ARTB
ITS!
BP
AX
SNW
CX,MASK2!BP
MASKl!BP,CX
MASK2!BP,##0
AX,N-I0
AX
AX
AX
AX
AX,N2
NWORDS!BP,AX
;IF
WIDTH<STARTBITS,
;THEN
MASKI
=
MASKI
.AND.
MASK2
;
AND
MASK2
= 0
;
AND
MAKE
NWOROS=1
;NWORDS
=
2+
(WIDTH-STARTBITS-1}/16
1*
CALC CORE
INCREMENTS
BETWEEN
SCAN
LINES
SI
offset
=SRC-DEST
for
SRC,
=0
for
DEST
in
this
section:
The
operations
XOR,SUB
cause
conditional
NEG
when
used
with
the
0/-1
flags
in
HBAK,VBAK
in
this
section
MOV
SI,NSRCRAST-DESRAST
;SI
-)
src
first
MOV
AX,PRELD!BP
;0
OR
+-2
AND
AX,#2
;0
OR
2
SHR
AX
;=1
IFF
PRELOAD
FOR
SOURCE
ADD
AX,NWORDS!BP
;AX=
NWORDS+(PRELOAD
if
source)
MOV
DX,HBAK!BP
NOT
OX
XOR
AX,DX
SUB
AX,DX
;(Negate
NWORDS
expr
if
left-to-right)
MOV
CX,OESFLD!BP!SI
;CX
FLO
MOV
BX,DESRAST!BP!SI
SUB
BX,CX
;BX
=
RAST-FLD
MOV
OX,VBAK!BP
XOR
CX,OX
Z-IOP.ls
0301
2B
CA
0303
33
OA
0305
28
OA
0307
03
08
0309
03
C8
030B
33
52
OC
030E
33
56
10
03El
F7
C2
01 00
03E5
74
02
03E7
87
09
03E9
01
E3
03E8
01
El
03EO
89
5A
2A
03FO
89
4A
2C
03F3
89
5A
2E
03F6
89
4A
30
03F9
8B
42
OC
03FC
8B
C8
03FE
81
El
01 00
0402
F7
09
0404
23
4A
08
0407
01
F8
0409
F6
62
06
040C
03
Cl
040E
88
52
OA
0411
01
FA
0413
D1
FA
0415
01
FA
0417
01
FA
0419
03
C2
0418
D1
EO
0410
03
42
02
0420
89
42
32
0423
2B
CO
0425
83
EE
18
0428
74
8E
042A
8B
5E
36
0420
01
E3
042F
2E
0430
8B
87
62
02
0434 89
46
54
0437
F7
DB
0439
81
E3
1E
00
0430
2E
043E
88
87
40
02
0442
74
03
0444 33
46
3A
0447 89
46
38
044A
8E
5E
lC
0440
8E
46
04
0450
8B
4E
4A
0453
8B
7E
32
0456
8B
76
10
0459 81
E6
03 00
0450
01
E6
045F
EB
18
0461
8B
CE
0463 88
76
10
0466
FF
CE
0468
7E
60
046A
89
76
10
0460
81
E6
03
00
0471
01
E6
0473
03
7A
2A
0476
03
4A
42
0479
8B
42
58
047C
89
46
28
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
20-Jun-79
10:23:38
Page
11
SUB
XOR
SUB
ADD
ADD
XOR
XOR
TEST
JZ
EXCHG
CX,DX
;(Negate
both
if
bot-to-top)
BX,DX
BX,OX
BX,AX
;Now
BX,
CX
=
even,
odd
deltas
CX,AX
; =
+-FLO
expr
+-NWORDS
expr
DX,DESY!BP!SI
PARITY
OF
VBAK,
STARTING
Y
DX,HEIGHT!BP
AND
STARTING
VCOUNT
(+1)
DX,#l
DETERMINE
STDELS
WHETHER
TO
SWITCH
ODD,
EVEN
BX,CX
STDELS:
SHL
SHL
MOV
MOV
MOV
MOV
BX
;THESE
DELTAS
ARE
IN
WORDS
CX
DESDEL+O!BP.!SI,BX
DESDEL+2!BP!SI,CX
DESDEL+4!BP!SI,BX
DESDEL+6!BP!SI,CX
SSKM:
,
VLOOP:
VL1:
MOV
MOV
AND
NEG
AND
SAR
MUL
ADD
MOV
SAR
SAR
AX,DESY!BP!SI
;1*
CALC
INITIAL
CORE
ADDRS
CX,AX
;STARTING
Y
CX,#l
CX
CX,DESFLD!BP!SI
;CX~
0 IF
EVEN,
FLD
IF
ODD
AX
DESRAST!BP!SI
;
Y/2
*
RASTER
AX,CX
; +
FIELD
LENGTH
IF
Y
WAS
ODD
DX,DESX!BP!SI
OX
DX
SAR
OX
SAR
OX
;
PLUS
STARTING
X I 16
ADD
AX,DX
SHL
AX
;
WORD
ADDRESS
ADD
AX,DES8YTEIBP!SI
MOV
DESWA!BP!SI,AX
;STARTING
MEMORY
ADDRESS
SUB
AX,AX
;NO
PRELOAD
FOR
DEST
SUB
SI,#SRCRAST-DESRAST
;SI
now
-)
destination
JZ
STHEND
;BACK
TO
DO
OEST
SET
UP
SHIFT
AND
MASK
FROM
TABLES
INDEXED
BY
SKEW
MOV
BX,SKEW!BP
;SKEW=
0,1,
...
,15
SHL
BX
;WORD
INDEX
(*2)
SEG
CS
MOV
AX,SHIFTTABLE!BX
;SKEW
SHIFT
DISPATCH
MOV
SHIFTS!BP,AX
NEG
BX
AND
BX,#lE
0,15,
...
,1
(*2)
SEG
CS
MOV
AX,MASKTAB!BX
JZ
SSKM
;ZERO
SKEW
IGNORES
DIRECTION
XOR
AX,HBAK!BP
;COMP
MASK
IF
BACKWARDS
MOV
SKMSK!BP,AX
MOV
MOV
MOV
MOV
MOV
AND
SHL
J
DS,SRCSEG!BP
ES,DESSEG!BP
CX,SRCWA!BP
DI,DESWA!BP
SI,HEIGHT!BP
SI,#3
SI
VL1
;
load
seg
reg s
;SOURCE
MEMORY
ADDRESS
;DEST
MEMORY
ADDRESS
1*
VERTICAL
LOOP
FOR
EACH
SCAN-LINE
*1
1*
SETUP
MOV
CX,SI
;STACHE
CX
WHILE
SI
INDEXES
Y
MOD
4
MOV
SI,HEIGHT!BP
DEC
SI
JLE
DONE
MOV
HEIGHT!BP,SI
AND
SI,#3
;MOD
4
SHL
SI ;
WORD
INDEX
ADD
Dl,DESDEL!BP!SI
ADD
CX,SRCDEL!BP!SI
MOV
AX,GRAYS!BP!SI
MOV
GRAY!BP,AX
Z--IOP.ls
20-Jun-79
10:23:38
Page 12
047F
8B
F1
356
MOV
SI,CX
0481
8B
14
357
MOV
DX,O!SI
0483
03
76
4C
358
ADD
SI,PRELD!BP
;0
OR
+-2
0486
8B
5E
50
359
MOV
BX,
NWORDS!
BP
360
361
now
DS.SI
-)
source,
and ES.DI
-)
destination,
and
DF=d
i r
362
AX
THE
SOURCE
DATA
TO
BE
STORED
363
BX
=
HORIZ
WORD
COUNT
364
DX
=
WORD2
-
THE
OTHER
SOURCE
BITS
FOR
WORD-STRADDLING
365
366
1*
INITIAL
FRINGE
0489
FF
56
52
367
CALLI
SRCN!BP
048C
8B
4E
3E
368
MOV
CX,
MASK
1!
BP
048F
23
C1
369
AND
AX,CX
;MASK
UNDER
MASK1
0491
F7
01
370
NOT
CX
0493
26
371
SEG
ES
0494
23
00
372
AND
CX,O!DI
0496
OB
C1
373
OR
AX,CX
0498
AB
374
STOW
0499
FF
CB
375
DEC
BX
049B
74
C4
376
JZ
VLOOP
0490
FF
CB
377
DEC
BX
049F
74
24
378
JZ
HLAST
04A1
8B
4E
26
379
MOV
CX,
FUNC!
BP
04A4
83
F9
OC
380
CMP
CX,UUCONSTFUNC
04A7
74
15
381
JE
BLKS
04A9
OB
4E
36
382
OR
CX,SKEW!BP
04AC
74
OA
383
,J7
RIT
384
385 ;
i*
FULL
WORDS
IN
MIDDLE
(IF
ANY)
04AE
FF
56 52
386
HLOOP:
CALLI
SRCN!BP
04B1
AB
387
STOW
;
STORE
U~JMASKED
04B2
FF
CB
388
DEC
BX
04B4
7F
F8
389
JG
HLOOP
04B6
EB
00
390
J
HLAST
391
;
04B8
8B
CB
392
BLT:
MOV
CX,BX
;SPECIAL
CASE
OF
UNSKEWED
COPY
04BA
F2
393
REP
; 8086
BLOCK
TRANSFER
0488
A5
394
MOVW
04BC
EB
07
395
J
HLAST
396
;
04BE
8B
46
28
397
BLKS:
MOV
AX,GRAY!BP
;SPECIAL
CASE
OF
STORE
CONST
04C1
8B
CB
398
MOV
CX,BX
04C3
F2
399
REP
; 8086
BLOCK
STORE
04C4
AB
400
STOW
401
402
;
1*
FINAL
FRINGE
(IF
ANY)
04C5
FF
56 52
403
HLAST:
CALLI
SRCN!BP
04C8
8B
4E
40
404
MOV
CX,MASK2!BP
04CB
23
C1
405
AND
AX,CX
;MASK
UNDER
MASK2
04CD
F7
Dl
406
NOT
CX
04CF
26
407
SEG
ES
04DO
23
00
408
AND
CX,O!DI
0402
OB
C1
409
OR
AX,CX
04D4
AB
410
STOW
0405
EB
8A
411
J
VLOOP
412
;
0401
1F
413
DONE:
POP
OS
;RESTORE
DATA
SEGMENT
04D8
50
414
POP
BP
04D9
83
C4
60
415
ADD
SP
,UfHEMPS
04DC
C3
416
RET
417
418
419
;
I*HERE
ARE
THE
FOUR
SOURCES
0400
E8
27
00
420
SRCO:
CALL
SOURCE
1*
WINDOW
04EO
FF
66
56
421
JMPI
OPN!BP
422
,
04E3
E8
21
00
423
SRC1
:
CALL
SOURCE
1*
NOT
WINDOW
04E6
F7
DO
424
NOT
AX
04E8
FF
66
56
425
JMPI
OPN!BP
426
;
04E8
E8
19
00
427
SRC2:
CALL
SOURCE
; 1*
WINDOW
.AND.
GRAY
04EE
8B
C8
428
MOV
CX,AX
04FO
F7
01
429
NOT
CX
04F2
23
46
28
430
AND
AX,GRAY!BP
;BLACK
-)
GRAY
04F5
26
431
SEG
ES
Z-IOP.ls
04F6
23
00
04F8
OB
Cl
04FA
Ff
66
56
04FD
8B
46
28
0500
FF
66
56
0503
8B
46
28
0506
C3
0507
8B
4E
38
050A
23
01
050C
F7
01
050E
AD
050F
23
C8
0511 92
0512
OB
Cl
0514
FF
66
54
0517
C3
0518
26
05i9
08 05
051B
C3
051C
26
0510 33
05
05lF
C3
0520
F7
DO
0522
26
0523
23
05
0525
C3
0526
8B
46
28
0529
8B
56
3C
052C
8B
08
052E
23
DA
0530
81
E3
OF
OF
0534 32
FB
0536
8A
OF
0538
33
C3
053A
8B
4E
OC
0530 33
CA
053F
2B
CA
0541
03
4E
10
0544
FF
Cl
0546 81 El
03
00
054A
01 El
054C
01 El
054E
03
CO
0550
BE
06 00
0553
B9
04 00
0556
8A
F4
0558
03
CO
055A
8A
00
055C
81
E2
OF
FO
0560
OA
F2
0562
8A
06
0564 89
52
58
0567 83
EE
02
056A
70
EA
056C
C3
0560
8B
46
OC
0570
8B
5E
24
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
46i
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
20-Jun-79
10:23:38
Page
13
,
SRC3:
,
AND
OR
JMPI
MOV
JMPI
CX,OIOI
AX,ex
OPN!BP
AX,GRAY!BP
OPN!BP
;WHITE
-)
TRANSPARENT
1*
CONSTANT
(GRAY)
SRC30PO:
MOV
RET
SRCOOPO:
AX,GRAY!BP
1*
OPTIMIZED
STORE
CONST
;
1*
OPTIMIZED
MOVE
(FALLS
THRU
SOURCE!)
SOURCE:
,
OPO:
OPl
:
,
OP2:
,
OP3:
,
SOURCE
MOV
AND
NOT
lODW
AND
EXCHG
OR
JMPI
BITRECT
CX,SKMSKIBP
DX,CX
;WORD2
.AND.
SKEWMASK
ex
eX,AX
;NEXT
WORD
.AND.
(NOT
SKEWMASK)
AX,DX
;
(STASHES
NEW
WORD2
IN
OX)
AX,ex
;COMBINE
TWO
PARTS
INTO
AX
SHIFTS!BP
;fast
ROlV
AX
by
SKEWIBP
MOV
CX,SKEW!BP
ROlV
AX
RET
I*HERE
ARE
THE
FOUR
OPERATIONS
RET
1*
SOURCE
[MOVE]
SEG
ES
OR
AX,OiDI
i*
SOURCE
.OR.
DEST
[MERGE]
RET
SEG
XOR
RET
NOT
SEG
AND
RET
ES
AX,OIDI
1*
SOURCE
.XOR.
DEST
[XOR]
AX
1*
(NOT
SOURCE)
.AND.
DEST
[ERASE]
ES
AX,OIDI
GRAYPREP:
MOV
AX,GRAY!BP
;PICK
UP
THE
GRAY
WORD
MOV
DX,VBAK!BP
MOV
BX
,AX
AND
BX,DX
AND
BX,##OFOF
XOR
BH,Bl
MOV
BL,BH
XOR
AX,BX
MOV
CX,DESY!BP
XOR
CX
,OX
;ONLY
IF
VBAK=-l
;WIlL
THESE
5
INSTRS
;
INVERT
THE
GRAY
;FROM
A-B-C-D
TO
A-D-C-B
SUB
CX,DX;
+-
STARTING
Y,
DEP
ON
VBAK
ADD
CX,HEIGHT!BP
INC
CX
;FUDGE
AND
CX,#3
N
~
(HEIGHT
+-
STARTING
Y)
MOD
4
SHl
CX
SHL
ex
ROlV
AX
ROT
BY
N
NIBBLES
TO
ALIGN
"SEAMS"
;
NOW
EXPAND
EACH
NIBBLE
TO
A
FULL
WORD
AND
STORE
IN
THE
4
GRAY
WORDS
MOV
SI,#6
MOV
CX,#4
EXLP:
MOV
DH,AH
;
AX
WAS
A-B-C-D
ROLV
AX
MOV
DL,AL
AND
DX,##OFOOF
OR
DH,DL
MOV
DL,DH
;
DX
NOW
A-A-A-A
MOV
GRAYS!BP!SI,DX
SUB
SI,#2
;ORDER
IS A-B-C-O
INTO
3-2-1-0
JGE
EXLP
RET
, 1*
SPECIAL
SETUP
FOR
HORIZ
AND
VERTICAL
OVERLAP
OlAP:
MOV
AX,DESY!BP
MOV
BX,SRCYIBP
Z-IOP.ls
0573
3B
C3
0575
7C
OC
0577
7F
34
0579
8B
4E
OA
057C
8B
56
22
057F
3B
CA
0581
7F
01
0583
C3
0584
C7
46
3A
FF
FF
0589
FD
058A
8B
46
OE
0580
FF
C8
058F
03
C8
0591
89
4E
OA
0594
03
DO
0596
89
56
22
0599
8B
Cl
059B
25
OF
00
059E
FF
CO
05AO
89
46
34
05A3
8B
46
3E
05A6
87
46
40
05A9
89
46
3E
05AC
C3
05AO
C7
46
3C
FF
FF
05B2
8B
4E
10
0585
H
C9
05B7
03
Cl
0589
89 46
OC
05BC
03
09
05BE
89
5E
24
05Cl
C3
05C2
01
CO
05C4
01
CO
05C6
01
CO
05C8 01
CO
05CA
C3
05CB
01
C8
05CO
01
C8
05CF
01
C8
0501
86
0502
C4
0503
C3
0504
01
CO
0506
01
CO
0508
01
CO
050A
86
050B
C4
050C
C3
0500
01
C8
050F
01
C8
05El
01
C8
05E3
01
C8
05E5
C3
004A
0160
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
561
568
24
25
1
2
3
4
5
6
1
8
9
10
11
12
13
20-Jun-79
10:23:38
Page
14
CMP
JL
JG
MOV
MOV
CMP
JG
AX,BX
EASY
;
VERT
VOLAP
;VERT
CX,DESX!BP
OX,SRCX!BP
CX,DX
HOLAP
DIR
IS
NORMAL
AND
NON-ZERO
IS
BACKWARD
;VOElTA=O,
BETTER
CHECK
HDIR
EASY:
RET
;HORIZ
IS
NORMAL
HOLAP:
MOV
HBAK!BP,##-1
;HORIZ
BACKWARD
(RIGHT-TO-LEFT)
;SAME
FOR
HARDWARE
DIR
STD
MOV
DEC
ADD
MOV
ADD
MOV
MOV
AND
INC
MOV
MOV
EXCHG
MOV
RET
AX,WIOTH!BP
AX
;WIOTH-l
CX,AX
OESX!BP,CX
;MOVE
STARTING
Xs
TO
RIGHT
SIDE
OX,AX
SRCX!BP,DX
AX,CX
AX,#OF
AX
STARTBITS!BP,AX
;STARTBITS~
(DESTX&15)+1
[1-16]
AX,MASK1!BP
;EXCHANGE
THE
MASKS
AX
,MASK2
!BP
MASKl!
BP
,AX
VOLAP:
MOV
VBAK!BP,##-l
;VERT
BACKWARD
(BOTTOM-TO-TOP)
,
SH4:
SH3:
SH2:
SHl :
SHO:
SH5:
SH6:
SH1
:
SH8:
SH11 :
SHI0:
SH9:
SH12:
SH13:
SH14:
SH15:
ukb
rq=
sa=
CX,HEIGHT!BP
ex
AX,CX
MOV
DEC
ADD
MOV
ADD
MOV
RET
DESYi
BP,
AX
BX,CX
SRCY!BP,BX
;MOVE
STARTING
Ys
TO
BOTTOM
1*
OPTIMUM
8086
SHIFT
ROUTINES:
ROl
AX
;SHIFTS
0-4
ROl
AX
ROL
AX
ROl
AX
RET
AX
AX
AX
;SHIFTS
5-8
ROR
ROR
ROR
86
OC4
RET
.**
HAND
ASSEMBLY
OF:
ROl
ROL
ROL
86
OC4
RET
ROR
ROR
ROR
ROR
RET
.**
AX
AX
AX
.**
.**
AX
AX
AX
AX
EXCHG
AH,AL
;SHIFTS
9-11
HAND
ASSEMBLY
OF:
EXCHG
AH,AL
;SHIFTS 12-15
.Get
"Z-Subs.bca"
;misc.
subroutines
Z-Subs.bca
This
file
contains
miscellaneous
subroutines
to
be
called
from
Smalltalk
(in
the
interim)
or
from
other
routines
resident
in
rom.
Author:
Bruce
Horn
Last
changed:
May
7,
1919
12:32
AM
BltOld,
BltNew
are
in
DoCursor.bca
4A
;request
keyboard
data
160
;starting
address
port,
CRT
Z-IOP.ls
20-Jun-79
10:23:38
Page
15
14
Retrace:
05E6 Al 36
21
15
mov
ax,OisplayBits
;get
byte
address
and
segment
of
05E9
8B
1E
38 21
16
mov
bx,DisplayBits+2
;bitmap/cursor
table
05ED
01
E8
17
shr
ax
05EF
01
E8
18
shr
ax
05F1 01
E8
19
shr
ax
;divide
byte
adr
by 8
05F3 01
E3
20
shl
bx
;multiply
segment by 2
05F5
03
C3
21
add
ax,bx
;then
add
the
terms-)19bits/3
05F7
BA
60
01
22
mov
dx,Dsa
;
starting
address
port
05FA
EF
23
outdw
05FB
C3
24
ret
;return
to
caller
25
26
WaitASecond:
05FC
B9
05
00
27
mov
cx,D5
05FF
B8
FO
7F
28
mov
ax,D7FFO
29
LP1:
0602
FF
C8
30
dec
ax
0604
75
FC
31 j nz
LP1
0606
B8
FO
7F
32
mov
ax,D7FFO
0609
E2
F7
33
loop
LP1
060B
C3
34
ret
35
36
37
IntsOff:
060C
BA
02
00
38
mov
dx,Docwl
;get
old
mask
060F
EC
39
ind
0610
2E
40
seg
cs
0611
A3
01\
10
41
mrHl
IRR,ax ;
save
whole word
(nnl"
~l
~
in'
\
~"
'.I
~.
-
~
J
0614
BO
FF
42
mov
al
,DOFF' ;mask
off
all
interrupts
0616
EE
43
outd
0617
C3
44
ret
45
46
IntsOn:
0618
2E
47
seg
cs
0619
A1
OA
10
48
mov
ax,IRR
;get
old
interrupt
mask
061C
BA
02
00
49
mov
dx,Docw1
061F
EE
50
outd
;send
a1
out
to
port
2 and
0620
C3
51
ret
;restore
i
nte
rrupts
52
53
54 D i sp 1
ayOff:
0621
B8
00
00
55
mov
aX,DO
0624
BA
54
01
56
mov
dx,
D154
;reset
display
controller
0627
EE
57
outd
0628
C3
58
ret
59
60
Disp1ayOn:
0629
B8
00
00
61
mov
aX,DO
062C
BA
5C
01
62
mov
dx,D15C
062F
EE
63
outd
;start
CRT
timing
chain
0630
C3
64
ret
65
66
Wa
itBug:
0631
2E
67
seg
cs
0632
A1
18
20
68
mov
ax,KbdStatus
;get
keyboard
status
0635
3C
00
69
cmp
al,DO
;are
mouse
buttons
zero?
0637
74
F8
70
je
Wa
itBug
;yes,
try
again,
otherwise
0639
C3
71
ret
;return
to
caller
72
73
WaitNoBug:
063A
2E
74
seg
cs
063B
Al 18
20
75
mov
ax,KbdStatus
063E
3C
00
76
cmp
al,DO
0640
75
F8
77 j ne WaitNoBug
;If
any
buttons
down,
loop
0642
C3
78
ret
79
80
ShowNewCu
rso
r:
0643
2E
81
seg
cs
0644
A3
20
10
82
mov
RO,ax
;save
source
bitmap
0647
E8
63
00
83
call
HideCursor
;hide
old
cursor
064A
2E
84
seg
cs
064B
Al
20
10
85
mov
ax,RO
;restore
source
bitmap
064E
2E
86
seg
cs
064F
A3
4E
21
87
mov
CursorBits,
ax
;new
source
byte
address
0652
E8
6B
00
88
call
ShowCursor ;show
new
cursor
0655
C3
89
ret
z -
rop.
1 s
0656 89 00 00
0659
EB
16
0658
B9
01
00
065E
EB
11
0660
B9
02 00
0663
EB
OC
0665
OC
10
0667
00
01
0669
OE
10
0668
60
00
0660
10 10
066F
20
00
0671 01
El
0673 01 El
0675
8B
Fl
0677
8B
CB
0679
2E
067A
8B
Be
65
06
067E
2E
067F
23
iO
0681
01
E9
0683
73
04
0685
01
EO
0687
EB
F8
0689
OB
C3
0688
2E
068C 89 05
068E
FF
C6
0690
FF
C6
0692
2E
0693
8B
94 65
06
0697
EF
0698
C3
0699
8B
OC
0698
FF
C6
0690
FF
C6
069F 88 14
06Al
FF
C6
06A3
FF
C6
06A5
8A
04
06A7
EE
06A8
FF
C6
06AA
E2
F3
06AC
C3
06AO
88
FF
FF
0680
2E
06Bl 38 06 62
21
0685
75
01
0687
C3
06B8
2E
0689
A3
62
21
06BC
E8
16
03
068F
C3
20-Jun-79
10:23:38
Page
16
90
91
SetPI00:
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
mov
cX,#O
j
SetPort
SetP60:
mov
cx,#1
j
setPort
SetP20:
mov
cx,#2
j
SetPort
Ports:
.adr
Port100
.adr
100
.adr
Port60
.
adr
60
.adr
Port20
.
adr
20
;ax=bits
(right
justified),
bx=field
spec,
cx=port
offset
SetPort:
NS:
so:
shl
shl
mov
mov
seg
mov
seg
and
shr
jnc
shl
j
or
seg
mov
inc
inc
seg
mov
outdw
ret
cx
cx
s
i,
cx
cX,bx
cs
di
;Ports!si
cs
bX,O!di
cx
SO
ax
NS
aX,bx
cs
O!di,ax
si
si
cs
dX,Ports!si
;point
to
correct
place
in
table
;offset
in
table
;move
field
definition
into
cx
;di
is
address
of
Portl00/60/20
;and
bx,
PortIOO/60/20
;shift
field
def
by 1
; sh
1ft
done
;shift
bits
left
1
;or
in
new
bits
;save
new
Portl00/60/20
;next
number in
table
;OS,S1
pOint
to
table
for
initialization
of
display
in
i tOC:
mov
inc
inc
Param:
mov
inc
inc
mov
outd
inc
loop
ret
cX,Olsi
si
si
dX,O!si
si
si
al,O!si
si
Param
;blts
out,
locks
cursor
HideCursor:
mov
seg
cmp
jne
ret
HideIt:
seg
mov
call
ret
aX,#OFFFF
cs
aX,CursorLock
Hide1t
cs
CursorLock,ax
8ltOld
;blts
in,
unlocks
new
cursor
;initialize
display
controller
;length
of
table
is
first
word
;get
port
of
store
;and
get
value
;send
al
out
to
port,
then
;increment
si
for
next
word
;and
get
next
;
return
;is
it
already
locked?
;already
hidden
;lock
it
;Blt
out
old
cursor
Z-IOP.ls
166
06CO
B8
00
00
161
06C3
2E
168
06C4
3B
06
62
21 169
06C8
75
01 170
06CA
C3
171
172
06C8
E8
10
03
173
06CE
2E
174
06CF
C7
06
62
21
00
00 175
0605
C3
176
177
178
179
180
0606
BO
00 181
0608
E6
4A
182
060A
C7
06
12
10
00
00 183
06EO
C3
184
004E
0016
0048
0001
0005
06E1 09 00
06E3
40
01
06E5
5F
06E6 42 01
06E8
F2
06E9 44 01
06E8 70
06EC
46 01
06EE
10
06EF 48 01
06F1 04
06F2
4A
01
06F4 10
06F5 54 01
06F7 00
06F8
5A
01
06FA
1E
06FB
5C
01
06FD
00
06FE
FC
06FF
BA
00
00
0702
B8
13
00
0705
EE
0706
BA
02
00
0709
B8
20
00
070C
EE
0700
B8
00
00
0710
EE
0711
B8
FF
00
0714
EE
185
186
26
27
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
31
38
39
40
41
42
43
44
45
46
41
48
49
50
51
52
53
20-Jun-79
10:23:38
ShowCursor:
mov
sag
cmp
j
ne
ret
Showlt:
ax,nO
cs
ax,CursorLock
Showlt
is
it
already
shown?
keep
cursor
locked
a 1
ready
shown
call
BltNew
;Blt
in
new
cursor
seg
cs
Page
17
mov
CursorLock,##O
;allow
further
cursor
moves
ret
;begins
kbd
byte
transfer
tprough
uart
RdKbd:
mov
out
mov
ret
.END
al,HO
ukbrq
KbdOffset,##O
;Request
keyboard
data
;and
set
offset
to
zero
;let
interrupt
handle
bytes
.Get
"Z-IOlnit.bca"
;interrupt
inits
Z-IOlnit.bca
This
file
contains
the
I/O
initialization
code
for
the
display
and
kbd
Author:
Bruce
Horn
Last
changed:
May
2,
1979
9:00
AM
ureset=
ucbits=
uctrl=
TCGo=
CRT12Mhz=
OCParams:
.adr
.adr
.adr
.adr
.adr
.adr
.adr
.adr
.adr
.adr
101nit:
4E
16
48
1
5
9.
140
05F
142
OF2
144
010
146
010
148
004
14A
010
154
o
15A
OLE
15C
o
;reset
UART
;proper
bits
for
control
reg
;control
location
;Timing
chain
on
;Bit
clock
@
12
Mhz
;number
of
parameters
in
table
;0:
CharTimes/Horizontal
period
;1:
1=lnterlace
bit;CharTimes/HorizSync
;2:
80
chars/line;15+1
scans/char
;3:
00
skew;
30
dataRows/field-l
;4:
521
rasterScans/field
-513/2
;5:
delay
from
VSynch
to
first
data
row
;Reset
chip
;13:
cursor
line
30
;Start
timing
chain
cld
;clear
direction
;set
up
8259
for
interrupts,
but
don't
enable
interrupts
at
all
mov
mov
outd
mov
mov
outd
mov
outd
mov
outd
dX,Hic
ax,n13
dX,Hic+2
ax,H20
ax,HOO
ax,nOFF
;
ICWl
;single,
ic4
;
ICW2
;vector
begins
at
20*2 = 80
;ICW4,
is
an
8086,
buffered
mode
;mask
should
be
all
disabled
Z-IOP.ls
0715
B8
00
00
0718
E7
4E
071A
88
16
00
0710
E7
48
071F
BE
E1
06
0722
E8
74
FF
0725
B8
05
00
0728
BB
FF
Fl
072B
E8
28
FF
072E
B8
01 00
0731
BB
FF
OF
0734
E8
1F
FF
0737
BA
02
00
OT3A
EC
073B
24
EF
0730
24
BF
073F
EE
0740
2E
0741
A3
OA
10
0744
FB
0745
C3
0020
0042
004C
0746
50
0747
52
0748
53
0749
51
074A
56
074B
57
074C
1E
0740
06
074E
B8
00 00
0751
8E
08
0753
8E
CO
0755
FF
06 14
20
0759
E8
8A
FE
075C
E8
08 00
075F
E8
48 02
0762
E8
71
FF
0765
07
0766
1F
0767
5F
0768
5E
0769
59
076A
58
076B
BO
20
0760
BA
00
00
0770
FA
0771
EE
0772
5A
0773
58
077 4
F8
0775
CF
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
28
29
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
20-Jun-79
10:23:38
Page
18
mov
outw
mov
outw
mov
call
mov
mov
call
mov
mov
call
mov
ind
and
and
outd
seg
mov
sti
ret
ax
#0
ureset
ax,
Ducb
its
uctrl
s i ,#DCParams
in
itDC
ax,DCRT12Mhz
bx,DBitClk
SetP100
ax,DTCGo
bx,DGoWordClock
SetPI00
dx,#ocwl
al,#ir4
al,#ir6
cs
IRR,ax
;reset
the
uart
on kbd
;
load
ctrl
reg
;table
of
init
parameters
;Initialize
display
controller
;set
port
100
for
12mhz
clock
;field
specification
;timing
chain
begin
;field
specification
;and
set
port
100
;get
the
current
IRR
;enable
Oddlnt
; and
Kbdlnt
;send
it
outd
to
ocw1
;save
mask
in
IRR
;enable
interrupts
return
to
debugger
;Calls
SetPI00,
InitDC
(subs.bca)
.Get
~Z-FieldInts.bca"
;fieldlng
interrupts
Z-Fieldlnts.bca
This
file
contains
the
calls
on
the
interrupt
routines.
Author:
Bruce
Horn
Last
changed:
May
2,
1979
2:52
PM
eoi=
20
udatin=
42
u
rrda=
4C
;end
of
interrupt
;obtain
keyboard
data
;Reset
data
ready
on
UART
Oddlnt:
push
push
push
push
push
push
push
push
mov
mov
mov
incw
call
call
call
call
pop
pop
pop
pop
pop
pop
mov
mov
cli
outd
pop
pop
sti
i
ret
ax
dx
bx
cx
, s i
di
ds
es
ax,#CurrentOS
ds,ax
eS,ax
ICount
Retrace
EncodeKbd
OoCursor
RdKbd
es
ds
di
si
cx
bx
al,#eoi
dx,#ic
dx
ax
;14!sp
;12!sp
;10!sp
;8!sp
;6!sp
;4!sp
; 2!
sp
;O!sp
;increment
interrupt
count
;do
vertical
retrace
for
crt
;Interpret
kbd
bytes
;update
cursor
;start
fetching
new
kbd
bytes
;pop
all
registers
;except
ax,
dx
for
interrupt
;dismissal
;dismiss
interrupt
;
send
to
8259
;OON'T
service
interrupts
...
;
...
unt
il
now---all
safe
;pop
flags
on
return,
also
cs,ip
Z-IOP.ls
20-Jun-l9
10:23:38
Page
19
47
48
49
KbdInt:
0776 50
50
push
ax
0777 53
51
push
bx
0778 52
52
push
dx
0779 lE
53
push
ds
077A
B8
00 00
54
mov
ax,HCurrentOS
0770
8E
08 55
mov
ds,ax
077F
8B
1E
12
10 56
mov
bX,KbdOffset
0783
B8
OC
00
57
mov
ax,H12.
;if
greater
than
12,
don't
store
0786
3B
08 58
cmp
bx,ax
;next
byte,
otherwise
its
0788 70 10
59
jge
Fini
;ok
for
next
kbd
byte
078A
E4
42
60
in
udatin
;get
data
078C
88 87
2A
20
61
mov
KbdOata!bx,al
; low
byte
is
data
0790
FF
C3
62
inc
bx
0792 89
1E
12
10
63
mov
KbdOffset,bx
0796
BO
00
64
mov
al,HO
;store
it
0798
E6
4C
65
out
urrda
;Reset
DR
Ol9A
1F 66 Fin i : pop ds
;begin
restoring
registers
079B
BO
20
67
mov
al,Heoi
;tell
8259 end
of
interrupt
0790
BA
00
00
68
mov
dx,Hic
07AO
FA
69
cli
;Oon't
service
interrupts
...
07Al
EE
70
outd
07A2
5A
71
pop
dx
07A3
5B
72
pop
bx
07A4
58
73
pop ax
07A5
FR
74
sti
;until
now--all
safe
07A6
CF
75
i
ret
;interrupt
return
76
77
78
ParErrlnt:
07A7
B8
06
00
79
mov
aX,H6
07AA
BB
FO
FF
80
mov
bX,HLedsOn
07AO
E8
BO
FE
81
call
SetP20
07BO
E8
65
FE
82
call
IntsOn
07B3
E8
73
FE
83
call
OisplayOn
07B6
2E
84
seg
cs
07B7
Ai
A9
00 85
mov
ax
t
ErrorCuisor
07BA
E8
86
FE
86
call
ShowNewCursor
07BO
EB
FE
87
10: j
10
;stop
machine
88
89
IPSysInt:
07BF
B8
07
00
90
mov
aX,H7
07C2
BB
Fa
FF
91
mov
bX,HLedsOn
07C5
E8
98
FE
92
call
SetP20
07C8
E8
40
FE
93
call
1ntsOn
07CB
E8
5B
FE
94
call
OisplayOn
07CE
2E
95
seg
cs
07CF
Al
A9
00 96
mov
ax,
.
ErrorCursor
0702
E8
6E
FE
97
call
ShowNewCursor
0705
EB
FE
98 11: j
11
;stop
machine
99
100
OiskInt:
0707
B8
08
00
101
mov
aX,H8
070A
BB
FO
FF
102
mov
bX,HLedsOn
0700
E8
80
FE
103
call
SetP20
OlEO
E8
35
FE
104
call
1ntsOn
07E3
E8
43
FE
105
call
OisplayOn
07E6
2E
106
seg
cs
07E7 Al
A9
00 107
mov
ax,
.ErrorCursor
07EA
E8
56
FE
108
call
ShowNewCursor
07EO
EB
FE
109 12: j
12
;stop
machine
110
111 E1AInt:
07EF
B8
09
00 112
mov
aX,H9
07F2
BB
FO
FF
113
mov
bx,HLedsOn
07F5
E8
68
FE
114
call
SetP20
07F8
E8
10
FE
115
call
1ntsOn
07FB
E8
2B
FE
116
call
OisplayOn
07FE
2E
117
seg
cs
07FF Al
A9
00 118
mov
ax,
.ErrorCursor
0802
E8
3E
FE
119
call
ShowNewCursor
0805
EB
FE
120 13: j
13
121
122 AOCInt:
Z-1OP.ls
0807
B8
080A
BB
0800
£8
0810
E8
0813
E8
0816
2E
0817
Al
081A
E8
0810
EB
08lF
0822
0825
0828
0828
082E
082F
0832
0835
0003
2F7F
F86F
0080
0490
8000
0080
0080
0010
4000
0400
1000
0040
OOCO
0080
0020
B8
BB
E8
E8
E8
2E
Al
E8
EB
OA
00
FO
FF
50
FE
05
FE
13
FE
A9
00
26
FE
FE
OB
00
Fa
FF
Fa
FO
FE
FO
32
FE
A9
00
OE
FE
FE
**ady,
it
runs
in
a
wait
0837
C7
06
18
20
00
00
0830
AO
2C
20
0840
98
0841
01
06
lA
20
0845
AO
28 20
0848
98
0849
29
06
lC
20
0840
BB
02 00
0850
8B
87
1A
20
0854
8B
8F
22
20
0858
8B
97
IE
20
085C
03
CA
085E
3B
C1
0860
7F
OB
20-Jun-79
10:23:38
Page
20
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
30
31
1
2
:3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
loop.
34
mov
ax,DOA
mov
bx,DLedsOn
call
SetP20
call
1ntsOn
call
OisplayOn
seg
cs
mov
ax,
.ErrorCursor
call
ShowNewCursor
14: j 14
VSync1nt:
mov
ax,DOB
mov
bx,
DLedsOn
.
call
1ntsOn
call
OisplayOn
call
SetP20
seg
cs
mov
ax,
.ErrorCursor
call
ShowNewCursor
15: j
15
.ENO
.Get
"Z-EncodeKbd.bca"
;Encoding
keyboard
Z-EncodeKbd.bca
This
file
contains
the
keyboard
encoder
and
interrupt
key
handler
Author:
Bruce
Horn
last
Changed:
April
30,
1979
3:11
PM
;Other
useful
constants
WordZero=
3.
;The
following
are
META
;to
those
who
fool
with
ZeroMetaO= 02F7F
ZeroMetal=
OFB6F
OneMetaO=
00080
OneMeta1= 00490
MetaMB1=
8000
MetaMB2=
80
MetaMB3=
80
MetalS=
10
MetaRS= 4000
MetaC=
400
Metalock= 1000
OSShift=
64.
OSCTRl=
192.
OSLock=
128.
CBLength=
32.
;Beginning
of
actual
keyboard
words
key
bit
locations--STRANGE
things
happen
IvlET
A keys
--
;mask
off
msl,
rsh,
lock
and
ms3
;mask
off
ctrl,
ms2, and
lsh
;mask
on
..
.
;mask
on
..
.
;
in
word a
;
in
word 1
;
in
word 0
;
in
word 1
;
in
word 0
;
in
word 1
;
in
word 0
;offset
for
shift
key down, and
for
;control
down--add
for
control+shift
;offset
for
lock
down
ONLY
;length
of
circular
buffer,
in
words
;The
following
uart/read
loop
will
ultimately
be
interrupt-driven
;by
the
uart
itself.
Currently
it
tests
the
uart
status,
and
if
not
re
35
EncodeKbd:
36
mov
37
mov
38
cbw
39
add
40
mov
41
cbw
42
sub
43
mov
44
YTX:
45
mov
46
mov
47
mov
48
add
49
cmp
50
jg
KbdStatus,##O
al,MXOelta
MouseX,ax
al,MYOelta
MouseY,ax
bx,D2
ax,MouseX!bx
cx,RMW!bx
dx,RMX!bx
cx,dx
ax,cx
OOBC
;clear
mouse
buttons
at
beginning
;get
x
delta
from
read
;for
add,
convert
to
word
;and
add
delta
;get
mouse Y
byte
;for
sub,
convert
to
word
;and
sub
delta
(y
backwards!)
;do
bounds
checking
on mouse
;first
MouseY
then
MouseX
;first
RMH
then
RMW
;first
RMY
then
RMX
;
for
corner
;is
MouseY> ClipH?
;yes,
Out
of
Bounds
CX
Z-IOP.ls
20-Jun-79
10:23:38
Page
21
0862
3B
C2
51
cmp
ax,dx
;
is
MouseY
<
Cl
ipY?
0864
7C
00
52
jl
OOBO
;yes,
Out
Of
Bounds
OX
53
N:
0866 83
EB
02
54
sub
bx,n2
;offset
zero,
now
0869
74
E5
55
jz
YTX
;go
do
X's
086B
EB
OC
56
j
FIB
;Forced
In
Bounds
57
OOBC:
0860
89
8F
lA
20
58
mov
MouseX!bx,cx
;force
upper
limit
in
MouseY/X
0871
EB
F3
59
j N
60
OOBO:
0873
89
97
lA
20
61
mov
r~ouseX!
bx,
dx
;force
lower
1
imit
in
MouseY/X
0877
EB
ED
62
j N
63
64
FIB:
;forced
in
bounds
0879
BA
00
00
65
mov
dx,nO ;0 means
no
META
keys
yet
087C
C7
06
06
10
00
00
66
mov
Offset,nnO
;offset
starts
at
0
0882
Al
20
20
67
mov
ax,KWO
;ax=KbdOata word 0
0885
8B
IE
2F
20
68
mov
bx,KWl ;bx=KbdOata word 1
69
0889
B9
80
DO
70
mov
cx,nOneMetaO
08SC
S5
C1
71
test
ax,cx
;are
any
META
keys
down
in
WO?
OSSE
74
21
72
jz
MetaWl
;No,
try
word 1
OS90
A9
00
SO
73
test
aX,nMetaMBl ;
is
it
mouse
button
1?
OS93
74
05
74
jz
Ml
; no,
try
next
OS95
SO
OE
lS
20
04
75
or
KbdStatus,U4
;turn
the
4
bit
on
76
Ml
:
OS9A
A9
00
40
77
test
aX,nMetaRS ;
is
it
right
shift?
0890
74
08
78
'7
M2
'n"
.)~
,'-_
...
OS9F
FF
C2
79
inc
dx
;say
META
key
down
08Ai
C7
06
06
iO
40 00 80
mov
Offset
,##OSSh
Ht
;make
offset
a
shift
Sl
M2:
OSA7
A9
SO
00
S2
test
ax,UMetaMB3 ;
is
mouse
button
3
down?
OSAA
74
05
83
jz
MetaWl
;no,
try
next
OSAC
SO
OE
18
20
01
S4
or
KbdStatus
,Ul
;and
a 1 in
the
status
word
S5
MetaWl
:
OSBI
B9
90
04
S6
mov
cx,#OneMetal
OSB4
S5
09
S7
test
bx,cx
;any
META
keys
down
in
this
word?
OSB6
74
23
S8
jz
TryLock
;nope,
go
to
end
08B8
F7
C3
10
00
89
test
bX,#ivietaLS ;
is
it
left
so
ift?
OSBC
74
OS
90
jz
M3
; no,
try
control
and
MS2
OSBE
FF
C2
91
inc
dx
;
inc
dx
for
shift
flag
OSCO
C7
06
06
10
40
00
92
mov
Offset,
#nOSSh
Ht
;put
sh
ift
offset
in
loc
93
M3:
OSC6
F7
C3
00
04
94
test
bX,UMetaC ;
is
it
control?
OSCA
74
OA
95
jz
M4
;
if
it
isn't,
it's
mouse
button
2
OSCC
FF
C2
96
inc
dx
;META
key
in
effect
OSCE
81
06
06
10
eo
00
97
add Offset,#nOSCTRL
;add
control
offset
OS04
EB
05
9S
j TryLock ;now
see
if
we
can
do
ShiftLock
OS06
80
OE
18
20
02
99
M4:
or
KbdStatus,#2
;
MS2,
and
the
two
bit
in
100
101
TryLock:
080B
S3
FA
00
102
cmp
dx,nO ;
is
any
other
META
key
down?
080E
75
OB
103
jne
EndMetaKeys
;Yes,
ignore
if
Lock
down
08EO
A9
00
10
104
test
aX,#MetaLock ;
is
Lock
down
by
itself?
08E3
74
06 105
jz
EndMetaKeys ; no,
overridden
by
other
METAs
08E5
C7
06
06
10
80
00
106
mov
Offset
,##OSLock
;yes,
put
lock
offset
in
location
107
lOS
EndMetaKeys:
08EB
25
7F
2F
109 and ax,UZeroMetaO
;zero
the
meta
bits
OSEE
81
E3
6F
FB
110 and bX,UZeroMetal
;in
both
words
OSF2
89
1E
2F
20
111
mov
KWl,bx
;put
it
back
OSF6
A3
20
20
112
mov
KWO,
ax ;
both
words
OSF9
C7
06
02
10
04
00
113
mov
Count,##4
;
loop
4
times
OSFF
C7
06
00
10
00
00
114
mov
BitsGone ,UNO
;start
with
zeroth
bit
0905
BE
03
00
115
mov
si
,#WordZero
;and
word
zero
116
NextWd:
0908
SB
S4
14
10
117
mov
aX,OldKbdOata!si
;g
et
the
data
from
UART
fetch
090e
SB
9C
2A
20
118
mov
bx,KbdData!si
;get
old
data
from
last
i
nt.
0910 33
C3
119
xor
aX,bx ;
xor
the
words,
then
1 and
in
new,
0912
23
C3
120 and aX,bx
;glvlng
l's=key
wldown
transition
0914
75
15
121
jnz
ProeessWord
;if
not
zero,
process
word
122
123
NewSetOfB
its:
0916 89
9C
14
10
124
mov
OldKbdData!si,bx
;save
kbd
word
in
old
table
091A
83
06
00
10 10
125 add B
itsGone,
#UI0
;add
10H
for
next
word
09lF
FF
C6
126
inc
si
Z-IOP.ls
20-Jun-79
10:23:38
Page
22
0921
FF
C6
127
inc
si
;increment
index
reg
0923
FF
OE
02
10
128 decw Count
;decrement
loop
count
0927
75
OF
129
jnz
NextWd
;and
loop
back
0929
EB
6F
130
j
EndKbd
;End
keyboard
handler
131
132
ProcessWord:
092B
C7
06 04
10
01
00
133
mov
Mask,DDl
;one
bit
on
0931
B9
10
00 134
mov
cX,DI0 ;
start
with
low
order
bit
135
NextBit:
0934
85
06 04
10
136
test
aX,Mask
;is
this
bit
a
1?
0938
74
57 137
jz
NewBit ; no,
get
the
next
bit
093A
8B
16
00
10
138
mov
dX,BitsGone
;get
word*16
as
bits
093E
03
01 139 add
dx,cx
;add
this
bit
number,--)index
0940
FF
CA
140
dec dx
;but
it's
off
by one
0942
03
16
06
10
141
add
dX,Offset
;add
the
offset
0946
8B
3E
OC
21
142
mov
d i
,NIChars
;how
many
interrupt
chars
094A
83
FF
00 143
cmp
di
,#0 ;
are
there
any
interrupts?
0940
EB
22
144
j EndIC
;no,
go
to
end
(was
je
EndIc)
094F
89
3E
08
10
145
mov
Templ,di
;save
it
in
Temp1
0953
BF
00 00 146
mov
di
,#0 ;
start
with
zero
offset
147
148
NC:
0956
3B
95
OE
21
149
cmp
dX,ICList!di
;compare
with
first
character
095A
75
09
150
jne
NotTh i sOne
;not
this
character
095C
FF
C7
151
inc
di
;zero=no
chars,
so
add 1
095E
89
3E
7A
20
152
mov
IntKeY,di
;save
it
in
flag
register
0962
E9
2C
00
153
jmp NewBit
;only
1
interrupt
at
a
time
154
155
NotThisOne:
0965
FF
OE
08
10
156 decw Tempi
;decrement
count
0969
74
06
157
jz
EndIC
;end
if
zero
096B
FF
C7
158
inc
di
;go
to
next
character
0960
FF
C7
159
inc
di
;word/wide
096F
EB
E5
160
jmp
NC
;go
to
next
character
161
162 EndIC:
0971
8B
3E
38
20
163
mov
di,WritePtr
;get
writePointer
for
insertion
0975
01
E7
164
shl
di
;
into
word
buffer
0977 89 95
3A
20
165
mov
KbdBuffer!di
,dx
;save
the
word
097B
01
EF
166
shr
di
;undo
shift
0970
FF
C7
167
inc
di
;inc
write
ptr
tentatively
097 F
83
FF
20 168
cmp
di
,##CBLength
;wrap
around
0982
75
03
169
jne
IncWP
0984
BF
00
00
170
mov
d i
,##0
171
IncWP:
0987
3B
3E
36
20
172
cmp
di,ReadPtr
;Has
the
writepointer
caught
up
098B
74
04 173
je
NewB
it
;yes,
don't
inc
after
all
0980
89
3E
38
20
174
mov
WritePtr,
di
;new
writepointer
175
NewBit :
0991
01
26 04
10
176
shl
w Mask ; sh
ift
the
bit
left
in
the
word,
0995
E2
90
177
loop
NextBit
;and
loop
again
0997
E9
7C
FF
178
jmp
NewSetOfB
its
;otherwise
get
new
179
180 EndKbd:
099A
Al
38 20
181
mov
ax,
WritePtr
0990
2B
06
36
20
182 sub
aX,ReadPtr
;subtract
read
from
write
ptr.
09Al
70
03
183
jge
NoAdd
;if
it's
positive,
ok
09A3
05
20 00 184 add
aX,#CBlength
;
othe
rwi
se
add
buffer
length
185
NoAdd:
09A6
A2
19 20 186
mov
KbdStatus+l,al
;word
of
status{#chars
in
buf)
187
09A9
C3
188
ret
;
retu
rn
to
caller
189
190 .
END
32
33
.Get
"Z-Cursor.bca"
;move
the
cursor
1
Z-Cursor.bca
2
3
Update
the
cursor
coordinates
and move
the
cursor
4
5
Author:
Bruce
Horn
6
Last
changed:
April
20,
1979
12:24
PM
7
8
9
OoCursor:
09AA
2E
10
seg
cs
Z-IOP.ls
09AB
Al
62
21
09AE
3D
00
00
0981
74
02
09B3
7C
1F
09B5
88
00
00
09B8
8E
08
09BA
8E
CO
09BC
Al
26
20
09BF
38 06
lA
20
09C3
75
09
09C5
Al
28
20
09C8
3B
06
lC
20
09CC
74
06
09CE
E8
04
00
0901
E8
OA
00
0904
C3
0905
2E
0906
C5
36
22
21
090A
E8
A8
F8
0900
C3
09D£
B8
00
00
09El
8E
08
09E3
8E
CO
09E5
Al
lA
20
09E8
A3
26
20
09EB
2B
06
5E
21
09EF
A3
3E
21
09F2
Al
lC
20
09F5
A3
28
20
09F8
28
06
60
21
09FC
A3
40
21
09FF
~o
36
22
21
OA03
E8
7F
F8
OA06
C3
0120
0120
0120
0122
0124
0126
OOFC
0077
0057
00E8
0080
0040
0001
0020
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
34
35
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
20-Jun-79
10:23:38
Page
23
mov
cmp
je
jl
ax,
Cu
rso
rlock
ax,#O . ;shou1d I
ignore
this
cursor?
Normal:
CR:
NCR:
8lt01
d:
8ltNew:
mov
mov
mov
mov
cmp
j ne
mov
cmp
je
call
call
ret
Normal
NCR
aX,#CurrentOS
dS,ax
eS,ax
ax
,01
dMX
aX,MouseX
CR
aX,OldMY
aX,MouseY
NCR
8lt01
d
8ltNew
cs
;no--it's
ok
;if
less
than
zero,
no
cursor
;has
mouse x
loc
changed?
;yes,
must
do
cursor
;has
mouse Y changed?
;no,
don't
do
cursor
;blt
out
old
cursor
;
the
n b
It
inn
ew
;return
to
caller
seg
1ds
call
ret
si,
.CursorTable
;get
address
of
table
8it81t
;blt
the
cursor
out
mov
mov
mov
mov
mov
sub
mov
mov
mov
sub
mov
ax;#ClIrrentOS
dS,ax
eS,ax
aX,MouseX
OldMX,ax
ax,
Cu
rso
rXOff
CursorX,ax
aX,MouseY
01
dMY,
ax
aX,CursorYOff
CursorY,ax
;Bit8lT
saves
OS
lds
si,.CursorTable
;Get
cursor
table
call
Bit81t
;b1t
new
cursor
in
at
new
pos
ret
.ENO
.Get
"Z-ORW.bca"
;disk
code
Z-ORW.bca
This
program
loads
and
stores
core
images on
the
floppy
disk
in
a
fixed
format:
128
bytes/sector,
16
sectors/track.
For
read,
it
is
given
a
starting
address
and
an
ending
address
to
load--it
assumes
that
the
correct
disk
is
in,
and
that
it
starts
at
track
zero,
sector
zero.
Author:
8ruce
Horn
Last
Edited:
May
7, 1979
2:00
AM
;Oisk
10
ports
Port
= 0120
Port
Port
Port+2
Port+4
Port+6
;Address
of
controller
;Status
Register
in
WO
1791
;Command
Register
StatReg
=
CmdReg
=
TrackReg =
SectorReg
=
OataReg =
;Oisk
commands
RstCmd=
OFC
RdCmd=
077
WrCmd=
057
SeCmd=
OE8
;Track
Register
;Sector
Register
;Oata
Register
;Restore
;Read
;Write
;Seek
(w/verify--no
verify,
OEC)
;Status
bits--Type
I and Type
II
commands
NotReady=
080
;disk
not
ready
WrtProtect=
040
;Write
protect
tab
on
8usy=
001
;command
in
progress
;Status
bits--type
I commands
only
HdLoad=
020
;Head
loaded
Z-IOP.ls
20-Jun-79
10:23:38
Page 24
0010
32
SeekErr= 010
Track
not
verified
0004
33
TrackOO= 004
Track
zero
0002 34 Index= 002
index
mark
passed
35
36
;Statu,s
bits--type
II
commands
only
0010
37
RNF=
010
;Record
Not
Found
0008 38
CRCErr=
008
;CRC
check
invalid
0004 39 LostData= 004 ;8086
couldn't
keep
up
with
1791
0002
40
DataRQ=
002 ; 1971
wants
data
41
42
;Non
error
status
bits--mask
off
on
read
status--type
43
; T
rackOO
or
Index
or
WrtProtect
or
HdLoad
or
Busy
0067
44
NonErrI= 067
45
46
;Non
error
status
bits--mask
off
on
read
status--type
II
47
;DataRQ
or
Busy
0003
48
NonErrII= 003
49
50
;Status
bits
for
recoverable
errors--Type
I
51
;SeekErr
0010
52
RecErrI= 010
53
54
;Status
bits
for
recoverable
errors--Type
II
55
;RNF
or
CRCErr
or
LostData
001C
56
RecErrII=
01C
57
58
59
1n.~rll="t"\n.n\l.
LVU.UI
1'Vt-'I-'J.
OA07
2E
60
seg
cs
OA08
Al
87 00
61
mov
aX,.LoadDiskCursor
OAOB
E8
35
FC
62
call
ShowNewCursor
OAOE
E8
20
Fe
63
call
Wa
itBug
OAll
2E
64
seg
cs
OA12
A1
65
00
65
mov
a x , .
Norm
a 1 Cur
so
r
OA15
E8
2B
FC
66
call
ShowNewCursor
OA18
E8
92
FC
67
call
Hi
deCu
rso
r
OAIB
E8
EE
FB
68
call
IntsOff
;mask
off
interrupts
OAIE
E8
00
FC
69
call
DisplayOff
OA2l
BS
00
00
70
mov
aX,no
OA24
BE
08 71
mov
dS,ax
;Zero
the
segments
OA26
BE
CO
72
mov
eS,ax
OA28
E8
1B
01
73
call
DiskStart
74
LoadDisk:
OA2B
88
00 00
75
mov
aX,no
OA2E
8E
08
76
mov
dS,ax
;Zero
the
segments
OA30
BE
CO
77
mov
eS,ax
OA32
A2
56
10
78
mov
Track,al
;
the
Track
register,
OA35
FE
CO
79
inc
al
OA37
A2
57
10
80
mov
Sector,al
;and
set
sector
to
1
OA3A
88
3E
58
10
81
mov
di,.Buffer
;Write
first
sector
to
Buffer
OA3E
E8
B8
00
82
call
ReadTS
OA41
88
36 58
10
83
mov
si,.Buffer
OA45
8B
04
84
mov
aX,OO!si
;8yte
address
OA47
A3
48
10
85
mov
NextDisk,ax
;Continuation
disk
needed?
OA4A
88
44
02
86
mov
aX,02!si
OA4D
A3
4C
10
87
mov
BeginAdr,ax
;Load from
this
address
OA50
A3
50
10
88
mov
OldAdr,ax
OA53
88
F8
89
mov
di
,ax
OA55
88
44
04
90
mov
aX,04!si
OA58
A3
4E
10
91
mov
BeginSeg,ax
; in
th
i s
segment
DA5B
A3
52
10
92
mov
OldSeg,ax
OA5E
8E
CO
93
mov
eS,ax
OA60
88
44
06
94
mov
aX,06!si
OA63
A3
54
10
95
mov
Blocks,ax
;this
many
blocks
DA66
88
44
08
96
mov
aX,08!si
OA69
A3
44
10
97
mov
JumpTo,ax ; and
when
done,
jump
to
OA6C
C7
06
4A
10
08
00
98
mov
ReTry,UU8. ; 8
retries
on dsk
error
99
ReadNext:
DA72
FE
06
57
10
100
inc
Sector
OA76
FE
06
57
10
101
inc
Sector
OA7A
E8
7C
00
102
call
ReadTS
OA7D
E8
OB
01
103
call
DiskWait
;wait
for
status
ok
OA80
8A
20
01
104
mov
dX,UStatReg
OA83
EC
105
ind
OA84
34
FF
106
xor
al,
UOFF
OA86
A8
lC
107
test
al,URecErrII
;recoverable
error?
Z-IOP.ls
OAB8
74
IB
OA8A
Al 50
10
OA8D
8B
F8
OA8F
Al
52
10
OA92
8E
CO
OA94
FE
OE
57
10
OA98
FE
OE
57
10
OA9C
FF
OE
4A
10
OAAO
75
DO
OAA2
E9
38
01
OAA5
8B
C7
OAA7
8C
C3
OAA9
E8
IB
01
OAAC
8E
C3
OAAE
8B
F8
OABO
FF
OE
54
10
OAB4
75
24
OAB6
Al 48
10
OAB9
3D
01
00
OABC
EB
09
OABE
E8
57
FB
OACI
E8
65
FB
OAC4
E9
40
FF
OAC7
C7
06
42
10
00
00
OACD
E8
Al
00
OADO
E8
45
FB
CAD3
EB
53
FB
OAD6
E8
E7
FB
OAD9
C3
OADA
AO
57
10
DADO
3C
DF
OADF
7C
91
OAEI
7F
07
OAE3
C6
06
57
10
00
OAE8
EB
88
OAEA
FE
06
56
10
OAEE
E8
27
00
OAFi
C6
06
57
10
FF
OAF6
E9
79
FF
OAF9
B3
77
OAFB
E8
AC
00
OAFE
B4
00
OBOO
EB
09
OB02
BA
26
01
OB05
EC
OB06
34
FF
OB08
AA
OB09
FE
C4
OBOB
BA
20
01
OBOE
EC
OBOF
A8
02
OBll
74
EF
OB13
A8
01
OB15
74
F4
OB17
C3
OB18
2E
OB19
C7
06
4A
10
08
00
OB
1F
2E
OB20
AO
56
10
OB23
34
Ff
OB25
BA
26
01
OB28
EE
OB29
BO
E8
OB2B
BA
20
01
OB2E
EE
OB2F
E8
59
00
OB32
BA
20
01
OB35
EC
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
20-Jun-79
10:23:38
jz
mov
mov
mov
mov
dec
dec
decw
jnz
jmp
SectorOK:
mov
mov
call
mov
mov
decw
j
nz
mov
cmp
j
call
call
jmp
DR:
mov
call
call
ca
11
call
ret
RNS:
mov
cmp
jl
jg
mov
jmp
Ql:
inc
ReadTS:
call
mov
jmp
mov
call
mov
j
ReadData:
mov
ind
xor
stob
inc
ReadLoop:
mov
ind
test
jz
test
jz
ret
Seek:
seg
mov
seg
mov
xor
mov
outd
mov
mov
outd
call
mov
ind
SectorOK
aX,OldAdr
di
,ax
aX,OldSeg
eS,ax
Sector
Sector
ReTry
ReadNext
DiskFail
ax,di
bx,es
NextAdr
es,bx
di
,ax
Blocks
RNS
ax,NextDisk
ax,Hl
DR
IntsOn
DisplayOn
LoadFloppy
DStatus,HHO
DiskStop
IntsOn
n;",nl",,,nn
~
~t'
~J~"
ShowCursor
al,Sector
al,#15.
ReadNext
Ql
Sector,HO
ReadNext
Track
Seek
Sector
,HOfF
ReadNext
b
1,
HRdCmd
DiskSetup
ah,#O
ReadLoop
dX,#DataReg
al,#OFF
ah
dX,HStatReg
al,HDataRQ
ReadData
al,HBusy
ReadLoop
cs
ReTry,HH8.
cs
al,Track
al,HOFF
dX,HDataReg
al,HSeCmd
dx,HCmdReg
DiskWait
dX,HStatReg
Page
25
;
no,
its
ok
;restore
old
address
;and
old
segment
;
for
1
ater
INC
;was
jne
DR
(changed
for
test)
;next
disk
flag
on,
otherwise
;deselect
drive
;Return
to
caller
;-1,
with
2
incs,
gives
;invert
from
WD
bus
;store
into
di/es
;Data
request?
;yes,
read
more
data
;is
it
still
busy?
;yes,
wait
again
;Invert
for
WD
bus
;send
it
track
number
;00
seek
;wait
for
dsk
to
be
ready
Z-IOP.ls
20-Jun-79
10:23:38
Page 26
OB36
34
FF
184
xor
al,DOFF
OB38
A8
10
185
test
al,DRecErrI
OB3A
75
01
186
jnz
SeekE
rror
OB3C
C3
187
ret
188
SeekError:
OB30
FF
OE
4A
10
189
decw ReTry
OB41
75
05
190
jnz
Seek
OB43
E9
97
00
191
jmp
OiskFail
192
193
194
195
OiskStart:
OB46
B8
04 00 196
mov
ax,D4
OB49
BB
C7
FF
197
mov
bx,
DO
i skDr
ive
OB4C
E8
07
FB
198
call
SetPI00
OB4F
E8
AA
FA
199
call
WaitASecond
;wait
for
the
disk
to
spin
up
OB52
B8
00 00
200
mov
ax,DO
OB55
BB
FF
EF
201
mov
bX,DOiskMR
OB58
E8
F8
FA
202
call
SetPI00
0858
E8
9E
FA
203
call
WaitASecond
;wait
a second on
disk-mr
OB5E
B8
01
00
204
mov
ax,Dl
OB61
BB
FF
EF
205
mov
bX,DOiskMR
0864
E8
EF
FA
206
call
SetPI00
OB67
E8
21
00
207
call
OiskWait
;disk
MR
may
restore
disk
OB6A
E8
8F
FA
208
call
WaitASecond
0860
E8
11
00
209
call
DiskRestore
;but
if
it
doesn't
...
OB70
C3
210
ret
211
212
DiskStop:
OB71
E8
17
00
213
call
DiskWait
OB74
E8
OA
00
214
call
OiskRestore
OB77
B8
00 00
215
mov
ax,DO
OB7A
BB
C7
FF
216
mov
bx,DOiskDrive
OB70
E8
06
FA
217
call
SetP100
;
dese
1
ect
drive
OB80
C3
218
ret
219
220
Oi
skRestore:
OB81
BO
FC
221
mov
al.DRstCmd
0883
BA
20
01
222
mov
dX,#CmdReg
;send
command
OB86
EE
223
outd
OB87
E8
01
00
224
call
Oi
skWa
it
;wait
for
it
to
be
ready
OB8A
C3
225
ret
226
227
OiskWait:
OB88
BA
20
01
228
mov
dX,DStatReg
;get
status
register
contents
OB8E
EC
229
ind
OB8F
A8
01
230
test
al,DBusy
;is
it
still
busy?
OB91
74
F8
231
jz
Oi
skWa
it
;yes,
try
again,
OB93
C3
232
ret
;otherwise
return
233
234
OiskPwrOn:
OB94
B8
02 00
235
mov
ax,D2
OB97
BB
FC
FF
236
mov
bX,DOiskPower ;Turn
on
first
+5,
then
+12
OB9A
E8
B9
FA
237
call
SetPI00
OB90
E8
5C
FA
238
call
WaitASecond
OBAO
B8
03 00
239
mov
ax,D3
OBA3
BB
FC
FF
240
mov
bX,DOiskPower
OBA6
E8
AD
FA
241
call
SetPI00
OBA9
C3
242
ret
243
244
OiskSetup:
OBAA
E8
DE
FF
245
call
Oi
skWa
it
;wait
for
disk
to
be
ready
OBAO
FC
246
cld
;clear
direction
OBAE
2E
247
seg
cs
OBAF
AO
57
10
248
mov
al,Sector
;
set
secto
r
OBB2
34
FF
249
xor
al,HOFF ;
invert
for
WD
bus
OBB4
BA
24
01
250
mov
dX,HSectorReg
OBB7
EE
251
outd
OBB8
8A
C3
252
mov
al,bl
;get
command
number
aBBA
BA
20
01
253
mov
dX,DCmdReg
;send
command
OBBO
EE
254
outd
255
Wa
itBusy:
aBBE
BA
20
01
256
mov
dX,DStatReg
;get
status
register
contents
OBCl
EC
257
ind
OBC2
AS
01
258
test
al,DBusy
;
is
it
busy
yet?
OBC4
74
F8
259
jz
Wa
itBusy
;command
not
yet
executing
Z-IOP.ls
OBC6
C3
OBC7
8B
00
08C9
B9
04
00
OBCC
03
EA
OBCE
03
OA
OBOO
25
OF
00
OB03
2E
OB04
A3
50
10
OB07
2E
OB08
89 lE
52
10
OBOC
C3
OBOO
B8
OC
00
OBEO
BB
Fa
FF
OBE3
E8
7A
FA
OBE6
FB
OBO
BA
20
01
OBEA
EC
OBEB
34
FF
aBED
2E
OBEE
A3
42
10
OBFl
E8
24
FA
OBF4
E8
32
FA
OSf7
2E
OBF8
Al
A9
00
OBFB
f8
45
FA
OBFE
EB
FE
21AO
0017
0010
OCOO
B8
00 00
OC03
8E
08
OC05
8E
co
OC07
FC
OC08
B9
17
00
OCOB
8B
36
13
00
OCOF
BF
36
21
OC12
89
3E
22
21
OC16
A3
24 21
OC19
F2
OCIA
A5
OCIB
B9
10
00
OCIE
8B
36
43
00
OC22
BF
AO
21
OC25
F2
OC26
A5
OC27
B8
00 00
OC2A
B9
06 00
OC20
BF
2A
20
OC30
F2
OC31
AB
OC32
B9
06 00
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
36
37
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
20-Jun-79
10:23:38
ret
;ax=byte
address,
bx=segment
address
NextAdr:
;get
byte
address
Page
27
mov
mov
shrv
add
and
seg
mov
seg
mov
ret
dx,ax
cx,H4
dx
bx,dx
ax,HOF
;and
shift
right
by
four
for
;segment
address
to
be
added
to
;old
segment
register
OiskFail:
mov
mov
call
sti
mov
ind
xor
seg
mov
call
call
c:a.n
~~;::J
mov
call
cs
OldAdr,ax
cs
OldSeg,bx
ax,HOC
bx,HLedsOn
SetP20
dX,HStatReg
al,HOFF
cs
OStatus,ax
IntsOn
OisplayOn
cs
ax,
.
ErrorCursor
ShowNewCursor
;save
low 4
bits
of
byte
address
;
set
interrupts
;get
status
register
;invert
for
WO
bus
;
save
it
OF:
j
OF
;halt
machine
.End
.Get
"Z-RI.bca
n ;rom
initialization
Z-RI.bca
This
file
contains
all
the
necessary
tables
for
normal
execution
in rom. Page 1
locations
(at
2000H)
will
be
initialized
by
a rep/movw
sequence.
Author:
Bruce Horn
Last
edited:
May
7,
1979
12:34
AM
CursorToBe=
CBTblLength=
CBMapLength=
21AO
23.
16.
;location
of
cursor
bitmap
;in
words,
including
offsets/lock
;
in
words
RomIn
it:
mov
ax,HCurrentOS
mov
ds,ax
mov
eS,ax
cld
;incrementing
mov
cX,HCBTblLength ;how
many
words
to
move
mov
si,.CBTbl
mov
di,HCursorTable
;address
of
table
to
be
mov
.CursorTable,di
;save
address
in
loc
mov
.CursorTable+2,ax
;and
its
segment
rep
movw
;and
blt
table
up
mov
cX,HCBMapLength
;length
of
cursor
bitmap
mov
si,
.Crsr
;address
of
cursor
mov
di,HCursorToBe
;and
its
destination
rep
movw
; b 1 t
tab
1 e
up
;Zero
registers,
keyboard
data
blocks
...
mov
mov
mov
rep
stow
ax,HO
cx,H6.
di,HKbdOata
mov
cx,H6.
;to
zero
registers
;clear
KbdData
block
...
Z-1OP.ls
20-Jun-79
10:23:38
Page 28
OC35
BF
14 10
42
mov
d i , #01
dKbdOa
ta
;and
OldKbdOata
block
...
OC38
F2
43
rep
OC39
AB
44
stow
45
OC3A
C7
06
OC
10
03
00
46
mov
Portl00,##3
;initial
port
100
bits
OC40
C7
06
DE
10
00
00
47
mov
Port60,##0
;and
port60
bits
OC46
C7
06
10
10
88
00
48
mov
Port20,##88
;and
port
20
bits
OC4C
C7
06
12
10
OC
00
49
mov
KbdOffset,##12.
;Kbd1nt
won't
hit
before
Odd1nt
OC52
A3
26
20
50
mov
OldMX,ax ;
last
MX
OC55
A3
28
20
51
mov
OldMY,ax ;
last
MY
OC58
A3
lA
20
52
mov
MouseX,ax ;MouseX
OC5B
A3
lC 20
53
mov
MouseY,ax ;MouseY
OC5E
A3
36 20
54
mov
ReadPt
r,
ax
;ReadPtr
OC61
A3
38 20
55
mov
\lJritePtr,ax
;WritePtr
OC64
A3
18 20 56
mov
KbdStatus,ax
;Keyboard
Status
OC67
A3
14
20
57
mov
ICount,ax
;
interrupt
ctr.
OC6A
A3
DC
21 58
mov
N1Chars,ax
; i
nte
rrupt
chars
OC60
A3
IE
20
59
mov
RMX,ax
;lower
limit
of
mouse
x,y
OC70
A3
20
20
60
mov
RMY,ax
;
is
zero
OC73
C7
06
00
20
85
02
61
mov
.BitBlt,##BitBlt
;address
of
BitBlt
OC79
C7
06 02
20
56
06
62
mov
.SetPI00,##SetPI00
;address
of
SetPI00
OC7F
C7
06
04
20
60
06
63
mov
.SetP20,##SetP20
OC85
C7
06
06
20
99
06
64
mov
.1nitOC,##1nitDC
OC8B
C7
06
08
20
AD
06
65
mov
.HideCursor,##HideCursor
OC91
C7
06
OA
20
CO
06
66
mov
.Showcursor,##ShowCursor
OC97
C7
06
OC
20
00
OC
67
mov
.Romlnit,##Rom1nit
OC90
C7
06
30
10
43
06
68
mov
.ShowNewCursor,##ShowNewCursor
OCA3
C7
06 32
10
29 06 69 ma\!
ni~nl~vnn
nnnicnl~vnn
-
....
I'"
-J
.......
,
...•
""'"
,-
t'
-J
-
••
OCA9
C7
06
34
10
21
06
70
mov
.0isplayOff,##OisplayOff
OCAF
C7
06
36
10
31 06
71
mov
.WaitBug,##WaitBug
OCB5
C7
06
38
10
3A
06
72
mov
.WaitNoBug,##WaitNoBug
oess
C7
06
3A
10
18
06
73
mov
.IntsOn,##IntsOn
OCCI
C7
06
3C
10
OC
06
74
mov
.1ntsOff,##IntsOff
75
76
;Clear
screen
OCC7
C5
36
22
21
77
lds
si,
.CursorTable
;get
table
for
bitblt
OCCB
8B
44
14
78
mov
aX,ClipW!si
;upper
limit
of
mouse
x,y
OCCE
A3
22
20
79
mov
RMW,ax
;is
clipping
corner
OCDI
8B
44
16 80
mov
aX,Clipi-i!si
OC04
A3
24
20
81
mov
RMH,ax
OC07
B8
80 02
82
mov
ax,#640.
;
full
width
OCOA
89
44
OC
83
mov
OestW!si,ax
;for
bitblt
table
OCOO
B8
EO
01 84
mov
ax,#480.
;and
full
height
OCEO
89
44
OE
85
mov
OestH!si,ax
;before
screen
clear
OCE3
B8
DC
00 86
mov
aX,#StcBB
OCE6
89
44
24
87
mov
Function!si,ax
OCE9
B8
00
00 88
mov
ax
,#White
OCEC
89
44
26
89
mov
GrayBits!si
,ax
OCEF
E8
93
F5
90
call
B
itBl
t
;clear
screen
white
OCF2
2E
91
seg
cs
OCF3
C5
36 22
21
92
lds
si,
.CursorTable
OCF7
B8
10
00
93
mov
ax,#16.
;cursor
width
OCFA
89
44
OC
94
mov
OestW!si
,ax
OCFO
89
44
OE
95
mov
OestH!si,ax
0000
B8
02
00 96
mov
ax ,#XorBB
0003
89
44
24
97
mov
Function!si,ax
;make
sure
funct
ion
is
xor
0006
B8
FF
FF
98
mov
ax,#Black
;with
all
ones
0009
89
44
26
99
mov
G rayB
its!
s i , ax
OOOC
E8
EF
F9
100
call
101nit
;turn
on
CRT,
keyboard
OOOF
E8
AE
F9
101
call
ShowCursor ;now
put
up
first
cursor
0012
C3
102
ret
;and
return
to
caller
103
0013
15
00 104 .CBTbl:
.adr
CBTbl
105
106 CBTbl:
0015
00
40
107 ·
adr
4000
;byte
-
destination
bitmap
0017
00
00
108 ·
adr
0
;seg
0019
28
00
109
.adr
40.
;
raster
0018
80
25
110 ·
adr
240.*40.
;field
size
0010
00
00
111
.adr
O.
;x
-
destination
rectangle
OOH
00
00
112 .
adr
O .
;y
0021
10
00
113
.adr
16.
;width
0023
10
00
114 ·
adr
16.
;height
0025
00
00
115 ·
adr
O.
;x
-
clipping
rectangle
0027
00
00
116
.adr
O.
;y
0029
80
02
117
.adr
640.
;width
Z-IOP.ls
20-Jun-79
10:23:38
Page
29
0028
EO
01 118
.adr
480.
;height
0020
AO
21 119
.adr
CursorToBe
;
byte
-
source
bitmap
002F 00 00 120
.adr
CurrentOS
;seg
0031 01 00 121
.adr
1.
;raster
0033 08 00 122
.adr
8.
;field
size
OD35
00 00 123 .
adr
O . ; x -
source
origin
0037 00 00 124
.adr
O.
;y
0039 02 00 125
.adr
02
;
(xor)
003B
FF FF
126
.adr
OFFFF
;black
127
0030 00 00 128
.adr
0
;offset
x
003F 00 00 129
.adr
0
;offset
y
130
0041
FF
FF
131
.adr
OFFFF
;
cursor
lock
(<O
means
locked)
132
0043 45 00 133
.Crsr:
.adr
Cursor
134
135
Cursor:
0045 00
FF
136
.adr
OFFOO
;line
0
0047 00
FE
137
.adr
OFEOO
;line
2
0049 00
FC
138
.adr
OFCOO
;line
4
004B
00
E7
139
.adr
OE700
; 1 i ne 6
0040
FF
01 140
.adr
001FF
;line
8
004f
00 00 141
.adr
00000 ; 1 i ne 10
0051 86
C8
142
.adr
OC886
;line
12
0053 80
98
143
.adr
09880
;line
14
0055 00
FF
144
.adr
OFFOO
; 1 i ne 1
OD57
00
Fe
145
.adr
Of
COO
;line
3
0059 00
FE
146
.adr
OFEOO
; 1 i ne 5
005B
80
C3
147
.adr
OC380
; 1 i ne 7
0050
FF
00 148
.adr
OOOFF
;line
9
005F
E6
8B
149
.adr
08BE6
; 1 i ne 11
0061 86
A8
150
.adr
OA886
; 1 i ne 13
0063 86 88 151
.adr
08886 ; 1 i ne 15
of
cursor
152
153
154
155
.end
38
39
.Get
"Z-CursorBitmaps.bca"
;Cursors
1
Z-CursorBitmaps.bca
2
3
Contains
various
cursor
bitmaps
for
4
sending
low-level
messages
to
user
5
Author:
Bruce
Horn
6
Last
changed:
May
7,
1979
1:56
AM
7
8
9
.NormalCursor:
0065 67
00
10
.adr
NormalCursor
11
12
No
rma 1
Cu
rso
r:
0067 00
FF
13
.adr
OFFOO
;line
0
0069 00
FE
14
.adr
OFEOO
;line
2
0068 00
FC
15
.adr
OFCOO
; 1 i ne 4
0060 00
E7
16
.adr
OE700
; 1 i ne 6
006F
FF
01
17
.adr
OOlFF
;line
8
0071 00 00 18
.adr
00000 ; 1 i ne 10
0073 86
C8
19
.adr
OC886
;line
12
0075 80 98
20
.adr
09880
;line
14
0077 00
FF
21
.adr
OFFOO
;line
1
0079 00
FC
22
.adr
OFCOO
; 1 i ne 3
0078 00
FE
23
.adr
OFEOO
;line
5
0070 80
C3
24 .
adr
OC380
;line
7
007F
FF
00
25
.adr
OOOFF
;line
9
0081
E6
8B
26
.adr
08BE6
;line
11
0083 86
A8
27
.adr
OA886
; 1 i ne 13
0085 86 88 28
.adr
08886
;line
15
of
cursor
29
30
.LoadOiskCursor:
0087 89 00 31
.adr
LoadOiskCursor
32
33
LoadOiskCursor:
0089 00 00 34
.adr
00000 1 i ne 0
0088
AA
8A
35
.adr
08AAA
1 i ne 2
0080
AA
8A
36
.adr
08AAA
1 i ne 4
Z-IOP.ls
20-Jun-79
10:23:38
Page 30
008F
00
00
37
.adr
00000
;line
6
0091
EA
CE
38
.adr
OCEEA
;line
8
0093
4C
A4
39
.adr
OA44C
;line
10
0095
EA
EE
40 ·
adr
OEEEA
;line
12
0097
BO
00 41 ·
adr
OOOBO
;line
14
0099
EC
8E
42 ·
adr
08EEC
;line
1
009S
EA
8A
43
·
adr
08AEA
;line
3
0090
AE
EE
44
.adr
OEEAE
;line
5
009F
00
00 45 ·
adr
00000
;line
7
OOAI
8C
A4
46
.adr
OA48C
;line
9
00A3
2A
A4
47
·
adr
OA42A
;line
11
00A5
00
00 48 ·
adr
00000
;line
13
00A7
BO
00 49 ·
adr
OOOBO
;line
15
of
cursor
50
51 .
ErrorCursor:
00A9
AB
00 52
.adr
ErrorCursor
53
54
ErrorCursor:
OOAB
FF
00 55
.adr
OOOFF
;line
a
OOAO
FE
00 56 ·
adr
OOOFE
;line
2
OOAF
FC
00 57 ·
adr
OOOFC
;line
4
OOBI
E7
00 58 ·
adr
000E7
;line
6
00B3
01
FF
59 ·
adr
OFFal
;line
8
00B5
00
00 60 ·
adr
00000
;line
10
00B7
C8
86 61
.adr
086C8
;line
12
00B9
98
80 62 ·
adr
08098
;line
14
OOBB
FF
00 63 ·
adr
OOOFF
;line
1
OOSO
Fe
00
64
·
ad:
ooore
; 1 i
n9
3
OOBF
FE
00 65 ·
adr
OOOFE
;line
5
ODCl
C3
80
66
·
adr
080C3
;line
7
00C3
00
FF
67
.adr
OHOO
;line
9
ODC5
8B
E6
68 ·
adr
OE688
;line
11
ODC7
A8
86 69
.adr
086A8
;line
13
00C9
88 86
70
·
adr
08688 ; 1
ine
15
of
cursor
71
72
73
74
75
76
77
78
79
.ENO
40
41
.END

Navigation menu