PicoVideoRead optimization
[picodrive.git] / Pico / Memory_amips.s
index 0fab4f4..e6247c6 100644 (file)
@@ -260,29 +260,27 @@ m_read_neg1:
     j       SRAMRead
     nop
 .elseif \size == 16
+    sw      $ra, -4($sp)
+    jal     SRAMRead16
     addiu   $sp, -4
-    jal     SRAMRead
-    sw      $ra, 0($sp)
     lw      $ra, 0($sp)
-    addiu   $sp, 4
     jr      $ra
-    ins     $v0, $v0, 8, 8
+    addiu   $sp, 4
 .else
     addiu   $sp, -8
-    sw      $a0, 4($sp)
-    jal     SRAMRead
     sw      $ra, 0($sp)
+    sw      $a0, 4($sp)
+    jal     SRAMRead16
+    nop
     lw      $a0, 4($sp)
     sw      $v0, 4($sp)
-    jal     SRAMRead
+    jal     SRAMRead16
     addiu   $a0, 2
     lw      $v1, 4($sp)
     lw      $ra, 0($sp)
     addiu   $sp, 8
-    ins     $v0, $v1, 16, 16
-    sll     $t0, $v0, 8
     jr      $ra
-    or      $v0, $t0
+    ins     $v0, $v1, 16, 16
 .endif
 # m_read_nosram:
 1:
@@ -423,9 +421,7 @@ m_read8_z80_misc:
     lui     $t0, %hi(PicoOpt)
     lw      $t0, %lo(PicoOpt)($t0)
     andi    $t0, 1
-    beqz    $t0, m_read8_fake_ym2612
-    lui     $t0, %hi(Pico+0x22208)
-    j       YM2612Read_
+    bnez    $t0, ym2612_read_local_68k
     nop
 
 m_read8_fake_ym2612:
@@ -435,16 +431,28 @@ m_read8_fake_ym2612:
     sb      $t1, %lo(Pico+0x22208)($t0)
 
 # delay slot friendly
-.macro m_read8_call16 funcname
+.macro m_read8_call16 funcname is_func_ptr=0
+.if \is_func_ptr
+    lui     $t1, %hi(\funcname)
+    lw      $t1, %lo(\funcname)($t1)
+.endif
     andi    $t0, $a0, 1
     beqz    $t0, 1f
     li      $a1, 8      # not always needed, but shouln't cause problems
+.if \is_func_ptr
+    jr      $t1
+.else
     j       \funcname   # odd address
+.endif
     nop
 1:
     addiu   $sp, -4
     sw      $ra, 0($sp)
+.if \is_func_ptr
+    jalr    $t1
+.else
     jal     \funcname
+.endif
     xori    $a0, 1
     lw      $ra, 0($sp)
     addiu   $sp, 4
@@ -461,7 +469,9 @@ m_read8_vdp:
     andi    $t1, $a0, 0xe0
     or      $t0, $t1
     bnez    $t0, m_read_null # invalid address
-    m_read8_call16 PicoVideoRead
+    nop
+    j       PicoVideoRead8
+    nop
 
 m_read8_ram:
     lui     $t0, %hi(Pico)
@@ -473,7 +483,7 @@ m_read8_ram:
 m_read8_above_rom:
     # might still be SRam (Micro Machines, HardBall '95)
     m_read_rom_try_sram 0 8
-    m_read8_call16 OtherRead16End
+    m_read8_call16 PicoRead16Hook 1
 
 # #############################################################################
 
@@ -584,7 +594,9 @@ m_read16_ram:
 m_read16_above_rom:
     # might still be SRam
     m_read_rom_try_sram 0 16
-    j       OtherRead16End
+    lui     $t1, %hi(PicoRead16Hook)
+    lw      $t1, %lo(PicoRead16Hook)($t1)
+    jr      $t1
     ins     $a0, $0, 0, 1
 
 # #############################################################################
@@ -725,7 +737,25 @@ m_read32_above_rom:
     # might still be SRam
     m_read_rom_try_sram 0 32
     ins     $a0, $0, 0, 1
-    m_read32_call16 OtherRead16End
+    lui     $t1, %hi(PicoRead16Hook)
+    lw      $t1, %lo(PicoRead16Hook)($t1)
+    addiu   $sp, -4*3
+    sw      $ra, 0($sp)
+    sw      $s0, 4($sp)
+    sw      $t1, 8($sp)
+    jalr    $t1
+    move    $s0, $a0
+
+    lw      $t1, 8($sp)
+    addu    $a0, $s0, 2
+    jalr    $t1
+    move    $s0, $v0
+
+    ins     $v0, $s0, 16, 16
+    lw      $ra, 0($sp)
+    lw      $s0, 4($sp)
+    jr      $ra
+    addiu   $sp, 4*3
 
 # #############################################################################