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