bugfixes, cd/Memory.s
[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, notaz\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\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_read_null     @ 0x800000 - 0x87FFFF\r
33     .long   m_read_null     @ 0x880000 - 0x8FFFFF\r
34     .long   m_read_null     @ 0x900000 - 0x97FFFF\r
35     .long   m_read_null     @ 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_read_null      @ 0x800000 - 0x87FFFF\r
67     .long   m_read_null      @ 0x880000 - 0x8FFFFF\r
68     .long   m_read_null      @ 0x900000 - 0x97FFFF\r
69     .long   m_read_null      @ 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_read_null      @ 0x800000 - 0x87FFFF\r
101     .long   m_read_null      @ 0x880000 - 0x8FFFFF\r
102     .long   m_read_null      @ 0x900000 - 0x97FFFF\r
103     .long   m_read_null      @ 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 @ is any ROM using that much?\r
333 m_read8_romA: @ 0x500000 - 0x57ffff\r
334     m_read8_rom 0xA\r
335 \r
336 m_read8_romB: @ 0x580000 - 0x5fffff\r
337     m_read8_rom 0xB\r
338 \r
339 m_read8_romC: @ 0x600000 - 0x67ffff\r
340     m_read8_rom 0xC\r
341 \r
342 m_read8_romD: @ 0x680000 - 0x6fffff\r
343     m_read8_rom 0xD\r
344 \r
345 m_read8_romE: @ 0x700000 - 0x77ffff\r
346     m_read8_rom 0xE\r
347 \r
348 m_read8_romF: @ 0x780000 - 0x7fffff\r
349     m_read8_rom 0xF\r
350 \r
351 m_read8_misc:\r
352     bic     r2, r0, #0x00ff\r
353     bic     r2, r2, #0xbf00\r
354     cmp     r2, #0xa00000  @ Z80 RAM?\r
355     ldreq   r2, =z80Read8\r
356     bxeq    r2\r
357     stmfd   sp!,{r0,lr}\r
358     bic     r0, r0, #1\r
359     mov     r1, #8\r
360     bl      OtherRead16\r
361     ldmfd   sp!,{r1,lr}\r
362     tst     r1, #1\r
363     moveq   r0, r0, lsr #8\r
364     bx      lr\r
365 \r
366 m_read8_vdp:\r
367     tst     r0, #0x70000\r
368     tsteq   r0, #0x000e0\r
369     bxne    lr              @ invalid read\r
370     stmfd   sp!,{r0,lr}\r
371     bic     r0, r0, #1\r
372     bl      PicoVideoRead\r
373     ldmfd   sp!,{r1,lr}\r
374     tst     r1, #1\r
375     moveq   r0, r0, lsr #8\r
376     bx      lr\r
377 \r
378 m_read8_ram:\r
379     ldr     r1, =Pico\r
380     bic     r0, r0, #0xff0000\r
381     eor     r0, r0, #1\r
382     ldrb    r0, [r1, r0]\r
383     bx      lr\r
384 \r
385 m_read8_above_rom:\r
386     stmfd   sp!,{r0,lr}\r
387     bic     r0, r0, #1\r
388     mov     r1, #8\r
389     bl      OtherRead16End\r
390     ldmfd   sp!,{r1,lr}\r
391     tst     r1, #1\r
392     moveq   r0, r0, lsr #8\r
393     bx      lr\r
394 \r
395 .pool\r
396 \r
397 @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\r
398 \r
399 .macro m_read16_rom sect\r
400     ldr     r1, =(Pico+0x22200)\r
401     bic     r0, r0, #0xf80000\r
402     ldr     r1, [r1]\r
403     bic     r0, r0, #1\r
404 .if \sect\r
405     orr     r0, r0, #0x080000*\sect\r
406 .endif\r
407     ldrh    r0, [r1, r0]\r
408     bx      lr\r
409 .endm\r
410 \r
411 \r
412 m_read16_rom0: @ 0x000000 - 0x07ffff\r
413     m_read16_rom 0\r
414 \r
415 m_read16_rom1: @ 0x080000 - 0x0fffff\r
416     m_read16_rom 1\r
417 \r
418 m_read16_rom2: @ 0x100000 - 0x17ffff\r
419     m_read16_rom 2\r
420 \r
421 m_read16_rom3: @ 0x180000 - 0x1fffff\r
422     m_read16_rom 3\r
423 \r
424 m_read16_rom4: @ 0x200000 - 0x27ffff, SRAM area (NBA Live 95)\r
425     ldr     r2, =(SRam)\r
426     ldr     r3, =(Pico+0x22200)\r
427     ldr     r1, [r2, #8]    @ SRam.end\r
428     bic     r0, r0, #0xf80000\r
429     bic     r0, r0, #1\r
430     orr     r0, r0, #0x200000\r
431     cmp     r0, r1\r
432     bgt     m_read16_nosram\r
433     ldrb    r1, [r3, #0x11] @ Pico.m.sram_reg (2ci)\r
434     tst     r1, #1\r
435     beq     m_read16_nosram\r
436     ldr     r1, [r2, #4]    @ SRam.start (1ci)\r
437     cmp     r0, r1\r
438     blt     m_read16_nosram\r
439     ldr     r2, [r2]        @ SRam.data (1ci)\r
440     sub     r2, r2, r1\r
441     ldrh    r0, [r2, r0]    @ 2ci\r
442     and     r1, r0, #0xff\r
443     mov     r0, r0, lsr #8\r
444     orr     r0, r0, r1, lsl #8\r
445     bx      lr\r
446 m_read16_nosram:\r
447     ldr     r1, [r3, #4]    @ 1ci\r
448     cmp     r0, r1\r
449     movgt   r0, #0\r
450     bxgt    lr              @ bad location\r
451     ldr     r1, [r3]        @ 1ci\r
452     ldrh    r0, [r1, r0]\r
453     bx      lr\r
454 \r
455 m_read16_rom5: @ 0x280000 - 0x2fffff\r
456     m_read16_rom 5\r
457 \r
458 m_read16_rom6: @ 0x300000 - 0x37ffff\r
459     m_read16_rom 6\r
460 \r
461 m_read16_rom7: @ 0x380000 - 0x3fffff\r
462     m_read16_rom 7\r
463 \r
464 m_read16_rom8: @ 0x400000 - 0x47ffff\r
465     m_read16_rom 8\r
466 \r
467 m_read16_rom9: @ 0x480000 - 0x4fffff\r
468     m_read16_rom 9\r
469 \r
470 @ is any ROM using that much?\r
471 m_read16_romA: @ 0x500000 - 0x57ffff\r
472     m_read16_rom 0xA\r
473 \r
474 m_read16_romB: @ 0x580000 - 0x5fffff\r
475     m_read16_rom 0xB\r
476 \r
477 m_read16_romC: @ 0x600000 - 0x67ffff\r
478     m_read16_rom 0xC\r
479 \r
480 m_read16_romD: @ 0x680000 - 0x6fffff\r
481     m_read16_rom 0xD\r
482 \r
483 m_read16_romE: @ 0x700000 - 0x77ffff\r
484     m_read16_rom 0xE\r
485 \r
486 m_read16_romF: @ 0x780000 - 0x7fffff\r
487     m_read16_rom 0xF\r
488 \r
489 m_read16_misc:\r
490     bic     r0, r0, #1\r
491     mov     r1, #16\r
492     b       OtherRead16\r
493 @    ldr     r2, =OtherRead16\r
494 @    bx      r2\r
495 \r
496 m_read16_vdp:\r
497     tst     r0, #0x70000\r
498     tsteq   r0, #0x000e0\r
499     bxne    lr              @ invalid read\r
500     bic     r0, r0, #1\r
501     b       PicoVideoRead\r
502 @    ldr     r1, =PicoVideoRead\r
503 @    bx      r1\r
504 \r
505 m_read16_ram:\r
506     ldr     r1, =Pico\r
507     bic     r0, r0, #0xff0000\r
508     bic     r0, r0, #1\r
509     ldrh    r0, [r1, r0]\r
510     bx      lr\r
511 \r
512 m_read16_above_rom:\r
513     bic     r0, r0, #1\r
514     mov     r1, #16\r
515     b       OtherRead16End\r
516 @    ldr     r2, =OtherRead16End\r
517 @    bx      r2\r
518 \r
519 .pool\r
520 \r
521 @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\r
522 \r
523 .macro m_read32_rom sect\r
524     ldr     r1, =(Pico+0x22200)\r
525     bic     r0, r0, #0xf80000\r
526     ldr     r1, [r1]\r
527     bic     r0, r0, #1\r
528 .if \sect\r
529     orr     r0, r0, #0x080000*\sect\r
530 .endif\r
531     ldrh    r0, [r1, r0]!\r
532     ldrh    r1, [r1, #2]           @ 1ci\r
533     orr     r0, r1, r0, lsl #16\r
534     bx      lr\r
535 .endm\r
536 \r
537 \r
538 m_read32_rom0: @ 0x000000 - 0x07ffff\r
539     m_read32_rom 0\r
540 \r
541 m_read32_rom1: @ 0x080000 - 0x0fffff\r
542     m_read32_rom 1\r
543 \r
544 m_read32_rom2: @ 0x100000 - 0x17ffff\r
545     m_read32_rom 2\r
546 \r
547 m_read32_rom3: @ 0x180000 - 0x1fffff\r
548     m_read32_rom 3\r
549 \r
550 m_read32_rom4: @ 0x200000 - 0x27ffff, SRAM area (does any game do long reads?)\r
551     ldr     r2, =(SRam)\r
552     ldr     r3, =(Pico+0x22200)\r
553     ldr     r1, [r2, #8]    @ SRam.end\r
554     bic     r0, r0, #0xf80000\r
555     bic     r0, r0, #1\r
556     orr     r0, r0, #0x200000\r
557     cmp     r0, r1\r
558     bgt     m_read32_nosram\r
559     ldrb    r1, [r3, #0x11] @ Pico.m.sram_reg (2ci)\r
560     tst     r1, #1\r
561     beq     m_read32_nosram\r
562     ldr     r1, [r2, #4]    @ SRam.start (1ci)\r
563     cmp     r0, r1\r
564     blt     m_read32_nosram\r
565     ldr     r2, [r2]        @ SRam.data (1ci)\r
566     sub     r2, r2, r1\r
567     ldrh    r0, [r2, r0]!   @ (1ci)\r
568     ldrh    r1, [r2, #2]\r
569     orr     r0, r0, r0, lsl #16\r
570     mov     r0, r0, ror #8\r
571     mov     r0, r0, lsl #16\r
572     orr     r0, r0, r1, lsr #8\r
573     and     r1, r1, #0xff\r
574     orr     r0, r0, r1, lsl #8\r
575     bx      lr\r
576 m_read32_nosram:\r
577     ldr     r1, [r3, #4]    @ (1ci)\r
578     cmp     r0, r1\r
579     movgt   r0, #0\r
580     bxgt    lr              @ bad location\r
581     ldr     r1, [r3]        @ (1ci)\r
582     ldrh    r0, [r1, r0]!\r
583     ldrh    r1, [r1, #2]    @ (2ci)\r
584     orr     r0, r1, r0, lsl #16\r
585     bx      lr\r
586 \r
587 m_read32_rom5: @ 0x280000 - 0x2fffff\r
588     m_read32_rom 5\r
589 \r
590 m_read32_rom6: @ 0x300000 - 0x37ffff\r
591     m_read32_rom 6\r
592 \r
593 m_read32_rom7: @ 0x380000 - 0x3fffff\r
594     m_read32_rom 7\r
595 \r
596 m_read32_rom8: @ 0x400000 - 0x47ffff\r
597     m_read32_rom 8\r
598 \r
599 m_read32_rom9: @ 0x480000 - 0x4fffff\r
600     m_read32_rom 9\r
601 \r
602 @ is any ROM using that much?\r
603 m_read32_romA: @ 0x500000 - 0x57ffff\r
604     m_read32_rom 0xA\r
605 \r
606 m_read32_romB: @ 0x580000 - 0x5fffff\r
607     m_read32_rom 0xB\r
608 \r
609 m_read32_romC: @ 0x600000 - 0x67ffff\r
610     m_read32_rom 0xC\r
611 \r
612 m_read32_romD: @ 0x680000 - 0x6fffff\r
613     m_read32_rom 0xD\r
614 \r
615 m_read32_romE: @ 0x700000 - 0x77ffff\r
616     m_read32_rom 0xE\r
617 \r
618 m_read32_romF: @ 0x780000 - 0x7fffff\r
619     m_read32_rom 0xF\r
620 \r
621 m_read32_misc:\r
622     bic     r0, r0, #1\r
623     stmfd   sp!,{r0,lr}\r
624     mov     r1, #32\r
625     bl      OtherRead16\r
626     mov     r1, r0\r
627     ldmfd   sp!,{r0}\r
628     stmfd   sp!,{r1}\r
629     add     r0, r0, #2\r
630     mov     r1, #32\r
631     bl      OtherRead16\r
632     ldmfd   sp!,{r1,lr}\r
633     orr     r0, r0, r1, lsl #16\r
634     bx      lr\r
635 \r
636 m_read32_vdp:\r
637     tst     r0, #0x70000\r
638     tsteq   r0, #0x000e0\r
639     bxne    lr              @ invalid read\r
640     bic     r0, r0, #1\r
641     add     r1, r0, #2\r
642     stmfd   sp!,{r1,lr}\r
643     bl      PicoVideoRead\r
644     swp     r0, r0, [sp]\r
645     bl      PicoVideoRead\r
646     ldmfd   sp!,{r1,lr}\r
647     orr     r0, r0, r1, lsl #16\r
648     bx      lr\r
649 \r
650 m_read32_ram:\r
651     ldr     r1, =Pico\r
652     bic     r0, r0, #0xff0000\r
653     bic     r0, r0, #1\r
654     ldrh    r0, [r1, r0]!\r
655     ldrh    r1, [r1, #2]    @ 2ci\r
656     orr     r0, r1, r0, lsl #16\r
657     bx      lr\r
658 \r
659 m_read32_above_rom:\r
660     bic     r0, r0, #1\r
661     stmfd   sp!,{r0,lr}\r
662     mov     r1, #32\r
663     bl      OtherRead16End\r
664     mov     r1, r0\r
665     ldmfd   sp!,{r0}\r
666     stmfd   sp!,{r1}\r
667     add     r0, r0, #2\r
668     mov     r1, #32\r
669     bl      OtherRead16End\r
670     ldmfd   sp!,{r1,lr}\r
671     orr     r0, r0, r1, lsl #16\r
672     bx      lr\r
673 \r
674 .pool\r
675 \r
676 @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\r
677 \r
678 PicoWriteRomHW_SSF2: @ u32 a, u32 d\r
679     and     r0, r0, #0xe\r
680     movs    r0, r0, lsr #1\r
681     bne     pwr_banking\r
682 \r
683     @ sram register\r
684     ldr     r2, =(Pico+0x22211) @ Pico.m.sram_reg\r
685     and     r1, r1, #3\r
686     strb    r1, [r2]\r
687     bx      lr\r
688 \r
689 pwr_banking:\r
690     and     r1, r1, #0x1f\r
691 \r
692     ldr     r3, =m_read8_def_table\r
693     ldr     r2, =m_read8_table\r
694     ldr     r12, [r3, r1, lsl #2]\r
695     str     r12, [r2, r0, lsl #2]\r
696 \r
697     ldr     r3, =m_read16_def_table\r
698     ldr     r2, =m_read16_table\r
699     ldr     r12, [r3, r1, lsl #2]\r
700     str     r12, [r2, r0, lsl #2]\r
701 \r
702     ldr     r3, =m_read32_def_table\r
703     ldr     r2, =m_read32_table\r
704     ldr     r12, [r3, r1, lsl #2]\r
705     str     r12, [r2, r0, lsl #2]\r
706  \r
707     bx      lr\r