drop legacy save support
[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 cdc_host_r
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      cdc_host_r
199     mov     r0, r0, lsr #8
200     bx      lr
201 m_m68k_read8_r09:
202     mov     r0, #0
203     b       cdc_host_r
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       cdc_host_r
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     bic     r0, r0, #1
437     b       s68k_poll_detect
438
439
440 m_s68k_read8_pcm:
441     tst     r0, #0x8000
442     bne     m_read_null
443
444     @ must not trash r3 and r12
445     ldr     r1, =(Pico+0x22200)
446     bic     r0, r0, #0xff0000
447     ldr     r1, [r1]
448     mov     r2, #0x110000
449     orr     r2, r2, #0x002200
450     cmp     r0, #0x2000
451     bge     m_s68k_read8_pcm_ram
452     cmp     r0, #0x20
453     movge   r0, r0, lsr #1
454     bge     pcd_pcm_read
455     mov     r0, #0
456     bx      lr
457
458 m_s68k_read8_pcm_ram:
459     orr     r2, r2, #0x40
460     ldr     r2, [r1, r2]
461     add     r1, r1, #0x100000           @ pcm_ram
462     and     r2, r2, #0x0f000000         @ bank
463     add     r1, r1, r2, lsr #12
464     bic     r0, r0, #0x00e000
465     mov     r0, r0, lsr #1
466     ldrb    r0, [r1, r0]
467     bx      lr
468
469
470 @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
471
472
473 PicoReadS68k16_dec0:                    @ 0x080000 - 0x0bffff
474     mov     r3, #0x080000               @ + ^ / 2
475     b       0f
476
477 PicoReadS68k16_dec1:
478     mov     r3, #0x0a0000               @ + ^ / 2
479 0:
480     ldr     r2, =(Pico+0x22200)
481     eor     r0, r0, #2
482     ldr     r2, [r2]
483     mov     r0, r0, lsr #1              @ +4-6 <<16
484     add     r2, r2, r3                  @ map to our address
485     ldrb    r0, [r2, r0]
486     orr     r0, r0, r0, lsl #4
487     bic     r0, r0, #0xf0
488     bx      lr
489
490
491 PicoReadS68k16_pr:
492     and     r2, r0, #0xfe00
493     cmp     r2, #0x8000
494     @ pcm is on 8-bit bus, would this be same as byte access?
495     bne     m_s68k_read8_pcm
496
497 m_s68k_read16_regs:
498     bic     r0, r0, #0xff0000
499     bic     r0, r0, #0x008000
500     bic     r0, r0, #0x000001
501     cmp     r0, #8
502     bne     s68k_reg_read16
503     mov     r0, #1
504     b       cdc_host_r
505
506
507 @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
508
509
510 .macro m_s68k_write8_2M_decode
511     ldr     r2, =(Pico+0x22200)
512     eor     r0, r0, #2
513     ldr     r2, [r2]                    @ Pico.rom
514     movs    r0, r0, lsr #1              @ +4-6 <<16
515     add     r2, r2, r3                  @ map to our address
516 .endm
517
518 PicoWriteS68k8_dec_m2b0:                @ overwrite
519     ands    r1, r1, #0x0f
520     bxeq    lr
521
522 PicoWriteS68k8_dec_m0b0:
523     mov     r3, #0x080000
524     b       0f
525
526 PicoWriteS68k8_dec_m2b1:                @ overwrite
527     ands    r1, r1, #0x0f
528     bxeq    lr
529
530 PicoWriteS68k8_dec_m0b1:
531     mov     r3, #0x0a0000
532 0:
533     m_s68k_write8_2M_decode
534     ldrb    r0, [r2, r0]!
535     and     r1, r1, #0x0f
536     movcc   r1, r1, lsl #4
537     andcc   r3, r0, #0x0f
538     andcs   r3, r0, #0xf0
539     orr     r3, r3, r1
540     strneb  r3, [r2]
541     bx      lr
542
543 PicoWriteS68k8_dec_m1b0:                @ underwrite
544     mov     r3, #0x080000
545     b       0f
546
547 PicoWriteS68k8_dec_m1b1:
548     mov     r3, #0x0a0000
549 0:
550     ands    r1, r1, #0x0f
551     bxeq    lr
552     m_s68k_write8_2M_decode
553     ldrb    r0, [r2, r0]!
554     movcc   r1, r1, lsl #4
555     andcc   r3, r0, #0x0f
556     andcs   r3, r0, #0xf0
557     teq     r3, r0
558     bxne    lr
559     orr     r3, r3, r1
560     strneb  r3, [r2]
561     bx      lr
562
563
564 PicoWriteS68k8_pr:
565     and     r2, r0, #0xfe00
566     cmp     r2, #0x8000
567     bne     m_s68k_write8_pcm
568
569 m_s68k_write8_regs:
570     bic     r0, r0, #0xff0000
571     bic     r0, r0, #0x008000
572     tst     r0, #0x7e00
573     movne   r0, #0
574     bxne    lr
575     sub     r2, r0, #0x59
576     cmp     r2, #0x0f
577     bhs     s68k_reg_write8
578     bic     r0, r0, #1
579     orr     r1, r1, r1, lsl #8
580     b       s68k_reg_write16
581
582
583 m_s68k_write8_pcm:
584     tst     r0, #0x8000
585     bxne    lr
586     bic     r0, r0, #0xff0000
587     cmp     r0, #0x12
588     movlt   r0, r0, lsr #1
589     blt     pcd_pcm_write
590
591     cmp     r0, #0x2000
592     bxlt    lr
593
594 m_s68k_write8_pcm_ram:
595     ldr     r3, =(Pico+0x22200)
596     bic     r0, r0, #0x00e000
597     ldr     r3, [r3]
598     mov     r0, r0, lsr #1
599     add     r2, r3, #0x110000
600     add     r2, r2, #0x002200
601     add     r2, r2, #0x000040
602     ldr     r2, [r2]
603     add     r3, r3, #0x100000           @ pcm_ram
604     and     r2, r2, #0x0f000000         @ bank
605     add     r3, r3, r2, lsr #12
606     strb    r1, [r3, r0]
607     bx      lr
608
609
610 @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
611
612
613 .macro m_s68k_write16_2M_decode
614     ldr     r2, =(Pico+0x22200)
615     eor     r0, r0, #2
616     ldr     r2, [r2]
617     mov     r0, r0, lsr #1              @ +4-6 <<16
618     add     r2, r2, r3                  @ map to our address
619 .endm
620
621 PicoWriteS68k16_dec_m0b0:
622     mov     r3, #0x080000
623     b       0f
624
625 PicoWriteS68k16_dec_m0b1:
626     mov     r3, #0x0a0000
627 0:
628     m_s68k_write16_2M_decode
629     bic     r1, r1, #0xf0
630     orr     r1, r1, r1, lsr #4
631     strb    r1, [r2, r0]
632     bx      lr
633
634 PicoWriteS68k16_dec_m1b0:               @ underwrite
635     mov     r3, #0x080000
636     b       0f
637
638 PicoWriteS68k16_dec_m1b1:
639     mov     r3, #0x0a0000
640 0:
641     bics    r1, r1, #0xf000
642     bicnes  r1, r1, #0x00f0
643     bxeq    lr
644     orr     r1, r1, r1, lsr #4
645     m_s68k_write16_2M_decode
646     ldrb    r0, [r2, r0]!
647     and     r3, r1, #0x0f
648     and     r1, r1, #0xf0
649     tst     r0, #0x0f
650     orreq   r0, r0, r3
651     tst     r0, #0xf0
652     orreq   r0, r0, r1
653     strb    r0, [r2]
654     bx      lr
655
656 PicoWriteS68k16_dec_m2b0:               @ overwrite
657     mov     r3, #0x080000
658     b       0f
659
660 PicoWriteS68k16_dec_m2b1:
661     mov     r3, #0x0a0000
662 0:
663     bics    r1, r1, #0xf000
664     bicnes  r1, r1, #0x00f0
665     bxeq    lr
666     orr     r1, r1, r1, lsr #4
667     m_s68k_write16_2M_decode
668     ldrb    r0, [r2, r0]!
669     ands    r3, r1, #0x0f
670     andne   r0, r0, #0xf0
671     orrne   r0, r0, r3
672     ands    r1, r1, #0xf0
673     andne   r0, r0, #0x0f
674     orrne   r0, r0, r1
675     strb    r0, [r2]
676     bx      lr
677
678
679 PicoWriteS68k16_pr:
680     and     r2, r0, #0xfe00
681     cmp     r2, #0x8000
682     bne     m_s68k_write8_pcm
683
684 m_s68k_write16_regs:
685     bic     r0, r0, #0xff0000
686     bic     r0, r0, #0x008000
687     bic     r0, r0, #1
688     tst     r0, #0x7e00
689     movne   r0, #0
690     bxne    lr
691     cmp     r0, #0x0e
692     bne     s68k_reg_write16
693
694 m_s68k_write16_regs_spec:               @ special case
695     ldr     r2, =(Pico+0x22200)
696     mov     r0, #0x110000
697     ldr     r2, [r2]
698     add     r0, r0, #0x00000f
699     strb    r1, [r2, r0]                @ if (a == 0xe) s68k_regs[0xf] = d;
700     bx      lr
701
702 .pool
703
704 @ vim:filetype=armasm