new z80 scheduling method, timers are still wip
[picodrive.git] / Pico / Memory.s
index 5555ac3..dbe76ac 100644 (file)
@@ -10,6 +10,7 @@
 .include "port_config.s"\r
 \r
 .text\r
+.align 4\r
 \r
 @ default jump tables\r
 \r
@@ -119,6 +120,7 @@ m_read32_def_table:
 @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\r
 \r
 .bss\r
+.align 4\r
 @.section .bss, "brw"\r
 @.data\r
 \r
@@ -136,6 +138,7 @@ m_read32_table:
 @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\r
 \r
 .text\r
+.align 4\r
 \r
 .global PicoMemReset\r
 .global PicoRead8\r
@@ -184,7 +187,7 @@ PicoMemReset:
     @ update memhandlers according to ROM size\r
     ldr     r1, =m_read8_above_rom\r
     ldr     r0, =m_read8_table\r
-    mov     r2, #16\r
+    mov     r2, #20\r
 1:\r
     sub     r2, r2, #1\r
     cmp     r2, r12\r
@@ -196,7 +199,7 @@ PicoMemReset:
 2:\r
     ldr     r1, =m_read16_above_rom\r
     ldr     r0, =m_read16_table\r
-    mov     r2, #16\r
+    mov     r2, #20\r
 1:\r
     sub     r2, r2, #1\r
     cmp     r2, r12\r
@@ -208,7 +211,7 @@ PicoMemReset:
 2:\r
     ldr     r1, =m_read32_above_rom\r
     ldr     r0, =m_read32_table\r
-    mov     r2, #16\r
+    mov     r2, #20\r
 1:\r
     sub     r2, r2, #1\r
     cmp     r2, r12\r
@@ -383,17 +386,14 @@ m_read8_misc2:
     cmp     r2, #0x4000\r
     mvnne   r0, #0\r
     bxne    lr                @ invalid\r
-.if EXTERNAL_YM2612\r
     ldr     r1, =PicoOpt\r
     ldr     r1, [r1]\r
     tst     r1, #1\r
-    beq     m_read8_fake_ym2612\r
-    tst     r1, #0x200\r
-    beq     YM2612Read_\r
-    b       YM2612Read_940\r
-.else\r
-    b       YM2612Read_\r
-.endif\r
+\r
+    ldrne   r1, =ym2612_st\r
+    ldrne   r1, [r1]\r
+    ldrneb  r0, [r1, #0x11]   @ ym2612_st->status\r
+    bxne    lr\r
 \r
 m_read8_fake_ym2612:\r
     ldr     r3, =(Pico+0x22200)\r
@@ -448,10 +448,13 @@ m_read8_above_rom:
     tst     r1, #5\r
     bne     SRAMRead\r
 m_read8_ar_nosram:\r
+    ldr     r2, =PicoRead16Hook\r
     stmfd   sp!,{r0,lr}\r
+    ldr     r2, [r2]\r
     bic     r0, r0, #1\r
     mov     r1, #8\r
-    bl      OtherRead16End\r
+    mov     lr, pc\r
+    bx      r2\r
     ldmfd   sp!,{r1,lr}\r
     tst     r1, #1\r
     moveq   r0, r0, lsr #8\r
@@ -502,8 +505,7 @@ m_read16_rom4: @ 0x200000 - 0x27ffff, SRAM area (NBA Live 95)
     tst     r1, #5\r
     beq     m_read16_nosram\r
     stmfd   sp!,{lr}\r
-    bl      SRAMRead\r
-    orr     r0, r0, r0, lsl #8\r
+    bl      SRAMRead16\r
     ldmfd   sp!,{pc}\r
 m_read16_nosram:\r
     ldr     r1, [r3, #4]    @ romsize\r
@@ -593,12 +595,13 @@ m_read16_above_rom:
     tst     r1, #5\r
     beq     m_read16_ar_nosram\r
     stmfd   sp!,{lr}\r
-    bl      SRAMRead\r
-    orr     r0, r0, r0, lsl #8\r
+    bl      SRAMRead16\r
     ldmfd   sp!,{pc}\r
 m_read16_ar_nosram:\r
+    ldr     r2, =PicoRead16Hook\r
+    ldr     r2, [r2]\r
     mov     r1, #16\r
-    b       OtherRead16End\r
+    bx      r2\r
 \r
 .pool\r
 \r
@@ -647,14 +650,13 @@ m_read32_rom4: @ 0x200000 - 0x27ffff, SRAM area (does any game do long reads?)
     tst     r1, #5\r
     beq     m_read32_nosram\r
     stmfd   sp!,{r0,lr}\r
-    bl      SRAMRead\r
+    bl      SRAMRead16\r
     ldmfd   sp!,{r1,lr}\r
     stmfd   sp!,{r0,lr}\r
     add     r0, r1, #2\r
-    bl      SRAMRead\r
+    bl      SRAMRead16\r
     ldmfd   sp!,{r1,lr}\r
-    orr     r0, r1, r0, lsl #16\r
-    orr     r0, r0, r0, lsl #8\r
+    orr     r0, r0, r1, lsl #16\r
     bx      lr\r
 m_read32_nosram:\r
     ldr     r1, [r3, #4]    @ romsize\r
@@ -751,16 +753,20 @@ m_read32_ram:
     bx      lr\r
 \r
 m_read32_above_rom:\r
+    ldr     r2, =PicoRead16Hook\r
     bic     r0, r0, #1\r
-    stmfd   sp!,{r0,lr}\r
+    ldr     r2, [r2]\r
     mov     r1, #32\r
-    bl      OtherRead16End\r
+    stmfd   sp!,{r0,r2,lr}\r
+    mov     lr, pc\r
+    bx      r2\r
     mov     r1, r0\r
-    ldmfd   sp!,{r0}\r
+    ldmfd   sp!,{r0,r2}\r
     stmfd   sp!,{r1}\r
     add     r0, r0, #2\r
     mov     r1, #32\r
-    bl      OtherRead16End\r
+    mov     lr, pc\r
+    bx      r2\r
     ldmfd   sp!,{r1,lr}\r
     orr     r0, r0, r1, lsl #16\r
     bx      lr\r
@@ -873,26 +879,21 @@ m_write8_z80_not_ram:
     and     r2, r0, #0x6000\r
     cmp     r2,     #0x4000\r
     bne     m_write8_z80_not_ym2612\r
-    ldr     r2, =PicoOpt\r
+    ldr     r3, =PicoOpt\r
     and     r0, r0, #3\r
-    ldr     r2, [r2]\r
-    tst     r2, #1\r
+    ldr     r3, [r3]\r
+    mov     r2, #0           @ is_from_z80 = 0\r
+    tst     r3, #1\r
     bxeq    lr\r
     stmfd   sp!,{lr}\r
-.if EXTERNAL_YM2612\r
-    tst     r2, #0x200\r
-    ldreq   r2, =YM2612Write_\r
-    ldrne   r2, =YM2612Write_940\r
-    mov     lr, pc\r
-    bx      r2\r
-.else\r
-    bl      YM2612Write_\r
-.endif\r
+    and     r1, r1, #0xff\r
+    bl      ym2612_write_local\r
     ldr     r2, =emustatus\r
     ldmfd   sp!,{lr}\r
     ldr     r1, [r2]\r
-    orr     r1, r0, r2\r
-    str     r1, [r2]         @ emustatus|=YM2612Write(a&3, d);\r
+    and     r0, r0, #1\r
+    orr     r1, r0, r1\r
+    str     r1, [r2]         @ emustatus|=ym2612_write_local(a&3, d);\r
     bx      lr\r
 \r
 m_write8_z80_not_ym2612:     @ not too likely\r
@@ -909,7 +910,7 @@ m_write8_z80_not_ym2612:     @ not too likely
 m_write8_z80_bank_reg:\r
     ldr     r3, =(Pico+0x22208) @ Pico.m\r
     ldrh    r2, [r3, #0x0a]\r
-    mov     r1, r1, lsr #8\r
+    mov     r1, r1, lsl #8\r
     orr     r2, r1, r2, lsr #1\r
     bic     r2, r2, #0xfe00\r
     strh    r2, [r3, #0x0a]\r
@@ -925,7 +926,7 @@ m_write8_not_z80:
     bne     OtherWrite8\r
 m_write8_psg:\r
     ldr     r2, =PicoOpt\r
-    mov     r0, r1\r
+    and     r0, r1, #0xff\r
     ldr     r2, [r2]\r
     tst     r2, #2\r
     bxeq    lr\r