cd: rewrite pcm
[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 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 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 pcd_pcm_write
60 .extern pcd_pcm_read
61 .extern PicoCpuCS68k
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
86 1: @ 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
92 2: @ 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
98 3: @ 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
105 0: @ x32 cells
106     and     r1, r0, #0xfc00             @ col
107     and     r2, r0, #0x03fc             @ row
108     orr     r1, r2, r1, ror #14
109 9:
110     and     r0, r0, #3
111     orr     r0, r0, r1, ror #26         @ rol 4+2
112 .endm
113
114
115 @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
116
117
118 m_read_null:
119     mov     r0, #0
120     bx      lr
121
122
123 PicoReadM68k8_cell0:                    @ 0x220000 - 0x23ffff, cell arranged
124     mov     r3, #0x0c0000
125     b       0f
126
127 PicoReadM68k8_cell1:                    @ 0x220000 - 0x23ffff, cell arranged
128     mov     r3, #0x0e0000
129 0:
130     cell_map
131     ldr     r1, =(Pico+0x22200)
132     add     r0, r0, r3
133     ldr     r1, [r1]
134     eor     r0, r0, #1
135     ldrb    r0, [r1, r0]
136     bx      lr
137
138
139 PicoRead8_mcd_io:
140     and     r1, r0, #0xff00
141     cmp     r1, #0x2000               @ a120xx?
142     bne     PicoRead8_io
143
144     ldr     r1, =(Pico+0x22200)
145     and     r0, r0, #0x3f
146     ldr     r1, [r1]                  @ Pico.mcd (used everywhere)
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
164 m_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
170 m_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
175 m_m68k_read8_r02:
176     add     r1, r1, #0x110000
177     ldrb    r0, [r1, #2]
178     bx      lr
179 m_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
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     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
233 PicoReadM68k16_cell0:                   @ 0x220000 - 0x23ffff, cell arranged
234     mov     r3, #0x0c0000
235     b       0f
236
237 PicoReadM68k16_cell1:                   @ 0x220000 - 0x23ffff, cell arranged
238     mov     r3, #0x0e0000
239 0:
240     cell_map
241     ldr     r1, =(Pico+0x22200)
242     add     r0, r0, r3
243     ldr     r1, [r1]
244     bic     r0, r0, #1
245     ldrh    r0, [r1, r0]
246     bx      lr
247
248
249 PicoRead16_mcd_io:
250     and     r1, r0, #0xff00
251     cmp     r1, #0x2000               @ a120xx
252     bne     PicoRead16_io
253
254 m_m68k_read16_m68k_regs:
255     ldr     r1, =(Pico+0x22200)
256     and     r0, r0, #0x3e
257     ldr     r1, [r1]                  @ Pico.mcd (used everywhere)
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
268 m_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
276 m_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
286 m_m68k_read16_r04:
287     add     r1, r1, #0x110000
288     ldrb    r0, [r1, #4]
289     mov     r0, r0, lsl #8
290     bx      lr
291 m_m68k_read16_r06:
292     ldrh    r0, [r1, #0x72]           @ IRQ vector
293     bx      lr
294 m_m68k_read16_r08:
295     mov     r0, #0
296     b       Read_CDC_Host
297 m_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
303 m_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
323 PicoWriteM68k8_cell0:                   @ 0x220000 - 0x23ffff, cell arranged
324     mov     r12,#0x0c0000
325     b       0f
326
327 PicoWriteM68k8_cell1:                   @ 0x220000 - 0x23ffff, cell arranged
328     mov     r12,#0x0e0000
329 0:
330     mov     r3, r1
331     cell_map
332     ldr     r2, =(Pico+0x22200)
333     add     r0, r0, r12
334     ldr     r2, [r2]
335     eor     r0, r0, #1
336     strb    r3, [r2, r0]
337     bx      lr
338
339
340 PicoWrite8_mcd_io:
341     and     r2, r0, #0xff00
342     cmp     r2, #0x2000                 @ a120xx?
343     beq     m68k_reg_write8
344     b       PicoWrite8_io
345
346
347 @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
348
349
350 PicoWriteM68k16_cell0:                   @ 0x220000 - 0x23ffff, cell arranged
351     mov     r12, #0x0c0000
352     b       0f
353
354 PicoWriteM68k16_cell1:                   @ 0x220000 - 0x23ffff, cell arranged
355     mov     r12, #0x0e0000
356 0:
357     mov     r3, r1
358     cell_map
359     ldr     r1, =(Pico+0x22200)
360     add     r0, r0, r12
361     ldr     r1, [r1]
362     bic     r0, r0, #1
363     strh    r3, [r1, r0]
364     bx      lr
365
366
367 PicoWrite16_mcd_io:
368     and     r2, r0, #0xff00
369     cmp     r2, #0x2000                 @ a120xx?
370     bne     PicoWrite16_io
371
372 m_m68k_write16_regs:
373     and     r0, r0, #0x3e
374     cmp     r0, #0x0e
375     beq     m_m68k_write16_regs_spec
376     and     r3, r1, #0xff
377     add     r2, r0, #1
378     stmfd   sp!,{r2,r3,lr}
379     mov     r1, r1, lsr #8
380     bl      m68k_reg_write8
381     ldmfd   sp!,{r0,r1,lr}
382     b       m68k_reg_write8
383
384 m_m68k_write16_regs_spec:               @ special case
385     mov     r1, r1, lsr #8
386     b       m68k_reg_write8
387
388
389 @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
390 @                                   Sub 68k
391 @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
392
393
394 PicoReadS68k8_dec0:                     @ 0x080000 - 0x0bffff
395     mov     r3, #0x080000               @ + ^ / 2
396     b       0f
397
398 PicoReadS68k8_dec1:
399     mov     r3, #0x0a0000               @ + ^ / 2
400 0:
401     ldr     r2, =(Pico+0x22200)
402     eor     r0, r0, #2
403     ldr     r2, [r2]
404     movs    r0, r0, lsr #1              @ +4-6 <<16
405     add     r2, r2, r3                  @ map to our address
406     ldrb    r0, [r2, r0]
407     movcc   r0, r0, lsr #4
408     andcs   r0, r0, #0xf
409     bx      lr
410
411
412 PicoReadS68k8_pr:
413     and     r2, r0, #0xfe00
414     cmp     r2, #0x8000
415     bne     m_s68k_read8_pcm
416
417 m_s68k_read8_regs:
418     bic     r0, r0, #0xff0000
419     bic     r0, r0, #0x008000
420     sub     r2, r0, #0x0e
421     cmp     r2, #(0x30-0x0e)
422     blo     m_s68k_read8_comm
423     sub     r2, r0, #0x58
424     cmp     r2, #0x10
425     ldrlo   r2, =gfx_cd_read
426     ldrhs   r2, =s68k_reg_read16
427     stmfd   sp!,{r0,lr}
428     bic     r0, r0, #1
429     mov     lr, pc
430     bx      r2
431     ldmfd   sp!,{r1,lr}
432     tst     r1, #1
433     moveq   r0, r0, lsr #8
434     and     r0, r0, #0xff
435     bx      lr
436
437 m_s68k_read8_comm:
438     ldr     r1, =(Pico+0x22200)
439     ldr     r1, [r1]
440     add     r1, r1, #0x110000
441     ldrb    r1, [r1, r0]
442     b       s68k_poll_detect
443
444
445 m_s68k_read8_pcm:
446     tst     r0, #0x8000
447     bne     m_read_null
448
449     @ must not trash r3 and r12
450     ldr     r1, =(Pico+0x22200)
451     bic     r0, r0, #0xff0000
452     ldr     r1, [r1]
453     mov     r2, #0x110000
454     orr     r2, r2, #0x002200
455     cmp     r0, #0x2000
456     bge     m_s68k_read8_pcm_ram
457     cmp     r0, #0x20
458     movge   r0, r0, lsr #1
459     bge     pcd_pcm_read
460     mov     r0, #0
461     bx      lr
462
463 m_s68k_read8_pcm_ram:
464     orr     r2, r2, #0x40
465     ldr     r2, [r1, r2]
466     add     r1, r1, #0x100000           @ pcm_ram
467     and     r2, r2, #0x0f000000         @ bank
468     add     r1, r1, r2, lsr #12
469     bic     r0, r0, #0x00e000
470     mov     r0, r0, lsr #1
471     ldrb    r0, [r1, r0]
472     bx      lr
473
474
475 @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
476
477
478 PicoReadS68k16_dec0:                    @ 0x080000 - 0x0bffff
479     mov     r3, #0x080000               @ + ^ / 2
480     b       0f
481
482 PicoReadS68k16_dec1:
483     mov     r3, #0x0a0000               @ + ^ / 2
484 0:
485     ldr     r2, =(Pico+0x22200)
486     eor     r0, r0, #2
487     ldr     r2, [r2]
488     mov     r0, r0, lsr #1              @ +4-6 <<16
489     add     r2, r2, r3                  @ map to our address
490     ldrb    r0, [r2, r0]
491     orr     r0, r0, r0, lsl #4
492     bic     r0, r0, #0xf0
493     bx      lr
494
495
496 PicoReadS68k16_pr:
497     and     r2, r0, #0xfe00
498     cmp     r2, #0x8000
499     @ pcm is on 8-bit bus, would this be same as byte access?
500     bne     m_s68k_read8_pcm
501
502 m_s68k_read16_regs:
503     bic     r0, r0, #0xff0000
504     bic     r0, r0, #0x008000
505     bic     r0, r0, #0x000001
506     sub     r2, r0, #0x58
507     cmp     r2, #0x10
508     blo     gfx_cd_read
509     cmp     r0, #8
510     bne     s68k_reg_read16
511     mov     r0, #1
512     b       Read_CDC_Host
513
514
515 @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
516
517
518 .macro m_s68k_write8_2M_decode
519     ldr     r2, =(Pico+0x22200)
520     eor     r0, r0, #2
521     ldr     r2, [r2]                    @ Pico.rom
522     movs    r0, r0, lsr #1              @ +4-6 <<16
523     add     r2, r2, r3                  @ map to our address
524 .endm
525
526 PicoWriteS68k8_dec_m2b0:                @ overwrite
527     ands    r1, r1, #0x0f
528     bxeq    lr
529
530 PicoWriteS68k8_dec_m0b0:
531     mov     r3, #0x080000
532     b       0f
533
534 PicoWriteS68k8_dec_m2b1:                @ overwrite
535     ands    r1, r1, #0x0f
536     bxeq    lr
537
538 PicoWriteS68k8_dec_m0b1:
539     mov     r3, #0x0a0000
540 0:
541     m_s68k_write8_2M_decode
542     ldrb    r0, [r2, r0]!
543     and     r1, r1, #0x0f
544     movcc   r1, r1, lsl #4
545     andcc   r3, r0, #0x0f
546     andcs   r3, r0, #0xf0
547     orr     r3, r3, r1
548     strneb  r3, [r2]
549     bx      lr
550
551 PicoWriteS68k8_dec_m1b0:                @ underwrite
552     mov     r3, #0x080000
553     b       0f
554
555 PicoWriteS68k8_dec_m1b1:
556     mov     r3, #0x0a0000
557 0:
558     ands    r1, r1, #0x0f
559     bxeq    lr
560     m_s68k_write8_2M_decode
561     ldrb    r0, [r2, r0]!
562     movcc   r1, r1, lsl #4
563     andcc   r3, r0, #0x0f
564     andcs   r3, r0, #0xf0
565     teq     r3, r0
566     bxne    lr
567     orr     r3, r3, r1
568     strneb  r3, [r2]
569     bx      lr
570
571
572 PicoWriteS68k8_pr:
573     and     r2, r0, #0xfe00
574     cmp     r2, #0x8000
575     bne     m_s68k_write8_pcm
576
577 m_s68k_write8_regs:
578     bic     r0, r0, #0xff0000
579     bic     r0, r0, #0x008000
580     tst     r0, #0x7e00
581     movne   r0, #0
582     bxne    lr
583     sub     r2, r0, #0x58
584     cmp     r2, #0x10
585     bhs     s68k_reg_write8
586     bic     r0, r0, #1
587     orr     r1, r1, r1, lsl #8
588     b       gfx_cd_write16
589
590
591 m_s68k_write8_pcm:
592     tst     r0, #0x8000
593     bxne    lr
594     bic     r0, r0, #0xff0000
595     cmp     r0, #0x12
596     movlt   r0, r0, lsr #1
597     blt     pcd_pcm_write
598
599     cmp     r0, #0x2000
600     bxlt    lr
601
602 m_s68k_write8_pcm_ram:
603     ldr     r3, =(Pico+0x22200)
604     bic     r0, r0, #0x00e000
605     ldr     r3, [r3]
606     mov     r0, r0, lsr #1
607     add     r2, r3, #0x110000
608     add     r2, r2, #0x002200
609     add     r2, r2, #0x000040
610     ldr     r2, [r2]
611     add     r3, r3, #0x100000           @ pcm_ram
612     and     r2, r2, #0x0f000000         @ bank
613     add     r3, r3, r2, lsr #12
614     strb    r1, [r3, r0]
615     bx      lr
616
617
618 @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
619
620
621 .macro m_s68k_write16_2M_decode
622     ldr     r2, =(Pico+0x22200)
623     eor     r0, r0, #2
624     ldr     r2, [r2]
625     mov     r0, r0, lsr #1              @ +4-6 <<16
626     add     r2, r2, r3                  @ map to our address
627 .endm
628
629 PicoWriteS68k16_dec_m0b0:
630     mov     r3, #0x080000
631     b       0f
632
633 PicoWriteS68k16_dec_m0b1:
634     mov     r3, #0x0a0000
635 0:
636     m_s68k_write16_2M_decode
637     bic     r1, r1, #0xf0
638     orr     r1, r1, r1, lsr #4
639     strb    r1, [r2, r0]
640     bx      lr
641
642 PicoWriteS68k16_dec_m1b0:               @ underwrite
643     mov     r3, #0x080000
644     b       0f
645
646 PicoWriteS68k16_dec_m1b1:
647     mov     r3, #0x0a0000
648 0:
649     bics    r1, r1, #0xf000
650     bicnes  r1, r1, #0x00f0
651     bxeq    lr
652     orr     r1, r1, r1, lsr #4
653     m_s68k_write16_2M_decode
654     ldrb    r0, [r2, r0]!
655     and     r3, r1, #0x0f
656     and     r1, r1, #0xf0
657     tst     r0, #0x0f
658     orreq   r0, r0, r3
659     tst     r0, #0xf0
660     orreq   r0, r0, r1
661     strb    r0, [r2]
662     bx      lr
663
664 PicoWriteS68k16_dec_m2b0:               @ overwrite
665     mov     r3, #0x080000
666     b       0f
667
668 PicoWriteS68k16_dec_m2b1:
669     mov     r3, #0x0a0000
670 0:
671     bics    r1, r1, #0xf000
672     bicnes  r1, r1, #0x00f0
673     bxeq    lr
674     orr     r1, r1, r1, lsr #4
675     m_s68k_write16_2M_decode
676     ldrb    r0, [r2, r0]!
677     ands    r3, r1, #0x0f
678     andne   r0, r0, #0xf0
679     orrne   r0, r0, r3
680     ands    r1, r1, #0xf0
681     andne   r0, r0, #0x0f
682     orrne   r0, r0, r1
683     strb    r0, [r2]
684     bx      lr
685
686
687 PicoWriteS68k16_pr:
688     and     r2, r0, #0xfe00
689     cmp     r2, #0x8000
690     bne     m_s68k_write8_pcm
691
692 m_s68k_write16_regs:
693     bic     r0, r0, #0xff0000
694     bic     r0, r0, #0x008000
695     bic     r0, r0, #1
696     tst     r0, #0x7e00
697     movne   r0, #0
698     bxne    lr
699     cmp     r0, #0x0e
700     beq     m_s68k_write16_regs_spec
701     sub     r2, r0, #0x58
702     cmp     r2, #0x10
703     blo     gfx_cd_write16
704     and     r3, r1, #0xff
705     add     r2, r0, #1
706     stmfd   sp!,{r2,r3,lr}
707     mov     r1, r1, lsr #8
708     bl      s68k_reg_write8
709     ldmfd   sp!,{r0,r1,lr}
710     b       s68k_reg_write8
711
712 m_s68k_write16_regs_spec:               @ special case
713     ldr     r2, =(Pico+0x22200)
714     mov     r0, #0x110000
715     ldr     r2, [r2]
716     add     r0, r0, #0x00000f
717     strb    r1, [r2, r0]                @ if (a == 0xe) s68k_regs[0xf] = d;
718     bx      lr
719
720 .pool
721
722 @ vim:filetype=armasm