From 3ec29f016cdeb3100dbb433dd9041e81542765bd Mon Sep 17 00:00:00 2001 From: notaz Date: Thu, 1 Nov 2007 19:24:13 +0000 Subject: [PATCH] psp memhandlers, vsync, stuff git-svn-id: file:///home/notaz/opt/svn/PicoDrive@289 be3aeb3a-fb24-0410-a615-afba39da0efa --- Pico/Memory.c | 3 +- Pico/Memory.s | 11 +- Pico/MemoryCmn.c | 4 +- Pico/Memory_amips.s | 761 +++++++++++++++++++++++++++++++++++++ Pico/cd/Pico.c | 4 +- Pico/sound/sound.c | 4 +- platform/common/emu.h | 1 + platform/common/menu.h | 1 + platform/gizmondo/Makefile | 2 +- platform/gizmondo/menu.c | 2 +- platform/gp2x/Makefile | 2 +- platform/gp2x/menu.c | 2 +- platform/psp/Makefile | 22 +- platform/psp/data/icon.png | Bin 0 -> 19571 bytes platform/psp/emu.c | 27 +- platform/psp/menu.c | 30 +- 16 files changed, 836 insertions(+), 40 deletions(-) create mode 100644 Pico/Memory_amips.s create mode 100644 platform/psp/data/icon.png diff --git a/Pico/Memory.c b/Pico/Memory.c index 2b86924..26be012 100644 --- a/Pico/Memory.c +++ b/Pico/Memory.c @@ -28,7 +28,6 @@ u32 PicoRead8(u32 a); u32 PicoRead16(u32 a); void PicoWrite8(u32 a,u8 d); void PicoWriteRomHW_SSF2(u32 a,u32 d); -void PicoWriteRomHW_in1 (u32 a,u32 d); #endif @@ -424,7 +423,7 @@ end: // ----------------------------------------------------------------- // Write Ram -#ifndef _ASM_MEMORY_C +#if !defined(_ASM_MEMORY_C) || defined(_ASM_MEMORY_C_AMIPS) PICO_INTERNAL_ASM void PicoWrite8(u32 a,u8 d) { #ifdef __debug_io diff --git a/Pico/Memory.s b/Pico/Memory.s index 93c503d..732e6b8 100644 --- a/Pico/Memory.s +++ b/Pico/Memory.s @@ -10,6 +10,7 @@ .include "port_config.s" .text +.align 4 @ default jump tables @@ -119,6 +120,7 @@ m_read32_def_table: @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ .bss +.align 4 @.section .bss, "brw" @.data @@ -136,6 +138,7 @@ m_read32_table: @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ .text +.align 4 .global PicoMemReset .global PicoRead8 @@ -184,7 +187,7 @@ PicoMemReset: @ update memhandlers according to ROM size ldr r1, =m_read8_above_rom ldr r0, =m_read8_table - mov r2, #16 + mov r2, #20 1: sub r2, r2, #1 cmp r2, r12 @@ -196,7 +199,7 @@ PicoMemReset: 2: ldr r1, =m_read16_above_rom ldr r0, =m_read16_table - mov r2, #16 + mov r2, #20 1: sub r2, r2, #1 cmp r2, r12 @@ -208,7 +211,7 @@ PicoMemReset: 2: ldr r1, =m_read32_above_rom ldr r0, =m_read32_table - mov r2, #16 + mov r2, #20 1: sub r2, r2, #1 cmp r2, r12 @@ -653,7 +656,7 @@ m_read32_rom4: @ 0x200000 - 0x27ffff, SRAM area (does any game do long reads?) add r0, r1, #2 bl SRAMRead ldmfd sp!,{r1,lr} - orr r0, r1, r0, lsl #16 + orr r0, r0, r1, lsl #16 orr r0, r0, r0, lsl #8 bx lr m_read32_nosram: diff --git a/Pico/MemoryCmn.c b/Pico/MemoryCmn.c index 219a094..f31a11e 100644 --- a/Pico/MemoryCmn.c +++ b/Pico/MemoryCmn.c @@ -168,7 +168,7 @@ static #endif void OtherWrite8(u32 a,u32 d) { -#ifndef _ASM_MEMORY_C +#if !defined(_ASM_MEMORY_C) || defined(_ASM_MEMORY_C_AMIPS) if ((a&0xe700f9)==0xc00011||(a&0xff7ff9)==0xa07f11) { if(PicoOpt&2) SN76496Write(d); return; } // PSG Sound if ((a&0xff4000)==0xa00000) { if(!(Pico.m.z80Run&1)) Pico.zram[a&0x1fff]=(u8)d; return; } // Z80 ram if ((a&0xff6000)==0xa04000) { if(PicoOpt&1) emustatus|=YM2612Write(a&3, d)&1; return; } // FM Sound @@ -180,7 +180,7 @@ void OtherWrite8(u32 a,u32 d) if(!(d&1)) z80_reset(); return; } -#ifndef _ASM_MEMORY_C +#if !defined(_ASM_MEMORY_C) || defined(_ASM_MEMORY_C_AMIPS) if ((a&0xff7f00)==0xa06000) // Z80 BANK register { Pico.m.z80_bank68k>>=1; diff --git a/Pico/Memory_amips.s b/Pico/Memory_amips.s new file mode 100644 index 0000000..0fab4f4 --- /dev/null +++ b/Pico/Memory_amips.s @@ -0,0 +1,761 @@ +# vim:filetype=mips + +# memory handlers with banking support for SSF II - The New Challengers +# mostly based on Gens code + +# (c) Copyright 2007, Grazvydas "notaz" Ignotas +# All Rights Reserved + + +.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 + addiu $sp, -4 + jal SRAMRead + sw $ra, 0($sp) + lw $ra, 0($sp) + addiu $sp, 4 + jr $ra + ins $v0, $v0, 8, 8 +.else + addiu $sp, -8 + sw $a0, 4($sp) + jal SRAMRead + sw $ra, 0($sp) + lw $a0, 4($sp) + sw $v0, 4($sp) + jal SRAMRead + 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 +.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 + + lui $t0, %hi(PicoOpt) + lw $t0, %lo(PicoOpt)($t0) + andi $t0, 1 + beqz $t0, m_read8_fake_ym2612 + lui $t0, %hi(Pico+0x22208) + j YM2612Read_ + 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 + andi $t0, $a0, 1 + beqz $t0, 1f + li $a1, 8 # not always needed, but shouln't cause problems + j \funcname # odd address + nop +1: + addiu $sp, -4 + sw $ra, 0($sp) + jal \funcname + 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 + m_read8_call16 PicoVideoRead + +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 OtherRead16End + +# ############################################################################# + +.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 + j OtherRead16End + 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 + m_read32_call16 OtherRead16End + +# ############################################################################# + +.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 + diff --git a/Pico/cd/Pico.c b/Pico/cd/Pico.c index def0a41..92dfe85 100644 --- a/Pico/cd/Pico.c +++ b/Pico/cd/Pico.c @@ -87,7 +87,7 @@ static __inline void SekRunM68k(int cyc) { int cyc_do; SekCycleAim+=cyc; - if((cyc_do=SekCycleAim-SekCycleCnt) < 0) return; + if ((cyc_do=SekCycleAim-SekCycleCnt) <= 0) return; #if defined(EMU_C68K) PicoCpuCM68k.cycles=cyc_do; CycloneRun(&PicoCpuCM68k); @@ -105,7 +105,7 @@ static __inline void SekRunS68k(int cyc) { int cyc_do; SekCycleAimS68k+=cyc; - if((cyc_do=SekCycleAimS68k-SekCycleCntS68k) < 0) return; + if ((cyc_do=SekCycleAimS68k-SekCycleCntS68k) <= 0) return; #if defined(EMU_C68K) PicoCpuCS68k.cycles=cyc_do; CycloneRun(&PicoCpuCS68k); diff --git a/Pico/sound/sound.c b/Pico/sound/sound.c index aa2acb2..68106bc 100644 --- a/Pico/sound/sound.c +++ b/Pico/sound/sound.c @@ -254,9 +254,9 @@ PICO_INTERNAL int PsndRender(int offset, int length) SN76496Update(PsndOut+offset, length, stereo); // Add in the stereo FM buffer - if (PicoOpt & 1) + if (PicoOpt & 1) { buf32_updated = YM2612UpdateOne(buf32, length, stereo, 1); - else + } else memset32(buf32, 0, length<, 16_bit_mode // craigix_ram, confirm_save, show_cd_leds, confirm_load // A_SNs_gamma, perfect_vsync, giz_scanlines, giz_dblbuff + // vsync_mode int PicoOpt; // used for config saving only, see Pico.h int PsndRate; // ditto int PicoRegion; // ditto diff --git a/platform/common/menu.h b/platform/common/menu.h index cd7fa44..2635967 100644 --- a/platform/common/menu.h +++ b/platform/common/menu.h @@ -70,6 +70,7 @@ typedef enum MA_OPT3_PRES_NOSCALE, MA_OPT3_PRES_FULLSCR, MA_OPT3_FILTERING, + MA_OPT3_VSYNC, MA_OPT3_DONE, MA_CDOPT_TESTBIOS_USA, MA_CDOPT_TESTBIOS_EUR, diff --git a/platform/gizmondo/Makefile b/platform/gizmondo/Makefile index 6581e4f..e756fda 100644 --- a/platform/gizmondo/Makefile +++ b/platform/gizmondo/Makefile @@ -14,7 +14,7 @@ amalgamate = 0 -DEFINC = -I../.. -I. -D__GIZ__ -D_UNZIP_SUPPORT -DNO_SYNC +DEFINC = -I../.. -I. -D__GIZ__ -DNO_SYNC COPT_COMMON = -Wall -Winline ifeq ($(DEBUG),) COPT_COMMON += -O2 -ftracer -fomit-frame-pointer -fstrict-aliasing -ffast-math diff --git a/platform/gizmondo/menu.c b/platform/gizmondo/menu.c index 6e501a8..6fc189d 100644 --- a/platform/gizmondo/menu.c +++ b/platform/gizmondo/menu.c @@ -1357,7 +1357,7 @@ static void draw_menu_credits(void) y = tl_y; text_out16(tl_x, y, "Credits:"); - text_out16(tl_x, (y+=10), "Dave: Cyclone 68000 core,"); + text_out16(tl_x, (y+=10), "fDave: Cyclone 68000 core,"); text_out16(tl_x, (y+=10), " base code of PicoDrive"); text_out16(tl_x, (y+=10), "Reesy & FluBBa: DrZ80 core"); text_out16(tl_x, (y+=10), "MAME devs: YM2612 and SN76496 cores"); diff --git a/platform/gp2x/Makefile b/platform/gp2x/Makefile index 595db53..0e2ffe4 100644 --- a/platform/gp2x/Makefile +++ b/platform/gp2x/Makefile @@ -31,7 +31,7 @@ else use_cyclone = 1 endif -DEFINC = -I../.. -I. -DARM -D__GP2X__ -D_UNZIP_SUPPORT # -DBENCHMARK +DEFINC = -I../.. -I. -DARM -D__GP2X__ # -DBENCHMARK COPT_COMMON = -static -Wall -Winline ifeq ($(DEBUG),) COPT_COMMON += -O2 -ftracer -fstrength-reduce -fomit-frame-pointer -fstrict-aliasing -ffast-math diff --git a/platform/gp2x/menu.c b/platform/gp2x/menu.c index a60e4d8..7dd2e58 100644 --- a/platform/gp2x/menu.c +++ b/platform/gp2x/menu.c @@ -1394,7 +1394,7 @@ static void draw_menu_credits(void) text_out16(tl_x, 20, "PicoDrive v" VERSION " (c) notaz, 2006,2007"); y = tl_y; text_out16(tl_x, y, "Credits:"); - text_out16(tl_x, (y+=10), "Dave: Cyclone 68000 core,"); + text_out16(tl_x, (y+=10), "fDave: Cyclone 68000 core,"); text_out16(tl_x, (y+=10), " base code of PicoDrive"); text_out16(tl_x, (y+=10), "Reesy & FluBBa: DrZ80 core"); text_out16(tl_x, (y+=10), "MAME devs: YM2612 and SN76496 cores"); diff --git a/platform/psp/Makefile b/platform/psp/Makefile index aecad36..49f9f7b 100644 --- a/platform/psp/Makefile +++ b/platform/psp/Makefile @@ -10,7 +10,7 @@ amalgamate = 0 #up = 1 -CFLAGS += -I../.. -I. -D_UNZIP_SUPPORT -DNO_SYNC -D_ASM_DRAW_C_MIPS # -DBENCHMARK +CFLAGS += -I../.. -I. -DNO_SYNC CFLAGS += -Wall -Winline -G0 ifeq ($(DEBUG),) CFLAGS += -O2 -ftracer -fstrength-reduce -ffast-math @@ -37,7 +37,7 @@ OBJS += ../../PicoAll.o else OBJS += ../../Pico/Area.o ../../Pico/Cart.o ../../Pico/Memory.o ../../Pico/Misc.o \ ../../Pico/Pico.o ../../Pico/Sek.o ../../Pico/VideoPort.o ../../Pico/Draw2.o ../../Pico/Draw.o \ - ../../Pico/Patch.o ../../Pico/Draw_amips.o + ../../Pico/Patch.o ../../Pico/Draw_amips.o ../../Pico/Memory_amips.o # Pico - CD OBJS += ../../Pico/cd/Pico.o ../../Pico/cd/Memory.o ../../Pico/cd/Sek.o ../../Pico/cd/LC89510.o \ ../../Pico/cd/cd_sys.o ../../Pico/cd/cd_file.o ../../Pico/cd/gfx_cd.o \ @@ -82,7 +82,7 @@ LIBS += -lpng -lm -lpspgu -lpsppower -Wl,-Map=PicoDrive.map -lpspaudio TARGET = PicoDrive EXTRA_TARGETS = EBOOT.PBP PSP_EBOOT_TITLE = PICODRIVE -#PSP_EBOOT_ICON = .png +PSP_EBOOT_ICON = data/icon.png #PSP_EBOOT_PIC1 = .png CUSTOM_CLEAN = myclean @@ -103,16 +103,24 @@ AS := psp-as ../../cpu/musashi/m68kops.c : make -C ../../cpu/musashi +../../cpu/fame/famec.o : ../../cpu/fame/famec.c + @echo ">>>" $< + $(CC) $(CFLAGS) -Wno-unused -c $< -o $@ + +../../Pico/Memory.o : ../../Pico/Memory.c + @echo ">>>" $< + $(CC) $(CFLAGS) -c $< -o $@ -D_ASM_MEMORY_C -D_ASM_MEMORY_C_AMIPS + +../../Pico/Draw.o : ../../Pico/Draw.c + @echo ">>>" $< + $(CC) $(CFLAGS) -c $< -o $@ -D_ASM_DRAW_C_MIPS + readme.txt: ../../tools/textfilter ../base_readme.txt ../../tools/textfilter ../base_readme.txt $@ PSP ../../tools/textfilter: ../../tools/textfilter.c make -C ../../tools/ textfilter -../../cpu/fame/famec.o : ../../cpu/fame/famec.c - @echo ">>>" $< - $(CC) $(CFLAGS) -Wno-unused -c $< -o $@ - data/bg32.o: data/bg32.bin bin2o -i $< $@ bgdatac32 diff --git a/platform/psp/data/icon.png b/platform/psp/data/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..757a40b4dda3291b28e2753f4da1d38f7c4d1d1b GIT binary patch literal 19571 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 ikNVmx_}cT8JpT(Q=ou!dfb_cn0000 lim_time); + if (currentConfig.Frameskip < 0 && tval_diff - lim_time >= (300000<<8)) // slowdown detection reset_timing = 1; else if (PsndOut != NULL || currentConfig.Frameskip < 0) diff --git a/platform/psp/menu.c b/platform/psp/menu.c index 32c4115..2231d95 100644 --- a/platform/psp/menu.c +++ b/platform/psp/menu.c @@ -962,6 +962,7 @@ menu_entry opt3_entries[] = { NULL, MB_NONE, MA_OPT3_HSCALE32, NULL, 0, 0, 0, 1 }, { NULL, MB_NONE, MA_OPT3_HSCALE40, NULL, 0, 0, 0, 1 }, { NULL, MB_ONOFF, MA_OPT3_FILTERING, ¤tConfig.scaling, 1, 0, 0, 1 }, + { NULL, MB_NONE, MA_OPT3_VSYNC, NULL, 0, 0, 0, 1 }, { "Set to unscaled centered", MB_NONE, MA_OPT3_PRES_NOSCALE, NULL, 0, 0, 0, 1 }, { "Set to fullscreen", MB_NONE, MA_OPT3_PRES_FULLSCR, NULL, 0, 0, 0, 1 }, { "done", MB_NONE, MA_OPT3_DONE, NULL, 0, 0, 0, 1 }, @@ -986,6 +987,13 @@ static void menu_opt3_cust_draw(const menu_entry *entry, int x, int y, void *par case MA_OPT3_FILTERING: text_out16(x, y, "Bilinear filtering %s", currentConfig.scaling?"ON":"OFF"); break; + case MA_OPT3_VSYNC: { + char *val = " never"; + if (currentConfig.EmuOpt & 0x2000) + val = (currentConfig.EmuOpt & 0x10000) ? "sometimes" : " always"; + text_out16(x, y, "Wait for vsync %s", val); + break; + } default: break; } } @@ -1023,11 +1031,11 @@ static void menu_opt3_preview(int is_32col) static void draw_dispmenu_options(int menu_sel) { - int tl_x = 80+25, tl_y = 16+50; + int tl_x = 80, tl_y = 16+50; menu_draw_begin(); - menu_draw_selection(tl_x - 16, tl_y + menu_sel*10, 252); + menu_draw_selection(tl_x - 16, tl_y + menu_sel*10, 316); me_draw(opt3_entries, OPT3_ENTRY_COUNT, tl_x, tl_y, menu_opt3_cust_draw, NULL); @@ -1043,7 +1051,7 @@ static void dispmenu_loop_options(void) menu_sel_max = me_count_enabled(opt3_entries, OPT3_ENTRY_COUNT) - 1; - for(;;) + for (;;) { draw_dispmenu_options(menu_sel); inp = wait_for_input(BTN_UP|BTN_DOWN|BTN_LEFT|BTN_RIGHT|BTN_X|BTN_CIRCLE); @@ -1056,12 +1064,19 @@ static void dispmenu_loop_options(void) if (inp & (BTN_LEFT|BTN_RIGHT)) // multi choise { float *setting = NULL; + int tmp; me_process(opt3_entries, OPT3_ENTRY_COUNT, selected_id, (inp&BTN_RIGHT) ? 1 : 0); switch (selected_id) { case MA_OPT3_SCALE: setting = ¤tConfig.scale; break; case MA_OPT3_HSCALE40: setting = ¤tConfig.hscale40; is_32col = 0; break; case MA_OPT3_HSCALE32: setting = ¤tConfig.hscale32; is_32col = 1; break; case MA_OPT3_FILTERING:menu_opt3_preview(is_32col); break; + case MA_OPT3_VSYNC: tmp = ((currentConfig.EmuOpt>>13)&1) | ((currentConfig.EmuOpt>>15)&2); + tmp = (inp & BTN_LEFT) ? (tmp>>1) : ((tmp<<1)|1); + if (tmp > 3) tmp = 3; + currentConfig.EmuOpt &= ~0x12000; + currentConfig.EmuOpt |= ((tmp&2)<<15) | ((tmp&1)<<13); + break; default: break; } if (setting != NULL) { @@ -1462,12 +1477,15 @@ static void draw_menu_credits(void) y = tl_y; text_out16(tl_x, y, "Credits:"); - text_out16(tl_x, (y+=10), "Dave: base code of PicoDrive"); + text_out16(tl_x, (y+=10), "fDave: base code of PicoDrive"); + text_out16(tl_x, (y+=10), "Chui: Fame/C"); + text_out16(tl_x, (y+=10), "NJ: CZ80"); text_out16(tl_x, (y+=10), "MAME devs: YM2612 and SN76496 cores"); - text_out16(tl_x, (y+=10), "Charles MacDonald: Genesis hw docs"); text_out16(tl_x, (y+=10), "Stephane Dallongeville:"); - text_out16(tl_x, (y+=10), " opensource Gens"); + text_out16(tl_x, (y+=10), " Gens code, base of Fame/C, CZ80"); + text_out16(tl_x, (y+=10), "Charles MacDonald: Genesis hw docs"); text_out16(tl_x, (y+=10), "Haze: Genesis hw info"); + text_out16(tl_x, (y+=10), "ps2dev.org people: PSP SDK/code"); text_out16(tl_x, (y+=10), "ketchupgun: skin design"); menu_draw_end(); -- 2.39.2