# 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