///////////////////////////////////////////////////////////////////////////// // // Upload PS-X EXE - must INCLUDE the header. // If the header includes the strings "North America", "Japan", or "Europe", // the appropriate refresh rate is set. // Returns nonzero on error. // Will return error for PS2. // sint32 EMU_CALL psx_upload_psxexe(void *state, void *program, uint32 size) { uint32 init_pc; uint32 init_sp; uint32 text_start; uint32 text_size; if(PSXSTATE->version != 1) return -1; if(size < 0x801) return -1; if(memcmp(program, "PS-X EXE", 8)) return -1; text_start = get32lsb(((uint8*)program) + 0x18); text_size = get32lsb(((uint8*)program) + 0x1C); init_pc = get32lsb(((uint8*)program) + 0x10); init_sp = get32lsb(((uint8*)program) + 0x30); // Try to determine the region, or leave it at the default if it's not found if(string_exists(program, 0x800, "North America")) { psx_set_refresh(state, 60); } else if(string_exists(program, 0x800, "Japan" )) { psx_set_refresh(state, 60); } else if(string_exists(program, 0x800, "Europe" )) { psx_set_refresh(state, 50); } if(text_size > (size - 0x800)) { text_size = (size - 0x800); } iop_upload_to_ram(IOPSTATE, text_start, ((uint8*)program) + 0x800, text_size); r3000_setreg(iop_get_r3000_state(IOPSTATE), R3000_REG_PC , init_pc); r3000_setreg(iop_get_r3000_state(IOPSTATE), R3000_REG_GEN+29, init_sp); return 0; }
///////////////////////////////////////////////////////////////////////////// // // Upload program - must INCLUDE the 4-byte header. // Returns nonzero on error. // sint32 EMU_CALL sega_upload_program(void *state, void *program, uint32 size) { uint32 start; if(size < 5) return -1; start = get32lsb((uint8*)program); #ifndef DISABLE_SSF if(HAVE_SATSOUND) { satsound_upload_to_ram(SATSOUNDSTATE, start, ((uint8*)program) + 4, size - 4); } else #endif if(HAVE_DCSOUND) { dcsound_upload_to_ram(DCSOUNDSTATE, start, ((uint8*)program) + 4, size - 4); } else { return -1; } return 0; }