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