megaed-sv: move most start code to ROM
[megadrive.git] / megaed-sv / asmtools.s
1 # Assemble with gas
2 #   --register-prefix-optional --bitwise-or
3
4 .macro ldarg  arg, stacksz, reg
5     move.l (4 + \arg * 4 + \stacksz)(%sp), \reg
6 .endm
7
8
9 .global read_joy_responses /* u8 *rbuf */
10 read_joy_responses:
11     ldarg       0, 0, a1
12     movem.l     d2-d7, -(sp)
13     movea.l     #0xa10003, a0
14     move.b      #0x40, (6,a0)
15     move.b      #0x40, (a0)
16
17 .macro one_test val
18     move.l      #100/12-1, d0
19 0:
20     dbra        d0, 0b
21     move.b      \val, d0
22     move.b      d0, (a0)
23     move.b      (a0), d0
24     move.b      (a0), d1
25     move.b      (a0), d2
26     move.b      (a0), d3
27     move.b      (a0), d4
28     move.b      (a0), d5
29     move.b      (a0), d6
30     move.b      (a0), d7
31     move.b      d0, (a1)+
32     move.b      d1, (a1)+
33     move.b      d2, (a1)+
34     move.b      d3, (a1)+
35     move.b      d4, (a1)+
36     move.b      d5, (a1)+
37     move.b      d6, (a1)+
38     move.b      d7, (a1)+
39 .endm
40
41         move.w          #0x2700, sr
42     one_test    #0x00
43     one_test    #0x40
44     one_test    #0x00
45     one_test    #0x40
46     one_test    #0x00
47         move.w          #0x2000, sr
48     movem.l     (sp)+, d2-d7
49     rts
50
51
52 /* expects:
53  * a0 = #0xa10003
54  * d0 = #0
55  * d1 = #0x40
56  * trashes d2, d3
57  */
58 sync_with_teensy:
59 0:  /* wait for special code */
60     move.b      d1, (a0)
61     move.b      (a0), d2
62     move.b      d0, (a0)
63     move.b      (a0), d3
64     and.b       #0x3f, d2
65     cmp.b       d2, d3
66     bne         0b
67     cmp.b       #0x25, d2
68     bne         0b
69
70 0:  /* wait for special code to end */
71     cmp.b       (a0), d2
72     beq         0b
73
74     move.b      d1, (a0)
75     move.l      #8000000/50/18, d2
76
77 0:  /* wait enough for teensy to setup it's stuff */
78     subq.l      #1, d2   /* 8 */
79     bgt.s       0b       /* 10 */
80
81     rts
82
83
84 .macro t_nop
85     /*
86      * when communicating with 3.3V teensy:
87      * - no nops: see old value on multiple pins randomly
88      * - 1 nop: only TR often shows old value
89      * - 2 nops: ?
90      */
91     nop
92     nop
93 .endm
94
95
96 .global test_joy_read_log /* u8 *dest, int size, int do_sync */
97 test_joy_read_log:
98     ldarg       0, 0, a1
99     ldarg       1, 0, d0
100     ldarg       2, 0, d1
101     movem.l     d2-d7, -(sp)
102     movea.l     #0xa10003, a0
103     move.l      d0, d7
104     move.l      d1, d6
105
106     moveq.l     #0, d0
107     move.l      #0x40, d1
108     move.b      d1, (6,a0)
109     move.b      d1, (a0)
110
111     tst.l       d6
112     beq.s       2f
113     bsr         sync_with_teensy
114
115 2:  /* save data */
116     move.b      d0, (a0)
117     t_nop
118     move.b      (a0), d2
119     move.b      d1, (a0)
120     t_nop
121     move.b      (a0), d3
122     move.b      d0, (a0)
123     t_nop
124     move.b      (a0), d4
125     move.b      d1, (a0)
126     t_nop
127     move.b      (a0), d5
128 .if 0
129     /* broken on Mega-ED v9?? */
130     move.b      d2, (a1)+
131     move.b      d3, (a1)+
132     move.b      d4, (a1)+
133     move.b      d5, (a1)+
134 .else
135     lsl.w       #8, d2
136     move.b      d3, d2
137     move.w      d2, (a1)+
138     lsl.w       #8, d4
139     move.b      d5, d4
140     move.w      d4, (a1)+
141 .endif
142
143     /* delay for teensy, 128 not enough.. */
144     move.l      #256, d2
145 0:
146     dbra        d2, 0b
147
148     subq.l      #4, d7
149     bgt.s       2b
150
151     movem.l     (sp)+, d2-d7
152     rts
153
154
155 .global test_joy_read_log_vsync /* u8 *dest, int size */
156 test_joy_read_log_vsync:
157     ldarg       0, 0, a1
158     ldarg       1, 0, d0
159     movem.l     d2-d7/a2, -(sp)
160     movea.l     #0xa10003, a0
161     movea.l     #0xc00005, a2
162     move.l      d0, d7
163
164     move.l      #0x40, d1
165     moveq.l     #0, d0
166     move.b      d1, (6,a0)
167     move.b      d1, (a0)
168
169     bsr         sync_with_teensy
170
171 2:  /* save data */
172     move.b      d0, (a0)
173     move.b      (a0), d2
174     move.b      d1, (a0)
175     move.b      (a0), d3
176     move.b      d2, (a1)+
177     move.b      d3, (a1)+
178
179     /* wait for next vsync */
180     moveq.l     #3, d2
181 0:
182     btst        d2, (a2)
183     bne.s       0b
184 0:
185     btst        d2, (a2)
186     beq.s       0b
187
188     subq.l      #2, d7
189     bgt.s       2b
190
191     movem.l     (sp)+, d2-d7/a2
192     rts
193
194
195 .global test_byte_write /* u8 *dest, int size, int seed */
196 test_byte_write:
197     ldarg       0, 0, a0
198     ldarg       1, 0, d0
199     ldarg       2, 0, d1
200     movem.l     d2-d7, -(sp)
201
202     move.l      a0, a1
203     add.l       d0, a1
204     move.l      d1, d7
205 0:
206     move.b      d7, d0
207     addq.b      #1, d7
208     move.b      d7, d1
209     addq.b      #1, d7
210     move.b      d7, d2
211     addq.b      #1, d7
212     move.b      d7, d3
213     addq.b      #1, d7
214     move.b      d7, d4
215     addq.b      #1, d7
216     move.b      d7, d5
217     addq.b      #1, d7
218     move.b      d7, d6
219     addq.b      #1, d7
220
221     move.b      d0, (a0)+
222     move.b      d1, (a0)+
223     move.b      d2, (a0)+
224     move.b      d3, (a0)+
225     move.b      d4, (a0)+
226     move.b      d5, (a0)+
227     move.b      d6, (a0)+
228     move.b      d7, (a0)+
229     addq.b      #1, d7
230     cmp.l       a1, a0
231     blt.s       0b
232
233     movem.l     (sp)+, d2-d7
234     rts
235
236
237 .global run_game /* u16 mapper, int tas_sync */
238 run_game:
239         move.w          #0x2700, sr
240     ldarg       0, 0, d7
241     ldarg       1, 0, d6
242     movea.l     #0xa10000, a6
243     movea.l     #0xc00000, a5
244     movea.l     #0xc00005, a4
245     movea.l     #0xc00004, a3
246     moveq.l     #0x00, d0
247     move.b      #0x40, d1     /* d2 is tmp */
248     move.b      #0xff, d3
249     move.b      d1, (0x09,a6) /* CtrlA */
250     move.b      d0, (0x0b,a6) /* CtrlB */
251     move.b      d0, (0x0d,a6) /* CtrlC */
252     move.b      d0, (0x13,a6) /* S-CtrlA */
253     move.b      d3, (0x0f,a6) /* TxDataA */
254     move.b      d0, (0x19,a6) /* S-CtrlB */
255     move.b      d3, (0x15,a6) /* TxDataB */
256     move.b      d0, (0x1f,a6) /* S-CtrlC */
257     move.b      d3, (0x1b,a6) /* TxDataC */
258
259     /* set up for vram write */
260     move.l      #0x40000000, (a3)
261
262     move.l      #0xff0000, a1
263     move.l      #0x10000/4/4-1, d2
264 0:
265     move.l      d0, (a1)+
266     move.l      d0, (a1)+
267     move.l      d0, (a1)+
268     move.l      d0, (a1)+
269     dbra        d2, 0b
270
271     lea         (run_game_r,pc), a0
272     move.l      #0xffff80, a1
273     move.l      #(run_game_r_end - run_game_r)/2-1, d2
274 0:
275     move.w      (a0)+, (a1)+
276     dbra        d2, 0b
277
278     tst.l       d6
279     beq.s       0f
280
281     movea.l     #0xa10003, a0
282     movea.l     d0, a7
283     bsr         sync_with_teensy  /* trashes d3 */
284     move.l      d0, (-4,a7)
285
286 0:
287     /* wait for active display */
288     moveq.l     #3, d2
289 0:
290     btst        d2, (a4)      /* 8 */
291     beq.s       0b            /* 10 */
292 0:
293     btst        d2, (a4)
294     bne.s       0b
295
296     /* flood the VDP FIFO */
297 .rept 5
298     move.w      d0, (a5)
299 .endr
300
301     movea.l     d0, a0
302     movea.l     #0xA13000, a1
303
304     move.b      d0, (0x09,a6) /* CtrlA */
305     move.b      d1, (0x03,a6)
306
307     jmp         0xffff80
308
309 run_game_r:
310     move.w      #0x3210, (0x06,a1) /* 0xA13006 */
311     move.w      d7, (0x10,a1)      /* 0xA13010 */
312     move.w      d0, (a1)           /* 0xA13000 */
313     
314     move.l      (a0)+, a7
315     move.l      (a0),  a0
316
317     jmp         (a0)
318 run_game_r_end:
319
320 # vim:filetype=asmM68k:ts=4:sw=4:expandtab