perfect vsync
[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\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 \r
447 m_read16_nosram:\r
448     ldr     r1, [r3, #4]    @ 1ci\r
449     cmp     r0, r1\r
450     movgt   r0, #0\r
451     bxgt    lr              @ bad location\r
452     ldr     r1, [r3]        @ 1ci\r
453     ldrh    r0, [r1, r0]\r
454     bx      lr\r
455 \r
456 m_read16_rom5: @ 0x280000 - 0x2fffff\r
457     m_read16_rom 5\r
458 \r
459 m_read16_rom6: @ 0x300000 - 0x37ffff\r
460     m_read16_rom 6\r
461 \r
462 m_read16_rom7: @ 0x380000 - 0x3fffff\r
463     m_read16_rom 7\r
464 \r
465 m_read16_rom8: @ 0x400000 - 0x47ffff\r
466     m_read16_rom 8\r
467 \r
468 m_read16_rom9: @ 0x480000 - 0x4fffff\r
469     m_read16_rom 9\r
470 \r
471 @ is any ROM using that much?\r
472 m_read16_romA: @ 0x500000 - 0x57ffff\r
473     m_read16_rom 0xA\r
474 \r
475 m_read16_romB: @ 0x580000 - 0x5fffff\r
476     m_read16_rom 0xB\r
477 \r
478 m_read16_romC: @ 0x600000 - 0x67ffff\r
479     m_read16_rom 0xC\r
480 \r
481 m_read16_romD: @ 0x680000 - 0x6fffff\r
482     m_read16_rom 0xD\r
483 \r
484 m_read16_romE: @ 0x700000 - 0x77ffff\r
485     m_read16_rom 0xE\r
486 \r
487 m_read16_romF: @ 0x780000 - 0x7fffff\r
488     m_read16_rom 0xF\r
489 \r
490 m_read16_misc:\r
491     bic     r0, r0, #1\r
492     mov     r1, #16\r
493     b       OtherRead16\r
494 \r
495 m_read16_vdp:\r
496     tst     r0, #0x70000\r
497     tsteq   r0, #0x000e0\r
498     bxne    lr              @ invalid read\r
499     bic     r0, r0, #1\r
500     b       PicoVideoRead\r
501 \r
502 m_read16_ram:\r
503     ldr     r1, =Pico\r
504     bic     r0, r0, #0xff0000\r
505     bic     r0, r0, #1\r
506     ldrh    r0, [r1, r0]\r
507     bx      lr\r
508 \r
509 m_read16_above_rom:\r
510     bic     r0, r0, #1\r
511     mov     r1, #16\r
512     b       OtherRead16End\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 \r
572 m_read32_nosram:\r
573     ldr     r1, [r3, #4]    @ (1ci)\r
574     cmp     r0, r1\r
575     movgt   r0, #0\r
576     bxgt    lr              @ bad location\r
577     ldr     r1, [r3]        @ (1ci)\r
578     ldrh    r0, [r1, r0]!\r
579     ldrh    r1, [r1, #2]    @ (2ci)\r
580     orr     r0, r1, r0, lsl #16\r
581     bx      lr\r
582 \r
583 m_read32_rom5: @ 0x280000 - 0x2fffff\r
584     m_read32_rom 5\r
585 \r
586 m_read32_rom6: @ 0x300000 - 0x37ffff\r
587     m_read32_rom 6\r
588 \r
589 m_read32_rom7: @ 0x380000 - 0x3fffff\r
590     m_read32_rom 7\r
591 \r
592 m_read32_rom8: @ 0x400000 - 0x47ffff\r
593     m_read32_rom 8\r
594 \r
595 m_read32_rom9: @ 0x480000 - 0x4fffff\r
596     m_read32_rom 9\r
597 \r
598 @ is any ROM using that much?\r
599 m_read32_romA: @ 0x500000 - 0x57ffff\r
600     m_read32_rom 0xA\r
601 \r
602 m_read32_romB: @ 0x580000 - 0x5fffff\r
603     m_read32_rom 0xB\r
604 \r
605 m_read32_romC: @ 0x600000 - 0x67ffff\r
606     m_read32_rom 0xC\r
607 \r
608 m_read32_romD: @ 0x680000 - 0x6fffff\r
609     m_read32_rom 0xD\r
610 \r
611 m_read32_romE: @ 0x700000 - 0x77ffff\r
612     m_read32_rom 0xE\r
613 \r
614 m_read32_romF: @ 0x780000 - 0x7fffff\r
615     m_read32_rom 0xF\r
616 \r
617 m_read32_misc:\r
618     bic     r0, r0, #1\r
619     stmfd   sp!,{r0,lr}\r
620     mov     r1, #32\r
621     bl      OtherRead16\r
622     mov     r1, r0\r
623     ldmfd   sp!,{r0}\r
624     stmfd   sp!,{r1}\r
625     add     r0, r0, #2\r
626     mov     r1, #32\r
627     bl      OtherRead16\r
628     ldmfd   sp!,{r1,lr}\r
629     orr     r0, r0, r1, lsl #16\r
630     bx      lr\r
631 \r
632 m_read32_vdp:\r
633     tst     r0, #0x70000\r
634     tsteq   r0, #0x000e0\r
635     bxne    lr              @ invalid read\r
636     bic     r0, r0, #1\r
637     add     r1, r0, #2\r
638     stmfd   sp!,{r1,lr}\r
639     bl      PicoVideoRead\r
640     swp     r0, r0, [sp]\r
641     bl      PicoVideoRead\r
642     ldmfd   sp!,{r1,lr}\r
643     orr     r0, r0, r1, lsl #16\r
644     bx      lr\r
645 \r
646 m_read32_ram:\r
647     ldr     r1, =Pico\r
648     bic     r0, r0, #0xff0000\r
649     bic     r0, r0, #1\r
650     ldrh    r0, [r1, r0]!\r
651     ldrh    r1, [r1, #2]    @ 2ci\r
652     orr     r0, r1, r0, lsl #16\r
653     bx      lr\r
654 \r
655 m_read32_above_rom:\r
656     bic     r0, r0, #1\r
657     stmfd   sp!,{r0,lr}\r
658     mov     r1, #32\r
659     bl      OtherRead16End\r
660     mov     r1, r0\r
661     ldmfd   sp!,{r0}\r
662     stmfd   sp!,{r1}\r
663     add     r0, r0, #2\r
664     mov     r1, #32\r
665     bl      OtherRead16End\r
666     ldmfd   sp!,{r1,lr}\r
667     orr     r0, r0, r1, lsl #16\r
668     bx      lr\r
669 \r
670 .pool\r
671 \r
672 @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\r
673 \r
674 PicoWriteRomHW_SSF2: @ u32 a, u32 d\r
675     and     r0, r0, #0xe\r
676     movs    r0, r0, lsr #1\r
677     bne     pwr_banking\r
678 \r
679     @ sram register\r
680     ldr     r2, =(Pico+0x22211) @ Pico.m.sram_reg\r
681     ldrb    r0, [r2]\r
682     and     r1, r1, #3\r
683     bic     r0, r0, #3\r
684     orr     r0, r0, r1\r
685     strb    r0, [r2]\r
686     bx      lr\r
687 \r
688 pwr_banking:\r
689     and     r1, r1, #0x1f\r
690 \r
691     ldr     r3, =m_read8_def_table\r
692     ldr     r2, =m_read8_table\r
693     ldr     r12, [r3, r1, lsl #2]\r
694     str     r12, [r2, r0, lsl #2]\r
695 \r
696     ldr     r3, =m_read16_def_table\r
697     ldr     r2, =m_read16_table\r
698     ldr     r12, [r3, r1, lsl #2]\r
699     str     r12, [r2, r0, lsl #2]\r
700 \r
701     ldr     r3, =m_read32_def_table\r
702     ldr     r2, =m_read32_table\r
703     ldr     r12, [r3, r1, lsl #2]\r
704     str     r12, [r2, r0, lsl #2]\r
705  \r
706     bx      lr\r
707 \r