testpico: show that vres clear is separate
[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
133 mova l_irq_ao, r0
134 mov.w @(r0, r2), r0
135 stc gbr, r1
136 mov.w r0, @(r0, r1) /* ack */
137 mov #0x80, r0
138 mov.b r0, @(0, gbr) /* FM=1 and flush writebuf (alt: ~20 nops) */
139 mov.l @r15+, r2
140 mov.l @r15+, r1
141 mov.l @r15+, r0
142 rte
71b41fdd 143 nop
144
5073ab5a 145! not used
146.if 0
7449b889 147main_irq_vres:
71b41fdd 148 mov.w r0, @(0x14, gbr) /* ack */
149 mov.b @(7, gbr), r0 /* RV */
150 tst #1, r0
151 bt main_irq_ret
152
153! Try to set FTOB pin that's wired to 32X hard reset.
154! Doesn't seem to be working right though, it somehow disturbs
155! 68k reset PC fetch which mysteriously ends up at range
156! 2c8 - 304 in multiples of 4, proportionally to reset delay
157! (0 - ~300 (?) sh2 cycles). Longer delay just hangs, presumably
158! at 880200?
159 mov.l l_frt, r1
160 mov_bc 0xf1, 7, r1 /* TOCR sel OCRB, pin on B match */
161 mov #0, r0
162 mov.b r0, @(4, r1) /* OCRB H - output compare B */
163 mov.b r0, @(5, r1) /* OCRB L */
164 mov.b r0, @(2, r1) /* FRC H */
165 mov.b r0, @(3, r1) /* FRC L */
7449b889 166 mov.b @(3, r1), r0
71b41fdd 167! sleep - docs say not to use
168! sleep
1690:
170 bra 0b
171 nop
172
173main_irq_ret:
71b41fdd 174 mov.l @r15+, r0
5073ab5a 175 rte
176 nop
177.endif
71b41fdd 178
179.global _read_frt
180_read_frt:
181 mov.l l_frt, r2
182 mov.b @(2, r2), r0
183 extu.b r0, r1
184 mov.b @(3, r2), r0
185 extu.b r0, r0
186 shll8 r1
187 rts
188 or r1, r0
189
9d39a80e 190! dummy
191.global _start
192_start:
193
6474d733 194master_err:
71b41fdd 195 bra do_exc_master
196 mov #0xff, r0
197slave_err:
71b41fdd 198 bra do_exc_slave
199 mov #0xff, r0
200
6474d733 201! r0=vector_number
202do_irq_slave:
203 mov.b r0, @(0x2d, gbr)
5073ab5a 204 mov.l r1, @-r15
205 mov.l l_irq_cnt, r1 /* counters in fb (0x2401ff00) */
206 bra do_irq_cmn
207 add #0x10, r1
208
209.align 2
210l_cctl:
211 .long 0xFFFFFE92
212l_frt:
213 .long 0xFFFFFE10
214l_main_c:
215 .long _main_c
216l_irq_cnt:
217 .long 0x2401ff00
218l_irq_ao:
219 /* ?, ?, ?, pwm, cmd, h, v, rst */
220 .word 0x0e, 0x0e, 0x0e, 0x1c, 0x1a, 0x18, 0x16, 0x14
221
71b41fdd 222.macro exc_master num
223master_e\num:
224 bra do_exc_master
225 mov #\num, r0
226.endm
227
228.macro exc_slave num
229slave_e\num:
230 bra do_exc_slave
231 mov #\num, r0
232.endm
233
6474d733 234.macro irq_master num
235master_irq\num:
236 mov.l r0, @-r15
237 bra do_irq_master
238 mov #\num, r0
239.endm
240
241.macro irq_slave num
242slave_irq\num:
243 mov.l r0, @-r15
244 bra do_irq_slave
245 mov #\num, r0
246.endm
247
71b41fdd 248exc_master 4
249exc_master 5
250exc_master 6
251exc_master 7
252exc_master 8
253exc_master 9
254exc_master 10
255exc_master 11
256exc_master 12
6474d733 257irq_master 0
258irq_master 1
259irq_master 2
260irq_master 3
261irq_master 4
262irq_master 5
263irq_master 6
264irq_master 7
71b41fdd 265
266exc_slave 4
267exc_slave 5
268exc_slave 6
269exc_slave 7
270exc_slave 8
271exc_slave 9
272exc_slave 10
273exc_slave 11
274exc_slave 12
6474d733 275irq_slave 0
276irq_slave 1
277irq_slave 2
278irq_slave 3
279irq_slave 4
280irq_slave 5
281irq_slave 6
282irq_slave 7
71b41fdd 283
284do_exc_master:
6474d733 285 mov.b r0, @(0x2e, gbr)
71b41fdd 2860:
287 bra 0b
288 nop
289
290do_exc_slave:
6474d733 291 mov.b r0, @(0x2f, gbr)
71b41fdd 2920:
293 bra 0b
294 nop
295
9d39a80e 296.global _spin
297_spin:
298 dt r4
299 bf _spin
300 rts
301 nop
302
9d39a80e 303! vim:ts=8:sw=8:expandtab