7b7e75962dd200d0231cb0e6a9862ff0977648fc
[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 .global test_joy_read_log /* u8 *dest, int size */
53 test_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
66 0:  /* 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
77 0:  /* 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
84 0:  /* 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
101 2:  /* 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
131 0:
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 */
142 test_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
153 2:  /* 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
163 0:
164     btst        d2, (a2)
165     bne.s       0b
166 0:
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
177 .global run_game /* u16 mapper, int tas_sync */
178 run_game:
179         move.w          #0x2700, sr
180     ldarg       0, 0, d7
181     ldarg       1, 0, d6
182     movea.l     #0xa10000, a6
183     movea.l     #0xc00000, a5
184     movea.l     #0xc00005, a4
185     movea.l     #0xc00004, a3
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)
201
202     move.l      #0xff0000, a1
203     move.l      #0x10000/4/4-1, d0
204 0:
205     move.l      d2, (a1)+
206     move.l      d2, (a1)+
207     move.l      d2, (a1)+
208     move.l      d2, (a1)+
209     dbra        d0, 0b
210
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
218 use_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
222 0:
223     move.w      (a0)+, (a1)+
224     dbra        d0, 0b
225     jmp         0xfffe00
226
227 run_game_r:
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)
236 run_game_r_end:
237
238 run_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
246 0:  /* 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
257 0:  /* wait for special code to end */
258     cmp.b       (0x03,a6), d0
259     beq         0b
260
261     /* wait for active display */
262     moveq.l     #3, d0
263 0:
264     btst        d0, (a4)      /* 8 */
265     beq.s       0b            /* 10 */
266 0:
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)
289 run_game_r_tas_end:
290
291 # vim:filetype=asmM68k:ts=4:sw=4:expandtab