megaed-sv: input stream logging test
[megadrive.git] / megaed-sv / asmtools.s
CommitLineData
51f3a685 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
df43aeea 9.global read_joy_responses /* u8 *rbuf */
51f3a685 10read_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
190:
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
ad997e79 52.global test_joy_read_log /* u8 *dest, int size */
53test_joy_read_log:
54 ldarg 0, 0, a1
55 ldarg 1, 0, d0
56 movem.l d2-d7, -(sp)
57 movea.l #0xa10003, a0
58 move.l d0, d7
59
60.macro joy_read_log_prep
61 move.l #0x40, d1
62 moveq.l #0, d0
63 move.b d1, (6,a0)
64 move.b d1, (a0)
65
660: /* wait for special code */
67 move.b d1, (a0)
68 move.b (a0), d2
69 move.b d0, (a0)
70 move.b (a0), d3
71 and.b #0x3f, d2
72 cmp.b d2, d3
73 bne 0b
74 cmp.b #0x25, d2
75 bne 0b
76
770: /* wait for special code to end */
78 cmp.b (a0), d2
79 beq 0b
80
81 move.b d1, (a0)
82 move.l #8000000/50/18, d2
83
840: /* wait enough for teensy to setup it's stuff */
85 subq.l #1, d2 /* 8 */
86 bgt.s 0b /* 10 */
87.endm
88.macro nop_
89 /*
90 * when communicating with 3.3V teensy:
91 * - no nops: see old value on multiple pins randomly
92 * - 1 nop: only TR often shows old value
93 * - 2 nops: ?
94 */
95 nop
96 nop
97.endm
98
99 joy_read_log_prep
100
1012: /* save data */
102 move.b d0, (a0)
103 nop_
104 move.b (a0), d2
105 move.b d1, (a0)
106 nop_
107 move.b (a0), d3
108 move.b d0, (a0)
109 nop_
110 move.b (a0), d4
111 move.b d1, (a0)
112 nop_
113 move.b (a0), d5
114.if 0
115 /* broken on Mega-ED v9?? */
116 move.b d2, (a1)+
117 move.b d3, (a1)+
118 move.b d4, (a1)+
119 move.b d5, (a1)+
120.else
121 lsl.w #8, d2
122 move.b d3, d2
123 move.w d2, (a1)+
124 lsl.w #8, d4
125 move.b d5, d4
126 move.w d4, (a1)+
127.endif
128
129 /* delay for teensy, 128 not enough.. */
130 move.l #256, d2
1310:
132 dbra d2, 0b
133
134 subq.l #4, d7
135 bgt.s 2b
136
137 movem.l (sp)+, d2-d7
138 rts
139
140
141.global test_joy_read_log_vsync /* u8 *dest, int size */
142test_joy_read_log_vsync:
143 ldarg 0, 0, a1
144 ldarg 1, 0, d0
145 movem.l d2-d7/a2, -(sp)
146 movea.l #0xa10003, a0
147 movea.l #0xc00005, a2
148 move.l d0, d7
149
150 /* syncs, sets d0=0, d1=0x40 */
151 joy_read_log_prep
152
1532: /* save data */
154 move.b d0, (a0)
155 move.b (a0), d2
156 move.b d1, (a0)
157 move.b (a0), d3
158 move.b d2, (a1)+
159 move.b d3, (a1)+
160
161 /* wait for next vsync */
162 moveq.l #3, d2
1630:
164 btst d2, (a2)
165 bne.s 0b
1660:
167 btst d2, (a2)
168 beq.s 0b
169
170 subq.l #2, d7
171 bgt.s 2b
172
173 movem.l (sp)+, d2-d7/a2
174 rts
175
176
65d9165c 177.global run_game /* u16 mapper, int tas_sync */
df43aeea 178run_game:
179 move.w #0x2700, sr
180 ldarg 0, 0, d7
65d9165c 181 ldarg 1, 0, d6
ad997e79 182 movea.l #0xa10000, a6
183 movea.l #0xc00000, a5
184 movea.l #0xc00005, a4
185 movea.l #0xc00004, a3
65d9165c 186 moveq.l #0x00, d2
187 move.b #0xff, d3
188 move.b #0x40, d4
189 move.b d4, (0x09,a6) /* CtrlA */
190 move.b d2, (0x0b,a6) /* CtrlB */
191 move.b d2, (0x0d,a6) /* CtrlC */
192 move.b d2, (0x13,a6) /* S-CtrlA */
193 move.b d3, (0x0f,a6) /* TxDataA */
194 move.b d2, (0x19,a6) /* S-CtrlB */
195 move.b d3, (0x15,a6) /* TxDataB */
196 move.b d2, (0x1f,a6) /* S-CtrlC */
197 move.b d3, (0x1b,a6) /* TxDataC */
198
199 /* set up for vram write */
200 move.l #0x40000000, (a3)
df43aeea 201
202 move.l #0xff0000, a1
65d9165c 203 move.l #0x10000/4/4-1, d0
df43aeea 2040:
65d9165c 205 move.l d2, (a1)+
206 move.l d2, (a1)+
207 move.l d2, (a1)+
208 move.l d2, (a1)+
df43aeea 209 dbra d0, 0b
210
65d9165c 211 move.l #0xfffe00, a1
212 tst.l d6
213 bne use_tas_code
214
215 lea (run_game_r,pc), a0
216 move.l #(run_game_r_end - run_game_r)/2-1, d0
217 bra 0f
218use_tas_code:
219 lea (run_game_r_tas,pc), a0
220 move.l #(run_game_r_tas_end - run_game_r_tas)/2-1, d0
221
df43aeea 2220:
65d9165c 223 move.w (a0)+, (a1)+
df43aeea 224 dbra d0, 0b
65d9165c 225 jmp 0xfffe00
df43aeea 226
65d9165c 227run_game_r:
df43aeea 228 move.w #0x3210, (0xA13006)
229
230 move.w d7, (0xA13010)
231 move.w #0, (0xA13000)
232
233 move.l (0x00), a7
234 move.l (0x04), a0
235 jmp (a0)
65d9165c 236run_game_r_end:
237
238run_game_r_tas:
239 move.w #0x3210, (0xA13006)
240 move.w d7, (0xA13010)
241 move.w #0, (0xA13000)
242
243 move.l (0x00), a7
244 move.l (0x04), a0
245
2460: /* wait for special code */
247 move.b d4, (0x03,a6)
248 move.b (0x03,a6), d0
249 move.b d2, (0x03,a6)
250 move.b (0x03,a6), d1
251 and.b #0x3f, d0
252 cmp.b d0, d1
253 bne 0b
254 cmp.b #0x25, d0
255 bne 0b
256
2570: /* wait for special code to end */
258 cmp.b (0x03,a6), d0
259 beq 0b
df43aeea 260
65d9165c 261 /* wait for active display */
262 moveq.l #3, d0
2630:
264 btst d0, (a4) /* 8 */
265 beq.s 0b /* 10 */
2660:
267 btst d0, (a4)
268 bne.s 0b
269
270 /* flood the VDP FIFO */
271.rept 5
272 move.w d2, (a5)
273.endr
274
275 /* doesn't help.. */
276.if 0
277.rept 94
278 nop
279.endr
280 move.l #0x93049400, (a3) /* DMALEN LO/HI = 0x0008 */
281 move.l #0x95009601, (a3) /* DMA SRC LO/MID */
282 move.l #0x977f8114, (a3) /* DMA SRC HI/MODE, Turn off Display */
283 move.l #0xc0000080, (a3) /* start DMA */
284.endif
285
286 move.b d2, (0x09,a6) /* CtrlA */
287 move.b d4, (0x03,a6)
288 jmp (a0)
289run_game_r_tas_end:
df43aeea 290
51f3a685 291# vim:filetype=asmM68k:ts=4:sw=4:expandtab