new z80 scheduling method, timers are still wip
[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
3ec29f01 13.align 4\r
cc68a136 14\r
15@ default jump tables\r
16\r
17m_read8_def_table:\r
18 .long m_read8_rom0 @ 0x000000 - 0x07FFFF\r
19 .long m_read8_rom1 @ 0x080000 - 0x0FFFFF\r
20 .long m_read8_rom2 @ 0x100000 - 0x17FFFF\r
21 .long m_read8_rom3 @ 0x180000 - 0x1FFFFF\r
22 .long m_read8_rom4 @ 0x200000 - 0x27FFFF\r
23 .long m_read8_rom5 @ 0x280000 - 0x2FFFFF\r
24 .long m_read8_rom6 @ 0x300000 - 0x37FFFF\r
25 .long m_read8_rom7 @ 0x380000 - 0x3FFFFF\r
29a95187 26 .long m_read8_rom8 @ 0x400000 - 0x47FFFF - for all those large ROM hacks\r
cc68a136 27 .long m_read8_rom9 @ 0x480000 - 0x4FFFFF\r
28 .long m_read8_romA @ 0x500000 - 0x57FFFF\r
29 .long m_read8_romB @ 0x580000 - 0x5FFFFF\r
30 .long m_read8_romC @ 0x600000 - 0x67FFFF\r
31 .long m_read8_romD @ 0x680000 - 0x6FFFFF\r
32 .long m_read8_romE @ 0x700000 - 0x77FFFF\r
33 .long m_read8_romF @ 0x780000 - 0x7FFFFF\r
29a95187 34 .long m_read8_rom10 @ 0x800000 - 0x87FFFF\r
35 .long m_read8_rom11 @ 0x880000 - 0x8FFFFF\r
36 .long m_read8_rom12 @ 0x900000 - 0x97FFFF\r
37 .long m_read8_rom13 @ 0x980000 - 0x9FFFFF\r
cc68a136 38 .long m_read8_misc @ 0xA00000 - 0xA7FFFF\r
39 .long m_read_null @ 0xA80000 - 0xAFFFFF\r
40 .long m_read_null @ 0xB00000 - 0xB7FFFF\r
41 .long m_read_null @ 0xB80000 - 0xBFFFFF\r
42 .long m_read8_vdp @ 0xC00000 - 0xC7FFFF\r
43 .long m_read8_vdp @ 0xC80000 - 0xCFFFFF\r
7969166e 44 .long m_read8_vdp @ 0xD00000 - 0xD7FFFF\r
45 .long m_read8_vdp @ 0xD80000 - 0xDFFFFF\r
cc68a136 46 .long m_read8_ram @ 0xE00000 - 0xE7FFFF\r
47 .long m_read8_ram @ 0xE80000 - 0xEFFFFF\r
48 .long m_read8_ram @ 0xF00000 - 0xF7FFFF\r
49 .long m_read8_ram @ 0xF80000 - 0xFFFFFF\r
50\r
51m_read16_def_table:\r
52 .long m_read16_rom0 @ 0x000000 - 0x07FFFF\r
53 .long m_read16_rom1 @ 0x080000 - 0x0FFFFF\r
54 .long m_read16_rom2 @ 0x100000 - 0x17FFFF\r
55 .long m_read16_rom3 @ 0x180000 - 0x1FFFFF\r
56 .long m_read16_rom4 @ 0x200000 - 0x27FFFF\r
57 .long m_read16_rom5 @ 0x280000 - 0x2FFFFF\r
58 .long m_read16_rom6 @ 0x300000 - 0x37FFFF\r
59 .long m_read16_rom7 @ 0x380000 - 0x3FFFFF\r
60 .long m_read16_rom8 @ 0x400000 - 0x47FFFF\r
61 .long m_read16_rom9 @ 0x480000 - 0x4FFFFF\r
62 .long m_read16_romA @ 0x500000 - 0x57FFFF\r
63 .long m_read16_romB @ 0x580000 - 0x5FFFFF\r
64 .long m_read16_romC @ 0x600000 - 0x67FFFF\r
65 .long m_read16_romD @ 0x680000 - 0x6FFFFF\r
66 .long m_read16_romE @ 0x700000 - 0x77FFFF\r
67 .long m_read16_romF @ 0x780000 - 0x7FFFFF\r
29a95187 68 .long m_read16_rom10 @ 0x800000 - 0x87FFFF\r
69 .long m_read16_rom11 @ 0x880000 - 0x8FFFFF\r
70 .long m_read16_rom12 @ 0x900000 - 0x97FFFF\r
71 .long m_read16_rom13 @ 0x980000 - 0x9FFFFF\r
cc68a136 72 .long m_read16_misc @ 0xA00000 - 0xA7FFFF\r
73 .long m_read_null @ 0xA80000 - 0xAFFFFF\r
74 .long m_read_null @ 0xB00000 - 0xB7FFFF\r
75 .long m_read_null @ 0xB80000 - 0xBFFFFF\r
76 .long m_read16_vdp @ 0xC00000 - 0xC7FFFF\r
7969166e 77 .long m_read16_vdp @ 0xC80000 - 0xCFFFFF\r
78 .long m_read16_vdp @ 0xD00000 - 0xD7FFFF\r
79 .long m_read16_vdp @ 0xD80000 - 0xDFFFFF\r
cc68a136 80 .long m_read16_ram @ 0xE00000 - 0xE7FFFF\r
81 .long m_read16_ram @ 0xE80000 - 0xEFFFFF\r
82 .long m_read16_ram @ 0xF00000 - 0xF7FFFF\r
83 .long m_read16_ram @ 0xF80000 - 0xFFFFFF\r
84\r
85m_read32_def_table:\r
86 .long m_read32_rom0 @ 0x000000 - 0x07FFFF\r
87 .long m_read32_rom1 @ 0x080000 - 0x0FFFFF\r
88 .long m_read32_rom2 @ 0x100000 - 0x17FFFF\r
89 .long m_read32_rom3 @ 0x180000 - 0x1FFFFF\r
90 .long m_read32_rom4 @ 0x200000 - 0x27FFFF\r
91 .long m_read32_rom5 @ 0x280000 - 0x2FFFFF\r
92 .long m_read32_rom6 @ 0x300000 - 0x37FFFF\r
93 .long m_read32_rom7 @ 0x380000 - 0x3FFFFF\r
94 .long m_read32_rom8 @ 0x400000 - 0x47FFFF\r
95 .long m_read32_rom9 @ 0x480000 - 0x4FFFFF\r
96 .long m_read32_romA @ 0x500000 - 0x57FFFF\r
97 .long m_read32_romB @ 0x580000 - 0x5FFFFF\r
98 .long m_read32_romC @ 0x600000 - 0x67FFFF\r
99 .long m_read32_romD @ 0x680000 - 0x6FFFFF\r
100 .long m_read32_romE @ 0x700000 - 0x77FFFF\r
101 .long m_read32_romF @ 0x780000 - 0x7FFFFF\r
29a95187 102 .long m_read32_rom10 @ 0x800000 - 0x87FFFF\r
103 .long m_read32_rom11 @ 0x880000 - 0x8FFFFF\r
104 .long m_read32_rom12 @ 0x900000 - 0x97FFFF\r
105 .long m_read32_rom13 @ 0x980000 - 0x9FFFFF\r
cc68a136 106 .long m_read32_misc @ 0xA00000 - 0xA7FFFF\r
107 .long m_read_null @ 0xA80000 - 0xAFFFFF\r
108 .long m_read_null @ 0xB00000 - 0xB7FFFF\r
109 .long m_read_null @ 0xB80000 - 0xBFFFFF\r
110 .long m_read32_vdp @ 0xC00000 - 0xC7FFFF\r
7969166e 111 .long m_read32_vdp @ 0xC80000 - 0xCFFFFF\r
112 .long m_read32_vdp @ 0xD00000 - 0xD7FFFF\r
113 .long m_read32_vdp @ 0xD80000 - 0xDFFFFF\r
cc68a136 114 .long m_read32_ram @ 0xE00000 - 0xE7FFFF\r
115 .long m_read32_ram @ 0xE80000 - 0xEFFFFF\r
116 .long m_read32_ram @ 0xF00000 - 0xF7FFFF\r
117 .long m_read32_ram @ 0xF80000 - 0xFFFFFF\r
118\r
119\r
120@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\r
121\r
122.bss\r
3ec29f01 123.align 4\r
cc68a136 124@.section .bss, "brw"\r
125@.data\r
126\r
127@ used tables\r
128m_read8_table:\r
129 .skip 32*4\r
130\r
131m_read16_table:\r
132 .skip 32*4\r
133\r
134m_read32_table:\r
135 .skip 32*4\r
136\r
137\r
138@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\r
139\r
140.text\r
3ec29f01 141.align 4\r
cc68a136 142\r
143.global PicoMemReset\r
144.global PicoRead8\r
145.global PicoRead16\r
146.global PicoRead32\r
e5503e2f 147.global PicoWrite8\r
cc68a136 148.global PicoWriteRomHW_SSF2\r
e5503e2f 149.global m_m68k_read8_misc\r
150.global m_m68k_write8_misc\r
cc68a136 151\r
152\r
153PicoMemReset:\r
154 ldr r12,=(Pico+0x22204)\r
155 ldr r12,[r12] @ romsize\r
156 add r12,r12,#0x80000\r
157 sub r12,r12,#1\r
158 mov r12,r12,lsr #19\r
159\r
160 ldr r0, =m_read8_table\r
161 ldr r1, =m_read8_def_table\r
162 mov r2, #32\r
1631:\r
164 ldr r3, [r1], #4\r
165 str r3, [r0], #4\r
166 subs r2, r2, #1\r
167 bne 1b\r
168\r
169 ldr r0, =m_read16_table\r
170 ldr r1, =m_read16_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 ldr r0, =m_read32_table\r
179 ldr r1, =m_read32_def_table\r
180 mov r2, #32\r
1811:\r
182 subs r2, r2, #1\r
183 ldr r3, [r1], #4\r
184 str r3, [r0], #4\r
185 bne 1b\r
186\r
187 @ update memhandlers according to ROM size\r
188 ldr r1, =m_read8_above_rom\r
189 ldr r0, =m_read8_table\r
3ec29f01 190 mov r2, #20\r
cc68a136 1911:\r
192 sub r2, r2, #1\r
193 cmp r2, r12\r
194 blt 2f\r
195 cmp r2, #4\r
196 beq 1b @ do not touch the SRAM area\r
197 str r1, [r0, r2, lsl #2]\r
198 b 1b\r
1992:\r
200 ldr r1, =m_read16_above_rom\r
201 ldr r0, =m_read16_table\r
3ec29f01 202 mov r2, #20\r
cc68a136 2031:\r
204 sub r2, r2, #1\r
205 cmp r2, r12\r
206 blt 2f\r
207 cmp r2, #4\r
208 beq 1b\r
209 str r1, [r0, r2, lsl #2]\r
210 b 1b\r
2112:\r
212 ldr r1, =m_read32_above_rom\r
213 ldr r0, =m_read32_table\r
3ec29f01 214 mov r2, #20\r
cc68a136 2151:\r
216 sub r2, r2, #1\r
217 cmp r2, r12\r
218 blt 2f\r
219 cmp r2, #4\r
220 beq 1b\r
221 str r1, [r0, r2, lsl #2]\r
222 b 1b\r
2232:\r
224 bx lr\r
225\r
226.pool\r
227\r
228@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\r
229\r
230PicoRead8: @ u32 a\r
231 ldr r2, =m_read8_table\r
232 bic r0, r0, #0xff000000\r
233 and r1, r0, #0x00f80000\r
234 ldr pc, [r2, r1, lsr #17]\r
235\r
236PicoRead16: @ u32 a\r
237 ldr r2, =m_read16_table\r
238 bic r0, r0, #0xff000000\r
239 and r1, r0, #0x00f80000\r
240 ldr pc, [r2, r1, lsr #17]\r
241\r
242PicoRead32: @ u32 a\r
243 ldr r2, =m_read32_table\r
244 bic r0, r0, #0xff000000\r
245 and r1, r0, #0x00f80000\r
246 ldr pc, [r2, r1, lsr #17]\r
247\r
248.pool\r
249\r
250@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\r
251\r
252m_read_null:\r
253 mov r0, #0\r
254 bx lr\r
255\r
256\r
257.macro m_read8_rom sect\r
258 ldr r1, =(Pico+0x22200)\r
259 bic r0, r0, #0xf80000\r
260 ldr r1, [r1]\r
261.if \sect\r
262 orr r0, r0, #0x080000*\sect\r
263.endif\r
264 eor r0, r0, #1\r
265 ldrb r0, [r1, r0]\r
266 bx lr\r
267.endm\r
268\r
269\r
270m_read8_rom0: @ 0x000000 - 0x07ffff\r
271 m_read8_rom 0\r
272\r
273m_read8_rom1: @ 0x080000 - 0x0fffff\r
274 m_read8_rom 1\r
275\r
276m_read8_rom2: @ 0x100000 - 0x17ffff\r
277 m_read8_rom 2\r
278\r
279m_read8_rom3: @ 0x180000 - 0x1fffff\r
280 m_read8_rom 3\r
281\r
282m_read8_rom4: @ 0x200000 - 0x27ffff, SRAM area\r
283 ldr r2, =(SRam)\r
284 ldr r3, =(Pico+0x22200)\r
285 ldr r1, [r2, #8] @ SRam.end\r
286 bic r0, r0, #0xf80000\r
287 orr r0, r0, #0x200000\r
288 cmp r0, r1\r
289 bgt m_read8_nosram\r
7969166e 290 ldr r1, [r2, #4] @ SRam.start\r
cc68a136 291 cmp r0, r1\r
292 blt m_read8_nosram\r
7969166e 293 ldrb r1, [r3, #0x11] @ Pico.m.sram_reg\r
294 tst r1, #5\r
295 bne SRAMRead\r
cc68a136 296m_read8_nosram:\r
7969166e 297 ldr r1, [r3, #4] @ romsize\r
cc68a136 298 cmp r0, r1\r
299 movgt r0, #0\r
300 bxgt lr @ bad location\r
301 ldr r1, [r3]\r
302 eor r0, r0, #1\r
303 ldrb r0, [r1, r0]\r
304 bx lr\r
305\r
306m_read8_rom5: @ 0x280000 - 0x2fffff\r
307 m_read8_rom 5\r
308\r
309m_read8_rom6: @ 0x300000 - 0x37ffff\r
310 m_read8_rom 6\r
311\r
312m_read8_rom7: @ 0x380000 - 0x3fffff\r
313 m_read8_rom 7\r
314\r
315m_read8_rom8: @ 0x400000 - 0x47ffff\r
316 m_read8_rom 8\r
317\r
318m_read8_rom9: @ 0x480000 - 0x4fffff\r
319 m_read8_rom 9\r
320\r
cc68a136 321m_read8_romA: @ 0x500000 - 0x57ffff\r
322 m_read8_rom 0xA\r
323\r
324m_read8_romB: @ 0x580000 - 0x5fffff\r
325 m_read8_rom 0xB\r
326\r
327m_read8_romC: @ 0x600000 - 0x67ffff\r
328 m_read8_rom 0xC\r
329\r
330m_read8_romD: @ 0x680000 - 0x6fffff\r
331 m_read8_rom 0xD\r
332\r
333m_read8_romE: @ 0x700000 - 0x77ffff\r
334 m_read8_rom 0xE\r
335\r
336m_read8_romF: @ 0x780000 - 0x7fffff\r
337 m_read8_rom 0xF\r
338\r
29a95187 339m_read8_rom10: @ 0x800000 - 0x87ffff\r
340 m_read8_rom 0x10\r
341\r
342m_read8_rom11: @ 0x880000 - 0x8fffff\r
343 m_read8_rom 0x11\r
344\r
345m_read8_rom12: @ 0x900000 - 0x97ffff\r
346 m_read8_rom 0x12\r
347\r
348m_read8_rom13: @ 0x980000 - 0x9fffff\r
349 m_read8_rom 0x13\r
350\r
e5503e2f 351\r
352m_m68k_read8_misc:\r
cc68a136 353m_read8_misc:\r
e5503e2f 354 bic r2, r0, #0x001f @ most commonly we get i/o port read,\r
355 cmp r2, #0xa10000 @ so check for it first\r
356 bne m_read8_misc2\r
357m_read8_misc_io:\r
358 ands r0, r0, #0x1e\r
359 beq m_read8_misc_hwreg\r
360 cmp r0, #4\r
e5503e2f 361 movlt r0, #0\r
362 moveq r0, #1\r
bf537655 363 ble PadRead\r
e5503e2f 364 ldr r3, =(Pico+0x22000)\r
365 mov r0, r0, lsr #1 @ other IO ports (Pico.ioports[a])\r
366 ldrb r0, [r3, r0]\r
367 bx lr\r
368\r
369m_read8_misc_hwreg:\r
370 ldr r3, =(Pico+0x22200)\r
371 ldrb r0, [r3, #0x0f] @ Pico.m.hardware\r
372 bx lr\r
373\r
374m_read8_misc2:\r
375 mov r2, #0xa10000 @ games also like to poll busreq,\r
376 orr r2, r2, #0x001100 @ so we'll try it now\r
377 cmp r0, r2\r
bf537655 378 beq z80ReadBusReq\r
e5503e2f 379\r
380 and r2, r0, #0xff0000 @ finally it might be\r
381 cmp r2, #0xa00000 @ z80 area\r
382 bne m_read8_misc3\r
383 tst r0, #0x4000\r
bf537655 384 beq z80Read8 @ z80 RAM\r
e5503e2f 385 and r2, r0, #0x6000\r
386 cmp r2, #0x4000\r
387 mvnne r0, #0\r
388 bxne lr @ invalid\r
e5503e2f 389 ldr r1, =PicoOpt\r
390 ldr r1, [r1]\r
391 tst r1, #1\r
b542be46 392\r
393 ldrne r1, =ym2612_st\r
394 ldrne r1, [r1]\r
395 ldrneb r0, [r1, #0x11] @ ym2612_st->status\r
396 bxne lr\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
0ffefdb8 451 ldr r2, =PicoRead16Hook\r
cc68a136 452 stmfd sp!,{r0,lr}\r
0ffefdb8 453 ldr r2, [r2]\r
cc68a136 454 bic r0, r0, #1\r
455 mov r1, #8\r
0ffefdb8 456 mov lr, pc\r
457 bx r2\r
cc68a136 458 ldmfd sp!,{r1,lr}\r
459 tst r1, #1\r
460 moveq r0, r0, lsr #8\r
461 bx lr\r
462\r
463.pool\r
464\r
465@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\r
466\r
467.macro m_read16_rom sect\r
468 ldr r1, =(Pico+0x22200)\r
469 bic r0, r0, #0xf80000\r
470 ldr r1, [r1]\r
471 bic r0, r0, #1\r
472.if \sect\r
473 orr r0, r0, #0x080000*\sect\r
474.endif\r
475 ldrh r0, [r1, r0]\r
476 bx lr\r
477.endm\r
478\r
479\r
480m_read16_rom0: @ 0x000000 - 0x07ffff\r
481 m_read16_rom 0\r
482\r
483m_read16_rom1: @ 0x080000 - 0x0fffff\r
484 m_read16_rom 1\r
485\r
486m_read16_rom2: @ 0x100000 - 0x17ffff\r
487 m_read16_rom 2\r
488\r
489m_read16_rom3: @ 0x180000 - 0x1fffff\r
490 m_read16_rom 3\r
491\r
492m_read16_rom4: @ 0x200000 - 0x27ffff, SRAM area (NBA Live 95)\r
493 ldr r2, =(SRam)\r
494 ldr r3, =(Pico+0x22200)\r
495 ldr r1, [r2, #8] @ SRam.end\r
496 bic r0, r0, #0xf80000\r
497 bic r0, r0, #1\r
498 orr r0, r0, #0x200000\r
499 cmp r0, r1\r
500 bgt m_read16_nosram\r
7969166e 501 ldr r1, [r2, #4] @ SRam.start\r
cc68a136 502 cmp r0, r1\r
503 blt m_read16_nosram\r
7969166e 504 ldrb r1, [r3, #0x11] @ Pico.m.sram_reg\r
505 tst r1, #5\r
506 beq m_read16_nosram\r
507 stmfd sp!,{lr}\r
9dc09829 508 bl SRAMRead16\r
7969166e 509 ldmfd sp!,{pc}\r
cc68a136 510m_read16_nosram:\r
7969166e 511 ldr r1, [r3, #4] @ romsize\r
cc68a136 512 cmp r0, r1\r
513 movgt r0, #0\r
514 bxgt lr @ bad location\r
515 ldr r1, [r3] @ 1ci\r
516 ldrh r0, [r1, r0]\r
517 bx lr\r
518\r
519m_read16_rom5: @ 0x280000 - 0x2fffff\r
520 m_read16_rom 5\r
521\r
522m_read16_rom6: @ 0x300000 - 0x37ffff\r
523 m_read16_rom 6\r
524\r
525m_read16_rom7: @ 0x380000 - 0x3fffff\r
526 m_read16_rom 7\r
527\r
528m_read16_rom8: @ 0x400000 - 0x47ffff\r
529 m_read16_rom 8\r
530\r
531m_read16_rom9: @ 0x480000 - 0x4fffff\r
532 m_read16_rom 9\r
533\r
cc68a136 534m_read16_romA: @ 0x500000 - 0x57ffff\r
535 m_read16_rom 0xA\r
536\r
537m_read16_romB: @ 0x580000 - 0x5fffff\r
538 m_read16_rom 0xB\r
539\r
540m_read16_romC: @ 0x600000 - 0x67ffff\r
541 m_read16_rom 0xC\r
542\r
543m_read16_romD: @ 0x680000 - 0x6fffff\r
544 m_read16_rom 0xD\r
545\r
546m_read16_romE: @ 0x700000 - 0x77ffff\r
547 m_read16_rom 0xE\r
548\r
549m_read16_romF: @ 0x780000 - 0x7fffff\r
550 m_read16_rom 0xF\r
551\r
29a95187 552m_read16_rom10: @ 0x800000 - 0x87ffff\r
553 m_read16_rom 0x10\r
554\r
555m_read16_rom11: @ 0x880000 - 0x8fffff\r
556 m_read16_rom 0x11\r
557\r
558m_read16_rom12: @ 0x900000 - 0x97ffff\r
559 m_read16_rom 0x12\r
560\r
561m_read16_rom13: @ 0x980000 - 0x9fffff\r
562 m_read16_rom 0x13\r
563\r
cc68a136 564m_read16_misc:\r
cc68a136 565 bic r0, r0, #1\r
4ff2d527 566 mov r1, #16\r
567 b OtherRead16\r
cc68a136 568\r
569m_read16_vdp:\r
7969166e 570 tst r0, #0x70000 @ if ((a&0xe700e0)==0xc00000)\r
cc68a136 571 tsteq r0, #0x000e0\r
572 bxne lr @ invalid read\r
cc68a136 573 bic r0, r0, #1\r
4ff2d527 574 b PicoVideoRead\r
cc68a136 575\r
576m_read16_ram:\r
577 ldr r1, =Pico\r
578 bic r0, r0, #0xff0000\r
579 bic r0, r0, #1\r
580 ldrh r0, [r1, r0]\r
581 bx lr\r
582\r
583m_read16_above_rom:\r
1dceadae 584 @ might still be SRam\r
585 ldr r2, =(SRam)\r
586 ldr r3, =(Pico+0x22200)\r
587 ldr r1, [r2, #8] @ SRam.end\r
cc68a136 588 bic r0, r0, #1\r
1dceadae 589 cmp r0, r1\r
590 bgt m_read16_ar_nosram\r
591 ldr r1, [r2, #4] @ SRam.start\r
592 cmp r0, r1\r
593 blt m_read16_ar_nosram\r
594 ldrb r1, [r3, #0x11] @ Pico.m.sram_reg\r
595 tst r1, #5\r
596 beq m_read16_ar_nosram\r
597 stmfd sp!,{lr}\r
9dc09829 598 bl SRAMRead16\r
1dceadae 599 ldmfd sp!,{pc}\r
600m_read16_ar_nosram:\r
0ffefdb8 601 ldr r2, =PicoRead16Hook\r
602 ldr r2, [r2]\r
4ff2d527 603 mov r1, #16\r
0ffefdb8 604 bx r2\r
cc68a136 605\r
606.pool\r
607\r
608@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\r
609\r
610.macro m_read32_rom sect\r
611 ldr r1, =(Pico+0x22200)\r
612 bic r0, r0, #0xf80000\r
613 ldr r1, [r1]\r
614 bic r0, r0, #1\r
615.if \sect\r
616 orr r0, r0, #0x080000*\sect\r
617.endif\r
618 ldrh r0, [r1, r0]!\r
619 ldrh r1, [r1, #2] @ 1ci\r
620 orr r0, r1, r0, lsl #16\r
621 bx lr\r
622.endm\r
623\r
624\r
625m_read32_rom0: @ 0x000000 - 0x07ffff\r
626 m_read32_rom 0\r
627\r
628m_read32_rom1: @ 0x080000 - 0x0fffff\r
629 m_read32_rom 1\r
630\r
631m_read32_rom2: @ 0x100000 - 0x17ffff\r
632 m_read32_rom 2\r
633\r
634m_read32_rom3: @ 0x180000 - 0x1fffff\r
635 m_read32_rom 3\r
636\r
637m_read32_rom4: @ 0x200000 - 0x27ffff, SRAM area (does any game do long reads?)\r
638 ldr r2, =(SRam)\r
639 ldr r3, =(Pico+0x22200)\r
640 ldr r1, [r2, #8] @ SRam.end\r
641 bic r0, r0, #0xf80000\r
642 bic r0, r0, #1\r
643 orr r0, r0, #0x200000\r
644 cmp r0, r1\r
645 bgt m_read32_nosram\r
7969166e 646 ldr r1, [r2, #4] @ SRam.start\r
cc68a136 647 cmp r0, r1\r
648 blt m_read32_nosram\r
7969166e 649 ldrb r1, [r3, #0x11] @ Pico.m.sram_reg\r
650 tst r1, #5\r
651 beq m_read32_nosram\r
652 stmfd sp!,{r0,lr}\r
9dc09829 653 bl SRAMRead16\r
7969166e 654 ldmfd sp!,{r1,lr}\r
655 stmfd sp!,{r0,lr}\r
656 add r0, r1, #2\r
9dc09829 657 bl SRAMRead16\r
7969166e 658 ldmfd sp!,{r1,lr}\r
3ec29f01 659 orr r0, r0, r1, lsl #16\r
cc68a136 660 bx lr\r
661m_read32_nosram:\r
7969166e 662 ldr r1, [r3, #4] @ romsize\r
cc68a136 663 cmp r0, r1\r
664 movgt r0, #0\r
665 bxgt lr @ bad location\r
666 ldr r1, [r3] @ (1ci)\r
667 ldrh r0, [r1, r0]!\r
668 ldrh r1, [r1, #2] @ (2ci)\r
669 orr r0, r1, r0, lsl #16\r
670 bx lr\r
671\r
672m_read32_rom5: @ 0x280000 - 0x2fffff\r
673 m_read32_rom 5\r
674\r
675m_read32_rom6: @ 0x300000 - 0x37ffff\r
676 m_read32_rom 6\r
677\r
678m_read32_rom7: @ 0x380000 - 0x3fffff\r
679 m_read32_rom 7\r
680\r
681m_read32_rom8: @ 0x400000 - 0x47ffff\r
682 m_read32_rom 8\r
683\r
684m_read32_rom9: @ 0x480000 - 0x4fffff\r
685 m_read32_rom 9\r
686\r
cc68a136 687m_read32_romA: @ 0x500000 - 0x57ffff\r
688 m_read32_rom 0xA\r
689\r
690m_read32_romB: @ 0x580000 - 0x5fffff\r
691 m_read32_rom 0xB\r
692\r
693m_read32_romC: @ 0x600000 - 0x67ffff\r
694 m_read32_rom 0xC\r
695\r
696m_read32_romD: @ 0x680000 - 0x6fffff\r
697 m_read32_rom 0xD\r
698\r
699m_read32_romE: @ 0x700000 - 0x77ffff\r
700 m_read32_rom 0xE\r
701\r
702m_read32_romF: @ 0x780000 - 0x7fffff\r
703 m_read32_rom 0xF\r
704\r
29a95187 705m_read32_rom10: @ 0x800000 - 0x87ffff\r
706 m_read32_rom 0x10\r
707\r
708m_read32_rom11: @ 0x880000 - 0x8fffff\r
709 m_read32_rom 0x11\r
710\r
711m_read32_rom12: @ 0x900000 - 0x97ffff\r
712 m_read32_rom 0x12\r
713\r
714m_read32_rom13: @ 0x980000 - 0x9fffff\r
715 m_read32_rom 0x13\r
716\r
cc68a136 717m_read32_misc:\r
718 bic r0, r0, #1\r
719 stmfd sp!,{r0,lr}\r
720 mov r1, #32\r
721 bl OtherRead16\r
722 mov r1, r0\r
723 ldmfd sp!,{r0}\r
724 stmfd sp!,{r1}\r
725 add r0, r0, #2\r
726 mov r1, #32\r
727 bl OtherRead16\r
728 ldmfd sp!,{r1,lr}\r
729 orr r0, r0, r1, lsl #16\r
730 bx lr\r
731\r
732m_read32_vdp:\r
733 tst r0, #0x70000\r
734 tsteq r0, #0x000e0\r
735 bxne lr @ invalid read\r
736 bic r0, r0, #1\r
4ff2d527 737 add r1, r0, #2\r
738 stmfd sp!,{r1,lr}\r
cc68a136 739 bl PicoVideoRead\r
4ff2d527 740 swp r0, r0, [sp]\r
cc68a136 741 bl PicoVideoRead\r
742 ldmfd sp!,{r1,lr}\r
743 orr r0, r0, r1, lsl #16\r
744 bx lr\r
745\r
746m_read32_ram:\r
747 ldr r1, =Pico\r
748 bic r0, r0, #0xff0000\r
749 bic r0, r0, #1\r
750 ldrh r0, [r1, r0]!\r
751 ldrh r1, [r1, #2] @ 2ci\r
752 orr r0, r1, r0, lsl #16\r
753 bx lr\r
754\r
755m_read32_above_rom:\r
0ffefdb8 756 ldr r2, =PicoRead16Hook\r
cc68a136 757 bic r0, r0, #1\r
0ffefdb8 758 ldr r2, [r2]\r
cc68a136 759 mov r1, #32\r
0ffefdb8 760 stmfd sp!,{r0,r2,lr}\r
761 mov lr, pc\r
762 bx r2\r
cc68a136 763 mov r1, r0\r
0ffefdb8 764 ldmfd sp!,{r0,r2}\r
cc68a136 765 stmfd sp!,{r1}\r
766 add r0, r0, #2\r
767 mov r1, #32\r
0ffefdb8 768 mov lr, pc\r
769 bx r2\r
cc68a136 770 ldmfd sp!,{r1,lr}\r
771 orr r0, r0, r1, lsl #16\r
772 bx lr\r
773\r
774.pool\r
775\r
776@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\r
777\r
778PicoWriteRomHW_SSF2: @ u32 a, u32 d\r
779 and r0, r0, #0xe\r
780 movs r0, r0, lsr #1\r
781 bne pwr_banking\r
782\r
783 @ sram register\r
784 ldr r2, =(Pico+0x22211) @ Pico.m.sram_reg\r
721cd396 785 ldrb r0, [r2]\r
cc68a136 786 and r1, r1, #3\r
721cd396 787 bic r0, r0, #3\r
788 orr r0, r0, r1\r
789 strb r0, [r2]\r
cc68a136 790 bx lr\r
791\r
792pwr_banking:\r
793 and r1, r1, #0x1f\r
794\r
795 ldr r3, =m_read8_def_table\r
796 ldr r2, =m_read8_table\r
797 ldr r12, [r3, r1, lsl #2]\r
798 str r12, [r2, r0, lsl #2]\r
799\r
800 ldr r3, =m_read16_def_table\r
801 ldr r2, =m_read16_table\r
802 ldr r12, [r3, r1, lsl #2]\r
803 str r12, [r2, r0, lsl #2]\r
804\r
805 ldr r3, =m_read32_def_table\r
806 ldr r2, =m_read32_table\r
807 ldr r12, [r3, r1, lsl #2]\r
808 str r12, [r2, r0, lsl #2]\r
809 \r
810 bx lr\r
721cd396 811\r
e5503e2f 812@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\r
813\r
814@ Here we only handle most often used locations,\r
815@ everything else is passed to generic handlers\r
816\r
817PicoWrite8: @ u32 a, u8 d\r
818 bic r0, r0, #0xff000000\r
819 and r2, r0, #0x00e00000\r
820 cmp r2, #0x00e00000 @ RAM?\r
821 ldr r3, =Pico\r
822 biceq r0, r0, #0x00ff0000\r
823 eoreq r0, r0, #1\r
824 streqb r1, [r3, r0]\r
825 bxeq lr\r
826\r
827m_m68k_write8_misc:\r
828 bic r2, r0, #0x1f @ most commonly we get i/o port write,\r
829 cmp r2, #0xa10000 @ so check for it first\r
830 bne m_write8_misc2\r
831m_write8_io:\r
832 ldr r2, =PicoOpt\r
833 and r0, r0, #0x1e\r
834 ldr r2, [r2]\r
835 ldr r3, =(Pico+0x22000) @ Pico.ioports\r
836 tst r2, #0x20 @ 6 button pad?\r
837 streqb r1, [r3, r0, lsr #1]\r
838 bxeq lr\r
839 cmp r0, #2\r
840 cmpne r0, #4\r
841 bne m_write8_io_done @ not likely to happen\r
842 add r2, r3, #0x200 @ Pico+0x22200\r
843 mov r12,#0\r
844 cmp r0, #2\r
845 streqb r12,[r2,#0x18]\r
846 strneb r12,[r2,#0x19] @ Pico.m.padDelay[i] = 0\r
847 tst r1, #0x40 @ TH\r
848 beq m_write8_io_done\r
849 ldrb r12,[r3, r0, lsr #1]\r
850 tst r12,#0x40\r
851 bne m_write8_io_done\r
852 cmp r0, #2\r
853 ldreqb r12,[r2,#0x0a]\r
854 ldrneb r12,[r2,#0x0b] @ Pico.m.padTHPhase\r
855 add r12,r12,#1\r
856 streqb r12,[r2,#0x0a]\r
857 strneb r12,[r2,#0x0b] @ Pico.m.padTHPhase\r
858m_write8_io_done:\r
859 strb r1, [r3, r0, lsr #1]\r
860 bx lr\r
861\r
862\r
863m_write8_misc2:\r
864 and r2, r0, #0xff0000\r
865 cmp r2, #0xa00000 @ z80 area?\r
866 bne m_write8_not_z80\r
867 tst r0, #0x4000\r
868 bne m_write8_z80_not_ram\r
869 ldr r3, =(Pico+0x20000) @ Pico.zram\r
870 add r2, r3, #0x02200 @ Pico+0x22200\r
871 ldrb r2, [r2, #9] @ Pico.m.z80Run\r
872 bic r0, r0, #0xff0000\r
873 bic r0, r0, #0x00e000\r
874 tst r2, #1\r
875 streqb r1, [r3, r0] @ zram\r
876 bx lr\r
877\r
878m_write8_z80_not_ram:\r
879 and r2, r0, #0x6000\r
880 cmp r2, #0x4000\r
881 bne m_write8_z80_not_ym2612\r
4b9c5888 882 ldr r3, =PicoOpt\r
e5503e2f 883 and r0, r0, #3\r
4b9c5888 884 ldr r3, [r3]\r
885 mov r2, #0 @ is_from_z80 = 0\r
886 tst r3, #1\r
e5503e2f 887 bxeq lr\r
888 stmfd sp!,{lr}\r
4b9c5888 889 and r1, r1, #0xff\r
890 bl ym2612_write_local\r
e5503e2f 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
4b9c5888 896 str r1, [r2] @ emustatus|=ym2612_write_local(a&3, d);\r
e5503e2f 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
4b9c5888 913 mov r1, r1, lsl #8\r
e5503e2f 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
4b9c5888 929 and r0, r1, #0xff\r
e5503e2f 930 ldr r2, [r2]\r
931 tst r2, #2\r
932 bxeq lr\r
bf537655 933 b SN76496Write\r
e5503e2f 934\r