bugfixes, cd/Memory.s
[picodrive.git] / Pico / cd / Memory.s
CommitLineData
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
73m_m68k_read8_table: mk_m68k_jump_table read 8
74m_m68k_read16_table: mk_m68k_jump_table read 16
75m_m68k_read32_table: mk_m68k_jump_table read 32
76m_m68k_write8_table: mk_m68k_jump_table write 8
77m_m68k_write16_table: mk_m68k_jump_table write 16
78m_m68k_write32_table: mk_m68k_jump_table write 32
79
80
81m_s68k_read8_table:
82 mk_s68k_jump_table1 read 8
83 mk_s68k_jump_table2 read 8
84m_s68k_read16_table:
85 mk_s68k_jump_table1 read 16
86 mk_s68k_jump_table2 read 16
87m_s68k_read32_table:
88 mk_s68k_jump_table1 read 32
89 mk_s68k_jump_table2 read 32
90m_s68k_write8_table:
91 mk_s68k_jump_table1 write 8
92 mk_s68k_jump_table2 write 8
93m_s68k_write16_table:
94 mk_s68k_jump_table1 write 16
95 mk_s68k_jump_table2 write 16
96m_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
1550: @ 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
1711: @ 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
1829: @ pmr_8_done:
183.endm
184
185
186PicoMemResetCD: @ 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
207PicoReadM68k8: @ u32 a
208 mk_entry_m68k m_m68k_read8_table
209
210PicoReadM68k16: @ u32 a
211 mk_entry_m68k m_m68k_read16_table
212
213PicoReadM68k32: @ u32 a
214 mk_entry_m68k m_m68k_read32_table
215
216PicoWriteM68k8: @ u32 a, u8 d
217 mk_entry_m68k m_m68k_write8_table
218
219PicoWriteM68k16: @ u32 a, u16 d
220 mk_entry_m68k m_m68k_write16_table
221
222PicoWriteM68k32: @ 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
240PicoReadS68k8: @ u32 a
241 mk_entry_s68k m_s68k_read8_table
242
243PicoReadS68k16: @ u32 a
244 mk_entry_s68k m_s68k_read16_table
245
246PicoReadS68k32: @ u32 a
247 mk_entry_s68k m_s68k_read32_table
248
249PicoWriteS68k8: @ u32 a, u8 d
250 mk_entry_s68k m_s68k_write8_table
251
252PicoWriteS68k16: @ u32 a, u16 d
253 mk_entry_s68k m_s68k_write16_table
254
255PicoWriteS68k32: @ 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
2781: @ 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
2842: @ 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
2903: @ 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
2970: @ x32 cells
298 and r1, r0, #0xfc00 @ col
299 and r2, r0, #0x03fc @ row
300 orr r1, r2, r1, ror #14
3019:
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
332m_read_null:
333 mov r0, #0
334 bx lr
335
336
337m_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
346m_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
363m_m68k_read8_wordram0_2M: @ 0x200000 - 0x21ffff
364m_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
373m_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
382m_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
391m_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
401m_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
411m_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
437m_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
443m_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
448m_m68k_read8_r02:
449 add r1, r1, #0x110000
450 ldrb r0, [r1, #2]
451 bx lr
452m_m68k_read8_r03:
453 add r1, r1, #0x110000
454 ldrb r0, [r1, #3]
455 and r0, r0, #0xc7
456 bx lr
457m_m68k_read8_r04:
458 add r1, r1, #0x110000
459 ldrb r0, [r1, #4]
460 bx lr
461m_m68k_read8_r06:
462 ldrb r0, [r1, #0x73] @ IRQ vector
463 bx lr
464m_m68k_read8_r07:
465 ldrb r0, [r1, #0x72]
466 bx lr
467m_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
472m_m68k_read8_r09:
473 mov r0, #0
474 b Read_CDC_Host
475m_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
481m_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
487m_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
496m_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
513m_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
526m_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
537m_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
546m_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
563m_m68k_read16_wordram0_2M: @ 0x200000 - 0x21ffff
564m_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
573m_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
582m_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
591m_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
602m_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
612m_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
618m_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
632m_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
640m_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
647m_m68k_read16_r04:
648 add r1, r1, #0x110000
649 ldrb r0, [r1, #4]
650 mov r0, r0, lsl #8
651 bx lr
652m_m68k_read16_r06:
653 ldrh r0, [r1, #0x72] @ IRQ vector
654 bx lr
655m_m68k_read16_r08:
656 mov r0, #0
657 b Read_CDC_Host
658m_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
664m_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
676m_m68k_read16_misc:
677 bic r0, r0, #1
678 mov r1, #16
679 b OtherRead16
680
681
682m_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
690m_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
701m_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
710m_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
727m_m68k_read32_wordram0_2M: @ 0x200000 - 0x21ffff
728m_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
737m_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
746m_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
755m_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
765m_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
778m_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
788m_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.
801m_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
824m_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
835m_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
850m_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
862m_write_null:
863m_m68k_write8_bios:
864 bx lr
865
866
867m_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
883m_m68k_write8_wordram0_2M: @ 0x200000 - 0x21ffff
884m_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
893m_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
902m_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
911m_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
922m_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
933m_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
942m_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
951m_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
962m_m68k_write16_bios:
963 bx lr
964
965
966m_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
982m_m68k_write16_wordram0_2M: @ 0x200000 - 0x21ffff
983m_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
992m_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
1001m_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
1010m_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
1022m_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
1033m_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
1040m_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
1050m_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
1058m_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
1069m_m68k_write32_bios:
1070 bx lr
1071
1072
1073m_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
1089m_m68k_write32_wordram0_2M: @ 0x200000 - 0x21ffff
1090m_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
1099m_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
1108m_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
1117m_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
1129m_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
1141m_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
1153m_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.
1165m_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
1190m_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
1208m_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
1217m_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
1229m_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
1242m_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
1251m_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
1260m_s68k_read8_wordram_2M_decode_b0: @ 0x080000 - 0x0bffff
1261m_s68k_read8_wordram_2M_decode_b1: @ 0x080000 - 0x0bffff
1262 mov r0, #0
1263 bx lr @ TODO
1264
1265
1266m_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
1274m_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
1283m_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
1296m_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
1319m_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
1331m_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
1355m_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
1364m_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
1373m_s68k_read16_wordram_2M_decode_b0: @ 0x080000 - 0x0bffff
1374m_s68k_read16_wordram_2M_decode_b1: @ 0x080000 - 0x0bffff
1375 mov r0, #0
1376 bx lr @ TODO
1377
1378
1379m_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
1387m_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
1406m_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
1422m_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
1431m_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
1440m_s68k_read32_wordram_2M_decode_b0: @ 0x080000 - 0x0bffff
1441m_s68k_read32_wordram_2M_decode_b1: @ 0x080000 - 0x0bffff
1442 mov r0, #0
1443 bx lr @ TODO
1444
1445
1446m_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
1454m_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
1463m_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
1476m_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
1488m_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
1508m_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
1522m_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
1531m_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
1540m_s68k_write8_wordram_2M_decode_b0: @ 0x080000 - 0x0bffff
1541m_s68k_write8_wordram_2M_decode_b1: @ 0x080000 - 0x0bffff
1542 bx lr @ TODO
1543
1544
1545m_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
1553m_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
1562m_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
1578m_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
1587m_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
1603m_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
1618m_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
1627m_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
1636m_s68k_write16_wordram_2M_decode_b0: @ 0x080000 - 0x0bffff
1637m_s68k_write16_wordram_2M_decode_b1: @ 0x080000 - 0x0bffff
1638 bx lr @ TODO
1639
1640
1641m_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
1649m_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
1666m_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
1683m_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
1694m_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
1703m_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
1712m_s68k_write32_wordram_2M_decode_b0: @ 0x080000 - 0x0bffff
1713m_s68k_write32_wordram_2M_decode_b1: @ 0x080000 - 0x0bffff
1714 bx lr @ TODO
1715
1716
1717m_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
1725m_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
1734m_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
1746m_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
1754m_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
1772m_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
1783m_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
1810m_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