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

Download19790620_Z-IOP_1.5_ls 19790620 Z-IOP 1.5 Ls
Open PDF In BrowserView PDF
20-Jun-79 10:23:38

Z-IOP.ls

1
2
3
4
5
6
7
8
9
10

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

12
13
14
15
16
17
18
19
1
2
3
4
5
6

.Predefine

1000
1002
1004
1006
1008
100A
100C
100E
1010
1012
1014
1020
1022
1024
1026
1028
1030
1032
1034
1036
1038
103A
103C
103E
1040
1042
1044
1048
104A
104C
104E
1050
1052
1054
1056
1057
1058
105A

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
54
55
56
57

"8086Predefs.sr"

.Get
"Z-IOPRamDefs.bca"
Z-IOPRamDefs.bca

;Ram locations ...

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

7

1000

1

BCA/l/e Z-IOP.bca;pnew z-iop.mb@P@
Current version is version 1.5

11

8
9
10
11
12
13
14
15
16
17
18
19
20
21

Page

3: 04 PM

;RAM definitions fol1ow--

;The following is PRIVATE to the 10 processor
IOPRam=

1000

;IOP Ram begins at this address

B itsGone=

Count=
Mask=
Offset=
Templ=
IRR=
Portl00=
Port60=
Port20=
KbdOffset=
OldKbdData=

IOPRam
BitsGone+2.
Count+2.
Mask+2.
Offset+2.
Templ+2.
1RR+2.
Portl00+2.
Port60+2.
Port20+2.
KbdOffset+2.

;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

RO=
Rl=
R2=
R3=
BitE rrors=

OldKbdData+12.
RO+2.
R1+2.
R2+2.
R3+2.

;various temporary registers
; for rom to use

.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.
;disk status on fail
DStatus+2.
; Byte/Seg' add ress of in it rout i ne
JumpTo+4.
;another disk after this one?
NextDisk+2.
;Retry counts/sector rlw
ReTry+2.
;Begin loading address
BeginAdr+2.
;Begin loading segment
;last address since R/W sector
BeginSeg+2.
01dAdr+2.
; Last segment
OldSeg+2.
;Blocks to read
Blocks+2.
;Current track
Track+l.
;Current sector
;location of disk buffer
Sector+l .
.Buffer+2.
;128 char disk buffer

;following 8 bytes are bit errors
;from mem test

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

Page

20-Jun-79 10:23:38

Z-IOP.ls

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

2

;The following is PUBLIC information--The emulator processor can
;address this information, and possibly alter i t
EPRam=

2000

;EP can address ram starting here

;Routines available in ROM
· BitBlt=
.SetP100=
· SetP20=
.InitDC=
· Hi deCu rsor=
.ShowCursor=
· RomIn it=

EPRam
.BitBlt+2.
.SetP100+2.
.SetP20+2.
· In itDC+2.
· HideCursor+2.
.ShowCursor+2.

;address of BitBLT routine
;address of portlOO routine
;port 20
;display controller init
;hides, locks cursor
;unlocks, shows cursor
;initializes rom

;Other reserved locations
QByte=
QSeg=
Qlock=
ICount=
OldICount=
KbdStatus=
MouseX=
MouseY=
RMX=
RMY=
RMW=
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=

· 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 1e+46.
BBHeader+8.

RamInts=

22AO

IROO=
IR01=
IR02=
IR03=
IR04=
IR05=
IR06=
IR07=

RamInts
IROO+5.
IR01+5.
IR02+5.
IR03+5.
IR04+5.
IR05+5.
IR06+5.

RMH=

;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

20-Jun-79 10:23:38

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

1'\1'\11"

161

001E
0020
0022
0024
0026

162
163
164
165
166
167
168
169
170
171
172
173
174
175
176

VVJ. ...

FFFC
FFFB
FFC7
FE3F
FlFF
EFFF
DFFF
3FFF

FCFF
E3FF
BFFF
DFFF 7HF

FHO

FFEF
FFOF
FFBF
FF7F
0000
0002
OOEF
OOBF

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

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

;current code, data segment
;bitblt XOR
;B1ack
;White for bitb1t store constant
;Store constant

;BitBLT table offsets-BBDB=
BBOS=
DRast=
DField=
DestX=
DestY=
DestW=
OestH=
C1 ipX=
C1ipY=
C1ipW=
C1ipH=
BBSB=
BBSS=
SRast=
SFie1d=
SourceX=
SourceY=
Function=
GrayBits=

O.
2.
4.
6.

8.
10.
12.
14.
16.
18.
20.
22.
24.
26.

;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
raster

28.

;SCUfCC

30.
32.
34.
36.
38.

;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
OEF
ir4=
ir6=
OBF

;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

.ENO
.Get
"Z-Boot.bca"
Z-Boot.BCA

;debugger

Z-IOP.ls

20-Jun-79 10:23:38

Page

0000
0000
;

1000
3000
2EOO

mem test range

fi rst
past =
FirstSP=

1000
3000
2EOO

;8086 Interrupt vector
0000
0000
0002
0004
0006
0008
aOOA
OOOC
OOOE
0010
0012

.loc
9F
00
B7
00
CF

01
00
01
00
01

. adr
.adr
.adr
.adr
.adr

00 00

.ad!"

E7 01

.adr
.adr
. adr
.adr

00 00
FF 01

00 00

a

OivErr
ram
SST
ram
NMI
ram
BPT
ram
OVF
ram

; interrupt vector (if sys=O)
; type 0 divide error
; type

single step

;type 2 nmi
; type 3 breakpoint
; type 4 overflow

;8259 Interrupt vector
0080

.loc 4*020

0080 AO 22

.adr
.adr
.adr
.adr
.adr
.adr
.adr
.adr
.adr
.adr
.adr
.adr
.adr
.adr
.adr
.adr

0082 00 00

0084
0086
0088
008A
008C
008E
0090
0092
0094
0096
0098
009A
009C
009E

A5
00
AA
00
AF
00
B4
00
B9
00
BE
00
C3
00

22
00
22
00
22
00
22
00
22
00
22
00
22
00

IROO
Ram
IROl
Ram
IR02
Ram
IR03
Ram
IR04
Ram
IR05
Ram
IR06
Ram
IR07
Ram

;ParErrInt
;IPSysInt
;Oisklnt
; EIAlnt
;Oddlnt
;ADClnt
;Kbdlnt
;VSyncInt

IntVectors:
OOAO
00A5
OOAA
OOAF
00B4
00B9
OOBE
00C3

EA
EA
EA
EA
EA
EA
EA
EA

A7
BF
07
EF
46
07
76

07
07
07
07
07
08
07
1F 08

00
00
00
00
00
00
00
00

00
00
00
00
00
00
00
00

jmps
jmps
jmps
jmps
jmps
jmps
jmps
jmps

OFFO
OFFO EA DO 00 00 00

ParErrInt Rom
IPSysInt Rom
OiskInt Rom
EIAInt Rom
Oddlnt Rom
AOClnt Rom
Kbdlnt Rom
VSynclnt Rom
.loc OFFO

jmps restart rom

OODO

.loc 000
;********Boot********
Restart:

reset vector
sets CS=FOOO(O)

4

20-Jun-19 10:23:38

Z-lOP.1s

0000
0001
0004
0006
0008

FA
88
8E
8E
8E

OODA
OODC
OODF
OOEO
00E3

BO
BA
EE
BB
EB

88
20 00

00E5
00E7
00E9
OOEB

00
04
00
16

00
01
01
01

00 00
DO
08
CO

00 00
08

OOED B9 01 00
OOFO B8 00 70
00F3
00F5
00F7
OOFA
OOFC
OOFE
0100
0104
0107
010A
010B
0100
0110
0113
0114

FF
75
B8
E2
FF
FF

C8
FC
00 70
F1
C3
C3

18
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

mov
mov

cX,Ul
ax,U7000

dec
jnz
mov
loop

ax
LP
aX,U1000
LP

105

inc

bx

106

inc
jmpi

bx
Xibx

mov
mov
outdw
j

aX,U2
;+5 volts on
dX,UI00

B8 02 00
BA 00 01
EF
EB EO
B8 03 00

108
109
110
111
112
113
114
115

SA 00 01

116

EF
EB 07

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

FE
FF
FF
80
74
80
74
80
74
80
74
E9

C2
C7
C7
FA
lC
FA
17
FA
12
FA
00
39

0138
013A
013C
013E
0140

00
FF
00
AA
55

00
00
AA
55

0142
0145
0149
014B
0140
014F
0153

BE
8B
89
FF
FF
81
72

00 10
90 38 01
lC
C6
C6
FE 00 30
F4

01
02
03
04
00

Ff

X:
0
plus5
plus12
start

107

011B
0110
01H
0121
0124
0126
0129
012B
012E
0130
0133
0135

;First, disable interrupts and zero all segment registers
cli
mov
aX,HO
mov
sS,ax
mov
dS,ax
mov
eS,ax
;Stop mapping all mem requests into Rom-mov
al,H88 ;BootSequenceDone
and
mov
dX,H20
outd
;ErrorCorrectionOff
mov
bx,UO
;start dispatch with 2
waitSec
j
.adr
.adr
.adr
.adr

FF A7 E5 00

0116 B2 00
0118 BF 00 00

Page

;not used
; ramtes·t 1abel

wa itsec:
LP:

;jump to routine

plus5:

waitSec

plus12:
mov
mov
outdw
j

aX,U3
;+12 volts on
dX,#100

waitSec

;Test low ram for errors-start:

mov
mov

dl,UO
di ,UO

;test number in dl
; and offset in di

again:

inc
inc
inc
cmp
je
cmp
je
cmp
je
cmp
je
jmp

dl
di
di
dl,Ul
Xtest
dl,U2
Xtest
dl,U3
Xtest
dl,U4
Xtest
Bootlt

;on to the next test
;and the next offset
; incremented by 2 for word
;dispatch on dl
;it fits
;test 2
;it fits
; test 3
;it fits
; test 4
; it fits
;assume the RAM works

BitsTable:
.adr
.adr
.adr
.adr
. adr

0
OFFFF
00000
OAAAA
05555

;not used
;Ones
;Zeroes
;AAAA
;5555

; write bits in location and read
Xtest:
mov
s i ,Hf i rs t
mov
bX,BitsTable!di
13:
mov
O!si,bx
inc
si
inc
si
cmp
si,Upast
13
jb

back
;ram address

~

;write in bits
;end or ram
; 11 op if below

0

5

20-Jun-79 10:23:38

Z-IOP.1s

0155
0158
015B
0150
015F
0161
0163
0165
0169

B9 00 00
BE 00 10
8B 04
33 C3
08 C8
FF C6
FF C6
81 FE 00 30
72 Fa

016B 89 80 28 10
016F EB AA

0171 BC 00 2E
00

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

0174
0177
0178
0179
017A
0170
0180
0183

B8 00
50
90
FC
BE AO
BF AO
B9 28
F2

VolO,",

(\10",

A4

10')

0185
0188
018B
018C

E8 78 OA
E8 7C 08
2E
C7 06 46 10 00 00

0192
0193
0197
OlgA
0190

2E
E8 AO 04
E8 94 04
fB F3

019F
01A2
01A5
01A8
01AB
01AE
OlAF
01B2
01B5

B8
BB
E8
E8
E8
2E
Al
E8
EB

00
FO
B8
60
7B

01B7
01BA
01BO
01CO
01C3
01C6
olC7
01CA
01CO

B8
BB
E8
E8
E8
2E
Al
E8
EB

01
FO
AO
55
63

01CF
0102
0105
0108
010B
alOE
010F
OlE2
01E5

B8
BB
E8
E8
E8
2E
Al
E8
EB

02
FO
88
3D
48

184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
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

00
22
00

179

180
181
182
.Luv

FF 1E 44 10

00
FF
04
04
04

A9 00
8E 04
FE
00
FF
04
04
04

A9 00
76 04
FE
00
FF
04
04
04

A9 00
5E 04
FE

OlE7 88 03 00

mov
xor
or
inc
inc
cmp
jb

cx,HO
si,Hfirst
ax,Olsi
ax,bx
cX,ax
si
si
si,Hpast
14

mov
jmp

BitErrors!di ,cx ;Save error log in low mem
again
; start all over

mov

mov
14 :

Page

;mask of which bits are bad
; ram address 0
; read back ram 1ocat ion contents
;any bits different?
;or them into mask
; end of ram
;next

;The ram wo rks, so now boot from the disk
BootIt :
mov
mov
push
popf
c1d
mov
mov
mov
rep
movb
call
call
seg
mov
RunAgain:
seg
callis
call
call
jmp

sp,HfirstSP

;initia1ize SP

ax,HO
ax

; zero f1 ags

si ,#IntVectors
d i , HRamlnts
cx,H40.
.!:lIT

,LlLI

Romln it
LoadFloppy
cs
JumpTo+2,HHO
cs
JumpTo
Wa itNoBug
Wa itBug

RunAgain

OivErr:

HO:

mov
mov
call
call
call
seg
mov
call
j

ax,HO
bx,HLedsOn
SetP20
IntsOn
Oisp1ayOn
cs
ax, .ErrorCursor
ShowNewCursor
HO

mov
mov
call
call
call
seg
mov
call
j

ax.Hl
bx,HLedsOn
SetP20
IntsOn
OisplayOn
cs
ax, .ErrorCursor
ShowNewCursor
Hl

mov
mov
call
call
call
seg
mov
call
j

ax,H2
bx,HLedsOn
SetP20
IntsOn
DisplayOn
cs
ax, ;ErrorCursor
ShowNewCursor
H2

mov

ax,H3

SST:

Hl :
NMI:

H2:
BPT:

6

up interrupt tables

;set segment to zero
; call the routine
;and in case it returns ..
;wait for no bug first, then
;run prog again on next bug

Z-IOP.ls

20-Jun-79 10:23:38

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
0202
0205
0208
020B
020E
020F
0212
0215

B8
BB
E8
E8
E8
2E
Al
E8
EB

04
FO
58
00
IB

00
FF

04
04
04

A9 00
2E 04
FE

230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
22
23

mov
call
call
call
seg
mov
call
H3:

j

Page

7

bx,#LedsOn
SetP20
IntsOn
OisplayOn
cs
ax, .ErrorCursor
ShowNewCursor
H3

OVF:
mov
mov
call
call
call
seg
mov
call
H4:

j

ax,#4
bx,#LedsOn
SetP20
IntsOn
OisplayOn
cs
ax, .ErrorCursor
ShowNewCursor
H4

.END
.Get
"Z-BitBLT.bca"
;bitblt code
Z-BitBLT.bca
This file contains BitBLT for the 8086
Version 2.0
Allthor'
Tnf1;!ll~
.--_
.. _-. n;!n
.. -""-"Last changed: March 8, 1979 3:54 PM
- fixed minx/y clipping
- fixed destination segment
- saves/restores OS
- uses fast shift

1

2
3

-_

4

5
6

7
8
9

10
11

0002
0004
0006
0008

OOOA
OOOC
OOOE
0010
0012
0014
0016
0018
001A
001C
OOlE
0020
0022
0024
0026
0028
0014

12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32

OESBYTE=
OESSEG=
OESRAST=
DESFLD=
OESX=
OESY=
WIDTH=
HE IGHT=
CLPX=
CLPY=
CLPWID=
CLPHT=
SRCBYTE=
SRCSEG=
SRCRAST=
SRCFLD=
SRCX=
SRCY=
FUNC=
GRAY=
TABSIZ=

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
FUNC+2
GRAY+2-0ESBYTE/2
;NO. WORDS IN CALLER'S TABLE

33

0000
002A
0032
0034
0036
0038
003A
003C
003E
0040
0042
004A
004C
004E

34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52

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

20-Jun-79 10:23:38

Z-IOP.ls

0050
0052
0054
0056
0058
0060
0008
OOOC
0218
0218
021A
021C
021E
0220
0222
0224
0226
0228
022A
022C
022E
0230
0232

07
DO
DO
DO
E3
E3
E3
E3
EB
EB
EB
EB
03
FO

05
04
04
04
04
04
04
04
04
04
04
04
05
04

53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70

NWORDS=
SRCN=
SHIFTS=
OPN=
GRAYS=
NTEI~PS=

;

.LOC
;

SOURCES:

72
73
74
75
76
77

78
79
80

0236 FO 04

81

HCOUNT+2
NWORDS+2
SRCN+2
SHIFTS+2
OPN+2
;4 VALS FOR Y MOD 4
GRAYS+8

BRUSHFUNC=
CONSTFUNC=

71

0/34 FO 04

Page

8
OC
.+1/2*2 ; EVENWORD ALIGNMENT

1* TABLE OF SOURCE ft0UTINES
.ADR
SRCOOPO
.ADR
SRCO
.ADR
SRCO
.ADR
SRCO
.AOR
SRCl
.AOR
SRCl
.AOR
SRCl
.AOR
SRCl
.AOR
SRC2
.ADR
SRC2
.AOR
SRC2
.ADR
SRC2
.ADR
SRC30PO
.ADR
SRC3
.AOR
SRC3
.ADR
SRC3

82

0238
023A
023C
023E

17
18
lC
20

05
05
05
05

0240
0242
0244
0246
0248
024A
024C
024E
0250
0252
0254
0256
0258
025A
025C
025E
0260

00
01
03
07
OF

00

3F
7F
FF
FF
FF
FF

0262
0264
0266
0268
026A
026C
026E
0270
0272
0274
0276
0278
027A
027C
027E
0280

00

FF

00
00
00
00
00
00
00
01
03
07
OF

FF
FF
FF
FF

3F
7F
FF

CA
C8
C6
C4
C2
CB
CD
CF
D1
D8
06
D4
DO
OF
E1
E3

05
05
05
05
05
05
05
05
05
05
05
05
05
05
05
05

1F

1F

0282 E9 52 02

83

;

84

OPS:

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

;

MASKTAB:

1* TABLE OF OPERATIONS
.ADR
OPO
.ADR
OPl
.AOR
OP2
.ADR
OP3
1* TABLE OF MASKS
.ADR
0
.ADR
1
.AOR
3
.ADR
7
.ADR
OF
.ADR
IF
.AOR
3F
.ADR
7F
.AOR
OFF
.ADR
IFF
.ADR
3FF
.ADR
7FF
.AOR
OFFF
.ADR
lFFF
.ADR
3FFF
.AOR
7FFF
.ADR
OFFFF

;
1* TABLE OF SHIFTS (LEFT ROTATES)
SHIFTTABLE:
.ADR
SHO
.AOR
SHl
.ADR
SH2
.ADR
SH3
.ADR
SH4
.AOR
SH5
.AOR
SH6
.AOR
SH7
.ADR
SH8
.AOR
SH9
.ADR
SH10
.ADR
SHll
.AOR
SH12
.ADR
SH13
.AOR
SH14
.AOR
SH15

;

JDONE:

JMP

DONE

1* ... and now, here's BITBLT! */

8

20-Jun-79 10:23:38

Z-IOP.ls

0285
0288
0289
028B

83 EC 60
55
88 EC
IE

028C
028E
0290
0292
0295
0298
0299
029A

8C
8E
88
83
89
FC
F2
A5

0298
029E
-a2Al
02A4
02A7
02AA
02AC
02AE
02BO
02B2
02B4

BE
8B
8B
8B
88
3B
7E
28
03
2B
03

DO
CO
FD
C7 02
14 00

02
42
4A
52
5A
08
13
08
CB
03
C3

00
OA
22
OE
12

156

0286 88 D8

02B8
0288
02BE
02C1
02C3
02C6
02C8
02CA
02CC
02CF
0201
0203
0206

89
89
89
03
03
2B
70
03
89
85

0208
020B
020E
02EO
02E3

8B
8B
2B
25
89

42
4A
52
C2
5A
08
05
03
52
02

OA
22
OE
16

OE

7E AF

83 EE 02
74 C6
46
56
C2
OF
46

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

22
OA
00
36

157
i58

159
160
161
162
163
164
165
166
167
168
169
170
171
172

173
174
175
176

BITBL T: SUB
PUSH
MOV
PUSH
MOV
MOV
MOV
ADD
MOV
CLO
REP
MOVW

Page

9

SP,HNTEMPS
BP
BP ,SP
;NEW FRAME
OS
;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 section:
MOV
SI,HDESY-DESX
;SI -) y and height
YTHENX: MOV
AX,DESX!BP!SI
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
XYOK:
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
WHOK:
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

FHX:

MOV
MOV
SUB
AND
MOV

AX,SRCX!BP
OX,DESX!BP
AX,DX
AX,HOF
SKEW!BP,AX

;skew = (sourcex-destx) & 15

177

02E6 2B
02E8 89
02EB FC
02EC 89
02EF 8B
02F1 25
02F4 SB
02F7 2B
02F9 89
02FC Dl
02FE 2E
02FF 8B
0303 89
0306 03
0309 FF
030B 81
030F SB
0312 2B
0314 Dl
0316 2E
0317 8B
031B F7
0310 89
**&15)

CO
46 3A
46
C2
OF
10
08
5E
E3
87
46
56
CA
E2
OF
OA
E3

3C
00
00
34
40 02
3E
OE
OF 00
00

178

1* SET UP 1NCS AND MASKS ASSUMING NO OVERLAP

179
180
181
182
183
184
185
186
187
188
189
190

200
201

SUB
MOV
CLD
MOV
MOV
AND
MOV
SUB
MOV
SHL
SEG
MOV
MOV
ADD
DEC
AND
MOV
SUB
SHL
SEG
MOV
NOT
MOV

202
203

1* CHECK FOR POSSIBLE OVERLAP OF SOURCE AND DEST

191

192
193
194

195
196
197

198
87 40 02
DO
46 40

199

AX,AX
;zero
HBAK!BP,AX

;normal r to 1 (-1 means back)
;same for hardware direction flag
;normal top-to-bottom

VBAK!BP,AX
AX,DX
AX,HOF
BX,HI0
BX,AX
STARTBITS!BP,BX ;startbits~ 16-(destx&15) [1-16]
BX
;WORO INDEX
CS
AX,MASKTAB!BX
MASK1!BP,AX
;mask1~ MASKS!STARTBITS
OX,WIOTH!BP
OX
OX,HOF
BX,HOF
BX,DX
;WORO INDEX
BX
CS
AX,MASKTAB!BX
AX
MASK2!BP,AX
;mask2 = NOT MASKS! (15-{destx+width-l)

20-Jun-79 10:23:38

Z-IOP.ls

0320
0323
0326
0328
032B
032E
0330

8B
3B
75
8B
3B
75
E8

46
46
OB
46
46
03
3A

04
1C

0353 8B 4E 26
0356 81 El OF 00
035A 89 4E 26
0350 8B Fl
035F 01 E6
0361 2E

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

8B
85
74
8B
0330 81
0341 2B
0343 FF
0345 01
0347 81
034B 03
034E 01
0350 89

4E
C9
16
5E
E3
CB
C9
C1
El
4E
El
4E

36

0362 88 84 18 02

233

0366 89 46
0369 81 E6
0360 2E
036E 8B 84
0372 89 46
0375 83 F9
0378 7C 00
037A 83 F9
037D 7e 05
037F C7 46
0384 E8 9F

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

0333
0336
0338
033A

0387 8B 46
038A 2B 46
0380 FF C8
038F 70 OE
0391 8B 4E
0394 21 4E
0397 C7 46
039C B8 FO
039F 01 F8
03Al 01 F8
03A3 01 F8
03A5 01 F8
03A7 05 02
03AA 89 46

03AD
03BO
03B3
03B6
03B8
03BB
03BE
03CO
03C2
03C4
03C7
03CA
03CC
03CF

BE
8B
25
01
03
8B
F7
33
2B
8B
8B
2B
8B
33

18
46
02
E8
46
56
02
C2
C2
4A
5A
09
56
CA

02
1A
02

22
OF 00

01 00

3A
4C

52
06 00
38 02
56
08
OC
4C 00 00
01
OE
34
40
3E
40 00 00
FF

00
50

00
4C
00
50
3A

08
06
3C

MOV
CMP
JNE
MOV
CMP
JNE
CALL
,

Page

10

AX,OESSEG!BP
AX,SRCSEG!BP
NOLAP
AX,OESBYTE!BP
AX,SRCBYTE!BP
~JOLAP

OlAP

1* CALCULATE PRELD (NEED FOR EXTRA INITIAL WORD OF SOURCE)
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

NOLAP:

1* SET UP SOURCES, OPS, AND GRAYS IF NECESSARY

GRAYP:
CNW:

SNW:

MOV
AND
MOV
MOV
SHL
SEG
MOV
MOV
AND
SEG
MOV
MOV
CMP
JL
CMP
JL
MOV
CALL

CX ,FUNC! BP
CX,NOF
FUNC!BP,CX
SI,CX
SI
;FUNC INDEXES WORD OF TABLE
CS
AX,SOURCES!SI
SRCN!BP,AX
SI,#6
;OP INDEXES OPS
CS
AX,OPS!SI
OPN!BP,AX
CX,#BRUSHFUNC
CNW
;NO GRAY NEEDED
CX,NCONSTFUNC
GRAYP
PRELD!BP,N#O
;NO PRELOAD FOR CONST SOURCE
GRAYPREP
;PREPARE 4-WORD TABLE OF GRAYS

1* CALC
MOV
SUB
DEC
JGE
MOV
AND
MOV
MOV
SAR
SAR
SAR
SAR
ADD
MOV

NWORDS (no. words stored), MERGE MASKS IF NEG
AX,WIDTH!BP
AX, ST ARTB ITS! BP
AX
SNW
CX,MASK2!BP
;IF WIDTH

Navigation menu