|
|
1.1 root 1: ; vi:set ts=8:
2:
3: ;
4: ; nono
5: ; Copyright (C) 2023 nono project
6: ; Licensed under nono-license.txt
7: ;
8:
9: ; テストのサブルーチン。
10: ; 分割アセンブルが出来ないので cat で後ろに追加する。
11:
12: ; 文字列をメイン側に送る。
13: ; HL に出力する文字列の先頭番地。文字列は '$' で終端。
14: ; 文字 '^Z'(0x1a) を出力した時点でプログラムを終了。
15: ; ホスト側の終了指示も兼ねているのでこの文字自体は送る。
16: puts:
17: PUSH AF
18: PUSH BC
19: PUSH DE
20: PUSH HL
21: EX DE,HL
22: LD C,09H
23: CALL 0005H
24: POP HL
25: POP DE
26: POP BC
27: POP AF
28: RET
29:
30: ; A レジスタの内容を16進数2文字にして (HL) に書き出す
31: ; Inp: A: 変換したいバイト
32: ; HL: 出力先バッファ
33: ; Out: HL: 入力 +2 され、ここは '\0' が書き出してある。
34: ; Use: -
35: strhex_byte:
36: PUSH AF
37: PUSH BC
38: LD B,A ; Backup A
39: SRL A
40: SRL A
41: SRL A
42: SRL A ; A >>= 4
43: CALL strhex_1
44: LD A,B
45: AND 0FH
46: CALL strhex_1
47: LD (HL),'$'
48: POP BC
49: POP AF
50: RET
51: strhex_1:
52: CP 0AH
53: JR C,_sh_2
54: ADD A,7H
55: _sh_2:
56: ADD A,30H
57: LD (HL),A
58: INC HL
59: RET
60:
61: ; A レジスタの内容を16進数2文字にして出力する。
62: puts_byte:
63: PUSH AF
64: PUSH HL
65: LD HL,_puts_byte_buf
66: CALL strhex_byte
67: LD HL,_puts_byte_buf
68: CALL puts
69: POP HL
70: POP AF
71: RET
72:
73: _puts_byte_buf:
74: defs 4
75:
76: ; 単項演算のテストの共通部分。
77: ; IN: HL テストセットの先頭番地
78: ; (HL + 0).W : テスト名のポインタ
79: ; (HL + 2).W : 実行コード
80: ; (HL + 4).W : テストデータの先頭
1.1.1.2 ! root 81: ; (HL + 6).B : DAA なら 1
1.1 root 82: ; OUT: -
83: ; USE: all
84: testrun1:
85: LD DE,testname
1.1.1.2 ! root 86: LD BC,0007H
1.1 root 87: LDIR
88:
89: LD HL,(testname)
90: CALL puts
91: LD IX,(testdata)
1.1.1.2 ! root 92: LD HL,0000H
! 93: LD (testpos),HL
! 94: LD (failcount),HL
1.1 root 95: _testrun1_loop:
96: LD HL,(total_count)
97: INC HL
98: LD (total_count),HL
99: LD D,(IX+0)
100: LD E,(IX+1)
101: PUSH DE
102: POP AF
103:
104: LD HL,_testrun1_back
105: PUSH HL ; 戻りアドレス
106: LD HL,(testexec)
107: JP (HL) ; CALL testexec
108: _testrun1_back:
109: PUSH AF
110: POP DE
111: LD A,(IX+2)
112: CP D
113: JR Z,_testrun1_cmp_f
114: CALL fail_a
115: JR _testrun1_next
116: _testrun1_cmp_f:
117: LD A,(IX+3)
118: CP E
119: JR Z,_testrun1_next
120: CALL fail_f
121: _testrun1_next:
122: LD DE,0004H
123: ADD IX,DE
1.1.1.2 ! root 124: LD HL,(testpos)
! 125: INC HL
! 126: LD (testpos),HL
1.1 root 127:
128: LD A,(IX+3) ; expflag が 0xff なら終了
129: CP 0FFH
130: JR NZ,_testrun1_loop
131:
1.1.1.2 ! root 132: LD HL,(failcount)
! 133: LD A,H
! 134: OR L
1.1 root 135: RET NZ
136: LD HL,msg_ok
137: CALL puts
138: RET
139:
140: ; A レジスタの結果が異なるのでメッセージを表示
141: fail_a:
142: LD HL,(testname)
1.1.1.2 ! root 143: CALL puts ; testname
1.1 root 144: PUSH AF
1.1.1.2 ! root 145: LD A,(testpos+1)
! 146: OR A
! 147: CALL NZ,puts_byte ; testpos.H
1.1 root 148: LD A,(testpos)
1.1.1.2 ! root 149: CALL puts_byte ; testpos.L
! 150: LD A,(isdaa)
! 151: OR A
! 152: CALL NZ,print_in_daa ; input status if daa
1.1 root 153: LD HL,msg_dst_expects
1.1.1.2 ! root 154: CALL puts ; A expects
! 155: POP AF
! 156: CALL puts_byte ; %02x,A
1.1 root 157: LD HL,msg_but
1.1.1.2 ! root 158: CALL puts ; but
1.1 root 159: LD A,D
1.1.1.2 ! root 160: CALL puts_byte ; %02x,D
1.1 root 161: LD HL,msg_eol
1.1.1.2 ! root 162: CALL puts ; .
! 163: LD HL,(failcount)
! 164: INC HL
! 165: LD (failcount),HL
1.1 root 166: RET
167:
168: ; F レジスタの結果が異なるのでメッセージを表示
169: fail_f:
170: LD HL,(testname)
1.1.1.2 ! root 171: CALL puts ; testname
1.1 root 172: PUSH AF
1.1.1.2 ! root 173: LD A,(testpos+1)
! 174: OR A
! 175: CALL NZ,puts_byte ; testpos.H
1.1 root 176: LD A,(testpos)
1.1.1.2 ! root 177: CALL puts_byte ; testpos.L
! 178: LD A,(isdaa)
! 179: OR A
! 180: CALL NZ,print_in_daa ; input status if daa
1.1 root 181: LD HL,msg_f_expects
1.1.1.2 ! root 182: CALL puts ; F expects
! 183: POP AF
! 184: CALL puts_byte ; %02x,F
! 185: LD (daa_f),A
! 186: LD A,(isdaa)
! 187: OR A
! 188: CALL NZ,print_f_daa ; (flags)
1.1 root 189: LD HL,msg_but
1.1.1.2 ! root 190: CALL puts ; but
1.1 root 191: LD A,E
1.1.1.2 ! root 192: CALL puts_byte ; %02x,E
! 193: LD (daa_f),A
! 194: LD A,(isdaa)
! 195: OR A
! 196: CALL NZ,print_f_daa ; (flags)
1.1 root 197: LD HL,msg_eol
1.1.1.2 ! root 198: CALL puts ; .
! 199: LD HL,(failcount)
! 200: INC HL
! 201: LD (failcount),HL
! 202: RET
! 203:
! 204: ; DAA 用に入力状態を表示。": A=%02x (N=%d H=%d C=%d)"
! 205: ; IX がテストデータ先頭を指している。
! 206: ; AF, HL は破壊可能。
! 207: print_in_daa:
! 208: PUSH BC
! 209: PUSH DE
! 210: LD HL,msg_in_a
! 211: CALL puts ; : A=
! 212: LD A,(IX+0)
! 213: CALL puts_byte ; %02x
! 214: LD E,' '
! 215: LD C,02H
! 216: CALL 0005H ; ' '
! 217: LD A,(IX+1)
! 218: LD (daa_f),A
! 219: CALL print_f_daa ; (N= H= C=)
! 220: POP DE
! 221: POP BC
! 222: RET
! 223:
! 224: ; DAA 用にフラグ詳細を表示。"(N=%d H=%d C=%d)"
! 225: ; 値は (daa_f) 渡し。
! 226: ; AF, HL は破壊可能。
! 227: print_f_daa:
! 228: PUSH BC
! 229: PUSH DE
! 230: LD HL,msg_flagn
! 231: CALL puts ; (N=
! 232: LD A,(daa_f)
! 233: AND 02H
! 234: SRL A
! 235: ADD A,'0'
! 236: LD E,A
! 237: LD C,02H
! 238: CALL 0005H ; n
! 239:
! 240: LD HL,msg_flagh
! 241: CALL puts ; H=
! 242: LD A,(daa_f)
! 243: AND 10H
! 244: SRL A
! 245: SRL A
! 246: SRL A
! 247: SRL A
! 248: ADD A,'0'
! 249: LD E,A
! 250: LD C,02H
! 251: CALL 0005H ; h
! 252:
! 253: LD HL,msg_flagc
! 254: CALL puts ; C=
! 255: LD A,(daa_f)
! 256: AND 01H
! 257: ADD A,'0'
! 258: LD E,A
! 259: LD C,02H
! 260: CALL 0005H ; c
! 261:
! 262: LD E,29H
! 263: LD C,02H
! 264: CALL 0005H ; )
! 265:
! 266: POP DE
! 267: POP BC
1.1 root 268: RET
269:
270: ; 2項演算のテストの共通部分。
271: ; IN: HL テストセットの先頭番地
272: ; (HL + 0).W : テスト名のポインタ
273: ; (HL + 2).W : 実行コード
274: ; (HL + 4).W : テストデータの先頭
1.1.1.2 ! root 275: ; (HL + 6).B : ここでは 0
1.1 root 276: ; OUT: -
277: ; USE: all
278: testrun2:
279: LD DE,testname
1.1.1.2 ! root 280: LD BC,0007H
1.1 root 281: LDIR
282:
283: LD HL,(testname)
284: CALL puts
285: LD IX,(testdata)
1.1.1.2 ! root 286: LD HL,0000H
! 287: LD (testpos),HL
! 288: LD (failcount),HL
1.1 root 289: _testrun2_loop:
290: LD HL,(total_count)
291: INC HL
292: LD (total_count),HL
293: LD D,(IX+0)
294: LD E,(IX+1)
295: PUSH DE
296: LD D,(IX+2)
297: POP AF
298:
299: LD HL,_testrun2_back
300: PUSH HL ; 戻りアドレス
301: LD HL,(testexec)
302: JP (HL) ; CALL testexec
303: _testrun2_back:
304: PUSH AF
305: POP DE
306: LD A,(IX+3)
307: CP D
308: JR Z,_testrun2_cmp_f
309: CALL fail_a
310: JR _testrun2_next
311: _testrun2_cmp_f:
312: LD A,(IX+4)
313: CP E
314: JR Z,_testrun2_next
315: CALL fail_f
316: _testrun2_next:
317: LD DE,0005H
318: ADD IX,DE
1.1.1.2 ! root 319: LD HL,(testpos)
! 320: INC HL
! 321: LD (testpos),HL
1.1 root 322:
323: LD A,(IX+4) ; expflag が 0xff なら終了
324: CP 0FFH
325: JR NZ,_testrun2_loop
326:
1.1.1.2 ! root 327: LD HL,(failcount)
! 328: LD A,H
! 329: OR L
1.1 root 330: RET NZ
331: LD HL,msg_ok
332: CALL puts
333: RET
334:
335: testname:
336: defw 0000H ; テスト名のアドレス
337: testexec:
338: defw 0000H ; 実行コードサブルーチンのアドレス
339: testdata:
340: defw 0000H ; テストデータの先頭番地
1.1.1.2 ! root 341: isdaa:
! 342: defb 00H ; DAA なら表示を変更するため
1.1 root 343:
344:
345: testpos:
1.1.1.2 ! root 346: defw 0 ; 今のテストの中の何番目か
1.1 root 347: failcount:
1.1.1.2 ! root 348: defw 0 ; 1セクション中の失敗数
1.1 root 349: total_count:
350: defw 0 ; テスト実行総数
351: total_fail:
352: defw 0 ; テスト失敗総数
1.1.1.2 ! root 353: daa_f:
! 354: defb 0 ; DAA のフラグ表示用
1.1 root 355:
356: msg_eol:
357: defb '.', 0DH, 0AH, '$'
358: msg_crlf:
359: defb 0DH, 0AH, '$'
360: msg_ok:
361: defm "OK"
362: defb 0DH, 0AH, '$'
363: msg_dst_expects:
364: defm ": A expects $"
365: msg_but:
366: defm " but $"
367: msg_f_expects:
368: defm ": F expects $"
369:
1.1.1.2 ! root 370: msg_flagn:
! 371: defm "(N=$"
! 372: msg_flagh:
! 373: defm " H=$"
! 374: msg_flagc:
! 375: defm " C=$"
! 376: msg_in_a:
! 377: defm ": A=$"
! 378:
1.1 root 379: defb 0, 0, 0 ; padding for disasm
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.