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