nkeynes@226: .altmacro nkeynes@226: .macro fail name nkeynes@226: LOCAL LC1 nkeynes@226: LOCAL LC2 nkeynes@226: add #1, r13 nkeynes@226: mov.l LC1, r3 nkeynes@226: mov r12, r5 nkeynes@226: mov.l \name, r4 nkeynes@226: xor r6, r6 nkeynes@226: jsr @r3 nkeynes@226: nop nkeynes@226: bra LC2 nkeynes@226: nop nkeynes@226: .align 4 nkeynes@226: LC1: nkeynes@226: .long _test_print_failure nkeynes@226: LC2: nkeynes@226: .endm nkeynes@226: nkeynes@226: .macro failm name msg nkeynes@226: LOCAL LC1 nkeynes@226: LOCAL LC2 nkeynes@226: add #1, r13 nkeynes@226: mov.l LC1, r3 nkeynes@226: mov r12, r5 nkeynes@226: mov.l \name, r4 nkeynes@226: mov.l \msg, r6 nkeynes@226: jsr @r3 nkeynes@226: nop nkeynes@226: bra LC2 nkeynes@226: nop nkeynes@226: .align 4 nkeynes@226: LC1: nkeynes@226: .long _test_print_failure nkeynes@226: LC2: nkeynes@226: .endm nkeynes@226: nkeynes@226: nkeynes@226: .macro start_test nkeynes@226: mov.l r14, @-r15 nkeynes@226: sts.l pr, @-r15 nkeynes@226: mov.l r12, @-r15 nkeynes@226: mov.l r13, @-r15 nkeynes@226: mov r15, r14 nkeynes@226: xor r12,r12 nkeynes@226: xor r13,r13 nkeynes@226: ! r12 is the test counter nkeynes@226: ! r13 is the failed-test counter nkeynes@226: .endm nkeynes@226: nkeynes@226: .macro end_test name nkeynes@226: LOCAL test_print_result_k nkeynes@226: mov.l \name, r4 nkeynes@226: mov r13, r5 nkeynes@226: mov r12, r6 nkeynes@226: mov.l test_print_result_k, r3 nkeynes@226: jsr @r3 nkeynes@226: nop nkeynes@226: mov r14, r15 nkeynes@226: mov.l @r15+, r13 nkeynes@226: mov.l @r15+, r12 nkeynes@226: lds.l @r15+, pr nkeynes@226: mov.l @r15+, r14 nkeynes@226: rts nkeynes@226: nop nkeynes@226: .align 4 nkeynes@226: test_print_result_k: nkeynes@226: .long _test_print_result nkeynes@226: .endm nkeynes@226: nkeynes@226: nkeynes@226: .macro assert_t_set testname nkeynes@226: LOCAL LC1 nkeynes@226: LOCAL LC2 nkeynes@226: LOCAL LCM nkeynes@226: stc sr, r1 nkeynes@226: mov.l r1, @-r15 nkeynes@226: xor r0, r0 nkeynes@226: add #1, r0 nkeynes@226: and r0, r1 nkeynes@226: cmp/eq r0, r1 nkeynes@226: bt LC2 nkeynes@226: add #1, r13 nkeynes@226: mov.l LC1, r3 nkeynes@226: mov r12, r5 nkeynes@226: mov.l \testname, r4 nkeynes@226: mov.l LCM, r6 nkeynes@226: jsr @r3 nkeynes@226: nop nkeynes@226: bra LC2 nkeynes@226: nop nkeynes@226: .align 4 nkeynes@226: LC1: nkeynes@226: .long _test_print_failure nkeynes@226: LCM: .long assert_t_clear_message nkeynes@226: LC2: nkeynes@226: mov.l @r15+, r1 nkeynes@226: ldc r1, sr nkeynes@226: .endm nkeynes@226: nkeynes@226: .macro assert_t_clear testname nkeynes@226: LOCAL LC1 nkeynes@226: LOCAL LC2 nkeynes@226: LOCAL LCM nkeynes@226: stc sr, r1 nkeynes@226: mov.l r1, @-r15 nkeynes@226: xor r0, r0 nkeynes@226: add #1, r0 nkeynes@226: and r0, r1 nkeynes@226: cmp/eq r0, r1 nkeynes@226: bf LC2 nkeynes@226: add #1, r13 nkeynes@226: mov.l LC1, r3 nkeynes@226: mov r12, r5 nkeynes@226: mov.l \testname, r4 nkeynes@226: mov.l LCM, r6 nkeynes@226: jsr @r3 nkeynes@226: nop nkeynes@226: bra LC2 nkeynes@226: nop nkeynes@226: .align 4 nkeynes@226: LC1: nkeynes@226: .long _test_print_failure nkeynes@226: LCM: .long assert_t_clear_message nkeynes@226: LC2: nkeynes@226: mov.l @r15+, r1 nkeynes@226: ldc r1, sr nkeynes@226: .endm nkeynes@226: nkeynes@226: ! Note that yes there is a perfectly good clrt instruction, but we try to nkeynes@226: ! minimize the number of instructions we depend on here. nkeynes@226: nkeynes@226: .macro clc nkeynes@226: xor r0, r0 nkeynes@226: addc r0, r0 nkeynes@226: .endm nkeynes@226: .macro setc nkeynes@226: xor r0, r0 nkeynes@226: not r0, r0 nkeynes@226: addc r0, r0 nkeynes@226: .endm nkeynes@226: nkeynes@228: .macro clearbl nkeynes@228: LOCAL L1 nkeynes@228: LOCAL L2 nkeynes@228: mov.l L1, r0 nkeynes@228: stc sr, r1 nkeynes@228: and r0, r1 nkeynes@228: ldc r1, sr nkeynes@228: bra L2 nkeynes@228: nop nkeynes@228: .align 4 nkeynes@228: L1: .long 0xEFFFFFFF nkeynes@228: L2: nkeynes@228: .endm nkeynes@228: nkeynes@228: .macro setbl nkeynes@228: LOCAL L1 nkeynes@228: LOCAL L2 nkeynes@228: xor r0, r0 nkeynes@228: add #1, r0 nkeynes@228: shll r0, 28 nkeynes@228: stc sr, r1 nkeynes@228: or r0, r1 nkeynes@228: ldc r1, sr nkeynes@228: bra L2 nkeynes@228: nop nkeynes@228: .align 4 nkeynes@228: L1: .long 0x10000000 nkeynes@228: L2: nkeynes@228: .endm nkeynes@228: nkeynes@228: .macro expect_exc code nkeynes@228: LOCAL L1, L2, L3 nkeynes@228: mov.l L1, r3 nkeynes@228: mov.l L2, r4 nkeynes@228: jsr @r3 nkeynes@228: nop nkeynes@228: bra L3 nkeynes@228: nop nkeynes@228: .align 4 nkeynes@228: L1: .long _expect_exception nkeynes@228: L2: .long \code nkeynes@228: L3: nkeynes@228: nkeynes@228: .endm nkeynes@228: nkeynes@228: .macro assert_exc_caught testname, expectpc nkeynes@231: LOCAL L1, L2, L3 nkeynes@228: mov.l L1, r3 nkeynes@228: mov.l \testname, r4 nkeynes@228: mov r12, r5 nkeynes@228: mov.l L2, r6 nkeynes@228: jsr @r3 nkeynes@228: nop nkeynes@228: add r0, r13 nkeynes@228: bra L3 nkeynes@228: nop nkeynes@228: .align 4 nkeynes@228: L1: .long _assert_exception_caught nkeynes@228: L2: .long \expectpc nkeynes@228: L3: nkeynes@228: .endm nkeynes@226: nkeynes@226: .align 2 nkeynes@226: assert_t_set_message: nkeynes@226: .string "Expected T=1 but was 0" nkeynes@226: nkeynes@226: assert_t_clear_message: nkeynes@226: .string "Expected T=0 but was 1" nkeynes@226: