|
|
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 : テストデータの先頭 ! 81: ; OUT: - ! 82: ; USE: all ! 83: testrun1: ! 84: LD DE,testname ! 85: LD BC,0006H ! 86: LDIR ! 87: ! 88: LD HL,(testname) ! 89: CALL puts ! 90: LD IX,(testdata) ! 91: XOR A ! 92: LD (testpos),A ! 93: LD (failcount),A ! 94: _testrun1_loop: ! 95: LD HL,(total_count) ! 96: INC HL ! 97: LD (total_count),HL ! 98: LD D,(IX+0) ! 99: LD E,(IX+1) ! 100: PUSH DE ! 101: POP AF ! 102: ! 103: LD HL,_testrun1_back ! 104: PUSH HL ; 戻りアドレス ! 105: LD HL,(testexec) ! 106: JP (HL) ; CALL testexec ! 107: _testrun1_back: ! 108: PUSH AF ! 109: POP DE ! 110: LD A,(IX+2) ! 111: CP D ! 112: JR Z,_testrun1_cmp_f ! 113: CALL fail_a ! 114: JR _testrun1_next ! 115: _testrun1_cmp_f: ! 116: LD A,(IX+3) ! 117: CP E ! 118: JR Z,_testrun1_next ! 119: CALL fail_f ! 120: _testrun1_next: ! 121: LD DE,0004H ! 122: ADD IX,DE ! 123: LD A,(testpos) ! 124: INC A ! 125: LD (testpos),A ! 126: ! 127: LD A,(IX+3) ; expflag が 0xff なら終了 ! 128: CP 0FFH ! 129: JR NZ,_testrun1_loop ! 130: ! 131: LD A,(failcount) ! 132: OR A ! 133: RET NZ ! 134: LD HL,msg_ok ! 135: CALL puts ! 136: RET ! 137: ! 138: ; A レジスタの結果が異なるのでメッセージを表示 ! 139: fail_a: ! 140: LD HL,(testname) ! 141: CALL puts ! 142: PUSH AF ! 143: LD A,(testpos) ! 144: CALL puts_byte ! 145: POP AF ! 146: LD HL,msg_dst_expects ! 147: CALL puts ! 148: CALL puts_byte ! 149: LD HL,msg_but ! 150: CALL puts ! 151: LD A,D ! 152: CALL puts_byte ! 153: LD HL,msg_eol ! 154: CALL puts ! 155: LD A,(failcount) ! 156: INC A ! 157: LD (failcount),A ! 158: RET ! 159: ! 160: ; F レジスタの結果が異なるのでメッセージを表示 ! 161: fail_f: ! 162: LD HL,(testname) ! 163: CALL puts ! 164: PUSH AF ! 165: LD A,(testpos) ! 166: CALL puts_byte ! 167: POP AF ! 168: LD HL,msg_f_expects ! 169: CALL puts ! 170: CALL puts_byte ! 171: LD HL,msg_but ! 172: CALL puts ! 173: LD A,E ! 174: CALL puts_byte ! 175: LD HL,msg_eol ! 176: CALL puts ! 177: LD A,(failcount) ! 178: INC A ! 179: LD (failcount),A ! 180: RET ! 181: ! 182: ; 2項演算のテストの共通部分。 ! 183: ; IN: HL テストセットの先頭番地 ! 184: ; (HL + 0).W : テスト名のポインタ ! 185: ; (HL + 2).W : 実行コード ! 186: ; (HL + 4).W : テストデータの先頭 ! 187: ; OUT: - ! 188: ; USE: all ! 189: testrun2: ! 190: LD DE,testname ! 191: LD BC,0006H ! 192: LDIR ! 193: ! 194: LD HL,(testname) ! 195: CALL puts ! 196: LD IX,(testdata) ! 197: XOR A ! 198: LD (testpos),A ! 199: LD (failcount),A ! 200: _testrun2_loop: ! 201: LD HL,(total_count) ! 202: INC HL ! 203: LD (total_count),HL ! 204: LD D,(IX+0) ! 205: LD E,(IX+1) ! 206: PUSH DE ! 207: LD D,(IX+2) ! 208: POP AF ! 209: ! 210: LD HL,_testrun2_back ! 211: PUSH HL ; 戻りアドレス ! 212: LD HL,(testexec) ! 213: JP (HL) ; CALL testexec ! 214: _testrun2_back: ! 215: PUSH AF ! 216: POP DE ! 217: LD A,(IX+3) ! 218: CP D ! 219: JR Z,_testrun2_cmp_f ! 220: CALL fail_a ! 221: JR _testrun2_next ! 222: _testrun2_cmp_f: ! 223: LD A,(IX+4) ! 224: CP E ! 225: JR Z,_testrun2_next ! 226: CALL fail_f ! 227: _testrun2_next: ! 228: LD DE,0005H ! 229: ADD IX,DE ! 230: LD A,(testpos) ! 231: INC A ! 232: LD (testpos),A ! 233: ! 234: LD A,(IX+4) ; expflag が 0xff なら終了 ! 235: CP 0FFH ! 236: JR NZ,_testrun2_loop ! 237: ! 238: LD A,(failcount) ! 239: OR A ! 240: RET NZ ! 241: LD HL,msg_ok ! 242: CALL puts ! 243: RET ! 244: ! 245: testname: ! 246: defw 0000H ; テスト名のアドレス ! 247: testexec: ! 248: defw 0000H ; 実行コードサブルーチンのアドレス ! 249: testdata: ! 250: defw 0000H ; テストデータの先頭番地 ! 251: ! 252: ! 253: testpos: ! 254: defb 0 ; 今のテストの中の何番目か ! 255: failcount: ! 256: defb 0 ; 1セクション中の失敗数 ! 257: total_count: ! 258: defw 0 ; テスト実行総数 ! 259: total_fail: ! 260: defw 0 ; テスト失敗総数 ! 261: ! 262: msg_eol: ! 263: defb '.', 0DH, 0AH, '$' ! 264: msg_crlf: ! 265: defb 0DH, 0AH, '$' ! 266: msg_ok: ! 267: defm "OK" ! 268: defb 0DH, 0AH, '$' ! 269: msg_dst_expects: ! 270: defm ": A expects $" ! 271: msg_but: ! 272: defm " but $" ! 273: msg_f_expects: ! 274: defm ": F expects $" ! 275: ! 276: 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.