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