updated EEPROM code, gmv fixed
[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 .include "port_config.s"\r
11 \r
12 .text\r
13 \r
14 @ default jump tables\r
15 \r
16 m_read8_def_table:\r
17     .long   m_read8_rom0    @ 0x000000 - 0x07FFFF\r
18     .long   m_read8_rom1    @ 0x080000 - 0x0FFFFF\r
19     .long   m_read8_rom2    @ 0x100000 - 0x17FFFF\r
20     .long   m_read8_rom3    @ 0x180000 - 0x1FFFFF\r
21     .long   m_read8_rom4    @ 0x200000 - 0x27FFFF\r
22     .long   m_read8_rom5    @ 0x280000 - 0x2FFFFF\r
23     .long   m_read8_rom6    @ 0x300000 - 0x37FFFF\r
24     .long   m_read8_rom7    @ 0x380000 - 0x3FFFFF\r
25     .long   m_read8_rom8    @ 0x400000 - 0x47FFFF - for all those large ROM hacks\r
26     .long   m_read8_rom9    @ 0x480000 - 0x4FFFFF\r
27     .long   m_read8_romA    @ 0x500000 - 0x57FFFF\r
28     .long   m_read8_romB    @ 0x580000 - 0x5FFFFF\r
29     .long   m_read8_romC    @ 0x600000 - 0x67FFFF\r
30     .long   m_read8_romD    @ 0x680000 - 0x6FFFFF\r
31     .long   m_read8_romE    @ 0x700000 - 0x77FFFF\r
32     .long   m_read8_romF    @ 0x780000 - 0x7FFFFF\r
33     .long   m_read8_rom10   @ 0x800000 - 0x87FFFF\r
34     .long   m_read8_rom11   @ 0x880000 - 0x8FFFFF\r
35     .long   m_read8_rom12   @ 0x900000 - 0x97FFFF\r
36     .long   m_read8_rom13   @ 0x980000 - 0x9FFFFF\r
37     .long   m_read8_misc    @ 0xA00000 - 0xA7FFFF\r
38     .long   m_read_null     @ 0xA80000 - 0xAFFFFF\r
39     .long   m_read_null     @ 0xB00000 - 0xB7FFFF\r
40     .long   m_read_null     @ 0xB80000 - 0xBFFFFF\r
41     .long   m_read8_vdp     @ 0xC00000 - 0xC7FFFF\r
42     .long   m_read8_vdp     @ 0xC80000 - 0xCFFFFF\r
43     .long   m_read8_vdp     @ 0xD00000 - 0xD7FFFF\r
44     .long   m_read8_vdp     @ 0xD80000 - 0xDFFFFF\r
45     .long   m_read8_ram     @ 0xE00000 - 0xE7FFFF\r
46     .long   m_read8_ram     @ 0xE80000 - 0xEFFFFF\r
47     .long   m_read8_ram     @ 0xF00000 - 0xF7FFFF\r
48     .long   m_read8_ram     @ 0xF80000 - 0xFFFFFF\r
49 \r
50 m_read16_def_table:\r
51     .long   m_read16_rom0    @ 0x000000 - 0x07FFFF\r
52     .long   m_read16_rom1    @ 0x080000 - 0x0FFFFF\r
53     .long   m_read16_rom2    @ 0x100000 - 0x17FFFF\r
54     .long   m_read16_rom3    @ 0x180000 - 0x1FFFFF\r
55     .long   m_read16_rom4    @ 0x200000 - 0x27FFFF\r
56     .long   m_read16_rom5    @ 0x280000 - 0x2FFFFF\r
57     .long   m_read16_rom6    @ 0x300000 - 0x37FFFF\r
58     .long   m_read16_rom7    @ 0x380000 - 0x3FFFFF\r
59     .long   m_read16_rom8    @ 0x400000 - 0x47FFFF\r
60     .long   m_read16_rom9    @ 0x480000 - 0x4FFFFF\r
61     .long   m_read16_romA    @ 0x500000 - 0x57FFFF\r
62     .long   m_read16_romB    @ 0x580000 - 0x5FFFFF\r
63     .long   m_read16_romC    @ 0x600000 - 0x67FFFF\r
64     .long   m_read16_romD    @ 0x680000 - 0x6FFFFF\r
65     .long   m_read16_romE    @ 0x700000 - 0x77FFFF\r
66     .long   m_read16_romF    @ 0x780000 - 0x7FFFFF\r
67     .long   m_read16_rom10   @ 0x800000 - 0x87FFFF\r
68     .long   m_read16_rom11   @ 0x880000 - 0x8FFFFF\r
69     .long   m_read16_rom12   @ 0x900000 - 0x97FFFF\r
70     .long   m_read16_rom13   @ 0x980000 - 0x9FFFFF\r
71     .long   m_read16_misc    @ 0xA00000 - 0xA7FFFF\r
72     .long   m_read_null      @ 0xA80000 - 0xAFFFFF\r
73     .long   m_read_null      @ 0xB00000 - 0xB7FFFF\r
74     .long   m_read_null      @ 0xB80000 - 0xBFFFFF\r
75     .long   m_read16_vdp     @ 0xC00000 - 0xC7FFFF\r
76     .long   m_read16_vdp     @ 0xC80000 - 0xCFFFFF\r
77     .long   m_read16_vdp     @ 0xD00000 - 0xD7FFFF\r
78     .long   m_read16_vdp     @ 0xD80000 - 0xDFFFFF\r
79     .long   m_read16_ram     @ 0xE00000 - 0xE7FFFF\r
80     .long   m_read16_ram     @ 0xE80000 - 0xEFFFFF\r
81     .long   m_read16_ram     @ 0xF00000 - 0xF7FFFF\r
82     .long   m_read16_ram     @ 0xF80000 - 0xFFFFFF\r
83 \r
84 m_read32_def_table:\r
85     .long   m_read32_rom0    @ 0x000000 - 0x07FFFF\r
86     .long   m_read32_rom1    @ 0x080000 - 0x0FFFFF\r
87     .long   m_read32_rom2    @ 0x100000 - 0x17FFFF\r
88     .long   m_read32_rom3    @ 0x180000 - 0x1FFFFF\r
89     .long   m_read32_rom4    @ 0x200000 - 0x27FFFF\r
90     .long   m_read32_rom5    @ 0x280000 - 0x2FFFFF\r
91     .long   m_read32_rom6    @ 0x300000 - 0x37FFFF\r
92     .long   m_read32_rom7    @ 0x380000 - 0x3FFFFF\r
93     .long   m_read32_rom8    @ 0x400000 - 0x47FFFF\r
94     .long   m_read32_rom9    @ 0x480000 - 0x4FFFFF\r
95     .long   m_read32_romA    @ 0x500000 - 0x57FFFF\r
96     .long   m_read32_romB    @ 0x580000 - 0x5FFFFF\r
97     .long   m_read32_romC    @ 0x600000 - 0x67FFFF\r
98     .long   m_read32_romD    @ 0x680000 - 0x6FFFFF\r
99     .long   m_read32_romE    @ 0x700000 - 0x77FFFF\r
100     .long   m_read32_romF    @ 0x780000 - 0x7FFFFF\r
101     .long   m_read32_rom10   @ 0x800000 - 0x87FFFF\r
102     .long   m_read32_rom11   @ 0x880000 - 0x8FFFFF\r
103     .long   m_read32_rom12   @ 0x900000 - 0x97FFFF\r
104     .long   m_read32_rom13   @ 0x980000 - 0x9FFFFF\r
105     .long   m_read32_misc    @ 0xA00000 - 0xA7FFFF\r
106     .long   m_read_null      @ 0xA80000 - 0xAFFFFF\r
107     .long   m_read_null      @ 0xB00000 - 0xB7FFFF\r
108     .long   m_read_null      @ 0xB80000 - 0xBFFFFF\r
109     .long   m_read32_vdp     @ 0xC00000 - 0xC7FFFF\r
110     .long   m_read32_vdp     @ 0xC80000 - 0xCFFFFF\r
111     .long   m_read32_vdp     @ 0xD00000 - 0xD7FFFF\r
112     .long   m_read32_vdp     @ 0xD80000 - 0xDFFFFF\r
113     .long   m_read32_ram     @ 0xE00000 - 0xE7FFFF\r
114     .long   m_read32_ram     @ 0xE80000 - 0xEFFFFF\r
115     .long   m_read32_ram     @ 0xF00000 - 0xF7FFFF\r
116     .long   m_read32_ram     @ 0xF80000 - 0xFFFFFF\r
117 \r
118 \r
119 @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\r
120 \r
121 .bss\r
122 @.section .bss, "brw"\r
123 @.data\r
124 \r
125 @ used tables\r
126 m_read8_table:\r
127     .skip 32*4\r
128 \r
129 m_read16_table:\r
130     .skip 32*4\r
131 \r
132 m_read32_table:\r
133     .skip 32*4\r
134 \r
135 \r
136 @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\r
137 \r
138 .text\r
139 \r
140 .global PicoMemReset\r
141 .global PicoRead8\r
142 .global PicoRead16\r
143 .global PicoRead32\r
144 .global PicoWrite8\r
145 .global PicoWriteRomHW_SSF2\r
146 .global m_m68k_read8_misc\r
147 .global m_m68k_write8_misc\r
148 \r
149 \r
150 PicoMemReset:\r
151     ldr     r12,=(Pico+0x22204)\r
152     ldr     r12,[r12]                @ romsize\r
153     add     r12,r12,#0x80000\r
154     sub     r12,r12,#1\r
155     mov     r12,r12,lsr #19\r
156 \r
157     ldr     r0, =m_read8_table\r
158     ldr     r1, =m_read8_def_table\r
159     mov     r2, #32\r
160 1:\r
161     ldr     r3, [r1], #4\r
162     str     r3, [r0], #4\r
163     subs    r2, r2, #1\r
164     bne     1b\r
165 \r
166     ldr     r0, =m_read16_table\r
167     ldr     r1, =m_read16_def_table\r
168     mov     r2, #32\r
169 1:\r
170     subs    r2, r2, #1\r
171     ldr     r3, [r1], #4\r
172     str     r3, [r0], #4\r
173     bne     1b\r
174 \r
175     ldr     r0, =m_read32_table\r
176     ldr     r1, =m_read32_def_table\r
177     mov     r2, #32\r
178 1:\r
179     subs    r2, r2, #1\r
180     ldr     r3, [r1], #4\r
181     str     r3, [r0], #4\r
182     bne     1b\r
183 \r
184     @ update memhandlers according to ROM size\r
185     ldr     r1, =m_read8_above_rom\r
186     ldr     r0, =m_read8_table\r
187     mov     r2, #16\r
188 1:\r
189     sub     r2, r2, #1\r
190     cmp     r2, r12\r
191     blt     2f\r
192     cmp     r2, #4\r
193     beq     1b                      @ do not touch the SRAM area\r
194     str     r1, [r0, r2, lsl #2]\r
195     b       1b\r
196 2:\r
197     ldr     r1, =m_read16_above_rom\r
198     ldr     r0, =m_read16_table\r
199     mov     r2, #16\r
200 1:\r
201     sub     r2, r2, #1\r
202     cmp     r2, r12\r
203     blt     2f\r
204     cmp     r2, #4\r
205     beq     1b\r
206     str     r1, [r0, r2, lsl #2]\r
207     b       1b\r
208 2:\r
209     ldr     r1, =m_read32_above_rom\r
210     ldr     r0, =m_read32_table\r
211     mov     r2, #16\r
212 1:\r
213     sub     r2, r2, #1\r
214     cmp     r2, r12\r
215     blt     2f\r
216     cmp     r2, #4\r
217     beq     1b\r
218     str     r1, [r0, r2, lsl #2]\r
219     b       1b\r
220 2:\r
221     bx      lr\r
222 \r
223 .pool\r
224 \r
225 @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\r
226 \r
227 PicoRead8: @ u32 a\r
228     ldr     r2, =m_read8_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 PicoRead16: @ u32 a\r
234     ldr     r2, =m_read16_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 PicoRead32: @ u32 a\r
240     ldr     r2, =m_read32_table\r
241     bic     r0, r0, #0xff000000\r
242     and     r1, r0, #0x00f80000\r
243     ldr     pc, [r2, r1, lsr #17]\r
244 \r
245 .pool\r
246 \r
247 @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\r
248 \r
249 m_read_null:\r
250     mov     r0, #0\r
251     bx      lr\r
252 \r
253 \r
254 .macro m_read8_rom sect\r
255     ldr     r1, =(Pico+0x22200)\r
256     bic     r0, r0, #0xf80000\r
257     ldr     r1, [r1]\r
258 .if \sect\r
259     orr     r0, r0, #0x080000*\sect\r
260 .endif\r
261     eor     r0, r0, #1\r
262     ldrb    r0, [r1, r0]\r
263     bx      lr\r
264 .endm\r
265 \r
266 \r
267 m_read8_rom0: @ 0x000000 - 0x07ffff\r
268     m_read8_rom 0\r
269 \r
270 m_read8_rom1: @ 0x080000 - 0x0fffff\r
271     m_read8_rom 1\r
272 \r
273 m_read8_rom2: @ 0x100000 - 0x17ffff\r
274     m_read8_rom 2\r
275 \r
276 m_read8_rom3: @ 0x180000 - 0x1fffff\r
277     m_read8_rom 3\r
278 \r
279 m_read8_rom4: @ 0x200000 - 0x27ffff, SRAM area\r
280     ldr     r2, =(SRam)\r
281     ldr     r3, =(Pico+0x22200)\r
282     ldr     r1, [r2, #8]    @ SRam.end\r
283     bic     r0, r0, #0xf80000\r
284     orr     r0, r0, #0x200000\r
285     cmp     r0, r1\r
286     bgt     m_read8_nosram\r
287     ldr     r1, [r2, #4]    @ SRam.start\r
288     cmp     r0, r1\r
289     blt     m_read8_nosram\r
290     ldrb    r1, [r3, #0x11] @ Pico.m.sram_reg\r
291     tst     r1, #5\r
292     bne     SRAMRead\r
293 m_read8_nosram:\r
294     ldr     r1, [r3, #4]    @ romsize\r
295     cmp     r0, r1\r
296     movgt   r0, #0\r
297     bxgt    lr              @ bad location\r
298     ldr     r1, [r3]\r
299     eor     r0, r0, #1\r
300     ldrb    r0, [r1, r0]\r
301     bx      lr\r
302 \r
303 m_read8_rom5: @ 0x280000 - 0x2fffff\r
304     m_read8_rom 5\r
305 \r
306 m_read8_rom6: @ 0x300000 - 0x37ffff\r
307     m_read8_rom 6\r
308 \r
309 m_read8_rom7: @ 0x380000 - 0x3fffff\r
310     m_read8_rom 7\r
311 \r
312 m_read8_rom8: @ 0x400000 - 0x47ffff\r
313     m_read8_rom 8\r
314 \r
315 m_read8_rom9: @ 0x480000 - 0x4fffff\r
316     m_read8_rom 9\r
317 \r
318 m_read8_romA: @ 0x500000 - 0x57ffff\r
319     m_read8_rom 0xA\r
320 \r
321 m_read8_romB: @ 0x580000 - 0x5fffff\r
322     m_read8_rom 0xB\r
323 \r
324 m_read8_romC: @ 0x600000 - 0x67ffff\r
325     m_read8_rom 0xC\r
326 \r
327 m_read8_romD: @ 0x680000 - 0x6fffff\r
328     m_read8_rom 0xD\r
329 \r
330 m_read8_romE: @ 0x700000 - 0x77ffff\r
331     m_read8_rom 0xE\r
332 \r
333 m_read8_romF: @ 0x780000 - 0x7fffff\r
334     m_read8_rom 0xF\r
335 \r
336 m_read8_rom10: @ 0x800000 - 0x87ffff\r
337     m_read8_rom 0x10\r
338 \r
339 m_read8_rom11: @ 0x880000 - 0x8fffff\r
340     m_read8_rom 0x11\r
341 \r
342 m_read8_rom12: @ 0x900000 - 0x97ffff\r
343     m_read8_rom 0x12\r
344 \r
345 m_read8_rom13: @ 0x980000 - 0x9fffff\r
346     m_read8_rom 0x13\r
347 \r
348 \r
349 m_m68k_read8_misc:\r
350 m_read8_misc:\r
351     bic     r2, r0, #0x001f @ most commonly we get i/o port read,\r
352     cmp     r2, #0xa10000   @ so check for it first\r
353     bne     m_read8_misc2\r
354 m_read8_misc_io:\r
355     ands    r0, r0, #0x1e\r
356     beq     m_read8_misc_hwreg\r
357     cmp     r0, #4\r
358     movlt   r0, #0\r
359     moveq   r0, #1\r
360     ble     PadRead\r
361     ldr     r3, =(Pico+0x22000)\r
362     mov     r0, r0, lsr #1  @ other IO ports (Pico.ioports[a])\r
363     ldrb    r0, [r3, r0]\r
364     bx      lr\r
365 \r
366 m_read8_misc_hwreg:\r
367     ldr     r3, =(Pico+0x22200)\r
368     ldrb    r0, [r3, #0x0f] @ Pico.m.hardware\r
369     bx      lr\r
370 \r
371 m_read8_misc2:\r
372     mov     r2,     #0xa10000 @ games also like to poll busreq,\r
373     orr     r2, r2, #0x001100 @ so we'll try it now\r
374     cmp     r0, r2\r
375     beq     z80ReadBusReq\r
376 \r
377     and     r2, r0, #0xff0000 @ finally it might be\r
378     cmp     r2,     #0xa00000 @ z80 area\r
379     bne     m_read8_misc3\r
380     tst     r0, #0x4000\r
381     beq     z80Read8          @ z80 RAM\r
382     and     r2, r0, #0x6000\r
383     cmp     r2, #0x4000\r
384     mvnne   r0, #0\r
385     bxne    lr                @ invalid\r
386 .if EXTERNAL_YM2612\r
387     ldr     r1, =PicoOpt\r
388     ldr     r1, [r1]\r
389     tst     r1, #1\r
390     beq     m_read8_fake_ym2612\r
391     tst     r1, #0x200\r
392     beq     YM2612Read_\r
393     b       YM2612Read_940\r
394 .else\r
395     b       YM2612Read_\r
396 .endif\r
397 \r
398 m_read8_fake_ym2612:\r
399     ldr     r3, =(Pico+0x22200)\r
400     ldrb    r0, [r3, #8]      @ Pico.m.rotate\r
401     add     r1, r0, #1\r
402     strb    r1, [r3, #8]\r
403     and     r0, r0, #3\r
404     bx      lr\r
405 \r
406 m_read8_misc3:\r
407     @ if everything else fails, use generic handler\r
408     stmfd   sp!,{r0,lr}\r
409     bic     r0, r0, #1\r
410     mov     r1, #8\r
411     bl      OtherRead16\r
412     ldmfd   sp!,{r1,lr}\r
413     tst     r1, #1\r
414     moveq   r0, r0, lsr #8\r
415     bx      lr\r
416 \r
417 \r
418 m_read8_vdp:\r
419     tst     r0, #0x70000\r
420     tsteq   r0, #0x000e0\r
421     bxne    lr              @ invalid read\r
422     stmfd   sp!,{r0,lr}\r
423     bic     r0, r0, #1\r
424     bl      PicoVideoRead\r
425     ldmfd   sp!,{r1,lr}\r
426     tst     r1, #1\r
427     moveq   r0, r0, lsr #8\r
428     bx      lr\r
429 \r
430 m_read8_ram:\r
431     ldr     r1, =Pico\r
432     bic     r0, r0, #0xff0000\r
433     eor     r0, r0, #1\r
434     ldrb    r0, [r1, r0]\r
435     bx      lr\r
436 \r
437 m_read8_above_rom:\r
438     @ might still be SRam (Micro Machines, HardBall '95)\r
439     ldr     r2, =(SRam)\r
440     ldr     r3, =(Pico+0x22200)\r
441     ldr     r1, [r2, #8]    @ SRam.end\r
442     cmp     r0, r1\r
443     bgt     m_read8_ar_nosram\r
444     ldr     r1, [r2, #4]    @ SRam.start\r
445     cmp     r0, r1\r
446     blt     m_read8_ar_nosram\r
447     ldrb    r1, [r3, #0x11] @ Pico.m.sram_reg\r
448     tst     r1, #5\r
449     bne     SRAMRead\r
450 m_read8_ar_nosram:\r
451     stmfd   sp!,{r0,lr}\r
452     bic     r0, r0, #1\r
453     mov     r1, #8\r
454     bl      OtherRead16End\r
455     ldmfd   sp!,{r1,lr}\r
456     tst     r1, #1\r
457     moveq   r0, r0, lsr #8\r
458     bx      lr\r
459 \r
460 .pool\r
461 \r
462 @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\r
463 \r
464 .macro m_read16_rom sect\r
465     ldr     r1, =(Pico+0x22200)\r
466     bic     r0, r0, #0xf80000\r
467     ldr     r1, [r1]\r
468     bic     r0, r0, #1\r
469 .if \sect\r
470     orr     r0, r0, #0x080000*\sect\r
471 .endif\r
472     ldrh    r0, [r1, r0]\r
473     bx      lr\r
474 .endm\r
475 \r
476 \r
477 m_read16_rom0: @ 0x000000 - 0x07ffff\r
478     m_read16_rom 0\r
479 \r
480 m_read16_rom1: @ 0x080000 - 0x0fffff\r
481     m_read16_rom 1\r
482 \r
483 m_read16_rom2: @ 0x100000 - 0x17ffff\r
484     m_read16_rom 2\r
485 \r
486 m_read16_rom3: @ 0x180000 - 0x1fffff\r
487     m_read16_rom 3\r
488 \r
489 m_read16_rom4: @ 0x200000 - 0x27ffff, SRAM area (NBA Live 95)\r
490     ldr     r2, =(SRam)\r
491     ldr     r3, =(Pico+0x22200)\r
492     ldr     r1, [r2, #8]    @ SRam.end\r
493     bic     r0, r0, #0xf80000\r
494     bic     r0, r0, #1\r
495     orr     r0, r0, #0x200000\r
496     cmp     r0, r1\r
497     bgt     m_read16_nosram\r
498     ldr     r1, [r2, #4]    @ SRam.start\r
499     cmp     r0, r1\r
500     blt     m_read16_nosram\r
501     ldrb    r1, [r3, #0x11] @ Pico.m.sram_reg\r
502     tst     r1, #5\r
503     beq     m_read16_nosram\r
504     stmfd   sp!,{lr}\r
505     bl      SRAMRead\r
506     orr     r0, r0, r0, lsl #8\r
507     ldmfd   sp!,{pc}\r
508 m_read16_nosram:\r
509     ldr     r1, [r3, #4]    @ romsize\r
510     cmp     r0, r1\r
511     movgt   r0, #0\r
512     bxgt    lr              @ bad location\r
513     ldr     r1, [r3]        @ 1ci\r
514     ldrh    r0, [r1, r0]\r
515     bx      lr\r
516 \r
517 m_read16_rom5: @ 0x280000 - 0x2fffff\r
518     m_read16_rom 5\r
519 \r
520 m_read16_rom6: @ 0x300000 - 0x37ffff\r
521     m_read16_rom 6\r
522 \r
523 m_read16_rom7: @ 0x380000 - 0x3fffff\r
524     m_read16_rom 7\r
525 \r
526 m_read16_rom8: @ 0x400000 - 0x47ffff\r
527     m_read16_rom 8\r
528 \r
529 m_read16_rom9: @ 0x480000 - 0x4fffff\r
530     m_read16_rom 9\r
531 \r
532 m_read16_romA: @ 0x500000 - 0x57ffff\r
533     m_read16_rom 0xA\r
534 \r
535 m_read16_romB: @ 0x580000 - 0x5fffff\r
536     m_read16_rom 0xB\r
537 \r
538 m_read16_romC: @ 0x600000 - 0x67ffff\r
539     m_read16_rom 0xC\r
540 \r
541 m_read16_romD: @ 0x680000 - 0x6fffff\r
542     m_read16_rom 0xD\r
543 \r
544 m_read16_romE: @ 0x700000 - 0x77ffff\r
545     m_read16_rom 0xE\r
546 \r
547 m_read16_romF: @ 0x780000 - 0x7fffff\r
548     m_read16_rom 0xF\r
549 \r
550 m_read16_rom10: @ 0x800000 - 0x87ffff\r
551     m_read16_rom 0x10\r
552 \r
553 m_read16_rom11: @ 0x880000 - 0x8fffff\r
554     m_read16_rom 0x11\r
555 \r
556 m_read16_rom12: @ 0x900000 - 0x97ffff\r
557     m_read16_rom 0x12\r
558 \r
559 m_read16_rom13: @ 0x980000 - 0x9fffff\r
560     m_read16_rom 0x13\r
561 \r
562 m_read16_misc:\r
563     bic     r0, r0, #1\r
564     mov     r1, #16\r
565     b       OtherRead16\r
566 \r
567 m_read16_vdp:\r
568     tst     r0, #0x70000    @ if ((a&0xe700e0)==0xc00000)\r
569     tsteq   r0, #0x000e0\r
570     bxne    lr              @ invalid read\r
571     bic     r0, r0, #1\r
572     b       PicoVideoRead\r
573 \r
574 m_read16_ram:\r
575     ldr     r1, =Pico\r
576     bic     r0, r0, #0xff0000\r
577     bic     r0, r0, #1\r
578     ldrh    r0, [r1, r0]\r
579     bx      lr\r
580 \r
581 m_read16_above_rom:\r
582     @ might still be SRam\r
583     ldr     r2, =(SRam)\r
584     ldr     r3, =(Pico+0x22200)\r
585     ldr     r1, [r2, #8]    @ SRam.end\r
586     bic     r0, r0, #1\r
587     cmp     r0, r1\r
588     bgt     m_read16_ar_nosram\r
589     ldr     r1, [r2, #4]    @ SRam.start\r
590     cmp     r0, r1\r
591     blt     m_read16_ar_nosram\r
592     ldrb    r1, [r3, #0x11] @ Pico.m.sram_reg\r
593     tst     r1, #5\r
594     beq     m_read16_ar_nosram\r
595     stmfd   sp!,{lr}\r
596     bl      SRAMRead\r
597     orr     r0, r0, r0, lsl #8\r
598     ldmfd   sp!,{pc}\r
599 m_read16_ar_nosram:\r
600     mov     r1, #16\r
601     b       OtherRead16End\r
602 \r
603 .pool\r
604 \r
605 @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\r
606 \r
607 .macro m_read32_rom sect\r
608     ldr     r1, =(Pico+0x22200)\r
609     bic     r0, r0, #0xf80000\r
610     ldr     r1, [r1]\r
611     bic     r0, r0, #1\r
612 .if \sect\r
613     orr     r0, r0, #0x080000*\sect\r
614 .endif\r
615     ldrh    r0, [r1, r0]!\r
616     ldrh    r1, [r1, #2]           @ 1ci\r
617     orr     r0, r1, r0, lsl #16\r
618     bx      lr\r
619 .endm\r
620 \r
621 \r
622 m_read32_rom0: @ 0x000000 - 0x07ffff\r
623     m_read32_rom 0\r
624 \r
625 m_read32_rom1: @ 0x080000 - 0x0fffff\r
626     m_read32_rom 1\r
627 \r
628 m_read32_rom2: @ 0x100000 - 0x17ffff\r
629     m_read32_rom 2\r
630 \r
631 m_read32_rom3: @ 0x180000 - 0x1fffff\r
632     m_read32_rom 3\r
633 \r
634 m_read32_rom4: @ 0x200000 - 0x27ffff, SRAM area (does any game do long reads?)\r
635     ldr     r2, =(SRam)\r
636     ldr     r3, =(Pico+0x22200)\r
637     ldr     r1, [r2, #8]    @ SRam.end\r
638     bic     r0, r0, #0xf80000\r
639     bic     r0, r0, #1\r
640     orr     r0, r0, #0x200000\r
641     cmp     r0, r1\r
642     bgt     m_read32_nosram\r
643     ldr     r1, [r2, #4]    @ SRam.start\r
644     cmp     r0, r1\r
645     blt     m_read32_nosram\r
646     ldrb    r1, [r3, #0x11] @ Pico.m.sram_reg\r
647     tst     r1, #5\r
648     beq     m_read32_nosram\r
649     stmfd   sp!,{r0,lr}\r
650     bl      SRAMRead\r
651     ldmfd   sp!,{r1,lr}\r
652     stmfd   sp!,{r0,lr}\r
653     add     r0, r1, #2\r
654     bl      SRAMRead\r
655     ldmfd   sp!,{r1,lr}\r
656     orr     r0, r1, r0, lsl #16\r
657     orr     r0, r0, r0, lsl #8\r
658     bx      lr\r
659 m_read32_nosram:\r
660     ldr     r1, [r3, #4]    @ romsize\r
661     cmp     r0, r1\r
662     movgt   r0, #0\r
663     bxgt    lr              @ bad location\r
664     ldr     r1, [r3]        @ (1ci)\r
665     ldrh    r0, [r1, r0]!\r
666     ldrh    r1, [r1, #2]    @ (2ci)\r
667     orr     r0, r1, r0, lsl #16\r
668     bx      lr\r
669 \r
670 m_read32_rom5: @ 0x280000 - 0x2fffff\r
671     m_read32_rom 5\r
672 \r
673 m_read32_rom6: @ 0x300000 - 0x37ffff\r
674     m_read32_rom 6\r
675 \r
676 m_read32_rom7: @ 0x380000 - 0x3fffff\r
677     m_read32_rom 7\r
678 \r
679 m_read32_rom8: @ 0x400000 - 0x47ffff\r
680     m_read32_rom 8\r
681 \r
682 m_read32_rom9: @ 0x480000 - 0x4fffff\r
683     m_read32_rom 9\r
684 \r
685 m_read32_romA: @ 0x500000 - 0x57ffff\r
686     m_read32_rom 0xA\r
687 \r
688 m_read32_romB: @ 0x580000 - 0x5fffff\r
689     m_read32_rom 0xB\r
690 \r
691 m_read32_romC: @ 0x600000 - 0x67ffff\r
692     m_read32_rom 0xC\r
693 \r
694 m_read32_romD: @ 0x680000 - 0x6fffff\r
695     m_read32_rom 0xD\r
696 \r
697 m_read32_romE: @ 0x700000 - 0x77ffff\r
698     m_read32_rom 0xE\r
699 \r
700 m_read32_romF: @ 0x780000 - 0x7fffff\r
701     m_read32_rom 0xF\r
702 \r
703 m_read32_rom10: @ 0x800000 - 0x87ffff\r
704     m_read32_rom 0x10\r
705 \r
706 m_read32_rom11: @ 0x880000 - 0x8fffff\r
707     m_read32_rom 0x11\r
708 \r
709 m_read32_rom12: @ 0x900000 - 0x97ffff\r
710     m_read32_rom 0x12\r
711 \r
712 m_read32_rom13: @ 0x980000 - 0x9fffff\r
713     m_read32_rom 0x13\r
714 \r
715 m_read32_misc:\r
716     bic     r0, r0, #1\r
717     stmfd   sp!,{r0,lr}\r
718     mov     r1, #32\r
719     bl      OtherRead16\r
720     mov     r1, r0\r
721     ldmfd   sp!,{r0}\r
722     stmfd   sp!,{r1}\r
723     add     r0, r0, #2\r
724     mov     r1, #32\r
725     bl      OtherRead16\r
726     ldmfd   sp!,{r1,lr}\r
727     orr     r0, r0, r1, lsl #16\r
728     bx      lr\r
729 \r
730 m_read32_vdp:\r
731     tst     r0, #0x70000\r
732     tsteq   r0, #0x000e0\r
733     bxne    lr              @ invalid read\r
734     bic     r0, r0, #1\r
735     add     r1, r0, #2\r
736     stmfd   sp!,{r1,lr}\r
737     bl      PicoVideoRead\r
738     swp     r0, r0, [sp]\r
739     bl      PicoVideoRead\r
740     ldmfd   sp!,{r1,lr}\r
741     orr     r0, r0, r1, lsl #16\r
742     bx      lr\r
743 \r
744 m_read32_ram:\r
745     ldr     r1, =Pico\r
746     bic     r0, r0, #0xff0000\r
747     bic     r0, r0, #1\r
748     ldrh    r0, [r1, r0]!\r
749     ldrh    r1, [r1, #2]    @ 2ci\r
750     orr     r0, r1, r0, lsl #16\r
751     bx      lr\r
752 \r
753 m_read32_above_rom:\r
754     bic     r0, r0, #1\r
755     stmfd   sp!,{r0,lr}\r
756     mov     r1, #32\r
757     bl      OtherRead16End\r
758     mov     r1, r0\r
759     ldmfd   sp!,{r0}\r
760     stmfd   sp!,{r1}\r
761     add     r0, r0, #2\r
762     mov     r1, #32\r
763     bl      OtherRead16End\r
764     ldmfd   sp!,{r1,lr}\r
765     orr     r0, r0, r1, lsl #16\r
766     bx      lr\r
767 \r
768 .pool\r
769 \r
770 @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\r
771 \r
772 PicoWriteRomHW_SSF2: @ u32 a, u32 d\r
773     and     r0, r0, #0xe\r
774     movs    r0, r0, lsr #1\r
775     bne     pwr_banking\r
776 \r
777     @ sram register\r
778     ldr     r2, =(Pico+0x22211) @ Pico.m.sram_reg\r
779     ldrb    r0, [r2]\r
780     and     r1, r1, #3\r
781     bic     r0, r0, #3\r
782     orr     r0, r0, r1\r
783     strb    r0, [r2]\r
784     bx      lr\r
785 \r
786 pwr_banking:\r
787     and     r1, r1, #0x1f\r
788 \r
789     ldr     r3, =m_read8_def_table\r
790     ldr     r2, =m_read8_table\r
791     ldr     r12, [r3, r1, lsl #2]\r
792     str     r12, [r2, r0, lsl #2]\r
793 \r
794     ldr     r3, =m_read16_def_table\r
795     ldr     r2, =m_read16_table\r
796     ldr     r12, [r3, r1, lsl #2]\r
797     str     r12, [r2, r0, lsl #2]\r
798 \r
799     ldr     r3, =m_read32_def_table\r
800     ldr     r2, =m_read32_table\r
801     ldr     r12, [r3, r1, lsl #2]\r
802     str     r12, [r2, r0, lsl #2]\r
803  \r
804     bx      lr\r
805 \r
806 @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\r
807 \r
808 @ Here we only handle most often used locations,\r
809 @ everything else is passed to generic handlers\r
810 \r
811 PicoWrite8: @ u32 a, u8 d\r
812     bic     r0, r0, #0xff000000\r
813     and     r2, r0, #0x00e00000\r
814     cmp     r2,     #0x00e00000 @ RAM?\r
815     ldr     r3, =Pico\r
816     biceq   r0, r0, #0x00ff0000\r
817     eoreq   r0, r0, #1\r
818     streqb  r1, [r3, r0]\r
819     bxeq    lr\r
820 \r
821 m_m68k_write8_misc:\r
822     bic     r2, r0, #0x1f    @ most commonly we get i/o port write,\r
823     cmp     r2, #0xa10000    @ so check for it first\r
824     bne     m_write8_misc2\r
825 m_write8_io:\r
826     ldr     r2, =PicoOpt\r
827     and     r0, r0, #0x1e\r
828     ldr     r2, [r2]\r
829     ldr     r3, =(Pico+0x22000) @ Pico.ioports\r
830     tst     r2, #0x20        @ 6 button pad?\r
831     streqb  r1, [r3, r0, lsr #1]\r
832     bxeq    lr\r
833     cmp     r0, #2\r
834     cmpne   r0, #4\r
835     bne     m_write8_io_done @ not likely to happen\r
836     add     r2, r3, #0x200   @ Pico+0x22200\r
837     mov     r12,#0\r
838     cmp     r0, #2\r
839     streqb  r12,[r2,#0x18]\r
840     strneb  r12,[r2,#0x19]   @ Pico.m.padDelay[i] = 0\r
841     tst     r1, #0x40        @ TH\r
842     beq     m_write8_io_done\r
843     ldrb    r12,[r3, r0, lsr #1]\r
844     tst     r12,#0x40\r
845     bne     m_write8_io_done\r
846     cmp     r0, #2\r
847     ldreqb  r12,[r2,#0x0a]\r
848     ldrneb  r12,[r2,#0x0b]   @ Pico.m.padTHPhase\r
849     add     r12,r12,#1\r
850     streqb  r12,[r2,#0x0a]\r
851     strneb  r12,[r2,#0x0b]   @ Pico.m.padTHPhase\r
852 m_write8_io_done:\r
853     strb    r1, [r3, r0, lsr #1]\r
854     bx      lr\r
855 \r
856 \r
857 m_write8_misc2:\r
858     and     r2, r0, #0xff0000\r
859     cmp     r2,     #0xa00000 @ z80 area?\r
860     bne     m_write8_not_z80\r
861     tst     r0, #0x4000\r
862     bne     m_write8_z80_not_ram\r
863     ldr     r3, =(Pico+0x20000) @ Pico.zram\r
864     add     r2, r3, #0x02200 @ Pico+0x22200\r
865     ldrb    r2, [r2, #9]     @ Pico.m.z80Run\r
866     bic     r0, r0, #0xff0000\r
867     bic     r0, r0, #0x00e000\r
868     tst     r2, #1\r
869     streqb  r1, [r3, r0]     @ zram\r
870     bx      lr\r
871 \r
872 m_write8_z80_not_ram:\r
873     and     r2, r0, #0x6000\r
874     cmp     r2,     #0x4000\r
875     bne     m_write8_z80_not_ym2612\r
876     ldr     r2, =PicoOpt\r
877     and     r0, r0, #3\r
878     ldr     r2, [r2]\r
879     tst     r2, #1\r
880     bxeq    lr\r
881     stmfd   sp!,{lr}\r
882 .if EXTERNAL_YM2612\r
883     tst     r2, #0x200\r
884     ldreq   r2, =YM2612Write_\r
885     ldrne   r2, =YM2612Write_940\r
886     mov     lr, pc\r
887     bx      r2\r
888 .else\r
889     bl      YM2612Write_\r
890 .endif\r
891     ldr     r2, =emustatus\r
892     ldmfd   sp!,{lr}\r
893     ldr     r1, [r2]\r
894     orr     r1, r0, r2\r
895     str     r1, [r2]         @ emustatus|=YM2612Write(a&3, d);\r
896     bx      lr\r
897 \r
898 m_write8_z80_not_ym2612:     @ not too likely\r
899     mov     r2, r0, lsl #17\r
900     bic     r2, r2, #6<<17\r
901     mov     r3,     #0x7f00\r
902     orr     r3, r3, #0x0011\r
903     cmp     r3, r2, lsr #17  @ psg @ z80 area?\r
904     beq     m_write8_psg\r
905     and     r2, r0, #0x7f00\r
906     cmp     r2,     #0x6000  @ bank register?\r
907     bxne    lr               @ invalid write\r
908 \r
909 m_write8_z80_bank_reg:\r
910     ldr     r3, =(Pico+0x22208) @ Pico.m\r
911     ldrh    r2, [r3, #0x0a]\r
912     mov     r1, r1, lsr #8\r
913     orr     r2, r1, r2, lsr #1\r
914     bic     r2, r2, #0xfe00\r
915     strh    r2, [r3, #0x0a]\r
916     bx      lr\r
917 \r
918 \r
919 m_write8_not_z80:\r
920     and     r2, r0, #0xe70000\r
921     cmp     r2, #0xc00000    @ VDP area?\r
922     bne     OtherWrite8      @ passthrough\r
923     and     r2, r0, #0xf9\r
924     cmp     r2, #0x11\r
925     bne     OtherWrite8\r
926 m_write8_psg:\r
927     ldr     r2, =PicoOpt\r
928     mov     r0, r1\r
929     ldr     r2, [r2]\r
930     tst     r2, #2\r
931     bxeq    lr\r
932     b       SN76496Write\r
933 \r