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