4ff2d527 |
1 | @ vim:filetype=armasm |
2 | |
3 | @ Memory i/o handlers for Sega/Mega CD emulation |
4 | @ (c) Copyright 2007, Grazvydas "notaz" Ignotas |
5 | @ All Rights Reserved |
6 | |
7 | |
8 | |
9 | .equiv PCM_STEP_SHIFT, 11 |
10 | |
11 | @ jump tables |
12 | .data |
13 | .align 4 |
14 | |
15 | .altmacro |
16 | .macro mk_m68k_jump_table on sz @ operation name, size |
17 | .long m_m68k_&\on&\sz&_bios @ 0x000000 - 0x01ffff |
18 | .long m_m68k_&\on&\sz&_prgbank @ 0x020000 - 0x03ffff |
19 | .long m_&\on&_null, m_&\on&_null @ 0x040000 - 0x07ffff |
20 | .long m_&\on&_null, m_&\on&_null, m_&\on&_null, m_&\on&_null @ 0x080000 - 0x0fffff |
21 | .long m_&\on&_null, m_&\on&_null, m_&\on&_null, m_&\on&_null @ 0x100000 - 0x17ffff |
22 | .long m_&\on&_null, m_&\on&_null, m_&\on&_null, m_&\on&_null @ 0x180000 - 0x1fffff |
23 | .long m_m68k_&\on&\sz&_wordram0_2M @ 0x200000 - 0x21ffff |
24 | .long m_m68k_&\on&\sz&_wordram1_2M @ 0x220000 - 0x23ffff |
25 | .long m_&\on&_null, m_&\on&_null @ 0x240000 - 0x27ffff |
26 | .long m_&\on&_null, m_&\on&_null, m_&\on&_null, m_&\on&_null @ 0x280000 - 0x2fffff |
27 | .long m_&\on&_null, m_&\on&_null, m_&\on&_null, m_&\on&_null @ 0x300000 |
28 | .long m_&\on&_null, m_&\on&_null, m_&\on&_null, m_&\on&_null @ - 0x3fffff |
29 | .long m_&\on&_null, m_&\on&_null, m_&\on&_null, m_&\on&_null @ 0x400000 |
30 | .long m_&\on&_null, m_&\on&_null, m_&\on&_null, m_&\on&_null @ - 0x4fffff |
31 | .long m_&\on&_null, m_&\on&_null, m_&\on&_null, m_&\on&_null @ 0x500000 |
32 | .long m_&\on&_null, m_&\on&_null, m_&\on&_null, m_&\on&_null @ - 0x5fffff |
33 | .long m_&\on&_null, m_&\on&_null, m_&\on&_null, m_&\on&_null @ 0x600000 |
34 | .long m_&\on&_null, m_&\on&_null, m_&\on&_null, m_&\on&_null @ - 0x6fffff |
35 | .long m_&\on&_null, m_&\on&_null, m_&\on&_null, m_&\on&_null @ 0x700000 |
36 | .long m_&\on&_null, m_&\on&_null, m_&\on&_null, m_&\on&_null @ - 0x7fffff |
37 | .long m_&\on&_null, m_&\on&_null, m_&\on&_null, m_&\on&_null @ 0x800000 |
38 | .long m_&\on&_null, m_&\on&_null, m_&\on&_null, m_&\on&_null @ - 0x8fffff |
39 | .long m_&\on&_null, m_&\on&_null, m_&\on&_null, m_&\on&_null @ 0x900000 |
40 | .long m_&\on&_null, m_&\on&_null, m_&\on&_null, m_&\on&_null @ - 0x9fffff |
41 | .long m_m68k_&\on&\sz&_system_io @ 0xa00000 - 0xa1ffff |
42 | .long m_&\on&_null, m_&\on&_null, m_&\on&_null @ 0xa20000 - 0xa7ffff |
43 | .long m_&\on&_null, m_&\on&_null, m_&\on&_null, m_&\on&_null @ 0xa80000 - 0xafffff |
44 | .long m_&\on&_null, m_&\on&_null, m_&\on&_null, m_&\on&_null @ 0xb00000 |
45 | .long m_&\on&_null, m_&\on&_null, m_&\on&_null, m_&\on&_null @ - 0xbfffff |
46 | .long m_m68k_&\on&\sz&_vdp, m_m68k_&\on&\sz&_vdp, m_m68k_&\on&\sz&_vdp, m_m68k_&\on&\sz&_vdp @ 0xc00000 |
47 | .long m_m68k_&\on&\sz&_vdp, m_m68k_&\on&\sz&_vdp, m_m68k_&\on&\sz&_vdp, m_m68k_&\on&\sz&_vdp @ - 0xcfffff |
48 | .long m_&\on&_null, m_&\on&_null, m_&\on&_null, m_&\on&_null @ 0xd00000 |
49 | .long m_&\on&_null, m_&\on&_null, m_&\on&_null, m_&\on&_null @ - 0xdfffff |
50 | .long m_m68k_&\on&\sz&_ram, m_m68k_&\on&\sz&_ram, m_m68k_&\on&\sz&_ram, m_m68k_&\on&\sz&_ram @ 0xe00000 |
51 | .long m_m68k_&\on&\sz&_ram, m_m68k_&\on&\sz&_ram, m_m68k_&\on&\sz&_ram, m_m68k_&\on&\sz&_ram @ - 0xefffff |
52 | .long m_m68k_&\on&\sz&_ram, m_m68k_&\on&\sz&_ram, m_m68k_&\on&\sz&_ram, m_m68k_&\on&\sz&_ram @ 0xf00000 |
53 | .long m_m68k_&\on&\sz&_ram, m_m68k_&\on&\sz&_ram, m_m68k_&\on&\sz&_ram, m_m68k_&\on&\sz&_ram @ - 0xffffff |
54 | .endm |
55 | |
56 | .macro mk_s68k_jump_table1 on sz @ operation name, size |
57 | .long m_s68k_&\on&\sz&_prg, m_s68k_&\on&\sz&_prg, m_s68k_&\on&\sz&_prg, m_s68k_&\on&\sz&_prg @ 0x000000 - 0x07ffff |
58 | .long m_s68k_&\on&\sz&_wordram_2M @ 0x080000 - 0x09ffff |
59 | .long m_s68k_&\on&\sz&_wordram_2M @ 0x0a0000 - 0x0bffff |
60 | .long m_&\on&_null @ 0x0c0000 - 0x0dffff, 1M area |
61 | .long m_&\on&_null @ 0x0e0000 - 0x0fffff |
62 | .endm |
63 | |
64 | .macro mk_s68k_jump_table2 on sz @ operation name, size |
65 | .long m_s68k_&\on&\sz&_backup @ 0xfe0000 - 0xfe7fff |
66 | .long m_s68k_&\on&\sz&_backup @ 0xfe8000 - 0xfeffff |
67 | .long m_s68k_&\on&\sz&_pcm @ 0xff0000 - 0xff7fff |
68 | .long m_s68k_&\on&\sz&_regs @ 0xff8000 - 0xffffff |
69 | .endm |
70 | |
71 | |
72 | @ the jumptables themselves |
73 | m_m68k_read8_table: mk_m68k_jump_table read 8 |
74 | m_m68k_read16_table: mk_m68k_jump_table read 16 |
75 | m_m68k_read32_table: mk_m68k_jump_table read 32 |
76 | m_m68k_write8_table: mk_m68k_jump_table write 8 |
77 | m_m68k_write16_table: mk_m68k_jump_table write 16 |
78 | m_m68k_write32_table: mk_m68k_jump_table write 32 |
79 | |
80 | |
81 | m_s68k_read8_table: |
82 | mk_s68k_jump_table1 read 8 |
83 | mk_s68k_jump_table2 read 8 |
84 | m_s68k_read16_table: |
85 | mk_s68k_jump_table1 read 16 |
86 | mk_s68k_jump_table2 read 16 |
87 | m_s68k_read32_table: |
88 | mk_s68k_jump_table1 read 32 |
89 | mk_s68k_jump_table2 read 32 |
90 | m_s68k_write8_table: |
91 | mk_s68k_jump_table1 write 8 |
92 | mk_s68k_jump_table2 write 8 |
93 | m_s68k_write16_table: |
94 | mk_s68k_jump_table1 write 16 |
95 | mk_s68k_jump_table2 write 16 |
96 | m_s68k_write32_table: |
97 | mk_s68k_jump_table1 write 32 |
98 | mk_s68k_jump_table2 write 32 |
99 | |
100 | |
101 | @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ |
102 | |
103 | .text |
104 | .align 4 |
105 | |
106 | .global PicoMemResetCD |
107 | .global PicoReadM68k8 |
108 | .global PicoReadM68k16 |
109 | .global PicoReadM68k32 |
110 | .global PicoWriteM68k8 |
111 | .global PicoWriteM68k16 |
112 | .global PicoWriteM68k32 |
113 | .global PicoReadS68k8 |
114 | .global PicoReadS68k16 |
115 | .global PicoReadS68k32 |
116 | .global PicoWriteS68k8 |
117 | .global PicoWriteS68k16 |
118 | .global PicoWriteS68k32 |
119 | |
120 | @ externs, just for reference |
121 | .extern Pico |
122 | .extern z80Read8 |
123 | .extern OtherRead16 |
124 | .extern PicoVideoRead |
125 | .extern Read_CDC_Host |
126 | .extern m68k_reg_write8 |
127 | .extern OtherWrite8 |
128 | .extern OtherWrite16 |
129 | .extern gfx_cd_read |
130 | .extern s68k_reg_read16 |
131 | .extern SRam |
132 | .extern gfx_cd_write |
133 | .extern s68k_reg_write8 |
134 | |
135 | |
136 | @ r0=reg3, r1-r3=temp |
137 | .macro mk_update_table on sz @ operation name, size |
138 | @ we only set word-ram handlers |
139 | ldr r1, =m_m68k_&\on&\sz&_table |
140 | ldr r12,=m_s68k_&\on&\sz&_table |
141 | tst r0, #4 |
142 | bne 0f @ pmr_8_1M |
143 | |
144 | @ pmr_8_2M: |
145 | ldr r2, =m_m68k_&\on&\sz&_wordram0_2M |
146 | ldr r3, =m_s68k_&\on&\sz&_wordram_2M |
147 | str r2, [r1, #16*4] |
148 | str r2, [r1, #17*4] |
149 | ldr r2, =m_&\on&_null |
150 | str r3, [r12,#4*4] |
151 | str r3, [r12,#5*4] |
152 | str r2, [r12,#6*4] |
153 | b 9f @ pmr_8_done |
154 | |
155 | 0: @ pmr_8_1M: |
156 | tst r0, #1 |
157 | bne 1f @ pmr_8_1M1 |
158 | |
159 | @ pmr_8_1M0: |
160 | ldr r2, =m_m68k_&\on&\sz&_wordram0_1M_b0 |
161 | ldr r3, =m_m68k_&\on&\sz&_wordram1_1M_b0 |
162 | str r2, [r1, #16*4] |
163 | str r3, [r1, #17*4] |
164 | ldr r2, =m_s68k_&\on&\sz&_wordram_2M_decode_b1 |
165 | ldr r3, =m_s68k_&\on&\sz&_wordram_1M_b1 |
166 | str r2, [r12,#4*4] |
167 | str r2, [r12,#5*4] |
168 | str r3, [r12,#6*4] |
169 | b 9f @ pmr_8_done |
170 | |
171 | 1: @ pmr_8_1M1: |
172 | ldr r2, =m_m68k_&\on&\sz&_wordram0_1M_b1 |
173 | ldr r3, =m_m68k_&\on&\sz&_wordram1_1M_b1 |
174 | str r2, [r1, #16*4] |
175 | str r3, [r1, #17*4] |
176 | ldr r2, =m_s68k_&\on&\sz&_wordram_2M_decode_b0 |
177 | ldr r3, =m_s68k_&\on&\sz&_wordram_1M_b0 |
178 | str r2, [r12,#4*4] |
179 | str r2, [r12,#5*4] |
180 | str r3, [r12,#6*4] |
181 | |
182 | 9: @ pmr_8_done: |
183 | .endm |
184 | |
185 | |
186 | PicoMemResetCD: @ r3 |
187 | mk_update_table read 8 |
188 | mk_update_table read 16 |
189 | mk_update_table read 32 |
190 | mk_update_table write 8 |
191 | mk_update_table write 16 |
192 | mk_update_table write 32 |
193 | bx lr |
194 | |
195 | |
196 | .pool |
197 | |
198 | @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ |
199 | |
200 | .macro mk_entry_m68k table |
201 | ldr r2, =\table |
202 | bic r0, r0, #0xff000000 |
203 | and r3, r0, #0x00fe0000 |
204 | ldr pc, [r2, r3, lsr #15] |
205 | .endm |
206 | |
207 | PicoReadM68k8: @ u32 a |
208 | mk_entry_m68k m_m68k_read8_table |
209 | |
210 | PicoReadM68k16: @ u32 a |
211 | mk_entry_m68k m_m68k_read16_table |
212 | |
213 | PicoReadM68k32: @ u32 a |
214 | mk_entry_m68k m_m68k_read32_table |
215 | |
216 | PicoWriteM68k8: @ u32 a, u8 d |
217 | mk_entry_m68k m_m68k_write8_table |
218 | |
219 | PicoWriteM68k16: @ u32 a, u16 d |
220 | mk_entry_m68k m_m68k_write16_table |
221 | |
222 | PicoWriteM68k32: @ u32 a, u32 d |
223 | mk_entry_m68k m_m68k_write32_table |
224 | |
225 | |
226 | .macro mk_entry_s68k table |
227 | ldr r2, =\table |
228 | bic r0, r0, #0xff000000 |
229 | and r3, r0, #0x00fe0000 |
230 | cmp r3, #0x000e0000 |
231 | ldrlt pc, [r2, r3, lsr #15] |
232 | add r2, r2, #8*4 @ skip to table2 |
233 | cmp r3, #0x00fe0000 |
234 | andge r3, r0, #0x00018000 |
235 | ldrge pc, [r2, r3, lsr #13] |
236 | mov r0, #0 |
237 | bx lr |
238 | .endm |
239 | |
240 | PicoReadS68k8: @ u32 a |
241 | mk_entry_s68k m_s68k_read8_table |
242 | |
243 | PicoReadS68k16: @ u32 a |
244 | mk_entry_s68k m_s68k_read16_table |
245 | |
246 | PicoReadS68k32: @ u32 a |
247 | mk_entry_s68k m_s68k_read32_table |
248 | |
249 | PicoWriteS68k8: @ u32 a, u8 d |
250 | mk_entry_s68k m_s68k_write8_table |
251 | |
252 | PicoWriteS68k16: @ u32 a, u16 d |
253 | mk_entry_s68k m_s68k_write16_table |
254 | |
255 | PicoWriteS68k32: @ u32 a, u32 d |
256 | mk_entry_s68k m_s68k_write32_table |
257 | |
258 | |
259 | .pool |
260 | |
261 | @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ |
262 | |
263 | @ utilities |
264 | |
265 | @ r0=addr[in,out], r1,r2=tmp |
266 | .macro cell_map |
267 | ands r1, r0, #0x01c000 |
268 | ldrne pc, [pc, r1, lsr #12] |
269 | beq 0f @ most common? |
270 | .long 0f |
271 | .long 0f |
272 | .long 0f |
273 | .long 0f |
274 | .long 1f |
275 | .long 1f |
276 | .long 2f |
277 | .long 3f |
278 | 1: @ x16 cells |
279 | and r1, r0, #0x7e00 @ col |
280 | and r2, r0, #0x01fc @ row |
281 | orr r2, r2, #0x0400 |
282 | orr r1, r2, r1, ror #13 |
283 | b 9f |
284 | 2: @ x8 cells |
285 | and r1, r0, #0x3f00 @ col |
286 | and r2, r0, #0x00fc @ row |
287 | orr r2, r2, #0x0600 |
288 | orr r1, r2, r1, ror #12 |
289 | b 9f |
290 | 3: @ x4 cells |
291 | and r1, r0, #0x1f80 @ col |
292 | and r2, r0, #0x007c @ row |
293 | orr r1, r2, r1, ror #11 |
294 | and r2, r0,#0x1e000 |
295 | orr r1, r1, r2, lsr #6 |
296 | b 9f |
297 | 0: @ x32 cells |
298 | and r1, r0, #0xfc00 @ col |
299 | and r2, r0, #0x03fc @ row |
300 | orr r1, r2, r1, ror #14 |
301 | 9: |
302 | and r0, r0, #3 |
303 | orr r0, r0, r1, ror #26 @ rol 4+2 |
304 | .endm |
305 | |
306 | |
307 | @ r0=prt1, r1=ptr2 |
308 | .macro m_read32_gen |
309 | tst r0, #2 |
310 | ldrneh r0, [r1, r0]! |
311 | ldrneh r1, [r1, #2] |
312 | ldreq r0, [r1, r0] |
313 | moveq r0, r0, ror #16 |
314 | orrne r0, r1, r0, lsl #16 |
315 | .endm |
316 | |
317 | |
318 | @ r0=prt1, r1=data, r2=ptr2 |
319 | .macro m_write32_gen |
320 | tst r0, #2 |
321 | mov r1, r1, ror #16 |
322 | strneh r1, [r2, r0]! |
323 | movne r1, r1, lsr #16 |
324 | strneh r1, [r2, #2] |
325 | streq r1, [r2, r0] |
326 | .endm |
327 | |
328 | |
329 | @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ |
330 | |
331 | |
332 | m_read_null: |
333 | mov r0, #0 |
334 | bx lr |
335 | |
336 | |
337 | m_m68k_read8_bios: |
338 | ldr r1, =(Pico+0x22200) |
339 | bic r0, r0, #0xfe0000 |
340 | ldr r1, [r1] |
341 | eor r0, r0, #1 |
342 | ldrb r0, [r1, r0] |
343 | bx lr |
344 | |
345 | |
346 | m_m68k_read8_prgbank: |
347 | ldr r1, =(Pico+0x22200) |
348 | eor r0, r0, #1 |
349 | ldr r1, [r1] |
350 | mov r2, #0x110000 |
351 | orr r3, r2, #0x002200 |
352 | ldr r3, [r1, r3] |
353 | ldr r2, [r1, r2] |
354 | tst r3, #0x00020000 @ have bus? |
355 | moveq r0, #0 |
356 | bxeq lr |
357 | and r2, r2, #0xc0000000 @ r3 & 0xC0 |
358 | add r1, r1, r2, lsr #12 |
359 | ldrb r0, [r1, r0] |
360 | bx lr |
361 | |
362 | |
363 | m_m68k_read8_wordram0_2M: @ 0x200000 - 0x21ffff |
364 | m_m68k_read8_wordram1_2M: @ 0x220000 - 0x23ffff |
365 | ldr r1, =(Pico+0x22200) |
366 | sub r0, r0, #0x160000 @ map to our offset, which is 0x0a0000 |
367 | ldr r1, [r1] |
368 | eor r0, r0, #1 |
369 | ldrb r0, [r1, r0] |
370 | bx lr |
371 | |
372 | |
373 | m_m68k_read8_wordram0_1M_b0: @ 0x200000 - 0x21ffff |
374 | ldr r1, =(Pico+0x22200) |
375 | sub r0, r0, #0x140000 @ map to our offset, which is 0x0c0000 |
376 | ldr r1, [r1] |
377 | eor r0, r0, #1 |
378 | ldrb r0, [r1, r0] |
379 | bx lr |
380 | |
381 | |
382 | m_m68k_read8_wordram0_1M_b1: @ 0x200000 - 0x21ffff |
383 | ldr r1, =(Pico+0x22200) |
384 | sub r0, r0, #0x120000 @ map to our offset, which is 0x0e0000 |
385 | ldr r1, [r1] |
386 | eor r0, r0, #1 |
387 | ldrb r0, [r1, r0] |
388 | bx lr |
389 | |
390 | |
391 | m_m68k_read8_wordram1_1M_b0: @ 0x220000 - 0x23ffff, cell arranged |
392 | cell_map |
393 | ldr r1, =(Pico+0x22200) |
394 | add r0, r0, #0x0c0000 |
395 | ldr r1, [r1] |
396 | eor r0, r0, #1 |
397 | ldrb r0, [r1, r0] |
398 | bx lr |
399 | |
400 | |
401 | m_m68k_read8_wordram1_1M_b1: @ 0x220000 - 0x23ffff, cell arranged |
402 | cell_map |
403 | ldr r1, =(Pico+0x22200) |
404 | add r0, r0, #0x0e0000 |
405 | ldr r1, [r1] |
406 | eor r0, r0, #1 |
407 | ldrb r0, [r1, r0] |
408 | bx lr |
409 | |
410 | |
411 | m_m68k_read8_system_io: |
412 | bic r2, r0, #0xfe0000 |
413 | bic r2, r2, #0x3f |
414 | cmp r2, #0x012000 |
415 | bne m_m68k_read8_misc |
416 | |
417 | ldr r1, =(Pico+0x22200) |
418 | and r0, r0, #0x3f |
419 | ldr r1, [r1] @ Pico.mcd (used everywhere) |
420 | cmp r0, #0x0e |
421 | ldrlt pc, [pc, r0, lsl #2] |
422 | b m_m68k_read8_hi |
423 | .long m_m68k_read8_r00 |
424 | .long m_m68k_read8_r01 |
425 | .long m_m68k_read8_r02 |
426 | .long m_m68k_read8_r03 |
427 | .long m_m68k_read8_r04 |
428 | .long m_read_null @ unused bits |
429 | .long m_m68k_read8_r06 |
430 | .long m_m68k_read8_r07 |
431 | .long m_m68k_read8_r08 |
432 | .long m_m68k_read8_r09 |
433 | .long m_read_null @ reserved |
434 | .long m_read_null |
435 | .long m_m68k_read8_r0c |
436 | .long m_m68k_read8_r0d |
437 | m_m68k_read8_r00: |
438 | add r1, r1, #0x110000 |
439 | ldr r0, [r1, #30] |
440 | and r0, r0, #0x04000000 @ we need irq2 mask state |
441 | mov r0, r0, lsr #19 |
442 | bx lr |
443 | m_m68k_read8_r01: |
444 | add r1, r1, #0x110000 |
445 | add r1, r1, #0x002200 |
446 | ldrb r0, [r1, #2] @ Pico_mcd->m.busreq |
447 | bx lr |
448 | m_m68k_read8_r02: |
449 | add r1, r1, #0x110000 |
450 | ldrb r0, [r1, #2] |
451 | bx lr |
452 | m_m68k_read8_r03: |
453 | add r1, r1, #0x110000 |
454 | ldrb r0, [r1, #3] |
455 | and r0, r0, #0xc7 |
456 | bx lr |
457 | m_m68k_read8_r04: |
458 | add r1, r1, #0x110000 |
459 | ldrb r0, [r1, #4] |
460 | bx lr |
461 | m_m68k_read8_r06: |
462 | ldrb r0, [r1, #0x73] @ IRQ vector |
463 | bx lr |
464 | m_m68k_read8_r07: |
465 | ldrb r0, [r1, #0x72] |
466 | bx lr |
467 | m_m68k_read8_r08: |
468 | mov r0, #0 |
469 | bl Read_CDC_Host @ TODO: make it local |
470 | mov r0, r0, lsr #8 |
471 | bx lr |
472 | m_m68k_read8_r09: |
473 | mov r0, #0 |
474 | b Read_CDC_Host |
475 | m_m68k_read8_r0c: |
476 | add r1, r1, #0x110000 |
477 | add r1, r1, #0x002200 |
478 | ldr r0, [r1, #0x14] @ Pico_mcd->m.timer_stopwatch |
479 | mov r0, r0, lsr #24 |
480 | bx lr |
481 | m_m68k_read8_r0d: |
482 | add r1, r1, #0x110000 |
483 | add r1, r1, #0x002200 |
484 | ldr r0, [r1, #0x14] |
485 | mov r0, r0, lsr #16 |
486 | bx lr |
487 | m_m68k_read8_hi: |
488 | cmp r0, #0x30 |
489 | movge r0, #0 |
490 | bxeq lr |
491 | add r1, r1, #0x110000 |
492 | ldrb r0, [r1, r0] |
493 | bx lr |
494 | |
495 | |
496 | m_m68k_read8_misc: |
497 | bic r2, r0, #0x00ff |
498 | bic r2, r2, #0xbf00 |
499 | cmp r2, #0xa00000 @ Z80 RAM? |
500 | beq z80Read8 |
501 | @ ldreq r2, =z80Read8 |
502 | @ bxeq r2 |
503 | stmfd sp!,{r0,lr} |
504 | bic r0, r0, #1 |
505 | mov r1, #8 |
506 | bl OtherRead16 @ non-MCD version should be ok too |
507 | ldmfd sp!,{r1,lr} |
508 | tst r1, #1 |
509 | moveq r0, r0, lsr #8 |
510 | bx lr |
511 | |
512 | |
513 | m_m68k_read8_vdp: |
514 | tst r0, #0x70000 |
515 | tsteq r0, #0x000e0 |
516 | bxne lr @ invalid read |
517 | stmfd sp!,{r0,lr} |
518 | bic r0, r0, #1 |
519 | bl PicoVideoRead @ TODO: implement it in asm |
520 | ldmfd sp!,{r1,lr} |
521 | tst r1, #1 |
522 | moveq r0, r0, lsr #8 |
523 | bx lr |
524 | |
525 | |
526 | m_m68k_read8_ram: |
527 | ldr r1, =Pico |
528 | bic r0, r0, #0xff0000 |
529 | eor r0, r0, #1 |
530 | ldrb r0, [r1, r0] |
531 | bx lr |
532 | |
533 | |
534 | @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ |
535 | |
536 | |
537 | m_m68k_read16_bios: |
538 | ldr r1, =(Pico+0x22200) |
539 | bic r0, r0, #0xfe0000 |
540 | ldr r1, [r1] |
541 | bic r0, r0, #1 |
542 | ldrh r0, [r1, r0] |
543 | bx lr |
544 | |
545 | |
546 | m_m68k_read16_prgbank: |
547 | ldr r1, =(Pico+0x22200) |
548 | bic r0, r0, #1 |
549 | ldr r1, [r1] |
550 | mov r2, #0x110000 |
551 | orr r3, r2, #0x002200 |
552 | ldr r3, [r1, r3] |
553 | ldr r2, [r1, r2] |
554 | tst r3, #0x00020000 @ have bus? |
555 | moveq r0, #0 |
556 | bxeq lr |
557 | and r2, r2, #0xc0000000 @ r3 & 0xC0 |
558 | add r1, r1, r2, lsr #12 |
559 | ldrh r0, [r1, r0] |
560 | bx lr |
561 | |
562 | |
563 | m_m68k_read16_wordram0_2M: @ 0x200000 - 0x21ffff |
564 | m_m68k_read16_wordram1_2M: @ 0x220000 - 0x23ffff |
565 | ldr r1, =(Pico+0x22200) |
566 | sub r0, r0, #0x160000 @ map to our offset, which is 0x0a0000 |
567 | ldr r1, [r1] |
568 | bic r0, r0, #1 |
569 | ldrh r0, [r1, r0] |
570 | bx lr |
571 | |
572 | |
573 | m_m68k_read16_wordram0_1M_b0: @ 0x200000 - 0x21ffff |
574 | ldr r1, =(Pico+0x22200) |
575 | sub r0, r0, #0x140000 @ map to our offset, which is 0x0c0000 |
576 | ldr r1, [r1] |
577 | bic r0, r0, #1 |
578 | ldrh r0, [r1, r0] |
579 | bx lr |
580 | |
581 | |
582 | m_m68k_read16_wordram0_1M_b1: @ 0x200000 - 0x21ffff |
583 | ldr r1, =(Pico+0x22200) |
584 | sub r0, r0, #0x120000 @ map to our offset, which is 0x0e0000 |
585 | ldr r1, [r1] |
586 | bic r0, r0, #1 |
587 | ldrh r0, [r1, r0] |
588 | bx lr |
589 | |
590 | |
591 | m_m68k_read16_wordram1_1M_b0: @ 0x220000 - 0x23ffff, cell arranged |
592 | @ Warning: read32 relies on NOT using r3 and r12 here |
593 | cell_map |
594 | ldr r1, =(Pico+0x22200) |
595 | add r0, r0, #0x0c0000 |
596 | ldr r1, [r1] |
597 | bic r0, r0, #1 |
598 | ldrh r0, [r1, r0] |
599 | bx lr |
600 | |
601 | |
602 | m_m68k_read16_wordram1_1M_b1: @ 0x220000 - 0x23ffff, cell arranged |
603 | cell_map |
604 | ldr r1, =(Pico+0x22200) |
605 | add r0, r0, #0x0e0000 |
606 | ldr r1, [r1] |
607 | bic r0, r0, #1 |
608 | ldrh r0, [r1, r0] |
609 | bx lr |
610 | |
611 | |
612 | m_m68k_read16_system_io: |
613 | bic r1, r0, #0xfe0000 |
614 | bic r1, r1, #0x3f |
615 | cmp r1, #0x012000 |
616 | bne m_m68k_read16_misc |
617 | |
618 | m_m68k_read16_m68k_regs: |
619 | ldr r1, =(Pico+0x22200) |
620 | and r0, r0, #0x3e |
621 | ldr r1, [r1] @ Pico.mcd (used everywhere) |
622 | cmp r0, #0x0e |
623 | ldrlt pc, [pc, r0, lsl #1] |
624 | b m_m68k_read16_hi |
625 | .long m_m68k_read16_r00 |
626 | .long m_m68k_read16_r02 |
627 | .long m_m68k_read16_r04 |
628 | .long m_m68k_read16_r06 |
629 | .long m_m68k_read16_r08 |
630 | .long m_read_null @ reserved |
631 | .long m_m68k_read16_r0c |
632 | m_m68k_read16_r00: |
633 | add r1, r1, #0x110000 |
634 | ldr r0, [r1, #30] |
635 | add r1, r1, #0x002200 |
636 | ldrb r1, [r1, #2] @ Pico_mcd->m.busreq |
637 | and r0, r0, #0x04000000 @ we need irq2 mask state |
638 | orr r0, r1, r0, lsr #11 |
639 | bx lr |
640 | m_m68k_read16_r02: |
641 | add r1, r1, #0x110000 |
642 | ldrb r0, [r1, #2] |
643 | ldrb r1, [r1, #3] |
644 | and r1, r1, #0xc7 |
645 | orr r0, r1, r0, lsl #8 |
646 | bx lr |
647 | m_m68k_read16_r04: |
648 | add r1, r1, #0x110000 |
649 | ldrb r0, [r1, #4] |
650 | mov r0, r0, lsl #8 |
651 | bx lr |
652 | m_m68k_read16_r06: |
653 | ldrh r0, [r1, #0x72] @ IRQ vector |
654 | bx lr |
655 | m_m68k_read16_r08: |
656 | mov r0, #0 |
657 | b Read_CDC_Host |
658 | m_m68k_read16_r0c: |
659 | add r1, r1, #0x110000 |
660 | add r1, r1, #0x002200 |
661 | ldr r0, [r1, #0x14] |
662 | mov r0, r0, lsr #16 |
663 | bx lr |
664 | m_m68k_read16_hi: |
665 | cmp r0, #0x30 |
666 | addlt r1, r1, #0x110000 |
667 | ldrlth r1, [r1, r0] |
668 | movge r0, #0 |
669 | bxge lr |
670 | mov r0, r1, lsr #8 |
671 | and r1, r1, #0xff |
672 | orr r0, r0, r1, lsl #8 |
673 | bx lr |
674 | |
675 | |
676 | m_m68k_read16_misc: |
677 | bic r0, r0, #1 |
678 | mov r1, #16 |
679 | b OtherRead16 |
680 | |
681 | |
682 | m_m68k_read16_vdp: |
683 | tst r0, #0x70000 |
684 | tsteq r0, #0x000e0 |
685 | bxne lr @ invalid read |
686 | bic r0, r0, #1 |
687 | b PicoVideoRead |
688 | |
689 | |
690 | m_m68k_read16_ram: |
691 | ldr r1, =Pico |
692 | bic r0, r0, #0xff0000 |
693 | bic r0, r0, #1 |
694 | ldrh r0, [r1, r0] |
695 | bx lr |
696 | |
697 | |
698 | @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ |
699 | |
700 | |
701 | m_m68k_read32_bios: |
702 | ldr r1, =(Pico+0x22200) |
703 | bic r0, r0, #0xfe0000 |
704 | ldr r1, [r1] |
705 | bic r0, r0, #1 |
706 | m_read32_gen |
707 | bx lr |
708 | |
709 | |
710 | m_m68k_read32_prgbank: |
711 | ldr r1, =(Pico+0x22200) |
712 | bic r0, r0, #1 |
713 | ldr r1, [r1] |
714 | mov r2, #0x110000 |
715 | orr r3, r2, #0x002200 |
716 | ldr r3, [r1, r3] |
717 | ldr r2, [r1, r2] |
718 | tst r3, #0x00020000 @ have bus? |
719 | moveq r0, #0 |
720 | bxeq lr |
721 | and r2, r2, #0xc0000000 @ r3 & 0xC0 |
722 | add r1, r1, r2, lsr #12 |
723 | m_read32_gen |
724 | bx lr |
725 | |
726 | |
727 | m_m68k_read32_wordram0_2M: @ 0x200000 - 0x21ffff |
728 | m_m68k_read32_wordram1_2M: @ 0x220000 - 0x23ffff |
729 | ldr r1, =(Pico+0x22200) |
730 | sub r0, r0, #0x160000 @ map to our offset, which is 0x0a0000 |
731 | ldr r1, [r1] |
732 | bic r0, r0, #1 |
733 | m_read32_gen |
734 | bx lr |
735 | |
736 | |
737 | m_m68k_read32_wordram0_1M_b0: @ 0x200000 - 0x21ffff |
738 | ldr r1, =(Pico+0x22200) |
739 | sub r0, r0, #0x140000 @ map to our offset, which is 0x0c0000 |
740 | ldr r1, [r1] |
741 | bic r0, r0, #1 |
742 | m_read32_gen |
743 | bx lr |
744 | |
745 | |
746 | m_m68k_read32_wordram0_1M_b1: @ 0x200000 - 0x21ffff |
747 | ldr r1, =(Pico+0x22200) |
748 | sub r0, r0, #0x120000 @ map to our offset, which is 0x0e0000 |
749 | ldr r1, [r1] |
750 | bic r0, r0, #1 |
751 | m_read32_gen |
752 | bx lr |
753 | |
754 | |
755 | m_m68k_read32_wordram1_1M_b0: @ 0x220000 - 0x23ffff, cell arranged |
756 | tst r0, #2 |
757 | bne m_m68k_read32_wordram1_1M_b0_unal |
758 | cell_map |
759 | ldr r1, =(Pico+0x22200) |
760 | add r0, r0, #0x0c0000 |
761 | ldr r1, [r1] |
762 | bic r0, r0, #1 |
763 | m_read32_gen |
764 | bx lr |
765 | m_m68k_read32_wordram1_1M_b0_unal: |
766 | @ hopefully this doesn't happen too often |
767 | mov r12,lr |
768 | mov r3, r0 |
769 | bl m_m68k_read16_wordram1_1M_b0 @ must not trash r12 and r3 |
770 | add r1, r3, #2 |
771 | mov r3, r0 |
772 | mov r0, r1 |
773 | bl m_m68k_read16_wordram1_1M_b0 |
774 | orr r0, r0, r3, lsl #16 |
775 | bx r12 |
776 | |
777 | |
778 | m_m68k_read32_wordram1_1M_b1: @ 0x220000 - 0x23ffff, cell arranged |
779 | tst r0, #2 |
780 | bne m_m68k_read32_wordram1_1M_b1_unal |
781 | cell_map |
782 | ldr r1, =(Pico+0x22200) |
783 | add r0, r0, #0x0e0000 |
784 | ldr r1, [r1] |
785 | bic r0, r0, #1 |
786 | m_read32_gen |
787 | bx lr |
788 | m_m68k_read32_wordram1_1M_b1_unal: |
789 | mov r12,lr |
790 | mov r3, r0 |
791 | bl m_m68k_read16_wordram1_1M_b1 @ must not trash r12 and r3 |
792 | add r1, r3, #2 |
793 | mov r3, r0 |
794 | mov r0, r1 |
795 | bl m_m68k_read16_wordram1_1M_b1 |
796 | orr r0, r0, r3, lsl #16 |
797 | bx r12 |
798 | |
799 | |
800 | @ it is not very practical to use long access on hw registers, so I assume it is not used too much. |
801 | m_m68k_read32_system_io: |
802 | bic r1, r0, #0xfe0000 |
803 | bic r1, r1, #0x3f |
804 | cmp r1, #0x012000 |
805 | bne m_m68k_read32_misc |
806 | and r1, r0, #0x3e |
807 | cmp r1, #0x0e |
808 | blt m_m68k_read32_misc |
809 | cmp r1, #0x30 |
810 | movge r0, #0 |
811 | bxge lr |
812 | @ I have seen the range 0x0e-0x2f accessed quite frequently with long i/o, so here is some code for that |
813 | ldr r0, =(Pico+0x22200) |
814 | mov r2, #0xff |
815 | ldr r0, [r0] |
816 | orr r2, r2, r2, lsl #16 |
817 | add r0, r0, #0x110000 |
818 | m_read32_gen |
819 | and r1, r2, r0 @ data is big-endian read as little, have to byteswap |
820 | and r0, r2, r0, lsr #8 |
821 | orr r0, r0, r1, lsl #8 |
822 | bx lr |
823 | |
824 | m_m68k_read32_misc: |
825 | add r1, r0, #2 |
826 | stmfd sp!,{r1,lr} |
827 | bl m_m68k_read16_system_io |
828 | swp r0, r0, [sp] |
829 | bl m_m68k_read16_system_io |
830 | ldmfd sp!,{r1,lr} |
831 | orr r0, r0, r1, lsl #16 |
832 | bx lr |
833 | |
834 | |
835 | m_m68k_read32_vdp: |
836 | tst r0, #0x70000 |
837 | tsteq r0, #0x000e0 |
838 | bxne lr @ invalid read |
839 | bic r0, r0, #1 |
840 | add r1, r0, #2 |
841 | stmfd sp!,{r1,lr} |
842 | bl PicoVideoRead |
843 | swp r0, r0, [sp] |
844 | bl PicoVideoRead |
845 | ldmfd sp!,{r1,lr} |
846 | orr r0, r0, r1, lsl #16 |
847 | bx lr |
848 | |
849 | |
850 | m_m68k_read32_ram: |
851 | ldr r1, =Pico |
852 | bic r0, r0, #0xff0000 |
853 | bic r0, r0, #1 |
854 | m_read32_gen |
855 | bx lr |
856 | |
857 | .pool |
858 | |
859 | @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ |
860 | |
861 | |
862 | m_write_null: |
863 | m_m68k_write8_bios: |
864 | bx lr |
865 | |
866 | |
867 | m_m68k_write8_prgbank: |
868 | ldr r2, =(Pico+0x22200) |
869 | eor r0, r0, #1 |
870 | ldr r2, [r2] |
871 | mov r12,#0x110000 |
872 | orr r3, r12, #0x002200 |
873 | ldr r3, [r2, r3] |
874 | ldr r12,[r2, r12] |
875 | tst r3, #0x00020000 @ have bus? |
876 | bxeq lr |
877 | and r12,r12,#0xc0000000 @ r3 & 0xC0 |
878 | add r2, r2, r12, lsr #12 |
879 | strb r1, [r2, r0] |
880 | bx lr |
881 | |
882 | |
883 | m_m68k_write8_wordram0_2M: @ 0x200000 - 0x21ffff |
884 | m_m68k_write8_wordram1_2M: @ 0x220000 - 0x23ffff |
885 | ldr r2, =(Pico+0x22200) |
886 | sub r0, r0, #0x160000 @ map to our offset, which is 0x0a0000 |
887 | ldr r2, [r2] |
888 | eor r0, r0, #1 |
889 | strb r1, [r2, r0] |
890 | bx lr |
891 | |
892 | |
893 | m_m68k_write8_wordram0_1M_b0: @ 0x200000 - 0x21ffff |
894 | ldr r2, =(Pico+0x22200) |
895 | sub r0, r0, #0x140000 @ map to our offset, which is 0x0c0000 |
896 | ldr r2, [r2] |
897 | eor r0, r0, #1 |
898 | strb r1, [r2, r0] |
899 | bx lr |
900 | |
901 | |
902 | m_m68k_write8_wordram0_1M_b1: @ 0x200000 - 0x21ffff |
903 | ldr r2, =(Pico+0x22200) |
904 | sub r0, r0, #0x120000 @ map to our offset, which is 0x0e0000 |
905 | ldr r2, [r2] |
906 | eor r0, r0, #1 |
907 | strb r1, [r2, r0] |
908 | bx lr |
909 | |
910 | |
911 | m_m68k_write8_wordram1_1M_b0: @ 0x220000 - 0x23ffff, cell arranged |
912 | mov r3, r1 |
913 | cell_map |
914 | ldr r2, =(Pico+0x22200) |
915 | add r0, r0, #0x0c0000 |
916 | ldr r2, [r2] |
917 | eor r0, r0, #1 |
918 | strb r3, [r2, r0] |
919 | bx lr |
920 | |
921 | |
922 | m_m68k_write8_wordram1_1M_b1: @ 0x220000 - 0x23ffff, cell arranged |
923 | mov r3, r1 |
924 | cell_map |
925 | ldr r2, =(Pico+0x22200) |
926 | add r0, r0, #0x0e0000 |
927 | ldr r2, [r2] |
928 | eor r0, r0, #1 |
929 | strb r3, [r2, r0] |
930 | bx lr |
931 | |
932 | |
933 | m_m68k_write8_system_io: |
934 | bic r2, r0, #0xfe0000 |
935 | bic r2, r2, #0x3f |
936 | cmp r2, #0x012000 |
937 | beq m68k_reg_write8 |
938 | mov r2, #8 |
939 | b OtherWrite8 |
940 | |
941 | |
942 | m_m68k_write8_vdp: |
943 | tst r0, #0x70000 |
944 | tsteq r0, #0x000e0 |
945 | bxne lr @ invalid |
946 | and r1, r1, #0xff |
947 | orr r1, r1, r1, lsl #8 @ byte access gets mirrored |
948 | b PicoVideoWrite |
949 | |
950 | |
951 | m_m68k_write8_ram: |
952 | ldr r2, =Pico |
953 | bic r0, r0, #0xff0000 |
954 | eor r0, r0, #1 |
955 | strb r1, [r2, r0] |
956 | bx lr |
957 | |
958 | |
959 | @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ |
960 | |
961 | |
962 | m_m68k_write16_bios: |
963 | bx lr |
964 | |
965 | |
966 | m_m68k_write16_prgbank: |
967 | ldr r2, =(Pico+0x22200) |
968 | bic r0, r0, #1 |
969 | ldr r2, [r2] |
970 | mov r12,#0x110000 |
971 | orr r3, r12, #0x002200 |
972 | ldr r3, [r2, r3] |
973 | ldr r12,[r2, r12] |
974 | tst r3, #0x00020000 @ have bus? |
975 | bxeq lr |
976 | and r12,r12,#0xc0000000 @ r3 & 0xC0 |
977 | add r2, r2, r12, lsr #12 |
978 | strh r1, [r2, r0] |
979 | bx lr |
980 | |
981 | |
982 | m_m68k_write16_wordram0_2M: @ 0x200000 - 0x21ffff |
983 | m_m68k_write16_wordram1_2M: @ 0x220000 - 0x23ffff |
984 | ldr r2, =(Pico+0x22200) |
985 | sub r0, r0, #0x160000 @ map to our offset, which is 0x0a0000 |
986 | ldr r2, [r2] |
987 | bic r0, r0, #1 |
988 | strh r1, [r2, r0] |
989 | bx lr |
990 | |
991 | |
992 | m_m68k_write16_wordram0_1M_b0: @ 0x200000 - 0x21ffff |
993 | ldr r2, =(Pico+0x22200) |
994 | sub r0, r0, #0x140000 @ map to our offset, which is 0x0c0000 |
995 | ldr r2, [r2] |
996 | bic r0, r0, #1 |
997 | strh r1, [r2, r0] |
998 | bx lr |
999 | |
1000 | |
1001 | m_m68k_write16_wordram0_1M_b1: @ 0x200000 - 0x21ffff |
1002 | ldr r2, =(Pico+0x22200) |
1003 | sub r0, r0, #0x120000 @ map to our offset, which is 0x0e0000 |
1004 | ldr r2, [r2] |
1005 | bic r0, r0, #1 |
1006 | strh r1, [r2, r0] |
1007 | bx lr |
1008 | |
1009 | |
1010 | m_m68k_write16_wordram1_1M_b0: @ 0x220000 - 0x23ffff, cell arranged |
1011 | @ Warning: write32 relies on NOT using r12 and and keeping data in r3 |
1012 | mov r3, r1 |
1013 | cell_map |
1014 | ldr r1, =(Pico+0x22200) |
1015 | add r0, r0, #0x0c0000 |
1016 | ldr r1, [r1] |
1017 | bic r0, r0, #1 |
1018 | strh r3, [r1, r0] |
1019 | bx lr |
1020 | |
1021 | |
1022 | m_m68k_write16_wordram1_1M_b1: @ 0x220000 - 0x23ffff, cell arranged |
1023 | mov r3, r1 |
1024 | cell_map |
1025 | ldr r1, =(Pico+0x22200) |
1026 | add r0, r0, #0x0e0000 |
1027 | ldr r1, [r1] |
1028 | bic r0, r0, #1 |
1029 | strh r3, [r1, r0] |
1030 | bx lr |
1031 | |
1032 | |
1033 | m_m68k_write16_system_io: |
1034 | bic r0, r0, #1 |
1035 | bic r2, r0, #0xfe0000 |
1036 | bic r2, r2, #0x3f |
1037 | cmp r2, #0x012000 |
1038 | bne OtherWrite16 |
1039 | |
1040 | m_m68k_write16_m68k_regs: |
1041 | and r3, r1, #0xff |
1042 | add r2, r0, #1 |
1043 | stmfd sp!,{r2,r3,lr} |
1044 | mov r1, r1, lsr #8 |
1045 | bl m68k_reg_write8 |
1046 | ldmfd sp!,{r0,r1,lr} |
1047 | b m68k_reg_write8 |
1048 | |
1049 | |
1050 | m_m68k_write16_vdp: |
1051 | tst r0, #0x70000 |
1052 | tsteq r0, #0x000e0 |
1053 | bxne lr @ invalid |
1054 | bic r0, r0, #1 |
1055 | b PicoVideoWrite |
1056 | |
1057 | |
1058 | m_m68k_write16_ram: |
1059 | ldr r2, =Pico |
1060 | bic r0, r0, #0xff0000 |
1061 | bic r0, r0, #1 |
1062 | strh r1, [r2, r0] |
1063 | bx lr |
1064 | |
1065 | |
1066 | @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ |
1067 | |
1068 | |
1069 | m_m68k_write32_bios: |
1070 | bx lr |
1071 | |
1072 | |
1073 | m_m68k_write32_prgbank: |
1074 | ldr r2, =(Pico+0x22200) |
1075 | bic r0, r0, #1 |
1076 | ldr r2, [r2] |
1077 | mov r12,#0x110000 |
1078 | orr r3, r12, #0x002200 |
1079 | ldr r3, [r2, r3] |
1080 | ldr r12,[r2, r12] |
1081 | tst r3, #0x00020000 @ have bus? |
1082 | bxeq lr |
1083 | and r12,r12,#0xc0000000 @ r3 & 0xC0 |
1084 | add r2, r2, r12, lsr #12 |
1085 | m_write32_gen |
1086 | bx lr |
1087 | |
1088 | |
1089 | m_m68k_write32_wordram0_2M: @ 0x200000 - 0x21ffff |
1090 | m_m68k_write32_wordram1_2M: @ 0x220000 - 0x23ffff |
1091 | ldr r2, =(Pico+0x22200) |
1092 | sub r0, r0, #0x160000 @ map to our offset, which is 0x0a0000 |
1093 | ldr r2, [r2] |
1094 | bic r0, r0, #1 |
1095 | m_write32_gen |
1096 | bx lr |
1097 | |
1098 | |
1099 | m_m68k_write32_wordram0_1M_b0: @ 0x200000 - 0x21ffff |
1100 | ldr r2, =(Pico+0x22200) |
1101 | sub r0, r0, #0x140000 @ map to our offset, which is 0x0c0000 |
1102 | ldr r2, [r2] |
1103 | bic r0, r0, #1 |
1104 | m_write32_gen |
1105 | bx lr |
1106 | |
1107 | |
1108 | m_m68k_write32_wordram0_1M_b1: @ 0x200000 - 0x21ffff |
1109 | ldr r2, =(Pico+0x22200) |
1110 | sub r0, r0, #0x120000 @ map to our offset, which is 0x0e0000 |
1111 | ldr r2, [r2] |
1112 | bic r0, r0, #1 |
1113 | m_write32_gen |
1114 | bx lr |
1115 | |
1116 | |
1117 | m_m68k_write32_wordram1_1M_b0: @ 0x220000 - 0x23ffff, cell arranged |
1118 | tst r0, #2 |
1119 | bne m_m68k_write32_wordram1_1M_b0_unal |
1120 | mov r3, r1 |
1121 | cell_map |
1122 | ldr r2, =(Pico+0x22200) |
1123 | add r0, r0, #0x0c0000 |
1124 | ldr r2, [r2] |
1125 | bic r0, r0, #1 |
1126 | mov r1, r3 |
1127 | m_write32_gen |
1128 | bx lr |
1129 | m_m68k_write32_wordram1_1M_b0_unal: |
1130 | @ hopefully this doesn't happen too often |
1131 | add r12,r0, #2 |
1132 | mov r1, r1, ror #16 |
1133 | stmfd sp!,{lr} |
1134 | bl m_m68k_write16_wordram1_1M_b0 @ must not trash r12 and keep data in r3 |
1135 | ldmfd sp!,{lr} |
1136 | mov r0, r12 |
1137 | mov r1, r3, lsr #16 |
1138 | b m_m68k_write16_wordram1_1M_b0 |
1139 | |
1140 | |
1141 | m_m68k_write32_wordram1_1M_b1: @ 0x220000 - 0x23ffff, cell arranged |
1142 | tst r0, #2 |
1143 | bne m_m68k_write32_wordram1_1M_b1_unal |
1144 | mov r3, r1 |
1145 | cell_map |
1146 | ldr r2, =(Pico+0x22200) |
1147 | add r0, r0, #0x0e0000 |
1148 | ldr r2, [r2] |
1149 | bic r0, r0, #1 |
1150 | mov r1, r3 |
1151 | m_write32_gen |
1152 | bx lr |
1153 | m_m68k_write32_wordram1_1M_b1_unal: |
1154 | add r12,r0, #2 |
1155 | mov r1, r1, ror #16 |
1156 | stmfd sp!,{lr} |
1157 | bl m_m68k_write16_wordram1_1M_b1 @ same as above |
1158 | ldmfd sp!,{lr} |
1159 | mov r0, r12 |
1160 | mov r1, r3, lsr #16 |
1161 | b m_m68k_write16_wordram1_1M_b1 |
1162 | |
1163 | |
1164 | @ it is not very practical to use long access on hw registers, so I assume it is not used too much. |
1165 | m_m68k_write32_system_io: |
1166 | bic r2, r0, #0xfe0000 |
1167 | bic r2, r2, #0x3f |
1168 | cmp r2, #0x012000 |
1169 | bne m_m68k_write32_misc |
1170 | and r2, r0, #0x3e |
1171 | cmp r2, #0x10 |
1172 | blt m_m68k_write32_regs |
1173 | cmp r2, #0x20 |
1174 | bxge lr |
1175 | @ Handle the 0x10-0x1f range |
1176 | ldr r0, =(Pico+0x22200) |
1177 | mov r3, #0xff |
1178 | ldr r0, [r0] |
1179 | orr r3, r3, r3, lsl #16 |
1180 | add r0, r0, #0x110000 |
1181 | and r12,r3, r1, ror #16 @ data is big-endian to be written as little, have to byteswap |
1182 | and r1, r3, r1, ror #24 |
1183 | orr r1, r1, r12,lsl #8 @ end of byteswap |
1184 | strh r1, [r2, r0]! |
1185 | cmp r2, #0x1e |
1186 | movne r1, r1, lsr #16 |
1187 | strneh r1, [r2, #2] |
1188 | bx lr |
1189 | |
1190 | m_m68k_write32_regs: |
1191 | stmfd sp!,{r0,r1,lr} |
1192 | mov r1, r1, lsr #24 |
1193 | bl m68k_reg_write8 |
1194 | ldr r0, [sp] |
1195 | ldr r1, [sp, #4] |
1196 | add r0, r0, #1 |
1197 | mov r1, r1, lsr #16 |
1198 | bl m68k_reg_write8 |
1199 | ldr r0, [sp] |
1200 | ldr r1, [sp, #4] |
1201 | add r0, r0, #2 |
1202 | mov r1, r1, lsr #8 |
1203 | bl m68k_reg_write8 |
1204 | ldmfd sp!,{r0,r1,lr} |
1205 | add r0, r0, #3 |
1206 | b m68k_reg_write8 |
1207 | |
1208 | m_m68k_write32_misc: |
1209 | stmfd sp!,{r0,r1,lr} |
1210 | mov r1, r1, lsr #16 |
1211 | bl OtherWrite16 |
1212 | ldmfd sp!,{r0,r1,lr} |
1213 | add r0, r0, #2 |
1214 | b OtherWrite16 |
1215 | |
1216 | |
1217 | m_m68k_write32_vdp: |
1218 | tst r0, #0x70000 |
1219 | tsteq r0, #0x000e0 |
1220 | bxne lr @ invalid |
1221 | stmfd sp!,{r0,r1,lr} |
1222 | mov r1, r1, lsr #16 |
1223 | bl PicoVideoWrite |
1224 | ldmfd sp!,{r0,r1,lr} |
1225 | add r0, r0, #2 |
1226 | b PicoVideoWrite |
1227 | |
1228 | |
1229 | m_m68k_write32_ram: |
1230 | ldr r2, =Pico |
1231 | bic r0, r0, #0xff0000 |
1232 | bic r0, r0, #1 |
1233 | m_write32_gen |
1234 | bx lr |
1235 | |
1236 | .pool |
1237 | |
1238 | |
1239 | @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ |
1240 | |
1241 | |
1242 | m_s68k_read8_prg: @ 0x000000 - 0x07ffff |
1243 | ldr r1, =(Pico+0x22200) |
1244 | eor r0, r0, #1 |
1245 | ldr r1, [r1] |
1246 | add r0, r0, #0x020000 @ map to our address |
1247 | ldrb r0, [r1, r0] |
1248 | bx lr |
1249 | |
1250 | |
1251 | m_s68k_read8_wordram_2M: @ 0x080000 - 0x0bffff |
1252 | ldr r1, =(Pico+0x22200) |
1253 | eor r0, r0, #1 |
1254 | ldr r1, [r1] |
1255 | add r0, r0, #0x020000 @ map to our address (0x0a0000) |
1256 | ldrb r0, [r1, r0] |
1257 | bx lr |
1258 | |
1259 | |
1260 | m_s68k_read8_wordram_2M_decode_b0: @ 0x080000 - 0x0bffff |
1261 | m_s68k_read8_wordram_2M_decode_b1: @ 0x080000 - 0x0bffff |
1262 | mov r0, #0 |
1263 | bx lr @ TODO |
1264 | |
1265 | |
1266 | m_s68k_read8_wordram_1M_b0: @ 0x0c0000 - 0x0dffff (same as our offset :) |
1267 | ldr r1, =(Pico+0x22200) |
1268 | ldr r1, [r1] |
1269 | eor r0, r0, #1 |
1270 | ldrb r0, [r1, r0] |
1271 | bx lr |
1272 | |
1273 | |
1274 | m_s68k_read8_wordram_1M_b1: @ 0x0c0000 - 0x0dffff |
1275 | ldr r1, =(Pico+0x22200) |
1276 | add r0, r0, #0x020000 @ map to our offset, which is 0x0e0000 |
1277 | ldr r1, [r1] |
1278 | eor r0, r0, #1 |
1279 | ldrb r0, [r1, r0] |
1280 | bx lr |
1281 | |
1282 | |
1283 | m_s68k_read8_backup: @ 0xfe0000 - 0xfe3fff (repeated?) |
1284 | @ must not trash r3 and r12 |
1285 | ldr r1, =(Pico+0x22200) |
1286 | mov r0, r0, lsr #1 |
1287 | ldr r1, [r1] |
1288 | bic r0, r0, #0xff0000 |
1289 | bic r0, r0, #0x00fe00 |
1290 | add r1, r1, #0x110000 |
1291 | add r1, r1, #0x000200 |
1292 | ldrb r0, [r1, r0] |
1293 | bx lr |
1294 | |
1295 | |
1296 | m_s68k_read8_pcm: |
1297 | @ must not trash r3 and r12 |
1298 | ldr r1, =(Pico+0x22200) |
1299 | bic r0, r0, #0xff0000 |
1300 | @ bic r0, r0, #0x008000 |
1301 | ldr r1, [r1] |
1302 | mov r2, #0x110000 |
1303 | orr r2, r2, #0x002200 |
1304 | cmp r0, #0x2000 |
1305 | bge m_s68k_read8_pcm_ram |
1306 | cmp r0, #0x20 |
1307 | movlt r0, #0 |
1308 | bxlt lr |
1309 | orr r2, r2, #(0x48+8) @ pcm.ch + addr_offset |
1310 | add r1, r1, r2 |
1311 | and r2, r0, #0x1c |
1312 | ldr r1, [r1, r2, lsl #2] |
1313 | tst r0, #2 |
1314 | moveq r0, r1, lsr #PCM_STEP_SHIFT |
1315 | movne r0, r1, lsr #(PCM_STEP_SHIFT+8) |
1316 | and r0, r0, #0xff |
1317 | bx lr |
1318 | |
1319 | m_s68k_read8_pcm_ram: |
1320 | orr r2, r2, #0x40 |
1321 | ldr r2, [r1, r2] |
1322 | add r1, r1, #0x100000 @ pcm_ram |
1323 | and r2, r2, #0x0f000000 @ bank |
1324 | add r1, r1, r2, lsr #12 |
1325 | bic r0, r0, #0x00e000 |
1326 | mov r0, r0, lsr #1 |
1327 | ldrb r0, [r1, r0] |
1328 | bx lr |
1329 | |
1330 | |
1331 | m_s68k_read8_regs: |
1332 | bic r0, r0, #0xff0000 |
1333 | bic r0, r0, #0x008000 |
1334 | tst r0, #0x7e00 |
1335 | movne r0, #0 |
1336 | bxne lr |
1337 | sub r2, r0, #0x58 |
1338 | cmp r2, #0x10 |
1339 | ldrlo r2, =gfx_cd_read |
1340 | ldrhs r2, =s68k_reg_read16 |
1341 | stmfd sp!,{r0,lr} |
1342 | bic r0, r0, #1 |
1343 | mov lr, pc |
1344 | bx r2 |
1345 | ldmfd sp!,{r1,lr} |
1346 | tst r1, #1 |
1347 | moveq r0, r0, lsr #8 |
1348 | and r0, r0, #0xff |
1349 | bx lr |
1350 | |
1351 | |
1352 | @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ |
1353 | |
1354 | |
1355 | m_s68k_read16_prg: @ 0x000000 - 0x07ffff |
1356 | ldr r1, =(Pico+0x22200) |
1357 | bic r0, r0, #1 |
1358 | ldr r1, [r1] |
1359 | add r0, r0, #0x020000 @ map to our address |
1360 | ldrh r0, [r1, r0] |
1361 | bx lr |
1362 | |
1363 | |
1364 | m_s68k_read16_wordram_2M: @ 0x080000 - 0x0bffff |
1365 | ldr r1, =(Pico+0x22200) |
1366 | bic r0, r0, #1 |
1367 | ldr r1, [r1] |
1368 | add r0, r0, #0x020000 @ map to our address (0x0a0000) |
1369 | ldrh r0, [r1, r0] |
1370 | bx lr |
1371 | |
1372 | |
1373 | m_s68k_read16_wordram_2M_decode_b0: @ 0x080000 - 0x0bffff |
1374 | m_s68k_read16_wordram_2M_decode_b1: @ 0x080000 - 0x0bffff |
1375 | mov r0, #0 |
1376 | bx lr @ TODO |
1377 | |
1378 | |
1379 | m_s68k_read16_wordram_1M_b0: @ 0x0c0000 - 0x0dffff (same as our offset :) |
1380 | ldr r1, =(Pico+0x22200) |
1381 | ldr r1, [r1] |
1382 | bic r0, r0, #1 |
1383 | ldrh r0, [r1, r0] |
1384 | bx lr |
1385 | |
1386 | |
1387 | m_s68k_read16_wordram_1M_b1: @ 0x0c0000 - 0x0dffff |
1388 | ldr r1, =(Pico+0x22200) |
1389 | add r0, r0, #0x020000 @ map to our offset, which is 0x0e0000 |
1390 | ldr r1, [r1] |
1391 | bic r0, r0, #1 |
1392 | ldrh r0, [r1, r0] |
1393 | bx lr |
1394 | |
1395 | |
1396 | @ m_s68k_read16_backup: @ 0xfe0000 - 0xfe3fff (repeated?) |
1397 | @ bram is not meant to be accessed by words, does any game do this? |
1398 | .equiv m_s68k_read16_backup, m_s68k_read8_backup |
1399 | |
1400 | |
1401 | @ m_s68k_read16_pcm: |
1402 | @ pcm is on 8-bit bus, would this be same as byte access? |
1403 | .equiv m_s68k_read16_pcm, m_s68k_read8_pcm |
1404 | |
1405 | |
1406 | m_s68k_read16_regs: |
1407 | bic r0, r0, #0xff0000 |
1408 | bic r0, r0, #0x008000 |
1409 | bic r0, r0, #0x000001 |
1410 | tst r0, #0x7e00 |
1411 | movne r0, #0 |
1412 | bxne lr |
1413 | sub r2, r0, #0x58 |
1414 | cmp r2, #0x10 |
1415 | blo gfx_cd_read |
1416 | b s68k_reg_read16 |
1417 | |
1418 | |
1419 | @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ |
1420 | |
1421 | |
1422 | m_s68k_read32_prg: @ 0x000000 - 0x07ffff |
1423 | ldr r1, =(Pico+0x22200) |
1424 | bic r0, r0, #1 |
1425 | ldr r1, [r1] |
1426 | add r0, r0, #0x020000 @ map to our address |
1427 | m_read32_gen |
1428 | bx lr |
1429 | |
1430 | |
1431 | m_s68k_read32_wordram_2M: @ 0x080000 - 0x0bffff |
1432 | ldr r1, =(Pico+0x22200) |
1433 | bic r0, r0, #1 |
1434 | ldr r1, [r1] |
1435 | add r0, r0, #0x020000 @ map to our address (0x0a0000) |
1436 | m_read32_gen |
1437 | bx lr |
1438 | |
1439 | |
1440 | m_s68k_read32_wordram_2M_decode_b0: @ 0x080000 - 0x0bffff |
1441 | m_s68k_read32_wordram_2M_decode_b1: @ 0x080000 - 0x0bffff |
1442 | mov r0, #0 |
1443 | bx lr @ TODO |
1444 | |
1445 | |
1446 | m_s68k_read32_wordram_1M_b0: @ 0x0c0000 - 0x0dffff (same as our offset :) |
1447 | ldr r1, =(Pico+0x22200) |
1448 | ldr r1, [r1] |
1449 | bic r0, r0, #1 |
1450 | m_read32_gen |
1451 | bx lr |
1452 | |
1453 | |
1454 | m_s68k_read32_wordram_1M_b1: @ 0x0c0000 - 0x0dffff |
1455 | ldr r1, =(Pico+0x22200) |
1456 | add r0, r0, #0x020000 @ map to our offset, which is 0x0e0000 |
1457 | ldr r1, [r1] |
1458 | bic r0, r0, #1 |
1459 | m_read32_gen |
1460 | bx lr |
1461 | |
1462 | |
1463 | m_s68k_read32_backup: @ 0xfe0000 - 0xfe3fff (repeated?) |
1464 | @ bram is not meant to be accessed by words, does any game do this? |
1465 | mov r12,lr |
1466 | mov r3, r0 |
1467 | bl m_s68k_read8_backup @ must preserve r3 and r12 |
1468 | mov r1, r0 |
1469 | add r0, r3, #2 |
1470 | mov r3, r1 |
1471 | bl m_s68k_read8_backup |
1472 | orr r0, r0, r3, lsl #16 |
1473 | bx r12 |
1474 | |
1475 | |
1476 | m_s68k_read32_pcm: |
1477 | mov r12,lr |
1478 | mov r3, r0 |
1479 | bl m_s68k_read8_pcm @ must preserve r3 and r12 |
1480 | mov r1, r0 |
1481 | add r0, r3, #2 |
1482 | mov r3, r1 |
1483 | bl m_s68k_read8_pcm |
1484 | orr r0, r0, r3, lsl #16 |
1485 | bx r12 |
1486 | |
1487 | |
1488 | m_s68k_read32_regs: |
1489 | bic r0, r0, #0xff0000 |
1490 | bic r0, r0, #0x008000 |
1491 | bic r0, r0, #0x000001 |
1492 | tst r0, #0x7e00 |
1493 | movne r0, #0 |
1494 | bxne lr |
1495 | sub r2, r0, #0x58 |
1496 | cmp r2, #0x10 |
1497 | add r1, r0, #2 |
1498 | blo m_s68k_read32_regs_gfx |
1499 | stmfd sp!,{r1,lr} |
1500 | bl s68k_reg_read16 |
1501 | swp r0, r0, [sp] |
1502 | bl s68k_reg_read16 |
1503 | ldmfd sp!,{r1,lr} |
1504 | orr r0, r0, r1, lsl #16 |
1505 | bx lr |
1506 | |
1507 | |
1508 | m_s68k_read32_regs_gfx: |
1509 | stmfd sp!,{r1,lr} |
1510 | bl gfx_cd_read |
1511 | swp r0, r0, [sp] |
1512 | bl gfx_cd_read |
1513 | ldmfd sp!,{r1,lr} |
1514 | orr r0, r0, r1, lsl #16 |
1515 | bx lr |
1516 | |
1517 | .pool |
1518 | |
1519 | @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ |
1520 | |
1521 | |
1522 | m_s68k_write8_prg: @ 0x000000 - 0x07ffff |
1523 | ldr r2, =(Pico+0x22200) |
1524 | eor r0, r0, #1 |
1525 | ldr r2, [r2] |
1526 | add r0, r0, #0x020000 @ map to our address |
1527 | strb r1, [r2, r0] |
1528 | bx lr |
1529 | |
1530 | |
1531 | m_s68k_write8_wordram_2M: @ 0x080000 - 0x0bffff |
1532 | ldr r2, =(Pico+0x22200) |
1533 | eor r0, r0, #1 |
1534 | ldr r2, [r2] |
1535 | add r0, r0, #0x020000 @ map to our address (0x0a0000) |
1536 | strb r1, [r2, r0] |
1537 | bx lr |
1538 | |
1539 | |
1540 | m_s68k_write8_wordram_2M_decode_b0: @ 0x080000 - 0x0bffff |
1541 | m_s68k_write8_wordram_2M_decode_b1: @ 0x080000 - 0x0bffff |
1542 | bx lr @ TODO |
1543 | |
1544 | |
1545 | m_s68k_write8_wordram_1M_b0: @ 0x0c0000 - 0x0dffff (same as our offset :) |
1546 | ldr r2, =(Pico+0x22200) |
1547 | ldr r2, [r2] |
1548 | eor r0, r0, #1 |
1549 | strb r1, [r2, r0] |
1550 | bx lr |
1551 | |
1552 | |
1553 | m_s68k_write8_wordram_1M_b1: @ 0x0c0000 - 0x0dffff |
1554 | ldr r2, =(Pico+0x22200) |
1555 | add r0, r0, #0x020000 @ map to our offset, which is 0x0e0000 |
1556 | ldr r2, [r2] |
1557 | eor r0, r0, #1 |
1558 | strb r1, [r2, r0] |
1559 | bx lr |
1560 | |
1561 | |
1562 | m_s68k_write8_backup: @ 0xfe0000 - 0xfe3fff (repeated?) |
1563 | @ must not trash r3 and r12 |
1564 | ldr r2, =(Pico+0x22200) |
1565 | mov r0, r0, lsr #1 |
1566 | ldr r2, [r2] |
1567 | bic r0, r0, #0xff0000 |
1568 | bic r0, r0, #0x00fe00 |
1569 | add r2, r2, #0x110000 |
1570 | add r2, r2, #0x000200 |
1571 | strb r1, [r2, r0] |
1572 | ldr r1, =SRam |
1573 | mov r0, #1 |
1574 | str r0, [r1, #0x0e] @ SRam.changed = 1 |
1575 | bx lr |
1576 | |
1577 | |
1578 | m_s68k_write8_pcm: |
1579 | bic r0, r0, #0xff0000 |
1580 | cmp r0, #0x12 |
1581 | movlt r0, r0, lsr #1 |
1582 | blt pcm_write |
1583 | |
1584 | cmp r0, #0x2000 |
1585 | bxlt lr |
1586 | |
1587 | m_s68k_write8_pcm_ram: |
1588 | ldr r3, =(Pico+0x22200) |
1589 | bic r0, r0, #0x00e000 |
1590 | ldr r3, [r3] |
1591 | mov r0, r0, lsr #1 |
1592 | add r2, r3, #0x110000 |
1593 | add r2, r2, #0x002200 |
1594 | add r2, r2, #0x000040 |
1595 | ldr r2, [r2] |
1596 | add r3, r3, #0x100000 @ pcm_ram |
1597 | and r2, r2, #0x0f000000 @ bank |
1598 | add r3, r3, r2, lsr #12 |
1599 | strb r1, [r3, r0] |
1600 | bx lr |
1601 | |
1602 | |
1603 | m_s68k_write8_regs: |
1604 | bic r0, r0, #0xff0000 |
1605 | bic r0, r0, #0x008000 |
1606 | tst r0, #0x7e00 |
1607 | movne r0, #0 |
1608 | bxne lr |
1609 | sub r2, r0, #0x58 |
1610 | cmp r2, #0x10 |
1611 | blo gfx_cd_write |
1612 | b s68k_reg_write8 |
1613 | |
1614 | |
1615 | @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ |
1616 | |
1617 | |
1618 | m_s68k_write16_prg: @ 0x000000 - 0x07ffff |
1619 | ldr r2, =(Pico+0x22200) |
1620 | bic r0, r0, #1 |
1621 | ldr r2, [r2] |
1622 | add r0, r0, #0x020000 @ map to our address |
1623 | strh r1, [r2, r0] |
1624 | bx lr |
1625 | |
1626 | |
1627 | m_s68k_write16_wordram_2M: @ 0x080000 - 0x0bffff |
1628 | ldr r2, =(Pico+0x22200) |
1629 | bic r0, r0, #1 |
1630 | ldr r2, [r2] |
1631 | add r0, r0, #0x020000 @ map to our address (0x0a0000) |
1632 | strh r1, [r2, r0] |
1633 | bx lr |
1634 | |
1635 | |
1636 | m_s68k_write16_wordram_2M_decode_b0: @ 0x080000 - 0x0bffff |
1637 | m_s68k_write16_wordram_2M_decode_b1: @ 0x080000 - 0x0bffff |
1638 | bx lr @ TODO |
1639 | |
1640 | |
1641 | m_s68k_write16_wordram_1M_b0: @ 0x0c0000 - 0x0dffff (same as our offset :) |
1642 | ldr r2, =(Pico+0x22200) |
1643 | ldr r2, [r2] |
1644 | bic r0, r0, #1 |
1645 | strh r1, [r2, r0] |
1646 | bx lr |
1647 | |
1648 | |
1649 | m_s68k_write16_wordram_1M_b1: @ 0x0c0000 - 0x0dffff |
1650 | ldr r2, =(Pico+0x22200) |
1651 | add r0, r0, #0x020000 @ map to our offset, which is 0x0e0000 |
1652 | ldr r2, [r2] |
1653 | bic r0, r0, #1 |
1654 | strh r1, [r2, r0] |
1655 | bx lr |
1656 | |
1657 | |
1658 | @ m_s68k_write16_backup: |
1659 | .equiv m_s68k_write16_backup, m_s68k_write8_backup |
1660 | |
1661 | |
1662 | @ m_s68k_write16_pcm: |
1663 | .equiv m_s68k_write16_pcm, m_s68k_write8_pcm |
1664 | |
1665 | |
1666 | m_s68k_write16_regs: |
1667 | bic r0, r0, #0xff0000 |
1668 | bic r0, r0, #0x008000 |
1669 | tst r0, #0x7e00 |
1670 | movne r0, #0 |
1671 | bxne lr |
1672 | sub r2, r0, #0x58 |
1673 | cmp r2, #0x10 |
1674 | and r3, r1, #0xff |
1675 | add r2, r0, #1 |
1676 | blo m_s68k_write16_regs_gfx |
1677 | stmfd sp!,{r2,r3,lr} |
1678 | mov r1, r1, lsr #8 |
1679 | bl s68k_reg_write8 |
1680 | ldmfd sp!,{r0,r1,lr} |
1681 | b s68k_reg_write8 |
1682 | |
1683 | m_s68k_write16_regs_gfx: |
1684 | stmfd sp!,{r2,r3,lr} |
1685 | mov r1, r1, lsr #8 |
1686 | bl gfx_cd_write |
1687 | ldmfd sp!,{r0,r1,lr} |
1688 | b gfx_cd_write |
1689 | |
1690 | |
1691 | @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ |
1692 | |
1693 | |
1694 | m_s68k_write32_prg: @ 0x000000 - 0x07ffff |
1695 | ldr r2, =(Pico+0x22200) |
1696 | bic r0, r0, #1 |
1697 | ldr r2, [r2] |
1698 | add r0, r0, #0x020000 @ map to our address |
1699 | m_write32_gen |
1700 | bx lr |
1701 | |
1702 | |
1703 | m_s68k_write32_wordram_2M: @ 0x080000 - 0x0bffff |
1704 | ldr r2, =(Pico+0x22200) |
1705 | bic r0, r0, #1 |
1706 | ldr r2, [r2] |
1707 | add r0, r0, #0x020000 @ map to our address (0x0a0000) |
1708 | m_write32_gen |
1709 | bx lr |
1710 | |
1711 | |
1712 | m_s68k_write32_wordram_2M_decode_b0: @ 0x080000 - 0x0bffff |
1713 | m_s68k_write32_wordram_2M_decode_b1: @ 0x080000 - 0x0bffff |
1714 | bx lr @ TODO |
1715 | |
1716 | |
1717 | m_s68k_write32_wordram_1M_b0: @ 0x0c0000 - 0x0dffff (same as our offset :) |
1718 | ldr r2, =(Pico+0x22200) |
1719 | ldr r2, [r2] |
1720 | bic r0, r0, #1 |
1721 | m_write32_gen |
1722 | bx lr |
1723 | |
1724 | |
1725 | m_s68k_write32_wordram_1M_b1: @ 0x0c0000 - 0x0dffff |
1726 | ldr r2, =(Pico+0x22200) |
1727 | add r0, r0, #0x020000 @ map to our offset, which is 0x0e0000 |
1728 | ldr r2, [r2] |
1729 | bic r0, r0, #1 |
1730 | m_write32_gen |
1731 | bx lr |
1732 | |
1733 | |
1734 | m_s68k_write32_backup: |
1735 | add r12,r0, #2 |
1736 | mov r3, r1 |
1737 | mov r1, r1, lsr #16 |
1738 | stmfd sp!,{lr} |
1739 | bl m_s68k_write8_backup @ must preserve r3 and r12 |
1740 | ldmfd sp!,{lr} |
1741 | mov r0, r12 |
1742 | mov r1, r3 |
1743 | b m_s68k_write8_backup |
1744 | |
1745 | |
1746 | m_s68k_write32_pcm: |
1747 | bic r0, r0, #0xff0000 |
1748 | cmp r0, #0x12 |
1749 | blt m_s68k_write32_pcm_reg |
1750 | |
1751 | cmp r0, #0x2000 |
1752 | bxlt lr |
1753 | |
1754 | m_s68k_write32_pcm_ram: |
1755 | ldr r3, =(Pico+0x22200) |
1756 | bic r0, r0, #0x00e000 |
1757 | ldr r3, [r3] |
1758 | mov r0, r0, lsr #1 |
1759 | add r2, r3, #0x110000 |
1760 | add r2, r2, #0x002200 |
1761 | add r2, r2, #0x000040 |
1762 | ldr r2, [r2] |
1763 | add r3, r3, #0x100000 @ pcm_ram |
1764 | and r2, r2, #0x0f000000 @ bank |
1765 | add r3, r3, r2, lsr #12 |
1766 | mov r1, r1, ror #16 |
1767 | strb r1, [r3, r0]! |
1768 | mov r1, r1, ror #16 |
1769 | strb r1, [r3] |
1770 | bx lr |
1771 | |
1772 | m_s68k_write32_pcm_reg: |
1773 | mov r0, r0, lsr #1 |
1774 | add r2, r0, #1 |
1775 | mov r3, r1 |
1776 | stmfd sp!,{r2,r3,lr} |
1777 | mov r1, r1, lsr #16 |
1778 | bl pcm_write |
1779 | ldmfd sp!,{r0,r1,lr} |
1780 | b pcm_write |
1781 | |
1782 | |
1783 | m_s68k_write32_regs: |
1784 | bic r0, r0, #0xff0000 |
1785 | bic r0, r0, #0x008000 |
1786 | tst r0, #0x7e00 |
1787 | movne r0, #0 |
1788 | bxne lr |
1789 | sub r2, r0, #0x58 |
1790 | cmp r2, #0x10 |
1791 | blo m_s68k_write32_regs_gfx |
1792 | |
1793 | stmfd sp!,{r0,r1,lr} |
1794 | mov r1, r1, lsr #24 |
1795 | bl s68k_reg_write8 |
1796 | ldr r0, [sp] |
1797 | ldr r1, [sp, #4] |
1798 | add r0, r0, #1 |
1799 | mov r1, r1, lsr #16 |
1800 | bl s68k_reg_write8 |
1801 | ldr r0, [sp] |
1802 | ldr r1, [sp, #4] |
1803 | add r0, r0, #2 |
1804 | mov r1, r1, lsr #8 |
1805 | bl s68k_reg_write8 |
1806 | ldmfd sp!,{r0,r1,lr} |
1807 | add r0, r0, #3 |
1808 | b s68k_reg_write8 |
1809 | |
1810 | m_s68k_write32_regs_gfx: |
1811 | stmfd sp!,{r0,r1,lr} |
1812 | mov r1, r1, lsr #24 |
1813 | bl gfx_cd_write |
1814 | ldr r0, [sp] |
1815 | ldr r1, [sp, #4] |
1816 | add r0, r0, #1 |
1817 | mov r1, r1, lsr #16 |
1818 | bl gfx_cd_write |
1819 | ldr r0, [sp] |
1820 | ldr r1, [sp, #4] |
1821 | add r0, r0, #2 |
1822 | mov r1, r1, lsr #8 |
1823 | bl gfx_cd_write |
1824 | ldmfd sp!,{r0,r1,lr} |
1825 | add r0, r0, #3 |
1826 | b gfx_cd_write |
1827 | |