large ROM hack fix (up to 10MB now)
[picodrive.git] / Pico / Memory.s
1 @ vim:filetype=armasm\r
2 \r
3 @ memory handlers with banking support for SSF II - The New Challengers\r
4 @ mostly based on Gens code\r
5 \r
6 @ (c) Copyright 2006-2007, Grazvydas "notaz" Ignotas\r
7 @ All Rights Reserved\r
8 \r
9 \r
10 \r
11 .text\r
12 \r
13 @ default jump tables\r
14 \r
15 m_read8_def_table:\r
16     .long   m_read8_rom0    @ 0x000000 - 0x07FFFF\r
17     .long   m_read8_rom1    @ 0x080000 - 0x0FFFFF\r
18     .long   m_read8_rom2    @ 0x100000 - 0x17FFFF\r
19     .long   m_read8_rom3    @ 0x180000 - 0x1FFFFF\r
20     .long   m_read8_rom4    @ 0x200000 - 0x27FFFF\r
21     .long   m_read8_rom5    @ 0x280000 - 0x2FFFFF\r
22     .long   m_read8_rom6    @ 0x300000 - 0x37FFFF\r
23     .long   m_read8_rom7    @ 0x380000 - 0x3FFFFF\r
24     .long   m_read8_rom8    @ 0x400000 - 0x47FFFF - for all those large ROM hacks\r
25     .long   m_read8_rom9    @ 0x480000 - 0x4FFFFF\r
26     .long   m_read8_romA    @ 0x500000 - 0x57FFFF\r
27     .long   m_read8_romB    @ 0x580000 - 0x5FFFFF\r
28     .long   m_read8_romC    @ 0x600000 - 0x67FFFF\r
29     .long   m_read8_romD    @ 0x680000 - 0x6FFFFF\r
30     .long   m_read8_romE    @ 0x700000 - 0x77FFFF\r
31     .long   m_read8_romF    @ 0x780000 - 0x7FFFFF\r
32     .long   m_read8_rom10   @ 0x800000 - 0x87FFFF\r
33     .long   m_read8_rom11   @ 0x880000 - 0x8FFFFF\r
34     .long   m_read8_rom12   @ 0x900000 - 0x97FFFF\r
35     .long   m_read8_rom13   @ 0x980000 - 0x9FFFFF\r
36     .long   m_read8_misc    @ 0xA00000 - 0xA7FFFF\r
37     .long   m_read_null     @ 0xA80000 - 0xAFFFFF\r
38     .long   m_read_null     @ 0xB00000 - 0xB7FFFF\r
39     .long   m_read_null     @ 0xB80000 - 0xBFFFFF\r
40     .long   m_read8_vdp     @ 0xC00000 - 0xC7FFFF\r
41     .long   m_read8_vdp     @ 0xC80000 - 0xCFFFFF\r
42     .long   m_read_null     @ 0xD00000 - 0xD7FFFF\r
43     .long   m_read_null     @ 0xD80000 - 0xDFFFFF\r
44     .long   m_read8_ram     @ 0xE00000 - 0xE7FFFF\r
45     .long   m_read8_ram     @ 0xE80000 - 0xEFFFFF\r
46     .long   m_read8_ram     @ 0xF00000 - 0xF7FFFF\r
47     .long   m_read8_ram     @ 0xF80000 - 0xFFFFFF\r
48 \r
49 m_read16_def_table:\r
50     .long   m_read16_rom0    @ 0x000000 - 0x07FFFF\r
51     .long   m_read16_rom1    @ 0x080000 - 0x0FFFFF\r
52     .long   m_read16_rom2    @ 0x100000 - 0x17FFFF\r
53     .long   m_read16_rom3    @ 0x180000 - 0x1FFFFF\r
54     .long   m_read16_rom4    @ 0x200000 - 0x27FFFF\r
55     .long   m_read16_rom5    @ 0x280000 - 0x2FFFFF\r
56     .long   m_read16_rom6    @ 0x300000 - 0x37FFFF\r
57     .long   m_read16_rom7    @ 0x380000 - 0x3FFFFF\r
58     .long   m_read16_rom8    @ 0x400000 - 0x47FFFF\r
59     .long   m_read16_rom9    @ 0x480000 - 0x4FFFFF\r
60     .long   m_read16_romA    @ 0x500000 - 0x57FFFF\r
61     .long   m_read16_romB    @ 0x580000 - 0x5FFFFF\r
62     .long   m_read16_romC    @ 0x600000 - 0x67FFFF\r
63     .long   m_read16_romD    @ 0x680000 - 0x6FFFFF\r
64     .long   m_read16_romE    @ 0x700000 - 0x77FFFF\r
65     .long   m_read16_romF    @ 0x780000 - 0x7FFFFF\r
66     .long   m_read16_rom10   @ 0x800000 - 0x87FFFF\r
67     .long   m_read16_rom11   @ 0x880000 - 0x8FFFFF\r
68     .long   m_read16_rom12   @ 0x900000 - 0x97FFFF\r
69     .long   m_read16_rom13   @ 0x980000 - 0x9FFFFF\r
70     .long   m_read16_misc    @ 0xA00000 - 0xA7FFFF\r
71     .long   m_read_null      @ 0xA80000 - 0xAFFFFF\r
72     .long   m_read_null      @ 0xB00000 - 0xB7FFFF\r
73     .long   m_read_null      @ 0xB80000 - 0xBFFFFF\r
74     .long   m_read16_vdp     @ 0xC00000 - 0xC7FFFF\r
75     .long   m_read_null      @ 0xC80000 - 0xCFFFFF\r
76     .long   m_read_null      @ 0xD00000 - 0xD7FFFF\r
77     .long   m_read_null      @ 0xD80000 - 0xDFFFFF\r
78     .long   m_read16_ram     @ 0xE00000 - 0xE7FFFF\r
79     .long   m_read16_ram     @ 0xE80000 - 0xEFFFFF\r
80     .long   m_read16_ram     @ 0xF00000 - 0xF7FFFF\r
81     .long   m_read16_ram     @ 0xF80000 - 0xFFFFFF\r
82 \r
83 m_read32_def_table:\r
84     .long   m_read32_rom0    @ 0x000000 - 0x07FFFF\r
85     .long   m_read32_rom1    @ 0x080000 - 0x0FFFFF\r
86     .long   m_read32_rom2    @ 0x100000 - 0x17FFFF\r
87     .long   m_read32_rom3    @ 0x180000 - 0x1FFFFF\r
88     .long   m_read32_rom4    @ 0x200000 - 0x27FFFF\r
89     .long   m_read32_rom5    @ 0x280000 - 0x2FFFFF\r
90     .long   m_read32_rom6    @ 0x300000 - 0x37FFFF\r
91     .long   m_read32_rom7    @ 0x380000 - 0x3FFFFF\r
92     .long   m_read32_rom8    @ 0x400000 - 0x47FFFF\r
93     .long   m_read32_rom9    @ 0x480000 - 0x4FFFFF\r
94     .long   m_read32_romA    @ 0x500000 - 0x57FFFF\r
95     .long   m_read32_romB    @ 0x580000 - 0x5FFFFF\r
96     .long   m_read32_romC    @ 0x600000 - 0x67FFFF\r
97     .long   m_read32_romD    @ 0x680000 - 0x6FFFFF\r
98     .long   m_read32_romE    @ 0x700000 - 0x77FFFF\r
99     .long   m_read32_romF    @ 0x780000 - 0x7FFFFF\r
100     .long   m_read32_rom10   @ 0x800000 - 0x87FFFF\r
101     .long   m_read32_rom11   @ 0x880000 - 0x8FFFFF\r
102     .long   m_read32_rom12   @ 0x900000 - 0x97FFFF\r
103     .long   m_read32_rom13   @ 0x980000 - 0x9FFFFF\r
104     .long   m_read32_misc    @ 0xA00000 - 0xA7FFFF\r
105     .long   m_read_null      @ 0xA80000 - 0xAFFFFF\r
106     .long   m_read_null      @ 0xB00000 - 0xB7FFFF\r
107     .long   m_read_null      @ 0xB80000 - 0xBFFFFF\r
108     .long   m_read32_vdp     @ 0xC00000 - 0xC7FFFF\r
109     .long   m_read_null      @ 0xC80000 - 0xCFFFFF\r
110     .long   m_read_null      @ 0xD00000 - 0xD7FFFF\r
111     .long   m_read_null      @ 0xD80000 - 0xDFFFFF\r
112     .long   m_read32_ram     @ 0xE00000 - 0xE7FFFF\r
113     .long   m_read32_ram     @ 0xE80000 - 0xEFFFFF\r
114     .long   m_read32_ram     @ 0xF00000 - 0xF7FFFF\r
115     .long   m_read32_ram     @ 0xF80000 - 0xFFFFFF\r
116 \r
117 \r
118 @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\r
119 \r
120 .bss\r
121 @.section .bss, "brw"\r
122 @.data\r
123 \r
124 @ used tables\r
125 m_read8_table:\r
126     .skip 32*4\r
127 \r
128 m_read16_table:\r
129     .skip 32*4\r
130 \r
131 m_read32_table:\r
132     .skip 32*4\r
133 \r
134 \r
135 @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\r
136 \r
137 .text\r
138 \r
139 .global PicoMemReset\r
140 .global PicoRead8\r
141 .global PicoRead16\r
142 .global PicoRead32\r
143 .global PicoWriteRomHW_SSF2\r
144 \r
145 \r
146 PicoMemReset:\r
147     ldr     r12,=(Pico+0x22204)\r
148     ldr     r12,[r12]                @ romsize\r
149     add     r12,r12,#0x80000\r
150     sub     r12,r12,#1\r
151     mov     r12,r12,lsr #19\r
152 \r
153     ldr     r0, =m_read8_table\r
154     ldr     r1, =m_read8_def_table\r
155     mov     r2, #32\r
156 1:\r
157     ldr     r3, [r1], #4\r
158     str     r3, [r0], #4\r
159     subs    r2, r2, #1\r
160     bne     1b\r
161 \r
162     ldr     r0, =m_read16_table\r
163     ldr     r1, =m_read16_def_table\r
164     mov     r2, #32\r
165 1:\r
166     subs    r2, r2, #1\r
167     ldr     r3, [r1], #4\r
168     str     r3, [r0], #4\r
169     bne     1b\r
170 \r
171     ldr     r0, =m_read32_table\r
172     ldr     r1, =m_read32_def_table\r
173     mov     r2, #32\r
174 1:\r
175     subs    r2, r2, #1\r
176     ldr     r3, [r1], #4\r
177     str     r3, [r0], #4\r
178     bne     1b\r
179 \r
180     @ update memhandlers according to ROM size\r
181     ldr     r1, =m_read8_above_rom\r
182     ldr     r0, =m_read8_table\r
183     mov     r2, #16\r
184 1:\r
185     sub     r2, r2, #1\r
186     cmp     r2, r12\r
187     blt     2f\r
188     cmp     r2, #4\r
189     beq     1b                      @ do not touch the SRAM area\r
190     str     r1, [r0, r2, lsl #2]\r
191     b       1b\r
192 2:\r
193     ldr     r1, =m_read16_above_rom\r
194     ldr     r0, =m_read16_table\r
195     mov     r2, #16\r
196 1:\r
197     sub     r2, r2, #1\r
198     cmp     r2, r12\r
199     blt     2f\r
200     cmp     r2, #4\r
201     beq     1b\r
202     str     r1, [r0, r2, lsl #2]\r
203     b       1b\r
204 2:\r
205     ldr     r1, =m_read32_above_rom\r
206     ldr     r0, =m_read32_table\r
207     mov     r2, #16\r
208 1:\r
209     sub     r2, r2, #1\r
210     cmp     r2, r12\r
211     blt     2f\r
212     cmp     r2, #4\r
213     beq     1b\r
214     str     r1, [r0, r2, lsl #2]\r
215     b       1b\r
216 2:\r
217     bx      lr\r
218 \r
219 .pool\r
220 \r
221 @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\r
222 \r
223 PicoRead8: @ u32 a\r
224     ldr     r2, =m_read8_table\r
225     bic     r0, r0, #0xff000000\r
226     and     r1, r0, #0x00f80000\r
227     ldr     pc, [r2, r1, lsr #17]\r
228 \r
229 PicoRead16: @ u32 a\r
230     ldr     r2, =m_read16_table\r
231     bic     r0, r0, #0xff000000\r
232     and     r1, r0, #0x00f80000\r
233     ldr     pc, [r2, r1, lsr #17]\r
234 \r
235 PicoRead32: @ u32 a\r
236     ldr     r2, =m_read32_table\r
237     bic     r0, r0, #0xff000000\r
238     and     r1, r0, #0x00f80000\r
239     ldr     pc, [r2, r1, lsr #17]\r
240 \r
241 .pool\r
242 \r
243 @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\r
244 \r
245 m_read_null:\r
246     mov     r0, #0\r
247     bx      lr\r
248 \r
249 \r
250 .macro m_read8_rom sect\r
251     ldr     r1, =(Pico+0x22200)\r
252     bic     r0, r0, #0xf80000\r
253     ldr     r1, [r1]\r
254 .if \sect\r
255     orr     r0, r0, #0x080000*\sect\r
256 .endif\r
257     eor     r0, r0, #1\r
258     ldrb    r0, [r1, r0]\r
259     bx      lr\r
260 .endm\r
261 \r
262 \r
263 m_read8_rom0: @ 0x000000 - 0x07ffff\r
264     m_read8_rom 0\r
265 \r
266 m_read8_rom1: @ 0x080000 - 0x0fffff\r
267     m_read8_rom 1\r
268 \r
269 m_read8_rom2: @ 0x100000 - 0x17ffff\r
270     m_read8_rom 2\r
271 \r
272 m_read8_rom3: @ 0x180000 - 0x1fffff\r
273     m_read8_rom 3\r
274 \r
275 m_read8_rom4: @ 0x200000 - 0x27ffff, SRAM area\r
276     ldr     r2, =(SRam)\r
277     ldr     r3, =(Pico+0x22200)\r
278     ldr     r1, [r2, #8]    @ SRam.end\r
279     bic     r0, r0, #0xf80000\r
280     orr     r0, r0, #0x200000\r
281     cmp     r0, r1\r
282     bgt     m_read8_nosram\r
283     ldr     r1, [r2, #4]    @ SRam.start (1ci)\r
284     cmp     r0, r1\r
285     blt     m_read8_nosram\r
286     ldrb    r1, [r3, #0x11] @ Pico.m.sram_reg (1ci)\r
287     sub     r12,r0, #0x200000\r
288     tst     r1, #0x10\r
289     bne     m_read8_detected\r
290     cmp     r12,#1\r
291     ble     m_read8_detected\r
292     tst     r1, #1\r
293     orrne   r1, r1, #0x10\r
294     strneb  r1, [r3, #0x11]\r
295 m_read8_detected:\r
296     tst     r1, #4          @ EEPROM read?\r
297     ldrne   r0, =SRAMReadEEPROM @ (1ci if ne)\r
298     bxne    r0\r
299 m_read8_noteeprom:\r
300     tst     r1, #1\r
301     beq     m_read8_nosram\r
302     ldr     r3, [r2]        @ SRam.data\r
303     ldr     r2, [r2, #4]    @ SRam.start (1ci)\r
304     sub     r3, r3, r2\r
305     ldrb    r0, [r3, r0]\r
306     bx      lr\r
307 m_read8_nosram:\r
308     ldr     r1, [r3, #4]    @ 1ci\r
309     cmp     r0, r1\r
310     movgt   r0, #0\r
311     bxgt    lr              @ bad location\r
312     ldr     r1, [r3]\r
313     eor     r0, r0, #1\r
314     ldrb    r0, [r1, r0]\r
315     bx      lr\r
316 \r
317 m_read8_rom5: @ 0x280000 - 0x2fffff\r
318     m_read8_rom 5\r
319 \r
320 m_read8_rom6: @ 0x300000 - 0x37ffff\r
321     m_read8_rom 6\r
322 \r
323 m_read8_rom7: @ 0x380000 - 0x3fffff\r
324     m_read8_rom 7\r
325 \r
326 m_read8_rom8: @ 0x400000 - 0x47ffff\r
327     m_read8_rom 8\r
328 \r
329 m_read8_rom9: @ 0x480000 - 0x4fffff\r
330     m_read8_rom 9\r
331 \r
332 m_read8_romA: @ 0x500000 - 0x57ffff\r
333     m_read8_rom 0xA\r
334 \r
335 m_read8_romB: @ 0x580000 - 0x5fffff\r
336     m_read8_rom 0xB\r
337 \r
338 m_read8_romC: @ 0x600000 - 0x67ffff\r
339     m_read8_rom 0xC\r
340 \r
341 m_read8_romD: @ 0x680000 - 0x6fffff\r
342     m_read8_rom 0xD\r
343 \r
344 m_read8_romE: @ 0x700000 - 0x77ffff\r
345     m_read8_rom 0xE\r
346 \r
347 m_read8_romF: @ 0x780000 - 0x7fffff\r
348     m_read8_rom 0xF\r
349 \r
350 m_read8_rom10: @ 0x800000 - 0x87ffff\r
351     m_read8_rom 0x10\r
352 \r
353 m_read8_rom11: @ 0x880000 - 0x8fffff\r
354     m_read8_rom 0x11\r
355 \r
356 m_read8_rom12: @ 0x900000 - 0x97ffff\r
357     m_read8_rom 0x12\r
358 \r
359 m_read8_rom13: @ 0x980000 - 0x9fffff\r
360     m_read8_rom 0x13\r
361 \r
362 m_read8_misc:\r
363     bic     r2, r0, #0x00ff\r
364     bic     r2, r2, #0xbf00\r
365     cmp     r2, #0xa00000  @ Z80 RAM?\r
366     ldreq   r2, =z80Read8\r
367     bxeq    r2\r
368     stmfd   sp!,{r0,lr}\r
369     bic     r0, r0, #1\r
370     mov     r1, #8\r
371     bl      OtherRead16\r
372     ldmfd   sp!,{r1,lr}\r
373     tst     r1, #1\r
374     moveq   r0, r0, lsr #8\r
375     bx      lr\r
376 \r
377 m_read8_vdp:\r
378     tst     r0, #0x70000\r
379     tsteq   r0, #0x000e0\r
380     bxne    lr              @ invalid read\r
381     stmfd   sp!,{r0,lr}\r
382     bic     r0, r0, #1\r
383     bl      PicoVideoRead\r
384     ldmfd   sp!,{r1,lr}\r
385     tst     r1, #1\r
386     moveq   r0, r0, lsr #8\r
387     bx      lr\r
388 \r
389 m_read8_ram:\r
390     ldr     r1, =Pico\r
391     bic     r0, r0, #0xff0000\r
392     eor     r0, r0, #1\r
393     ldrb    r0, [r1, r0]\r
394     bx      lr\r
395 \r
396 m_read8_above_rom:\r
397     stmfd   sp!,{r0,lr}\r
398     bic     r0, r0, #1\r
399     mov     r1, #8\r
400     bl      OtherRead16End\r
401     ldmfd   sp!,{r1,lr}\r
402     tst     r1, #1\r
403     moveq   r0, r0, lsr #8\r
404     bx      lr\r
405 \r
406 .pool\r
407 \r
408 @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\r
409 \r
410 .macro m_read16_rom sect\r
411     ldr     r1, =(Pico+0x22200)\r
412     bic     r0, r0, #0xf80000\r
413     ldr     r1, [r1]\r
414     bic     r0, r0, #1\r
415 .if \sect\r
416     orr     r0, r0, #0x080000*\sect\r
417 .endif\r
418     ldrh    r0, [r1, r0]\r
419     bx      lr\r
420 .endm\r
421 \r
422 \r
423 m_read16_rom0: @ 0x000000 - 0x07ffff\r
424     m_read16_rom 0\r
425 \r
426 m_read16_rom1: @ 0x080000 - 0x0fffff\r
427     m_read16_rom 1\r
428 \r
429 m_read16_rom2: @ 0x100000 - 0x17ffff\r
430     m_read16_rom 2\r
431 \r
432 m_read16_rom3: @ 0x180000 - 0x1fffff\r
433     m_read16_rom 3\r
434 \r
435 m_read16_rom4: @ 0x200000 - 0x27ffff, SRAM area (NBA Live 95)\r
436     ldr     r2, =(SRam)\r
437     ldr     r3, =(Pico+0x22200)\r
438     ldr     r1, [r2, #8]    @ SRam.end\r
439     bic     r0, r0, #0xf80000\r
440     bic     r0, r0, #1\r
441     orr     r0, r0, #0x200000\r
442     cmp     r0, r1\r
443     bgt     m_read16_nosram\r
444     ldrb    r1, [r3, #0x11] @ Pico.m.sram_reg (2ci)\r
445     tst     r1, #1\r
446     beq     m_read16_nosram\r
447     ldr     r1, [r2, #4]    @ SRam.start (1ci)\r
448     cmp     r0, r1\r
449     blt     m_read16_nosram\r
450     ldr     r2, [r2]        @ SRam.data (1ci)\r
451     sub     r2, r2, r1\r
452     ldrh    r0, [r2, r0]    @ 2ci\r
453     and     r1, r0, #0xff\r
454     mov     r0, r0, lsr #8\r
455     orr     r0, r0, r1, lsl #8\r
456     bx      lr\r
457 \r
458 m_read16_nosram:\r
459     ldr     r1, [r3, #4]    @ 1ci\r
460     cmp     r0, r1\r
461     movgt   r0, #0\r
462     bxgt    lr              @ bad location\r
463     ldr     r1, [r3]        @ 1ci\r
464     ldrh    r0, [r1, r0]\r
465     bx      lr\r
466 \r
467 m_read16_rom5: @ 0x280000 - 0x2fffff\r
468     m_read16_rom 5\r
469 \r
470 m_read16_rom6: @ 0x300000 - 0x37ffff\r
471     m_read16_rom 6\r
472 \r
473 m_read16_rom7: @ 0x380000 - 0x3fffff\r
474     m_read16_rom 7\r
475 \r
476 m_read16_rom8: @ 0x400000 - 0x47ffff\r
477     m_read16_rom 8\r
478 \r
479 m_read16_rom9: @ 0x480000 - 0x4fffff\r
480     m_read16_rom 9\r
481 \r
482 m_read16_romA: @ 0x500000 - 0x57ffff\r
483     m_read16_rom 0xA\r
484 \r
485 m_read16_romB: @ 0x580000 - 0x5fffff\r
486     m_read16_rom 0xB\r
487 \r
488 m_read16_romC: @ 0x600000 - 0x67ffff\r
489     m_read16_rom 0xC\r
490 \r
491 m_read16_romD: @ 0x680000 - 0x6fffff\r
492     m_read16_rom 0xD\r
493 \r
494 m_read16_romE: @ 0x700000 - 0x77ffff\r
495     m_read16_rom 0xE\r
496 \r
497 m_read16_romF: @ 0x780000 - 0x7fffff\r
498     m_read16_rom 0xF\r
499 \r
500 m_read16_rom10: @ 0x800000 - 0x87ffff\r
501     m_read16_rom 0x10\r
502 \r
503 m_read16_rom11: @ 0x880000 - 0x8fffff\r
504     m_read16_rom 0x11\r
505 \r
506 m_read16_rom12: @ 0x900000 - 0x97ffff\r
507     m_read16_rom 0x12\r
508 \r
509 m_read16_rom13: @ 0x980000 - 0x9fffff\r
510     m_read16_rom 0x13\r
511 \r
512 m_read16_misc:\r
513     bic     r0, r0, #1\r
514     mov     r1, #16\r
515     b       OtherRead16\r
516 \r
517 m_read16_vdp:\r
518     tst     r0, #0x70000\r
519     tsteq   r0, #0x000e0\r
520     bxne    lr              @ invalid read\r
521     bic     r0, r0, #1\r
522     b       PicoVideoRead\r
523 \r
524 m_read16_ram:\r
525     ldr     r1, =Pico\r
526     bic     r0, r0, #0xff0000\r
527     bic     r0, r0, #1\r
528     ldrh    r0, [r1, r0]\r
529     bx      lr\r
530 \r
531 m_read16_above_rom:\r
532     bic     r0, r0, #1\r
533     mov     r1, #16\r
534     b       OtherRead16End\r
535 \r
536 .pool\r
537 \r
538 @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\r
539 \r
540 .macro m_read32_rom sect\r
541     ldr     r1, =(Pico+0x22200)\r
542     bic     r0, r0, #0xf80000\r
543     ldr     r1, [r1]\r
544     bic     r0, r0, #1\r
545 .if \sect\r
546     orr     r0, r0, #0x080000*\sect\r
547 .endif\r
548     ldrh    r0, [r1, r0]!\r
549     ldrh    r1, [r1, #2]           @ 1ci\r
550     orr     r0, r1, r0, lsl #16\r
551     bx      lr\r
552 .endm\r
553 \r
554 \r
555 m_read32_rom0: @ 0x000000 - 0x07ffff\r
556     m_read32_rom 0\r
557 \r
558 m_read32_rom1: @ 0x080000 - 0x0fffff\r
559     m_read32_rom 1\r
560 \r
561 m_read32_rom2: @ 0x100000 - 0x17ffff\r
562     m_read32_rom 2\r
563 \r
564 m_read32_rom3: @ 0x180000 - 0x1fffff\r
565     m_read32_rom 3\r
566 \r
567 m_read32_rom4: @ 0x200000 - 0x27ffff, SRAM area (does any game do long reads?)\r
568     ldr     r2, =(SRam)\r
569     ldr     r3, =(Pico+0x22200)\r
570     ldr     r1, [r2, #8]    @ SRam.end\r
571     bic     r0, r0, #0xf80000\r
572     bic     r0, r0, #1\r
573     orr     r0, r0, #0x200000\r
574     cmp     r0, r1\r
575     bgt     m_read32_nosram\r
576     ldrb    r1, [r3, #0x11] @ Pico.m.sram_reg (2ci)\r
577     tst     r1, #1\r
578     beq     m_read32_nosram\r
579     ldr     r1, [r2, #4]    @ SRam.start (1ci)\r
580     cmp     r0, r1\r
581     blt     m_read32_nosram\r
582     ldr     r2, [r2]        @ SRam.data (1ci)\r
583     sub     r2, r2, r1\r
584     ldrh    r0, [r2, r0]!   @ (1ci)\r
585     ldrh    r1, [r2, #2]\r
586     orr     r0, r0, r0, lsl #16\r
587     mov     r0, r0, ror #8\r
588     mov     r0, r0, lsl #16\r
589     orr     r0, r0, r1, lsr #8\r
590     and     r1, r1, #0xff\r
591     orr     r0, r0, r1, lsl #8\r
592     bx      lr\r
593 \r
594 m_read32_nosram:\r
595     ldr     r1, [r3, #4]    @ (1ci)\r
596     cmp     r0, r1\r
597     movgt   r0, #0\r
598     bxgt    lr              @ bad location\r
599     ldr     r1, [r3]        @ (1ci)\r
600     ldrh    r0, [r1, r0]!\r
601     ldrh    r1, [r1, #2]    @ (2ci)\r
602     orr     r0, r1, r0, lsl #16\r
603     bx      lr\r
604 \r
605 m_read32_rom5: @ 0x280000 - 0x2fffff\r
606     m_read32_rom 5\r
607 \r
608 m_read32_rom6: @ 0x300000 - 0x37ffff\r
609     m_read32_rom 6\r
610 \r
611 m_read32_rom7: @ 0x380000 - 0x3fffff\r
612     m_read32_rom 7\r
613 \r
614 m_read32_rom8: @ 0x400000 - 0x47ffff\r
615     m_read32_rom 8\r
616 \r
617 m_read32_rom9: @ 0x480000 - 0x4fffff\r
618     m_read32_rom 9\r
619 \r
620 m_read32_romA: @ 0x500000 - 0x57ffff\r
621     m_read32_rom 0xA\r
622 \r
623 m_read32_romB: @ 0x580000 - 0x5fffff\r
624     m_read32_rom 0xB\r
625 \r
626 m_read32_romC: @ 0x600000 - 0x67ffff\r
627     m_read32_rom 0xC\r
628 \r
629 m_read32_romD: @ 0x680000 - 0x6fffff\r
630     m_read32_rom 0xD\r
631 \r
632 m_read32_romE: @ 0x700000 - 0x77ffff\r
633     m_read32_rom 0xE\r
634 \r
635 m_read32_romF: @ 0x780000 - 0x7fffff\r
636     m_read32_rom 0xF\r
637 \r
638 m_read32_rom10: @ 0x800000 - 0x87ffff\r
639     m_read32_rom 0x10\r
640 \r
641 m_read32_rom11: @ 0x880000 - 0x8fffff\r
642     m_read32_rom 0x11\r
643 \r
644 m_read32_rom12: @ 0x900000 - 0x97ffff\r
645     m_read32_rom 0x12\r
646 \r
647 m_read32_rom13: @ 0x980000 - 0x9fffff\r
648     m_read32_rom 0x13\r
649 \r
650 m_read32_misc:\r
651     bic     r0, r0, #1\r
652     stmfd   sp!,{r0,lr}\r
653     mov     r1, #32\r
654     bl      OtherRead16\r
655     mov     r1, r0\r
656     ldmfd   sp!,{r0}\r
657     stmfd   sp!,{r1}\r
658     add     r0, r0, #2\r
659     mov     r1, #32\r
660     bl      OtherRead16\r
661     ldmfd   sp!,{r1,lr}\r
662     orr     r0, r0, r1, lsl #16\r
663     bx      lr\r
664 \r
665 m_read32_vdp:\r
666     tst     r0, #0x70000\r
667     tsteq   r0, #0x000e0\r
668     bxne    lr              @ invalid read\r
669     bic     r0, r0, #1\r
670     add     r1, r0, #2\r
671     stmfd   sp!,{r1,lr}\r
672     bl      PicoVideoRead\r
673     swp     r0, r0, [sp]\r
674     bl      PicoVideoRead\r
675     ldmfd   sp!,{r1,lr}\r
676     orr     r0, r0, r1, lsl #16\r
677     bx      lr\r
678 \r
679 m_read32_ram:\r
680     ldr     r1, =Pico\r
681     bic     r0, r0, #0xff0000\r
682     bic     r0, r0, #1\r
683     ldrh    r0, [r1, r0]!\r
684     ldrh    r1, [r1, #2]    @ 2ci\r
685     orr     r0, r1, r0, lsl #16\r
686     bx      lr\r
687 \r
688 m_read32_above_rom:\r
689     bic     r0, r0, #1\r
690     stmfd   sp!,{r0,lr}\r
691     mov     r1, #32\r
692     bl      OtherRead16End\r
693     mov     r1, r0\r
694     ldmfd   sp!,{r0}\r
695     stmfd   sp!,{r1}\r
696     add     r0, r0, #2\r
697     mov     r1, #32\r
698     bl      OtherRead16End\r
699     ldmfd   sp!,{r1,lr}\r
700     orr     r0, r0, r1, lsl #16\r
701     bx      lr\r
702 \r
703 .pool\r
704 \r
705 @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\r
706 \r
707 PicoWriteRomHW_SSF2: @ u32 a, u32 d\r
708     and     r0, r0, #0xe\r
709     movs    r0, r0, lsr #1\r
710     bne     pwr_banking\r
711 \r
712     @ sram register\r
713     ldr     r2, =(Pico+0x22211) @ Pico.m.sram_reg\r
714     ldrb    r0, [r2]\r
715     and     r1, r1, #3\r
716     bic     r0, r0, #3\r
717     orr     r0, r0, r1\r
718     strb    r0, [r2]\r
719     bx      lr\r
720 \r
721 pwr_banking:\r
722     and     r1, r1, #0x1f\r
723 \r
724     ldr     r3, =m_read8_def_table\r
725     ldr     r2, =m_read8_table\r
726     ldr     r12, [r3, r1, lsl #2]\r
727     str     r12, [r2, r0, lsl #2]\r
728 \r
729     ldr     r3, =m_read16_def_table\r
730     ldr     r2, =m_read16_table\r
731     ldr     r12, [r3, r1, lsl #2]\r
732     str     r12, [r2, r0, lsl #2]\r
733 \r
734     ldr     r3, =m_read32_def_table\r
735     ldr     r2, =m_read32_table\r
736     ldr     r12, [r3, r1, lsl #2]\r
737     str     r12, [r2, r0, lsl #2]\r
738  \r
739     bx      lr\r
740 \r