megaed-sv: more tests
[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, d2
247     move.b      #0xff, d3
248     move.b      #0x40, d4
249     move.b      d4, (0x09,a6) /* CtrlA */
250     move.b      d2, (0x0b,a6) /* CtrlB */
251     move.b      d2, (0x0d,a6) /* CtrlC */
252     move.b      d2, (0x13,a6) /* S-CtrlA */
253     move.b      d3, (0x0f,a6) /* TxDataA */
254     move.b      d2, (0x19,a6) /* S-CtrlB */
255     move.b      d3, (0x15,a6) /* TxDataB */
256     move.b      d2, (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, d0
264 0:
265     move.l      d2, (a1)+
266     move.l      d2, (a1)+
267     move.l      d2, (a1)+
268     move.l      d2, (a1)+
269     dbra        d0, 0b
270
271     move.l      #0xfffe00, a1
272     tst.l       d6
273     bne         use_tas_code
274
275     lea         (run_game_r,pc), a0
276     move.l      #(run_game_r_end - run_game_r)/2-1, d0
277     bra         0f
278 use_tas_code:
279     lea         (run_game_r_tas,pc), a0
280     move.l      #(run_game_r_tas_end - run_game_r_tas)/2-1, d0
281
282 0:
283     move.w      (a0)+, (a1)+
284     dbra        d0, 0b
285     jmp         0xfffe00
286
287 run_game_r:
288     move.w      #0x3210, (0xA13006)
289
290     move.w      d7, (0xA13010)
291     move.w      #0, (0xA13000)
292     
293     move.l      (0x00), a7
294     move.l      (0x04), a0
295     jmp         (a0)
296 run_game_r_end:
297
298 run_game_r_tas:
299     move.w      #0x3210, (0xA13006)
300     move.w      d7, (0xA13010)
301     move.w      #0, (0xA13000)
302     
303     move.l      (0x00), a7
304     move.l      (0x04), a0
305
306 0:  /* wait for special code */
307     move.b      d4, (0x03,a6)
308     move.b      (0x03,a6), d0
309     move.b      d2, (0x03,a6)
310     move.b      (0x03,a6), d1
311     and.b       #0x3f, d0
312     cmp.b       d0, d1
313     bne         0b
314     cmp.b       #0x25, d0
315     bne         0b
316
317 0:  /* wait for special code to end */
318     cmp.b       (0x03,a6), d0
319     beq         0b
320
321     /* wait for active display */
322     moveq.l     #3, d0
323 0:
324     btst        d0, (a4)      /* 8 */
325     beq.s       0b            /* 10 */
326 0:
327     btst        d0, (a4)
328     bne.s       0b
329
330     /* flood the VDP FIFO */
331 .rept 5
332     move.w      d2, (a5)
333 .endr
334
335     /* doesn't help.. */
336 .if 0
337 .rept 94
338     nop
339 .endr
340     move.l      #0x93049400, (a3) /* DMALEN LO/HI = 0x0008 */
341     move.l      #0x95009601, (a3) /* DMA SRC LO/MID */
342     move.l      #0x977f8114, (a3) /* DMA SRC HI/MODE, Turn off Display */
343     move.l      #0xc0000080, (a3) /* start DMA */
344 .endif
345
346     move.b      d2, (0x09,a6) /* CtrlA */
347     move.b      d4, (0x03,a6)
348     jmp         (a0)
349 run_game_r_tas_end:
350
351 # vim:filetype=asmM68k:ts=4:sw=4:expandtab