|  | # FIXME: wip, copied from ../testutils.inc | 
|  | # r0-r3 are used as tmps, consider them call clobbered by these macros. | 
|  | # This uses the angel rom monitor calls. | 
|  | # ??? How do we use the \@ facility of .macros ??? | 
|  | # @ is the comment char! | 
|  |  | 
|  | .macro a_mvi_h_gr reg, val | 
|  | ldr \reg,[pc] | 
|  | b . + 8 | 
|  | .word \val | 
|  | .endm | 
|  |  | 
|  | .macro mvaddr_h_gr reg, addr | 
|  | ldr \reg,[pc] | 
|  | b . + 8 | 
|  | .word \val | 
|  | .endm | 
|  |  | 
|  | .macro start | 
|  | .data | 
|  | failmsg: | 
|  | .asciz "fail\n" | 
|  | passmsg: | 
|  | .asciz "pass\n" | 
|  | .text | 
|  |  | 
|  | do_pass: | 
|  | ldr r1, passmsg_addr | 
|  | mov r0, #4 | 
|  | swi #0x123456 | 
|  | exit 0 | 
|  | passmsg_addr: | 
|  | .word passmsg | 
|  |  | 
|  | do_fail: | 
|  | ldr r1, failmsg_addr | 
|  | mov r0, #4 | 
|  | swi #0x123456 | 
|  | exit 1 | 
|  | failmsg_addr: | 
|  | .word failmsg | 
|  |  | 
|  | .global _start | 
|  | _start: | 
|  | .endm | 
|  |  | 
|  | # *** Other macros know pass/fail are 4 bytes in size!  Yuck. | 
|  |  | 
|  | .macro pass | 
|  | b do_pass | 
|  | .endm | 
|  |  | 
|  | .macro fail | 
|  | b do_fail | 
|  | .endm | 
|  |  | 
|  | .macro exit rc | 
|  | mov r1, #\rc | 
|  | mov r0, #0x2a @ decimal 42 | 
|  | swi #1 | 
|  | # If that returns, punt with a sigill. | 
|  | stc 0,cr0,[r0] | 
|  | .endm | 
|  |  | 
|  | # Other macros know this only clobbers r0. | 
|  | .macro test_h_gr reg, val | 
|  | mvaddr_h_gr r0, \val | 
|  | cmp \reg, r0 | 
|  | beq . + 8 | 
|  | fail | 
|  | .endm | 
|  |  | 
|  | .macro mvi_h_cc c, n, v, z | 
|  | ldi8 r0, 0 | 
|  | ldi8 r1, 1 | 
|  | .if xxx | 
|  | cmp r0, r1 | 
|  | .else | 
|  | cmp r1, r0 | 
|  | .endif | 
|  | .endm | 
|  |  | 
|  | .macro test_h_cc c, n, v, z | 
|  | .if xxx | 
|  | bc . + 8 | 
|  | fail | 
|  | .else | 
|  | bnc . + 8 | 
|  | fail | 
|  | .endif | 
|  | .endm |