Annotation of nono/exp/optestxp/subr.asm, revision 1.1.1.2

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

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.