| # 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 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 \addr | |
| .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 | |
| # ??? This works with the ARMulator but maybe not others. | |
| #mov r0, #\rc | |
| #swi #1 | |
| # This seems to be portable (though it ignores rc). | |
| mov r0,#0x18 | |
| mvi_h_gr r1, 0x20026 | |
| swi #0x123456 | |
| # If that returns, punt with a sigill. | |
| stc 0,cr0,[r0] | |
| .endm | |
| # Other macros know this only clobbers r0. | |
| # WARNING: It also clobbers the condition codes (FIXME). | |
| .macro test_h_gr reg, val | |
| mvaddr_h_gr r0, \val | |
| cmp \reg, r0 | |
| beq . + 8 | |
| fail | |
| .endm | |
| .macro mvi_h_cnvz c, n, v, z | |
| mov r0, #0 | |
| .if \c | |
| orr r0, r0, #0x20000000 | |
| .endif | |
| .if \n | |
| orr r0, r0, #0x80000000 | |
| .endif | |
| .if \v | |
| orr r0, r0, #0x10000000 | |
| .endif | |
| .if \z | |
| orr r0, r0, #0x40000000 | |
| .endif | |
| mrs r1, cpsr | |
| bic r1, r1, #0xf0000000 | |
| orr r1, r1, r0 | |
| msr cpsr, r1 | |
| # ??? nops needed | |
| .endm | |
| # ??? Preserve condition codes? | |
| .macro test_h_cnvz c, n, v, z | |
| mov r0, #0 | |
| .if \c | |
| orr r0, r0, #0x20000000 | |
| .endif | |
| .if \n | |
| orr r0, r0, #0x80000000 | |
| .endif | |
| .if \v | |
| orr r0, r0, #0x10000000 | |
| .endif | |
| .if \z | |
| orr r0, r0, #0x40000000 | |
| .endif | |
| mrs r1, cpsr | |
| and r1, r1, #0xf0000000 | |
| cmp r0, r1 | |
| beq . + 8 | |
| fail | |
| .endm |