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 "../arm_features.h"
10#include "../pico_int_offs.h"
11
12.equiv PCM_STEP_SHIFT, 11
13
14.text
15.align 2
16
17.global PicoRead8_mcd_io
18.global PicoRead16_mcd_io
19.global PicoWrite8_mcd_io
20.global PicoWrite16_mcd_io
21
22.global PicoReadS68k8_pr
23.global PicoReadS68k16_pr
24.global PicoWriteS68k8_pr
25.global PicoWriteS68k16_pr
26
27.global PicoReadM68k8_cell0
28.global PicoReadM68k8_cell1
29.global PicoReadM68k16_cell0
30.global PicoReadM68k16_cell1
31.global PicoWriteM68k8_cell0
32.global PicoWriteM68k8_cell1
33.global PicoWriteM68k16_cell0
34.global PicoWriteM68k16_cell1
35
36.global PicoReadS68k8_dec0
37.global PicoReadS68k8_dec1
38.global PicoReadS68k16_dec0
39.global PicoReadS68k16_dec1
40.global PicoWriteS68k8_dec_m0b0
41.global PicoWriteS68k8_dec_m1b0
42.global PicoWriteS68k8_dec_m2b0
43.global PicoWriteS68k8_dec_m0b1
44.global PicoWriteS68k8_dec_m1b1
45.global PicoWriteS68k8_dec_m2b1
46.global PicoWriteS68k16_dec_m0b0
47.global PicoWriteS68k16_dec_m1b0
48.global PicoWriteS68k16_dec_m2b0
49.global PicoWriteS68k16_dec_m0b1
50.global PicoWriteS68k16_dec_m1b1
51.global PicoWriteS68k16_dec_m2b1
52
53@ externs, just for reference
54.extern Pico
55.extern cdc_host_r
56.extern m68k_reg_write8
57.extern s68k_reg_read16
58.extern s68k_reg_write8
59.extern s68k_reg_write16
60.extern s68k_poll_detect
61.extern pcd_pcm_write
62.extern pcd_pcm_read
63.extern PicoRead8_io
64.extern PicoRead16_io
65.extern PicoWrite8_io
66.extern PicoWrite16_io
67.extern m68k_comm_check
68
69    PIC_LDR_INIT()
70
71@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
72
73@ utilities
74
75@ r0=addr[in,out], r1,r2=tmp
76.macro cell_map
77    ands    r1, r0, #0x01c000
78    PIC_XB(ne ,r1, lsr #12)
79    b       0f                          @ most common?
80    PIC_BT(0f)
81    PIC_BT(0f)
82    PIC_BT(0f)
83    PIC_BT(0f)
84    PIC_BT(1f)
85    PIC_BT(1f)
86    PIC_BT(2f)
87    PIC_BT(3f)
881: @ x16 cells
89    and     r1, r0, #0x7e00             @ col
90    and     r2, r0, #0x01fc             @ row
91    orr     r2, r2, #0x0400
92    orr     r1, r2, r1, ror #13
93    b       9f
942: @ x8 cells
95    and     r1, r0, #0x3f00             @ col
96    and     r2, r0, #0x00fc             @ row
97    orr     r2, r2, #0x0600
98    orr     r1, r2, r1, ror #12
99    b       9f
1003: @ x4 cells
101    and     r1, r0, #0x1f80             @ col
102    and     r2, r0, #0x007c             @ row
103    orr     r1, r2, r1, ror #11
104    and     r2, r0,#0x1e000
105    orr     r1, r1, r2, lsr #6
106    b       9f
1070: @ x32 cells
108    and     r1, r0, #0xfc00             @ col
109    and     r2, r0, #0x03fc             @ row
110    orr     r1, r2, r1, ror #14
1119:
112    and     r0, r0, #3
113    orr     r0, r0, r1, ror #26         @ rol 4+2
114.endm
115
116
117@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
118
119
120m_read_null:
121    mov     r0, #0
122    bx      lr
123
124
125PicoReadM68k8_cell0:                    @ 0x220000 - 0x23ffff, cell arranged
126    mov     r3, #0x0c0000
127    b       0f
128
129PicoReadM68k8_cell1:                    @ 0x220000 - 0x23ffff, cell arranged
130    mov     r3, #0x0e0000
1310:
132    cell_map
133    PIC_LDR(r1, r2, Pico)
134    add     r0, r0, r3
135    ldr     r1, [r1, #OFS_Pico_rom]   @ Pico.mcd (used everywhere)
136    eor     r0, r0, #1
137    ldrb    r0, [r1, r0]
138    bx      lr
139
140
141PicoRead8_mcd_io:
142    and     r1, r0, #0xff00
143    cmp     r1, #0x2000	              @ a120xx?
144    bne     PicoRead8_io
145
146    PIC_LDR(r1, r2, Pico)
147    and     r0, r0, #0x3f
148    ldr     r1, [r1, #OFS_Pico_rom]   @ Pico.mcd
149    cmp     r0, #0x0e
150    PIC_XB(lt ,r0, lsl #2)
151    b       m_m68k_read8_hi
152    PIC_BT(m_m68k_read8_r00)
153    PIC_BT(m_m68k_read8_r01)
154    PIC_BT(m_m68k_read8_r02)
155    PIC_BT(m_m68k_read8_r03)
156    PIC_BT(m_m68k_read8_r04)
157    PIC_BT(m_read_null)               @ unused bits
158    PIC_BT(m_m68k_read8_r06)
159    PIC_BT(m_m68k_read8_r07)
160    PIC_BT(m_m68k_read8_r08)
161    PIC_BT(m_m68k_read8_r09)
162    PIC_BT(m_read_null)               @ reserved
163    PIC_BT(m_read_null)
164    PIC_BT(m_m68k_read8_r0c)
165    PIC_BT(m_m68k_read8_r0d)
166m_m68k_read8_r00:
167    add     r1, r1, #0x110000
168    ldr     r0, [r1, #0x30]
169    and     r0, r0, #0x04000000       @ we need irq2 mask state
170    mov     r0, r0, lsr #19
171    bx      lr
172m_m68k_read8_r01:
173    add     r1, r1, #0x110000
174    add     r1, r1, #0x002200
175    ldrb    r0, [r1, #2]              @ Pico_mcd->m.busreq
176    bx      lr
177m_m68k_read8_r02:
178    add     r1, r1, #0x110000
179    ldrb    r0, [r1, #2]
180    bx      lr
181m_m68k_read8_r03:
182    add     r1, r1, #0x110000
183    stmfd   sp!, {r1, lr}
184    bl      m68k_comm_check
185    ldmfd   sp!, {r1, lr}
186    ldrb    r0, [r1, #3]
187    and     r0, r0, #0xc7
188    bx      lr
189m_m68k_read8_r04:
190    add     r1, r1, #0x110000
191    ldrb    r0, [r1, #4]
192    bx      lr
193m_m68k_read8_r06:
194    ldrb    r0, [r1, #0x73]           @ IRQ vector
195    bx      lr
196m_m68k_read8_r07:
197    ldrb    r0, [r1, #0x72]
198    bx      lr
199m_m68k_read8_r08:
200    mov     r0, #0
201    bl      cdc_host_r
202    mov     r0, r0, lsr #8
203    bx      lr
204m_m68k_read8_r09:
205    mov     r0, #0
206    b       cdc_host_r
207m_m68k_read8_r0c:
208    add     r1, r1, #0x110000
209    add     r1, r1, #0x002200
210    ldr     r0, [r1, #0x14]           @ Pico_mcd->m.timer_stopwatch
211    mov     r0, r0, lsr #24
212    bx      lr
213m_m68k_read8_r0d:
214    add     r1, r1, #0x110000
215    add     r1, r1, #0x002200
216    ldr     r0, [r1, #0x14]
217    mov     r0, r0, lsr #16
218    bx      lr
219m_m68k_read8_hi:
220    cmp     r0, #0x30
221    add     r1, r1, #0x110000
222    movge   r0, #0
223    bxge    lr
224    add     r1, r1, r0
225    stmfd   sp!, {r1, lr}
226    bl      m68k_comm_check
227    ldmfd   sp!, {r1, lr}
228    ldrb    r0, [r1]
229    bx      lr
230
231
232@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
233
234
235PicoReadM68k16_cell0:                   @ 0x220000 - 0x23ffff, cell arranged
236    mov     r3, #0x0c0000
237    b       0f
238
239PicoReadM68k16_cell1:                   @ 0x220000 - 0x23ffff, cell arranged
240    mov     r3, #0x0e0000
2410:
242    cell_map
243    PIC_LDR(r1, r2, Pico)
244    add     r0, r0, r3
245    ldr     r1, [r1, #OFS_Pico_rom]   @ Pico.mcd
246    bic     r0, r0, #1
247    ldrh    r0, [r1, r0]
248    bx      lr
249
250
251PicoRead16_mcd_io:
252    and     r1, r0, #0xff00
253    cmp     r1, #0x2000	              @ a120xx
254    bne     PicoRead16_io
255
256m_m68k_read16_m68k_regs:
257    PIC_LDR(r1, r2, Pico)
258    and     r0, r0, #0x3e
259    ldr     r1, [r1, #OFS_Pico_rom]   @ Pico.mcd
260    cmp     r0, #0x0e
261    PIC_XB(lt ,r0, lsl #1)
262    b       m_m68k_read16_hi
263    PIC_BT(m_m68k_read16_r00)
264    PIC_BT(m_m68k_read16_r02)
265    PIC_BT(m_m68k_read16_r04)
266    PIC_BT(m_m68k_read16_r06)
267    PIC_BT(m_m68k_read16_r08)
268    PIC_BT(m_read_null)               @ reserved
269    PIC_BT(m_m68k_read16_r0c)
270m_m68k_read16_r00:
271    add     r1, r1, #0x110000
272    ldr     r0, [r1, #0x30]
273    add     r1, r1, #0x002200
274    ldrb    r1, [r1, #2]              @ Pico_mcd->m.busreq
275    and     r0, r0, #0x04000000       @ we need irq2 mask state
276    orr     r0, r1, r0, lsr #11
277    bx      lr
278m_m68k_read16_r02:
279    add     r1, r1, #0x110000
280    stmfd   sp!, {r1, lr}
281    bl      m68k_comm_check
282    ldmfd   sp!, {r1, lr}
283    ldrb    r2, [r1, #3]
284    ldrb    r0, [r1, #2]
285    and     r2, r2, #0xc7
286    orr     r0, r2, r0, lsl #8
287    bx      lr
288m_m68k_read16_r04:
289    add     r1, r1, #0x110000
290    ldrb    r0, [r1, #4]
291    mov     r0, r0, lsl #8
292    bx      lr
293m_m68k_read16_r06:
294    ldrh    r0, [r1, #0x72]           @ IRQ vector
295    bx      lr
296m_m68k_read16_r08:
297    mov     r0, #0
298    b       cdc_host_r
299m_m68k_read16_r0c:
300    add     r1, r1, #0x110000
301    add     r1, r1, #0x002200
302    ldr     r0, [r1, #0x14]
303    mov     r0, r0, lsr #16
304    bx      lr
305m_m68k_read16_hi:
306    cmp     r0, #0x30
307    add     r1, r1, #0x110000
308    movge   r0, #0
309    bxge    lr
310
311    add     r1, r0, r1
312    stmfd   sp!, {r1, lr}
313    bl      m68k_comm_check
314    ldmfd   sp!, {r0, lr}
315    ldrh    r0, [r0]
316    mov     r1, r0, lsr #8
317    and     r0, r0, #0xff
318    orr     r0, r1, r0, lsl #8
319    bx      lr
320
321
322@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
323
324
325PicoWriteM68k8_cell0:                   @ 0x220000 - 0x23ffff, cell arranged
326    mov     r12,#0x0c0000
327    b       0f
328
329PicoWriteM68k8_cell1:                   @ 0x220000 - 0x23ffff, cell arranged
330    mov     r12,#0x0e0000
3310:
332    mov     r3, r1
333    cell_map
334    PIC_LDR(r2, r1, Pico)
335    add     r0, r0, r12
336    ldr     r2, [r2, #OFS_Pico_rom]     @ Pico.mcd
337    ldr     r2, [r2]
338    eor     r0, r0, #1
339    strb    r3, [r2, r0]
340    bx      lr
341
342
343PicoWrite8_mcd_io:
344    and     r2, r0, #0xff00
345    cmp     r2, #0x2000                 @ a120xx?
346    beq     m68k_reg_write8
347    b       PicoWrite8_io
348
349
350@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
351
352
353PicoWriteM68k16_cell0:                   @ 0x220000 - 0x23ffff, cell arranged
354    mov     r12, #0x0c0000
355    b       0f
356
357PicoWriteM68k16_cell1:                   @ 0x220000 - 0x23ffff, cell arranged
358    mov     r12, #0x0e0000
3590:
360    mov     r3, r1
361    cell_map
362    PIC_LDR(r1, r2, Pico)
363    add     r0, r0, r12
364    ldr     r1, [r1, #OFS_Pico_rom]     @ Pico.mcd
365    bic     r0, r0, #1
366    strh    r3, [r1, r0]
367    bx      lr
368
369
370PicoWrite16_mcd_io:
371    and     r2, r0, #0xff00
372    cmp     r2, #0x2000                 @ a120xx?
373    bne     PicoWrite16_io
374
375m_m68k_write16_regs:
376    and     r0, r0, #0x3e
377    cmp     r0, #0x0e
378    beq     m_m68k_write16_regs_spec
379    and     r3, r1, #0xff
380    add     r2, r0, #1
381    stmfd   sp!,{r2,r3,lr}
382    mov     r1, r1, lsr #8
383    bl      m68k_reg_write8
384    ldmfd   sp!,{r0,r1,lr}
385    b       m68k_reg_write8
386
387m_m68k_write16_regs_spec:               @ special case
388    mov     r1, r1, lsr #8
389    b       m68k_reg_write8
390
391
392@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
393@                                   Sub 68k
394@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
395
396
397PicoReadS68k8_dec0:                     @ 0x080000 - 0x0bffff
398    mov     r3, #0x080000               @ + ^ / 2
399    b       0f
400
401PicoReadS68k8_dec1:
402    mov     r3, #0x0a0000               @ + ^ / 2
4030:
404    PIC_LDR(r2, r1, Pico)
405    eor     r0, r0, #2
406    ldr     r2, [r2, #OFS_Pico_rom]     @ Pico.mcd
407    movs    r0, r0, lsr #1              @ +4-6 <<16
408    add     r2, r2, r3                  @ map to our address
409    ldrb    r0, [r2, r0]
410    movcc   r0, r0, lsr #4
411    andcs   r0, r0, #0xf
412    bx      lr
413
414
415PicoReadS68k8_pr:
416    and     r2, r0, #0xfe00
417    cmp     r2, #0x8000
418    bne     m_s68k_read8_pcm
419
420m_s68k_read8_regs:
421    bic     r0, r0, #0xff0000
422    bic     r0, r0, #0x008000
423    sub     r2, r0, #0x0e
424    cmp     r2, #(0x30-0x0e)
425    blo     m_s68k_read8_comm
426    stmfd   sp!,{r0,lr}
427    bic     r0, r0, #1
428    bl      s68k_reg_read16
429    ldmfd   sp!,{r1,lr}
430    tst     r1, #1
431    moveq   r0, r0, lsr #8
432    and     r0, r0, #0xff
433    bx      lr
434
435m_s68k_read8_comm:
436    PIC_LDR(r1, r2, Pico)
437    ldr     r1, [r1, #OFS_Pico_rom]     @ Pico.mcd
438    add     r1, r1, #0x110000
439    ldrb    r1, [r1, r0]
440    bic     r0, r0, #1
441    b       s68k_poll_detect
442
443
444m_s68k_read8_pcm:
445    tst     r0, #0x8000
446    bne     m_read_null
447
448    @ must not trash r3 and r12
449    PIC_LDR(r1, r2, Pico)
450    bic     r0, r0, #0xff0000
451    ldr     r1, [r1, #OFS_Pico_rom]     @ Pico.mcd
452    mov     r2, #0x110000
453    orr     r2, r2, #0x002200
454    cmp     r0, #0x2000
455    bge     m_s68k_read8_pcm_ram
456    cmp     r0, #0x20
457    movge   r0, r0, lsr #1
458    bge     pcd_pcm_read
459    mov     r0, #0
460    bx      lr
461
462m_s68k_read8_pcm_ram:
463    orr     r2, r2, #0x40
464    ldr     r2, [r1, r2]
465    add     r1, r1, #0x100000           @ pcm_ram
466    and     r2, r2, #0x0f000000         @ bank
467    add     r1, r1, r2, lsr #12
468    bic     r0, r0, #0x00e000
469    mov     r0, r0, lsr #1
470    ldrb    r0, [r1, r0]
471    bx      lr
472
473
474@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
475
476
477PicoReadS68k16_dec0:                    @ 0x080000 - 0x0bffff
478    mov     r3, #0x080000               @ + ^ / 2
479    b       0f
480
481PicoReadS68k16_dec1:
482    mov     r3, #0x0a0000               @ + ^ / 2
4830:
484    PIC_LDR(r2, r1, Pico)
485    eor     r0, r0, #2
486    ldr     r2, [r2, #OFS_Pico_rom]     @ Pico.mcd
487    mov     r0, r0, lsr #1              @ +4-6 <<16
488    add     r2, r2, r3                  @ map to our address
489    ldrb    r0, [r2, r0]
490    orr     r0, r0, r0, lsl #4
491    bic     r0, r0, #0xf0
492    bx      lr
493
494
495PicoReadS68k16_pr:
496    and     r2, r0, #0xfe00
497    cmp     r2, #0x8000
498    @ pcm is on 8-bit bus, would this be same as byte access?
499    bne     m_s68k_read8_pcm
500
501m_s68k_read16_regs:
502    bic     r0, r0, #0xff0000
503    bic     r0, r0, #0x008000
504    bic     r0, r0, #0x000001
505    cmp     r0, #8
506    bne     s68k_reg_read16
507    mov     r0, #1
508    b       cdc_host_r
509
510@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
511
512
513.macro m_s68k_write8_2M_decode
514    PIC_LDR(r2, ip, Pico)
515    eor     r0, r0, #2
516    ldr     r2, [r2, #OFS_Pico_rom]     @ Pico.mcd
517    movs    r0, r0, lsr #1              @ +4-6 <<16
518    add     r2, r2, r3                  @ map to our address
519.endm
520
521PicoWriteS68k8_dec_m2b0:                @ overwrite
522    ands    r1, r1, #0x0f
523    bxeq    lr
524
525PicoWriteS68k8_dec_m0b0:
526    mov     r3, #0x080000
527    b       0f
528
529PicoWriteS68k8_dec_m2b1:                @ overwrite
530    ands    r1, r1, #0x0f
531    bxeq    lr
532
533PicoWriteS68k8_dec_m0b1:
534    mov     r3, #0x0a0000
5350:
536    m_s68k_write8_2M_decode
537    ldrb    r0, [r2, r0]!
538    and     r1, r1, #0x0f
539    movcc   r1, r1, lsl #4
540    andcc   r3, r0, #0x0f
541    andcs   r3, r0, #0xf0
542    orr     r3, r3, r1
543    strneb  r3, [r2]
544    bx      lr
545
546PicoWriteS68k8_dec_m1b0:                @ underwrite
547    mov     r3, #0x080000
548    b       0f
549
550PicoWriteS68k8_dec_m1b1:
551    mov     r3, #0x0a0000
5520:
553    ands    r1, r1, #0x0f
554    bxeq    lr
555    m_s68k_write8_2M_decode
556    ldrb    r0, [r2, r0]!
557    movcc   r1, r1, lsl #4
558    andcc   r3, r0, #0x0f
559    andcs   r3, r0, #0xf0
560    teq     r3, r0
561    bxne    lr
562    orr     r3, r3, r1
563    strneb  r3, [r2]
564    bx      lr
565
566
567PicoWriteS68k8_pr:
568    and     r2, r0, #0xfe00
569    cmp     r2, #0x8000
570    bne     m_s68k_write8_pcm
571
572m_s68k_write8_regs:
573    bic     r0, r0, #0xff0000
574    bic     r0, r0, #0x008000
575    tst     r0, #0x7e00
576    movne   r0, #0
577    bxne    lr
578    sub     r2, r0, #0x59
579    cmp     r2, #0x0f
580    bhs     s68k_reg_write8
581    bic     r0, r0, #1
582    orr     r1, r1, r1, lsl #8
583    b       s68k_reg_write16
584
585
586m_s68k_write8_pcm:
587    tst     r0, #0x8000
588    bxne    lr
589    bic     r0, r0, #0xff0000
590    cmp     r0, #0x12
591    movlt   r0, r0, lsr #1
592    blt     pcd_pcm_write
593
594    cmp     r0, #0x2000
595    bxlt    lr
596
597m_s68k_write8_pcm_ram:
598    PIC_LDR(r3, r2, Pico)
599    bic     r0, r0, #0x00e000
600    ldr     r3, [r3, #OFS_Pico_rom]     @ Pico.mcd
601    mov     r0, r0, lsr #1
602    add     r2, r3, #0x110000
603    add     r2, r2, #0x002200
604    add     r2, r2, #0x000040
605    ldr     r2, [r2]
606    add     r3, r3, #0x100000           @ pcm_ram
607    and     r2, r2, #0x0f000000         @ bank
608    add     r3, r3, r2, lsr #12
609    strb    r1, [r3, r0]
610    bx      lr
611
612@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
613
614
615.macro m_s68k_write16_2M_decode
616    PIC_LDR(r2, ip, 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    PIC_LDR(r2, r0, 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.global s68k_read8
705.global s68k_read16
706.global s68k_read32
707.global s68k_write8
708.global s68k_write16
709.global s68k_write32
710
711s68k_read8:
712    PIC_LDR(r3, r2, s68k_read8_map)
713    bic     r0, r0, #0xff000000
714    mov     r2, r0, lsr #16
715    ldr     r3, [r3, r2, lsl #2]
716    eor     r2, r0, #1
717    movs    r3, r3, lsl #1
718    ldrccb  r0, [r3, r2]
719    bxcc    lr
720    bx      r3
721
722s68k_read16:
723    PIC_LDR(r3, r2, s68k_read16_map)
724    bic     r0, r0, #0xff000000
725    mov     r2, r0, lsr #16
726    ldr     r3, [r3, r2, lsl #2]
727    bic     r0, r0, #1
728    movs    r3, r3, lsl #1
729    ldrcch  r0, [r3, r0]
730    bxcc    lr
731    bx      r3
732
733s68k_read32:
734    PIC_LDR(r3, r2, s68k_read16_map)
735    bic     r0, r0, #0xff000000
736    mov     r2, r0, lsr #16
737    ldr     r3, [r3, r2, lsl #2]
738    bic     r0, r0, #1
739    movs    r3, r3, lsl #1
740    ldrcch  r1, [r3, r0]!
741    ldrcch  r0, [r3, #2]
742    orrcc   r0, r0, r1, lsl #16
743    bxcc    lr
744
745    stmfd   sp!, {r0, r3, r4, lr}
746    mov     lr, pc
747    bx      r3
748    ldmfd   sp!, {r1, r3}
749    str     r0, [sp]
750    add     r0, r1, #2
751    mov     lr, pc
752    bx      r3
753    ldmfd   sp!, {r1, lr}
754    mov     r0, r0, lsl #16
755    mov     r1, r1, lsl #16
756    orr     r0, r1, r0, lsr #16
757    bx      lr
758
759s68k_write8:
760    PIC_LDR(r3, r2, s68k_write8_map)
761    bic     r0, r0, #0xff000000
762    mov     r2, r0, lsr #16
763    ldr     r3, [r3, r2, lsl #2]
764    eor     r2, r0, #1
765    movs    r3, r3, lsl #1
766    strccb  r1, [r3, r2]
767    bxcc    lr
768    bx      r3
769
770s68k_write16:
771    PIC_LDR(r3, r2, s68k_write16_map)
772    bic     r0, r0, #0xff000000
773    mov     r2, r0, lsr #16
774    ldr     r3, [r3, r2, lsl #2]
775    bic     r0, r0, #1
776    movs    r3, r3, lsl #1
777    strcch  r1, [r3, r0]
778    bxcc    lr
779    bx      r3
780
781s68k_write32:
782    PIC_LDR(r3, r2, s68k_write16_map)
783    bic     r0, r0, #0xff000000
784    mov     r2, r0, lsr #16
785    ldr     r3, [r3, r2, lsl #2]
786    bic     r0, r0, #1
787    movs    r3, r3, lsl #1
788    movcc   r2, r1, lsr #16
789    strcch  r2, [r3, r0]!
790    strcch  r1, [r3, #2]
791    bxcc    lr
792
793    stmfd   sp!, {r0, r1, r3, lr}
794    mov     r1, r1, lsr #16
795    mov     lr, pc
796    bx      r3
797    ldmfd   sp!, {r0, r1, r3, lr}
798    add     r0, r0, #2
799    bx      r3
800
801.pool
802
803@ vim:filetype=armasm
804