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