mirror of
https://github.com/RaySollium99/picodrive.git
synced 2025-09-05 07:17:45 -04:00

- PicoDrive was originally released by fDave with simple "free for non-commercial use / For commercial use, separate licencing terms must be obtained" license and I kept it in my releases. - in 2011, fDave re-released his code (same that I used as base many years ago) dual licensed with GPLv2 and MAME licenses: https://code.google.com/p/cyclone68000/ Based on the above I now proclaim that the whole source code is licensed under the MAME license as more elaborate form of "for non-commercial use". If that raises any doubt, I announce that all my modifications (which is the vast majority of code by now) is licensed under the MAME license, as it reads in COPYING file in this commit. This does not affect ym2612.c/sn76496.c that were MAME licensed already from the beginning.
790 lines
19 KiB
ArmAsm
790 lines
19 KiB
ArmAsm
#*
|
|
#* memory handlers with banking support
|
|
#* (C) notaz, 2007-2008
|
|
#*
|
|
#* This work is licensed under the terms of MAME license.
|
|
#* See COPYING file in the top-level directory.
|
|
#*
|
|
|
|
# OUT OF DATE
|
|
|
|
.set noreorder
|
|
.set noat
|
|
|
|
.text
|
|
.align 4
|
|
|
|
# default jump tables
|
|
|
|
m_read8_def_table:
|
|
.long m_read8_rom0 # 0x000000 - 0x07FFFF
|
|
.long m_read8_rom1 # 0x080000 - 0x0FFFFF
|
|
.long m_read8_rom2 # 0x100000 - 0x17FFFF
|
|
.long m_read8_rom3 # 0x180000 - 0x1FFFFF
|
|
.long m_read8_rom4 # 0x200000 - 0x27FFFF
|
|
.long m_read8_rom5 # 0x280000 - 0x2FFFFF
|
|
.long m_read8_rom6 # 0x300000 - 0x37FFFF
|
|
.long m_read8_rom7 # 0x380000 - 0x3FFFFF
|
|
.long m_read8_rom8 # 0x400000 - 0x47FFFF - for all those large ROM hacks
|
|
.long m_read8_rom9 # 0x480000 - 0x4FFFFF
|
|
.long m_read8_romA # 0x500000 - 0x57FFFF
|
|
.long m_read8_romB # 0x580000 - 0x5FFFFF
|
|
.long m_read8_romC # 0x600000 - 0x67FFFF
|
|
.long m_read8_romD # 0x680000 - 0x6FFFFF
|
|
.long m_read8_romE # 0x700000 - 0x77FFFF
|
|
.long m_read8_romF # 0x780000 - 0x7FFFFF
|
|
.long m_read8_rom10 # 0x800000 - 0x87FFFF
|
|
.long m_read8_rom11 # 0x880000 - 0x8FFFFF
|
|
.long m_read8_rom12 # 0x900000 - 0x97FFFF
|
|
.long m_read8_rom13 # 0x980000 - 0x9FFFFF
|
|
.long m_read8_misc # 0xA00000 - 0xA7FFFF
|
|
.long m_read_null # 0xA80000 - 0xAFFFFF
|
|
.long m_read_null # 0xB00000 - 0xB7FFFF
|
|
.long m_read_null # 0xB80000 - 0xBFFFFF
|
|
.long m_read8_vdp # 0xC00000 - 0xC7FFFF
|
|
.long m_read8_vdp # 0xC80000 - 0xCFFFFF
|
|
.long m_read8_vdp # 0xD00000 - 0xD7FFFF
|
|
.long m_read8_vdp # 0xD80000 - 0xDFFFFF
|
|
.long m_read8_ram # 0xE00000 - 0xE7FFFF
|
|
.long m_read8_ram # 0xE80000 - 0xEFFFFF
|
|
.long m_read8_ram # 0xF00000 - 0xF7FFFF
|
|
.long m_read8_ram # 0xF80000 - 0xFFFFFF
|
|
|
|
m_read16_def_table:
|
|
.long m_read16_rom0 # 0x000000 - 0x07FFFF
|
|
.long m_read16_rom1 # 0x080000 - 0x0FFFFF
|
|
.long m_read16_rom2 # 0x100000 - 0x17FFFF
|
|
.long m_read16_rom3 # 0x180000 - 0x1FFFFF
|
|
.long m_read16_rom4 # 0x200000 - 0x27FFFF
|
|
.long m_read16_rom5 # 0x280000 - 0x2FFFFF
|
|
.long m_read16_rom6 # 0x300000 - 0x37FFFF
|
|
.long m_read16_rom7 # 0x380000 - 0x3FFFFF
|
|
.long m_read16_rom8 # 0x400000 - 0x47FFFF
|
|
.long m_read16_rom9 # 0x480000 - 0x4FFFFF
|
|
.long m_read16_romA # 0x500000 - 0x57FFFF
|
|
.long m_read16_romB # 0x580000 - 0x5FFFFF
|
|
.long m_read16_romC # 0x600000 - 0x67FFFF
|
|
.long m_read16_romD # 0x680000 - 0x6FFFFF
|
|
.long m_read16_romE # 0x700000 - 0x77FFFF
|
|
.long m_read16_romF # 0x780000 - 0x7FFFFF
|
|
.long m_read16_rom10 # 0x800000 - 0x87FFFF
|
|
.long m_read16_rom11 # 0x880000 - 0x8FFFFF
|
|
.long m_read16_rom12 # 0x900000 - 0x97FFFF
|
|
.long m_read16_rom13 # 0x980000 - 0x9FFFFF
|
|
.long m_read16_misc # 0xA00000 - 0xA7FFFF
|
|
.long m_read_null # 0xA80000 - 0xAFFFFF
|
|
.long m_read_null # 0xB00000 - 0xB7FFFF
|
|
.long m_read_null # 0xB80000 - 0xBFFFFF
|
|
.long m_read16_vdp # 0xC00000 - 0xC7FFFF
|
|
.long m_read16_vdp # 0xC80000 - 0xCFFFFF
|
|
.long m_read16_vdp # 0xD00000 - 0xD7FFFF
|
|
.long m_read16_vdp # 0xD80000 - 0xDFFFFF
|
|
.long m_read16_ram # 0xE00000 - 0xE7FFFF
|
|
.long m_read16_ram # 0xE80000 - 0xEFFFFF
|
|
.long m_read16_ram # 0xF00000 - 0xF7FFFF
|
|
.long m_read16_ram # 0xF80000 - 0xFFFFFF
|
|
|
|
m_read32_def_table:
|
|
.long m_read32_rom0 # 0x000000 - 0x07FFFF
|
|
.long m_read32_rom1 # 0x080000 - 0x0FFFFF
|
|
.long m_read32_rom2 # 0x100000 - 0x17FFFF
|
|
.long m_read32_rom3 # 0x180000 - 0x1FFFFF
|
|
.long m_read32_rom4 # 0x200000 - 0x27FFFF
|
|
.long m_read32_rom5 # 0x280000 - 0x2FFFFF
|
|
.long m_read32_rom6 # 0x300000 - 0x37FFFF
|
|
.long m_read32_rom7 # 0x380000 - 0x3FFFFF
|
|
.long m_read32_rom8 # 0x400000 - 0x47FFFF
|
|
.long m_read32_rom9 # 0x480000 - 0x4FFFFF
|
|
.long m_read32_romA # 0x500000 - 0x57FFFF
|
|
.long m_read32_romB # 0x580000 - 0x5FFFFF
|
|
.long m_read32_romC # 0x600000 - 0x67FFFF
|
|
.long m_read32_romD # 0x680000 - 0x6FFFFF
|
|
.long m_read32_romE # 0x700000 - 0x77FFFF
|
|
.long m_read32_romF # 0x780000 - 0x7FFFFF
|
|
.long m_read32_rom10 # 0x800000 - 0x87FFFF
|
|
.long m_read32_rom11 # 0x880000 - 0x8FFFFF
|
|
.long m_read32_rom12 # 0x900000 - 0x97FFFF
|
|
.long m_read32_rom13 # 0x980000 - 0x9FFFFF
|
|
.long m_read32_misc # 0xA00000 - 0xA7FFFF
|
|
.long m_read_null # 0xA80000 - 0xAFFFFF
|
|
.long m_read_null # 0xB00000 - 0xB7FFFF
|
|
.long m_read_null # 0xB80000 - 0xBFFFFF
|
|
.long m_read32_vdp # 0xC00000 - 0xC7FFFF
|
|
.long m_read32_vdp # 0xC80000 - 0xCFFFFF
|
|
.long m_read32_vdp # 0xD00000 - 0xD7FFFF
|
|
.long m_read32_vdp # 0xD80000 - 0xDFFFFF
|
|
.long m_read32_ram # 0xE00000 - 0xE7FFFF
|
|
.long m_read32_ram # 0xE80000 - 0xEFFFFF
|
|
.long m_read32_ram # 0xF00000 - 0xF7FFFF
|
|
.long m_read32_ram # 0xF80000 - 0xFFFFFF
|
|
|
|
|
|
# #############################################################################
|
|
|
|
.bss
|
|
.align 4
|
|
|
|
# used tables
|
|
m_read8_table:
|
|
.skip 32*4
|
|
|
|
m_read16_table:
|
|
.skip 32*4
|
|
|
|
m_read32_table:
|
|
.skip 32*4
|
|
|
|
|
|
# #############################################################################
|
|
|
|
.text
|
|
.align 4
|
|
|
|
.global PicoMemReset
|
|
.global PicoRead8
|
|
.global PicoRead16
|
|
.global PicoRead32
|
|
.global PicoWriteRomHW_SSF2
|
|
|
|
.global m_read8_def_table
|
|
.global m_read8_table
|
|
|
|
.macro PicoMemResetCopyDef dst_table src_table
|
|
lui $t0, %hi(\dst_table)
|
|
addiu $t0, %lo(\dst_table)
|
|
lui $t1, %hi(\src_table)
|
|
addiu $t1, %lo(\src_table)
|
|
li $t2, 32
|
|
1:
|
|
lw $t3, 0($t1)
|
|
sw $t3, 0($t0)
|
|
addiu $t2, -1
|
|
addiu $t1, 4
|
|
bnez $t2, 1b
|
|
addiu $t0, 4
|
|
.endm
|
|
|
|
# $t4 = 4
|
|
.macro PicoMemResetRomArea dst_table ar_label
|
|
lui $t0, %hi(\dst_table)
|
|
addiu $t0, %lo(\dst_table)
|
|
lui $t1, %hi(\ar_label)
|
|
addiu $t1, %lo(\ar_label)
|
|
li $t2, 20
|
|
1:
|
|
beq $t2, $v1, 2f
|
|
addiu $t2, -1
|
|
sll $t3, $t2, 2
|
|
beq $t2, $t4, 1b # do not touch the SRAM area
|
|
addu $t3, $t0
|
|
j 1b
|
|
sw $t1, 0($t3)
|
|
2:
|
|
.endm
|
|
|
|
|
|
PicoMemReset:
|
|
lui $v1, %hi(Pico+0x22204)
|
|
lw $v1, %lo(Pico+0x22204)($v1) # romsize
|
|
lui $t0, 8
|
|
addu $v1, $t0
|
|
addiu $v1, -1
|
|
srl $v1, 19
|
|
|
|
PicoMemResetCopyDef m_read8_table m_read8_def_table
|
|
PicoMemResetCopyDef m_read16_table m_read16_def_table
|
|
PicoMemResetCopyDef m_read32_table m_read32_def_table
|
|
|
|
# update memhandlers according to ROM size
|
|
li $t4, 4
|
|
PicoMemResetRomArea m_read8_table m_read8_above_rom
|
|
PicoMemResetRomArea m_read16_table m_read16_above_rom
|
|
PicoMemResetRomArea m_read32_table m_read32_above_rom
|
|
|
|
jr $ra
|
|
nop
|
|
|
|
# #############################################################################
|
|
|
|
.macro PicoReadJump table
|
|
lui $t0, %hi(\table)
|
|
srl $t1, $a0, 19
|
|
ins $t0, $t1, 2, 5
|
|
lw $t0, %lo(\table)($t0)
|
|
ins $a0, $0, 24, 8
|
|
jr $t0
|
|
nop
|
|
.endm
|
|
|
|
PicoRead8: # u32 a
|
|
PicoReadJump m_read8_table
|
|
|
|
PicoRead16: # u32 a
|
|
PicoReadJump m_read16_table
|
|
|
|
PicoRead32: # u32 a
|
|
PicoReadJump m_read32_table
|
|
|
|
# #############################################################################
|
|
|
|
m_read_null:
|
|
jr $ra
|
|
li $v0, 0
|
|
|
|
m_read_neg1:
|
|
jr $ra
|
|
addiu $v0, $0, 0xffff
|
|
|
|
# loads &Pico.rom to $t3
|
|
.macro m_read_rom_try_sram is200000 size
|
|
lui $t2, %hi(SRam)
|
|
addiu $t2, %lo(SRam)
|
|
lui $t3, %hi(Pico+0x22200)
|
|
lw $t1, 8($t2) # SRam.end
|
|
.if \is200000
|
|
ins $a0, $0, 19, 13
|
|
lui $t4, 0x20
|
|
or $a0, $t4
|
|
.endif
|
|
subu $t4, $a0, $t1
|
|
bgtz $t4, 1f
|
|
addiu $t3, %lo(Pico+0x22200)
|
|
lw $t1, 4($t2) # SRam.start
|
|
subu $t4, $t1, $a0
|
|
bgtz $t4, 1f
|
|
nop
|
|
lb $t1, 0x11($t3) # Pico.m.sram_reg
|
|
andi $t4, $t1, 5
|
|
beqz $t4, 1f
|
|
nop
|
|
.if \size == 8
|
|
j SRAMRead
|
|
nop
|
|
.elseif \size == 16
|
|
sw $ra, -4($sp)
|
|
jal SRAMRead16
|
|
addiu $sp, -4
|
|
lw $ra, 0($sp)
|
|
jr $ra
|
|
addiu $sp, 4
|
|
.else
|
|
addiu $sp, -8
|
|
sw $ra, 0($sp)
|
|
sw $a0, 4($sp)
|
|
jal SRAMRead16
|
|
nop
|
|
lw $a0, 4($sp)
|
|
sw $v0, 4($sp)
|
|
jal SRAMRead16
|
|
addiu $a0, 2
|
|
lw $v1, 4($sp)
|
|
lw $ra, 0($sp)
|
|
addiu $sp, 8
|
|
jr $ra
|
|
ins $v0, $v1, 16, 16
|
|
.endif
|
|
# m_read_nosram:
|
|
1:
|
|
.endm
|
|
|
|
.macro m_read8_rom sect
|
|
lui $t0, %hi(Pico+0x22200)
|
|
lw $t0, %lo(Pico+0x22200)($t0) # rom
|
|
xori $a0, 1
|
|
ins $a0, $0, 19, 13
|
|
.if \sect
|
|
lui $t1, 8*\sect
|
|
addu $a0, $t1
|
|
.endif
|
|
addu $t0, $a0
|
|
jr $ra
|
|
lb $v0, 0($t0)
|
|
.endm
|
|
|
|
|
|
m_read8_rom0: # 0x000000 - 0x07ffff
|
|
m_read8_rom 0
|
|
|
|
m_read8_rom1: # 0x080000 - 0x0fffff
|
|
m_read8_rom 1
|
|
|
|
m_read8_rom2: # 0x100000 - 0x17ffff
|
|
m_read8_rom 2
|
|
|
|
m_read8_rom3: # 0x180000 - 0x1fffff
|
|
m_read8_rom 3
|
|
|
|
m_read8_rom4: # 0x200000 - 0x27ffff, SRAM area
|
|
m_read_rom_try_sram 1 8
|
|
lw $t1, 4($t3) # romsize
|
|
subu $t4, $t1, $a0
|
|
blez $t4, m_read_null
|
|
lw $t1, 0($t3) # rom
|
|
xori $a0, 1
|
|
addu $t1, $a0
|
|
jr $ra
|
|
lb $v0, 0($t1)
|
|
|
|
m_read8_rom5: # 0x280000 - 0x2fffff
|
|
m_read8_rom 5
|
|
|
|
m_read8_rom6: # 0x300000 - 0x37ffff
|
|
m_read8_rom 6
|
|
|
|
m_read8_rom7: # 0x380000 - 0x3fffff
|
|
m_read8_rom 7
|
|
|
|
m_read8_rom8: # 0x400000 - 0x47ffff
|
|
m_read8_rom 8
|
|
|
|
m_read8_rom9: # 0x480000 - 0x4fffff
|
|
m_read8_rom 9
|
|
|
|
m_read8_romA: # 0x500000 - 0x57ffff
|
|
m_read8_rom 0xA
|
|
|
|
m_read8_romB: # 0x580000 - 0x5fffff
|
|
m_read8_rom 0xB
|
|
|
|
m_read8_romC: # 0x600000 - 0x67ffff
|
|
m_read8_rom 0xC
|
|
|
|
m_read8_romD: # 0x680000 - 0x6fffff
|
|
m_read8_rom 0xD
|
|
|
|
m_read8_romE: # 0x700000 - 0x77ffff
|
|
m_read8_rom 0xE
|
|
|
|
m_read8_romF: # 0x780000 - 0x7fffff
|
|
m_read8_rom 0xF
|
|
|
|
m_read8_rom10: # 0x800000 - 0x87ffff
|
|
m_read8_rom 0x10
|
|
|
|
m_read8_rom11: # 0x880000 - 0x8fffff
|
|
m_read8_rom 0x11
|
|
|
|
m_read8_rom12: # 0x900000 - 0x97ffff
|
|
m_read8_rom 0x12
|
|
|
|
m_read8_rom13: # 0x980000 - 0x9fffff
|
|
m_read8_rom 0x13
|
|
|
|
|
|
m_read8_misc:
|
|
srl $t0, $a0, 5
|
|
sll $t0, $t0, 5
|
|
lui $t1, 0xa1
|
|
bne $t0, $t1, m_read8_misc2
|
|
andi $t0, $a0, 0x1e
|
|
m_read8_misc_io:
|
|
beqz $t0, m_read8_misc_hwreg
|
|
sub $t1, $t0, 4
|
|
bgtz $t1, m_read8_misc_ioports
|
|
nop
|
|
slti $a0, $t0, 4
|
|
xori $a0, 1
|
|
j PadRead
|
|
nop
|
|
|
|
m_read8_misc_hwreg:
|
|
lui $v0, %hi(Pico+0x2220f)
|
|
jr $ra
|
|
lb $v0, %lo(Pico+0x2220f)($v0)
|
|
|
|
m_read8_misc_ioports:
|
|
lui $v0, %hi(Pico+0x22000)
|
|
ins $v0, $t0, 0, 5
|
|
jr $ra
|
|
lb $v0, %lo(Pico+0x22000)($v0)
|
|
|
|
m_read8_misc2:
|
|
lui $t0, 0xa1
|
|
ori $t0, 0x1100
|
|
bne $a0, $t0, m_read8_misc3
|
|
srl $t0, $a0, 16
|
|
j z80ReadBusReq
|
|
|
|
m_read8_misc3:
|
|
addiu $t0, 0xff60 # expecting 0xa0 to get 0
|
|
bnez $t0, m_read8_misc4
|
|
|
|
# z80 area
|
|
andi $t0, $a0, 0x4000
|
|
bnez $t0, m_read8_z80_misc
|
|
andi $t0, $a0, 0x6000
|
|
j z80Read8 # z80 RAM
|
|
|
|
m_read8_z80_misc:
|
|
addiu $t0, 0xc000 # expecting 0x4000 to get 0
|
|
bnez $t0, m_read_neg1 # invalid
|
|
nop
|
|
j ym2612_read_local_68k
|
|
nop
|
|
|
|
m_read8_fake_ym2612:
|
|
lb $v0, %lo(Pico+0x22208)($t0) # Pico.m.rotate
|
|
addiu $t1, $v0, 1
|
|
jr $ra
|
|
sb $t1, %lo(Pico+0x22208)($t0)
|
|
|
|
# delay slot friendly
|
|
.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
|
|
jr $ra
|
|
srl $v0, 8
|
|
.endm
|
|
|
|
m_read8_misc4:
|
|
# if everything else fails, use generic handler
|
|
m_read8_call16 OtherRead16
|
|
|
|
m_read8_vdp:
|
|
ext $t0, $a0, 16, 3
|
|
andi $t1, $a0, 0xe0
|
|
or $t0, $t1
|
|
bnez $t0, m_read_null # invalid address
|
|
nop
|
|
j PicoVideoRead8
|
|
nop
|
|
|
|
m_read8_ram:
|
|
lui $t0, %hi(Pico)
|
|
ins $t0, $a0, 0, 16
|
|
xori $t0, 1
|
|
jr $ra
|
|
lb $v0, %lo(Pico)($t0)
|
|
|
|
m_read8_above_rom:
|
|
# might still be SRam (Micro Machines, HardBall '95)
|
|
m_read_rom_try_sram 0 8
|
|
m_read8_call16 PicoRead16Hook 1
|
|
|
|
# #############################################################################
|
|
|
|
.macro m_read16_rom sect
|
|
lui $t0, %hi(Pico+0x22200)
|
|
lw $t0, %lo(Pico+0x22200)($t0) # rom
|
|
ins $a0, $0, 0, 1
|
|
ins $a0, $0, 19, 13
|
|
.if \sect
|
|
lui $t1, 8*\sect
|
|
addu $a0, $t1
|
|
.endif
|
|
addu $t0, $a0
|
|
jr $ra
|
|
lh $v0, 0($t0)
|
|
.endm
|
|
|
|
|
|
m_read16_rom0: # 0x000000 - 0x07ffff
|
|
m_read16_rom 0
|
|
|
|
m_read16_rom1: # 0x080000 - 0x0fffff
|
|
m_read16_rom 1
|
|
|
|
m_read16_rom2: # 0x100000 - 0x17ffff
|
|
m_read16_rom 2
|
|
|
|
m_read16_rom3: # 0x180000 - 0x1fffff
|
|
m_read16_rom 3
|
|
|
|
m_read16_rom4: # 0x200000 - 0x27ffff, SRAM area
|
|
m_read_rom_try_sram 1 16
|
|
lw $t1, 4($t3) # romsize
|
|
subu $t4, $t1, $a0
|
|
blez $t4, m_read_null
|
|
lw $t1, 0($t3) # rom
|
|
ins $a0, $0, 0, 1
|
|
addu $t1, $a0
|
|
jr $ra
|
|
lh $v0, 0($t1)
|
|
|
|
m_read16_rom5: # 0x280000 - 0x2fffff
|
|
m_read16_rom 5
|
|
|
|
m_read16_rom6: # 0x300000 - 0x37ffff
|
|
m_read16_rom 6
|
|
|
|
m_read16_rom7: # 0x380000 - 0x3fffff
|
|
m_read16_rom 7
|
|
|
|
m_read16_rom8: # 0x400000 - 0x47ffff
|
|
m_read16_rom 8
|
|
|
|
m_read16_rom9: # 0x480000 - 0x4fffff
|
|
m_read16_rom 9
|
|
|
|
m_read16_romA: # 0x500000 - 0x57ffff
|
|
m_read16_rom 0xA
|
|
|
|
m_read16_romB: # 0x580000 - 0x5fffff
|
|
m_read16_rom 0xB
|
|
|
|
m_read16_romC: # 0x600000 - 0x67ffff
|
|
m_read16_rom 0xC
|
|
|
|
m_read16_romD: # 0x680000 - 0x6fffff
|
|
m_read16_rom 0xD
|
|
|
|
m_read16_romE: # 0x700000 - 0x77ffff
|
|
m_read16_rom 0xE
|
|
|
|
m_read16_romF: # 0x780000 - 0x7fffff
|
|
m_read16_rom 0xF
|
|
|
|
m_read16_rom10: # 0x800000 - 0x87ffff
|
|
m_read16_rom 0x10
|
|
|
|
m_read16_rom11: # 0x880000 - 0x8fffff
|
|
m_read16_rom 0x11
|
|
|
|
m_read16_rom12: # 0x900000 - 0x97ffff
|
|
m_read16_rom 0x12
|
|
|
|
m_read16_rom13: # 0x980000 - 0x9fffff
|
|
m_read16_rom 0x13
|
|
|
|
m_read16_misc:
|
|
ins $a0, $0, 0, 1
|
|
j OtherRead16
|
|
li $a1, 16
|
|
|
|
m_read16_vdp:
|
|
ext $t0, $a0, 16, 3
|
|
andi $t1, $a0, 0xe0
|
|
or $t0, $t1
|
|
bnez $t0, m_read_null # invalid address
|
|
ins $a0, $0, 0, 1
|
|
j PicoVideoRead
|
|
nop
|
|
|
|
m_read16_ram:
|
|
lui $t0, %hi(Pico)
|
|
ins $a0, $0, 0, 1
|
|
ins $t0, $a0, 0, 16
|
|
jr $ra
|
|
lh $v0, %lo(Pico)($t0)
|
|
|
|
m_read16_above_rom:
|
|
# might still be SRam
|
|
m_read_rom_try_sram 0 16
|
|
lui $t1, %hi(PicoRead16Hook)
|
|
lw $t1, %lo(PicoRead16Hook)($t1)
|
|
jr $t1
|
|
ins $a0, $0, 0, 1
|
|
|
|
# #############################################################################
|
|
|
|
.macro m_read32_rom sect
|
|
lui $t0, %hi(Pico+0x22200)
|
|
lw $t0, %lo(Pico+0x22200)($t0) # rom
|
|
ins $a0, $0, 0, 1
|
|
ins $a0, $0, 19, 13
|
|
.if \sect
|
|
lui $t1, 8*\sect
|
|
addu $a0, $t1
|
|
.endif
|
|
addu $t0, $a0
|
|
lh $v1, 0($t0)
|
|
lh $v0, 2($t0)
|
|
jr $ra
|
|
ins $v0, $v1, 16, 16
|
|
.endm
|
|
|
|
|
|
m_read32_rom0: # 0x000000 - 0x07ffff
|
|
m_read32_rom 0
|
|
|
|
m_read32_rom1: # 0x080000 - 0x0fffff
|
|
m_read32_rom 1
|
|
|
|
m_read32_rom2: # 0x100000 - 0x17ffff
|
|
m_read32_rom 2
|
|
|
|
m_read32_rom3: # 0x180000 - 0x1fffff
|
|
m_read32_rom 3
|
|
|
|
m_read32_rom4: # 0x200000 - 0x27ffff, SRAM area
|
|
m_read_rom_try_sram 1 32
|
|
lw $t1, 4($t3) # romsize
|
|
subu $t4, $t1, $a0
|
|
blez $t4, m_read_null
|
|
lw $t1, 0($t3) # rom
|
|
ins $a0, $0, 0, 1
|
|
addu $t1, $a0
|
|
lh $v1, 0($t1)
|
|
lh $v0, 2($t1)
|
|
jr $ra
|
|
ins $v0, $v1, 16, 16
|
|
|
|
m_read32_rom5: # 0x280000 - 0x2fffff
|
|
m_read32_rom 5
|
|
|
|
m_read32_rom6: # 0x300000 - 0x37ffff
|
|
m_read32_rom 6
|
|
|
|
m_read32_rom7: # 0x380000 - 0x3fffff
|
|
m_read32_rom 7
|
|
|
|
m_read32_rom8: # 0x400000 - 0x47ffff
|
|
m_read32_rom 8
|
|
|
|
m_read32_rom9: # 0x480000 - 0x4fffff
|
|
m_read32_rom 9
|
|
|
|
m_read32_romA: # 0x500000 - 0x57ffff
|
|
m_read32_rom 0xA
|
|
|
|
m_read32_romB: # 0x580000 - 0x5fffff
|
|
m_read32_rom 0xB
|
|
|
|
m_read32_romC: # 0x600000 - 0x67ffff
|
|
m_read32_rom 0xC
|
|
|
|
m_read32_romD: # 0x680000 - 0x6fffff
|
|
m_read32_rom 0xD
|
|
|
|
m_read32_romE: # 0x700000 - 0x77ffff
|
|
m_read32_rom 0xE
|
|
|
|
m_read32_romF: # 0x780000 - 0x7fffff
|
|
m_read32_rom 0xF
|
|
|
|
m_read32_rom10: # 0x800000 - 0x87ffff
|
|
m_read32_rom 0x10
|
|
|
|
m_read32_rom11: # 0x880000 - 0x8fffff
|
|
m_read32_rom 0x11
|
|
|
|
m_read32_rom12: # 0x900000 - 0x97ffff
|
|
m_read32_rom 0x12
|
|
|
|
m_read32_rom13: # 0x980000 - 0x9fffff
|
|
m_read32_rom 0x13
|
|
|
|
.macro m_read32_call16 func need_a1=0
|
|
addiu $sp, -8
|
|
sw $ra, 0($sp)
|
|
sw $s0, 4($sp)
|
|
.if \need_a1
|
|
li $a1, 16
|
|
.endif
|
|
jal \func
|
|
move $s0, $a0
|
|
|
|
addu $a0, $s0, 2
|
|
.if \need_a1
|
|
li $a1, 16
|
|
.endif
|
|
jal \func
|
|
move $s0, $v0
|
|
|
|
ins $v0, $s0, 16, 16
|
|
lw $ra, 0($sp)
|
|
lw $s0, 4($sp)
|
|
jr $ra
|
|
addiu $sp, 8
|
|
.endm
|
|
|
|
m_read32_misc:
|
|
ins $a0, $0, 0, 1
|
|
m_read32_call16 OtherRead16, 1
|
|
|
|
m_read32_vdp:
|
|
ext $t0, $a0, 16, 3
|
|
andi $t1, $a0, 0xe0
|
|
or $t0, $t1
|
|
bnez $t0, m_read_null # invalid address
|
|
ins $a0, $0, 0, 1
|
|
m_read32_call16 PicoVideoRead
|
|
|
|
m_read32_ram:
|
|
lui $t0, %hi(Pico)
|
|
ins $a0, $0, 0, 1
|
|
ins $t0, $a0, 0, 16
|
|
lh $v1, %lo(Pico)($t0)
|
|
lh $v0, %lo(Pico+2)($t0)
|
|
jr $ra
|
|
ins $v0, $v1, 16, 16
|
|
|
|
m_read32_above_rom:
|
|
# might still be SRam
|
|
m_read_rom_try_sram 0 32
|
|
ins $a0, $0, 0, 1
|
|
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
|
|
|
|
# #############################################################################
|
|
|
|
.macro PicoWriteRomHW_SSF2_ls def_table table
|
|
lui $t3, %hi(\def_table)
|
|
ins $t3, $a1, 2, 5
|
|
lw $t0, %lo(\def_table)($t3)
|
|
lui $t2, %hi(\table)
|
|
ins $t2, $a0, 2, 3
|
|
sw $t0, %lo(\table)($t2)
|
|
.endm
|
|
|
|
PicoWriteRomHW_SSF2: # u32 a, u32 d
|
|
ext $a0, $a0, 1, 3
|
|
bnez $a0, pwr_banking
|
|
|
|
# sram register
|
|
lui $t0, %hi(Pico+0x22211)
|
|
lb $t1, %lo(Pico+0x22211)($t0) # Pico.m.sram_reg
|
|
ins $t1, $a1, 0, 2
|
|
jr $ra
|
|
sb $t1, %lo(Pico+0x22211)($t0)
|
|
|
|
pwr_banking:
|
|
andi $a1, 0x1f
|
|
|
|
PicoWriteRomHW_SSF2_ls m_read8_def_table m_read8_table
|
|
PicoWriteRomHW_SSF2_ls m_read16_def_table m_read16_table
|
|
PicoWriteRomHW_SSF2_ls m_read32_def_table m_read32_table
|
|
|
|
jr $ra
|
|
nop
|
|
|
|
# vim:filetype=mips
|