memhandlers slightly improved
[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_read_null     @ 0xD00000 - 0xD7FFFF\r
44     .long   m_read_null     @ 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_read_null      @ 0xC80000 - 0xCFFFFF\r
77     .long   m_read_null      @ 0xD00000 - 0xD7FFFF\r
78     .long   m_read_null      @ 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_read_null      @ 0xC80000 - 0xCFFFFF\r
111     .long   m_read_null      @ 0xD00000 - 0xD7FFFF\r
112     .long   m_read_null      @ 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 (1ci)\r
288     cmp     r0, r1\r
289     blt     m_read8_nosram\r
290     ldrb    r1, [r3, #0x11] @ Pico.m.sram_reg (1ci)\r
291     sub     r12,r0, #0x200000\r
292     tst     r1, #0x10\r
293     bne     m_read8_detected\r
294     cmp     r12,#1\r
295     ble     m_read8_detected\r
296     tst     r1, #1\r
297     orrne   r1, r1, #0x10\r
298     strneb  r1, [r3, #0x11]\r
299 m_read8_detected:\r
300     tst     r1, #4          @ EEPROM read?\r
301     ldrne   r0, =SRAMReadEEPROM @ (1ci if ne)\r
302     bxne    r0\r
303 m_read8_noteeprom:\r
304     tst     r1, #1\r
305     beq     m_read8_nosram\r
306     ldr     r3, [r2]        @ SRam.data\r
307     ldr     r2, [r2, #4]    @ SRam.start (1ci)\r
308     sub     r3, r3, r2\r
309     ldrb    r0, [r3, r0]\r
310     bx      lr\r
311 m_read8_nosram:\r
312     ldr     r1, [r3, #4]    @ 1ci\r
313     cmp     r0, r1\r
314     movgt   r0, #0\r
315     bxgt    lr              @ bad location\r
316     ldr     r1, [r3]\r
317     eor     r0, r0, #1\r
318     ldrb    r0, [r1, r0]\r
319     bx      lr\r
320 \r
321 m_read8_rom5: @ 0x280000 - 0x2fffff\r
322     m_read8_rom 5\r
323 \r
324 m_read8_rom6: @ 0x300000 - 0x37ffff\r
325     m_read8_rom 6\r
326 \r
327 m_read8_rom7: @ 0x380000 - 0x3fffff\r
328     m_read8_rom 7\r
329 \r
330 m_read8_rom8: @ 0x400000 - 0x47ffff\r
331     m_read8_rom 8\r
332 \r
333 m_read8_rom9: @ 0x480000 - 0x4fffff\r
334     m_read8_rom 9\r
335 \r
336 m_read8_romA: @ 0x500000 - 0x57ffff\r
337     m_read8_rom 0xA\r
338 \r
339 m_read8_romB: @ 0x580000 - 0x5fffff\r
340     m_read8_rom 0xB\r
341 \r
342 m_read8_romC: @ 0x600000 - 0x67ffff\r
343     m_read8_rom 0xC\r
344 \r
345 m_read8_romD: @ 0x680000 - 0x6fffff\r
346     m_read8_rom 0xD\r
347 \r
348 m_read8_romE: @ 0x700000 - 0x77ffff\r
349     m_read8_rom 0xE\r
350 \r
351 m_read8_romF: @ 0x780000 - 0x7fffff\r
352     m_read8_rom 0xF\r
353 \r
354 m_read8_rom10: @ 0x800000 - 0x87ffff\r
355     m_read8_rom 0x10\r
356 \r
357 m_read8_rom11: @ 0x880000 - 0x8fffff\r
358     m_read8_rom 0x11\r
359 \r
360 m_read8_rom12: @ 0x900000 - 0x97ffff\r
361     m_read8_rom 0x12\r
362 \r
363 m_read8_rom13: @ 0x980000 - 0x9fffff\r
364     m_read8_rom 0x13\r
365 \r
366 \r
367 m_m68k_read8_misc:\r
368 m_read8_misc:\r
369     bic     r2, r0, #0x001f @ most commonly we get i/o port read,\r
370     cmp     r2, #0xa10000   @ so check for it first\r
371     bne     m_read8_misc2\r
372 m_read8_misc_io:\r
373     ands    r0, r0, #0x1e\r
374     beq     m_read8_misc_hwreg\r
375     cmp     r0, #4\r
376     ldrle   r2, =PadRead\r
377     movlt   r0, #0\r
378     moveq   r0, #1\r
379     bxle    r2\r
380     ldr     r3, =(Pico+0x22000)\r
381     mov     r0, r0, lsr #1  @ other IO ports (Pico.ioports[a])\r
382     ldrb    r0, [r3, r0]\r
383     bx      lr\r
384 \r
385 m_read8_misc_hwreg:\r
386     ldr     r3, =(Pico+0x22200)\r
387     ldrb    r0, [r3, #0x0f] @ Pico.m.hardware\r
388     bx      lr\r
389 \r
390 m_read8_misc2:\r
391     mov     r2,     #0xa10000 @ games also like to poll busreq,\r
392     orr     r2, r2, #0x001100 @ so we'll try it now\r
393     cmp     r0, r2\r
394     ldreq   r2, =z80ReadBusReq\r
395     bxeq    r2\r
396 \r
397     and     r2, r0, #0xff0000 @ finally it might be\r
398     cmp     r2,     #0xa00000 @ z80 area\r
399     bne     m_read8_misc3\r
400     tst     r0, #0x4000\r
401     ldreq   r2, =z80Read8     @ z80 RAM\r
402     bxeq    r2\r
403     and     r2, r0, #0x6000\r
404     cmp     r2, #0x4000\r
405     mvnne   r0, #0\r
406     bxne    lr                @ invalid\r
407 .if EXTERNAL_YM2612\r
408     ldr     r1, =PicoOpt\r
409     ldr     r1, [r1]\r
410     tst     r1, #1\r
411     beq     m_read8_fake_ym2612\r
412     tst     r1, #0x200\r
413     ldreq   r2, =YM2612Read_\r
414     ldrne   r2, =YM2612Read_940\r
415 .else\r
416     ldr     r2, =YM2612Read_\r
417 .endif\r
418     bx      r2                @ ym2612\r
419 \r
420 m_read8_fake_ym2612:\r
421     ldr     r3, =(Pico+0x22200)\r
422     ldrb    r0, [r3, #8]      @ Pico.m.rotate\r
423     add     r1, r0, #1\r
424     strb    r1, [r3, #8]\r
425     and     r0, r0, #3\r
426     bx      lr\r
427 \r
428 m_read8_misc3:\r
429     @ if everything else fails, use generic handler\r
430     stmfd   sp!,{r0,lr}\r
431     bic     r0, r0, #1\r
432     mov     r1, #8\r
433     bl      OtherRead16\r
434     ldmfd   sp!,{r1,lr}\r
435     tst     r1, #1\r
436     moveq   r0, r0, lsr #8\r
437     bx      lr\r
438 \r
439 \r
440 m_read8_vdp:\r
441     tst     r0, #0x70000\r
442     tsteq   r0, #0x000e0\r
443     bxne    lr              @ invalid read\r
444     stmfd   sp!,{r0,lr}\r
445     bic     r0, r0, #1\r
446     bl      PicoVideoRead\r
447     ldmfd   sp!,{r1,lr}\r
448     tst     r1, #1\r
449     moveq   r0, r0, lsr #8\r
450     bx      lr\r
451 \r
452 m_read8_ram:\r
453     ldr     r1, =Pico\r
454     bic     r0, r0, #0xff0000\r
455     eor     r0, r0, #1\r
456     ldrb    r0, [r1, r0]\r
457     bx      lr\r
458 \r
459 m_read8_above_rom:\r
460     stmfd   sp!,{r0,lr}\r
461     bic     r0, r0, #1\r
462     mov     r1, #8\r
463     bl      OtherRead16End\r
464     ldmfd   sp!,{r1,lr}\r
465     tst     r1, #1\r
466     moveq   r0, r0, lsr #8\r
467     bx      lr\r
468 \r
469 .pool\r
470 \r
471 @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\r
472 \r
473 .macro m_read16_rom sect\r
474     ldr     r1, =(Pico+0x22200)\r
475     bic     r0, r0, #0xf80000\r
476     ldr     r1, [r1]\r
477     bic     r0, r0, #1\r
478 .if \sect\r
479     orr     r0, r0, #0x080000*\sect\r
480 .endif\r
481     ldrh    r0, [r1, r0]\r
482     bx      lr\r
483 .endm\r
484 \r
485 \r
486 m_read16_rom0: @ 0x000000 - 0x07ffff\r
487     m_read16_rom 0\r
488 \r
489 m_read16_rom1: @ 0x080000 - 0x0fffff\r
490     m_read16_rom 1\r
491 \r
492 m_read16_rom2: @ 0x100000 - 0x17ffff\r
493     m_read16_rom 2\r
494 \r
495 m_read16_rom3: @ 0x180000 - 0x1fffff\r
496     m_read16_rom 3\r
497 \r
498 m_read16_rom4: @ 0x200000 - 0x27ffff, SRAM area (NBA Live 95)\r
499     ldr     r2, =(SRam)\r
500     ldr     r3, =(Pico+0x22200)\r
501     ldr     r1, [r2, #8]    @ SRam.end\r
502     bic     r0, r0, #0xf80000\r
503     bic     r0, r0, #1\r
504     orr     r0, r0, #0x200000\r
505     cmp     r0, r1\r
506     bgt     m_read16_nosram\r
507     ldrb    r1, [r3, #0x11] @ Pico.m.sram_reg (2ci)\r
508     tst     r1, #1\r
509     beq     m_read16_nosram\r
510     ldr     r1, [r2, #4]    @ SRam.start (1ci)\r
511     cmp     r0, r1\r
512     blt     m_read16_nosram\r
513     ldr     r2, [r2]        @ SRam.data (1ci)\r
514     sub     r2, r2, r1\r
515     ldrh    r0, [r2, r0]    @ 2ci\r
516     and     r1, r0, #0xff\r
517     mov     r0, r0, lsr #8\r
518     orr     r0, r0, r1, lsl #8\r
519     bx      lr\r
520 \r
521 m_read16_nosram:\r
522     ldr     r1, [r3, #4]    @ 1ci\r
523     cmp     r0, r1\r
524     movgt   r0, #0\r
525     bxgt    lr              @ bad location\r
526     ldr     r1, [r3]        @ 1ci\r
527     ldrh    r0, [r1, r0]\r
528     bx      lr\r
529 \r
530 m_read16_rom5: @ 0x280000 - 0x2fffff\r
531     m_read16_rom 5\r
532 \r
533 m_read16_rom6: @ 0x300000 - 0x37ffff\r
534     m_read16_rom 6\r
535 \r
536 m_read16_rom7: @ 0x380000 - 0x3fffff\r
537     m_read16_rom 7\r
538 \r
539 m_read16_rom8: @ 0x400000 - 0x47ffff\r
540     m_read16_rom 8\r
541 \r
542 m_read16_rom9: @ 0x480000 - 0x4fffff\r
543     m_read16_rom 9\r
544 \r
545 m_read16_romA: @ 0x500000 - 0x57ffff\r
546     m_read16_rom 0xA\r
547 \r
548 m_read16_romB: @ 0x580000 - 0x5fffff\r
549     m_read16_rom 0xB\r
550 \r
551 m_read16_romC: @ 0x600000 - 0x67ffff\r
552     m_read16_rom 0xC\r
553 \r
554 m_read16_romD: @ 0x680000 - 0x6fffff\r
555     m_read16_rom 0xD\r
556 \r
557 m_read16_romE: @ 0x700000 - 0x77ffff\r
558     m_read16_rom 0xE\r
559 \r
560 m_read16_romF: @ 0x780000 - 0x7fffff\r
561     m_read16_rom 0xF\r
562 \r
563 m_read16_rom10: @ 0x800000 - 0x87ffff\r
564     m_read16_rom 0x10\r
565 \r
566 m_read16_rom11: @ 0x880000 - 0x8fffff\r
567     m_read16_rom 0x11\r
568 \r
569 m_read16_rom12: @ 0x900000 - 0x97ffff\r
570     m_read16_rom 0x12\r
571 \r
572 m_read16_rom13: @ 0x980000 - 0x9fffff\r
573     m_read16_rom 0x13\r
574 \r
575 m_read16_misc:\r
576     bic     r0, r0, #1\r
577     mov     r1, #16\r
578     b       OtherRead16\r
579 \r
580 m_read16_vdp:\r
581     tst     r0, #0x70000\r
582     tsteq   r0, #0x000e0\r
583     bxne    lr              @ invalid read\r
584     bic     r0, r0, #1\r
585     b       PicoVideoRead\r
586 \r
587 m_read16_ram:\r
588     ldr     r1, =Pico\r
589     bic     r0, r0, #0xff0000\r
590     bic     r0, r0, #1\r
591     ldrh    r0, [r1, r0]\r
592     bx      lr\r
593 \r
594 m_read16_above_rom:\r
595     bic     r0, r0, #1\r
596     mov     r1, #16\r
597     b       OtherRead16End\r
598 \r
599 .pool\r
600 \r
601 @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\r
602 \r
603 .macro m_read32_rom sect\r
604     ldr     r1, =(Pico+0x22200)\r
605     bic     r0, r0, #0xf80000\r
606     ldr     r1, [r1]\r
607     bic     r0, r0, #1\r
608 .if \sect\r
609     orr     r0, r0, #0x080000*\sect\r
610 .endif\r
611     ldrh    r0, [r1, r0]!\r
612     ldrh    r1, [r1, #2]           @ 1ci\r
613     orr     r0, r1, r0, lsl #16\r
614     bx      lr\r
615 .endm\r
616 \r
617 \r
618 m_read32_rom0: @ 0x000000 - 0x07ffff\r
619     m_read32_rom 0\r
620 \r
621 m_read32_rom1: @ 0x080000 - 0x0fffff\r
622     m_read32_rom 1\r
623 \r
624 m_read32_rom2: @ 0x100000 - 0x17ffff\r
625     m_read32_rom 2\r
626 \r
627 m_read32_rom3: @ 0x180000 - 0x1fffff\r
628     m_read32_rom 3\r
629 \r
630 m_read32_rom4: @ 0x200000 - 0x27ffff, SRAM area (does any game do long reads?)\r
631     ldr     r2, =(SRam)\r
632     ldr     r3, =(Pico+0x22200)\r
633     ldr     r1, [r2, #8]    @ SRam.end\r
634     bic     r0, r0, #0xf80000\r
635     bic     r0, r0, #1\r
636     orr     r0, r0, #0x200000\r
637     cmp     r0, r1\r
638     bgt     m_read32_nosram\r
639     ldrb    r1, [r3, #0x11] @ Pico.m.sram_reg (2ci)\r
640     tst     r1, #1\r
641     beq     m_read32_nosram\r
642     ldr     r1, [r2, #4]    @ SRam.start (1ci)\r
643     cmp     r0, r1\r
644     blt     m_read32_nosram\r
645     ldr     r2, [r2]        @ SRam.data (1ci)\r
646     sub     r2, r2, r1\r
647     ldrh    r0, [r2, r0]!   @ (1ci)\r
648     ldrh    r1, [r2, #2]\r
649     orr     r0, r0, r0, lsl #16\r
650     mov     r0, r0, ror #8\r
651     mov     r0, r0, lsl #16\r
652     orr     r0, r0, r1, lsr #8\r
653     and     r1, r1, #0xff\r
654     orr     r0, r0, r1, lsl #8\r
655     bx      lr\r
656 \r
657 m_read32_nosram:\r
658     ldr     r1, [r3, #4]    @ (1ci)\r
659     cmp     r0, r1\r
660     movgt   r0, #0\r
661     bxgt    lr              @ bad location\r
662     ldr     r1, [r3]        @ (1ci)\r
663     ldrh    r0, [r1, r0]!\r
664     ldrh    r1, [r1, #2]    @ (2ci)\r
665     orr     r0, r1, r0, lsl #16\r
666     bx      lr\r
667 \r
668 m_read32_rom5: @ 0x280000 - 0x2fffff\r
669     m_read32_rom 5\r
670 \r
671 m_read32_rom6: @ 0x300000 - 0x37ffff\r
672     m_read32_rom 6\r
673 \r
674 m_read32_rom7: @ 0x380000 - 0x3fffff\r
675     m_read32_rom 7\r
676 \r
677 m_read32_rom8: @ 0x400000 - 0x47ffff\r
678     m_read32_rom 8\r
679 \r
680 m_read32_rom9: @ 0x480000 - 0x4fffff\r
681     m_read32_rom 9\r
682 \r
683 m_read32_romA: @ 0x500000 - 0x57ffff\r
684     m_read32_rom 0xA\r
685 \r
686 m_read32_romB: @ 0x580000 - 0x5fffff\r
687     m_read32_rom 0xB\r
688 \r
689 m_read32_romC: @ 0x600000 - 0x67ffff\r
690     m_read32_rom 0xC\r
691 \r
692 m_read32_romD: @ 0x680000 - 0x6fffff\r
693     m_read32_rom 0xD\r
694 \r
695 m_read32_romE: @ 0x700000 - 0x77ffff\r
696     m_read32_rom 0xE\r
697 \r
698 m_read32_romF: @ 0x780000 - 0x7fffff\r
699     m_read32_rom 0xF\r
700 \r
701 m_read32_rom10: @ 0x800000 - 0x87ffff\r
702     m_read32_rom 0x10\r
703 \r
704 m_read32_rom11: @ 0x880000 - 0x8fffff\r
705     m_read32_rom 0x11\r
706 \r
707 m_read32_rom12: @ 0x900000 - 0x97ffff\r
708     m_read32_rom 0x12\r
709 \r
710 m_read32_rom13: @ 0x980000 - 0x9fffff\r
711     m_read32_rom 0x13\r
712 \r
713 m_read32_misc:\r
714     bic     r0, r0, #1\r
715     stmfd   sp!,{r0,lr}\r
716     mov     r1, #32\r
717     bl      OtherRead16\r
718     mov     r1, r0\r
719     ldmfd   sp!,{r0}\r
720     stmfd   sp!,{r1}\r
721     add     r0, r0, #2\r
722     mov     r1, #32\r
723     bl      OtherRead16\r
724     ldmfd   sp!,{r1,lr}\r
725     orr     r0, r0, r1, lsl #16\r
726     bx      lr\r
727 \r
728 m_read32_vdp:\r
729     tst     r0, #0x70000\r
730     tsteq   r0, #0x000e0\r
731     bxne    lr              @ invalid read\r
732     bic     r0, r0, #1\r
733     add     r1, r0, #2\r
734     stmfd   sp!,{r1,lr}\r
735     bl      PicoVideoRead\r
736     swp     r0, r0, [sp]\r
737     bl      PicoVideoRead\r
738     ldmfd   sp!,{r1,lr}\r
739     orr     r0, r0, r1, lsl #16\r
740     bx      lr\r
741 \r
742 m_read32_ram:\r
743     ldr     r1, =Pico\r
744     bic     r0, r0, #0xff0000\r
745     bic     r0, r0, #1\r
746     ldrh    r0, [r1, r0]!\r
747     ldrh    r1, [r1, #2]    @ 2ci\r
748     orr     r0, r1, r0, lsl #16\r
749     bx      lr\r
750 \r
751 m_read32_above_rom:\r
752     bic     r0, r0, #1\r
753     stmfd   sp!,{r0,lr}\r
754     mov     r1, #32\r
755     bl      OtherRead16End\r
756     mov     r1, r0\r
757     ldmfd   sp!,{r0}\r
758     stmfd   sp!,{r1}\r
759     add     r0, r0, #2\r
760     mov     r1, #32\r
761     bl      OtherRead16End\r
762     ldmfd   sp!,{r1,lr}\r
763     orr     r0, r0, r1, lsl #16\r
764     bx      lr\r
765 \r
766 .pool\r
767 \r
768 @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\r
769 \r
770 PicoWriteRomHW_SSF2: @ u32 a, u32 d\r
771     and     r0, r0, #0xe\r
772     movs    r0, r0, lsr #1\r
773     bne     pwr_banking\r
774 \r
775     @ sram register\r
776     ldr     r2, =(Pico+0x22211) @ Pico.m.sram_reg\r
777     ldrb    r0, [r2]\r
778     and     r1, r1, #3\r
779     bic     r0, r0, #3\r
780     orr     r0, r0, r1\r
781     strb    r0, [r2]\r
782     bx      lr\r
783 \r
784 pwr_banking:\r
785     and     r1, r1, #0x1f\r
786 \r
787     ldr     r3, =m_read8_def_table\r
788     ldr     r2, =m_read8_table\r
789     ldr     r12, [r3, r1, lsl #2]\r
790     str     r12, [r2, r0, lsl #2]\r
791 \r
792     ldr     r3, =m_read16_def_table\r
793     ldr     r2, =m_read16_table\r
794     ldr     r12, [r3, r1, lsl #2]\r
795     str     r12, [r2, r0, lsl #2]\r
796 \r
797     ldr     r3, =m_read32_def_table\r
798     ldr     r2, =m_read32_table\r
799     ldr     r12, [r3, r1, lsl #2]\r
800     str     r12, [r2, r0, lsl #2]\r
801  \r
802     bx      lr\r
803 \r
804 @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\r
805 \r
806 @ Here we only handle most often used locations,\r
807 @ everything else is passed to generic handlers\r
808 \r
809 PicoWrite8: @ u32 a, u8 d\r
810     bic     r0, r0, #0xff000000\r
811     and     r2, r0, #0x00e00000\r
812     cmp     r2,     #0x00e00000 @ RAM?\r
813     ldr     r3, =Pico\r
814     biceq   r0, r0, #0x00ff0000\r
815     eoreq   r0, r0, #1\r
816     streqb  r1, [r3, r0]\r
817     bxeq    lr\r
818 \r
819 m_m68k_write8_misc:\r
820     bic     r2, r0, #0x1f    @ most commonly we get i/o port write,\r
821     cmp     r2, #0xa10000    @ so check for it first\r
822     bne     m_write8_misc2\r
823 m_write8_io:\r
824     ldr     r2, =PicoOpt\r
825     and     r0, r0, #0x1e\r
826     ldr     r2, [r2]\r
827     ldr     r3, =(Pico+0x22000) @ Pico.ioports\r
828     tst     r2, #0x20        @ 6 button pad?\r
829     streqb  r1, [r3, r0, lsr #1]\r
830     bxeq    lr\r
831     cmp     r0, #2\r
832     cmpne   r0, #4\r
833     bne     m_write8_io_done @ not likely to happen\r
834     add     r2, r3, #0x200   @ Pico+0x22200\r
835     mov     r12,#0\r
836     cmp     r0, #2\r
837     streqb  r12,[r2,#0x18]\r
838     strneb  r12,[r2,#0x19]   @ Pico.m.padDelay[i] = 0\r
839     tst     r1, #0x40        @ TH\r
840     beq     m_write8_io_done\r
841     ldrb    r12,[r3, r0, lsr #1]\r
842     tst     r12,#0x40\r
843     bne     m_write8_io_done\r
844     cmp     r0, #2\r
845     ldreqb  r12,[r2,#0x0a]\r
846     ldrneb  r12,[r2,#0x0b]   @ Pico.m.padTHPhase\r
847     add     r12,r12,#1\r
848     streqb  r12,[r2,#0x0a]\r
849     strneb  r12,[r2,#0x0b]   @ Pico.m.padTHPhase\r
850 m_write8_io_done:\r
851     strb    r1, [r3, r0, lsr #1]\r
852     bx      lr\r
853 \r
854 \r
855 m_write8_misc2:\r
856     and     r2, r0, #0xff0000\r
857     cmp     r2,     #0xa00000 @ z80 area?\r
858     bne     m_write8_not_z80\r
859     tst     r0, #0x4000\r
860     bne     m_write8_z80_not_ram\r
861     ldr     r3, =(Pico+0x20000) @ Pico.zram\r
862     add     r2, r3, #0x02200 @ Pico+0x22200\r
863     ldrb    r2, [r2, #9]     @ Pico.m.z80Run\r
864     bic     r0, r0, #0xff0000\r
865     bic     r0, r0, #0x00e000\r
866     tst     r2, #1\r
867     streqb  r1, [r3, r0]     @ zram\r
868     bx      lr\r
869 \r
870 m_write8_z80_not_ram:\r
871     and     r2, r0, #0x6000\r
872     cmp     r2,     #0x4000\r
873     bne     m_write8_z80_not_ym2612\r
874     ldr     r2, =PicoOpt\r
875     and     r0, r0, #3\r
876     ldr     r2, [r2]\r
877     tst     r2, #1\r
878     bxeq    lr\r
879     stmfd   sp!,{lr}\r
880 .if EXTERNAL_YM2612\r
881     tst     r2, #0x200\r
882     ldreq   r2, =YM2612Write_\r
883     ldrne   r2, =YM2612Write_940\r
884     mov     lr, pc\r
885     bx      r2\r
886 .else\r
887     bl      YM2612Write_\r
888 .endif\r
889     ldr     r2, =emustatus\r
890     ldmfd   sp!,{lr}\r
891     ldr     r1, [r2]\r
892     orr     r1, r0, r2\r
893     str     r1, [r2]         @ emustatus|=YM2612Write(a&3, d);\r
894     bx      lr\r
895 \r
896 m_write8_z80_not_ym2612:     @ not too likely\r
897     mov     r2, r0, lsl #17\r
898     bic     r2, r2, #6<<17\r
899     mov     r3,     #0x7f00\r
900     orr     r3, r3, #0x0011\r
901     cmp     r3, r2, lsr #17  @ psg @ z80 area?\r
902     beq     m_write8_psg\r
903     and     r2, r0, #0x7f00\r
904     cmp     r2,     #0x6000  @ bank register?\r
905     bxne    lr               @ invalid write\r
906 \r
907 m_write8_z80_bank_reg:\r
908     ldr     r3, =(Pico+0x22208) @ Pico.m\r
909     ldrh    r2, [r3, #0x0a]\r
910     mov     r1, r1, lsr #8\r
911     orr     r2, r1, r2, lsr #1\r
912     bic     r2, r2, #0xfe00\r
913     strh    r2, [r3, #0x0a]\r
914     bx      lr\r
915 \r
916 \r
917 m_write8_not_z80:\r
918     and     r2, r0, #0xe70000\r
919     cmp     r2, #0xc00000    @ VDP area?\r
920     bne     m_write8_misc4\r
921     and     r2, r0, #0xf9\r
922     cmp     r2, #0x11\r
923     bne     m_write8_misc4\r
924 m_write8_psg:\r
925     ldr     r2, =PicoOpt\r
926     mov     r0, r1\r
927     ldr     r2, [r2]\r
928     tst     r2, #2\r
929     bxeq    lr\r
930     ldr     r2, =SN76496Write\r
931     bx      r2\r
932     \r
933 \r
934 m_write8_misc4:\r
935     @ passthrough\r
936     ldr     r2, =OtherWrite8\r
937     bx      r2\r
938 \r