123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118 |
- # 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
|