cff531af |
1 | @* |
2 | @* Memory I/O handlers for Sega/Mega CD emulation |
3 | @* (C) notaz, 2007-2009 |
4 | @* |
5 | @* This work is licensed under the terms of MAME license. |
6 | @* See COPYING file in the top-level directory. |
7 | @* |
4ff2d527 |
8 | |
9 | .equiv PCM_STEP_SHIFT, 11 |
4ff2d527 |
10 | |
11 | .text |
0ace9b9a |
12 | .align 2 |
13 | |
fa8fb754 |
14 | .global PicoRead8_mcd_io |
15 | .global PicoRead16_mcd_io |
16 | .global PicoWrite8_mcd_io |
17 | .global PicoWrite16_mcd_io |
0ace9b9a |
18 | |
19 | .global PicoReadS68k8_pr |
20 | .global PicoReadS68k16_pr |
21 | .global PicoWriteS68k8_pr |
22 | .global PicoWriteS68k16_pr |
23 | |
24 | .global PicoReadM68k8_cell0 |
25 | .global PicoReadM68k8_cell1 |
26 | .global PicoReadM68k16_cell0 |
27 | .global PicoReadM68k16_cell1 |
28 | .global PicoWriteM68k8_cell0 |
29 | .global PicoWriteM68k8_cell1 |
30 | .global PicoWriteM68k16_cell0 |
31 | .global PicoWriteM68k16_cell1 |
32 | |
33 | .global PicoReadS68k8_dec0 |
34 | .global PicoReadS68k8_dec1 |
35 | .global PicoReadS68k16_dec0 |
36 | .global PicoReadS68k16_dec1 |
37 | .global PicoWriteS68k8_dec_m0b0 |
38 | .global PicoWriteS68k8_dec_m1b0 |
39 | .global PicoWriteS68k8_dec_m2b0 |
40 | .global PicoWriteS68k8_dec_m0b1 |
41 | .global PicoWriteS68k8_dec_m1b1 |
42 | .global PicoWriteS68k8_dec_m2b1 |
43 | .global PicoWriteS68k16_dec_m0b0 |
44 | .global PicoWriteS68k16_dec_m1b0 |
45 | .global PicoWriteS68k16_dec_m2b0 |
46 | .global PicoWriteS68k16_dec_m0b1 |
47 | .global PicoWriteS68k16_dec_m1b1 |
48 | .global PicoWriteS68k16_dec_m2b1 |
4ff2d527 |
49 | |
50 | @ externs, just for reference |
51 | .extern Pico |
4ff2d527 |
52 | .extern Read_CDC_Host |
53 | .extern m68k_reg_write8 |
4ff2d527 |
54 | .extern s68k_reg_read16 |
4ff2d527 |
55 | .extern s68k_reg_write8 |
a93a80de |
56 | .extern s68k_reg_write16 |
2433f409 |
57 | .extern s68k_poll_detect |
33be04ca |
58 | .extern pcd_pcm_write |
59 | .extern pcd_pcm_read |
0ace9b9a |
60 | .extern PicoCpuCS68k |
61 | .extern PicoRead8_io |
62 | .extern PicoRead16_io |
63 | .extern PicoWrite8_io |
64 | .extern PicoWrite16_io |
08769494 |
65 | .extern m68k_comm_check |
4ff2d527 |
66 | |
4ff2d527 |
67 | |
68 | @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ |
69 | |
70 | @ utilities |
71 | |
72 | @ r0=addr[in,out], r1,r2=tmp |
73 | .macro cell_map |
74 | ands r1, r0, #0x01c000 |
75 | ldrne pc, [pc, r1, lsr #12] |
76 | beq 0f @ most common? |
77 | .long 0f |
78 | .long 0f |
79 | .long 0f |
80 | .long 0f |
81 | .long 1f |
82 | .long 1f |
83 | .long 2f |
84 | .long 3f |
85 | 1: @ x16 cells |
86 | and r1, r0, #0x7e00 @ col |
87 | and r2, r0, #0x01fc @ row |
88 | orr r2, r2, #0x0400 |
89 | orr r1, r2, r1, ror #13 |
90 | b 9f |
91 | 2: @ x8 cells |
92 | and r1, r0, #0x3f00 @ col |
93 | and r2, r0, #0x00fc @ row |
94 | orr r2, r2, #0x0600 |
95 | orr r1, r2, r1, ror #12 |
96 | b 9f |
97 | 3: @ x4 cells |
98 | and r1, r0, #0x1f80 @ col |
99 | and r2, r0, #0x007c @ row |
100 | orr r1, r2, r1, ror #11 |
101 | and r2, r0,#0x1e000 |
102 | orr r1, r1, r2, lsr #6 |
103 | b 9f |
104 | 0: @ x32 cells |
105 | and r1, r0, #0xfc00 @ col |
106 | and r2, r0, #0x03fc @ row |
107 | orr r1, r2, r1, ror #14 |
108 | 9: |
109 | and r0, r0, #3 |
110 | orr r0, r0, r1, ror #26 @ rol 4+2 |
111 | .endm |
112 | |
113 | |
4ff2d527 |
114 | @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ |
115 | |
116 | |
117 | m_read_null: |
118 | mov r0, #0 |
119 | bx lr |
120 | |
121 | |
0ace9b9a |
122 | PicoReadM68k8_cell0: @ 0x220000 - 0x23ffff, cell arranged |
123 | mov r3, #0x0c0000 |
124 | b 0f |
4ff2d527 |
125 | |
0ace9b9a |
126 | PicoReadM68k8_cell1: @ 0x220000 - 0x23ffff, cell arranged |
127 | mov r3, #0x0e0000 |
128 | 0: |
4ff2d527 |
129 | cell_map |
130 | ldr r1, =(Pico+0x22200) |
0ace9b9a |
131 | add r0, r0, r3 |
4ff2d527 |
132 | ldr r1, [r1] |
133 | eor r0, r0, #1 |
134 | ldrb r0, [r1, r0] |
135 | bx lr |
136 | |
137 | |
fa8fb754 |
138 | PicoRead8_mcd_io: |
0ace9b9a |
139 | and r1, r0, #0xff00 |
140 | cmp r1, #0x2000 @ a120xx? |
141 | bne PicoRead8_io |
4ff2d527 |
142 | |
143 | ldr r1, =(Pico+0x22200) |
144 | and r0, r0, #0x3f |
145 | ldr r1, [r1] @ Pico.mcd (used everywhere) |
146 | cmp r0, #0x0e |
147 | ldrlt pc, [pc, r0, lsl #2] |
148 | b m_m68k_read8_hi |
149 | .long m_m68k_read8_r00 |
150 | .long m_m68k_read8_r01 |
151 | .long m_m68k_read8_r02 |
152 | .long m_m68k_read8_r03 |
153 | .long m_m68k_read8_r04 |
154 | .long m_read_null @ unused bits |
155 | .long m_m68k_read8_r06 |
156 | .long m_m68k_read8_r07 |
157 | .long m_m68k_read8_r08 |
158 | .long m_m68k_read8_r09 |
159 | .long m_read_null @ reserved |
160 | .long m_read_null |
161 | .long m_m68k_read8_r0c |
162 | .long m_m68k_read8_r0d |
163 | m_m68k_read8_r00: |
164 | add r1, r1, #0x110000 |
00bd648e |
165 | ldr r0, [r1, #0x30] |
4ff2d527 |
166 | and r0, r0, #0x04000000 @ we need irq2 mask state |
167 | mov r0, r0, lsr #19 |
168 | bx lr |
169 | m_m68k_read8_r01: |
170 | add r1, r1, #0x110000 |
171 | add r1, r1, #0x002200 |
172 | ldrb r0, [r1, #2] @ Pico_mcd->m.busreq |
173 | bx lr |
174 | m_m68k_read8_r02: |
175 | add r1, r1, #0x110000 |
176 | ldrb r0, [r1, #2] |
177 | bx lr |
cc5ffc3c |
178 | m_m68k_read8_r03: |
179 | add r1, r1, #0x110000 |
180 | push {r1, lr} |
181 | bl m68k_comm_check |
182 | pop {r1, lr} |
183 | ldrb r0, [r1, #3] |
184 | and r0, r0, #0xc7 |
185 | bx lr |
4ff2d527 |
186 | m_m68k_read8_r04: |
187 | add r1, r1, #0x110000 |
188 | ldrb r0, [r1, #4] |
189 | bx lr |
190 | m_m68k_read8_r06: |
191 | ldrb r0, [r1, #0x73] @ IRQ vector |
192 | bx lr |
193 | m_m68k_read8_r07: |
194 | ldrb r0, [r1, #0x72] |
195 | bx lr |
196 | m_m68k_read8_r08: |
197 | mov r0, #0 |
198 | bl Read_CDC_Host @ TODO: make it local |
199 | mov r0, r0, lsr #8 |
200 | bx lr |
201 | m_m68k_read8_r09: |
202 | mov r0, #0 |
203 | b Read_CDC_Host |
204 | m_m68k_read8_r0c: |
205 | add r1, r1, #0x110000 |
206 | add r1, r1, #0x002200 |
207 | ldr r0, [r1, #0x14] @ Pico_mcd->m.timer_stopwatch |
208 | mov r0, r0, lsr #24 |
209 | bx lr |
210 | m_m68k_read8_r0d: |
211 | add r1, r1, #0x110000 |
212 | add r1, r1, #0x002200 |
213 | ldr r0, [r1, #0x14] |
214 | mov r0, r0, lsr #16 |
215 | bx lr |
216 | m_m68k_read8_hi: |
217 | cmp r0, #0x30 |
4ff2d527 |
218 | add r1, r1, #0x110000 |
cc5ffc3c |
219 | movge r0, #0 |
220 | bxge lr |
221 | add r1, r0 |
222 | push {r1, lr} |
223 | bl m68k_comm_check |
224 | pop {r1, lr} |
225 | ldrb r0, [r1] |
226 | bx lr |
4ff2d527 |
227 | |
4ff2d527 |
228 | |
229 | @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ |
230 | |
231 | |
0ace9b9a |
232 | PicoReadM68k16_cell0: @ 0x220000 - 0x23ffff, cell arranged |
233 | mov r3, #0x0c0000 |
234 | b 0f |
4ff2d527 |
235 | |
0ace9b9a |
236 | PicoReadM68k16_cell1: @ 0x220000 - 0x23ffff, cell arranged |
237 | mov r3, #0x0e0000 |
238 | 0: |
4ff2d527 |
239 | cell_map |
240 | ldr r1, =(Pico+0x22200) |
0ace9b9a |
241 | add r0, r0, r3 |
4ff2d527 |
242 | ldr r1, [r1] |
243 | bic r0, r0, #1 |
244 | ldrh r0, [r1, r0] |
245 | bx lr |
246 | |
247 | |
fa8fb754 |
248 | PicoRead16_mcd_io: |
0ace9b9a |
249 | and r1, r0, #0xff00 |
250 | cmp r1, #0x2000 @ a120xx |
251 | bne PicoRead16_io |
4ff2d527 |
252 | |
253 | m_m68k_read16_m68k_regs: |
254 | ldr r1, =(Pico+0x22200) |
255 | and r0, r0, #0x3e |
256 | ldr r1, [r1] @ Pico.mcd (used everywhere) |
257 | cmp r0, #0x0e |
258 | ldrlt pc, [pc, r0, lsl #1] |
259 | b m_m68k_read16_hi |
260 | .long m_m68k_read16_r00 |
261 | .long m_m68k_read16_r02 |
262 | .long m_m68k_read16_r04 |
263 | .long m_m68k_read16_r06 |
264 | .long m_m68k_read16_r08 |
265 | .long m_read_null @ reserved |
266 | .long m_m68k_read16_r0c |
267 | m_m68k_read16_r00: |
268 | add r1, r1, #0x110000 |
7a1f6e45 |
269 | ldr r0, [r1, #0x30] |
4ff2d527 |
270 | add r1, r1, #0x002200 |
271 | ldrb r1, [r1, #2] @ Pico_mcd->m.busreq |
272 | and r0, r0, #0x04000000 @ we need irq2 mask state |
273 | orr r0, r1, r0, lsr #11 |
274 | bx lr |
cc5ffc3c |
275 | m_m68k_read16_r02: |
276 | add r1, r1, #0x110000 |
277 | push {r1, lr} |
278 | bl m68k_comm_check |
279 | pop {r1, lr} |
280 | ldrb r2, [r1, #3] |
281 | ldrb r0, [r1, #2] |
c008977e |
282 | and r2, r2, #0xc7 |
cc5ffc3c |
283 | orr r0, r2, r0, lsl #8 |
284 | bx lr |
4ff2d527 |
285 | m_m68k_read16_r04: |
286 | add r1, r1, #0x110000 |
287 | ldrb r0, [r1, #4] |
288 | mov r0, r0, lsl #8 |
289 | bx lr |
290 | m_m68k_read16_r06: |
291 | ldrh r0, [r1, #0x72] @ IRQ vector |
292 | bx lr |
293 | m_m68k_read16_r08: |
294 | mov r0, #0 |
295 | b Read_CDC_Host |
296 | m_m68k_read16_r0c: |
297 | add r1, r1, #0x110000 |
298 | add r1, r1, #0x002200 |
299 | ldr r0, [r1, #0x14] |
300 | mov r0, r0, lsr #16 |
301 | bx lr |
302 | m_m68k_read16_hi: |
303 | cmp r0, #0x30 |
cc5ffc3c |
304 | add r1, r1, #0x110000 |
4ff2d527 |
305 | movge r0, #0 |
306 | bxge lr |
cc5ffc3c |
307 | |
308 | add r1, r0, r1 |
309 | push {r1, lr} |
310 | bl m68k_comm_check |
311 | pop {r0, lr} |
312 | ldrh r0, [r0] |
313 | mov r1, r0, lsr #8 |
314 | and r0, r0, #0xff |
315 | orr r0, r1, r0, lsl #8 |
316 | bx lr |
4ff2d527 |
317 | |
318 | |
0ace9b9a |
319 | @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ |
4ff2d527 |
320 | |
4ff2d527 |
321 | |
0ace9b9a |
322 | PicoWriteM68k8_cell0: @ 0x220000 - 0x23ffff, cell arranged |
323 | mov r12,#0x0c0000 |
324 | b 0f |
4ff2d527 |
325 | |
0ace9b9a |
326 | PicoWriteM68k8_cell1: @ 0x220000 - 0x23ffff, cell arranged |
327 | mov r12,#0x0e0000 |
328 | 0: |
329 | mov r3, r1 |
330 | cell_map |
331 | ldr r2, =(Pico+0x22200) |
332 | add r0, r0, r12 |
333 | ldr r2, [r2] |
334 | eor r0, r0, #1 |
335 | strb r3, [r2, r0] |
4ff2d527 |
336 | bx lr |
337 | |
338 | |
fa8fb754 |
339 | PicoWrite8_mcd_io: |
0ace9b9a |
340 | and r2, r0, #0xff00 |
341 | cmp r2, #0x2000 @ a120xx? |
342 | beq m68k_reg_write8 |
343 | b PicoWrite8_io |
344 | |
345 | |
4ff2d527 |
346 | @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ |
347 | |
348 | |
0ace9b9a |
349 | PicoWriteM68k16_cell0: @ 0x220000 - 0x23ffff, cell arranged |
350 | mov r12, #0x0c0000 |
351 | b 0f |
352 | |
353 | PicoWriteM68k16_cell1: @ 0x220000 - 0x23ffff, cell arranged |
354 | mov r12, #0x0e0000 |
355 | 0: |
356 | mov r3, r1 |
357 | cell_map |
4ff2d527 |
358 | ldr r1, =(Pico+0x22200) |
0ace9b9a |
359 | add r0, r0, r12 |
4ff2d527 |
360 | ldr r1, [r1] |
361 | bic r0, r0, #1 |
0ace9b9a |
362 | strh r3, [r1, r0] |
4ff2d527 |
363 | bx lr |
364 | |
365 | |
fa8fb754 |
366 | PicoWrite16_mcd_io: |
0ace9b9a |
367 | and r2, r0, #0xff00 |
368 | cmp r2, #0x2000 @ a120xx? |
369 | bne PicoWrite16_io |
4ff2d527 |
370 | |
0ace9b9a |
371 | m_m68k_write16_regs: |
372 | and r0, r0, #0x3e |
373 | cmp r0, #0x0e |
374 | beq m_m68k_write16_regs_spec |
375 | and r3, r1, #0xff |
376 | add r2, r0, #1 |
377 | stmfd sp!,{r2,r3,lr} |
378 | mov r1, r1, lsr #8 |
379 | bl m68k_reg_write8 |
380 | ldmfd sp!,{r0,r1,lr} |
381 | b m68k_reg_write8 |
4ff2d527 |
382 | |
0ace9b9a |
383 | m_m68k_write16_regs_spec: @ special case |
0ace9b9a |
384 | mov r1, r1, lsr #8 |
08769494 |
385 | b m68k_reg_write8 |
4ff2d527 |
386 | |
387 | |
0ace9b9a |
388 | @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ |
389 | @ Sub 68k |
390 | @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ |
4ff2d527 |
391 | |
4ff2d527 |
392 | |
0ace9b9a |
393 | PicoReadS68k8_dec0: @ 0x080000 - 0x0bffff |
394 | mov r3, #0x080000 @ + ^ / 2 |
395 | b 0f |
4ff2d527 |
396 | |
0ace9b9a |
397 | PicoReadS68k8_dec1: |
398 | mov r3, #0x0a0000 @ + ^ / 2 |
399 | 0: |
5c69a605 |
400 | ldr r2, =(Pico+0x22200) |
401 | eor r0, r0, #2 |
402 | ldr r2, [r2] |
403 | movs r0, r0, lsr #1 @ +4-6 <<16 |
0ace9b9a |
404 | add r2, r2, r3 @ map to our address |
5c69a605 |
405 | ldrb r0, [r2, r0] |
406 | movcc r0, r0, lsr #4 |
407 | andcs r0, r0, #0xf |
408 | bx lr |
5c69a605 |
409 | |
4ff2d527 |
410 | |
0ace9b9a |
411 | PicoReadS68k8_pr: |
412 | and r2, r0, #0xfe00 |
413 | cmp r2, #0x8000 |
414 | bne m_s68k_read8_pcm |
4ff2d527 |
415 | |
416 | m_s68k_read8_regs: |
417 | bic r0, r0, #0xff0000 |
418 | bic r0, r0, #0x008000 |
2433f409 |
419 | sub r2, r0, #0x0e |
420 | cmp r2, #(0x30-0x0e) |
421 | blo m_s68k_read8_comm |
4ff2d527 |
422 | stmfd sp!,{r0,lr} |
423 | bic r0, r0, #1 |
a93a80de |
424 | bl s68k_reg_read16 |
4ff2d527 |
425 | ldmfd sp!,{r1,lr} |
426 | tst r1, #1 |
427 | moveq r0, r0, lsr #8 |
428 | and r0, r0, #0xff |
429 | bx lr |
430 | |
2433f409 |
431 | m_s68k_read8_comm: |
432 | ldr r1, =(Pico+0x22200) |
433 | ldr r1, [r1] |
434 | add r1, r1, #0x110000 |
435 | ldrb r1, [r1, r0] |
334d9fb6 |
436 | bic r0, r0, #1 |
2433f409 |
437 | b s68k_poll_detect |
438 | |
4ff2d527 |
439 | |
0ace9b9a |
440 | m_s68k_read8_pcm: |
441 | tst r0, #0x8000 |
442 | bne m_read_null |
4ff2d527 |
443 | |
0ace9b9a |
444 | @ must not trash r3 and r12 |
4ff2d527 |
445 | ldr r1, =(Pico+0x22200) |
0ace9b9a |
446 | bic r0, r0, #0xff0000 |
4ff2d527 |
447 | ldr r1, [r1] |
0ace9b9a |
448 | mov r2, #0x110000 |
449 | orr r2, r2, #0x002200 |
450 | cmp r0, #0x2000 |
451 | bge m_s68k_read8_pcm_ram |
452 | cmp r0, #0x20 |
33be04ca |
453 | movge r0, r0, lsr #1 |
454 | bge pcd_pcm_read |
455 | mov r0, #0 |
5c69a605 |
456 | bx lr |
4ff2d527 |
457 | |
0ace9b9a |
458 | m_s68k_read8_pcm_ram: |
459 | orr r2, r2, #0x40 |
460 | ldr r2, [r1, r2] |
461 | add r1, r1, #0x100000 @ pcm_ram |
462 | and r2, r2, #0x0f000000 @ bank |
463 | add r1, r1, r2, lsr #12 |
464 | bic r0, r0, #0x00e000 |
465 | mov r0, r0, lsr #1 |
466 | ldrb r0, [r1, r0] |
467 | bx lr |
4ff2d527 |
468 | |
469 | |
470 | @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ |
471 | |
472 | |
0ace9b9a |
473 | PicoReadS68k16_dec0: @ 0x080000 - 0x0bffff |
474 | mov r3, #0x080000 @ + ^ / 2 |
475 | b 0f |
5c69a605 |
476 | |
0ace9b9a |
477 | PicoReadS68k16_dec1: |
478 | mov r3, #0x0a0000 @ + ^ / 2 |
479 | 0: |
5c69a605 |
480 | ldr r2, =(Pico+0x22200) |
481 | eor r0, r0, #2 |
482 | ldr r2, [r2] |
483 | mov r0, r0, lsr #1 @ +4-6 <<16 |
0ace9b9a |
484 | add r2, r2, r3 @ map to our address |
485 | ldrb r0, [r2, r0] |
5c69a605 |
486 | orr r0, r0, r0, lsl #4 |
487 | bic r0, r0, #0xf0 |
5c69a605 |
488 | bx lr |
4ff2d527 |
489 | |
490 | |
0ace9b9a |
491 | PicoReadS68k16_pr: |
492 | and r2, r0, #0xfe00 |
493 | cmp r2, #0x8000 |
494 | @ pcm is on 8-bit bus, would this be same as byte access? |
495 | bne m_s68k_read8_pcm |
4ff2d527 |
496 | |
0ace9b9a |
497 | m_s68k_read16_regs: |
4ff2d527 |
498 | bic r0, r0, #0xff0000 |
499 | bic r0, r0, #0x008000 |
500 | bic r0, r0, #0x000001 |
0ace9b9a |
501 | cmp r0, #8 |
502 | bne s68k_reg_read16 |
503 | mov r0, #1 |
504 | b Read_CDC_Host |
4ff2d527 |
505 | |
4ff2d527 |
506 | |
507 | @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ |
508 | |
509 | |
0ace9b9a |
510 | .macro m_s68k_write8_2M_decode |
48e8482f |
511 | ldr r2, =(Pico+0x22200) |
512 | eor r0, r0, #2 |
0ace9b9a |
513 | ldr r2, [r2] @ Pico.rom |
48e8482f |
514 | movs r0, r0, lsr #1 @ +4-6 <<16 |
0ace9b9a |
515 | add r2, r2, r3 @ map to our address |
48e8482f |
516 | .endm |
517 | |
0ace9b9a |
518 | PicoWriteS68k8_dec_m2b0: @ overwrite |
519 | ands r1, r1, #0x0f |
520 | bxeq lr |
521 | |
522 | PicoWriteS68k8_dec_m0b0: |
523 | mov r3, #0x080000 |
524 | b 0f |
525 | |
526 | PicoWriteS68k8_dec_m2b1: @ overwrite |
527 | ands r1, r1, #0x0f |
528 | bxeq lr |
529 | |
530 | PicoWriteS68k8_dec_m0b1: |
531 | mov r3, #0x0a0000 |
532 | 0: |
533 | m_s68k_write8_2M_decode |
48e8482f |
534 | ldrb r0, [r2, r0]! |
535 | and r1, r1, #0x0f |
536 | movcc r1, r1, lsl #4 |
537 | andcc r3, r0, #0x0f |
538 | andcs r3, r0, #0xf0 |
539 | orr r3, r3, r1 |
48e8482f |
540 | strneb r3, [r2] |
541 | bx lr |
48e8482f |
542 | |
0ace9b9a |
543 | PicoWriteS68k8_dec_m1b0: @ underwrite |
544 | mov r3, #0x080000 |
545 | b 0f |
546 | |
547 | PicoWriteS68k8_dec_m1b1: |
548 | mov r3, #0x0a0000 |
549 | 0: |
48e8482f |
550 | ands r1, r1, #0x0f |
551 | bxeq lr |
0ace9b9a |
552 | m_s68k_write8_2M_decode |
48e8482f |
553 | ldrb r0, [r2, r0]! |
554 | movcc r1, r1, lsl #4 |
555 | andcc r3, r0, #0x0f |
556 | andcs r3, r0, #0xf0 |
0ace9b9a |
557 | teq r3, r0 |
558 | bxne lr |
48e8482f |
559 | orr r3, r3, r1 |
48e8482f |
560 | strneb r3, [r2] |
561 | bx lr |
48e8482f |
562 | |
48e8482f |
563 | |
0ace9b9a |
564 | PicoWriteS68k8_pr: |
565 | and r2, r0, #0xfe00 |
566 | cmp r2, #0x8000 |
567 | bne m_s68k_write8_pcm |
48e8482f |
568 | |
0ace9b9a |
569 | m_s68k_write8_regs: |
4ff2d527 |
570 | bic r0, r0, #0xff0000 |
0ace9b9a |
571 | bic r0, r0, #0x008000 |
572 | tst r0, #0x7e00 |
573 | movne r0, #0 |
574 | bxne lr |
a93a80de |
575 | sub r2, r0, #0x59 |
576 | cmp r2, #0x0f |
0ace9b9a |
577 | bhs s68k_reg_write8 |
578 | bic r0, r0, #1 |
579 | orr r1, r1, r1, lsl #8 |
a93a80de |
580 | b s68k_reg_write16 |
4ff2d527 |
581 | |
582 | |
583 | m_s68k_write8_pcm: |
0ace9b9a |
584 | tst r0, #0x8000 |
585 | bxne lr |
4ff2d527 |
586 | bic r0, r0, #0xff0000 |
587 | cmp r0, #0x12 |
588 | movlt r0, r0, lsr #1 |
33be04ca |
589 | blt pcd_pcm_write |
4ff2d527 |
590 | |
591 | cmp r0, #0x2000 |
592 | bxlt lr |
593 | |
594 | m_s68k_write8_pcm_ram: |
595 | ldr r3, =(Pico+0x22200) |
596 | bic r0, r0, #0x00e000 |
597 | ldr r3, [r3] |
598 | mov r0, r0, lsr #1 |
599 | add r2, r3, #0x110000 |
600 | add r2, r2, #0x002200 |
601 | add r2, r2, #0x000040 |
602 | ldr r2, [r2] |
603 | add r3, r3, #0x100000 @ pcm_ram |
604 | and r2, r2, #0x0f000000 @ bank |
605 | add r3, r3, r2, lsr #12 |
606 | strb r1, [r3, r0] |
607 | bx lr |
608 | |
609 | |
4ff2d527 |
610 | @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ |
611 | |
612 | |
0ace9b9a |
613 | .macro m_s68k_write16_2M_decode |
48e8482f |
614 | ldr r2, =(Pico+0x22200) |
615 | eor r0, r0, #2 |
616 | ldr r2, [r2] |
617 | mov r0, r0, lsr #1 @ +4-6 <<16 |
0ace9b9a |
618 | add r2, r2, r3 @ map to our address |
48e8482f |
619 | .endm |
620 | |
0ace9b9a |
621 | PicoWriteS68k16_dec_m0b0: |
622 | mov r3, #0x080000 |
623 | b 0f |
624 | |
625 | PicoWriteS68k16_dec_m0b1: |
626 | mov r3, #0x0a0000 |
627 | 0: |
628 | m_s68k_write16_2M_decode |
48e8482f |
629 | bic r1, r1, #0xf0 |
630 | orr r1, r1, r1, lsr #4 |
631 | strb r1, [r2, r0] |
632 | bx lr |
48e8482f |
633 | |
0ace9b9a |
634 | PicoWriteS68k16_dec_m1b0: @ underwrite |
635 | mov r3, #0x080000 |
636 | b 0f |
637 | |
638 | PicoWriteS68k16_dec_m1b1: |
639 | mov r3, #0x0a0000 |
640 | 0: |
48e8482f |
641 | bics r1, r1, #0xf000 |
642 | bicnes r1, r1, #0x00f0 |
643 | bxeq lr |
644 | orr r1, r1, r1, lsr #4 |
0ace9b9a |
645 | m_s68k_write16_2M_decode |
48e8482f |
646 | ldrb r0, [r2, r0]! |
647 | and r3, r1, #0x0f |
648 | and r1, r1, #0xf0 |
649 | tst r0, #0x0f |
650 | orreq r0, r0, r3 |
651 | tst r0, #0xf0 |
652 | orreq r0, r0, r1 |
653 | strb r0, [r2] |
654 | bx lr |
48e8482f |
655 | |
0ace9b9a |
656 | PicoWriteS68k16_dec_m2b0: @ overwrite |
657 | mov r3, #0x080000 |
658 | b 0f |
659 | |
660 | PicoWriteS68k16_dec_m2b1: |
661 | mov r3, #0x0a0000 |
662 | 0: |
48e8482f |
663 | bics r1, r1, #0xf000 |
664 | bicnes r1, r1, #0x00f0 |
665 | bxeq lr |
666 | orr r1, r1, r1, lsr #4 |
0ace9b9a |
667 | m_s68k_write16_2M_decode |
48e8482f |
668 | ldrb r0, [r2, r0]! |
669 | ands r3, r1, #0x0f |
670 | andne r0, r0, #0xf0 |
671 | orrne r0, r0, r3 |
672 | ands r1, r1, #0xf0 |
673 | andne r0, r0, #0x0f |
674 | orrne r0, r0, r1 |
675 | strb r0, [r2] |
676 | bx lr |
48e8482f |
677 | |
4ff2d527 |
678 | |
0ace9b9a |
679 | PicoWriteS68k16_pr: |
680 | and r2, r0, #0xfe00 |
681 | cmp r2, #0x8000 |
682 | bne m_s68k_write8_pcm |
4ff2d527 |
683 | |
684 | m_s68k_write16_regs: |
685 | bic r0, r0, #0xff0000 |
686 | bic r0, r0, #0x008000 |
5c69a605 |
687 | bic r0, r0, #1 |
4ff2d527 |
688 | tst r0, #0x7e00 |
689 | movne r0, #0 |
690 | bxne lr |
5c69a605 |
691 | cmp r0, #0x0e |
a93a80de |
692 | bne s68k_reg_write16 |
4ff2d527 |
693 | |
5c69a605 |
694 | m_s68k_write16_regs_spec: @ special case |
695 | ldr r2, =(Pico+0x22200) |
696 | mov r0, #0x110000 |
697 | ldr r2, [r2] |
698 | add r0, r0, #0x00000f |
699 | strb r1, [r2, r0] @ if (a == 0xe) s68k_regs[0xf] = d; |
48e8482f |
700 | bx lr |
4ff2d527 |
701 | |
0ace9b9a |
702 | .pool |
6cadc2da |
703 | |
cff531af |
704 | @ vim:filetype=armasm |