bugfixes, CD swap, autorepeat
[picodrive.git] / Pico / cd / Memory.s
index 8c360f8..386e26c 100644 (file)
@@ -135,6 +135,8 @@ m_s68k_decode_write_table:
 .extern s68k_reg_write8
 .extern s68k_poll_adclk
 .extern PicoCpuS68k
+.extern s68k_poll_detect
+.extern SN76496Write
 
 
 @ r0=reg3, r1-r3=temp
@@ -201,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
@@ -388,7 +390,8 @@ m_m68k_read8_prgbank:
     orr     r3, r2, #0x002200
     ldr     r3, [r1, r3]
     ldr     r2, [r1, r2]
-    tst     r3, #0x00020000             @ have bus?
+    and     r3, r3, #0x00030000
+    cmp     r3,     #0x00010000         @ have bus or in reset state?
     moveq   r0, #0
     bxeq    lr
     and     r2, r2, #0xc0000000                @ r3 & 0xC0
@@ -489,7 +492,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
@@ -588,7 +597,8 @@ m_m68k_read16_prgbank:
     orr     r3, r2, #0x002200
     ldr     r3, [r1, r3]
     ldr     r2, [r1, r2]
-    tst     r3, #0x00020000             @ have bus?
+    and     r3, r3, #0x00030000
+    cmp     r3,     #0x00010000         @ have bus or in reset state?
     moveq   r0, #0
     bxeq    lr
     and     r2, r2, #0xc0000000                @ r3 & 0xC0
@@ -677,9 +687,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
@@ -752,7 +768,8 @@ m_m68k_read32_prgbank:
     orr     r3, r2, #0x002200
     ldr     r3, [r1, r3]
     ldr     r2, [r1, r2]
-    tst     r3, #0x00020000             @ have bus?
+    and     r3, r3, #0x00030000
+    cmp     r3,     #0x00010000         @ have bus or in reset state?
     moveq   r0, #0
     bxeq    lr
     and     r2, r2, #0xc0000000                @ r3 & 0xC0
@@ -910,7 +927,8 @@ m_m68k_write8_prgbank:
     orr     r3, r12, #0x002200
     ldr     r3, [r2, r3]
     ldr     r12,[r2, r12]
-    tst     r3, #0x00020000             @ have bus?
+    and     r3, r3, #0x00030000
+    cmp     r3,     #0x00010000         @ have bus or in reset state?
     bxeq    lr
     and     r12,r12,#0xc0000000                @ r3 & 0xC0
     add     r2, r2, r12, lsr #12
@@ -981,6 +999,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
@@ -1009,7 +1031,8 @@ m_m68k_write16_prgbank:
     orr     r3, r12, #0x002200
     ldr     r3, [r2, r3]
     ldr     r12,[r2, r12]
-    tst     r3, #0x00020000             @ have bus?
+    and     r3, r3, #0x00030000
+    cmp     r3,     #0x00010000         @ have bus or in reset state?
     bxeq    lr
     and     r12,r12,#0xc0000000                @ r3 & 0xC0
     add     r2, r2, r12, lsr #12
@@ -1111,7 +1134,11 @@ m_m68k_write16_vdp:
     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:
@@ -1137,7 +1164,8 @@ m_m68k_write32_prgbank:
     orr     r3, r12, #0x002200
     ldr     r3, [r2, r3]
     ldr     r12,[r2, r12]
-    tst     r3, #0x00020000             @ have bus?
+    and     r3, r3, #0x00030000
+    cmp     r3,     #0x00010000         @ have bus or in reset state?
     bxeq    lr
     and     r12,r12,#0xc0000000                @ r3 & 0xC0
     add     r2, r2, r12, lsr #12
@@ -1279,6 +1307,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
@@ -1398,6 +1430,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
@@ -1412,6 +1447,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
+
 
 @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 
@@ -1651,6 +1693,18 @@ m_s68k_read32_regs_gfx:
 
 
 m_s68k_write8_prg:                      @ 0x000000 - 0x07ffff
+    ldr     r2, =(Pico+0x22200)
+    eor     r0, r0, #1
+    ldr     r2, [r2]
+    add     r3, r0, #0x020000           @ map to our address
+    add     r12,r2, #0x110000
+    ldr     r12,[r12]
+    and     r12,r12,#0x00ff0000         @ wp
+    cmp     r0, r12, lsr #8
+    strgeb  r1, [r2, r3]
+    bx      lr
+
+
 m_s68k_write8_wordram_2M:               @ 0x080000 - 0x0bffff
 m_s68k_write8_wordram_1M_b1:            @ 0x0c0000 - 0x0dffff, maps to 0x0e0000
     m_s68k_write8_ram 0x020000
@@ -1801,6 +1855,18 @@ m_s68k_write8_regs:
 
 
 m_s68k_write16_prg:                     @ 0x000000 - 0x07ffff
+    ldr     r2, =(Pico+0x22200)
+    bic     r0, r0, #1
+    ldr     r2, [r2]
+    add     r3, r0, #0x020000           @ map to our address
+    add     r12,r2, #0x110000
+    ldr     r12,[r12]
+    and     r12,r12,#0x00ff0000         @ wp
+    cmp     r0, r12, lsr #8
+    strgeh  r1, [r2, r3]
+    bx      lr
+
+
 m_s68k_write16_wordram_2M:              @ 0x080000 - 0x0bffff
 m_s68k_write16_wordram_1M_b1:           @ 0x0c0000 - 0x0dffff, maps to 0x0e0000
     m_s68k_write16_ram 0x020000
@@ -1974,6 +2040,21 @@ m_s68k_write16_regs_spec:               @ special case
 
 
 m_s68k_write32_prg:                     @ 0x000000 - 0x07ffff
+    ldr     r2, =(Pico+0x22200)
+    bic     r0, r0, #1
+    ldr     r2, [r2]
+    add     r3, r0, #0x020000           @ map to our address
+    add     r12,r2, #0x110000
+    ldr     r12,[r12]
+    and     r12,r12,#0x00ff0000         @ wp
+    cmp     r0, r12, lsr #8
+    bxlt    lr
+    mov     r0, r1, lsr #16
+    strh    r0, [r2, r3]!
+    strh    r1, [r2, #2]
+    bx      lr
+
+
 m_s68k_write32_wordram_2M:              @ 0x080000 - 0x0bffff
 m_s68k_write32_wordram_1M_b1:           @ 0x0c0000 - 0x0dffff, maps to 0x0e0000
     m_s68k_write32_ram 0x020000