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 */
32 .long master_irq7 /* Reset Button */
34 .long master_err /* peripherals */
37 ! Slave Vector Base Table at 0x06000200
39 .long sstart /* Cold Start PC */
40 .long 0x0603f800 /* Cold Start SP */
41 .long sstart /* Manual Reset PC */
42 .long 0x0603f800 /* Manual Reset SP */
43 .long slave_e4 /* Illegal instruction */
44 .long slave_e5 /* reserved */
45 .long slave_e6 /* Invalid slot instruction */
46 .long slave_e7 /* reserved */
47 .long slave_e8 /* reserved */
48 .long slave_e9 /* CPU address error */
49 .long slave_e10 /* DMA address error */
50 .long slave_e11 /* NMI vector */
51 .long slave_e12 /* User break vector */
53 .long slave_err /* reserved */
56 .long slave_err /* TRAPA #32-63 */
58 .long slave_irq0 /* Level 1 IRQ */
59 .long slave_irq1 /* Level 2 & 3 IRQ's */
60 .long slave_irq2 /* Level 4 & 5 IRQ's */
61 .long slave_irq3 /* PWM interupt */
62 .long slave_irq4 /* Command interupt */
63 .long slave_irq5 /* H Blank interupt */
64 .long slave_irq6 /* V Blank interupt */
65 .long slave_irq7 /* Reset Button */
67 .long slave_err /* peripherals */
71 .macro mov_bc const ofs reg
76 mov.b r0, @(\ofs, \reg)
80 ! Stacks set up by BIOS
82 ! The main SH2 starts here at 0x06000400
88 ! The slave SH2 starts here at 0x06000404
95 ! cache init - done by BIOS with single 0x11 write
96 mov.l l_cctl, r1 /* cache */
97 mov_bc 0x00, 0, r1 /* disable */
98 mov.b @r1, r0 /* dummy read */
99 mov_bc 0x10, 0, r1 /* purge */
101 mov_bc 0x01, 0, r1 /* enable */
103 mov #0x10, r0 /* enable irqs, 0 causes endless irq */
111 mov.b r0, @(0x2c, gbr)
113 mov.l l_irq_cnt, r1 /* counters in fb (0x2401ff00) */
118 mov.b r0, @(0, gbr) /* FM=1 */
119 mov.b r0, @(0, gbr) /* flush write buf */
120 stc sr, r0 /* SR holds IRQ level in I3-I0 */
132 mov.w r0, @(r0, r1) /* ack */
134 mov.b r0, @(0, gbr) /* FM=1 and flush writebuf (alt: ~20 nops) */
144 mov.w r0, @(0x14, gbr) /* ack */
145 mov.b @(7, gbr), r0 /* RV */
149 ! Try to set FTOB pin that's wired to 32X hard reset.
150 ! Doesn't seem to be working right though, it somehow disturbs
151 ! 68k reset PC fetch which mysteriously ends up at range
152 ! 2c8 - 304 in multiples of 4, proportionally to reset delay
153 ! (0 - ~300 (?) sh2 cycles). Longer delay just hangs, presumably
156 mov_bc 0xf1, 7, r1 /* TOCR sel OCRB, pin on B match */
158 mov.b r0, @(4, r1) /* OCRB H - output compare B */
159 mov.b r0, @(5, r1) /* OCRB L */
160 mov.b r0, @(2, r1) /* FRC H */
161 mov.b r0, @(3, r1) /* FRC L */
163 ! sleep - docs say not to use
199 mov.b r0, @(0x2d, gbr)
201 mov.l l_irq_cnt, r1 /* counters in fb (0x2401ff00) */
215 /* ?, ?, ?, pwm, cmd, h, v, rst */
216 .word 0x0e, 0x0e, 0x0e, 0x1c, 0x1a, 0x18, 0x16, 0x14
218 .macro exc_master num
230 .macro irq_master num
281 mov.b r0, @(0x2e, gbr)
287 mov.b r0, @(0x2f, gbr)
299 ! vim:ts=8:sw=8:expandtab