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