1 @ vim:filetype=armasm
\r
3 @ memory handlers with banking support for SSF II - The New Challengers
\r
4 @ mostly based on Gens code
\r
6 @ (c) Copyright 2006-2007, Grazvydas "notaz" Ignotas
\r
7 @ All Rights Reserved
\r
13 @ default jump tables
\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 - for all those large ROM hacks
\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_read8_rom10 @ 0x800000 - 0x87FFFF
\r
33 .long m_read8_rom11 @ 0x880000 - 0x8FFFFF
\r
34 .long m_read8_rom12 @ 0x900000 - 0x97FFFF
\r
35 .long m_read8_rom13 @ 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
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_read16_rom10 @ 0x800000 - 0x87FFFF
\r
67 .long m_read16_rom11 @ 0x880000 - 0x8FFFFF
\r
68 .long m_read16_rom12 @ 0x900000 - 0x97FFFF
\r
69 .long m_read16_rom13 @ 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
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_read32_rom10 @ 0x800000 - 0x87FFFF
\r
101 .long m_read32_rom11 @ 0x880000 - 0x8FFFFF
\r
102 .long m_read32_rom12 @ 0x900000 - 0x97FFFF
\r
103 .long m_read32_rom13 @ 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
118 @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
\r
121 @.section .bss, "brw"
\r
135 @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
\r
139 .global PicoMemReset
\r
143 .global PicoWriteRomHW_SSF2
\r
147 ldr r12,=(Pico+0x22204)
\r
148 ldr r12,[r12] @ romsize
\r
149 add r12,r12,#0x80000
\r
151 mov r12,r12,lsr #19
\r
153 ldr r0, =m_read8_table
\r
154 ldr r1, =m_read8_def_table
\r
162 ldr r0, =m_read16_table
\r
163 ldr r1, =m_read16_def_table
\r
171 ldr r0, =m_read32_table
\r
172 ldr r1, =m_read32_def_table
\r
180 @ update memhandlers according to ROM size
\r
181 ldr r1, =m_read8_above_rom
\r
182 ldr r0, =m_read8_table
\r
189 beq 1b @ do not touch the SRAM area
\r
190 str r1, [r0, r2, lsl #2]
\r
193 ldr r1, =m_read16_above_rom
\r
194 ldr r0, =m_read16_table
\r
202 str r1, [r0, r2, lsl #2]
\r
205 ldr r1, =m_read32_above_rom
\r
206 ldr r0, =m_read32_table
\r
214 str r1, [r0, r2, lsl #2]
\r
221 @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
\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
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
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
243 @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
\r
250 .macro m_read8_rom sect
\r
251 ldr r1, =(Pico+0x22200)
\r
252 bic r0, r0, #0xf80000
\r
255 orr r0, r0, #0x080000*\sect
\r
263 m_read8_rom0: @ 0x000000 - 0x07ffff
\r
266 m_read8_rom1: @ 0x080000 - 0x0fffff
\r
269 m_read8_rom2: @ 0x100000 - 0x17ffff
\r
272 m_read8_rom3: @ 0x180000 - 0x1fffff
\r
275 m_read8_rom4: @ 0x200000 - 0x27ffff, SRAM area
\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
283 ldr r1, [r2, #4] @ SRam.start (1ci)
\r
286 ldrb r1, [r3, #0x11] @ Pico.m.sram_reg (1ci)
\r
287 sub r12,r0, #0x200000
\r
289 bne m_read8_detected
\r
291 ble m_read8_detected
\r
293 orrne r1, r1, #0x10
\r
294 strneb r1, [r3, #0x11]
\r
296 tst r1, #4 @ EEPROM read?
\r
297 ldrne r0, =SRAMReadEEPROM @ (1ci if ne)
\r
302 ldr r3, [r2] @ SRam.data
\r
303 ldr r2, [r2, #4] @ SRam.start (1ci)
\r
308 ldr r1, [r3, #4] @ 1ci
\r
311 bxgt lr @ bad location
\r
317 m_read8_rom5: @ 0x280000 - 0x2fffff
\r
320 m_read8_rom6: @ 0x300000 - 0x37ffff
\r
323 m_read8_rom7: @ 0x380000 - 0x3fffff
\r
326 m_read8_rom8: @ 0x400000 - 0x47ffff
\r
329 m_read8_rom9: @ 0x480000 - 0x4fffff
\r
332 m_read8_romA: @ 0x500000 - 0x57ffff
\r
335 m_read8_romB: @ 0x580000 - 0x5fffff
\r
338 m_read8_romC: @ 0x600000 - 0x67ffff
\r
341 m_read8_romD: @ 0x680000 - 0x6fffff
\r
344 m_read8_romE: @ 0x700000 - 0x77ffff
\r
347 m_read8_romF: @ 0x780000 - 0x7fffff
\r
350 m_read8_rom10: @ 0x800000 - 0x87ffff
\r
353 m_read8_rom11: @ 0x880000 - 0x8fffff
\r
356 m_read8_rom12: @ 0x900000 - 0x97ffff
\r
359 m_read8_rom13: @ 0x980000 - 0x9fffff
\r
363 bic r2, r0, #0x00ff
\r
364 bic r2, r2, #0xbf00
\r
365 cmp r2, #0xa00000 @ Z80 RAM?
\r
366 ldreq r2, =z80Read8
\r
374 moveq r0, r0, lsr #8
\r
380 bxne lr @ invalid read
\r
386 moveq r0, r0, lsr #8
\r
391 bic r0, r0, #0xff0000
\r
403 moveq r0, r0, lsr #8
\r
408 @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
\r
410 .macro m_read16_rom sect
\r
411 ldr r1, =(Pico+0x22200)
\r
412 bic r0, r0, #0xf80000
\r
416 orr r0, r0, #0x080000*\sect
\r
423 m_read16_rom0: @ 0x000000 - 0x07ffff
\r
426 m_read16_rom1: @ 0x080000 - 0x0fffff
\r
429 m_read16_rom2: @ 0x100000 - 0x17ffff
\r
432 m_read16_rom3: @ 0x180000 - 0x1fffff
\r
435 m_read16_rom4: @ 0x200000 - 0x27ffff, SRAM area (NBA Live 95)
\r
437 ldr r3, =(Pico+0x22200)
\r
438 ldr r1, [r2, #8] @ SRam.end
\r
439 bic r0, r0, #0xf80000
\r
441 orr r0, r0, #0x200000
\r
443 bgt m_read16_nosram
\r
444 ldrb r1, [r3, #0x11] @ Pico.m.sram_reg (2ci)
\r
446 beq m_read16_nosram
\r
447 ldr r1, [r2, #4] @ SRam.start (1ci)
\r
449 blt m_read16_nosram
\r
450 ldr r2, [r2] @ SRam.data (1ci)
\r
452 ldrh r0, [r2, r0] @ 2ci
\r
455 orr r0, r0, r1, lsl #8
\r
459 ldr r1, [r3, #4] @ 1ci
\r
462 bxgt lr @ bad location
\r
467 m_read16_rom5: @ 0x280000 - 0x2fffff
\r
470 m_read16_rom6: @ 0x300000 - 0x37ffff
\r
473 m_read16_rom7: @ 0x380000 - 0x3fffff
\r
476 m_read16_rom8: @ 0x400000 - 0x47ffff
\r
479 m_read16_rom9: @ 0x480000 - 0x4fffff
\r
482 m_read16_romA: @ 0x500000 - 0x57ffff
\r
485 m_read16_romB: @ 0x580000 - 0x5fffff
\r
488 m_read16_romC: @ 0x600000 - 0x67ffff
\r
491 m_read16_romD: @ 0x680000 - 0x6fffff
\r
494 m_read16_romE: @ 0x700000 - 0x77ffff
\r
497 m_read16_romF: @ 0x780000 - 0x7fffff
\r
500 m_read16_rom10: @ 0x800000 - 0x87ffff
\r
503 m_read16_rom11: @ 0x880000 - 0x8fffff
\r
506 m_read16_rom12: @ 0x900000 - 0x97ffff
\r
509 m_read16_rom13: @ 0x980000 - 0x9fffff
\r
520 bxne lr @ invalid read
\r
526 bic r0, r0, #0xff0000
\r
531 m_read16_above_rom:
\r
538 @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
\r
540 .macro m_read32_rom sect
\r
541 ldr r1, =(Pico+0x22200)
\r
542 bic r0, r0, #0xf80000
\r
546 orr r0, r0, #0x080000*\sect
\r
549 ldrh r1, [r1, #2] @ 1ci
\r
550 orr r0, r1, r0, lsl #16
\r
555 m_read32_rom0: @ 0x000000 - 0x07ffff
\r
558 m_read32_rom1: @ 0x080000 - 0x0fffff
\r
561 m_read32_rom2: @ 0x100000 - 0x17ffff
\r
564 m_read32_rom3: @ 0x180000 - 0x1fffff
\r
567 m_read32_rom4: @ 0x200000 - 0x27ffff, SRAM area (does any game do long reads?)
\r
569 ldr r3, =(Pico+0x22200)
\r
570 ldr r1, [r2, #8] @ SRam.end
\r
571 bic r0, r0, #0xf80000
\r
573 orr r0, r0, #0x200000
\r
575 bgt m_read32_nosram
\r
576 ldrb r1, [r3, #0x11] @ Pico.m.sram_reg (2ci)
\r
578 beq m_read32_nosram
\r
579 ldr r1, [r2, #4] @ SRam.start (1ci)
\r
581 blt m_read32_nosram
\r
582 ldr r2, [r2] @ SRam.data (1ci)
\r
584 ldrh r0, [r2, r0]! @ (1ci)
\r
586 orr r0, r0, r0, lsl #16
\r
588 mov r0, r0, lsl #16
\r
589 orr r0, r0, r1, lsr #8
\r
591 orr r0, r0, r1, lsl #8
\r
595 ldr r1, [r3, #4] @ (1ci)
\r
598 bxgt lr @ bad location
\r
599 ldr r1, [r3] @ (1ci)
\r
601 ldrh r1, [r1, #2] @ (2ci)
\r
602 orr r0, r1, r0, lsl #16
\r
605 m_read32_rom5: @ 0x280000 - 0x2fffff
\r
608 m_read32_rom6: @ 0x300000 - 0x37ffff
\r
611 m_read32_rom7: @ 0x380000 - 0x3fffff
\r
614 m_read32_rom8: @ 0x400000 - 0x47ffff
\r
617 m_read32_rom9: @ 0x480000 - 0x4fffff
\r
620 m_read32_romA: @ 0x500000 - 0x57ffff
\r
623 m_read32_romB: @ 0x580000 - 0x5fffff
\r
626 m_read32_romC: @ 0x600000 - 0x67ffff
\r
629 m_read32_romD: @ 0x680000 - 0x6fffff
\r
632 m_read32_romE: @ 0x700000 - 0x77ffff
\r
635 m_read32_romF: @ 0x780000 - 0x7fffff
\r
638 m_read32_rom10: @ 0x800000 - 0x87ffff
\r
641 m_read32_rom11: @ 0x880000 - 0x8fffff
\r
644 m_read32_rom12: @ 0x900000 - 0x97ffff
\r
647 m_read32_rom13: @ 0x980000 - 0x9fffff
\r
662 orr r0, r0, r1, lsl #16
\r
668 bxne lr @ invalid read
\r
676 orr r0, r0, r1, lsl #16
\r
681 bic r0, r0, #0xff0000
\r
684 ldrh r1, [r1, #2] @ 2ci
\r
685 orr r0, r1, r0, lsl #16
\r
688 m_read32_above_rom:
\r
700 orr r0, r0, r1, lsl #16
\r
705 @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
\r
707 PicoWriteRomHW_SSF2: @ u32 a, u32 d
\r
709 movs r0, r0, lsr #1
\r
713 ldr r2, =(Pico+0x22211) @ Pico.m.sram_reg
\r
724 ldr r3, =m_read8_def_table
\r
725 ldr r2, =m_read8_table
\r
726 ldr r12, [r3, r1, lsl #2]
\r
727 str r12, [r2, r0, lsl #2]
\r
729 ldr r3, =m_read16_def_table
\r
730 ldr r2, =m_read16_table
\r
731 ldr r12, [r3, r1, lsl #2]
\r
732 str r12, [r2, r0, lsl #2]
\r
734 ldr r3, =m_read32_def_table
\r
735 ldr r2, =m_read32_table
\r
736 ldr r12, [r3, r1, lsl #2]
\r
737 str r12, [r2, r0, lsl #2]
\r