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
47 1:	.short \hi
48 	.short \lo
49 	.text
50 	.endm
51 
52 
53 	.macro check exit reg val
54 	cmpeqi	\reg, #\val
55 	brf0t 1f
56 0:	ldi r4, 1
57 	ldi r0, \exit
58 	trap 15
59 1:
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
72 0:	ldi r4, 1
73 	ldi r0, \exit
74 	trap 15
75 	.data
76 	.align 2
77 1:	.long 0
78 	.text
79 2:
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
107 0:	ldi r4, 1
108 	ldi r0, \exit
109 	trap 15
110 4:
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
127 1:
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
139 1:	.string "Hello World!\n"
140 2:	.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
171 1:	ldi r1, 2f@word
172 	jmp r1
173 ;;; Successfull trap jumps back to here
174 	.text
175 ;;; Verify the PSW
176 2:	mvfc	r2, cr0
177 	cmpeqi	r2, #\psw
178 	brf0t	3f
179 	nop
180 	exit1
181 ;;; Verify the original addr
182 3:	mvfc	r2, bpc
183 	cmpeqi	r2, #\src@word
184 	brf0t	4f
185 	exit2
186 4:	exit0
187 ;;; continue as normal
188 9:
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