picodrive/pico/memory_amips.s
notaz cff531af94 clarify PicoDrive's license
- 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.
2013-06-26 03:07:07 +03:00

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