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