| # Write ch to the standard output | |
| .macro outch ch | |
| ldk $r0,\ch | |
| sta 0x10000,$r0 | |
| .endm | |
| # End the test with return code c | |
| .macro exit c | |
| ldk $r0,\c | |
| sta 0x1fffc,$r0 | |
| .endm | |
| # All assembler tests should start with this macro "start" | |
| .macro start | |
| .text | |
| jmp __start | |
| jmp __start | |
| reti | |
| .data | |
| ccsave: .long 0 | |
| .text | |
| # Fiddling to load $cc from the following word in program memory | |
| loadcc: | |
| exi $r29,$sp,0 | |
| lpmi $cc,$r29,0 | |
| add $r29,$r29,4 | |
| exi $r29,$sp,0 | |
| return | |
| failcase: | |
| outch 'f' | |
| outch 'a' | |
| outch 'i' | |
| outch 'l' | |
| outch '\n' | |
| exit 1 | |
| __start: | |
| .endm | |
| # At the end of the test, the code should reach this macro PASS | |
| .macro PASS | |
| outch 'p' | |
| outch 'a' | |
| outch 's' | |
| outch 's' | |
| outch '\n' | |
| exit 0 | |
| .endm | |
| # Confirm that reg has value, and fail immediately if not | |
| # Preserves all registers | |
| .macro EXPECT reg,value | |
| sta ccsave,$cc | |
| call loadcc | |
| .long \value | |
| cmp \reg,$cc | |
| jmpc nz,failcase | |
| lda $cc,ccsave | |
| .endm |