musashi Cyclone hack fix
[picodrive.git] / Pico / Memory.s
CommitLineData
4ff2d527 1@ vim:filetype=armasm\r
2\r
cc68a136 3@ memory handlers with banking support for SSF II - The New Challengers\r
4@ mostly based on Gens code\r
5\r
6cadc2da 6@ (c) Copyright 2006-2007, Grazvydas "notaz" Ignotas\r
cc68a136 7@ All Rights Reserved\r
8\r
9\r
10\r
11.text\r
12\r
13@ default jump tables\r
14\r
15m_read8_def_table:\r
16 .long m_read8_rom0 @ 0x000000 - 0x07FFFF\r
17 .long m_read8_rom1 @ 0x080000 - 0x0FFFFF\r
18 .long m_read8_rom2 @ 0x100000 - 0x17FFFF\r
19 .long m_read8_rom3 @ 0x180000 - 0x1FFFFF\r
20 .long m_read8_rom4 @ 0x200000 - 0x27FFFF\r
21 .long m_read8_rom5 @ 0x280000 - 0x2FFFFF\r
22 .long m_read8_rom6 @ 0x300000 - 0x37FFFF\r
23 .long m_read8_rom7 @ 0x380000 - 0x3FFFFF\r
29a95187 24 .long m_read8_rom8 @ 0x400000 - 0x47FFFF - for all those large ROM hacks\r
cc68a136 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
29a95187 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
cc68a136 36 .long m_read8_misc @ 0xA00000 - 0xA7FFFF\r
37 .long m_read_null @ 0xA80000 - 0xAFFFFF\r
38 .long m_read_null @ 0xB00000 - 0xB7FFFF\r
39 .long m_read_null @ 0xB80000 - 0xBFFFFF\r
40 .long m_read8_vdp @ 0xC00000 - 0xC7FFFF\r
41 .long m_read8_vdp @ 0xC80000 - 0xCFFFFF\r
42 .long m_read_null @ 0xD00000 - 0xD7FFFF\r
43 .long m_read_null @ 0xD80000 - 0xDFFFFF\r
44 .long m_read8_ram @ 0xE00000 - 0xE7FFFF\r
45 .long m_read8_ram @ 0xE80000 - 0xEFFFFF\r
46 .long m_read8_ram @ 0xF00000 - 0xF7FFFF\r
47 .long m_read8_ram @ 0xF80000 - 0xFFFFFF\r
48\r
49m_read16_def_table:\r
50 .long m_read16_rom0 @ 0x000000 - 0x07FFFF\r
51 .long m_read16_rom1 @ 0x080000 - 0x0FFFFF\r
52 .long m_read16_rom2 @ 0x100000 - 0x17FFFF\r
53 .long m_read16_rom3 @ 0x180000 - 0x1FFFFF\r
54 .long m_read16_rom4 @ 0x200000 - 0x27FFFF\r
55 .long m_read16_rom5 @ 0x280000 - 0x2FFFFF\r
56 .long m_read16_rom6 @ 0x300000 - 0x37FFFF\r
57 .long m_read16_rom7 @ 0x380000 - 0x3FFFFF\r
58 .long m_read16_rom8 @ 0x400000 - 0x47FFFF\r
59 .long m_read16_rom9 @ 0x480000 - 0x4FFFFF\r
60 .long m_read16_romA @ 0x500000 - 0x57FFFF\r
61 .long m_read16_romB @ 0x580000 - 0x5FFFFF\r
62 .long m_read16_romC @ 0x600000 - 0x67FFFF\r
63 .long m_read16_romD @ 0x680000 - 0x6FFFFF\r
64 .long m_read16_romE @ 0x700000 - 0x77FFFF\r
65 .long m_read16_romF @ 0x780000 - 0x7FFFFF\r
29a95187 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
cc68a136 70 .long m_read16_misc @ 0xA00000 - 0xA7FFFF\r
71 .long m_read_null @ 0xA80000 - 0xAFFFFF\r
72 .long m_read_null @ 0xB00000 - 0xB7FFFF\r
73 .long m_read_null @ 0xB80000 - 0xBFFFFF\r
74 .long m_read16_vdp @ 0xC00000 - 0xC7FFFF\r
75 .long m_read_null @ 0xC80000 - 0xCFFFFF\r
76 .long m_read_null @ 0xD00000 - 0xD7FFFF\r
77 .long m_read_null @ 0xD80000 - 0xDFFFFF\r
78 .long m_read16_ram @ 0xE00000 - 0xE7FFFF\r
79 .long m_read16_ram @ 0xE80000 - 0xEFFFFF\r
80 .long m_read16_ram @ 0xF00000 - 0xF7FFFF\r
81 .long m_read16_ram @ 0xF80000 - 0xFFFFFF\r
82\r
83m_read32_def_table:\r
84 .long m_read32_rom0 @ 0x000000 - 0x07FFFF\r
85 .long m_read32_rom1 @ 0x080000 - 0x0FFFFF\r
86 .long m_read32_rom2 @ 0x100000 - 0x17FFFF\r
87 .long m_read32_rom3 @ 0x180000 - 0x1FFFFF\r
88 .long m_read32_rom4 @ 0x200000 - 0x27FFFF\r
89 .long m_read32_rom5 @ 0x280000 - 0x2FFFFF\r
90 .long m_read32_rom6 @ 0x300000 - 0x37FFFF\r
91 .long m_read32_rom7 @ 0x380000 - 0x3FFFFF\r
92 .long m_read32_rom8 @ 0x400000 - 0x47FFFF\r
93 .long m_read32_rom9 @ 0x480000 - 0x4FFFFF\r
94 .long m_read32_romA @ 0x500000 - 0x57FFFF\r
95 .long m_read32_romB @ 0x580000 - 0x5FFFFF\r
96 .long m_read32_romC @ 0x600000 - 0x67FFFF\r
97 .long m_read32_romD @ 0x680000 - 0x6FFFFF\r
98 .long m_read32_romE @ 0x700000 - 0x77FFFF\r
99 .long m_read32_romF @ 0x780000 - 0x7FFFFF\r
29a95187 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
cc68a136 104 .long m_read32_misc @ 0xA00000 - 0xA7FFFF\r
105 .long m_read_null @ 0xA80000 - 0xAFFFFF\r
106 .long m_read_null @ 0xB00000 - 0xB7FFFF\r
107 .long m_read_null @ 0xB80000 - 0xBFFFFF\r
108 .long m_read32_vdp @ 0xC00000 - 0xC7FFFF\r
109 .long m_read_null @ 0xC80000 - 0xCFFFFF\r
110 .long m_read_null @ 0xD00000 - 0xD7FFFF\r
111 .long m_read_null @ 0xD80000 - 0xDFFFFF\r
112 .long m_read32_ram @ 0xE00000 - 0xE7FFFF\r
113 .long m_read32_ram @ 0xE80000 - 0xEFFFFF\r
114 .long m_read32_ram @ 0xF00000 - 0xF7FFFF\r
115 .long m_read32_ram @ 0xF80000 - 0xFFFFFF\r
116\r
117\r
118@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\r
119\r
120.bss\r
121@.section .bss, "brw"\r
122@.data\r
123\r
124@ used tables\r
125m_read8_table:\r
126 .skip 32*4\r
127\r
128m_read16_table:\r
129 .skip 32*4\r
130\r
131m_read32_table:\r
132 .skip 32*4\r
133\r
134\r
135@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\r
136\r
137.text\r
138\r
139.global PicoMemReset\r
140.global PicoRead8\r
141.global PicoRead16\r
142.global PicoRead32\r
143.global PicoWriteRomHW_SSF2\r
144\r
145\r
146PicoMemReset:\r
147 ldr r12,=(Pico+0x22204)\r
148 ldr r12,[r12] @ romsize\r
149 add r12,r12,#0x80000\r
150 sub r12,r12,#1\r
151 mov r12,r12,lsr #19\r
152\r
153 ldr r0, =m_read8_table\r
154 ldr r1, =m_read8_def_table\r
155 mov r2, #32\r
1561:\r
157 ldr r3, [r1], #4\r
158 str r3, [r0], #4\r
159 subs r2, r2, #1\r
160 bne 1b\r
161\r
162 ldr r0, =m_read16_table\r
163 ldr r1, =m_read16_def_table\r
164 mov r2, #32\r
1651:\r
166 subs r2, r2, #1\r
167 ldr r3, [r1], #4\r
168 str r3, [r0], #4\r
169 bne 1b\r
170\r
171 ldr r0, =m_read32_table\r
172 ldr r1, =m_read32_def_table\r
173 mov r2, #32\r
1741:\r
175 subs r2, r2, #1\r
176 ldr r3, [r1], #4\r
177 str r3, [r0], #4\r
178 bne 1b\r
179\r
180 @ update memhandlers according to ROM size\r
181 ldr r1, =m_read8_above_rom\r
182 ldr r0, =m_read8_table\r
183 mov r2, #16\r
1841:\r
185 sub r2, r2, #1\r
186 cmp r2, r12\r
187 blt 2f\r
188 cmp r2, #4\r
189 beq 1b @ do not touch the SRAM area\r
190 str r1, [r0, r2, lsl #2]\r
191 b 1b\r
1922:\r
193 ldr r1, =m_read16_above_rom\r
194 ldr r0, =m_read16_table\r
195 mov r2, #16\r
1961:\r
197 sub r2, r2, #1\r
198 cmp r2, r12\r
199 blt 2f\r
200 cmp r2, #4\r
201 beq 1b\r
202 str r1, [r0, r2, lsl #2]\r
203 b 1b\r
2042:\r
205 ldr r1, =m_read32_above_rom\r
206 ldr r0, =m_read32_table\r
207 mov r2, #16\r
2081:\r
209 sub r2, r2, #1\r
210 cmp r2, r12\r
211 blt 2f\r
212 cmp r2, #4\r
213 beq 1b\r
214 str r1, [r0, r2, lsl #2]\r
215 b 1b\r
2162:\r
217 bx lr\r
218\r
219.pool\r
220\r
221@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\r
222\r
223PicoRead8: @ u32 a\r
224 ldr r2, =m_read8_table\r
225 bic r0, r0, #0xff000000\r
226 and r1, r0, #0x00f80000\r
227 ldr pc, [r2, r1, lsr #17]\r
228\r
229PicoRead16: @ u32 a\r
230 ldr r2, =m_read16_table\r
231 bic r0, r0, #0xff000000\r
232 and r1, r0, #0x00f80000\r
233 ldr pc, [r2, r1, lsr #17]\r
234\r
235PicoRead32: @ u32 a\r
236 ldr r2, =m_read32_table\r
237 bic r0, r0, #0xff000000\r
238 and r1, r0, #0x00f80000\r
239 ldr pc, [r2, r1, lsr #17]\r
240\r
241.pool\r
242\r
243@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\r
244\r
245m_read_null:\r
246 mov r0, #0\r
247 bx lr\r
248\r
249\r
250.macro m_read8_rom sect\r
251 ldr r1, =(Pico+0x22200)\r
252 bic r0, r0, #0xf80000\r
253 ldr r1, [r1]\r
254.if \sect\r
255 orr r0, r0, #0x080000*\sect\r
256.endif\r
257 eor r0, r0, #1\r
258 ldrb r0, [r1, r0]\r
259 bx lr\r
260.endm\r
261\r
262\r
263m_read8_rom0: @ 0x000000 - 0x07ffff\r
264 m_read8_rom 0\r
265\r
266m_read8_rom1: @ 0x080000 - 0x0fffff\r
267 m_read8_rom 1\r
268\r
269m_read8_rom2: @ 0x100000 - 0x17ffff\r
270 m_read8_rom 2\r
271\r
272m_read8_rom3: @ 0x180000 - 0x1fffff\r
273 m_read8_rom 3\r
274\r
275m_read8_rom4: @ 0x200000 - 0x27ffff, SRAM area\r
276 ldr r2, =(SRam)\r
277 ldr r3, =(Pico+0x22200)\r
278 ldr r1, [r2, #8] @ SRam.end\r
279 bic r0, r0, #0xf80000\r
280 orr r0, r0, #0x200000\r
281 cmp r0, r1\r
282 bgt m_read8_nosram\r
283 ldr r1, [r2, #4] @ SRam.start (1ci)\r
284 cmp r0, r1\r
285 blt m_read8_nosram\r
286 ldrb r1, [r3, #0x11] @ Pico.m.sram_reg (1ci)\r
287 sub r12,r0, #0x200000\r
288 tst r1, #0x10\r
289 bne m_read8_detected\r
290 cmp r12,#1\r
291 ble m_read8_detected\r
292 tst r1, #1\r
293 orrne r1, r1, #0x10\r
294 strneb r1, [r3, #0x11]\r
295m_read8_detected:\r
296 tst r1, #4 @ EEPROM read?\r
297 ldrne r0, =SRAMReadEEPROM @ (1ci if ne)\r
298 bxne r0\r
299m_read8_noteeprom:\r
300 tst r1, #1\r
301 beq m_read8_nosram\r
302 ldr r3, [r2] @ SRam.data\r
303 ldr r2, [r2, #4] @ SRam.start (1ci)\r
304 sub r3, r3, r2\r
305 ldrb r0, [r3, r0]\r
306 bx lr\r
307m_read8_nosram:\r
308 ldr r1, [r3, #4] @ 1ci\r
309 cmp r0, r1\r
310 movgt r0, #0\r
311 bxgt lr @ bad location\r
312 ldr r1, [r3]\r
313 eor r0, r0, #1\r
314 ldrb r0, [r1, r0]\r
315 bx lr\r
316\r
317m_read8_rom5: @ 0x280000 - 0x2fffff\r
318 m_read8_rom 5\r
319\r
320m_read8_rom6: @ 0x300000 - 0x37ffff\r
321 m_read8_rom 6\r
322\r
323m_read8_rom7: @ 0x380000 - 0x3fffff\r
324 m_read8_rom 7\r
325\r
326m_read8_rom8: @ 0x400000 - 0x47ffff\r
327 m_read8_rom 8\r
328\r
329m_read8_rom9: @ 0x480000 - 0x4fffff\r
330 m_read8_rom 9\r
331\r
cc68a136 332m_read8_romA: @ 0x500000 - 0x57ffff\r
333 m_read8_rom 0xA\r
334\r
335m_read8_romB: @ 0x580000 - 0x5fffff\r
336 m_read8_rom 0xB\r
337\r
338m_read8_romC: @ 0x600000 - 0x67ffff\r
339 m_read8_rom 0xC\r
340\r
341m_read8_romD: @ 0x680000 - 0x6fffff\r
342 m_read8_rom 0xD\r
343\r
344m_read8_romE: @ 0x700000 - 0x77ffff\r
345 m_read8_rom 0xE\r
346\r
347m_read8_romF: @ 0x780000 - 0x7fffff\r
348 m_read8_rom 0xF\r
349\r
29a95187 350m_read8_rom10: @ 0x800000 - 0x87ffff\r
351 m_read8_rom 0x10\r
352\r
353m_read8_rom11: @ 0x880000 - 0x8fffff\r
354 m_read8_rom 0x11\r
355\r
356m_read8_rom12: @ 0x900000 - 0x97ffff\r
357 m_read8_rom 0x12\r
358\r
359m_read8_rom13: @ 0x980000 - 0x9fffff\r
360 m_read8_rom 0x13\r
361\r
cc68a136 362m_read8_misc:\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
367 bxeq r2\r
368 stmfd sp!,{r0,lr}\r
369 bic r0, r0, #1\r
370 mov r1, #8\r
371 bl OtherRead16\r
372 ldmfd sp!,{r1,lr}\r
373 tst r1, #1\r
374 moveq r0, r0, lsr #8\r
375 bx lr\r
376\r
377m_read8_vdp:\r
378 tst r0, #0x70000\r
379 tsteq r0, #0x000e0\r
380 bxne lr @ invalid read\r
381 stmfd sp!,{r0,lr}\r
382 bic r0, r0, #1\r
383 bl PicoVideoRead\r
384 ldmfd sp!,{r1,lr}\r
385 tst r1, #1\r
386 moveq r0, r0, lsr #8\r
387 bx lr\r
388\r
389m_read8_ram:\r
390 ldr r1, =Pico\r
391 bic r0, r0, #0xff0000\r
392 eor r0, r0, #1\r
393 ldrb r0, [r1, r0]\r
394 bx lr\r
395\r
396m_read8_above_rom:\r
397 stmfd sp!,{r0,lr}\r
398 bic r0, r0, #1\r
399 mov r1, #8\r
66fdc0f0 400 bl OtherRead16End\r
cc68a136 401 ldmfd sp!,{r1,lr}\r
402 tst r1, #1\r
403 moveq r0, r0, lsr #8\r
404 bx lr\r
405\r
406.pool\r
407\r
408@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\r
409\r
410.macro m_read16_rom sect\r
411 ldr r1, =(Pico+0x22200)\r
412 bic r0, r0, #0xf80000\r
413 ldr r1, [r1]\r
414 bic r0, r0, #1\r
415.if \sect\r
416 orr r0, r0, #0x080000*\sect\r
417.endif\r
418 ldrh r0, [r1, r0]\r
419 bx lr\r
420.endm\r
421\r
422\r
423m_read16_rom0: @ 0x000000 - 0x07ffff\r
424 m_read16_rom 0\r
425\r
426m_read16_rom1: @ 0x080000 - 0x0fffff\r
427 m_read16_rom 1\r
428\r
429m_read16_rom2: @ 0x100000 - 0x17ffff\r
430 m_read16_rom 2\r
431\r
432m_read16_rom3: @ 0x180000 - 0x1fffff\r
433 m_read16_rom 3\r
434\r
435m_read16_rom4: @ 0x200000 - 0x27ffff, SRAM area (NBA Live 95)\r
436 ldr r2, =(SRam)\r
437 ldr r3, =(Pico+0x22200)\r
438 ldr r1, [r2, #8] @ SRam.end\r
439 bic r0, r0, #0xf80000\r
440 bic r0, r0, #1\r
441 orr r0, r0, #0x200000\r
442 cmp r0, r1\r
443 bgt m_read16_nosram\r
444 ldrb r1, [r3, #0x11] @ Pico.m.sram_reg (2ci)\r
445 tst r1, #1\r
446 beq m_read16_nosram\r
447 ldr r1, [r2, #4] @ SRam.start (1ci)\r
448 cmp r0, r1\r
449 blt m_read16_nosram\r
450 ldr r2, [r2] @ SRam.data (1ci)\r
451 sub r2, r2, r1\r
452 ldrh r0, [r2, r0] @ 2ci\r
453 and r1, r0, #0xff\r
454 mov r0, r0, lsr #8\r
455 orr r0, r0, r1, lsl #8\r
456 bx lr\r
721cd396 457\r
cc68a136 458m_read16_nosram:\r
459 ldr r1, [r3, #4] @ 1ci\r
460 cmp r0, r1\r
461 movgt r0, #0\r
462 bxgt lr @ bad location\r
463 ldr r1, [r3] @ 1ci\r
464 ldrh r0, [r1, r0]\r
465 bx lr\r
466\r
467m_read16_rom5: @ 0x280000 - 0x2fffff\r
468 m_read16_rom 5\r
469\r
470m_read16_rom6: @ 0x300000 - 0x37ffff\r
471 m_read16_rom 6\r
472\r
473m_read16_rom7: @ 0x380000 - 0x3fffff\r
474 m_read16_rom 7\r
475\r
476m_read16_rom8: @ 0x400000 - 0x47ffff\r
477 m_read16_rom 8\r
478\r
479m_read16_rom9: @ 0x480000 - 0x4fffff\r
480 m_read16_rom 9\r
481\r
cc68a136 482m_read16_romA: @ 0x500000 - 0x57ffff\r
483 m_read16_rom 0xA\r
484\r
485m_read16_romB: @ 0x580000 - 0x5fffff\r
486 m_read16_rom 0xB\r
487\r
488m_read16_romC: @ 0x600000 - 0x67ffff\r
489 m_read16_rom 0xC\r
490\r
491m_read16_romD: @ 0x680000 - 0x6fffff\r
492 m_read16_rom 0xD\r
493\r
494m_read16_romE: @ 0x700000 - 0x77ffff\r
495 m_read16_rom 0xE\r
496\r
497m_read16_romF: @ 0x780000 - 0x7fffff\r
498 m_read16_rom 0xF\r
499\r
29a95187 500m_read16_rom10: @ 0x800000 - 0x87ffff\r
501 m_read16_rom 0x10\r
502\r
503m_read16_rom11: @ 0x880000 - 0x8fffff\r
504 m_read16_rom 0x11\r
505\r
506m_read16_rom12: @ 0x900000 - 0x97ffff\r
507 m_read16_rom 0x12\r
508\r
509m_read16_rom13: @ 0x980000 - 0x9fffff\r
510 m_read16_rom 0x13\r
511\r
cc68a136 512m_read16_misc:\r
cc68a136 513 bic r0, r0, #1\r
4ff2d527 514 mov r1, #16\r
515 b OtherRead16\r
cc68a136 516\r
517m_read16_vdp:\r
518 tst r0, #0x70000\r
519 tsteq r0, #0x000e0\r
520 bxne lr @ invalid read\r
cc68a136 521 bic r0, r0, #1\r
4ff2d527 522 b PicoVideoRead\r
cc68a136 523\r
524m_read16_ram:\r
525 ldr r1, =Pico\r
526 bic r0, r0, #0xff0000\r
527 bic r0, r0, #1\r
528 ldrh r0, [r1, r0]\r
529 bx lr\r
530\r
531m_read16_above_rom:\r
cc68a136 532 bic r0, r0, #1\r
4ff2d527 533 mov r1, #16\r
534 b OtherRead16End\r
cc68a136 535\r
536.pool\r
537\r
538@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\r
539\r
540.macro m_read32_rom sect\r
541 ldr r1, =(Pico+0x22200)\r
542 bic r0, r0, #0xf80000\r
543 ldr r1, [r1]\r
544 bic r0, r0, #1\r
545.if \sect\r
546 orr r0, r0, #0x080000*\sect\r
547.endif\r
548 ldrh r0, [r1, r0]!\r
549 ldrh r1, [r1, #2] @ 1ci\r
550 orr r0, r1, r0, lsl #16\r
551 bx lr\r
552.endm\r
553\r
554\r
555m_read32_rom0: @ 0x000000 - 0x07ffff\r
556 m_read32_rom 0\r
557\r
558m_read32_rom1: @ 0x080000 - 0x0fffff\r
559 m_read32_rom 1\r
560\r
561m_read32_rom2: @ 0x100000 - 0x17ffff\r
562 m_read32_rom 2\r
563\r
564m_read32_rom3: @ 0x180000 - 0x1fffff\r
565 m_read32_rom 3\r
566\r
567m_read32_rom4: @ 0x200000 - 0x27ffff, SRAM area (does any game do long reads?)\r
568 ldr r2, =(SRam)\r
569 ldr r3, =(Pico+0x22200)\r
570 ldr r1, [r2, #8] @ SRam.end\r
571 bic r0, r0, #0xf80000\r
572 bic r0, r0, #1\r
573 orr r0, r0, #0x200000\r
574 cmp r0, r1\r
575 bgt m_read32_nosram\r
576 ldrb r1, [r3, #0x11] @ Pico.m.sram_reg (2ci)\r
577 tst r1, #1\r
578 beq m_read32_nosram\r
579 ldr r1, [r2, #4] @ SRam.start (1ci)\r
580 cmp r0, r1\r
581 blt m_read32_nosram\r
582 ldr r2, [r2] @ SRam.data (1ci)\r
583 sub r2, r2, r1\r
584 ldrh r0, [r2, r0]! @ (1ci)\r
585 ldrh r1, [r2, #2]\r
586 orr r0, r0, r0, lsl #16\r
587 mov r0, r0, ror #8\r
588 mov r0, r0, lsl #16\r
589 orr r0, r0, r1, lsr #8\r
590 and r1, r1, #0xff\r
591 orr r0, r0, r1, lsl #8\r
592 bx lr\r
721cd396 593\r
cc68a136 594m_read32_nosram:\r
595 ldr r1, [r3, #4] @ (1ci)\r
596 cmp r0, r1\r
597 movgt r0, #0\r
598 bxgt lr @ bad location\r
599 ldr r1, [r3] @ (1ci)\r
600 ldrh r0, [r1, r0]!\r
601 ldrh r1, [r1, #2] @ (2ci)\r
602 orr r0, r1, r0, lsl #16\r
603 bx lr\r
604\r
605m_read32_rom5: @ 0x280000 - 0x2fffff\r
606 m_read32_rom 5\r
607\r
608m_read32_rom6: @ 0x300000 - 0x37ffff\r
609 m_read32_rom 6\r
610\r
611m_read32_rom7: @ 0x380000 - 0x3fffff\r
612 m_read32_rom 7\r
613\r
614m_read32_rom8: @ 0x400000 - 0x47ffff\r
615 m_read32_rom 8\r
616\r
617m_read32_rom9: @ 0x480000 - 0x4fffff\r
618 m_read32_rom 9\r
619\r
cc68a136 620m_read32_romA: @ 0x500000 - 0x57ffff\r
621 m_read32_rom 0xA\r
622\r
623m_read32_romB: @ 0x580000 - 0x5fffff\r
624 m_read32_rom 0xB\r
625\r
626m_read32_romC: @ 0x600000 - 0x67ffff\r
627 m_read32_rom 0xC\r
628\r
629m_read32_romD: @ 0x680000 - 0x6fffff\r
630 m_read32_rom 0xD\r
631\r
632m_read32_romE: @ 0x700000 - 0x77ffff\r
633 m_read32_rom 0xE\r
634\r
635m_read32_romF: @ 0x780000 - 0x7fffff\r
636 m_read32_rom 0xF\r
637\r
29a95187 638m_read32_rom10: @ 0x800000 - 0x87ffff\r
639 m_read32_rom 0x10\r
640\r
641m_read32_rom11: @ 0x880000 - 0x8fffff\r
642 m_read32_rom 0x11\r
643\r
644m_read32_rom12: @ 0x900000 - 0x97ffff\r
645 m_read32_rom 0x12\r
646\r
647m_read32_rom13: @ 0x980000 - 0x9fffff\r
648 m_read32_rom 0x13\r
649\r
cc68a136 650m_read32_misc:\r
651 bic r0, r0, #1\r
652 stmfd sp!,{r0,lr}\r
653 mov r1, #32\r
654 bl OtherRead16\r
655 mov r1, r0\r
656 ldmfd sp!,{r0}\r
657 stmfd sp!,{r1}\r
658 add r0, r0, #2\r
659 mov r1, #32\r
660 bl OtherRead16\r
661 ldmfd sp!,{r1,lr}\r
662 orr r0, r0, r1, lsl #16\r
663 bx lr\r
664\r
665m_read32_vdp:\r
666 tst r0, #0x70000\r
667 tsteq r0, #0x000e0\r
668 bxne lr @ invalid read\r
669 bic r0, r0, #1\r
4ff2d527 670 add r1, r0, #2\r
671 stmfd sp!,{r1,lr}\r
cc68a136 672 bl PicoVideoRead\r
4ff2d527 673 swp r0, r0, [sp]\r
cc68a136 674 bl PicoVideoRead\r
675 ldmfd sp!,{r1,lr}\r
676 orr r0, r0, r1, lsl #16\r
677 bx lr\r
678\r
679m_read32_ram:\r
680 ldr r1, =Pico\r
681 bic r0, r0, #0xff0000\r
682 bic r0, r0, #1\r
683 ldrh r0, [r1, r0]!\r
684 ldrh r1, [r1, #2] @ 2ci\r
685 orr r0, r1, r0, lsl #16\r
686 bx lr\r
687\r
688m_read32_above_rom:\r
689 bic r0, r0, #1\r
690 stmfd sp!,{r0,lr}\r
691 mov r1, #32\r
66fdc0f0 692 bl OtherRead16End\r
cc68a136 693 mov r1, r0\r
694 ldmfd sp!,{r0}\r
695 stmfd sp!,{r1}\r
696 add r0, r0, #2\r
697 mov r1, #32\r
66fdc0f0 698 bl OtherRead16End\r
cc68a136 699 ldmfd sp!,{r1,lr}\r
700 orr r0, r0, r1, lsl #16\r
701 bx lr\r
702\r
703.pool\r
704\r
705@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\r
706\r
707PicoWriteRomHW_SSF2: @ u32 a, u32 d\r
708 and r0, r0, #0xe\r
709 movs r0, r0, lsr #1\r
710 bne pwr_banking\r
711\r
712 @ sram register\r
713 ldr r2, =(Pico+0x22211) @ Pico.m.sram_reg\r
721cd396 714 ldrb r0, [r2]\r
cc68a136 715 and r1, r1, #3\r
721cd396 716 bic r0, r0, #3\r
717 orr r0, r0, r1\r
718 strb r0, [r2]\r
cc68a136 719 bx lr\r
720\r
721pwr_banking:\r
722 and r1, r1, #0x1f\r
723\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
728\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
733\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
738 \r
739 bx lr\r
721cd396 740\r