cd: fix breakage in comm detection
[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:
178     add     r1, r1, #0x110000
179     push    {r1, lr}
180     bl      m68k_comm_check
181     pop     {r1, lr}
182     ldrb    r0, [r1, #3]
183     and     r0, r0, #0xc7
184     bx      lr
185 m_m68k_read8_r04:
186     add     r1, r1, #0x110000
187     ldrb    r0, [r1, #4]
188     bx      lr
189 m_m68k_read8_r06:
190     ldrb    r0, [r1, #0x73]           @ IRQ vector
191     bx      lr
192 m_m68k_read8_r07:
193     ldrb    r0, [r1, #0x72]
194     bx      lr
195 m_m68k_read8_r08:
196     mov     r0, #0
197     bl      Read_CDC_Host             @ TODO: make it local
198     mov     r0, r0, lsr #8
199     bx      lr
200 m_m68k_read8_r09:
201     mov     r0, #0
202     b       Read_CDC_Host
203 m_m68k_read8_r0c:
204     add     r1, r1, #0x110000
205     add     r1, r1, #0x002200
206     ldr     r0, [r1, #0x14]           @ Pico_mcd->m.timer_stopwatch
207     mov     r0, r0, lsr #24
208     bx      lr
209 m_m68k_read8_r0d:
210     add     r1, r1, #0x110000
211     add     r1, r1, #0x002200
212     ldr     r0, [r1, #0x14]
213     mov     r0, r0, lsr #16
214     bx      lr
215 m_m68k_read8_hi:
216     cmp     r0, #0x30
217     add     r1, r1, #0x110000
218     movge   r0, #0
219     bxge    lr
220     add     r1, r0
221     push    {r1, lr}
222     bl      m68k_comm_check
223     pop     {r1, lr}
224     ldrb    r0, [r1]
225     bx      lr
226
227
228 @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
229
230
231 PicoReadM68k16_cell0:                   @ 0x220000 - 0x23ffff, cell arranged
232     mov     r3, #0x0c0000
233     b       0f
234
235 PicoReadM68k16_cell1:                   @ 0x220000 - 0x23ffff, cell arranged
236     mov     r3, #0x0e0000
237 0:
238     cell_map
239     ldr     r1, =(Pico+0x22200)
240     add     r0, r0, r3
241     ldr     r1, [r1]
242     bic     r0, r0, #1
243     ldrh    r0, [r1, r0]
244     bx      lr
245
246
247 PicoReadM68k16_io:
248     and     r1, r0, #0xff00
249     cmp     r1, #0x2000               @ a120xx
250     bne     PicoRead16_io
251
252 m_m68k_read16_m68k_regs:
253     ldr     r1, =(Pico+0x22200)
254     and     r0, r0, #0x3e
255     ldr     r1, [r1]                  @ Pico.mcd (used everywhere)
256     cmp     r0, #0x0e
257     ldrlt   pc, [pc, r0, lsl #1]
258     b       m_m68k_read16_hi
259     .long   m_m68k_read16_r00
260     .long   m_m68k_read16_r02
261     .long   m_m68k_read16_r04
262     .long   m_m68k_read16_r06
263     .long   m_m68k_read16_r08
264     .long   m_read_null               @ reserved
265     .long   m_m68k_read16_r0c
266 m_m68k_read16_r00:
267     add     r1, r1, #0x110000
268     ldr     r0, [r1, #0x30]
269     add     r1, r1, #0x002200
270     ldrb    r1, [r1, #2]              @ Pico_mcd->m.busreq
271     and     r0, r0, #0x04000000       @ we need irq2 mask state
272     orr     r0, r1, r0, lsr #11
273     bx      lr
274 m_m68k_read16_r02:
275     add     r1, r1, #0x110000
276     push    {r1, lr}
277     bl      m68k_comm_check
278     pop     {r1, lr}
279     ldrb    r2, [r1, #3]
280     ldrb    r0, [r1, #2]
281     and     r2, r2, #0xc7
282     orr     r0, r2, r0, lsl #8
283     bx      lr
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     add     r1, r1, #0x110000
304     movge   r0, #0
305     bxge    lr
306
307     add     r1, r0, r1
308     push    {r1, lr}
309     bl      m68k_comm_check
310     pop     {r0, lr}
311     ldrh    r0, [r0]
312     mov     r1, r0, lsr #8
313     and     r0, r0, #0xff
314     orr     r0, r1, r0, lsl #8
315     bx      lr
316
317
318 @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
319
320
321 PicoWriteM68k8_cell0:                   @ 0x220000 - 0x23ffff, cell arranged
322     mov     r12,#0x0c0000
323     b       0f
324
325 PicoWriteM68k8_cell1:                   @ 0x220000 - 0x23ffff, cell arranged
326     mov     r12,#0x0e0000
327 0:
328     mov     r3, r1
329     cell_map
330     ldr     r2, =(Pico+0x22200)
331     add     r0, r0, r12
332     ldr     r2, [r2]
333     eor     r0, r0, #1
334     strb    r3, [r2, r0]
335     bx      lr
336
337
338 PicoWriteM68k8_io:
339     and     r2, r0, #0xff00
340     cmp     r2, #0x2000                 @ a120xx?
341     beq     m68k_reg_write8
342     b       PicoWrite8_io
343
344
345 @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
346
347
348 PicoWriteM68k16_cell0:                   @ 0x220000 - 0x23ffff, cell arranged
349     mov     r12, #0x0c0000
350     b       0f
351
352 PicoWriteM68k16_cell1:                   @ 0x220000 - 0x23ffff, cell arranged
353     mov     r12, #0x0e0000
354 0:
355     mov     r3, r1
356     cell_map
357     ldr     r1, =(Pico+0x22200)
358     add     r0, r0, r12
359     ldr     r1, [r1]
360     bic     r0, r0, #1
361     strh    r3, [r1, r0]
362     bx      lr
363
364
365 PicoWriteM68k16_io:
366     and     r2, r0, #0xff00
367     cmp     r2, #0x2000                 @ a120xx?
368     bne     PicoWrite16_io
369
370 m_m68k_write16_regs:
371     and     r0, r0, #0x3e
372     cmp     r0, #0x0e
373     beq     m_m68k_write16_regs_spec
374     and     r3, r1, #0xff
375     add     r2, r0, #1
376     stmfd   sp!,{r2,r3,lr}
377     mov     r1, r1, lsr #8
378     bl      m68k_reg_write8
379     ldmfd   sp!,{r0,r1,lr}
380     b       m68k_reg_write8
381
382 m_m68k_write16_regs_spec:               @ special case
383     mov     r1, r1, lsr #8
384     b       m68k_reg_write8
385
386
387 @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
388 @                                   Sub 68k
389 @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
390
391
392 PicoReadS68k8_dec0:                     @ 0x080000 - 0x0bffff
393     mov     r3, #0x080000               @ + ^ / 2
394     b       0f
395
396 PicoReadS68k8_dec1:
397     mov     r3, #0x0a0000               @ + ^ / 2
398 0:
399     ldr     r2, =(Pico+0x22200)
400     eor     r0, r0, #2
401     ldr     r2, [r2]
402     movs    r0, r0, lsr #1              @ +4-6 <<16
403     add     r2, r2, r3                  @ map to our address
404     ldrb    r0, [r2, r0]
405     movcc   r0, r0, lsr #4
406     andcs   r0, r0, #0xf
407     bx      lr
408
409
410 PicoReadS68k8_pr:
411     and     r2, r0, #0xfe00
412     cmp     r2, #0x8000
413     bne     m_s68k_read8_pcm
414
415 m_s68k_read8_regs:
416     bic     r0, r0, #0xff0000
417     bic     r0, r0, #0x008000
418     sub     r2, r0, #0x0e
419     cmp     r2, #(0x30-0x0e)
420     blo     m_s68k_read8_comm
421     sub     r2, r0, #0x58
422     cmp     r2, #0x10
423     ldrlo   r2, =gfx_cd_read
424     ldrhs   r2, =s68k_reg_read16
425     stmfd   sp!,{r0,lr}
426     bic     r0, r0, #1
427     mov     lr, pc
428     bx      r2
429     ldmfd   sp!,{r1,lr}
430     tst     r1, #1
431     moveq   r0, r0, lsr #8
432     and     r0, r0, #0xff
433     bx      lr
434
435 m_s68k_read8_comm:
436     ldr     r1, =(Pico+0x22200)
437     ldr     r1, [r1]
438     add     r1, r1, #0x110000
439     ldrb    r1, [r1, r0]
440     b       s68k_poll_detect
441
442
443 m_s68k_read8_pcm:
444     tst     r0, #0x8000
445     bne     m_read_null
446
447     @ must not trash r3 and r12
448     ldr     r1, =(Pico+0x22200)
449     bic     r0, r0, #0xff0000
450 @    bic     r0, r0, #0x008000
451     ldr     r1, [r1]
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     movlt   r0, #0
458     bxlt    lr
459     orr     r2, r2, #(0x48+8)           @ pcm.ch + addr_offset
460     add     r1, r1, r2
461     and     r2, r0, #0x1c
462     ldr     r1, [r1, r2, lsl #2]
463     tst     r0, #2
464     moveq   r0, r1, lsr #PCM_STEP_SHIFT
465     movne   r0, r1, lsr #(PCM_STEP_SHIFT+8)
466     and     r0, r0, #0xff
467     bx      lr
468
469 m_s68k_read8_pcm_ram:
470     orr     r2, r2, #0x40
471     ldr     r2, [r1, r2]
472     add     r1, r1, #0x100000           @ pcm_ram
473     and     r2, r2, #0x0f000000         @ bank
474     add     r1, r1, r2, lsr #12
475     bic     r0, r0, #0x00e000
476     mov     r0, r0, lsr #1
477     ldrb    r0, [r1, r0]
478     bx      lr
479
480
481 @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
482
483
484 PicoReadS68k16_dec0:                    @ 0x080000 - 0x0bffff
485     mov     r3, #0x080000               @ + ^ / 2
486     b       0f
487
488 PicoReadS68k16_dec1:
489     mov     r3, #0x0a0000               @ + ^ / 2
490 0:
491     ldr     r2, =(Pico+0x22200)
492     eor     r0, r0, #2
493     ldr     r2, [r2]
494     mov     r0, r0, lsr #1              @ +4-6 <<16
495     add     r2, r2, r3                  @ map to our address
496     ldrb    r0, [r2, r0]
497     orr     r0, r0, r0, lsl #4
498     bic     r0, r0, #0xf0
499     bx      lr
500
501
502 PicoReadS68k16_pr:
503     and     r2, r0, #0xfe00
504     cmp     r2, #0x8000
505     @ pcm is on 8-bit bus, would this be same as byte access?
506     bne     m_s68k_read8_pcm
507
508 m_s68k_read16_regs:
509     bic     r0, r0, #0xff0000
510     bic     r0, r0, #0x008000
511     bic     r0, r0, #0x000001
512     sub     r2, r0, #0x58
513     cmp     r2, #0x10
514     blo     gfx_cd_read
515     cmp     r0, #8
516     bne     s68k_reg_read16
517     mov     r0, #1
518     b       Read_CDC_Host
519
520
521 @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
522
523
524 .macro m_s68k_write8_2M_decode
525     ldr     r2, =(Pico+0x22200)
526     eor     r0, r0, #2
527     ldr     r2, [r2]                    @ Pico.rom
528     movs    r0, r0, lsr #1              @ +4-6 <<16
529     add     r2, r2, r3                  @ map to our address
530 .endm
531
532 PicoWriteS68k8_dec_m2b0:                @ overwrite
533     ands    r1, r1, #0x0f
534     bxeq    lr
535
536 PicoWriteS68k8_dec_m0b0:
537     mov     r3, #0x080000
538     b       0f
539
540 PicoWriteS68k8_dec_m2b1:                @ overwrite
541     ands    r1, r1, #0x0f
542     bxeq    lr
543
544 PicoWriteS68k8_dec_m0b1:
545     mov     r3, #0x0a0000
546 0:
547     m_s68k_write8_2M_decode
548     ldrb    r0, [r2, r0]!
549     and     r1, r1, #0x0f
550     movcc   r1, r1, lsl #4
551     andcc   r3, r0, #0x0f
552     andcs   r3, r0, #0xf0
553     orr     r3, r3, r1
554     strneb  r3, [r2]
555     bx      lr
556
557 PicoWriteS68k8_dec_m1b0:                @ underwrite
558     mov     r3, #0x080000
559     b       0f
560
561 PicoWriteS68k8_dec_m1b1:
562     mov     r3, #0x0a0000
563 0:
564     ands    r1, r1, #0x0f
565     bxeq    lr
566     m_s68k_write8_2M_decode
567     ldrb    r0, [r2, r0]!
568     movcc   r1, r1, lsl #4
569     andcc   r3, r0, #0x0f
570     andcs   r3, r0, #0xf0
571     teq     r3, r0
572     bxne    lr
573     orr     r3, r3, r1
574     strneb  r3, [r2]
575     bx      lr
576
577
578 PicoWriteS68k8_pr:
579     and     r2, r0, #0xfe00
580     cmp     r2, #0x8000
581     bne     m_s68k_write8_pcm
582
583 m_s68k_write8_regs:
584     bic     r0, r0, #0xff0000
585     bic     r0, r0, #0x008000
586     tst     r0, #0x7e00
587     movne   r0, #0
588     bxne    lr
589     sub     r2, r0, #0x58
590     cmp     r2, #0x10
591     bhs     s68k_reg_write8
592     bic     r0, r0, #1
593     orr     r1, r1, r1, lsl #8
594     b       gfx_cd_write16
595
596
597 m_s68k_write8_pcm:
598     tst     r0, #0x8000
599     bxne    lr
600     bic     r0, r0, #0xff0000
601     cmp     r0, #0x12
602     movlt   r0, r0, lsr #1
603     blt     pcm_write
604
605     cmp     r0, #0x2000
606     bxlt    lr
607
608 m_s68k_write8_pcm_ram:
609     ldr     r3, =(Pico+0x22200)
610     bic     r0, r0, #0x00e000
611     ldr     r3, [r3]
612     mov     r0, r0, lsr #1
613     add     r2, r3, #0x110000
614     add     r2, r2, #0x002200
615     add     r2, r2, #0x000040
616     ldr     r2, [r2]
617     add     r3, r3, #0x100000           @ pcm_ram
618     and     r2, r2, #0x0f000000         @ bank
619     add     r3, r3, r2, lsr #12
620     strb    r1, [r3, r0]
621     bx      lr
622
623
624 @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
625
626
627 .macro m_s68k_write16_2M_decode
628     ldr     r2, =(Pico+0x22200)
629     eor     r0, r0, #2
630     ldr     r2, [r2]
631     mov     r0, r0, lsr #1              @ +4-6 <<16
632     add     r2, r2, r3                  @ map to our address
633 .endm
634
635 PicoWriteS68k16_dec_m0b0:
636     mov     r3, #0x080000
637     b       0f
638
639 PicoWriteS68k16_dec_m0b1:
640     mov     r3, #0x0a0000
641 0:
642     m_s68k_write16_2M_decode
643     bic     r1, r1, #0xf0
644     orr     r1, r1, r1, lsr #4
645     strb    r1, [r2, r0]
646     bx      lr
647
648 PicoWriteS68k16_dec_m1b0:               @ underwrite
649     mov     r3, #0x080000
650     b       0f
651
652 PicoWriteS68k16_dec_m1b1:
653     mov     r3, #0x0a0000
654 0:
655     bics    r1, r1, #0xf000
656     bicnes  r1, r1, #0x00f0
657     bxeq    lr
658     orr     r1, r1, r1, lsr #4
659     m_s68k_write16_2M_decode
660     ldrb    r0, [r2, r0]!
661     and     r3, r1, #0x0f
662     and     r1, r1, #0xf0
663     tst     r0, #0x0f
664     orreq   r0, r0, r3
665     tst     r0, #0xf0
666     orreq   r0, r0, r1
667     strb    r0, [r2]
668     bx      lr
669
670 PicoWriteS68k16_dec_m2b0:               @ overwrite
671     mov     r3, #0x080000
672     b       0f
673
674 PicoWriteS68k16_dec_m2b1:
675     mov     r3, #0x0a0000
676 0:
677     bics    r1, r1, #0xf000
678     bicnes  r1, r1, #0x00f0
679     bxeq    lr
680     orr     r1, r1, r1, lsr #4
681     m_s68k_write16_2M_decode
682     ldrb    r0, [r2, r0]!
683     ands    r3, r1, #0x0f
684     andne   r0, r0, #0xf0
685     orrne   r0, r0, r3
686     ands    r1, r1, #0xf0
687     andne   r0, r0, #0x0f
688     orrne   r0, r0, r1
689     strb    r0, [r2]
690     bx      lr
691
692
693 PicoWriteS68k16_pr:
694     and     r2, r0, #0xfe00
695     cmp     r2, #0x8000
696     bne     m_s68k_write8_pcm
697
698 m_s68k_write16_regs:
699     bic     r0, r0, #0xff0000
700     bic     r0, r0, #0x008000
701     bic     r0, r0, #1
702     tst     r0, #0x7e00
703     movne   r0, #0
704     bxne    lr
705     cmp     r0, #0x0e
706     beq     m_s68k_write16_regs_spec
707     sub     r2, r0, #0x58
708     cmp     r2, #0x10
709     blo     gfx_cd_write16
710     and     r3, r1, #0xff
711     add     r2, r0, #1
712     stmfd   sp!,{r2,r3,lr}
713     mov     r1, r1, lsr #8
714     bl      s68k_reg_write8
715     ldmfd   sp!,{r0,r1,lr}
716     b       s68k_reg_write8
717
718 m_s68k_write16_regs_spec:               @ special case
719     ldr     r2, =(Pico+0x22200)
720     mov     r0, #0x110000
721     ldr     r2, [r2]
722     add     r0, r0, #0x00000f
723     strb    r1, [r2, r0]                @ if (a == 0xe) s68k_regs[0xf] = d;
724     bx      lr
725
726 .pool
727
728 @ vim:filetype=armasm