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