testpico: 32x vint tests
[megadrive.git] / testpico / sh2_test.sh2
... / ...
CommitLineData
1
2 .text
3
4! Master Vector Base Table at 0x06000000
5
6 .long mstart /* Cold Start PC */
7 .long 0x06040000 /* Cold Start SP */
8 .long mstart /* Manual Reset PC */
9 .long 0x06040000 /* Manual Reset SP */
10 .long master_e4 /* Illegal instruction */
11 .long master_e5 /* reserved */
12 .long master_e6 /* Invalid slot instruction */
13 .long master_e7 /* reserved */
14 .long master_e8 /* reserved */
15 .long master_e9 /* CPU address error */
16 .long master_e10 /* DMA address error */
17 .long master_e11 /* NMI vector */
18 .long master_e12 /* User break vector */
19.rept 19
20 .long master_err /* reserved */
21.endr
22.rept 32
23 .long master_err /* TRAPA #32-63 */
24.endr
25 .long master_irq0 /* Level 1 IRQ */
26 .long master_irq1 /* Level 2 & 3 IRQ's */
27 .long master_irq2 /* Level 4 & 5 IRQ's */
28 .long master_irq3 /* PWM interupt */
29 .long master_irq4 /* Command interupt */
30 .long master_irq5 /* H Blank interupt */
31 .long master_irq6 /* V Blank interupt */
32! .long main_irq_vres
33 .long master_irq7 /* Reset Button */
34.rept 56
35 .long master_err /* peripherals */
36.endr
37
38! Slave Vector Base Table at 0x06000200
39
40 .long sstart /* Cold Start PC */
41 .long 0x0603f800 /* Cold Start SP */
42 .long sstart /* Manual Reset PC */
43 .long 0x0603f800 /* Manual Reset SP */
44 .long slave_e4 /* Illegal instruction */
45 .long slave_e5 /* reserved */
46 .long slave_e6 /* Invalid slot instruction */
47 .long slave_e7 /* reserved */
48 .long slave_e8 /* reserved */
49 .long slave_e9 /* CPU address error */
50 .long slave_e10 /* DMA address error */
51 .long slave_e11 /* NMI vector */
52 .long slave_e12 /* User break vector */
53.rept 19
54 .long slave_err /* reserved */
55.endr
56.rept 32
57 .long slave_err /* TRAPA #32-63 */
58.endr
59 .long slave_irq0 /* Level 1 IRQ */
60 .long slave_irq1 /* Level 2 & 3 IRQ's */
61 .long slave_irq2 /* Level 4 & 5 IRQ's */
62 .long slave_irq3 /* PWM interupt */
63 .long slave_irq4 /* Command interupt */
64 .long slave_irq5 /* H Blank interupt */
65 .long slave_irq6 /* V Blank interupt */
66 .long slave_irq7 /* Reset Button */
67.rept 56
68 .long slave_err /* peripherals */
69.endr
70
71! trashes r0
72.macro mov_bc const ofs reg
73 mov #\const, r0
74.if \ofs == 0
75 mov.b r0, @\reg
76.else
77 mov.b r0, @(\ofs, \reg)
78.endif
79.endm
80
81! Stacks set up by BIOS
82
83! The main SH2 starts here at 0x06000400
84
85mstart:
86 bra xstart
87 mov #0, r4
88
89! The slave SH2 starts here at 0x06000404
90
91sstart:
92 mov #1, r4
93
94xstart:
95.if 0
96! cache init - done by BIOS with single 0x11 write
97 mov.l l_cctl, r1 /* cache */
98 mov_bc 0x00, 0, r1 /* disable */
99 mov.b @r1, r0 /* dummy read */
100 mov_bc 0x10, 0, r1 /* purge */
101 mov.b @r1, r0
102 mov_bc 0x01, 0, r1 /* enable */
103.endif
104 mov #0x10, r0 /* enable irqs, 0 causes endless irq */
105 ldc r0, sr
106 mov.l l_main_c, r0
107 jmp @r0
108 nop
109
110! r0=vector_number
111do_irq_master:
112 mov.b r0, @(0x2c, gbr)
113 mov.l r1, @-r15
114 mov.l l_irq_cnt, r1 /* counters in fb (0x2401ff00) */
115
116! According to "32X Technical Information Attachment 1" FTOA pin must be toggled
117! or interrupts may be missed when multiple irqs trigger. We skip that here since
118! we test only 1 irq at a time.
119do_irq_cmn:
120 mov.l r2, @-r15
121 mov #0x80, r0
122 mov.b r0, @(0, gbr) /* FM=1 */
123 mov.b r0, @(0, gbr) /* flush write buf */
124 stc sr, r0 /* SR holds IRQ level in I3-I0 */
125 shlr2 r0
126 shlr2 r0
127 and #0x0e, r0
128 mov r0, r2
129 add r1, r0
130 mov.w @r0, r1
131 add #1, r1
132 mov.w r1, @r0
133 mov.b @(0x23, gbr), r0
134 cmp/eq #0x5a, r0
135 bt 0f /* noack */
136 mova l_irq_ao, r0
137 mov.w @(r0, r2), r0
138 stc gbr, r1
139 mov.w r0, @(r0, r1) /* 32x irq clear */
1400:
141 mov #0x80, r0
142 mov.b r0, @(0, gbr) /* FM=1 and flush writebuf (alt: ~20 nops) */
143 mov.l @r15+, r2
144 mov.l @r15+, r1
145 mov.l @r15+, r0
146 rte
147 nop
148
149! not used
150.if 0
151main_irq_vres:
152 mov.w r0, @(0x14, gbr) /* ack */
153 mov.b @(7, gbr), r0 /* RV */
154 tst #1, r0
155 bt main_irq_ret
156
157! Try to set FTOB pin that's wired to 32X hard reset.
158! Doesn't seem to be working right though, it somehow disturbs
159! 68k reset PC fetch which mysteriously ends up at range
160! 2c8 - 304 in multiples of 4, proportionally to reset delay
161! (0 - ~300 (?) sh2 cycles). Longer delay just hangs, presumably
162! at 880200?
163 mov.l l_frt, r1
164 mov_bc 0xf1, 7, r1 /* TOCR sel OCRB, pin on B match */
165 mov #0, r0
166 mov.b r0, @(4, r1) /* OCRB H - output compare B */
167 mov.b r0, @(5, r1) /* OCRB L */
168 mov.b r0, @(2, r1) /* FRC H */
169 mov.b r0, @(3, r1) /* FRC L */
170 mov.b @(3, r1), r0
171! sleep - docs say not to use
172! sleep
1730:
174 bra 0b
175 nop
176
177main_irq_ret:
178 mov.l @r15+, r0
179 rte
180 nop
181.endif
182
183.global _read_frt
184_read_frt:
185 mov.l l_frt, r2
186 mov.b @(2, r2), r0
187 extu.b r0, r1
188 mov.b @(3, r2), r0
189 extu.b r0, r0
190 shll8 r1
191 rts
192 or r1, r0
193
194! dummy
195.global _start
196_start:
197
198master_err:
199 bra do_exc_master
200 mov #0xff, r0
201slave_err:
202 bra do_exc_slave
203 mov #0xff, r0
204
205! r0=vector_number
206do_irq_slave:
207 mov.b r0, @(0x2d, gbr)
208 mov.l r1, @-r15
209 mov.l l_irq_cnt, r1 /* counters in fb (0x2401ff00) */
210 bra do_irq_cmn
211 add #0x10, r1
212
213.align 2
214l_cctl:
215 .long 0xFFFFFE92
216l_frt:
217 .long 0xFFFFFE10
218l_main_c:
219 .long _main_c
220l_irq_cnt:
221 .long 0x2401ff00
222l_irq_ao:
223 /* ?, ?, ?, pwm, cmd, h, v, rst */
224 .word 0x0e, 0x0e, 0x0e, 0x1c, 0x1a, 0x18, 0x16, 0x14
225
226.macro exc_master num
227master_e\num:
228 bra do_exc_master
229 mov #\num, r0
230.endm
231
232.macro exc_slave num
233slave_e\num:
234 bra do_exc_slave
235 mov #\num, r0
236.endm
237
238.macro irq_master num
239master_irq\num:
240 mov.l r0, @-r15
241 bra do_irq_master
242 mov #\num, r0
243.endm
244
245.macro irq_slave num
246slave_irq\num:
247 mov.l r0, @-r15
248 bra do_irq_slave
249 mov #\num, r0
250.endm
251
252exc_master 4
253exc_master 5
254exc_master 6
255exc_master 7
256exc_master 8
257exc_master 9
258exc_master 10
259exc_master 11
260exc_master 12
261irq_master 0
262irq_master 1
263irq_master 2
264irq_master 3
265irq_master 4
266irq_master 5
267irq_master 6
268irq_master 7
269
270exc_slave 4
271exc_slave 5
272exc_slave 6
273exc_slave 7
274exc_slave 8
275exc_slave 9
276exc_slave 10
277exc_slave 11
278exc_slave 12
279irq_slave 0
280irq_slave 1
281irq_slave 2
282irq_slave 3
283irq_slave 4
284irq_slave 5
285irq_slave 6
286irq_slave 7
287
288do_exc_master:
289 mov.b r0, @(0x2e, gbr)
2900:
291 bra 0b
292 nop
293
294do_exc_slave:
295 mov.b r0, @(0x2f, gbr)
2960:
297 bra 0b
298 nop
299
300.global _spin
301_spin:
302 dt r4
303 bf _spin
304 rts
305 nop
306
307! vim:ts=8:sw=8:expandtab