--- nono/exp/optestxp/subr.asm 2026/04/29 17:05:16 1.1.1.1 +++ nono/exp/optestxp/subr.asm 2026/04/29 17:05:20 1.1.1.2 @@ -78,19 +78,20 @@ _puts_byte_buf: ; (HL + 0).W : テスト名のポインタ ; (HL + 2).W : 実行コード ; (HL + 4).W : テストデータの先頭 +; (HL + 6).B : DAA なら 1 ; OUT: - ; USE: all testrun1: LD DE,testname - LD BC,0006H + LD BC,0007H LDIR LD HL,(testname) CALL puts LD IX,(testdata) - XOR A - LD (testpos),A - LD (failcount),A + LD HL,0000H + LD (testpos),HL + LD (failcount),HL _testrun1_loop: LD HL,(total_count) INC HL @@ -120,16 +121,17 @@ _testrun1_cmp_f: _testrun1_next: LD DE,0004H ADD IX,DE - LD A,(testpos) - INC A - LD (testpos),A + LD HL,(testpos) + INC HL + LD (testpos),HL LD A,(IX+3) ; expflag が 0xff なら終了 CP 0FFH JR NZ,_testrun1_loop - LD A,(failcount) - OR A + LD HL,(failcount) + LD A,H + OR L RET NZ LD HL,msg_ok CALL puts @@ -138,45 +140,131 @@ _testrun1_next: ; A レジスタの結果が異なるのでメッセージを表示 fail_a: LD HL,(testname) - CALL puts + CALL puts ; testname PUSH AF + LD A,(testpos+1) + OR A + CALL NZ,puts_byte ; testpos.H LD A,(testpos) - CALL puts_byte - POP AF + CALL puts_byte ; testpos.L + LD A,(isdaa) + OR A + CALL NZ,print_in_daa ; input status if daa LD HL,msg_dst_expects - CALL puts - CALL puts_byte + CALL puts ; A expects + POP AF + CALL puts_byte ; %02x,A LD HL,msg_but - CALL puts + CALL puts ; but LD A,D - CALL puts_byte + CALL puts_byte ; %02x,D LD HL,msg_eol - CALL puts - LD A,(failcount) - INC A - LD (failcount),A + CALL puts ; . + LD HL,(failcount) + INC HL + LD (failcount),HL RET ; F レジスタの結果が異なるのでメッセージを表示 fail_f: LD HL,(testname) - CALL puts + CALL puts ; testname PUSH AF + LD A,(testpos+1) + OR A + CALL NZ,puts_byte ; testpos.H LD A,(testpos) - CALL puts_byte - POP AF + CALL puts_byte ; testpos.L + LD A,(isdaa) + OR A + CALL NZ,print_in_daa ; input status if daa LD HL,msg_f_expects - CALL puts - CALL puts_byte + CALL puts ; F expects + POP AF + CALL puts_byte ; %02x,F + LD (daa_f),A + LD A,(isdaa) + OR A + CALL NZ,print_f_daa ; (flags) LD HL,msg_but - CALL puts + CALL puts ; but LD A,E - CALL puts_byte + CALL puts_byte ; %02x,E + LD (daa_f),A + LD A,(isdaa) + OR A + CALL NZ,print_f_daa ; (flags) LD HL,msg_eol - CALL puts - LD A,(failcount) - INC A - LD (failcount),A + CALL puts ; . + LD HL,(failcount) + INC HL + LD (failcount),HL + RET + +; DAA 用に入力状態を表示。": A=%02x (N=%d H=%d C=%d)" +; IX がテストデータ先頭を指している。 +; AF, HL は破壊可能。 +print_in_daa: + PUSH BC + PUSH DE + LD HL,msg_in_a + CALL puts ; : A= + LD A,(IX+0) + CALL puts_byte ; %02x + LD E,' ' + LD C,02H + CALL 0005H ; ' ' + LD A,(IX+1) + LD (daa_f),A + CALL print_f_daa ; (N= H= C=) + POP DE + POP BC + RET + +; DAA 用にフラグ詳細を表示。"(N=%d H=%d C=%d)" +; 値は (daa_f) 渡し。 +; AF, HL は破壊可能。 +print_f_daa: + PUSH BC + PUSH DE + LD HL,msg_flagn + CALL puts ; (N= + LD A,(daa_f) + AND 02H + SRL A + ADD A,'0' + LD E,A + LD C,02H + CALL 0005H ; n + + LD HL,msg_flagh + CALL puts ; H= + LD A,(daa_f) + AND 10H + SRL A + SRL A + SRL A + SRL A + ADD A,'0' + LD E,A + LD C,02H + CALL 0005H ; h + + LD HL,msg_flagc + CALL puts ; C= + LD A,(daa_f) + AND 01H + ADD A,'0' + LD E,A + LD C,02H + CALL 0005H ; c + + LD E,29H + LD C,02H + CALL 0005H ; ) + + POP DE + POP BC RET ; 2項演算のテストの共通部分。 @@ -184,19 +272,20 @@ fail_f: ; (HL + 0).W : テスト名のポインタ ; (HL + 2).W : 実行コード ; (HL + 4).W : テストデータの先頭 +; (HL + 6).B : ここでは 0 ; OUT: - ; USE: all testrun2: LD DE,testname - LD BC,0006H + LD BC,0007H LDIR LD HL,(testname) CALL puts LD IX,(testdata) - XOR A - LD (testpos),A - LD (failcount),A + LD HL,0000H + LD (testpos),HL + LD (failcount),HL _testrun2_loop: LD HL,(total_count) INC HL @@ -227,16 +316,17 @@ _testrun2_cmp_f: _testrun2_next: LD DE,0005H ADD IX,DE - LD A,(testpos) - INC A - LD (testpos),A + LD HL,(testpos) + INC HL + LD (testpos),HL LD A,(IX+4) ; expflag が 0xff なら終了 CP 0FFH JR NZ,_testrun2_loop - LD A,(failcount) - OR A + LD HL,(failcount) + LD A,H + OR L RET NZ LD HL,msg_ok CALL puts @@ -248,16 +338,20 @@ testexec: defw 0000H ; 実行コードサブルーチンのアドレス testdata: defw 0000H ; テストデータの先頭番地 +isdaa: + defb 00H ; DAA なら表示を変更するため testpos: - defb 0 ; 今のテストの中の何番目か + defw 0 ; 今のテストの中の何番目か failcount: - defb 0 ; 1セクション中の失敗数 + defw 0 ; 1セクション中の失敗数 total_count: defw 0 ; テスト実行総数 total_fail: defw 0 ; テスト失敗総数 +daa_f: + defb 0 ; DAA のフラグ表示用 msg_eol: defb '.', 0DH, 0AH, '$' @@ -273,4 +367,13 @@ msg_but: msg_f_expects: defm ": F expects $" +msg_flagn: + defm "(N=$" +msg_flagh: + defm " H=$" +msg_flagc: + defm " C=$" +msg_in_a: + defm ": A=$" + defb 0, 0, 0 ; padding for disasm