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