From c48ddc8b433cbeac669834a0b9e2f89d8e3fee48 Mon Sep 17 00:00:00 2001 From: Chris Moeller Date: Sun, 19 Apr 2015 22:32:04 -0700 Subject: [PATCH] Added lazyusf region detection from save states --- Frameworks/lazyusf/lazyusf/main/rom.c | 61 +++++++++++++++++++- Frameworks/lazyusf/lazyusf/main/rom.h | 1 + Frameworks/lazyusf/lazyusf/main/savestates.c | 2 + 3 files changed, 61 insertions(+), 3 deletions(-) diff --git a/Frameworks/lazyusf/lazyusf/main/rom.c b/Frameworks/lazyusf/lazyusf/main/rom.c index ca1cebadc..f46f96378 100644 --- a/Frameworks/lazyusf/lazyusf/main/rom.c +++ b/Frameworks/lazyusf/lazyusf/main/rom.c @@ -49,16 +49,71 @@ static m64p_system_type rom_country_code_to_system_type(unsigned short country_c static int rom_system_type_to_ai_dac_rate(m64p_system_type system_type); static int rom_system_type_to_vi_limit(m64p_system_type system_type); +static int is_valid_rom(const unsigned char *buffer) +{ + /* Test if rom is a native .z64 image with header 0x80371240. [ABCD] */ + if((buffer[0]==0x80)&&(buffer[1]==0x37)&&(buffer[2]==0x12)&&(buffer[3]==0x40)) + return 1; + /* Test if rom is a byteswapped .v64 image with header 0x37804012. [BADC] */ + else if((buffer[0]==0x37)&&(buffer[1]==0x80)&&(buffer[2]==0x40)&&(buffer[3]==0x12)) + return 1; + /* Test if rom is a wordswapped .n64 image with header 0x40123780. [DCBA] */ + else if((buffer[0]==0x40)&&(buffer[1]==0x12)&&(buffer[2]==0x37)&&(buffer[3]==0x80)) + return 1; + else + return 0; +} + +static void swap_rom(const unsigned char* signature, unsigned char* localrom, int loadlength) +{ + unsigned char temp; + int i; + + /* Btyeswap if .v64 image. */ + if(signature[0]==0x37) + { + for (i = 0; i < loadlength; i+=2) + { + temp=localrom[i]; + localrom[i]=localrom[i+1]; + localrom[i+1]=temp; + } + } + /* Wordswap if .n64 image. */ + else if(signature[0]==0x40) + { + for (i = 0; i < loadlength; i+=4) + { + temp=localrom[i]; + localrom[i]=localrom[i+3]; + localrom[i+3]=temp; + temp=localrom[i+1]; + localrom[i+1]=localrom[i+2]; + localrom[i+2]=temp; + } + } +} + m64p_error open_rom(usf_state_t * state) { - if (state->g_rom_size >= sizeof(m64p_rom_header)) - memcpy(&state->ROM_HEADER, state->g_rom, sizeof(m64p_rom_header)); + return open_rom_header(state, state->g_rom, state->g_rom_size); +} + +m64p_error open_rom_header(usf_state_t * state, unsigned char * header, int header_size) +{ + if (header_size >= sizeof(m64p_rom_header)) + memcpy(&state->ROM_HEADER, header, sizeof(m64p_rom_header)); + + if (is_valid_rom((const unsigned char *)&state->ROM_HEADER)) + swap_rom((const unsigned char *)&state->ROM_HEADER, (unsigned char *)&state->ROM_HEADER, sizeof(m64p_rom_header)); /* add some useful properties to ROM_PARAMS */ - state->ROM_PARAMS.systemtype = SYSTEM_NTSC /*rom_country_code_to_system_type(ROM_HEADER.Country_code)*/; + state->ROM_PARAMS.systemtype = rom_country_code_to_system_type(state->ROM_HEADER.Country_code); state->ROM_PARAMS.vilimit = rom_system_type_to_vi_limit(state->ROM_PARAMS.systemtype); state->ROM_PARAMS.aidacrate = rom_system_type_to_ai_dac_rate(state->ROM_PARAMS.systemtype); state->ROM_PARAMS.countperop = COUNT_PER_OP_DEFAULT; + + state->g_rdram[0x300/4] = state->ROM_PARAMS.systemtype; return M64ERR_SUCCESS; } diff --git a/Frameworks/lazyusf/lazyusf/main/rom.h b/Frameworks/lazyusf/lazyusf/main/rom.h index 280b9c62c..8a80f763c 100644 --- a/Frameworks/lazyusf/lazyusf/main/rom.h +++ b/Frameworks/lazyusf/lazyusf/main/rom.h @@ -37,6 +37,7 @@ /* ROM Loading and Saving functions */ m64p_error open_rom(usf_state_t *); +m64p_error open_rom_header(usf_state_t *, unsigned char * header, int header_size); m64p_error close_rom(usf_state_t *); typedef struct _rom_params diff --git a/Frameworks/lazyusf/lazyusf/main/savestates.c b/Frameworks/lazyusf/lazyusf/main/savestates.c index f16fac546..a689adb23 100644 --- a/Frameworks/lazyusf/lazyusf/main/savestates.c +++ b/Frameworks/lazyusf/lazyusf/main/savestates.c @@ -596,6 +596,8 @@ static int savestates_load_pj64(usf_state_t * state, unsigned char * ptr, unsign // No flashram info in pj64 savestate. //init_flashram(&state->g_pi.flashram); + open_rom_header(state, savestateData, sizeof(m64p_rom_header)); + #ifdef NEW_DYNAREC if (state->r4300emu == CORE_DYNAREC) { state->pcaddr = state->last_addr;