.equiv PCM_STEP_SHIFT, 11
+.equiv POLL_LIMIT, 16
@ jump tables
.data
.extern SRam
.extern gfx_cd_write16
.extern s68k_reg_write8
+.extern s68k_poll_adclk
+.extern PicoCpuS68k
+.extern s68k_poll_detect
+.extern SN76496Write
@ r0=reg3, r1-r3=temp
bx lr
-PicoMemResetCDdecode: @r3
+PicoMemResetCDdecode: @reg3
+ tst r0, #4
+ bxeq lr @ we should not be called in 2M mode
ldr r1, =m_s68k_write8_table
ldr r3, =m_s68k_decode_write_table
and r2, r0, #0x18
.endm
-@ r0=prt1, r1=ptr2
+@ r0=prt1, r1=ptr2; unaligned ptr MUST be r0
.macro m_read32_gen
tst r0, #2
ldrneh r0, [r1, r0]!
.endm
-@ r0=prt1, r1=data, r2=ptr2
+@ r0=prt1, r1=data, r2=ptr2; unaligned ptr MUST be r0
.macro m_write32_gen
tst r0, #2
mov r1, r1, ror #16
.long m_m68k_read8_r0d
m_m68k_read8_r00:
add r1, r1, #0x110000
- ldr r0, [r1, #30]
+ ldr r0, [r1, #0x30]
and r0, r0, #0x04000000 @ we need irq2 mask state
mov r0, r0, lsr #19
bx lr
m_m68k_read8_r03:
add r1, r1, #0x110000
ldrb r0, [r1, #3]
+ add r1, r1, #0x002200
+ ldr r1, [r1, #4]
and r0, r0, #0xc7
+ tst r1, #2 @ DMNA pending?
+ bxeq lr
+ bic r0, r0, #1
+ orr r0, r0, #2
bx lr
m_m68k_read8_r04:
add r1, r1, #0x110000
.long m_m68k_read16_r0c
m_m68k_read16_r00:
add r1, r1, #0x110000
- ldr r0, [r1, #30]
+ ldr r0, [r1, #0x30]
add r1, r1, #0x002200
ldrb r1, [r1, #2] @ Pico_mcd->m.busreq
and r0, r0, #0x04000000 @ we need irq2 mask state
m_m68k_read16_r02:
add r1, r1, #0x110000
ldrb r0, [r1, #2]
- ldrb r1, [r1, #3]
- and r1, r1, #0xc7
- orr r0, r1, r0, lsl #8
+ ldrb r2, [r1, #3]
+ add r1, r1, #0x002200
+ ldr r1, [r1, #4]
+ and r2, r2, #0xc7
+ orr r0, r2, r0, lsl #8
+ tst r1, #2 @ DMNA pending?
+ bxeq lr
+ bic r0, r0, #1
+ orr r0, r0, #2
bx lr
m_m68k_read16_r04:
add r1, r1, #0x110000
movge r0, #0
bxge lr
@ I have seen the range 0x0e-0x2f accessed quite frequently with long i/o, so here is some code for that
- ldr r0, =(Pico+0x22200)
+ mov r0, r1
+ ldr r1, =(Pico+0x22200)
mov r2, #0xff
- ldr r0, [r0]
+ ldr r1, [r1]
orr r2, r2, r2, lsl #16
- add r0, r0, #0x110000
+ add r1, r1, #0x110000
m_read32_gen
and r1, r2, r0 @ data is big-endian read as little, have to byteswap
and r0, r2, r0, lsr #8
tst r0, #0x70000
tsteq r0, #0x000e0
bxne lr @ invalid
+ and r2, r0, #0x19
+ cmp r2, #0x11
+ andeq r0, r1, #0xff
+ beq SN76496Write
and r1, r1, #0xff
orr r1, r1, r1, lsl #8 @ byte access gets mirrored
b PicoVideoWrite
bne OtherWrite16
m_m68k_write16_m68k_regs:
+ and r0, r0, #0x3e
+ cmp r0, #0x0e
+ beq m_m68k_write16_regs_spec
and r3, r1, #0xff
add r2, r0, #1
stmfd sp!,{r2,r3,lr}
ldmfd sp!,{r0,r1,lr}
b m68k_reg_write8
+m_m68k_write16_regs_spec: @ special case
+ ldr r2, =(Pico+0x22200)
+ ldr r3, =s68k_poll_adclk
+ mov r0, #0x110000
+ ldr r2, [r2]
+ add r0, r0, #0x00000e
+ mov r1, r1, lsr #8
+ strb r1, [r2, r0] @ if (a == 0xe) s68k_regs[0x0e] = d >> 8;
+ ldr r2, [r3]
+ mov r1, #0
+ and r2, r2, #0xfe
+ cmp r2, #0x0e
+ bxne lr
+ ldr r0, =PicoCpuS68k
+ str r1, [r0, #0x58] @ push s68k out of stopped state
+ str r1, [r3]
+ bx lr
+
m_m68k_write16_vdp:
tst r0, #0x70000
tsteq r0, #0x000e0
bxne lr @ invalid
bic r0, r0, #1
- b PicoVideoWrite
+ and r2, r0, #0x18
+ cmp r2, #0x10
+ bne PicoVideoWrite
+ and r0, r1, #0xff
+ b SN76496Write @ lsb goes to 0x11
m_m68k_write16_ram:
tst r0, #0x70000
tsteq r0, #0x000e0
bxne lr @ invalid
+ and r2, r0, #0x18
+ cmp r2, #0x10
+ moveq r0, r1, lsr #16
+ beq SN76496Write @ which game is crazy enough to do that?
stmfd sp!,{r0,r1,lr}
mov r1, r1, lsr #16
bl PicoVideoWrite
tst r0, #0x7e00
movne r0, #0
bxne lr
+ sub r2, r0, #0x0e
+ cmp r2, #(0x30-0x0e)
+ blo m_s68k_read8_comm
sub r2, r0, #0x58
cmp r2, #0x10
ldrlo r2, =gfx_cd_read
and r0, r0, #0xff
bx lr
+m_s68k_read8_comm:
+ ldr r1, =(Pico+0x22200)
+ ldr r1, [r1]
+ add r1, r1, #0x110000
+ ldrb r1, [r1, r0]
+ b s68k_poll_detect
+
@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
sub r2, r0, #0x58
cmp r2, #0x10
blo gfx_cd_read
- b s68k_reg_read16
+ cmp r0, #8
+ bne s68k_reg_read16
+ mov r0, #1
+ b Read_CDC_Host
@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
strb r1, [r2, r0]
ldr r1, =SRam
mov r0, #1
- str r0, [r1, #0x0e] @ SRam.changed = 1
+ strb r0, [r1, #0x0e] @ SRam.changed = 1
bx lr