4 ! Master Vector Base Table at 0x06000000
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 */
20 .long master_err /* reserved */
23 .long master_err /* TRAPA #32-63 */
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 */
33 .long master_irq7 /* Reset Button */
35 .long master_err /* peripherals */
38 ! Slave Vector Base Table at 0x06000200
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 */
54 .long slave_err /* reserved */
57 .long slave_err /* TRAPA #32-63 */
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 */
68 .long slave_err /* peripherals */
72 .macro mov_bc const ofs reg
77 mov.b r0, @(\ofs, \reg)
81 ! Stacks set up by BIOS
83 ! The main SH2 starts here at 0x06000400
89 ! The slave SH2 starts here at 0x06000404
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 */
102 mov_bc 0x01, 0, r1 /* enable */
104 mov #0x10, r0 /* enable irqs, 0 causes endless irq */
112 mov.b r0, @(0x2c, gbr)
114 mov.l l_irq_cnt, r1 /* counters in fb (0x2401ff00) */
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.
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 */
136 mov.w r0, @(r0, r1) /* ack */
138 mov.b r0, @(0, gbr) /* FM=1 and flush writebuf (alt: ~20 nops) */
148 mov.w r0, @(0x14, gbr) /* ack */
149 mov.b @(7, gbr), r0 /* RV */
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
160 mov_bc 0xf1, 7, r1 /* TOCR sel OCRB, pin on B match */
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 */
167 ! sleep - docs say not to use
203 mov.b r0, @(0x2d, gbr)
205 mov.l l_irq_cnt, r1 /* counters in fb (0x2401ff00) */
219 /* ?, ?, ?, pwm, cmd, h, v, rst */
220 .word 0x0e, 0x0e, 0x0e, 0x1c, 0x1a, 0x18, 0x16, 0x14
222 .macro exc_master num
234 .macro irq_master num
285 mov.b r0, @(0x2e, gbr)
291 mov.b r0, @(0x2f, gbr)
303 ! vim:ts=8:sw=8:expandtab