bugfixes, new scaling, double ym upd at 940
[picodrive.git] / Pico / cd / Memory.s
index 6bdf3e5..3328667 100644 (file)
@@ -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,8 +203,8 @@ PicoMemResetCD: @ r3
     bx      lr
 
 
-PicoMemResetCDdecode: @r3
-    tst     r3, #4
+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
@@ -486,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
@@ -665,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
@@ -674,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
@@ -978,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
@@ -1073,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}
@@ -1081,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:
@@ -1255,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
@@ -1374,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
@@ -1388,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
+
 
 @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 
@@ -1454,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
 
 
 @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@ -1664,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