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:
lui $t0, %hi(PicoOpt)
lw $t0, %lo(PicoOpt)($t0)
andi $t0, 1
- beqz $t0, m_read8_fake_ym2612
- lui $t0, %hi(Pico+0x22208)
- lui $t0, %hi(ym2612_st)
- lw $t0, %lo(ym2612_st)($t0)
- jr $ra
- lb $v0, 0x11($t0)
+ bnez $t0, ym2612_read_local_68k
+ nop
m_read8_fake_ym2612:
lb $v0, %lo(Pico+0x22208)($t0) # Pico.m.rotate
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
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)
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
# #############################################################################
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
# #############################################################################
# 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
# #############################################################################