(c) and stuff
[picodrive.git] / Pico / Memory_amips.s
index 0fab4f4..4ad7cd3 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:
@@ -425,8 +423,10 @@ m_read8_z80_misc:
     andi    $t0, 1
     beqz    $t0, m_read8_fake_ym2612
     lui     $t0, %hi(Pico+0x22208)
-    j       YM2612Read_
-    nop
+    lui     $t0, %hi(ym2612_st)
+    lw      $t0, %lo(ym2612_st)($t0)
+    jr      $ra
+    lb      $v0, 0x11($t0)
 
 m_read8_fake_ym2612:
     lb      $v0, %lo(Pico+0x22208)($t0) # Pico.m.rotate
@@ -435,16 +435,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
@@ -473,7 +485,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 +596,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 +739,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
 
 # #############################################################################