testpico: 32x vint tests
[megadrive.git] / testpico / sh2_test.sh2
CommitLineData
9d39a80e 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 */
71b41fdd 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
6474d733 20 .long master_err /* reserved */
71b41fdd 21.endr
22.rept 32
6474d733 23 .long master_err /* TRAPA #32-63 */
71b41fdd 24.endr
6474d733 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 */
7449b889 32! .long main_irq_vres
6474d733 33 .long master_irq7 /* Reset Button */
71b41fdd 34.rept 56
6474d733 35 .long master_err /* peripherals */
71b41fdd 36.endr
9d39a80e 37
71b41fdd 38! Slave Vector Base Table at 0x06000200
9d39a80e 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 */
71b41fdd 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
6474d733 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 */
71b41fdd 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
9d39a80e 80
81! Stacks set up by BIOS
82
71b41fdd 83! The main SH2 starts here at 0x06000400
9d39a80e 84
85mstart:
71b41fdd 86 bra xstart
9d39a80e 87 mov #0, r4
88
71b41fdd 89! The slave SH2 starts here at 0x06000404
9d39a80e 90
91sstart:
9d39a80e 92 mov #1, r4
93
9d39a80e 94xstart:
71b41fdd 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
5073ab5a 104 mov #0x10, r0 /* enable irqs, 0 causes endless irq */
71b41fdd 105 ldc r0, sr
9d39a80e 106 mov.l l_main_c, r0
107 jmp @r0
108 nop
109
6474d733 110! r0=vector_number
111do_irq_master:
112 mov.b r0, @(0x2c, gbr)
5073ab5a 113 mov.l r1, @-r15
114 mov.l l_irq_cnt, r1 /* counters in fb (0x2401ff00) */
71b41fdd 115
7449b889 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.
5073ab5a 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 */
71b41fdd 125 shlr2 r0
5073ab5a 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
30a57837 133 mov.b @(0x23, gbr), r0
134 cmp/eq #0x5a, r0
135 bt 0f /* noack */
5073ab5a 136 mova l_irq_ao, r0
137 mov.w @(r0, r2), r0
138 stc gbr, r1
30a57837 139 mov.w r0, @(r0, r1) /* 32x irq clear */
1400:
5073ab5a 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
71b41fdd 147 nop
148
5073ab5a 149! not used
150.if 0
7449b889 151main_irq_vres:
71b41fdd 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 */
7449b889 170 mov.b @(3, r1), r0
71b41fdd 171! sleep - docs say not to use
172! sleep
1730:
174 bra 0b
175 nop
176
177main_irq_ret:
71b41fdd 178 mov.l @r15+, r0
5073ab5a 179 rte
180 nop
181.endif
71b41fdd 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
9d39a80e 194! dummy
195.global _start
196_start:
197
6474d733 198master_err:
71b41fdd 199 bra do_exc_master
200 mov #0xff, r0
201slave_err:
71b41fdd 202 bra do_exc_slave
203 mov #0xff, r0
204
6474d733 205! r0=vector_number
206do_irq_slave:
207 mov.b r0, @(0x2d, gbr)
5073ab5a 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
71b41fdd 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
6474d733 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
71b41fdd 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
6474d733 261irq_master 0
262irq_master 1
263irq_master 2
264irq_master 3
265irq_master 4
266irq_master 5
267irq_master 6
268irq_master 7
71b41fdd 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
6474d733 279irq_slave 0
280irq_slave 1
281irq_slave 2
282irq_slave 3
283irq_slave 4
284irq_slave 5
285irq_slave 6
286irq_slave 7
71b41fdd 287
288do_exc_master:
6474d733 289 mov.b r0, @(0x2e, gbr)
71b41fdd 2900:
291 bra 0b
292 nop
293
294do_exc_slave:
6474d733 295 mov.b r0, @(0x2f, gbr)
71b41fdd 2960:
297 bra 0b
298 nop
299
9d39a80e 300.global _spin
301_spin:
302 dt r4
303 bf _spin
304 rts
305 nop
306
9d39a80e 307! vim:ts=8:sw=8:expandtab