build: some clean ups
[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#include "../pico_int_o32.h"
10
11.equiv PCM_STEP_SHIFT, 11
12
13.text
14.align 2
15
16.global PicoRead8_mcd_io
17.global PicoRead16_mcd_io
18.global PicoWrite8_mcd_io
19.global PicoWrite16_mcd_io
20
21.global PicoReadS68k8_pr
22.global PicoReadS68k16_pr
23.global PicoWriteS68k8_pr
24.global PicoWriteS68k16_pr
25
26.global PicoReadM68k8_cell0
27.global PicoReadM68k8_cell1
28.global PicoReadM68k16_cell0
29.global PicoReadM68k16_cell1
30.global PicoWriteM68k8_cell0
31.global PicoWriteM68k8_cell1
32.global PicoWriteM68k16_cell0
33.global PicoWriteM68k16_cell1
34
35.global PicoReadS68k8_dec0
36.global PicoReadS68k8_dec1
37.global PicoReadS68k16_dec0
38.global PicoReadS68k16_dec1
39.global PicoWriteS68k8_dec_m0b0
40.global PicoWriteS68k8_dec_m1b0
41.global PicoWriteS68k8_dec_m2b0
42.global PicoWriteS68k8_dec_m0b1
43.global PicoWriteS68k8_dec_m1b1
44.global PicoWriteS68k8_dec_m2b1
45.global PicoWriteS68k16_dec_m0b0
46.global PicoWriteS68k16_dec_m1b0
47.global PicoWriteS68k16_dec_m2b0
48.global PicoWriteS68k16_dec_m0b1
49.global PicoWriteS68k16_dec_m1b1
50.global PicoWriteS68k16_dec_m2b1
51
52@ externs, just for reference
53.extern Pico
54.extern cdc_host_r
55.extern m68k_reg_write8
56.extern s68k_reg_read16
57.extern s68k_reg_write8
58.extern s68k_reg_write16
59.extern s68k_poll_detect
60.extern pcd_pcm_write
61.extern pcd_pcm_read
62.extern PicoRead8_io
63.extern PicoRead16_io
64.extern PicoWrite8_io
65.extern PicoWrite16_io
66.extern m68k_comm_check
67
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
861: @ 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
922: @ 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
983: @ 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
1050: @ x32 cells
106 and r1, r0, #0xfc00 @ col
107 and r2, r0, #0x03fc @ row
108 orr r1, r2, r1, ror #14
1099:
110 and r0, r0, #3
111 orr r0, r0, r1, ror #26 @ rol 4+2
112.endm
113
114
115@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
116
117
118m_read_null:
119 mov r0, #0
120 bx lr
121
122
123PicoReadM68k8_cell0: @ 0x220000 - 0x23ffff, cell arranged
124 mov r3, #0x0c0000
125 b 0f
126
127PicoReadM68k8_cell1: @ 0x220000 - 0x23ffff, cell arranged
128 mov r3, #0x0e0000
1290:
130 cell_map
131 ldr r1, =Pico
132 add r0, r0, r3
133 ldr r1, [r1, #OFS_Pico_rom] @ Pico.mcd (used everywhere)
134 eor r0, r0, #1
135 ldrb r0, [r1, r0]
136 bx lr
137
138
139PicoRead8_mcd_io:
140 and r1, r0, #0xff00
141 cmp r1, #0x2000 @ a120xx?
142 bne PicoRead8_io
143
144 ldr r1, =Pico
145 and r0, r0, #0x3f
146 ldr r1, [r1, #OFS_Pico_rom] @ Pico.mcd
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
164m_m68k_read8_r00:
165 add r1, r1, #0x110000
166 ldr r0, [r1, #0x30]
167 and r0, r0, #0x04000000 @ we need irq2 mask state
168 mov r0, r0, lsr #19
169 bx lr
170m_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
175m_m68k_read8_r02:
176 add r1, r1, #0x110000
177 ldrb r0, [r1, #2]
178 bx lr
179m_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
187m_m68k_read8_r04:
188 add r1, r1, #0x110000
189 ldrb r0, [r1, #4]
190 bx lr
191m_m68k_read8_r06:
192 ldrb r0, [r1, #0x73] @ IRQ vector
193 bx lr
194m_m68k_read8_r07:
195 ldrb r0, [r1, #0x72]
196 bx lr
197m_m68k_read8_r08:
198 mov r0, #0
199 bl cdc_host_r
200 mov r0, r0, lsr #8
201 bx lr
202m_m68k_read8_r09:
203 mov r0, #0
204 b cdc_host_r
205m_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
211m_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
217m_m68k_read8_hi:
218 cmp r0, #0x30
219 add r1, r1, #0x110000
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
228
229
230@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
231
232
233PicoReadM68k16_cell0: @ 0x220000 - 0x23ffff, cell arranged
234 mov r3, #0x0c0000
235 b 0f
236
237PicoReadM68k16_cell1: @ 0x220000 - 0x23ffff, cell arranged
238 mov r3, #0x0e0000
2390:
240 cell_map
241 ldr r1, =Pico
242 add r0, r0, r3
243 ldr r1, [r1, #OFS_Pico_rom] @ Pico.mcd
244 bic r0, r0, #1
245 ldrh r0, [r1, r0]
246 bx lr
247
248
249PicoRead16_mcd_io:
250 and r1, r0, #0xff00
251 cmp r1, #0x2000 @ a120xx
252 bne PicoRead16_io
253
254m_m68k_read16_m68k_regs:
255 ldr r1, =Pico
256 and r0, r0, #0x3e
257 ldr r1, [r1, #OFS_Pico_rom] @ Pico.mcd
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
268m_m68k_read16_r00:
269 add r1, r1, #0x110000
270 ldr r0, [r1, #0x30]
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
276m_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]
283 and r2, r2, #0xc7
284 orr r0, r2, r0, lsl #8
285 bx lr
286m_m68k_read16_r04:
287 add r1, r1, #0x110000
288 ldrb r0, [r1, #4]
289 mov r0, r0, lsl #8
290 bx lr
291m_m68k_read16_r06:
292 ldrh r0, [r1, #0x72] @ IRQ vector
293 bx lr
294m_m68k_read16_r08:
295 mov r0, #0
296 b cdc_host_r
297m_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
303m_m68k_read16_hi:
304 cmp r0, #0x30
305 add r1, r1, #0x110000
306 movge r0, #0
307 bxge lr
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
318
319
320@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
321
322
323PicoWriteM68k8_cell0: @ 0x220000 - 0x23ffff, cell arranged
324 mov r12,#0x0c0000
325 b 0f
326
327PicoWriteM68k8_cell1: @ 0x220000 - 0x23ffff, cell arranged
328 mov r12,#0x0e0000
3290:
330 mov r3, r1
331 cell_map
332 ldr r2, =Pico
333 add r0, r0, r12
334 ldr r2, [r2, #OFS_Pico_rom] @ Pico.mcd
335 ldr r2, [r2]
336 eor r0, r0, #1
337 strb r3, [r2, r0]
338 bx lr
339
340
341PicoWrite8_mcd_io:
342 and r2, r0, #0xff00
343 cmp r2, #0x2000 @ a120xx?
344 beq m68k_reg_write8
345 b PicoWrite8_io
346
347
348@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
349
350
351PicoWriteM68k16_cell0: @ 0x220000 - 0x23ffff, cell arranged
352 mov r12, #0x0c0000
353 b 0f
354
355PicoWriteM68k16_cell1: @ 0x220000 - 0x23ffff, cell arranged
356 mov r12, #0x0e0000
3570:
358 mov r3, r1
359 cell_map
360 ldr r1, =Pico
361 add r0, r0, r12
362 ldr r1, [r1, #OFS_Pico_rom] @ Pico.mcd
363 bic r0, r0, #1
364 strh r3, [r1, r0]
365 bx lr
366
367
368PicoWrite16_mcd_io:
369 and r2, r0, #0xff00
370 cmp r2, #0x2000 @ a120xx?
371 bne PicoWrite16_io
372
373m_m68k_write16_regs:
374 and r0, r0, #0x3e
375 cmp r0, #0x0e
376 beq m_m68k_write16_regs_spec
377 and r3, r1, #0xff
378 add r2, r0, #1
379 stmfd sp!,{r2,r3,lr}
380 mov r1, r1, lsr #8
381 bl m68k_reg_write8
382 ldmfd sp!,{r0,r1,lr}
383 b m68k_reg_write8
384
385m_m68k_write16_regs_spec: @ special case
386 mov r1, r1, lsr #8
387 b m68k_reg_write8
388
389
390@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
391@ Sub 68k
392@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
393
394
395PicoReadS68k8_dec0: @ 0x080000 - 0x0bffff
396 mov r3, #0x080000 @ + ^ / 2
397 b 0f
398
399PicoReadS68k8_dec1:
400 mov r3, #0x0a0000 @ + ^ / 2
4010:
402 ldr r2, =Pico
403 eor r0, r0, #2
404 ldr r2, [r2, #OFS_Pico_rom] @ Pico.mcd
405 movs r0, r0, lsr #1 @ +4-6 <<16
406 add r2, r2, r3 @ map to our address
407 ldrb r0, [r2, r0]
408 movcc r0, r0, lsr #4
409 andcs r0, r0, #0xf
410 bx lr
411
412
413PicoReadS68k8_pr:
414 and r2, r0, #0xfe00
415 cmp r2, #0x8000
416 bne m_s68k_read8_pcm
417
418m_s68k_read8_regs:
419 bic r0, r0, #0xff0000
420 bic r0, r0, #0x008000
421 sub r2, r0, #0x0e
422 cmp r2, #(0x30-0x0e)
423 blo m_s68k_read8_comm
424 stmfd sp!,{r0,lr}
425 bic r0, r0, #1
426 bl s68k_reg_read16
427 ldmfd sp!,{r1,lr}
428 tst r1, #1
429 moveq r0, r0, lsr #8
430 and r0, r0, #0xff
431 bx lr
432
433m_s68k_read8_comm:
434 ldr r1, =Pico
435 ldr r1, [r1, #OFS_Pico_rom] @ Pico.mcd
436 add r1, r1, #0x110000
437 ldrb r1, [r1, r0]
438 bic r0, r0, #1
439 b s68k_poll_detect
440
441
442m_s68k_read8_pcm:
443 tst r0, #0x8000
444 bne m_read_null
445
446 @ must not trash r3 and r12
447 ldr r1, =Pico
448 bic r0, r0, #0xff0000
449 ldr r1, [r1, #OFS_Pico_rom] @ Pico.mcd
450 mov r2, #0x110000
451 orr r2, r2, #0x002200
452 cmp r0, #0x2000
453 bge m_s68k_read8_pcm_ram
454 cmp r0, #0x20
455 movge r0, r0, lsr #1
456 bge pcd_pcm_read
457 mov r0, #0
458 bx lr
459
460m_s68k_read8_pcm_ram:
461 orr r2, r2, #0x40
462 ldr r2, [r1, r2]
463 add r1, r1, #0x100000 @ pcm_ram
464 and r2, r2, #0x0f000000 @ bank
465 add r1, r1, r2, lsr #12
466 bic r0, r0, #0x00e000
467 mov r0, r0, lsr #1
468 ldrb r0, [r1, r0]
469 bx lr
470
471
472@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
473
474
475PicoReadS68k16_dec0: @ 0x080000 - 0x0bffff
476 mov r3, #0x080000 @ + ^ / 2
477 b 0f
478
479PicoReadS68k16_dec1:
480 mov r3, #0x0a0000 @ + ^ / 2
4810:
482 ldr r2, =Pico
483 eor r0, r0, #2
484 ldr r2, [r2, #OFS_Pico_rom] @ Pico.mcd
485 mov r0, r0, lsr #1 @ +4-6 <<16
486 add r2, r2, r3 @ map to our address
487 ldrb r0, [r2, r0]
488 orr r0, r0, r0, lsl #4
489 bic r0, r0, #0xf0
490 bx lr
491
492
493PicoReadS68k16_pr:
494 and r2, r0, #0xfe00
495 cmp r2, #0x8000
496 @ pcm is on 8-bit bus, would this be same as byte access?
497 bne m_s68k_read8_pcm
498
499m_s68k_read16_regs:
500 bic r0, r0, #0xff0000
501 bic r0, r0, #0x008000
502 bic r0, r0, #0x000001
503 cmp r0, #8
504 bne s68k_reg_read16
505 mov r0, #1
506 b cdc_host_r
507
508
509@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
510
511
512.macro m_s68k_write8_2M_decode
513 ldr r2, =Pico
514 eor r0, r0, #2
515 ldr r2, [r2, #OFS_Pico_rom] @ Pico.mcd
516 movs r0, r0, lsr #1 @ +4-6 <<16
517 add r2, r2, r3 @ map to our address
518.endm
519
520PicoWriteS68k8_dec_m2b0: @ overwrite
521 ands r1, r1, #0x0f
522 bxeq lr
523
524PicoWriteS68k8_dec_m0b0:
525 mov r3, #0x080000
526 b 0f
527
528PicoWriteS68k8_dec_m2b1: @ overwrite
529 ands r1, r1, #0x0f
530 bxeq lr
531
532PicoWriteS68k8_dec_m0b1:
533 mov r3, #0x0a0000
5340:
535 m_s68k_write8_2M_decode
536 ldrb r0, [r2, r0]!
537 and r1, r1, #0x0f
538 movcc r1, r1, lsl #4
539 andcc r3, r0, #0x0f
540 andcs r3, r0, #0xf0
541 orr r3, r3, r1
542 strneb r3, [r2]
543 bx lr
544
545PicoWriteS68k8_dec_m1b0: @ underwrite
546 mov r3, #0x080000
547 b 0f
548
549PicoWriteS68k8_dec_m1b1:
550 mov r3, #0x0a0000
5510:
552 ands r1, r1, #0x0f
553 bxeq lr
554 m_s68k_write8_2M_decode
555 ldrb r0, [r2, r0]!
556 movcc r1, r1, lsl #4
557 andcc r3, r0, #0x0f
558 andcs r3, r0, #0xf0
559 teq r3, r0
560 bxne lr
561 orr r3, r3, r1
562 strneb r3, [r2]
563 bx lr
564
565
566PicoWriteS68k8_pr:
567 and r2, r0, #0xfe00
568 cmp r2, #0x8000
569 bne m_s68k_write8_pcm
570
571m_s68k_write8_regs:
572 bic r0, r0, #0xff0000
573 bic r0, r0, #0x008000
574 tst r0, #0x7e00
575 movne r0, #0
576 bxne lr
577 sub r2, r0, #0x59
578 cmp r2, #0x0f
579 bhs s68k_reg_write8
580 bic r0, r0, #1
581 orr r1, r1, r1, lsl #8
582 b s68k_reg_write16
583
584
585m_s68k_write8_pcm:
586 tst r0, #0x8000
587 bxne lr
588 bic r0, r0, #0xff0000
589 cmp r0, #0x12
590 movlt r0, r0, lsr #1
591 blt pcd_pcm_write
592
593 cmp r0, #0x2000
594 bxlt lr
595
596m_s68k_write8_pcm_ram:
597 ldr r3, =Pico
598 bic r0, r0, #0x00e000
599 ldr r3, [r3, #OFS_Pico_rom] @ Pico.mcd
600 mov r0, r0, lsr #1
601 add r2, r3, #0x110000
602 add r2, r2, #0x002200
603 add r2, r2, #0x000040
604 ldr r2, [r2]
605 add r3, r3, #0x100000 @ pcm_ram
606 and r2, r2, #0x0f000000 @ bank
607 add r3, r3, r2, lsr #12
608 strb r1, [r3, r0]
609 bx lr
610
611
612@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
613
614
615.macro m_s68k_write16_2M_decode
616 ldr r2, =Pico
617 eor r0, r0, #2
618 ldr r2, [r2, #OFS_Pico_rom] @ Pico.mcd
619 mov r0, r0, lsr #1 @ +4-6 <<16
620 add r2, r2, r3 @ map to our address
621.endm
622
623PicoWriteS68k16_dec_m0b0:
624 mov r3, #0x080000
625 b 0f
626
627PicoWriteS68k16_dec_m0b1:
628 mov r3, #0x0a0000
6290:
630 m_s68k_write16_2M_decode
631 bic r1, r1, #0xf0
632 orr r1, r1, r1, lsr #4
633 strb r1, [r2, r0]
634 bx lr
635
636PicoWriteS68k16_dec_m1b0: @ underwrite
637 mov r3, #0x080000
638 b 0f
639
640PicoWriteS68k16_dec_m1b1:
641 mov r3, #0x0a0000
6420:
643 bics r1, r1, #0xf000
644 bicnes r1, r1, #0x00f0
645 bxeq lr
646 orr r1, r1, r1, lsr #4
647 m_s68k_write16_2M_decode
648 ldrb r0, [r2, r0]!
649 and r3, r1, #0x0f
650 and r1, r1, #0xf0
651 tst r0, #0x0f
652 orreq r0, r0, r3
653 tst r0, #0xf0
654 orreq r0, r0, r1
655 strb r0, [r2]
656 bx lr
657
658PicoWriteS68k16_dec_m2b0: @ overwrite
659 mov r3, #0x080000
660 b 0f
661
662PicoWriteS68k16_dec_m2b1:
663 mov r3, #0x0a0000
6640:
665 bics r1, r1, #0xf000
666 bicnes r1, r1, #0x00f0
667 bxeq lr
668 orr r1, r1, r1, lsr #4
669 m_s68k_write16_2M_decode
670 ldrb r0, [r2, r0]!
671 ands r3, r1, #0x0f
672 andne r0, r0, #0xf0
673 orrne r0, r0, r3
674 ands r1, r1, #0xf0
675 andne r0, r0, #0x0f
676 orrne r0, r0, r1
677 strb r0, [r2]
678 bx lr
679
680
681PicoWriteS68k16_pr:
682 and r2, r0, #0xfe00
683 cmp r2, #0x8000
684 bne m_s68k_write8_pcm
685
686m_s68k_write16_regs:
687 bic r0, r0, #0xff0000
688 bic r0, r0, #0x008000
689 bic r0, r0, #1
690 tst r0, #0x7e00
691 movne r0, #0
692 bxne lr
693 cmp r0, #0x0e
694 bne s68k_reg_write16
695
696m_s68k_write16_regs_spec: @ special case
697 ldr r2, =Pico
698 mov r0, #0x110000
699 ldr r2, [r2, #OFS_Pico_rom] @ Pico.mcd
700 add r0, r0, #0x00000f
701 strb r1, [r2, r0] @ if (a == 0xe) s68k_regs[0xf] = d;
702 bx lr
703
704.pool
705
706@ vim:filetype=armasm