23f0b94c05e815070fae6ae6baabd3573ff77b2f
[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 #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 PicoCpuCS68k
63 .extern PicoRead8_io
64 .extern PicoRead16_io
65 .extern PicoWrite8_io
66 .extern PicoWrite16_io
67 .extern m68k_comm_check
68
69
70 @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
71
72 @ utilities
73
74 @ r0=addr[in,out], r1,r2=tmp
75 .macro cell_map
76     ands    r1, r0, #0x01c000
77     ldrne   pc, [pc, r1, lsr #12]
78     beq     0f                          @ most common?
79     .long   0f
80     .long   0f
81     .long   0f
82     .long   0f
83     .long   1f
84     .long   1f
85     .long   2f
86     .long   3f
87 1: @ x16 cells
88     and     r1, r0, #0x7e00             @ col
89     and     r2, r0, #0x01fc             @ row
90     orr     r2, r2, #0x0400
91     orr     r1, r2, r1, ror #13
92     b       9f
93 2: @ x8 cells
94     and     r1, r0, #0x3f00             @ col
95     and     r2, r0, #0x00fc             @ row
96     orr     r2, r2, #0x0600
97     orr     r1, r2, r1, ror #12
98     b       9f
99 3: @ x4 cells
100     and     r1, r0, #0x1f80             @ col
101     and     r2, r0, #0x007c             @ row
102     orr     r1, r2, r1, ror #11
103     and     r2, r0,#0x1e000
104     orr     r1, r1, r2, lsr #6
105     b       9f
106 0: @ x32 cells
107     and     r1, r0, #0xfc00             @ col
108     and     r2, r0, #0x03fc             @ row
109     orr     r1, r2, r1, ror #14
110 9:
111     and     r0, r0, #3
112     orr     r0, r0, r1, ror #26         @ rol 4+2
113 .endm
114
115
116 @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
117
118
119 m_read_null:
120     mov     r0, #0
121     bx      lr
122
123
124 PicoReadM68k8_cell0:                    @ 0x220000 - 0x23ffff, cell arranged
125     mov     r3, #0x0c0000
126     b       0f
127
128 PicoReadM68k8_cell1:                    @ 0x220000 - 0x23ffff, cell arranged
129     mov     r3, #0x0e0000
130 0:
131     cell_map
132     ldr     r1, =Pico
133     add     r0, r0, r3
134     ldr     r1, [r1, #OFS_Pico_rom]   @ Pico.mcd (used everywhere)
135     eor     r0, r0, #1
136     ldrb    r0, [r1, r0]
137     bx      lr
138
139
140 PicoRead8_mcd_io:
141     and     r1, r0, #0xff00
142     cmp     r1, #0x2000               @ a120xx?
143     bne     PicoRead8_io
144
145     ldr     r1, =Pico
146     and     r0, r0, #0x3f
147     ldr     r1, [r1, #OFS_Pico_rom]   @ Pico.mcd
148     cmp     r0, #0x0e
149     ldrlt   pc, [pc, r0, lsl #2]
150     b       m_m68k_read8_hi
151     .long   m_m68k_read8_r00
152     .long   m_m68k_read8_r01
153     .long   m_m68k_read8_r02
154     .long   m_m68k_read8_r03
155     .long   m_m68k_read8_r04
156     .long   m_read_null               @ unused bits
157     .long   m_m68k_read8_r06
158     .long   m_m68k_read8_r07
159     .long   m_m68k_read8_r08
160     .long   m_m68k_read8_r09
161     .long   m_read_null               @ reserved
162     .long   m_read_null
163     .long   m_m68k_read8_r0c
164     .long   m_m68k_read8_r0d
165 m_m68k_read8_r00:
166     add     r1, r1, #0x110000
167     ldr     r0, [r1, #0x30]
168     and     r0, r0, #0x04000000       @ we need irq2 mask state
169     mov     r0, r0, lsr #19
170     bx      lr
171 m_m68k_read8_r01:
172     add     r1, r1, #0x110000
173     add     r1, r1, #0x002200
174     ldrb    r0, [r1, #2]              @ Pico_mcd->m.busreq
175     bx      lr
176 m_m68k_read8_r02:
177     add     r1, r1, #0x110000
178     ldrb    r0, [r1, #2]
179     bx      lr
180 m_m68k_read8_r03:
181     add     r1, r1, #0x110000
182     push    {r1, lr}
183     bl      m68k_comm_check
184     pop     {r1, lr}
185     ldrb    r0, [r1, #3]
186     and     r0, r0, #0xc7
187     bx      lr
188 m_m68k_read8_r04:
189     add     r1, r1, #0x110000
190     ldrb    r0, [r1, #4]
191     bx      lr
192 m_m68k_read8_r06:
193     ldrb    r0, [r1, #0x73]           @ IRQ vector
194     bx      lr
195 m_m68k_read8_r07:
196     ldrb    r0, [r1, #0x72]
197     bx      lr
198 m_m68k_read8_r08:
199     mov     r0, #0
200     bl      cdc_host_r
201     mov     r0, r0, lsr #8
202     bx      lr
203 m_m68k_read8_r09:
204     mov     r0, #0
205     b       cdc_host_r
206 m_m68k_read8_r0c:
207     add     r1, r1, #0x110000
208     add     r1, r1, #0x002200
209     ldr     r0, [r1, #0x14]           @ Pico_mcd->m.timer_stopwatch
210     mov     r0, r0, lsr #24
211     bx      lr
212 m_m68k_read8_r0d:
213     add     r1, r1, #0x110000
214     add     r1, r1, #0x002200
215     ldr     r0, [r1, #0x14]
216     mov     r0, r0, lsr #16
217     bx      lr
218 m_m68k_read8_hi:
219     cmp     r0, #0x30
220     add     r1, r1, #0x110000
221     movge   r0, #0
222     bxge    lr
223     add     r1, r0
224     push    {r1, lr}
225     bl      m68k_comm_check
226     pop     {r1, lr}
227     ldrb    r0, [r1]
228     bx      lr
229
230
231 @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
232
233
234 PicoReadM68k16_cell0:                   @ 0x220000 - 0x23ffff, cell arranged
235     mov     r3, #0x0c0000
236     b       0f
237
238 PicoReadM68k16_cell1:                   @ 0x220000 - 0x23ffff, cell arranged
239     mov     r3, #0x0e0000
240 0:
241     cell_map
242     ldr     r1, =Pico
243     add     r0, r0, r3
244     ldr     r1, [r1, #OFS_Pico_rom]   @ Pico.mcd
245     bic     r0, r0, #1
246     ldrh    r0, [r1, r0]
247     bx      lr
248
249
250 PicoRead16_mcd_io:
251     and     r1, r0, #0xff00
252     cmp     r1, #0x2000               @ a120xx
253     bne     PicoRead16_io
254
255 m_m68k_read16_m68k_regs:
256     ldr     r1, =Pico
257     and     r0, r0, #0x3e
258     ldr     r1, [r1, #OFS_Pico_rom]   @ Pico.mcd
259     cmp     r0, #0x0e
260     ldrlt   pc, [pc, r0, lsl #1]
261     b       m_m68k_read16_hi
262     .long   m_m68k_read16_r00
263     .long   m_m68k_read16_r02
264     .long   m_m68k_read16_r04
265     .long   m_m68k_read16_r06
266     .long   m_m68k_read16_r08
267     .long   m_read_null               @ reserved
268     .long   m_m68k_read16_r0c
269 m_m68k_read16_r00:
270     add     r1, r1, #0x110000
271     ldr     r0, [r1, #0x30]
272     add     r1, r1, #0x002200
273     ldrb    r1, [r1, #2]              @ Pico_mcd->m.busreq
274     and     r0, r0, #0x04000000       @ we need irq2 mask state
275     orr     r0, r1, r0, lsr #11
276     bx      lr
277 m_m68k_read16_r02:
278     add     r1, r1, #0x110000
279     push    {r1, lr}
280     bl      m68k_comm_check
281     pop     {r1, lr}
282     ldrb    r2, [r1, #3]
283     ldrb    r0, [r1, #2]
284     and     r2, r2, #0xc7
285     orr     r0, r2, r0, lsl #8
286     bx      lr
287 m_m68k_read16_r04:
288     add     r1, r1, #0x110000
289     ldrb    r0, [r1, #4]
290     mov     r0, r0, lsl #8
291     bx      lr
292 m_m68k_read16_r06:
293     ldrh    r0, [r1, #0x72]           @ IRQ vector
294     bx      lr
295 m_m68k_read16_r08:
296     mov     r0, #0
297     b       cdc_host_r
298 m_m68k_read16_r0c:
299     add     r1, r1, #0x110000
300     add     r1, r1, #0x002200
301     ldr     r0, [r1, #0x14]
302     mov     r0, r0, lsr #16
303     bx      lr
304 m_m68k_read16_hi:
305     cmp     r0, #0x30
306     add     r1, r1, #0x110000
307     movge   r0, #0
308     bxge    lr
309
310     add     r1, r0, r1
311     push    {r1, lr}
312     bl      m68k_comm_check
313     pop     {r0, lr}
314     ldrh    r0, [r0]
315     mov     r1, r0, lsr #8
316     and     r0, r0, #0xff
317     orr     r0, r1, r0, lsl #8
318     bx      lr
319
320
321 @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
322
323
324 PicoWriteM68k8_cell0:                   @ 0x220000 - 0x23ffff, cell arranged
325     mov     r12,#0x0c0000
326     b       0f
327
328 PicoWriteM68k8_cell1:                   @ 0x220000 - 0x23ffff, cell arranged
329     mov     r12,#0x0e0000
330 0:
331     mov     r3, r1
332     cell_map
333     ldr     r2, =Pico
334     add     r0, r0, r12
335     ldr     r2, [r2, #OFS_Pico_rom]     @ Pico.mcd
336     ldr     r2, [r2]
337     eor     r0, r0, #1
338     strb    r3, [r2, r0]
339     bx      lr
340
341
342 PicoWrite8_mcd_io:
343     and     r2, r0, #0xff00
344     cmp     r2, #0x2000                 @ a120xx?
345     beq     m68k_reg_write8
346     b       PicoWrite8_io
347
348
349 @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
350
351
352 PicoWriteM68k16_cell0:                   @ 0x220000 - 0x23ffff, cell arranged
353     mov     r12, #0x0c0000
354     b       0f
355
356 PicoWriteM68k16_cell1:                   @ 0x220000 - 0x23ffff, cell arranged
357     mov     r12, #0x0e0000
358 0:
359     mov     r3, r1
360     cell_map
361     ldr     r1, =Pico
362     add     r0, r0, r12
363     ldr     r1, [r1, #OFS_Pico_rom]     @ Pico.mcd
364     bic     r0, r0, #1
365     strh    r3, [r1, r0]
366     bx      lr
367
368
369 PicoWrite16_mcd_io:
370     and     r2, r0, #0xff00
371     cmp     r2, #0x2000                 @ a120xx?
372     bne     PicoWrite16_io
373
374 m_m68k_write16_regs:
375     and     r0, r0, #0x3e
376     cmp     r0, #0x0e
377     beq     m_m68k_write16_regs_spec
378     and     r3, r1, #0xff
379     add     r2, r0, #1
380     stmfd   sp!,{r2,r3,lr}
381     mov     r1, r1, lsr #8
382     bl      m68k_reg_write8
383     ldmfd   sp!,{r0,r1,lr}
384     b       m68k_reg_write8
385
386 m_m68k_write16_regs_spec:               @ special case
387     mov     r1, r1, lsr #8
388     b       m68k_reg_write8
389
390
391 @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
392 @                                   Sub 68k
393 @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
394
395
396 PicoReadS68k8_dec0:                     @ 0x080000 - 0x0bffff
397     mov     r3, #0x080000               @ + ^ / 2
398     b       0f
399
400 PicoReadS68k8_dec1:
401     mov     r3, #0x0a0000               @ + ^ / 2
402 0:
403     ldr     r2, =Pico
404     eor     r0, r0, #2
405     ldr     r2, [r2, #OFS_Pico_rom]     @ Pico.mcd
406     movs    r0, r0, lsr #1              @ +4-6 <<16
407     add     r2, r2, r3                  @ map to our address
408     ldrb    r0, [r2, r0]
409     movcc   r0, r0, lsr #4
410     andcs   r0, r0, #0xf
411     bx      lr
412
413
414 PicoReadS68k8_pr:
415     and     r2, r0, #0xfe00
416     cmp     r2, #0x8000
417     bne     m_s68k_read8_pcm
418
419 m_s68k_read8_regs:
420     bic     r0, r0, #0xff0000
421     bic     r0, r0, #0x008000
422     sub     r2, r0, #0x0e
423     cmp     r2, #(0x30-0x0e)
424     blo     m_s68k_read8_comm
425     stmfd   sp!,{r0,lr}
426     bic     r0, r0, #1
427     bl      s68k_reg_read16
428     ldmfd   sp!,{r1,lr}
429     tst     r1, #1
430     moveq   r0, r0, lsr #8
431     and     r0, r0, #0xff
432     bx      lr
433
434 m_s68k_read8_comm:
435     ldr     r1, =Pico
436     ldr     r1, [r1, #OFS_Pico_rom]     @ Pico.mcd
437     add     r1, r1, #0x110000
438     ldrb    r1, [r1, r0]
439     bic     r0, r0, #1
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
449     bic     r0, r0, #0xff0000
450     ldr     r1, [r1, #OFS_Pico_rom]     @ Pico.mcd
451     mov     r2, #0x110000
452     orr     r2, r2, #0x002200
453     cmp     r0, #0x2000
454     bge     m_s68k_read8_pcm_ram
455     cmp     r0, #0x20
456     movge   r0, r0, lsr #1
457     bge     pcd_pcm_read
458     mov     r0, #0
459     bx      lr
460
461 m_s68k_read8_pcm_ram:
462     orr     r2, r2, #0x40
463     ldr     r2, [r1, r2]
464     add     r1, r1, #0x100000           @ pcm_ram
465     and     r2, r2, #0x0f000000         @ bank
466     add     r1, r1, r2, lsr #12
467     bic     r0, r0, #0x00e000
468     mov     r0, r0, lsr #1
469     ldrb    r0, [r1, r0]
470     bx      lr
471
472
473 @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
474
475
476 PicoReadS68k16_dec0:                    @ 0x080000 - 0x0bffff
477     mov     r3, #0x080000               @ + ^ / 2
478     b       0f
479
480 PicoReadS68k16_dec1:
481     mov     r3, #0x0a0000               @ + ^ / 2
482 0:
483     ldr     r2, =Pico
484     eor     r0, r0, #2
485     ldr     r2, [r2, #OFS_Pico_rom]     @ Pico.mcd
486     mov     r0, r0, lsr #1              @ +4-6 <<16
487     add     r2, r2, r3                  @ map to our address
488     ldrb    r0, [r2, r0]
489     orr     r0, r0, r0, lsl #4
490     bic     r0, r0, #0xf0
491     bx      lr
492
493
494 PicoReadS68k16_pr:
495     and     r2, r0, #0xfe00
496     cmp     r2, #0x8000
497     @ pcm is on 8-bit bus, would this be same as byte access?
498     bne     m_s68k_read8_pcm
499
500 m_s68k_read16_regs:
501     bic     r0, r0, #0xff0000
502     bic     r0, r0, #0x008000
503     bic     r0, r0, #0x000001
504     cmp     r0, #8
505     bne     s68k_reg_read16
506     mov     r0, #1
507     b       cdc_host_r
508
509
510 @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
511
512
513 .macro m_s68k_write8_2M_decode
514     ldr     r2, =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
521 PicoWriteS68k8_dec_m2b0:                @ overwrite
522     ands    r1, r1, #0x0f
523     bxeq    lr
524
525 PicoWriteS68k8_dec_m0b0:
526     mov     r3, #0x080000
527     b       0f
528
529 PicoWriteS68k8_dec_m2b1:                @ overwrite
530     ands    r1, r1, #0x0f
531     bxeq    lr
532
533 PicoWriteS68k8_dec_m0b1:
534     mov     r3, #0x0a0000
535 0:
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
546 PicoWriteS68k8_dec_m1b0:                @ underwrite
547     mov     r3, #0x080000
548     b       0f
549
550 PicoWriteS68k8_dec_m1b1:
551     mov     r3, #0x0a0000
552 0:
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
567 PicoWriteS68k8_pr:
568     and     r2, r0, #0xfe00
569     cmp     r2, #0x8000
570     bne     m_s68k_write8_pcm
571
572 m_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
586 m_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
597 m_s68k_write8_pcm_ram:
598     ldr     r3, =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
616 .macro m_s68k_write16_2M_decode
617     ldr     r2, =Pico
618     eor     r0, r0, #2
619     ldr     r2, [r2, #OFS_Pico_rom]     @ Pico.mcd
620     mov     r0, r0, lsr #1              @ +4-6 <<16
621     add     r2, r2, r3                  @ map to our address
622 .endm
623
624 PicoWriteS68k16_dec_m0b0:
625     mov     r3, #0x080000
626     b       0f
627
628 PicoWriteS68k16_dec_m0b1:
629     mov     r3, #0x0a0000
630 0:
631     m_s68k_write16_2M_decode
632     bic     r1, r1, #0xf0
633     orr     r1, r1, r1, lsr #4
634     strb    r1, [r2, r0]
635     bx      lr
636
637 PicoWriteS68k16_dec_m1b0:               @ underwrite
638     mov     r3, #0x080000
639     b       0f
640
641 PicoWriteS68k16_dec_m1b1:
642     mov     r3, #0x0a0000
643 0:
644     bics    r1, r1, #0xf000
645     bicnes  r1, r1, #0x00f0
646     bxeq    lr
647     orr     r1, r1, r1, lsr #4
648     m_s68k_write16_2M_decode
649     ldrb    r0, [r2, r0]!
650     and     r3, r1, #0x0f
651     and     r1, r1, #0xf0
652     tst     r0, #0x0f
653     orreq   r0, r0, r3
654     tst     r0, #0xf0
655     orreq   r0, r0, r1
656     strb    r0, [r2]
657     bx      lr
658
659 PicoWriteS68k16_dec_m2b0:               @ overwrite
660     mov     r3, #0x080000
661     b       0f
662
663 PicoWriteS68k16_dec_m2b1:
664     mov     r3, #0x0a0000
665 0:
666     bics    r1, r1, #0xf000
667     bicnes  r1, r1, #0x00f0
668     bxeq    lr
669     orr     r1, r1, r1, lsr #4
670     m_s68k_write16_2M_decode
671     ldrb    r0, [r2, r0]!
672     ands    r3, r1, #0x0f
673     andne   r0, r0, #0xf0
674     orrne   r0, r0, r3
675     ands    r1, r1, #0xf0
676     andne   r0, r0, #0x0f
677     orrne   r0, r0, r1
678     strb    r0, [r2]
679     bx      lr
680
681
682 PicoWriteS68k16_pr:
683     and     r2, r0, #0xfe00
684     cmp     r2, #0x8000
685     bne     m_s68k_write8_pcm
686
687 m_s68k_write16_regs:
688     bic     r0, r0, #0xff0000
689     bic     r0, r0, #0x008000
690     bic     r0, r0, #1
691     tst     r0, #0x7e00
692     movne   r0, #0
693     bxne    lr
694     cmp     r0, #0x0e
695     bne     s68k_reg_write16
696
697 m_s68k_write16_regs_spec:               @ special case
698     ldr     r2, =Pico
699     mov     r0, #0x110000
700     ldr     r2, [r2, #OFS_Pico_rom]     @ Pico.mcd
701     add     r0, r0, #0x00000f
702     strb    r1, [r2, r0]                @ if (a == 0xe) s68k_regs[0xf] = d;
703     bx      lr
704
705 .pool
706
707 @ vim:filetype=armasm