8c36723754dc056ccd9b23139815f095d642950e
[megadrive.git] / testpico / sh2_test.sh2
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
85 mstart:
86         bra     xstart
87         mov     #0, r4
88
89 ! The slave SH2 starts here at 0x06000404
90
91 sstart:
92         mov     #1, r4
93
94 xstart:
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
111 do_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.
119 do_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 */
140 0:
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
151 main_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
173 0:
174         bra     0b
175         nop
176
177 main_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
198 master_err:
199         bra     do_exc_master
200         mov     #0xff, r0
201 slave_err:
202         bra     do_exc_slave
203         mov     #0xff, r0
204
205 ! r0=vector_number
206 do_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
214 l_cctl:
215         .long   0xFFFFFE92
216 l_frt:
217         .long   0xFFFFFE10
218 l_main_c:
219         .long   _main_c
220 l_irq_cnt:
221         .long   0x2401ff00
222 l_irq_ao:
223         /*         ?,    ?,    ?,  pwm,  cmd,    h,    v,  rst */
224         .word   0x0e, 0x0e, 0x0e, 0x1c, 0x1a, 0x18, 0x16, 0x14
225
226 .macro exc_master num
227 master_e\num:
228         bra     do_exc_master
229         mov     #\num, r0
230 .endm
231
232 .macro exc_slave num
233 slave_e\num:
234         bra     do_exc_slave
235         mov     #\num, r0
236 .endm
237
238 .macro irq_master num
239 master_irq\num:
240         mov.l   r0, @-r15
241         bra     do_irq_master
242         mov     #\num, r0
243 .endm
244
245 .macro irq_slave num
246 slave_irq\num:
247         mov.l   r0, @-r15
248         bra     do_irq_slave
249         mov     #\num, r0
250 .endm
251
252 exc_master 4
253 exc_master 5
254 exc_master 6
255 exc_master 7
256 exc_master 8
257 exc_master 9
258 exc_master 10
259 exc_master 11
260 exc_master 12
261 irq_master 0
262 irq_master 1
263 irq_master 2
264 irq_master 3
265 irq_master 4
266 irq_master 5
267 irq_master 6
268 irq_master 7
269
270 exc_slave 4
271 exc_slave 5
272 exc_slave 6
273 exc_slave 7
274 exc_slave 8
275 exc_slave 9
276 exc_slave 10
277 exc_slave 11
278 exc_slave 12
279 irq_slave 0
280 irq_slave 1
281 irq_slave 2
282 irq_slave 3
283 irq_slave 4
284 irq_slave 5
285 irq_slave 6
286 irq_slave 7
287
288 do_exc_master:
289         mov.b   r0, @(0x2e, gbr)
290 0:
291         bra     0b
292         nop
293
294 do_exc_slave:
295         mov.b   r0, @(0x2f, gbr)
296 0:
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