X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=Pico%2Fcd%2FMemory.s;h=33286678e448666b7c67c287c3a0fe97418fefbf;hb=2433f409129279095926eb00cf8ab429738f80dd;hp=80f628a389cc4d399ea79928f8bf6c11fd0eab1f;hpb=48e8482fc2d74c9b96e581241390bade986acb22;p=picodrive.git diff --git a/Pico/cd/Memory.s b/Pico/cd/Memory.s index 80f628a..3328667 100644 --- a/Pico/cd/Memory.s +++ b/Pico/cd/Memory.s @@ -7,6 +7,7 @@ .equiv PCM_STEP_SHIFT, 11 +.equiv POLL_LIMIT, 16 @ jump tables .data @@ -132,6 +133,10 @@ m_s68k_decode_write_table: .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 @@ -198,7 +203,9 @@ PicoMemResetCD: @ r3 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 @@ -336,7 +343,7 @@ PicoWriteS68k32: @ u32 a, u32 d .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]! @@ -347,7 +354,7 @@ PicoWriteS68k32: @ u32 a, u32 d .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 @@ -468,7 +475,7 @@ m_m68k_read8_system_io: .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 @@ -484,7 +491,13 @@ m_m68k_read8_r02: 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 @@ -663,7 +676,7 @@ m_m68k_read16_m68k_regs: .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 @@ -672,9 +685,15 @@ m_m68k_read16_r00: 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 @@ -842,11 +861,12 @@ m_m68k_read32_system_io: 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 @@ -975,6 +995,10 @@ m_m68k_write8_vdp: 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 @@ -1070,6 +1094,9 @@ m_m68k_write16_system_io: 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} @@ -1078,13 +1105,35 @@ m_m68k_write16_m68k_regs: 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: @@ -1252,6 +1301,10 @@ m_m68k_write32_vdp: 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 @@ -1371,6 +1424,9 @@ m_s68k_read8_regs: 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 @@ -1385,6 +1441,13 @@ m_s68k_read8_regs: 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 + @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@ -1451,7 +1514,10 @@ m_s68k_read16_regs: 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 @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@ -1661,7 +1727,7 @@ m_s68k_write8_backup: @ 0xfe0000 - 0xfe3fff (repeated?) 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