1 .macro start 2 .text 3 .align 2 4 .globl _start 5_start: 6 ldi r0, 0 7 .endm 8 9 10 .macro exit47 11 ldi r4, 1 12 ldi r0, 47 13 trap 15 14 .endm 15 16 17 .macro exit0 18 ldi r4, 1 19 ldi r0, 0 20 trap 15 21 .endm 22 23 24 .macro exit1 25 ldi r4, 1 26 ldi r0, 1 27 trap 15 28 .endm 29 30 31 .macro exit2 32 ldi r4, 1 33 ldi r0, 2 34 trap 15 35 .endm 36 37 38 .macro load reg val 39 ldi \reg, #\val 40 .endm 41 42 43 .macro load2w reg hi lo 44 ld2w \reg, @(1f,r0) 45 .data 46 .align 2 471: .short \hi 48 .short \lo 49 .text 50 .endm 51 52 53 .macro check exit reg val 54 cmpeqi \reg, #\val 55 brf0t 1f 560: ldi r4, 1 57 ldi r0, \exit 58 trap 15 591: 60 .endm 61 62 63 .macro check2w2 exit reg hi lo 64 st2w \reg, @(1f,r0) 65 ld r2, @(1f, r0) 66 cmpeqi r2, #\hi 67 brf0f 0f 68 ld r2, @(1f + 2, r0) 69 cmpeqi r2, #\lo 70 brf0f 0f 71 bra 2f 720: ldi r4, 1 73 ldi r0, \exit 74 trap 15 75 .data 76 .align 2 771: .long 0 78 .text 792: 80 .endm 81 82 83 .macro loadacc2 acc guard hi lo 84 ldi r2, #\lo 85 mvtaclo r2, \acc 86 ldi r2, #\hi 87 mvtachi r2, \acc 88 ldi r2, #\guard 89 mvtacg r2, \acc 90 .endm 91 92 93 .macro checkacc2 exit acc guard hi lo 94 ldi r2, #\guard 95 mvfacg r3, \acc 96 cmpeq r2, r3 97 brf0f 0f 98 ldi r2, #\hi 99 mvfachi r3, \acc 100 cmpeq r2, r3 101 brf0f 0f 102 ldi r2, #\lo 103 mvfaclo r3, \acc 104 cmpeq r2, r3 105 brf0f 0f 106 bra 4f 1070: ldi r4, 1 108 ldi r0, \exit 109 trap 15 1104: 111 .endm 112 113 114 .macro loadpsw2 val 115 ldi r2, #\val 116 mvtc r2, cr0 117 .endm 118 119 120 .macro checkpsw2 exit val 121 mvfc r2, cr0 122 cmpeqi r2, #\val 123 brf0t 1f 124 ldi r4, 1 125 ldi r0, \exit 126 trap 15 1271: 128 .endm 129 130 131 .macro hello 132 ;; 4:write (1, string, strlen (string)) 133 ldi r4, 4 134 ldi r0, 1 135 ldi r1, 1f 136 ldi r2, 2f-1f-1 137 trap 15 138 .section .rodata 1391: .string "Hello World!\n" 1402: .align 2 141 .text 142 .endm 143 144 145;;; Blat our DMAP registers so that they point at on-chip imem 146 .macro point_dmap_at_imem 147 .text 148 ldi r2, MAP_INSN | 0xf 149 st r2, @(DMAP_REG,r0) 150 ldi r2, MAP_INSN 151 st r2, @(IMAP1_REG,r0) 152 .endm 153 154;;; Patch VEC so that it jumps back to code that checks PSW 155;;; and then exits with success. 156 .macro check_interrupt vec psw src 157;;; Patch the interrupt vector's AE entry with a jmp to success 158 .text 159 ldi r4, #1f 160 ldi r5, \vec 161 ;; 162 ld2w r2, @(0,r4) 163 st2w r2, @(0,r5) 164 ld2w r2, @(4,r4) 165 st2w r2, @(4,r5) 166 ;; 167 bra 9f 168 nop 169;;; Code that gets patched into the interrupt vector 170 .data 1711: ldi r1, 2f@word 172 jmp r1 173;;; Successfull trap jumps back to here 174 .text 175;;; Verify the PSW 1762: mvfc r2, cr0 177 cmpeqi r2, #\psw 178 brf0t 3f 179 nop 180 exit1 181;;; Verify the original addr 1823: mvfc r2, bpc 183 cmpeqi r2, #\src@word 184 brf0t 4f 185 exit2 1864: exit0 187;;; continue as normal 1889: 189 .endm 190 191 192 PSW_SM = 0x8000 193 PSW_01 = 0x4000 194 PSW_EA = 0x2000 195 PSW_DB = 0x1000 196 PSW_DM = 0x0800 197 PSW_IE = 0x0400 198 PSW_RP = 0x0200 199 PSW_MD = 0x0100 200 PSW_FX = 0x0080 201 PSW_ST = 0x0040 202 PSW_10 = 0x0020 203 PSW_11 = 0x0010 204 PSW_F0 = 0x0008 205 PSW_F1 = 0x0004 206 PSW_14 = 0x0002 207 PSW_C = 0x0001 208 209 210;;; 211 212 DMAP_MASK = 0x3fff 213 DMAP_BASE = 0x8000 214 DMAP_REG = 0xff04 215 216 IMAP0_REG = 0xff00 217 IMAP1_REG = 0xff02 218 219 MAP_INSN = 0x1000 220 221;;; 222 223 VEC_RI = 0x3ff00 224 VEC_BAE = 0x3ff04 225 VEC_RIE = 0x3ff08 226 VEC_AE = 0x3ff0c 227 VEC_TRAP = 0x3ff10 228 VEC_DBT = 0x3ff50 229 VEC_SDBT = 0x3fff4 230 VEC_DBI = 0x3ff58 231 VEC_EI = 0x3ff5c 232 233 234