bugfixes, cd/Memory.s
[picodrive.git] / Pico / cd / Memory.s
1 @ vim:filetype=armasm
2
3 @ Memory i/o handlers for Sega/Mega CD emulation
4 @ (c) Copyright 2007, Grazvydas "notaz" Ignotas
5 @ All Rights Reserved
6
7
8
9 .equiv PCM_STEP_SHIFT, 11
10
11 @ jump tables
12 .data
13 .align 4
14
15 .altmacro
16 .macro mk_m68k_jump_table on sz @ operation name, size
17     .long   m_m68k_&\on&\sz&_bios           @ 0x000000 - 0x01ffff
18     .long   m_m68k_&\on&\sz&_prgbank        @ 0x020000 - 0x03ffff
19     .long   m_&\on&_null, m_&\on&_null      @ 0x040000 - 0x07ffff
20     .long   m_&\on&_null, m_&\on&_null, m_&\on&_null, m_&\on&_null @ 0x080000 - 0x0fffff
21     .long   m_&\on&_null, m_&\on&_null, m_&\on&_null, m_&\on&_null @ 0x100000 - 0x17ffff
22     .long   m_&\on&_null, m_&\on&_null, m_&\on&_null, m_&\on&_null @ 0x180000 - 0x1fffff
23     .long   m_m68k_&\on&\sz&_wordram0_2M    @ 0x200000 - 0x21ffff
24     .long   m_m68k_&\on&\sz&_wordram1_2M    @ 0x220000 - 0x23ffff
25     .long   m_&\on&_null, m_&\on&_null      @ 0x240000 - 0x27ffff
26     .long   m_&\on&_null, m_&\on&_null, m_&\on&_null, m_&\on&_null @ 0x280000 - 0x2fffff
27     .long   m_&\on&_null, m_&\on&_null, m_&\on&_null, m_&\on&_null @ 0x300000
28     .long   m_&\on&_null, m_&\on&_null, m_&\on&_null, m_&\on&_null @          - 0x3fffff
29     .long   m_&\on&_null, m_&\on&_null, m_&\on&_null, m_&\on&_null @ 0x400000
30     .long   m_&\on&_null, m_&\on&_null, m_&\on&_null, m_&\on&_null @          - 0x4fffff
31     .long   m_&\on&_null, m_&\on&_null, m_&\on&_null, m_&\on&_null @ 0x500000
32     .long   m_&\on&_null, m_&\on&_null, m_&\on&_null, m_&\on&_null @          - 0x5fffff
33     .long   m_&\on&_null, m_&\on&_null, m_&\on&_null, m_&\on&_null @ 0x600000
34     .long   m_&\on&_null, m_&\on&_null, m_&\on&_null, m_&\on&_null @          - 0x6fffff
35     .long   m_&\on&_null, m_&\on&_null, m_&\on&_null, m_&\on&_null @ 0x700000
36     .long   m_&\on&_null, m_&\on&_null, m_&\on&_null, m_&\on&_null @          - 0x7fffff
37     .long   m_&\on&_null, m_&\on&_null, m_&\on&_null, m_&\on&_null @ 0x800000
38     .long   m_&\on&_null, m_&\on&_null, m_&\on&_null, m_&\on&_null @          - 0x8fffff
39     .long   m_&\on&_null, m_&\on&_null, m_&\on&_null, m_&\on&_null @ 0x900000
40     .long   m_&\on&_null, m_&\on&_null, m_&\on&_null, m_&\on&_null @          - 0x9fffff
41     .long   m_m68k_&\on&\sz&_system_io      @ 0xa00000 - 0xa1ffff
42     .long   m_&\on&_null, m_&\on&_null, m_&\on&_null               @ 0xa20000 - 0xa7ffff
43     .long   m_&\on&_null, m_&\on&_null, m_&\on&_null, m_&\on&_null @ 0xa80000 - 0xafffff
44     .long   m_&\on&_null, m_&\on&_null, m_&\on&_null, m_&\on&_null @ 0xb00000
45     .long   m_&\on&_null, m_&\on&_null, m_&\on&_null, m_&\on&_null @          - 0xbfffff
46     .long   m_m68k_&\on&\sz&_vdp, m_m68k_&\on&\sz&_vdp, m_m68k_&\on&\sz&_vdp, m_m68k_&\on&\sz&_vdp @ 0xc00000
47     .long   m_m68k_&\on&\sz&_vdp, m_m68k_&\on&\sz&_vdp, m_m68k_&\on&\sz&_vdp, m_m68k_&\on&\sz&_vdp @          - 0xcfffff
48     .long   m_&\on&_null, m_&\on&_null, m_&\on&_null, m_&\on&_null @ 0xd00000
49     .long   m_&\on&_null, m_&\on&_null, m_&\on&_null, m_&\on&_null @          - 0xdfffff
50     .long   m_m68k_&\on&\sz&_ram, m_m68k_&\on&\sz&_ram, m_m68k_&\on&\sz&_ram, m_m68k_&\on&\sz&_ram @ 0xe00000
51     .long   m_m68k_&\on&\sz&_ram, m_m68k_&\on&\sz&_ram, m_m68k_&\on&\sz&_ram, m_m68k_&\on&\sz&_ram @          - 0xefffff
52     .long   m_m68k_&\on&\sz&_ram, m_m68k_&\on&\sz&_ram, m_m68k_&\on&\sz&_ram, m_m68k_&\on&\sz&_ram @ 0xf00000
53     .long   m_m68k_&\on&\sz&_ram, m_m68k_&\on&\sz&_ram, m_m68k_&\on&\sz&_ram, m_m68k_&\on&\sz&_ram @          - 0xffffff
54 .endm
55
56 .macro mk_s68k_jump_table1 on sz @ operation name, size
57     .long   m_s68k_&\on&\sz&_prg, m_s68k_&\on&\sz&_prg, m_s68k_&\on&\sz&_prg, m_s68k_&\on&\sz&_prg            @ 0x000000 - 0x07ffff
58     .long   m_s68k_&\on&\sz&_wordram_2M     @ 0x080000 - 0x09ffff
59     .long   m_s68k_&\on&\sz&_wordram_2M     @ 0x0a0000 - 0x0bffff
60     .long   m_&\on&_null                    @ 0x0c0000 - 0x0dffff, 1M area
61     .long   m_&\on&_null                    @ 0x0e0000 - 0x0fffff
62 .endm
63
64 .macro mk_s68k_jump_table2 on sz @ operation name, size
65     .long   m_s68k_&\on&\sz&_backup         @ 0xfe0000 - 0xfe7fff
66     .long   m_s68k_&\on&\sz&_backup         @ 0xfe8000 - 0xfeffff
67     .long   m_s68k_&\on&\sz&_pcm            @ 0xff0000 - 0xff7fff
68     .long   m_s68k_&\on&\sz&_regs           @ 0xff8000 - 0xffffff
69 .endm
70
71
72 @ the jumptables themselves
73 m_m68k_read8_table:   mk_m68k_jump_table read 8
74 m_m68k_read16_table:  mk_m68k_jump_table read 16
75 m_m68k_read32_table:  mk_m68k_jump_table read 32
76 m_m68k_write8_table:  mk_m68k_jump_table write 8
77 m_m68k_write16_table: mk_m68k_jump_table write 16
78 m_m68k_write32_table: mk_m68k_jump_table write 32
79
80
81 m_s68k_read8_table:
82     mk_s68k_jump_table1 read 8
83     mk_s68k_jump_table2 read 8
84 m_s68k_read16_table:
85     mk_s68k_jump_table1 read 16
86     mk_s68k_jump_table2 read 16
87 m_s68k_read32_table:
88     mk_s68k_jump_table1 read 32
89     mk_s68k_jump_table2 read 32
90 m_s68k_write8_table:
91     mk_s68k_jump_table1 write 8
92     mk_s68k_jump_table2 write 8
93 m_s68k_write16_table:
94     mk_s68k_jump_table1 write 16
95     mk_s68k_jump_table2 write 16
96 m_s68k_write32_table:
97     mk_s68k_jump_table1 write 32
98     mk_s68k_jump_table2 write 32
99
100
101 @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
102
103 .text
104 .align 4
105
106 .global PicoMemResetCD
107 .global PicoReadM68k8
108 .global PicoReadM68k16
109 .global PicoReadM68k32
110 .global PicoWriteM68k8
111 .global PicoWriteM68k16
112 .global PicoWriteM68k32
113 .global PicoReadS68k8
114 .global PicoReadS68k16
115 .global PicoReadS68k32
116 .global PicoWriteS68k8
117 .global PicoWriteS68k16
118 .global PicoWriteS68k32
119
120 @ externs, just for reference
121 .extern Pico
122 .extern z80Read8
123 .extern OtherRead16
124 .extern PicoVideoRead
125 .extern Read_CDC_Host
126 .extern m68k_reg_write8
127 .extern OtherWrite8
128 .extern OtherWrite16
129 .extern gfx_cd_read
130 .extern s68k_reg_read16
131 .extern SRam
132 .extern gfx_cd_write
133 .extern s68k_reg_write8
134
135
136 @ r0=reg3, r1-r3=temp
137 .macro mk_update_table on sz @ operation name, size
138     @ we only set word-ram handlers
139     ldr     r1, =m_m68k_&\on&\sz&_table
140     ldr     r12,=m_s68k_&\on&\sz&_table
141     tst     r0, #4
142     bne     0f @ pmr_8_1M
143
144 @ pmr_8_2M:
145     ldr     r2, =m_m68k_&\on&\sz&_wordram0_2M
146     ldr     r3, =m_s68k_&\on&\sz&_wordram_2M
147     str     r2, [r1, #16*4]
148     str     r2, [r1, #17*4]
149     ldr     r2, =m_&\on&_null
150     str     r3, [r12,#4*4]
151     str     r3, [r12,#5*4]
152     str     r2, [r12,#6*4]
153     b       9f @ pmr_8_done
154
155 0: @ pmr_8_1M:
156     tst     r0, #1
157     bne     1f @ pmr_8_1M1
158
159 @ pmr_8_1M0:
160     ldr     r2, =m_m68k_&\on&\sz&_wordram0_1M_b0
161     ldr     r3, =m_m68k_&\on&\sz&_wordram1_1M_b0
162     str     r2, [r1, #16*4]
163     str     r3, [r1, #17*4]
164     ldr     r2, =m_s68k_&\on&\sz&_wordram_2M_decode_b1
165     ldr     r3, =m_s68k_&\on&\sz&_wordram_1M_b1
166     str     r2, [r12,#4*4]
167     str     r2, [r12,#5*4]
168     str     r3, [r12,#6*4]
169     b       9f @ pmr_8_done
170
171 1: @ pmr_8_1M1:
172     ldr     r2, =m_m68k_&\on&\sz&_wordram0_1M_b1
173     ldr     r3, =m_m68k_&\on&\sz&_wordram1_1M_b1
174     str     r2, [r1, #16*4]
175     str     r3, [r1, #17*4]
176     ldr     r2, =m_s68k_&\on&\sz&_wordram_2M_decode_b0
177     ldr     r3, =m_s68k_&\on&\sz&_wordram_1M_b0
178     str     r2, [r12,#4*4]
179     str     r2, [r12,#5*4]
180     str     r3, [r12,#6*4]
181
182 9: @ pmr_8_done:
183 .endm
184
185
186 PicoMemResetCD: @ r3
187     mk_update_table read 8
188     mk_update_table read 16
189     mk_update_table read 32
190     mk_update_table write 8
191     mk_update_table write 16
192     mk_update_table write 32
193     bx      lr
194
195
196 .pool
197
198 @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
199
200 .macro mk_entry_m68k table
201     ldr     r2, =\table
202     bic     r0, r0, #0xff000000
203     and     r3, r0, #0x00fe0000
204     ldr     pc, [r2, r3, lsr #15]
205 .endm
206
207 PicoReadM68k8: @ u32 a
208     mk_entry_m68k m_m68k_read8_table
209
210 PicoReadM68k16: @ u32 a
211     mk_entry_m68k m_m68k_read16_table
212
213 PicoReadM68k32: @ u32 a
214     mk_entry_m68k m_m68k_read32_table
215
216 PicoWriteM68k8: @ u32 a, u8 d
217     mk_entry_m68k m_m68k_write8_table
218
219 PicoWriteM68k16: @ u32 a, u16 d
220     mk_entry_m68k m_m68k_write16_table
221
222 PicoWriteM68k32: @ u32 a, u32 d
223     mk_entry_m68k m_m68k_write32_table
224
225
226 .macro mk_entry_s68k table
227     ldr     r2, =\table
228     bic     r0, r0, #0xff000000
229     and     r3, r0, #0x00fe0000
230     cmp     r3, #0x000e0000
231     ldrlt   pc, [r2, r3, lsr #15]
232     add     r2, r2, #8*4                @ skip to table2
233     cmp     r3, #0x00fe0000
234     andge   r3, r0, #0x00018000
235     ldrge   pc, [r2, r3, lsr #13]
236     mov     r0, #0
237     bx      lr
238 .endm
239
240 PicoReadS68k8: @ u32 a
241     mk_entry_s68k m_s68k_read8_table
242
243 PicoReadS68k16: @ u32 a
244     mk_entry_s68k m_s68k_read16_table
245
246 PicoReadS68k32: @ u32 a
247     mk_entry_s68k m_s68k_read32_table
248
249 PicoWriteS68k8: @ u32 a, u8 d
250     mk_entry_s68k m_s68k_write8_table
251
252 PicoWriteS68k16: @ u32 a, u16 d
253     mk_entry_s68k m_s68k_write16_table
254
255 PicoWriteS68k32: @ u32 a, u32 d
256     mk_entry_s68k m_s68k_write32_table
257
258
259 .pool
260
261 @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
262
263 @ utilities
264
265 @ r0=addr[in,out], r1,r2=tmp
266 .macro cell_map
267     ands    r1, r0, #0x01c000
268     ldrne   pc, [pc, r1, lsr #12]
269     beq     0f                          @ most common?
270     .long   0f
271     .long   0f
272     .long   0f
273     .long   0f
274     .long   1f
275     .long   1f
276     .long   2f
277     .long   3f
278 1: @ x16 cells
279     and     r1, r0, #0x7e00             @ col
280     and     r2, r0, #0x01fc             @ row
281     orr     r2, r2, #0x0400
282     orr     r1, r2, r1, ror #13
283     b       9f
284 2: @ x8 cells
285     and     r1, r0, #0x3f00             @ col
286     and     r2, r0, #0x00fc             @ row
287     orr     r2, r2, #0x0600
288     orr     r1, r2, r1, ror #12
289     b       9f
290 3: @ x4 cells
291     and     r1, r0, #0x1f80             @ col
292     and     r2, r0, #0x007c             @ row
293     orr     r1, r2, r1, ror #11
294     and     r2, r0,#0x1e000
295     orr     r1, r1, r2, lsr #6
296     b       9f
297 0: @ x32 cells
298     and     r1, r0, #0xfc00             @ col
299     and     r2, r0, #0x03fc             @ row
300     orr     r1, r2, r1, ror #14
301 9:
302     and     r0, r0, #3
303     orr     r0, r0, r1, ror #26         @ rol 4+2
304 .endm
305
306
307 @ r0=prt1, r1=ptr2
308 .macro m_read32_gen
309     tst     r0, #2
310     ldrneh  r0, [r1, r0]!
311     ldrneh  r1, [r1, #2]
312     ldreq   r0, [r1, r0]
313     moveq   r0, r0, ror #16
314     orrne   r0, r1, r0, lsl #16
315 .endm
316
317
318 @ r0=prt1, r1=data, r2=ptr2
319 .macro m_write32_gen
320     tst     r0, #2
321     mov     r1, r1, ror #16
322     strneh  r1, [r2, r0]!
323     movne   r1, r1, lsr #16
324     strneh  r1, [r2, #2]
325     streq   r1, [r2, r0]
326 .endm
327
328
329 @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
330
331
332 m_read_null:
333     mov     r0, #0
334     bx      lr
335
336
337 m_m68k_read8_bios:
338     ldr     r1, =(Pico+0x22200)
339     bic     r0, r0, #0xfe0000
340     ldr     r1, [r1]
341     eor     r0, r0, #1
342     ldrb    r0, [r1, r0]
343     bx      lr
344
345
346 m_m68k_read8_prgbank:
347     ldr     r1, =(Pico+0x22200)
348     eor     r0, r0, #1
349     ldr     r1, [r1]
350     mov     r2, #0x110000
351     orr     r3, r2, #0x002200
352     ldr     r3, [r1, r3]
353     ldr     r2, [r1, r2]
354     tst     r3, #0x00020000             @ have bus?
355     moveq   r0, #0
356     bxeq    lr
357     and     r2, r2, #0xc0000000         @ r3 & 0xC0
358     add     r1, r1, r2, lsr #12
359     ldrb    r0, [r1, r0]
360     bx      lr
361
362
363 m_m68k_read8_wordram0_2M:               @ 0x200000 - 0x21ffff
364 m_m68k_read8_wordram1_2M:               @ 0x220000 - 0x23ffff
365     ldr     r1, =(Pico+0x22200)
366     sub     r0, r0, #0x160000           @ map to our offset, which is 0x0a0000
367     ldr     r1, [r1]
368     eor     r0, r0, #1
369     ldrb    r0, [r1, r0]
370     bx      lr
371
372
373 m_m68k_read8_wordram0_1M_b0:            @ 0x200000 - 0x21ffff
374     ldr     r1, =(Pico+0x22200)
375     sub     r0, r0, #0x140000           @ map to our offset, which is 0x0c0000
376     ldr     r1, [r1]
377     eor     r0, r0, #1
378     ldrb    r0, [r1, r0]
379     bx      lr
380
381
382 m_m68k_read8_wordram0_1M_b1:            @ 0x200000 - 0x21ffff
383     ldr     r1, =(Pico+0x22200)
384     sub     r0, r0, #0x120000           @ map to our offset, which is 0x0e0000
385     ldr     r1, [r1]
386     eor     r0, r0, #1
387     ldrb    r0, [r1, r0]
388     bx      lr
389
390
391 m_m68k_read8_wordram1_1M_b0:            @ 0x220000 - 0x23ffff, cell arranged
392     cell_map
393     ldr     r1, =(Pico+0x22200)
394     add     r0, r0, #0x0c0000
395     ldr     r1, [r1]
396     eor     r0, r0, #1
397     ldrb    r0, [r1, r0]
398     bx      lr
399
400
401 m_m68k_read8_wordram1_1M_b1:            @ 0x220000 - 0x23ffff, cell arranged
402     cell_map
403     ldr     r1, =(Pico+0x22200)
404     add     r0, r0, #0x0e0000
405     ldr     r1, [r1]
406     eor     r0, r0, #1
407     ldrb    r0, [r1, r0]
408     bx      lr
409
410
411 m_m68k_read8_system_io:
412     bic     r2, r0, #0xfe0000
413     bic     r2, r2, #0x3f
414     cmp     r2, #0x012000
415     bne     m_m68k_read8_misc
416
417     ldr     r1, =(Pico+0x22200)
418     and     r0, r0, #0x3f
419     ldr     r1, [r1]                  @ Pico.mcd (used everywhere)
420     cmp     r0, #0x0e
421     ldrlt   pc, [pc, r0, lsl #2]
422     b       m_m68k_read8_hi
423     .long   m_m68k_read8_r00
424     .long   m_m68k_read8_r01
425     .long   m_m68k_read8_r02
426     .long   m_m68k_read8_r03
427     .long   m_m68k_read8_r04
428     .long   m_read_null               @ unused bits
429     .long   m_m68k_read8_r06
430     .long   m_m68k_read8_r07
431     .long   m_m68k_read8_r08
432     .long   m_m68k_read8_r09
433     .long   m_read_null               @ reserved
434     .long   m_read_null
435     .long   m_m68k_read8_r0c
436     .long   m_m68k_read8_r0d
437 m_m68k_read8_r00:
438     add     r1, r1, #0x110000
439     ldr     r0, [r1, #30]
440     and     r0, r0, #0x04000000       @ we need irq2 mask state
441     mov     r0, r0, lsr #19
442     bx      lr
443 m_m68k_read8_r01:
444     add     r1, r1, #0x110000
445     add     r1, r1, #0x002200
446     ldrb    r0, [r1, #2]              @ Pico_mcd->m.busreq
447     bx      lr
448 m_m68k_read8_r02:
449     add     r1, r1, #0x110000
450     ldrb    r0, [r1, #2]
451     bx      lr
452 m_m68k_read8_r03:
453     add     r1, r1, #0x110000
454     ldrb    r0, [r1, #3]
455     and     r0, r0, #0xc7
456     bx      lr
457 m_m68k_read8_r04:
458     add     r1, r1, #0x110000
459     ldrb    r0, [r1, #4]
460     bx      lr
461 m_m68k_read8_r06:
462     ldrb    r0, [r1, #0x73]           @ IRQ vector
463     bx      lr
464 m_m68k_read8_r07:
465     ldrb    r0, [r1, #0x72]
466     bx      lr
467 m_m68k_read8_r08:
468     mov     r0, #0
469     bl      Read_CDC_Host             @ TODO: make it local
470     mov     r0, r0, lsr #8
471     bx      lr
472 m_m68k_read8_r09:
473     mov     r0, #0
474     b       Read_CDC_Host
475 m_m68k_read8_r0c:
476     add     r1, r1, #0x110000
477     add     r1, r1, #0x002200
478     ldr     r0, [r1, #0x14]           @ Pico_mcd->m.timer_stopwatch
479     mov     r0, r0, lsr #24
480     bx      lr
481 m_m68k_read8_r0d:
482     add     r1, r1, #0x110000
483     add     r1, r1, #0x002200
484     ldr     r0, [r1, #0x14]
485     mov     r0, r0, lsr #16
486     bx      lr
487 m_m68k_read8_hi:
488     cmp     r0, #0x30
489     movge   r0, #0
490     bxeq    lr
491     add     r1, r1, #0x110000
492     ldrb    r0, [r1, r0]
493     bx      lr
494
495
496 m_m68k_read8_misc:
497     bic     r2, r0, #0x00ff
498     bic     r2, r2, #0xbf00
499     cmp     r2, #0xa00000  @ Z80 RAM?
500     beq     z80Read8
501 @    ldreq   r2, =z80Read8
502 @    bxeq    r2
503     stmfd   sp!,{r0,lr}
504     bic     r0, r0, #1
505     mov     r1, #8
506     bl      OtherRead16                 @ non-MCD version should be ok too
507     ldmfd   sp!,{r1,lr}
508     tst     r1, #1
509     moveq   r0, r0, lsr #8
510     bx      lr
511
512
513 m_m68k_read8_vdp:
514     tst     r0, #0x70000
515     tsteq   r0, #0x000e0
516     bxne    lr              @ invalid read
517     stmfd   sp!,{r0,lr}
518     bic     r0, r0, #1
519     bl      PicoVideoRead               @ TODO: implement it in asm
520     ldmfd   sp!,{r1,lr}
521     tst     r1, #1
522     moveq   r0, r0, lsr #8
523     bx      lr
524
525
526 m_m68k_read8_ram:
527     ldr     r1, =Pico
528     bic     r0, r0, #0xff0000
529     eor     r0, r0, #1
530     ldrb    r0, [r1, r0]
531     bx      lr
532
533
534 @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
535
536
537 m_m68k_read16_bios:
538     ldr     r1, =(Pico+0x22200)
539     bic     r0, r0, #0xfe0000
540     ldr     r1, [r1]
541     bic     r0, r0, #1
542     ldrh    r0, [r1, r0]
543     bx      lr
544
545
546 m_m68k_read16_prgbank:
547     ldr     r1, =(Pico+0x22200)
548     bic     r0, r0, #1
549     ldr     r1, [r1]
550     mov     r2, #0x110000
551     orr     r3, r2, #0x002200
552     ldr     r3, [r1, r3]
553     ldr     r2, [r1, r2]
554     tst     r3, #0x00020000             @ have bus?
555     moveq   r0, #0
556     bxeq    lr
557     and     r2, r2, #0xc0000000         @ r3 & 0xC0
558     add     r1, r1, r2, lsr #12
559     ldrh    r0, [r1, r0]
560     bx      lr
561
562
563 m_m68k_read16_wordram0_2M:              @ 0x200000 - 0x21ffff
564 m_m68k_read16_wordram1_2M:              @ 0x220000 - 0x23ffff
565     ldr     r1, =(Pico+0x22200)
566     sub     r0, r0, #0x160000           @ map to our offset, which is 0x0a0000
567     ldr     r1, [r1]
568     bic     r0, r0, #1
569     ldrh    r0, [r1, r0]
570     bx      lr
571
572
573 m_m68k_read16_wordram0_1M_b0:           @ 0x200000 - 0x21ffff
574     ldr     r1, =(Pico+0x22200)
575     sub     r0, r0, #0x140000           @ map to our offset, which is 0x0c0000
576     ldr     r1, [r1]
577     bic     r0, r0, #1
578     ldrh    r0, [r1, r0]
579     bx      lr
580
581
582 m_m68k_read16_wordram0_1M_b1:           @ 0x200000 - 0x21ffff
583     ldr     r1, =(Pico+0x22200)
584     sub     r0, r0, #0x120000           @ map to our offset, which is 0x0e0000
585     ldr     r1, [r1]
586     bic     r0, r0, #1
587     ldrh    r0, [r1, r0]
588     bx      lr
589
590
591 m_m68k_read16_wordram1_1M_b0:           @ 0x220000 - 0x23ffff, cell arranged
592     @ Warning: read32 relies on NOT using r3 and r12 here
593     cell_map
594     ldr     r1, =(Pico+0x22200)
595     add     r0, r0, #0x0c0000
596     ldr     r1, [r1]
597     bic     r0, r0, #1
598     ldrh    r0, [r1, r0]
599     bx      lr
600
601
602 m_m68k_read16_wordram1_1M_b1:           @ 0x220000 - 0x23ffff, cell arranged
603     cell_map
604     ldr     r1, =(Pico+0x22200)
605     add     r0, r0, #0x0e0000
606     ldr     r1, [r1]
607     bic     r0, r0, #1
608     ldrh    r0, [r1, r0]
609     bx      lr
610
611
612 m_m68k_read16_system_io:
613     bic     r1, r0, #0xfe0000
614     bic     r1, r1, #0x3f
615     cmp     r1, #0x012000
616     bne     m_m68k_read16_misc
617
618 m_m68k_read16_m68k_regs:
619     ldr     r1, =(Pico+0x22200)
620     and     r0, r0, #0x3e
621     ldr     r1, [r1]                  @ Pico.mcd (used everywhere)
622     cmp     r0, #0x0e
623     ldrlt   pc, [pc, r0, lsl #1]
624     b       m_m68k_read16_hi
625     .long   m_m68k_read16_r00
626     .long   m_m68k_read16_r02
627     .long   m_m68k_read16_r04
628     .long   m_m68k_read16_r06
629     .long   m_m68k_read16_r08
630     .long   m_read_null               @ reserved
631     .long   m_m68k_read16_r0c
632 m_m68k_read16_r00:
633     add     r1, r1, #0x110000
634     ldr     r0, [r1, #30]
635     add     r1, r1, #0x002200
636     ldrb    r1, [r1, #2]              @ Pico_mcd->m.busreq
637     and     r0, r0, #0x04000000       @ we need irq2 mask state
638     orr     r0, r1, r0, lsr #11
639     bx      lr
640 m_m68k_read16_r02:
641     add     r1, r1, #0x110000
642     ldrb    r0, [r1, #2]
643     ldrb    r1, [r1, #3]
644     and     r1, r1, #0xc7
645     orr     r0, r1, r0, lsl #8
646     bx      lr
647 m_m68k_read16_r04:
648     add     r1, r1, #0x110000
649     ldrb    r0, [r1, #4]
650     mov     r0, r0, lsl #8
651     bx      lr
652 m_m68k_read16_r06:
653     ldrh    r0, [r1, #0x72]           @ IRQ vector
654     bx      lr
655 m_m68k_read16_r08:
656     mov     r0, #0
657     b       Read_CDC_Host
658 m_m68k_read16_r0c:
659     add     r1, r1, #0x110000
660     add     r1, r1, #0x002200
661     ldr     r0, [r1, #0x14]
662     mov     r0, r0, lsr #16
663     bx      lr
664 m_m68k_read16_hi:
665     cmp     r0, #0x30
666     addlt   r1, r1, #0x110000
667     ldrlth  r1, [r1, r0]
668     movge   r0, #0
669     bxge    lr
670     mov     r0, r1, lsr #8
671     and     r1, r1, #0xff
672     orr     r0, r0, r1, lsl #8
673     bx      lr
674
675
676 m_m68k_read16_misc:
677     bic     r0, r0, #1
678     mov     r1, #16
679     b       OtherRead16
680
681
682 m_m68k_read16_vdp:
683     tst     r0, #0x70000
684     tsteq   r0, #0x000e0
685     bxne    lr              @ invalid read
686     bic     r0, r0, #1
687     b       PicoVideoRead
688
689
690 m_m68k_read16_ram:
691     ldr     r1, =Pico
692     bic     r0, r0, #0xff0000
693     bic     r0, r0, #1
694     ldrh    r0, [r1, r0]
695     bx      lr
696
697
698 @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
699
700
701 m_m68k_read32_bios:
702     ldr     r1, =(Pico+0x22200)
703     bic     r0, r0, #0xfe0000
704     ldr     r1, [r1]
705     bic     r0, r0, #1
706     m_read32_gen
707     bx      lr
708
709
710 m_m68k_read32_prgbank:
711     ldr     r1, =(Pico+0x22200)
712     bic     r0, r0, #1
713     ldr     r1, [r1]
714     mov     r2, #0x110000
715     orr     r3, r2, #0x002200
716     ldr     r3, [r1, r3]
717     ldr     r2, [r1, r2]
718     tst     r3, #0x00020000             @ have bus?
719     moveq   r0, #0
720     bxeq    lr
721     and     r2, r2, #0xc0000000         @ r3 & 0xC0
722     add     r1, r1, r2, lsr #12
723     m_read32_gen
724     bx      lr
725
726
727 m_m68k_read32_wordram0_2M:              @ 0x200000 - 0x21ffff
728 m_m68k_read32_wordram1_2M:              @ 0x220000 - 0x23ffff
729     ldr     r1, =(Pico+0x22200)
730     sub     r0, r0, #0x160000           @ map to our offset, which is 0x0a0000
731     ldr     r1, [r1]
732     bic     r0, r0, #1
733     m_read32_gen
734     bx      lr
735
736
737 m_m68k_read32_wordram0_1M_b0:           @ 0x200000 - 0x21ffff
738     ldr     r1, =(Pico+0x22200)
739     sub     r0, r0, #0x140000           @ map to our offset, which is 0x0c0000
740     ldr     r1, [r1]
741     bic     r0, r0, #1
742     m_read32_gen
743     bx      lr
744
745
746 m_m68k_read32_wordram0_1M_b1:           @ 0x200000 - 0x21ffff
747     ldr     r1, =(Pico+0x22200)
748     sub     r0, r0, #0x120000           @ map to our offset, which is 0x0e0000
749     ldr     r1, [r1]
750     bic     r0, r0, #1
751     m_read32_gen
752     bx      lr
753
754
755 m_m68k_read32_wordram1_1M_b0:           @ 0x220000 - 0x23ffff, cell arranged
756     tst     r0, #2
757     bne     m_m68k_read32_wordram1_1M_b0_unal
758     cell_map
759     ldr     r1, =(Pico+0x22200)
760     add     r0, r0, #0x0c0000
761     ldr     r1, [r1]
762     bic     r0, r0, #1
763     m_read32_gen
764     bx      lr
765 m_m68k_read32_wordram1_1M_b0_unal:
766     @ hopefully this doesn't happen too often
767     mov     r12,lr
768     mov     r3, r0
769     bl      m_m68k_read16_wordram1_1M_b0 @ must not trash r12 and r3
770     add     r1, r3, #2
771     mov     r3, r0
772     mov     r0, r1
773     bl      m_m68k_read16_wordram1_1M_b0
774     orr     r0, r0, r3, lsl #16
775     bx      r12
776
777
778 m_m68k_read32_wordram1_1M_b1:            @ 0x220000 - 0x23ffff, cell arranged
779     tst     r0, #2
780     bne     m_m68k_read32_wordram1_1M_b1_unal
781     cell_map
782     ldr     r1, =(Pico+0x22200)
783     add     r0, r0, #0x0e0000
784     ldr     r1, [r1]
785     bic     r0, r0, #1
786     m_read32_gen
787     bx      lr
788 m_m68k_read32_wordram1_1M_b1_unal:
789     mov     r12,lr
790     mov     r3, r0
791     bl      m_m68k_read16_wordram1_1M_b1 @ must not trash r12 and r3
792     add     r1, r3, #2
793     mov     r3, r0
794     mov     r0, r1
795     bl      m_m68k_read16_wordram1_1M_b1
796     orr     r0, r0, r3, lsl #16
797     bx      r12
798
799
800 @ it is not very practical to use long access on hw registers, so I assume it is not used too much.
801 m_m68k_read32_system_io:
802     bic     r1, r0, #0xfe0000
803     bic     r1, r1, #0x3f
804     cmp     r1, #0x012000
805     bne     m_m68k_read32_misc
806     and     r1, r0, #0x3e
807     cmp     r1, #0x0e
808     blt     m_m68k_read32_misc
809     cmp     r1, #0x30
810     movge   r0, #0
811     bxge    lr
812     @ I have seen the range 0x0e-0x2f accessed quite frequently with long i/o, so here is some code for that
813     ldr     r0, =(Pico+0x22200)
814     mov     r2, #0xff
815     ldr     r0, [r0]
816     orr     r2, r2, r2, lsl #16
817     add     r0, r0, #0x110000
818     m_read32_gen
819     and     r1, r2, r0                @ data is big-endian read as little, have to byteswap
820     and     r0, r2, r0, lsr #8
821     orr     r0, r0, r1, lsl #8
822     bx      lr
823
824 m_m68k_read32_misc:
825     add     r1, r0, #2
826     stmfd   sp!,{r1,lr}
827     bl      m_m68k_read16_system_io
828     swp     r0, r0, [sp]
829     bl      m_m68k_read16_system_io
830     ldmfd   sp!,{r1,lr}
831     orr     r0, r0, r1, lsl #16
832     bx      lr
833
834
835 m_m68k_read32_vdp:
836     tst     r0, #0x70000
837     tsteq   r0, #0x000e0
838     bxne    lr              @ invalid read
839     bic     r0, r0, #1
840     add     r1, r0, #2
841     stmfd   sp!,{r1,lr}
842     bl      PicoVideoRead
843     swp     r0, r0, [sp]
844     bl      PicoVideoRead
845     ldmfd   sp!,{r1,lr}
846     orr     r0, r0, r1, lsl #16
847     bx      lr
848
849
850 m_m68k_read32_ram:
851     ldr     r1, =Pico
852     bic     r0, r0, #0xff0000
853     bic     r0, r0, #1
854     m_read32_gen
855     bx      lr
856
857 .pool
858
859 @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
860
861
862 m_write_null:
863 m_m68k_write8_bios:
864     bx      lr
865
866
867 m_m68k_write8_prgbank:
868     ldr     r2, =(Pico+0x22200)
869     eor     r0, r0, #1
870     ldr     r2, [r2]
871     mov     r12,#0x110000
872     orr     r3, r12, #0x002200
873     ldr     r3, [r2, r3]
874     ldr     r12,[r2, r12]
875     tst     r3, #0x00020000             @ have bus?
876     bxeq    lr
877     and     r12,r12,#0xc0000000         @ r3 & 0xC0
878     add     r2, r2, r12, lsr #12
879     strb    r1, [r2, r0]
880     bx      lr
881
882
883 m_m68k_write8_wordram0_2M:              @ 0x200000 - 0x21ffff
884 m_m68k_write8_wordram1_2M:              @ 0x220000 - 0x23ffff
885     ldr     r2, =(Pico+0x22200)
886     sub     r0, r0, #0x160000           @ map to our offset, which is 0x0a0000
887     ldr     r2, [r2]
888     eor     r0, r0, #1
889     strb    r1, [r2, r0]
890     bx      lr
891
892
893 m_m68k_write8_wordram0_1M_b0:           @ 0x200000 - 0x21ffff
894     ldr     r2, =(Pico+0x22200)
895     sub     r0, r0, #0x140000           @ map to our offset, which is 0x0c0000
896     ldr     r2, [r2]
897     eor     r0, r0, #1
898     strb    r1, [r2, r0]
899     bx      lr
900
901
902 m_m68k_write8_wordram0_1M_b1:           @ 0x200000 - 0x21ffff
903     ldr     r2, =(Pico+0x22200)
904     sub     r0, r0, #0x120000           @ map to our offset, which is 0x0e0000
905     ldr     r2, [r2]
906     eor     r0, r0, #1
907     strb    r1, [r2, r0]
908     bx      lr
909
910
911 m_m68k_write8_wordram1_1M_b0:           @ 0x220000 - 0x23ffff, cell arranged
912     mov     r3, r1
913     cell_map
914     ldr     r2, =(Pico+0x22200)
915     add     r0, r0, #0x0c0000
916     ldr     r2, [r2]
917     eor     r0, r0, #1
918     strb    r3, [r2, r0]
919     bx      lr
920
921
922 m_m68k_write8_wordram1_1M_b1:           @ 0x220000 - 0x23ffff, cell arranged
923     mov     r3, r1
924     cell_map
925     ldr     r2, =(Pico+0x22200)
926     add     r0, r0, #0x0e0000
927     ldr     r2, [r2]
928     eor     r0, r0, #1
929     strb    r3, [r2, r0]
930     bx      lr
931
932
933 m_m68k_write8_system_io:
934     bic     r2, r0, #0xfe0000
935     bic     r2, r2, #0x3f
936     cmp     r2, #0x012000
937     beq     m68k_reg_write8
938     mov     r2, #8
939     b       OtherWrite8
940
941
942 m_m68k_write8_vdp:
943     tst     r0, #0x70000
944     tsteq   r0, #0x000e0
945     bxne    lr                          @ invalid
946     and     r1, r1, #0xff
947     orr     r1, r1, r1, lsl #8          @ byte access gets mirrored
948     b       PicoVideoWrite
949
950
951 m_m68k_write8_ram:
952     ldr     r2, =Pico
953     bic     r0, r0, #0xff0000
954     eor     r0, r0, #1
955     strb    r1, [r2, r0]
956     bx      lr
957
958
959 @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
960
961
962 m_m68k_write16_bios:
963     bx      lr
964
965
966 m_m68k_write16_prgbank:
967     ldr     r2, =(Pico+0x22200)
968     bic     r0, r0, #1
969     ldr     r2, [r2]
970     mov     r12,#0x110000
971     orr     r3, r12, #0x002200
972     ldr     r3, [r2, r3]
973     ldr     r12,[r2, r12]
974     tst     r3, #0x00020000             @ have bus?
975     bxeq    lr
976     and     r12,r12,#0xc0000000         @ r3 & 0xC0
977     add     r2, r2, r12, lsr #12
978     strh    r1, [r2, r0]
979     bx      lr
980
981
982 m_m68k_write16_wordram0_2M:             @ 0x200000 - 0x21ffff
983 m_m68k_write16_wordram1_2M:             @ 0x220000 - 0x23ffff
984     ldr     r2, =(Pico+0x22200)
985     sub     r0, r0, #0x160000           @ map to our offset, which is 0x0a0000
986     ldr     r2, [r2]
987     bic     r0, r0, #1
988     strh    r1, [r2, r0]
989     bx      lr
990
991
992 m_m68k_write16_wordram0_1M_b0:          @ 0x200000 - 0x21ffff
993     ldr     r2, =(Pico+0x22200)
994     sub     r0, r0, #0x140000           @ map to our offset, which is 0x0c0000
995     ldr     r2, [r2]
996     bic     r0, r0, #1
997     strh    r1, [r2, r0]
998     bx      lr
999
1000
1001 m_m68k_write16_wordram0_1M_b1:          @ 0x200000 - 0x21ffff
1002     ldr     r2, =(Pico+0x22200)
1003     sub     r0, r0, #0x120000           @ map to our offset, which is 0x0e0000
1004     ldr     r2, [r2]
1005     bic     r0, r0, #1
1006     strh    r1, [r2, r0]
1007     bx      lr
1008
1009
1010 m_m68k_write16_wordram1_1M_b0:           @ 0x220000 - 0x23ffff, cell arranged
1011     @ Warning: write32 relies on NOT using r12 and and keeping data in r3
1012     mov     r3, r1
1013     cell_map
1014     ldr     r1, =(Pico+0x22200)
1015     add     r0, r0, #0x0c0000
1016     ldr     r1, [r1]
1017     bic     r0, r0, #1
1018     strh    r3, [r1, r0]
1019     bx      lr
1020
1021
1022 m_m68k_write16_wordram1_1M_b1:           @ 0x220000 - 0x23ffff, cell arranged
1023     mov     r3, r1
1024     cell_map
1025     ldr     r1, =(Pico+0x22200)
1026     add     r0, r0, #0x0e0000
1027     ldr     r1, [r1]
1028     bic     r0, r0, #1
1029     strh    r3, [r1, r0]
1030     bx      lr
1031
1032
1033 m_m68k_write16_system_io:
1034     bic     r0, r0, #1
1035     bic     r2, r0, #0xfe0000
1036     bic     r2, r2, #0x3f
1037     cmp     r2, #0x012000
1038     bne     OtherWrite16
1039
1040 m_m68k_write16_m68k_regs:
1041     and     r3, r1, #0xff
1042     add     r2, r0, #1
1043     stmfd   sp!,{r2,r3,lr}
1044     mov     r1, r1, lsr #8
1045     bl      m68k_reg_write8
1046     ldmfd   sp!,{r0,r1,lr}
1047     b       m68k_reg_write8
1048
1049
1050 m_m68k_write16_vdp:
1051     tst     r0, #0x70000
1052     tsteq   r0, #0x000e0
1053     bxne    lr              @ invalid
1054     bic     r0, r0, #1
1055     b       PicoVideoWrite
1056
1057
1058 m_m68k_write16_ram:
1059     ldr     r2, =Pico
1060     bic     r0, r0, #0xff0000
1061     bic     r0, r0, #1
1062     strh    r1, [r2, r0]
1063     bx      lr
1064
1065
1066 @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1067
1068
1069 m_m68k_write32_bios:
1070     bx      lr
1071
1072
1073 m_m68k_write32_prgbank:
1074     ldr     r2, =(Pico+0x22200)
1075     bic     r0, r0, #1
1076     ldr     r2, [r2]
1077     mov     r12,#0x110000
1078     orr     r3, r12, #0x002200
1079     ldr     r3, [r2, r3]
1080     ldr     r12,[r2, r12]
1081     tst     r3, #0x00020000             @ have bus?
1082     bxeq    lr
1083     and     r12,r12,#0xc0000000         @ r3 & 0xC0
1084     add     r2, r2, r12, lsr #12
1085     m_write32_gen
1086     bx      lr
1087
1088
1089 m_m68k_write32_wordram0_2M:             @ 0x200000 - 0x21ffff
1090 m_m68k_write32_wordram1_2M:             @ 0x220000 - 0x23ffff
1091     ldr     r2, =(Pico+0x22200)
1092     sub     r0, r0, #0x160000           @ map to our offset, which is 0x0a0000
1093     ldr     r2, [r2]
1094     bic     r0, r0, #1
1095     m_write32_gen
1096     bx      lr
1097
1098
1099 m_m68k_write32_wordram0_1M_b0:           @ 0x200000 - 0x21ffff
1100     ldr     r2, =(Pico+0x22200)
1101     sub     r0, r0, #0x140000           @ map to our offset, which is 0x0c0000
1102     ldr     r2, [r2]
1103     bic     r0, r0, #1
1104     m_write32_gen
1105     bx      lr
1106
1107
1108 m_m68k_write32_wordram0_1M_b1:           @ 0x200000 - 0x21ffff
1109     ldr     r2, =(Pico+0x22200)
1110     sub     r0, r0, #0x120000           @ map to our offset, which is 0x0e0000
1111     ldr     r2, [r2]
1112     bic     r0, r0, #1
1113     m_write32_gen
1114     bx      lr
1115
1116
1117 m_m68k_write32_wordram1_1M_b0:           @ 0x220000 - 0x23ffff, cell arranged
1118     tst     r0, #2
1119     bne     m_m68k_write32_wordram1_1M_b0_unal
1120     mov     r3, r1
1121     cell_map
1122     ldr     r2, =(Pico+0x22200)
1123     add     r0, r0, #0x0c0000
1124     ldr     r2, [r2]
1125     bic     r0, r0, #1
1126     mov     r1, r3
1127     m_write32_gen
1128     bx      lr
1129 m_m68k_write32_wordram1_1M_b0_unal:
1130     @ hopefully this doesn't happen too often
1131     add     r12,r0, #2
1132     mov     r1, r1, ror #16
1133     stmfd   sp!,{lr}
1134     bl      m_m68k_write16_wordram1_1M_b0 @ must not trash r12 and keep data in r3
1135     ldmfd   sp!,{lr}
1136     mov     r0, r12
1137     mov     r1, r3, lsr #16
1138     b       m_m68k_write16_wordram1_1M_b0
1139
1140
1141 m_m68k_write32_wordram1_1M_b1:           @ 0x220000 - 0x23ffff, cell arranged
1142     tst     r0, #2
1143     bne     m_m68k_write32_wordram1_1M_b1_unal
1144     mov     r3, r1
1145     cell_map
1146     ldr     r2, =(Pico+0x22200)
1147     add     r0, r0, #0x0e0000
1148     ldr     r2, [r2]
1149     bic     r0, r0, #1
1150     mov     r1, r3
1151     m_write32_gen
1152     bx      lr
1153 m_m68k_write32_wordram1_1M_b1_unal:
1154     add     r12,r0, #2
1155     mov     r1, r1, ror #16
1156     stmfd   sp!,{lr}
1157     bl      m_m68k_write16_wordram1_1M_b1 @ same as above
1158     ldmfd   sp!,{lr}
1159     mov     r0, r12
1160     mov     r1, r3, lsr #16
1161     b       m_m68k_write16_wordram1_1M_b1
1162
1163
1164 @ it is not very practical to use long access on hw registers, so I assume it is not used too much.
1165 m_m68k_write32_system_io:
1166     bic     r2, r0, #0xfe0000
1167     bic     r2, r2, #0x3f
1168     cmp     r2, #0x012000
1169     bne     m_m68k_write32_misc
1170     and     r2, r0, #0x3e
1171     cmp     r2, #0x10
1172     blt     m_m68k_write32_regs
1173     cmp     r2, #0x20
1174     bxge    lr
1175     @ Handle the 0x10-0x1f range
1176     ldr     r0, =(Pico+0x22200)
1177     mov     r3, #0xff
1178     ldr     r0, [r0]
1179     orr     r3, r3, r3, lsl #16
1180     add     r0, r0, #0x110000
1181     and     r12,r3, r1, ror #16       @ data is big-endian to be written as little, have to byteswap
1182     and     r1, r3, r1, ror #24
1183     orr     r1, r1, r12,lsl #8        @ end of byteswap
1184     strh    r1, [r2, r0]!
1185     cmp     r2, #0x1e
1186     movne   r1, r1, lsr #16
1187     strneh  r1, [r2, #2]
1188     bx      lr
1189
1190 m_m68k_write32_regs:
1191     stmfd   sp!,{r0,r1,lr}
1192     mov     r1, r1, lsr #24
1193     bl      m68k_reg_write8
1194     ldr     r0, [sp]
1195     ldr     r1, [sp, #4]
1196     add     r0, r0, #1
1197     mov     r1, r1, lsr #16
1198     bl      m68k_reg_write8
1199     ldr     r0, [sp]
1200     ldr     r1, [sp, #4]
1201     add     r0, r0, #2
1202     mov     r1, r1, lsr #8
1203     bl      m68k_reg_write8
1204     ldmfd   sp!,{r0,r1,lr}
1205     add     r0, r0, #3
1206     b       m68k_reg_write8
1207
1208 m_m68k_write32_misc:
1209     stmfd   sp!,{r0,r1,lr}
1210     mov     r1, r1, lsr #16
1211     bl      OtherWrite16
1212     ldmfd   sp!,{r0,r1,lr}
1213     add     r0, r0, #2
1214     b       OtherWrite16
1215
1216
1217 m_m68k_write32_vdp:
1218     tst     r0, #0x70000
1219     tsteq   r0, #0x000e0
1220     bxne    lr              @ invalid
1221     stmfd   sp!,{r0,r1,lr}
1222     mov     r1, r1, lsr #16
1223     bl      PicoVideoWrite
1224     ldmfd   sp!,{r0,r1,lr}
1225     add     r0, r0, #2
1226     b       PicoVideoWrite
1227
1228
1229 m_m68k_write32_ram:
1230     ldr     r2, =Pico
1231     bic     r0, r0, #0xff0000
1232     bic     r0, r0, #1
1233     m_write32_gen
1234     bx      lr
1235
1236 .pool
1237
1238
1239 @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1240
1241
1242 m_s68k_read8_prg:                       @ 0x000000 - 0x07ffff
1243     ldr     r1, =(Pico+0x22200)
1244     eor     r0, r0, #1
1245     ldr     r1, [r1]
1246     add     r0, r0, #0x020000           @ map to our address
1247     ldrb    r0, [r1, r0]
1248     bx      lr
1249
1250
1251 m_s68k_read8_wordram_2M:                @ 0x080000 - 0x0bffff
1252     ldr     r1, =(Pico+0x22200)
1253     eor     r0, r0, #1
1254     ldr     r1, [r1]
1255     add     r0, r0, #0x020000           @ map to our address (0x0a0000)
1256     ldrb    r0, [r1, r0]
1257     bx      lr
1258
1259
1260 m_s68k_read8_wordram_2M_decode_b0:      @ 0x080000 - 0x0bffff
1261 m_s68k_read8_wordram_2M_decode_b1:      @ 0x080000 - 0x0bffff
1262     mov     r0, #0
1263     bx      lr @ TODO
1264
1265
1266 m_s68k_read8_wordram_1M_b0:             @ 0x0c0000 - 0x0dffff (same as our offset :)
1267     ldr     r1, =(Pico+0x22200)
1268     ldr     r1, [r1]
1269     eor     r0, r0, #1
1270     ldrb    r0, [r1, r0]
1271     bx      lr
1272
1273
1274 m_s68k_read8_wordram_1M_b1:             @ 0x0c0000 - 0x0dffff
1275     ldr     r1, =(Pico+0x22200)
1276     add     r0, r0, #0x020000           @ map to our offset, which is 0x0e0000
1277     ldr     r1, [r1]
1278     eor     r0, r0, #1
1279     ldrb    r0, [r1, r0]
1280     bx      lr
1281
1282
1283 m_s68k_read8_backup:                    @ 0xfe0000 - 0xfe3fff (repeated?)
1284     @ must not trash r3 and r12
1285     ldr     r1, =(Pico+0x22200)
1286     mov     r0, r0, lsr #1
1287     ldr     r1, [r1]
1288     bic     r0, r0, #0xff0000
1289     bic     r0, r0, #0x00fe00
1290     add     r1, r1, #0x110000
1291     add     r1, r1, #0x000200
1292     ldrb    r0, [r1, r0]
1293     bx      lr
1294
1295
1296 m_s68k_read8_pcm:
1297     @ must not trash r3 and r12
1298     ldr     r1, =(Pico+0x22200)
1299     bic     r0, r0, #0xff0000
1300 @    bic     r0, r0, #0x008000
1301     ldr     r1, [r1]
1302     mov     r2, #0x110000
1303     orr     r2, r2, #0x002200
1304     cmp     r0, #0x2000
1305     bge     m_s68k_read8_pcm_ram
1306     cmp     r0, #0x20
1307     movlt   r0, #0
1308     bxlt    lr
1309     orr     r2, r2, #(0x48+8)           @ pcm.ch + addr_offset
1310     add     r1, r1, r2
1311     and     r2, r0, #0x1c
1312     ldr     r1, [r1, r2, lsl #2]
1313     tst     r0, #2
1314     moveq   r0, r1, lsr #PCM_STEP_SHIFT
1315     movne   r0, r1, lsr #(PCM_STEP_SHIFT+8)
1316     and     r0, r0, #0xff
1317     bx      lr
1318
1319 m_s68k_read8_pcm_ram:
1320     orr     r2, r2, #0x40
1321     ldr     r2, [r1, r2]
1322     add     r1, r1, #0x100000           @ pcm_ram
1323     and     r2, r2, #0x0f000000         @ bank
1324     add     r1, r1, r2, lsr #12
1325     bic     r0, r0, #0x00e000
1326     mov     r0, r0, lsr #1
1327     ldrb    r0, [r1, r0]
1328     bx      lr
1329
1330
1331 m_s68k_read8_regs:
1332     bic     r0, r0, #0xff0000
1333     bic     r0, r0, #0x008000
1334     tst     r0, #0x7e00
1335     movne   r0, #0
1336     bxne    lr
1337     sub     r2, r0, #0x58
1338     cmp     r2, #0x10
1339     ldrlo   r2, =gfx_cd_read
1340     ldrhs   r2, =s68k_reg_read16
1341     stmfd   sp!,{r0,lr}
1342     bic     r0, r0, #1
1343     mov     lr, pc
1344     bx      r2
1345     ldmfd   sp!,{r1,lr}
1346     tst     r1, #1
1347     moveq   r0, r0, lsr #8
1348     and     r0, r0, #0xff
1349     bx      lr
1350
1351
1352 @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1353
1354
1355 m_s68k_read16_prg:                      @ 0x000000 - 0x07ffff
1356     ldr     r1, =(Pico+0x22200)
1357     bic     r0, r0, #1
1358     ldr     r1, [r1]
1359     add     r0, r0, #0x020000           @ map to our address
1360     ldrh    r0, [r1, r0]
1361     bx      lr
1362
1363
1364 m_s68k_read16_wordram_2M:               @ 0x080000 - 0x0bffff
1365     ldr     r1, =(Pico+0x22200)
1366     bic     r0, r0, #1
1367     ldr     r1, [r1]
1368     add     r0, r0, #0x020000           @ map to our address (0x0a0000)
1369     ldrh    r0, [r1, r0]
1370     bx      lr
1371
1372
1373 m_s68k_read16_wordram_2M_decode_b0:     @ 0x080000 - 0x0bffff
1374 m_s68k_read16_wordram_2M_decode_b1:     @ 0x080000 - 0x0bffff
1375     mov     r0, #0
1376     bx      lr @ TODO
1377
1378
1379 m_s68k_read16_wordram_1M_b0:            @ 0x0c0000 - 0x0dffff (same as our offset :)
1380     ldr     r1, =(Pico+0x22200)
1381     ldr     r1, [r1]
1382     bic     r0, r0, #1
1383     ldrh    r0, [r1, r0]
1384     bx      lr
1385
1386
1387 m_s68k_read16_wordram_1M_b1:            @ 0x0c0000 - 0x0dffff
1388     ldr     r1, =(Pico+0x22200)
1389     add     r0, r0, #0x020000           @ map to our offset, which is 0x0e0000
1390     ldr     r1, [r1]
1391     bic     r0, r0, #1
1392     ldrh    r0, [r1, r0]
1393     bx      lr
1394
1395
1396 @ m_s68k_read16_backup:                 @ 0xfe0000 - 0xfe3fff (repeated?)
1397 @ bram is not meant to be accessed by words, does any game do this?
1398 .equiv m_s68k_read16_backup, m_s68k_read8_backup
1399
1400
1401 @ m_s68k_read16_pcm:
1402 @ pcm is on 8-bit bus, would this be same as byte access?
1403 .equiv m_s68k_read16_pcm, m_s68k_read8_pcm
1404
1405
1406 m_s68k_read16_regs:
1407     bic     r0, r0, #0xff0000
1408     bic     r0, r0, #0x008000
1409     bic     r0, r0, #0x000001
1410     tst     r0, #0x7e00
1411     movne   r0, #0
1412     bxne    lr
1413     sub     r2, r0, #0x58
1414     cmp     r2, #0x10
1415     blo     gfx_cd_read
1416     b       s68k_reg_read16
1417
1418
1419 @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1420
1421
1422 m_s68k_read32_prg:                      @ 0x000000 - 0x07ffff
1423     ldr     r1, =(Pico+0x22200)
1424     bic     r0, r0, #1
1425     ldr     r1, [r1]
1426     add     r0, r0, #0x020000           @ map to our address
1427     m_read32_gen
1428     bx      lr
1429
1430
1431 m_s68k_read32_wordram_2M:               @ 0x080000 - 0x0bffff
1432     ldr     r1, =(Pico+0x22200)
1433     bic     r0, r0, #1
1434     ldr     r1, [r1]
1435     add     r0, r0, #0x020000           @ map to our address (0x0a0000)
1436     m_read32_gen
1437     bx      lr
1438
1439
1440 m_s68k_read32_wordram_2M_decode_b0:     @ 0x080000 - 0x0bffff
1441 m_s68k_read32_wordram_2M_decode_b1:     @ 0x080000 - 0x0bffff
1442     mov     r0, #0
1443     bx      lr @ TODO
1444
1445
1446 m_s68k_read32_wordram_1M_b0:            @ 0x0c0000 - 0x0dffff (same as our offset :)
1447     ldr     r1, =(Pico+0x22200)
1448     ldr     r1, [r1]
1449     bic     r0, r0, #1
1450     m_read32_gen
1451     bx      lr
1452
1453
1454 m_s68k_read32_wordram_1M_b1:            @ 0x0c0000 - 0x0dffff
1455     ldr     r1, =(Pico+0x22200)
1456     add     r0, r0, #0x020000           @ map to our offset, which is 0x0e0000
1457     ldr     r1, [r1]
1458     bic     r0, r0, #1
1459     m_read32_gen
1460     bx      lr
1461
1462
1463 m_s68k_read32_backup:                   @ 0xfe0000 - 0xfe3fff (repeated?)
1464     @ bram is not meant to be accessed by words, does any game do this?
1465     mov     r12,lr
1466     mov     r3, r0
1467     bl      m_s68k_read8_backup         @ must preserve r3 and r12
1468     mov     r1, r0
1469     add     r0, r3, #2
1470     mov     r3, r1
1471     bl      m_s68k_read8_backup
1472     orr     r0, r0, r3, lsl #16
1473     bx      r12
1474
1475
1476 m_s68k_read32_pcm:
1477     mov     r12,lr
1478     mov     r3, r0
1479     bl      m_s68k_read8_pcm            @ must preserve r3 and r12
1480     mov     r1, r0
1481     add     r0, r3, #2
1482     mov     r3, r1
1483     bl      m_s68k_read8_pcm
1484     orr     r0, r0, r3, lsl #16
1485     bx      r12
1486
1487
1488 m_s68k_read32_regs:
1489     bic     r0, r0, #0xff0000
1490     bic     r0, r0, #0x008000
1491     bic     r0, r0, #0x000001
1492     tst     r0, #0x7e00
1493     movne   r0, #0
1494     bxne    lr
1495     sub     r2, r0, #0x58
1496     cmp     r2, #0x10
1497     add     r1, r0, #2
1498     blo     m_s68k_read32_regs_gfx
1499     stmfd   sp!,{r1,lr}
1500     bl      s68k_reg_read16
1501     swp     r0, r0, [sp]
1502     bl      s68k_reg_read16
1503     ldmfd   sp!,{r1,lr}
1504     orr     r0, r0, r1, lsl #16
1505     bx      lr
1506
1507
1508 m_s68k_read32_regs_gfx:
1509     stmfd   sp!,{r1,lr}
1510     bl      gfx_cd_read
1511     swp     r0, r0, [sp]
1512     bl      gfx_cd_read
1513     ldmfd   sp!,{r1,lr}
1514     orr     r0, r0, r1, lsl #16
1515     bx      lr
1516
1517 .pool
1518
1519 @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1520
1521
1522 m_s68k_write8_prg:                      @ 0x000000 - 0x07ffff
1523     ldr     r2, =(Pico+0x22200)
1524     eor     r0, r0, #1
1525     ldr     r2, [r2]
1526     add     r0, r0, #0x020000           @ map to our address
1527     strb    r1, [r2, r0]
1528     bx      lr
1529
1530
1531 m_s68k_write8_wordram_2M:               @ 0x080000 - 0x0bffff
1532     ldr     r2, =(Pico+0x22200)
1533     eor     r0, r0, #1
1534     ldr     r2, [r2]
1535     add     r0, r0, #0x020000           @ map to our address (0x0a0000)
1536     strb    r1, [r2, r0]
1537     bx      lr
1538
1539
1540 m_s68k_write8_wordram_2M_decode_b0:     @ 0x080000 - 0x0bffff
1541 m_s68k_write8_wordram_2M_decode_b1:     @ 0x080000 - 0x0bffff
1542     bx      lr @ TODO
1543
1544
1545 m_s68k_write8_wordram_1M_b0:            @ 0x0c0000 - 0x0dffff (same as our offset :)
1546     ldr     r2, =(Pico+0x22200)
1547     ldr     r2, [r2]
1548     eor     r0, r0, #1
1549     strb    r1, [r2, r0]
1550     bx      lr
1551
1552
1553 m_s68k_write8_wordram_1M_b1:            @ 0x0c0000 - 0x0dffff
1554     ldr     r2, =(Pico+0x22200)
1555     add     r0, r0, #0x020000           @ map to our offset, which is 0x0e0000
1556     ldr     r2, [r2]
1557     eor     r0, r0, #1
1558     strb    r1, [r2, r0]
1559     bx      lr
1560
1561
1562 m_s68k_write8_backup:                   @ 0xfe0000 - 0xfe3fff (repeated?)
1563     @ must not trash r3 and r12
1564     ldr     r2, =(Pico+0x22200)
1565     mov     r0, r0, lsr #1
1566     ldr     r2, [r2]
1567     bic     r0, r0, #0xff0000
1568     bic     r0, r0, #0x00fe00
1569     add     r2, r2, #0x110000
1570     add     r2, r2, #0x000200
1571     strb    r1, [r2, r0]
1572     ldr     r1, =SRam
1573     mov     r0, #1
1574     str     r0, [r1, #0x0e]             @ SRam.changed = 1
1575     bx      lr
1576
1577
1578 m_s68k_write8_pcm:
1579     bic     r0, r0, #0xff0000
1580     cmp     r0, #0x12
1581     movlt   r0, r0, lsr #1
1582     blt     pcm_write
1583
1584     cmp     r0, #0x2000
1585     bxlt    lr
1586
1587 m_s68k_write8_pcm_ram:
1588     ldr     r3, =(Pico+0x22200)
1589     bic     r0, r0, #0x00e000
1590     ldr     r3, [r3]
1591     mov     r0, r0, lsr #1
1592     add     r2, r3, #0x110000
1593     add     r2, r2, #0x002200
1594     add     r2, r2, #0x000040
1595     ldr     r2, [r2]
1596     add     r3, r3, #0x100000           @ pcm_ram
1597     and     r2, r2, #0x0f000000         @ bank
1598     add     r3, r3, r2, lsr #12
1599     strb    r1, [r3, r0]
1600     bx      lr
1601
1602
1603 m_s68k_write8_regs:
1604     bic     r0, r0, #0xff0000
1605     bic     r0, r0, #0x008000
1606     tst     r0, #0x7e00
1607     movne   r0, #0
1608     bxne    lr
1609     sub     r2, r0, #0x58
1610     cmp     r2, #0x10
1611     blo     gfx_cd_write
1612     b       s68k_reg_write8
1613
1614
1615 @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1616
1617
1618 m_s68k_write16_prg:                     @ 0x000000 - 0x07ffff
1619     ldr     r2, =(Pico+0x22200)
1620     bic     r0, r0, #1
1621     ldr     r2, [r2]
1622     add     r0, r0, #0x020000           @ map to our address
1623     strh    r1, [r2, r0]
1624     bx      lr
1625
1626
1627 m_s68k_write16_wordram_2M:              @ 0x080000 - 0x0bffff
1628     ldr     r2, =(Pico+0x22200)
1629     bic     r0, r0, #1
1630     ldr     r2, [r2]
1631     add     r0, r0, #0x020000           @ map to our address (0x0a0000)
1632     strh    r1, [r2, r0]
1633     bx      lr
1634
1635
1636 m_s68k_write16_wordram_2M_decode_b0:    @ 0x080000 - 0x0bffff
1637 m_s68k_write16_wordram_2M_decode_b1:    @ 0x080000 - 0x0bffff
1638     bx      lr @ TODO
1639
1640
1641 m_s68k_write16_wordram_1M_b0:           @ 0x0c0000 - 0x0dffff (same as our offset :)
1642     ldr     r2, =(Pico+0x22200)
1643     ldr     r2, [r2]
1644     bic     r0, r0, #1
1645     strh    r1, [r2, r0]
1646     bx      lr
1647
1648
1649 m_s68k_write16_wordram_1M_b1:           @ 0x0c0000 - 0x0dffff
1650     ldr     r2, =(Pico+0x22200)
1651     add     r0, r0, #0x020000           @ map to our offset, which is 0x0e0000
1652     ldr     r2, [r2]
1653     bic     r0, r0, #1
1654     strh    r1, [r2, r0]
1655     bx      lr
1656
1657
1658 @ m_s68k_write16_backup:
1659 .equiv m_s68k_write16_backup, m_s68k_write8_backup
1660
1661
1662 @ m_s68k_write16_pcm:
1663 .equiv m_s68k_write16_pcm, m_s68k_write8_pcm
1664
1665
1666 m_s68k_write16_regs:
1667     bic     r0, r0, #0xff0000
1668     bic     r0, r0, #0x008000
1669     tst     r0, #0x7e00
1670     movne   r0, #0
1671     bxne    lr
1672     sub     r2, r0, #0x58
1673     cmp     r2, #0x10
1674     and     r3, r1, #0xff
1675     add     r2, r0, #1
1676     blo     m_s68k_write16_regs_gfx
1677     stmfd   sp!,{r2,r3,lr}
1678     mov     r1, r1, lsr #8
1679     bl      s68k_reg_write8
1680     ldmfd   sp!,{r0,r1,lr}
1681     b       s68k_reg_write8
1682
1683 m_s68k_write16_regs_gfx:
1684     stmfd   sp!,{r2,r3,lr}
1685     mov     r1, r1, lsr #8
1686     bl      gfx_cd_write
1687     ldmfd   sp!,{r0,r1,lr}
1688     b       gfx_cd_write
1689
1690
1691 @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1692
1693
1694 m_s68k_write32_prg:                     @ 0x000000 - 0x07ffff
1695     ldr     r2, =(Pico+0x22200)
1696     bic     r0, r0, #1
1697     ldr     r2, [r2]
1698     add     r0, r0, #0x020000           @ map to our address
1699     m_write32_gen
1700     bx      lr
1701
1702
1703 m_s68k_write32_wordram_2M:              @ 0x080000 - 0x0bffff
1704     ldr     r2, =(Pico+0x22200)
1705     bic     r0, r0, #1
1706     ldr     r2, [r2]
1707     add     r0, r0, #0x020000           @ map to our address (0x0a0000)
1708     m_write32_gen
1709     bx      lr
1710
1711
1712 m_s68k_write32_wordram_2M_decode_b0:    @ 0x080000 - 0x0bffff
1713 m_s68k_write32_wordram_2M_decode_b1:    @ 0x080000 - 0x0bffff
1714     bx      lr @ TODO
1715
1716
1717 m_s68k_write32_wordram_1M_b0:           @ 0x0c0000 - 0x0dffff (same as our offset :)
1718     ldr     r2, =(Pico+0x22200)
1719     ldr     r2, [r2]
1720     bic     r0, r0, #1
1721     m_write32_gen
1722     bx      lr
1723
1724
1725 m_s68k_write32_wordram_1M_b1:           @ 0x0c0000 - 0x0dffff
1726     ldr     r2, =(Pico+0x22200)
1727     add     r0, r0, #0x020000           @ map to our offset, which is 0x0e0000
1728     ldr     r2, [r2]
1729     bic     r0, r0, #1
1730     m_write32_gen
1731     bx      lr
1732
1733
1734 m_s68k_write32_backup:
1735     add     r12,r0, #2
1736     mov     r3, r1
1737     mov     r1, r1, lsr #16
1738     stmfd   sp!,{lr}
1739     bl      m_s68k_write8_backup        @ must preserve r3 and r12
1740     ldmfd   sp!,{lr}
1741     mov     r0, r12
1742     mov     r1, r3
1743     b       m_s68k_write8_backup
1744
1745
1746 m_s68k_write32_pcm:
1747     bic     r0, r0, #0xff0000
1748     cmp     r0, #0x12
1749     blt     m_s68k_write32_pcm_reg
1750
1751     cmp     r0, #0x2000
1752     bxlt    lr
1753
1754 m_s68k_write32_pcm_ram:
1755     ldr     r3, =(Pico+0x22200)
1756     bic     r0, r0, #0x00e000
1757     ldr     r3, [r3]
1758     mov     r0, r0, lsr #1
1759     add     r2, r3, #0x110000
1760     add     r2, r2, #0x002200
1761     add     r2, r2, #0x000040
1762     ldr     r2, [r2]
1763     add     r3, r3, #0x100000           @ pcm_ram
1764     and     r2, r2, #0x0f000000         @ bank
1765     add     r3, r3, r2, lsr #12
1766     mov     r1, r1, ror #16
1767     strb    r1, [r3, r0]!
1768     mov     r1, r1, ror #16
1769     strb    r1, [r3]
1770     bx      lr
1771
1772 m_s68k_write32_pcm_reg:
1773     mov     r0, r0, lsr #1
1774     add     r2, r0, #1
1775     mov     r3, r1
1776     stmfd   sp!,{r2,r3,lr}
1777     mov     r1, r1, lsr #16
1778     bl      pcm_write
1779     ldmfd   sp!,{r0,r1,lr}
1780     b       pcm_write
1781
1782
1783 m_s68k_write32_regs:
1784     bic     r0, r0, #0xff0000
1785     bic     r0, r0, #0x008000
1786     tst     r0, #0x7e00
1787     movne   r0, #0
1788     bxne    lr
1789     sub     r2, r0, #0x58
1790     cmp     r2, #0x10
1791     blo     m_s68k_write32_regs_gfx
1792
1793     stmfd   sp!,{r0,r1,lr}
1794     mov     r1, r1, lsr #24
1795     bl      s68k_reg_write8
1796     ldr     r0, [sp]
1797     ldr     r1, [sp, #4]
1798     add     r0, r0, #1
1799     mov     r1, r1, lsr #16
1800     bl      s68k_reg_write8
1801     ldr     r0, [sp]
1802     ldr     r1, [sp, #4]
1803     add     r0, r0, #2
1804     mov     r1, r1, lsr #8
1805     bl      s68k_reg_write8
1806     ldmfd   sp!,{r0,r1,lr}
1807     add     r0, r0, #3
1808     b       s68k_reg_write8
1809
1810 m_s68k_write32_regs_gfx:
1811     stmfd   sp!,{r0,r1,lr}
1812     mov     r1, r1, lsr #24
1813     bl      gfx_cd_write
1814     ldr     r0, [sp]
1815     ldr     r1, [sp, #4]
1816     add     r0, r0, #1
1817     mov     r1, r1, lsr #16
1818     bl      gfx_cd_write
1819     ldr     r0, [sp]
1820     ldr     r1, [sp, #4]
1821     add     r0, r0, #2
1822     mov     r1, r1, lsr #8
1823     bl      gfx_cd_write
1824     ldmfd   sp!,{r0,r1,lr}
1825     add     r0, r0, #3
1826     b       gfx_cd_write
1827