#include "misc.h"
#include "cdrom.h"
#include "mdec.h"
+#include "gpu.h"
#include "ppf.h"
char CdromId[10] = "";
return 0;
}
+static const unsigned int gpu_ctl_def[] = {
+ 0x00000000, 0x01000000, 0x03000000, 0x04000000,
+ 0x05000800, 0x06c60260, 0x0703fc10, 0x08000027,
+};
+
+static const unsigned int gpu_data_def[] = {
+ 0xe100360b, 0xe2000000, 0xe3000800, 0xe4077e7f,
+ 0xe5001000, 0xe6000000,
+ 0x02000000, 0x00000000, 0x01ff03ff,
+};
+
+static void fake_bios_gpu_setup(void)
+{
+ int i;
+
+ for (i = 0; i < sizeof(gpu_ctl_def) / sizeof(gpu_ctl_def[0]); i++)
+ GPU_writeStatus(gpu_ctl_def[i]);
+
+ for (i = 0; i < sizeof(gpu_data_def) / sizeof(gpu_data_def[0]); i++)
+ GPU_writeData(gpu_data_def[i]);
+}
+
int LoadCdrom() {
EXE_HEADER tmpHead;
struct iso_directory_record *dir;
u8 mdir[4096];
s8 exename[256];
+ // not the best place to do it, but since BIOS boot logo killer
+ // is just below, do it here
+ fake_bios_gpu_setup();
+
if (!Config.HLE) {
+ // skip BIOS logos
psxRegs.pc = psxRegs.GPR.n.ra;
return 0;
}
tmpHead.t_size = SWAP32(tmpHead.t_size);
tmpHead.t_addr = SWAP32(tmpHead.t_addr);
+ psxCpu->Clear(tmpHead.t_addr, tmpHead.t_size / 4);
+
// Read the rest of the main executable
- while (tmpHead.t_size) {
+ while (tmpHead.t_size & ~2047) {
void *ptr = (void *)PSXM(tmpHead.t_addr);
incTime();
size = head->t_size;
addr = head->t_addr;
- while (size) {
+ psxCpu->Clear(addr, size / 4);
+
+ while (size & ~2047) {
incTime();
READTRACK();
}
if (Config.PsxAuto) { // autodetect system (pal or ntsc)
- if (strstr(exename, "ES") != NULL)
+ if (CdromId[2] == 'e' || CdromId[2] == 'E')
Config.PsxType = PSX_TYPE_PAL; // pal
else Config.PsxType = PSX_TYPE_NTSC; // ntsc
}
int retval = 0;
u8 opcode;
u32 section_address, section_size;
+ void *mem;
strncpy(CdromId, "SLUS99999", 9);
strncpy(CdromLabel, "SLUS_999.99", 11);
switch (type) {
case PSX_EXE:
fread(&tmpHead,sizeof(EXE_HEADER),1,tmpFile);
- fseek(tmpFile, 0x800, SEEK_SET);
- fread((void *)PSXM(SWAP32(tmpHead.t_addr)), SWAP32(tmpHead.t_size),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(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);
#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);
+ mem = PSXM(section_address);
+ if (mem != NULL) {
+ fread(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 */
// Savestate Versioning!
// If you make changes to the savestate version, please increment the value below.
-static const u32 SaveVersion = 0x8b410005;
+static const u32 SaveVersion = 0x8b410006;
int SaveState(const char *file) {
gzFile f;
f = gzopen(file, "wb");
if (f == NULL) return -1;
+ new_dyna_save();
+
gzwrite(f, (void *)PcsxHeader, 32);
gzwrite(f, (void *)&SaveVersion, sizeof(u32));
gzwrite(f, (void *)&Config.HLE, sizeof(boolean));
gzclose(f);
+ new_dyna_after_save();
+
return 0;
}
gzread(f, &version, sizeof(u32));
gzread(f, &hle, sizeof(boolean));
- if (strncmp("STv4 PCSX", header, 9) != 0 || version != SaveVersion || hle != Config.HLE) {
+ if (strncmp("STv4 PCSX", header, 9) != 0 || version != SaveVersion) {
gzclose(f);
return -1;
}
+ Config.HLE = hle;
+
+ if (Config.HLE)
+ psxBiosInit();
psxCpu->Reset();
gzseek(f, 128 * 96 * 3, SEEK_CUR);
gzread(f, gpufP, sizeof(GPUFreeze_t));
GPU_freeze(0, gpufP);
free(gpufP);
+ if (HW_GPU_STATUS == 0)
+ HW_GPU_STATUS = GPU_readStatus();
// spu
gzread(f, &Size, 4);
mdecFreeze(f, 0);
gzclose(f);
+ new_dyna_restore();
return 0;
}
gzclose(f);
- if (strncmp("STv4 PCSX", header, 9) != 0 || version != SaveVersion || hle != Config.HLE)
+ if (strncmp("STv4 PCSX", header, 9) != 0 || version != SaveVersion)
return -1;
return 0;