diff options
Diffstat (limited to 'psp')
-rw-r--r-- | psp/mips_stub.S | 297 |
1 files changed, 2 insertions, 295 deletions
diff --git a/psp/mips_stub.S b/psp/mips_stub.S index 7ca985c..031e4b5 100644 --- a/psp/mips_stub.S +++ b/psp/mips_stub.S @@ -2471,12 +2471,6 @@ patch_store_u32a: patch_handler store_u32a_ftable, 0x0F -# General ext memory routines - -ext_store_ignore: - jr $ra # ignore these writes - nop - write_io_epilogue: beq $2, $0, no_alert # 0 means nothing happened addiu $4, $2, -2 # see if return value is 2 (delay slot) @@ -2487,6 +2481,8 @@ write_io_epilogue: nop collapse_flags # make sure flags are good for update_gba + + alert_loop: jal update_gba # process the next event nop @@ -2518,295 +2514,6 @@ smc_dma: j lookup_pc nop - -ext_store_eeprom: - addiu $sp, $sp, -4 # make room on the stack for $ra - sw $ra, ($sp) - save_registers - jal write_eeprom # write the value out - sw $6, REG_PC($16) # save the PC (delay slot) - restore_registers - lw $ra, ($sp) # restore return address - jr $ra # we can return - addiu $sp, $sp, 4 # fix the stack - - -# 8bit ext memory routines - -ext_store_io8: - andi $5, $5, 0xFF # make value 8bit - andi $4, $4, 0x3FF # wrap around address - addiu $sp, $sp, -4 # make room on the stack for $ra - sw $ra, ($sp) - save_registers - jal write_io_register8 # write the value out - sw $6, REG_PC($16) # save the PC (delay slot) - j write_io_epilogue # handle any state changes - nop - -ext_store_palette8: - j ext_store_palette16b # perform 16bit palette write - andi $4, $4, 0x3FE # wrap + align (delay) - -ext_store_vram8: - ins $5, $5, 8, 8 # value = (value << 8) | value - ext $4, $4, 0, 17 # address = adress & 0x1FFFF - ins $4, $0, 0, 1 # align out bottom bit - lui $1, %hi(0x18000) # $1 = 0x18000 - sltu $1, $4, $1 # see if address < 0x18000 - bne $1, $0, ext_store_vram8b - lui $2, %hi(vram) # start loading vram address (delay) - - addiu $4, $4, -0x8000 # move address into VRAM region - -ext_store_vram8b: - addu $2, $2, $4 # $2 = (hi)vram + address - jr $ra # return - sh $5, %lo(vram)($2) # vram[address] = value (delay) - -ext_store_oam8: - lui $1, %hi(oam_update) # $1 = oam_update - addiu $1, %lo(oam_update) - li $2, 1 # $2 = 1 - sw $2, ($1) # *oam_update = 1 - andi $4, $4, 0x3FE # wrap around address and align to 16bits - ins $5, $5, 8, 8 # value = (value << 8) | value - lui $1, %hi(oam_ram) # $1 = (hi)oam_ram - addu $1, $1, $4 # $1 = (hi)oam_ram + address - jr $ra # return - sh $5, %lo(oam_ram)($1) # oam_ram[address] = value (delay) - -ext_store_backup: - andi $5, $5, 0xFF # make value 8bit - andi $4, $4, 0xFFFF # mask value - addiu $sp, $sp, -4 # make room on the stack for $ra - sw $ra, ($sp) - save_registers - jal write_backup # write the value out - sw $6, REG_PC($16) # save the PC (delay slot) - restore_registers - lw $ra, ($sp) # restore return address - jr $ra # we can return - addiu $sp, $sp, 4 # fix the stack - -ext_store_u8_jtable: - .long ext_store_ignore # 0x00 BIOS - .long ext_store_ignore # 0x01 invalid - .long ext_store_ignore # 0x02 EWRAM - .long ext_store_ignore # 0x03 IWRAM - .long ext_store_io8 # 0x04 I/O registers - .long ext_store_palette8 # 0x05 Palette RAM - .long ext_store_vram8 # 0x06 VRAM - .long ext_store_oam8 # 0x07 OAM RAM - .long ext_store_ignore # 0x08 gamepak (no RTC accepted in 8bit) - .long ext_store_ignore # 0x09 gamepak, ignore - .long ext_store_ignore # 0x0A gamepak, ignore - .long ext_store_ignore # 0x0B gamepak, ignore - .long ext_store_ignore # 0x0C gamepak, ignore - .long ext_store_eeprom # 0x0D EEPROM (possibly) - .long ext_store_backup # 0x0E Flash ROM/SRAM - .long ext_store_ignore # 0x0F invalid - - -# 16bit ext memory routines - -ext_store_io16: - andi $4, $4, 0x3FF # wrap around address - andi $5, $5, 0xFFFF # make value 16bit - addiu $sp, $sp, -4 # make room on the stack for $ra - sw $ra, ($sp) - save_registers - jal write_io_register16 # write the value out - sw $6, REG_PC($16) # save the PC (delay slot) - j write_io_epilogue # handle any state changes - nop - -ext_store_palette16: - andi $4, 0x3FF # wrap address - -ext_store_palette16b: - lui $2, %hi(palette_ram) - addu $2, $2, $4 - sh $5, %lo(palette_ram)($2) # palette_ram[address] = value - sll $1, $5, 1 # make green 6bits - ins $1, $0, 0, 6 # make bottom bit 0 - ins $1, $5, 0, 5 # insert red channel into $1 - lui $2, %hi(palette_ram_converted) - addu $2, $2, $4 - jr $ra # return - sh $1, %lo(palette_ram_converted)($2) - -ext_store_vram16: - ext $4, $4, 0, 17 # address = adress & 0x1FFFF - lui $1, %hi(0x18000) # $1 = 0x18000 - sltu $1, $4, $1 # see if address < 0x18000 - bne $1, $0, ext_store_vram16b - lui $2, %hi(vram) # start loading vram address (delay) - - addiu $4, $4, -0x8000 # move address into VRAM region - -ext_store_vram16b: - addu $2, $2, $4 # $2 = (hi)vram + address - jr $ra # return - sh $5, %lo(vram)($2) # vram[address] = value (delay) - -ext_store_oam16: - lui $1, %hi(oam_update) # $1 = oam_update - addiu $1, %lo(oam_update) - li $2, 1 # $2 = 1 - sw $2, ($1) # *oam_update = 1 - andi $4, $4, 0x3FF # wrap around address - lui $1, %hi(oam_ram) # $1 = (hi)oam_ram - addu $1, $1, $4 # $1 = (hi)oam_ram + address - jr $ra # return - sh $5, %lo(oam_ram)($1) # oam_ram[address] = value (delay) - -ext_store_rtc: - andi $5, $5, 0xFFFF # make value 16bit - addiu $sp, $sp, -4 # make room on the stack for $ra - sw $ra, ($sp) - save_registers - jal write_rtc # write the value out - sw $6, REG_PC($16) # save the PC (delay slot) - restore_registers - lw $ra, ($sp) # restore return address - jr $ra # we can return - addiu $sp, $sp, 4 # fix the stack - -ext_store_u16_jtable: - .long ext_store_ignore # 0x00 BIOS, ignore - .long ext_store_ignore # 0x01 invalid, ignore - .long ext_store_ignore # 0x02 EWRAM, should have been hit already - .long ext_store_ignore # 0x03 IWRAM, should have been hit already - .long ext_store_io16 # 0x04 I/O registers - .long ext_store_palette16 # 0x05 Palette RAM - .long ext_store_vram16 # 0x06 VRAM - .long ext_store_oam16 # 0x07 OAM RAM - .long ext_store_rtc # 0x08 gamepak, RTC - .long ext_store_ignore # 0x09 gamepak, ignore - .long ext_store_ignore # 0x0A gamepak, ignore - .long ext_store_ignore # 0x0B gamepak, ignore - .long ext_store_ignore # 0x0C gamepak, ignore - .long ext_store_eeprom # 0x0D EEPROM (possibly) - .long ext_store_ignore # 0x0E Flash ROM/SRAM - - - - -# 32bit ext memory routines - -ext_store_io32: - andi $4, $4, 0x3FF # wrap around address - addiu $sp, $sp, -4 # make room on the stack for $ra - sw $ra, ($sp) - save_registers - jal write_io_register32 # write the value out - sw $6, REG_PC($16) # save the PC (delay slot) - j write_io_epilogue # handle any state changes - nop - -ext_store_palette32: - addu $6, $ra, $0 # save return address in $6 - jal ext_store_palette16b # write out palette entry - andi $4, 0x3FF # wrap address (delay) - addiu $4, $4, 2 # go to next location - srl $5, $5, 16 # shift to next 16bit value - j ext_store_palette16b # write out next palette entry - addu $ra, $6, $0 # restore return address (delay) - -ext_store_vram32: - ext $4, $4, 0, 17 # address = adress & 0x1FFFF - lui $1, %hi(0x18000) # $1 = 0x18000 - sltu $1, $4, $1 # see if address < 0x18000 - bne $1, $0, ext_store_vram32b - lui $2, %hi(vram) # start loading vram address (delay) - - addiu $4, $4, -0x8000 # move address into VRAM region - -ext_store_vram32b: - addu $2, $2, $4 # $2 = (hi)vram + address - jr $ra # return - sw $5, %lo(vram)($2) # vram[address] = value (delay) - -ext_store_oam32: - lui $1, %hi(oam_update) # $1 = oam_update - addiu $1, %lo(oam_update) - li $2, 1 # $2 = 1 - sw $2, ($1) # *oam_update = 1 - andi $4, $4, 0x3FF # wrap around address - lui $1, %hi(oam_ram) # $1 = (hi)oam_ram - addu $1, $1, $4 # $1 = (hi)oam_ram + address - jr $ra # return - sw $5, %lo(oam_ram)($1) # oam_ram[address] = value (delay) - -ext_store_u32_jtable: - .long ext_store_ignore # 0x00 BIOS, ignore - .long ext_store_ignore # 0x01 invalid, ignore - .long ext_store_ignore # 0x02 EWRAM, should have been hit already - .long ext_store_ignore # 0x03 IWRAM, should have been hit already - .long ext_store_io32 # 0x04 I/O registers - .long ext_store_palette32 # 0x05 Palette RAM - .long ext_store_vram32 # 0x06 VRAM - .long ext_store_oam32 # 0x07 OAM RAM - .long ext_store_ignore # 0x08 gamepak, ignore - .long ext_store_ignore # 0x09 gamepak, ignore - .long ext_store_ignore # 0x0A gamepak, ignore - .long ext_store_ignore # 0x0B gamepak, ignore - .long ext_store_ignore # 0x0C gamepak, ignore - .long ext_store_eeprom # 0x0D EEPROM (possibly) - .long ext_store_ignore # 0x0E Flash ROM/SRAM - -ext_store_u32: - srl $1, $4, 24 # $1 = address >> 24 - sltu $2, $1, 16 # check if the value is out of range - beq $2, $0, ext_store_ignore - sll $1, $1, 2 # make address word indexed (delay) - lui $2, %hi(ext_store_u32_jtable) - addu $2, $2, $1 - # $2 = ext_store_u32_jtable[address >> 24] - lw $2, %lo(ext_store_u32_jtable)($2) - jr $2 # jump to table location - nop - -# 32bit ext aligned, non a2 destroying routines - -ext_store_io32a: - andi $4, $4, 0x3FF # wrap around address - addiu $sp, $sp, -4 # make room on the stack for $ra - sw $ra, ($sp) - save_registers - jal write_io_register32 # write the value out - sw $6, REG_SAVE($16) # save a2 - lw $6, REG_SAVE($16) # restore a2 - j write_io_epilogue # handle any state changes - nop - -ext_store_palette32a: - sw $ra, REG_SAVE($16) # save return address - jal ext_store_palette16b # write out palette entry - andi $4, 0x3FF # wrap address (delay) - addiu $4, $4, 2 # go to next location - srl $5, $5, 16 # shift to next 16bit value - j ext_store_palette16b # write out next palette entry - lw $ra, REG_SAVE($16) # restore return address (delay) - -ext_store_u32a_jtable: - .long ext_store_ignore # 0x00 BIOS, ignore - .long ext_store_ignore # 0x01 invalid, ignore - .long ext_store_ignore # 0x02 EWRAM, should have been hit already - .long ext_store_ignore # 0x03 IWRAM, should have been hit already - .long ext_store_io32a # 0x04 I/O registers - .long ext_store_palette32a # 0x05 Palette RAM - .long ext_store_vram32 # 0x06 VRAM - .long ext_store_oam32 # 0x07 OAM RAM - .long ext_store_ignore # 0x08 gamepak, ignore - .long ext_store_ignore # 0x09 gamepak, ignore - .long ext_store_ignore # 0x0A gamepak, ignore - .long ext_store_ignore # 0x0B gamepak, ignore - .long ext_store_ignore # 0x0C gamepak, ignore - .long ext_store_ignore # 0x0D EEPROM (nothing will write this) - .long ext_store_ignore # 0x0E Flash ROM/SRAM - smc_write: save_registers jal flush_translation_cache_ram # flush translation cache |