forked from MSXALL/pymsx
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathZUT.asm
367 lines (329 loc) · 5.06 KB
/
ZUT.asm
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
53
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
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
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
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
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
356
357
358
359
360
361
362
363
364
365
366
367
DFLT_AF: equ 0dd55h
DFLT_BC: equ 01234h
DFLT_DE: equ 05678h
DFLT_HL: equ 09abch
DFLT_IX: equ 0def0h
DFLT_IY: equ 0aabbh
db 0FEh ; Binary file ID
dw Begin ; begin address
dw End - 1 ; end address
dw Execute ; program execution address (for ,R option)
org 0A000h
Begin:
; Program code entry point
Execute:
di
ld HL,hello
CALL LPSTR
call PrintLF
test00:
CALL ClearTest
NOP
CALL StoreRegs
LD HL,test00compare
LD IX,0000
CALL CompareRegs
JP test01
test00compare:
dw DFLT_AF ; AF
dw DFLT_BC ; BC
dw DFLT_DE ; DE
dw DFLT_HL ; HL
dw DFLT_IX ; IX
dw DFLT_IY ; IY
test01:
CALL ClearTest
LD BC,01234h
CALL StoreRegs
LD HL,test01compare
LD IX,0001
CALL CompareRegs
JP test02
test01compare:
dw DFLT_AF ; AF
dw 01234h ; BC
dw DFLT_DE ; DE
dw DFLT_HL ; HL
dw DFLT_IX ; IX
dw DFLT_IY ; IY
test02:
finish:
LD HL,finished
CALL LPSTR
ei
ret
; sends \r\n
PrintLF:
PUSH AF
PUSH BC
LD C,13
CALL LP
LD C,10
CALL LP
POP BC
POP AF
RET
; word in BC
PrintWord:
PUSH AF
PUSH BC
LD A,C
LD C,B
CALL PrintByte
LD C,A
CALL PrintByte
POP BC
POP AF
RET
; byte in c
PrintByte:
PUSH AF
PUSH BC
PUSH BC
; high nibble
ld a,c
srl a
srl a
srl a
srl a
and 00fh
cp 00Ah
jp M,PrintByteLess
sub a,10
add a,'a'
jp PrintBytePrint
PrintByteLess:
add a,'0'
PrintBytePrint:
ld c,a
call LP
POP BC
; low nibble
ld a,c
and 00fh
cp 00Ah
jp M,PrintByteLess2
sub a,10
add a,'a'
jp PrintBytePrint2
PrintByteLess2:
add a,'0'
PrintBytePrint2:
ld c,a
call LP
POP BC
POP AF
ret
; print a character in c to line printer
LP: PUSH AF
; LD A,C
; call 0a2h
; check if lpt ready (bit 1 == 0)
LPLOOP: IN A,(090h)
BIT 1,A
JP NZ,LPLOOP
; send char
LD A,C
call 0a2h
OUT (091h),a
; strobe
LD A,000h
OUT (090h),a
LD A,001h
OUT (090h),a
POP AF
RET
; print a '$' terminated string to printer
; address in HL
LPSTR: PUSH AF
PUSH HL
PUSH BC
LPSTRLOOP:
LD A,(HL)
cp '$'
JP Z,LPSTREND
LD C,A
CALL LP
INC HL
JP LPSTRLOOP
LPSTREND:
POP BC
POP HL
POP AF
RET
LD_HL_DE:
PUSH DE
POP HL
RET
LD_DE_HL:
PUSH HL
POP DE
REt
; check if any register has a different value than expected
; hl points to the values to compare to
CompareRegs:
PUSH BC
PUSH DE
LD DE,storedregs
; need to compare 6 words
LD C,6
CompareLoop:
; low byte
; get from left
LD A,(HL)
INC HL
; get from right
PUSH HL
CALL LD_HL_DE
LD B,(HL)
INC HL
CALL LD_DE_HL
POP HL
CP B
CALL NZ,mismatch1
; high byte
; get from left
LD A,(HL)
INC HL
; get from right
PUSH HL
CALL LD_HL_DE
LD B,(HL)
INC HL
CALL LD_DE_HL
POP HL
CP B
CALL NZ,mismatch2
DEC C
JP NZ,CompareLoop
FinishCompareLoop:
POP DE
POP BC
RET
PrintTestNr:
; desecription
PUSH HL
LD HL,test_nr
CALL LPSTR
POP HL
; number itself
PUSH BC
PUSH IX
POP BC
CALL PrintWord
POP BC
;
CALL PrintLF
RET
CompareLoopPrintWordNr:
PUSH AF
PUSH HL
PUSH BC
; print description
LD HL, mismatch_nr
CALL LPSTR
; calculate word nr
LD A,006h
SUB C
; print number
LD C,A
CALL PrintByte
CALL PrintLF
POP BC
POP HL
POP AF
RET
mismatch1:
; print test nr
CALL PrintTestNr
PUSH HL
PUSH BC
CALL CompareLoopPrintWordNr
LD HL,lb_mismatch1
CALL LPSTR
LD C,A
CALL PrintByte
LD HL,lb_mismatch2
CALL LPSTR
LD C,B
CALL PrintByte
CALL PrintLF
POP BC
POP HL
RET
mismatch2:
; print test nr
CALL PrintTestNr
PUSH HL
PUSH BC
CALL CompareLoopPrintWordNr
LD HL,hb_mismatch1
CALL LPSTR
LD C,A
CALL PrintByte
LD HL,hb_mismatch2
CALL LPSTR
LD C,B
CALL PrintByte
CALL PrintLF
POP BC
POP HL
RET
; make a copy of all registers
StoreRegs:
ld (sr_sp),sp
ld (sr_bc),bc
ld (sr_de),de
ld (sr_hl),hl
ld (sr_ix),ix
ld (sr_iy),iy
ld (sr_sp),sp
ld sp,temp_stack1
push af
pop de
ld (sr_af),de
ld sp,(sr_sp)
ret
; setup for a new test
; clear registers
ClearTest:
LD BC,DFLT_AF
PUSH BC
POP AF
LD BC,DFLT_BC
LD DE,DFLT_DE
LD HL,DFLT_HL
LD IX,DFLT_IX
LD IY,DFLT_IY
; EXX
; LD BC,00000h
; LD DE,00000h
; LD HL,00000h
; LD IX,00000h
; LD IY,00000h
; PUSH BC
; POP AF
; EXX
ret
storedregs:
sr_af: dw 0
sr_bc: dw 0
sr_de: dw 0
sr_hl: dw 0
sr_ix: dw 0
sr_iy: dw 0
sr_sp: dw 0
temp_stack2: dw 0
temp_stack1: dw 0
test_data: dw 012abh
test_pointer: dw test_data
hello: db "Hello, this is a Z80 unittest.\r\n(C) 2020 by Folkert van Heusden\r\[email protected]\r\n$"
test_nr: db "Test nr: $"
mismatch_nr: db "Failing word: $"
hb_mismatch1: db "High byte mismatch, got: $"
hb_mismatch2: db ", expected: $"
lb_mismatch1: db "Low byte mismatch, got: $"
lb_mismatch2: db ", expected: $"
finished: db "Finished.$"
db 0
End: