1 1.1 christos # r0-r3 are used as tmps, consider them call clobbered by these macros. 2 1.1 christos # This uses the angel rom monitor calls. 3 1.1 christos # ??? How do we use the \@ facility of .macros ??? 4 1.1 christos # @ is the comment char! 5 1.1 christos 6 1.1 christos .macro mvi_h_gr reg, val 7 1.1 christos ldr \reg,[pc] 8 1.1 christos b . + 8 9 1.1 christos .word \val 10 1.1 christos .endm 11 1.1 christos 12 1.1 christos .macro mvaddr_h_gr reg, addr 13 1.1 christos ldr \reg,[pc] 14 1.1 christos b . + 8 15 1.1 christos .word \addr 16 1.1 christos .endm 17 1.1 christos 18 1.1 christos .macro start 19 1.1 christos .data 20 1.1 christos failmsg: 21 1.1 christos .asciz "fail\n" 22 1.1 christos passmsg: 23 1.1 christos .asciz "pass\n" 24 1.1 christos .text 25 1.1 christos 26 1.1 christos do_pass: 27 1.1 christos ldr r1, passmsg_addr 28 1.1 christos mov r0, #4 29 1.1 christos swi #0x123456 30 1.1 christos exit 0 31 1.1 christos passmsg_addr: 32 1.1 christos .word passmsg 33 1.1 christos 34 1.1 christos do_fail: 35 1.1 christos ldr r1, failmsg_addr 36 1.1 christos mov r0, #4 37 1.1 christos swi #0x123456 38 1.1 christos exit 1 39 1.1 christos failmsg_addr: 40 1.1 christos .word failmsg 41 1.1 christos 42 1.1 christos .global _start 43 1.1 christos _start: 44 1.1 christos .endm 45 1.1 christos 46 1.1 christos # *** Other macros know pass/fail are 4 bytes in size! Yuck. 47 1.1 christos 48 1.1 christos .macro pass 49 1.1 christos b do_pass 50 1.1 christos .endm 51 1.1 christos 52 1.1 christos .macro fail 53 1.1 christos b do_fail 54 1.1 christos .endm 55 1.1 christos 56 1.1 christos .macro exit rc 57 1.1 christos # ??? This works with the ARMulator but maybe not others. 58 1.1 christos #mov r0, #\rc 59 1.1 christos #swi #1 60 1.1 christos # This seems to be portable (though it ignores rc). 61 1.1 christos mov r0,#0x18 62 1.1 christos mvi_h_gr r1, 0x20026 63 1.1 christos swi #0x123456 64 1.1 christos # If that returns, punt with a sigill. 65 1.1 christos stc 0,cr0,[r0] 66 1.1 christos .endm 67 1.1 christos 68 1.1 christos # Other macros know this only clobbers r0. 69 1.1 christos # WARNING: It also clobbers the condition codes (FIXME). 70 1.1 christos .macro test_h_gr reg, val 71 1.1 christos mvaddr_h_gr r0, \val 72 1.1 christos cmp \reg, r0 73 1.1 christos beq . + 8 74 1.1 christos fail 75 1.1 christos .endm 76 1.1 christos 77 1.1 christos .macro mvi_h_cnvz c, n, v, z 78 1.1 christos mov r0, #0 79 1.1 christos .if \c 80 1.1 christos orr r0, r0, #0x20000000 81 1.1 christos .endif 82 1.1 christos .if \n 83 1.1 christos orr r0, r0, #0x80000000 84 1.1 christos .endif 85 1.1 christos .if \v 86 1.1 christos orr r0, r0, #0x10000000 87 1.1 christos .endif 88 1.1 christos .if \z 89 1.1 christos orr r0, r0, #0x40000000 90 1.1 christos .endif 91 1.1 christos mrs r1, cpsr 92 1.1 christos bic r1, r1, #0xf0000000 93 1.1 christos orr r1, r1, r0 94 1.1 christos msr cpsr, r1 95 1.1 christos # ??? nops needed 96 1.1 christos .endm 97 1.1 christos 98 1.1 christos # ??? Preserve condition codes? 99 1.1 christos .macro test_h_cnvz c, n, v, z 100 1.1 christos mov r0, #0 101 1.1 christos .if \c 102 1.1 christos orr r0, r0, #0x20000000 103 1.1 christos .endif 104 1.1 christos .if \n 105 1.1 christos orr r0, r0, #0x80000000 106 1.1 christos .endif 107 1.1 christos .if \v 108 1.1 christos orr r0, r0, #0x10000000 109 1.1 christos .endif 110 1.1 christos .if \z 111 1.1 christos orr r0, r0, #0x40000000 112 1.1 christos .endif 113 1.1 christos mrs r1, cpsr 114 1.1 christos and r1, r1, #0xf0000000 115 1.1 christos cmp r0, r1 116 1.1 christos beq . + 8 117 1.1 christos fail 118 1.1 christos .endm 119