int Load(char *ExePath) { FILE *tmpFile; EXE_HEADER tmpHead; int type; strncpy(CdromId, "SLUS99999", 9); strncpy(CdromLabel, "SLUS_999.99", 11); tmpFile = fopen(ExePath,"rb"); if (tmpFile == NULL) { SysMessage(_("Error opening file: %s"), ExePath); return 0; } type = PSXGetFileType(tmpFile); switch (type) { case PSX_EXE: fread(&tmpHead,sizeof(EXE_HEADER),1,tmpFile); fseek(tmpFile, 0x800, SEEK_SET); fread((void *)PSXM(tmpHead.t_addr), tmpHead.t_size,1,tmpFile); fclose(tmpFile); psxRegs.pc = tmpHead.pc0; psxRegs.GPR.n.gp = tmpHead.gp0; psxRegs.GPR.n.sp = tmpHead.s_addr; if (psxRegs.GPR.n.sp == 0) psxRegs.GPR.n.sp = 0x801fff00; break; case CPE_EXE: SysMessage(_("Pcsx found that you wanna use a CPE file. CPE files not supported")); break; case COFF_EXE: SysMessage(_("Pcsx found that you wanna use a COFF file. COFF files not supported")); break; case INVALID_EXE: SysMessage(_("This file is not a psx file")); break; } return 1; }
int Load(const char *ExePath) { FILE *tmpFile; EXE_HEADER tmpHead; FILHDR coffHead; AOUTHDR optHead; SCNHDR section; int type, i; int retval = 0; u8 opcode; u32 section_address, section_size; void* psxmaddr; strncpy(CdromId, "SLUS99999", 9); strncpy(CdromLabel, "SLUS_999.99", 11); tmpFile = fopen(ExePath, "rb"); if (tmpFile == NULL) { SysPrintf(_("Error opening file: %s.\n"), ExePath); retval = -1; } else { LoadLibPS(); type = PSXGetFileType(tmpFile); switch (type) { case PSX_EXE: fread(&tmpHead, sizeof(EXE_HEADER), 1, tmpFile); fseek(tmpFile, 0x800, SEEK_SET); fread(PSXM(SWAP32(tmpHead.t_addr)), SWAP32(tmpHead.t_size), 1, tmpFile); fclose(tmpFile); psxRegs.pc = SWAP32(tmpHead.pc0); psxRegs.GPR.n.gp = SWAP32(tmpHead.gp0); psxRegs.GPR.n.sp = SWAP32(tmpHead.s_addr); if (psxRegs.GPR.n.sp == 0) psxRegs.GPR.n.sp = 0x801fff00; retval = 0; break; case CPE_EXE: fseek(tmpFile, 6, SEEK_SET); /* Something tells me we should go to 4 and read the "08 00" here... */ do { fread(&opcode, 1, 1, tmpFile); switch (opcode) { case 1: /* Section loading */ fread(§ion_address, 4, 1, tmpFile); fread(§ion_size, 4, 1, tmpFile); section_address = SWAPu32(section_address); section_size = SWAPu32(section_size); #ifdef EMU_LOG EMU_LOG("Loading %08X bytes from %08X to %08X\n", section_size, ftell(tmpFile), section_address); #endif fread(PSXM(section_address), section_size, 1, tmpFile); break; case 3: /* register loading (PC only?) */ fseek(tmpFile, 2, SEEK_CUR); /* unknown field */ fread(&psxRegs.pc, 4, 1, tmpFile); psxRegs.pc = SWAPu32(psxRegs.pc); break; case 0: /* End of file */ break; default: SysPrintf(_("Unknown CPE opcode %02x at position %08x.\n"), opcode, ftell(tmpFile) - 1); retval = -1; break; } } while (opcode != 0 && retval == 0); break; case COFF_EXE: fread(&coffHead, sizeof(coffHead), 1, tmpFile); fread(&optHead, sizeof(optHead), 1, tmpFile); psxRegs.pc = SWAP32(optHead.entry); psxRegs.GPR.n.sp = 0x801fff00; for (i = 0; i < SWAP16(coffHead.f_nscns); i++) { fseek(tmpFile, sizeof(FILHDR) + SWAP16(coffHead.f_opthdr) + sizeof(section) * i, SEEK_SET); fread(§ion, sizeof(section), 1, tmpFile); if (section.s_scnptr != 0) { fseek(tmpFile, SWAP32(section.s_scnptr), SEEK_SET); fread(PSXM(SWAP32(section.s_paddr)), SWAP32(section.s_size), 1, tmpFile); } else { psxmaddr = PSXM(SWAP32(section.s_paddr)); assert(psxmaddr != NULL); memset(psxmaddr, 0, SWAP32(section.s_size)); } } break; case INVALID_EXE: SysPrintf("%s", _("This file does not appear to be a valid PSX file.\n")); retval = -1; break; } } if (retval != 0) { CdromId[0] = '\0'; CdromLabel[0] = '\0'; } return retval; }
int Load(const char *ExePath) { FILE *tmpFile; EXE_HEADER tmpHead; int type; int retval = 0; u8 opcode; u32 section_address, section_size; void *mem; strncpy(CdromId, "SLUS99999", 9); strncpy(CdromLabel, "SLUS_999.99", 11); tmpFile = fopen(ExePath, "rb"); if (tmpFile == NULL) { SysPrintf(_("Error opening file: %s.\n"), ExePath); retval = -1; } else { type = PSXGetFileType(tmpFile); switch (type) { case PSX_EXE: fread(&tmpHead,sizeof(EXE_HEADER),1,tmpFile); section_address = SWAP32(tmpHead.t_addr); section_size = SWAP32(tmpHead.t_size); mem = PSXM(section_address); if (mem != NULL) { fseek(tmpFile, 0x800, SEEK_SET); fread_to_ram(mem, section_size, 1, tmpFile); psxCpu->Clear(section_address, section_size / 4); } fclose(tmpFile); psxRegs.pc = SWAP32(tmpHead.pc0); psxRegs.GPR.n.gp = SWAP32(tmpHead.gp0); psxRegs.GPR.n.sp = SWAP32(tmpHead.s_addr); if (psxRegs.GPR.n.sp == 0) psxRegs.GPR.n.sp = 0x801fff00; retval = 0; break; case CPE_EXE: fseek(tmpFile, 6, SEEK_SET); /* Something tells me we should go to 4 and read the "08 00" here... */ do { fread(&opcode, 1, 1, tmpFile); switch (opcode) { case 1: /* Section loading */ fread(§ion_address, 4, 1, tmpFile); fread(§ion_size, 4, 1, tmpFile); section_address = SWAPu32(section_address); section_size = SWAPu32(section_size); #ifdef EMU_LOG EMU_LOG("Loading %08X bytes from %08X to %08X\n", section_size, ftell(tmpFile), section_address); #endif mem = PSXM(section_address); if (mem != NULL) { fread_to_ram(mem, section_size, 1, tmpFile); psxCpu->Clear(section_address, section_size / 4); } break; case 3: /* register loading (PC only?) */ fseek(tmpFile, 2, SEEK_CUR); /* unknown field */ fread(&psxRegs.pc, 4, 1, tmpFile); psxRegs.pc = SWAPu32(psxRegs.pc); break; case 0: /* End of file */ break; default: SysPrintf(_("Unknown CPE opcode %02x at position %08x.\n"), opcode, ftell(tmpFile) - 1); retval = -1; break; } } while (opcode != 0 && retval == 0); break; case COFF_EXE: SysPrintf(_("COFF files not supported.\n")); retval = -1; break; case INVALID_EXE: SysPrintf(_("This file does not appear to be a valid PSX EXE file.\n")); SysPrintf(_("(did you forget -cdfile ?)\n")); retval = -1; break; } } if (retval != 0) { CdromId[0] = '\0'; CdromLabel[0] = '\0'; } return retval; }