drop legacy save support
[picodrive.git] / pico / cd / memory_arm.s
... / ...
CommitLineData
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@*
8
9.equiv PCM_STEP_SHIFT, 11
10
11.text
12.align 2
13
14.global PicoRead8_mcd_io
15.global PicoRead16_mcd_io
16.global PicoWrite8_mcd_io
17.global PicoWrite16_mcd_io
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
49
50@ externs, just for reference
51.extern Pico
52.extern cdc_host_r
53.extern m68k_reg_write8
54.extern s68k_reg_read16
55.extern s68k_reg_write8
56.extern s68k_reg_write16
57.extern s68k_poll_detect
58.extern pcd_pcm_write
59.extern pcd_pcm_read
60.extern PicoCpuCS68k
61.extern PicoRead8_io
62.extern PicoRead16_io
63.extern PicoWrite8_io
64.extern PicoWrite16_io
65.extern m68k_comm_check
66
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
851: @ 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
912: @ 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
973: @ 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
1040: @ x32 cells
105 and r1, r0, #0xfc00 @ col
106 and r2, r0, #0x03fc @ row
107 orr r1, r2, r1, ror #14
1089:
109 and r0, r0, #3
110 orr r0, r0, r1, ror #26 @ rol 4+2
111.endm
112
113
114@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
115
116
117m_read_null:
118 mov r0, #0
119 bx lr
120
121
122PicoReadM68k8_cell0: @ 0x220000 - 0x23ffff, cell arranged
123 mov r3, #0x0c0000
124 b 0f
125
126PicoReadM68k8_cell1: @ 0x220000 - 0x23ffff, cell arranged
127 mov r3, #0x0e0000
1280:
129 cell_map
130 ldr r1, =(Pico+0x22200)
131 add r0, r0, r3
132 ldr r1, [r1]
133 eor r0, r0, #1
134 ldrb r0, [r1, r0]
135 bx lr
136
137
138PicoRead8_mcd_io:
139 and r1, r0, #0xff00
140 cmp r1, #0x2000 @ a120xx?
141 bne PicoRead8_io
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
163m_m68k_read8_r00:
164 add r1, r1, #0x110000
165 ldr r0, [r1, #0x30]
166 and r0, r0, #0x04000000 @ we need irq2 mask state
167 mov r0, r0, lsr #19
168 bx lr
169m_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
174m_m68k_read8_r02:
175 add r1, r1, #0x110000
176 ldrb r0, [r1, #2]
177 bx lr
178m_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
186m_m68k_read8_r04:
187 add r1, r1, #0x110000
188 ldrb r0, [r1, #4]
189 bx lr
190m_m68k_read8_r06:
191 ldrb r0, [r1, #0x73] @ IRQ vector
192 bx lr
193m_m68k_read8_r07:
194 ldrb r0, [r1, #0x72]
195 bx lr
196m_m68k_read8_r08:
197 mov r0, #0
198 bl cdc_host_r
199 mov r0, r0, lsr #8
200 bx lr
201m_m68k_read8_r09:
202 mov r0, #0
203 b cdc_host_r
204m_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
210m_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
216m_m68k_read8_hi:
217 cmp r0, #0x30
218 add r1, r1, #0x110000
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
227
228
229@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
230
231
232PicoReadM68k16_cell0: @ 0x220000 - 0x23ffff, cell arranged
233 mov r3, #0x0c0000
234 b 0f
235
236PicoReadM68k16_cell1: @ 0x220000 - 0x23ffff, cell arranged
237 mov r3, #0x0e0000
2380:
239 cell_map
240 ldr r1, =(Pico+0x22200)
241 add r0, r0, r3
242 ldr r1, [r1]
243 bic r0, r0, #1
244 ldrh r0, [r1, r0]
245 bx lr
246
247
248PicoRead16_mcd_io:
249 and r1, r0, #0xff00
250 cmp r1, #0x2000 @ a120xx
251 bne PicoRead16_io
252
253m_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
267m_m68k_read16_r00:
268 add r1, r1, #0x110000
269 ldr r0, [r1, #0x30]
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
275m_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]
282 and r2, r2, #0xc7
283 orr r0, r2, r0, lsl #8
284 bx lr
285m_m68k_read16_r04:
286 add r1, r1, #0x110000
287 ldrb r0, [r1, #4]
288 mov r0, r0, lsl #8
289 bx lr
290m_m68k_read16_r06:
291 ldrh r0, [r1, #0x72] @ IRQ vector
292 bx lr
293m_m68k_read16_r08:
294 mov r0, #0
295 b cdc_host_r
296m_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
302m_m68k_read16_hi:
303 cmp r0, #0x30
304 add r1, r1, #0x110000
305 movge r0, #0
306 bxge lr
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
317
318
319@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
320
321
322PicoWriteM68k8_cell0: @ 0x220000 - 0x23ffff, cell arranged
323 mov r12,#0x0c0000
324 b 0f
325
326PicoWriteM68k8_cell1: @ 0x220000 - 0x23ffff, cell arranged
327 mov r12,#0x0e0000
3280:
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]
336 bx lr
337
338
339PicoWrite8_mcd_io:
340 and r2, r0, #0xff00
341 cmp r2, #0x2000 @ a120xx?
342 beq m68k_reg_write8
343 b PicoWrite8_io
344
345
346@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
347
348
349PicoWriteM68k16_cell0: @ 0x220000 - 0x23ffff, cell arranged
350 mov r12, #0x0c0000
351 b 0f
352
353PicoWriteM68k16_cell1: @ 0x220000 - 0x23ffff, cell arranged
354 mov r12, #0x0e0000
3550:
356 mov r3, r1
357 cell_map
358 ldr r1, =(Pico+0x22200)
359 add r0, r0, r12
360 ldr r1, [r1]
361 bic r0, r0, #1
362 strh r3, [r1, r0]
363 bx lr
364
365
366PicoWrite16_mcd_io:
367 and r2, r0, #0xff00
368 cmp r2, #0x2000 @ a120xx?
369 bne PicoWrite16_io
370
371m_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
382
383m_m68k_write16_regs_spec: @ special case
384 mov r1, r1, lsr #8
385 b m68k_reg_write8
386
387
388@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
389@ Sub 68k
390@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
391
392
393PicoReadS68k8_dec0: @ 0x080000 - 0x0bffff
394 mov r3, #0x080000 @ + ^ / 2
395 b 0f
396
397PicoReadS68k8_dec1:
398 mov r3, #0x0a0000 @ + ^ / 2
3990:
400 ldr r2, =(Pico+0x22200)
401 eor r0, r0, #2
402 ldr r2, [r2]
403 movs r0, r0, lsr #1 @ +4-6 <<16
404 add r2, r2, r3 @ map to our address
405 ldrb r0, [r2, r0]
406 movcc r0, r0, lsr #4
407 andcs r0, r0, #0xf
408 bx lr
409
410
411PicoReadS68k8_pr:
412 and r2, r0, #0xfe00
413 cmp r2, #0x8000
414 bne m_s68k_read8_pcm
415
416m_s68k_read8_regs:
417 bic r0, r0, #0xff0000
418 bic r0, r0, #0x008000
419 sub r2, r0, #0x0e
420 cmp r2, #(0x30-0x0e)
421 blo m_s68k_read8_comm
422 stmfd sp!,{r0,lr}
423 bic r0, r0, #1
424 bl s68k_reg_read16
425 ldmfd sp!,{r1,lr}
426 tst r1, #1
427 moveq r0, r0, lsr #8
428 and r0, r0, #0xff
429 bx lr
430
431m_s68k_read8_comm:
432 ldr r1, =(Pico+0x22200)
433 ldr r1, [r1]
434 add r1, r1, #0x110000
435 ldrb r1, [r1, r0]
436 bic r0, r0, #1
437 b s68k_poll_detect
438
439
440m_s68k_read8_pcm:
441 tst r0, #0x8000
442 bne m_read_null
443
444 @ must not trash r3 and r12
445 ldr r1, =(Pico+0x22200)
446 bic r0, r0, #0xff0000
447 ldr r1, [r1]
448 mov r2, #0x110000
449 orr r2, r2, #0x002200
450 cmp r0, #0x2000
451 bge m_s68k_read8_pcm_ram
452 cmp r0, #0x20
453 movge r0, r0, lsr #1
454 bge pcd_pcm_read
455 mov r0, #0
456 bx lr
457
458m_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
468
469
470@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
471
472
473PicoReadS68k16_dec0: @ 0x080000 - 0x0bffff
474 mov r3, #0x080000 @ + ^ / 2
475 b 0f
476
477PicoReadS68k16_dec1:
478 mov r3, #0x0a0000 @ + ^ / 2
4790:
480 ldr r2, =(Pico+0x22200)
481 eor r0, r0, #2
482 ldr r2, [r2]
483 mov r0, r0, lsr #1 @ +4-6 <<16
484 add r2, r2, r3 @ map to our address
485 ldrb r0, [r2, r0]
486 orr r0, r0, r0, lsl #4
487 bic r0, r0, #0xf0
488 bx lr
489
490
491PicoReadS68k16_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
496
497m_s68k_read16_regs:
498 bic r0, r0, #0xff0000
499 bic r0, r0, #0x008000
500 bic r0, r0, #0x000001
501 cmp r0, #8
502 bne s68k_reg_read16
503 mov r0, #1
504 b cdc_host_r
505
506
507@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
508
509
510.macro m_s68k_write8_2M_decode
511 ldr r2, =(Pico+0x22200)
512 eor r0, r0, #2
513 ldr r2, [r2] @ Pico.rom
514 movs r0, r0, lsr #1 @ +4-6 <<16
515 add r2, r2, r3 @ map to our address
516.endm
517
518PicoWriteS68k8_dec_m2b0: @ overwrite
519 ands r1, r1, #0x0f
520 bxeq lr
521
522PicoWriteS68k8_dec_m0b0:
523 mov r3, #0x080000
524 b 0f
525
526PicoWriteS68k8_dec_m2b1: @ overwrite
527 ands r1, r1, #0x0f
528 bxeq lr
529
530PicoWriteS68k8_dec_m0b1:
531 mov r3, #0x0a0000
5320:
533 m_s68k_write8_2M_decode
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
540 strneb r3, [r2]
541 bx lr
542
543PicoWriteS68k8_dec_m1b0: @ underwrite
544 mov r3, #0x080000
545 b 0f
546
547PicoWriteS68k8_dec_m1b1:
548 mov r3, #0x0a0000
5490:
550 ands r1, r1, #0x0f
551 bxeq lr
552 m_s68k_write8_2M_decode
553 ldrb r0, [r2, r0]!
554 movcc r1, r1, lsl #4
555 andcc r3, r0, #0x0f
556 andcs r3, r0, #0xf0
557 teq r3, r0
558 bxne lr
559 orr r3, r3, r1
560 strneb r3, [r2]
561 bx lr
562
563
564PicoWriteS68k8_pr:
565 and r2, r0, #0xfe00
566 cmp r2, #0x8000
567 bne m_s68k_write8_pcm
568
569m_s68k_write8_regs:
570 bic r0, r0, #0xff0000
571 bic r0, r0, #0x008000
572 tst r0, #0x7e00
573 movne r0, #0
574 bxne lr
575 sub r2, r0, #0x59
576 cmp r2, #0x0f
577 bhs s68k_reg_write8
578 bic r0, r0, #1
579 orr r1, r1, r1, lsl #8
580 b s68k_reg_write16
581
582
583m_s68k_write8_pcm:
584 tst r0, #0x8000
585 bxne lr
586 bic r0, r0, #0xff0000
587 cmp r0, #0x12
588 movlt r0, r0, lsr #1
589 blt pcd_pcm_write
590
591 cmp r0, #0x2000
592 bxlt lr
593
594m_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
610@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
611
612
613.macro m_s68k_write16_2M_decode
614 ldr r2, =(Pico+0x22200)
615 eor r0, r0, #2
616 ldr r2, [r2]
617 mov r0, r0, lsr #1 @ +4-6 <<16
618 add r2, r2, r3 @ map to our address
619.endm
620
621PicoWriteS68k16_dec_m0b0:
622 mov r3, #0x080000
623 b 0f
624
625PicoWriteS68k16_dec_m0b1:
626 mov r3, #0x0a0000
6270:
628 m_s68k_write16_2M_decode
629 bic r1, r1, #0xf0
630 orr r1, r1, r1, lsr #4
631 strb r1, [r2, r0]
632 bx lr
633
634PicoWriteS68k16_dec_m1b0: @ underwrite
635 mov r3, #0x080000
636 b 0f
637
638PicoWriteS68k16_dec_m1b1:
639 mov r3, #0x0a0000
6400:
641 bics r1, r1, #0xf000
642 bicnes r1, r1, #0x00f0
643 bxeq lr
644 orr r1, r1, r1, lsr #4
645 m_s68k_write16_2M_decode
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
655
656PicoWriteS68k16_dec_m2b0: @ overwrite
657 mov r3, #0x080000
658 b 0f
659
660PicoWriteS68k16_dec_m2b1:
661 mov r3, #0x0a0000
6620:
663 bics r1, r1, #0xf000
664 bicnes r1, r1, #0x00f0
665 bxeq lr
666 orr r1, r1, r1, lsr #4
667 m_s68k_write16_2M_decode
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
677
678
679PicoWriteS68k16_pr:
680 and r2, r0, #0xfe00
681 cmp r2, #0x8000
682 bne m_s68k_write8_pcm
683
684m_s68k_write16_regs:
685 bic r0, r0, #0xff0000
686 bic r0, r0, #0x008000
687 bic r0, r0, #1
688 tst r0, #0x7e00
689 movne r0, #0
690 bxne lr
691 cmp r0, #0x0e
692 bne s68k_reg_write16
693
694m_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;
700 bx lr
701
702.pool
703
704@ vim:filetype=armasm