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