X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?p=pcsx_rearmed.git;a=blobdiff_plain;f=libpcsxcore%2Fmisc.c;h=a27f60fbfcb31d15b0cd0c819f6db5d7e0bf76a4;hp=38a516cd72f0904f1830161032a0320e1409cb07;hb=1c2c2bfb00e4040a17f61e7aa2061d446ba44b76;hpb=507aaf98de47ca11c52ced9957d4f190aff71777 diff --git a/libpcsxcore/misc.c b/libpcsxcore/misc.c index 38a516cd..a27f60fb 100644 --- a/libpcsxcore/misc.c +++ b/libpcsxcore/misc.c @@ -24,7 +24,9 @@ #include "misc.h" #include "cdrom.h" #include "mdec.h" +#include "gpu.h" #include "ppf.h" +#include char CdromId[10] = ""; char CdromLabel[33] = ""; @@ -55,7 +57,8 @@ void mmssdd( char *b, char *p ) { int m, s, d; #if defined(__arm__) - int block = (b[3] << 24) | (b[2] << 16) | (b[1] << 8) | b[0]; + unsigned char *u = (void *)b; + int block = (u[3] << 24) | (u[2] << 16) | (u[1] << 8) | u[0]; #elif defined(__BIGENDIAN__) int block = (b[0] & 0xff) | ((b[1] & 0xff) << 8) | ((b[2] & 0xff) << 16) | (b[3] << 24); #else @@ -92,8 +95,9 @@ void mmssdd( char *b, char *p ) #define READTRACK() \ if (CDR_readTrack(time) == -1) return -1; \ - buf = CDR_getBuffer(); \ - if (buf == NULL) return -1; else CheckPPFCache(buf, time[0], time[1], time[2]); + buf = (void *)CDR_getBuffer(); \ + if (buf == NULL) return -1; \ + else CheckPPFCache((u8 *)buf, time[0], time[1], time[2]); #define READDIR(_dir) \ READTRACK(); \ @@ -103,9 +107,10 @@ void mmssdd( char *b, char *p ) READTRACK(); \ memcpy(_dir + 2048, buf + 12, 2048); -int GetCdromFile(u8 *mdir, u8 *time, s8 *filename) { +int GetCdromFile(u8 *mdir, u8 *time, char *filename) { struct iso_directory_record *dir; - char ddir[4096]; + int retval = -1; + u8 ddir[4096]; u8 *buf; int i; @@ -118,7 +123,7 @@ int GetCdromFile(u8 *mdir, u8 *time, s8 *filename) { if (dir->length[0] == 0) { return -1; } - i += dir->length[0]; + i += (u8)dir->length[0]; if (dir->flags[0] & 0x2) { // it's a dir if (!strnicmp((char *)&dir->name[0], filename, dir->name_len[0])) { @@ -134,11 +139,34 @@ int GetCdromFile(u8 *mdir, u8 *time, s8 *filename) { } else { if (!strnicmp((char *)&dir->name[0], filename, strlen(filename))) { mmssdd(dir->extent, (char *)time); + retval = 0; break; } } } - return 0; + return retval; +} + +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() { @@ -146,9 +174,14 @@ int LoadCdrom() { struct iso_directory_record *dir; u8 time[4], *buf; u8 mdir[4096]; - s8 exename[256]; + char 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; } @@ -179,7 +212,7 @@ int LoadCdrom() { if (GetCdromFile(mdir, time, exename) == -1) { sscanf((char *)buf + 12, "BOOT = cdrom:%256s", exename); if (GetCdromFile(mdir, time, exename) == -1) { - char *ptr = strstr(buf + 12, "cdrom:"); + char *ptr = strstr((char *)buf + 12, "cdrom:"); if (ptr != NULL) { ptr += 6; while (*ptr == '\\' || *ptr == '/') ptr++; @@ -209,8 +242,10 @@ int LoadCdrom() { 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(); @@ -228,8 +263,10 @@ int LoadCdrom() { int LoadCdromFile(const char *filename, EXE_HEADER *head) { struct iso_directory_record *dir; u8 time[4],*buf; - u8 mdir[4096], exename[256]; + u8 mdir[4096]; + char exename[256]; u32 size, addr; + void *mem; sscanf(filename, "cdrom:\\%256s", exename); @@ -252,11 +289,15 @@ int LoadCdromFile(const char *filename, EXE_HEADER *head) { size = head->t_size; addr = head->t_addr; - while (size) { + psxCpu->Clear(addr, size / 4); + + while (size & ~2047) { incTime(); READTRACK(); - memcpy((void *)PSXM(addr), buf + 12, 2048); + mem = PSXM(addr); + if (mem) + memcpy(mem, buf + 12, 2048); size -= 2048; addr += 2048; @@ -267,7 +308,8 @@ int LoadCdromFile(const char *filename, EXE_HEADER *head) { int CheckCdrom() { struct iso_directory_record *dir; - unsigned char time[4], *buf; + unsigned char time[4]; + char *buf; unsigned char mdir[4096]; char exename[256]; int i, c; @@ -295,9 +337,9 @@ int CheckCdrom() { if (GetCdromFile(mdir, time, "SYSTEM.CNF;1") != -1) { READTRACK(); - sscanf((char *)buf + 12, "BOOT = cdrom:\\%256s", exename); + sscanf(buf + 12, "BOOT = cdrom:\\%256s", exename); if (GetCdromFile(mdir, time, exename) == -1) { - sscanf((char *)buf + 12, "BOOT = cdrom:%256s", exename); + sscanf(buf + 12, "BOOT = cdrom:%256s", exename); if (GetCdromFile(mdir, time, exename) == -1) { char *ptr = strstr(buf + 12, "cdrom:"); // possibly the executable is in some subdir if (ptr != NULL) { @@ -332,8 +374,11 @@ int CheckCdrom() { } } + if (CdromId[0] == '\0') + strcpy(CdromId, "SLUS99999"); + 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 } @@ -374,6 +419,22 @@ static int PSXGetFileType(FILE *f) { return INVALID_EXE; } +// temporary pandora workaround.. +// FIXME: remove +size_t fread_to_ram(void *ptr, size_t size, size_t nmemb, FILE *stream) +{ + void *tmp; + size_t ret = 0; + + tmp = malloc(size * nmemb); + if (tmp) { + ret = fread(tmp, size, nmemb, stream); + memcpy(ptr, tmp, size * nmemb); + free(tmp); + } + return ret; +} + int Load(const char *ExePath) { FILE *tmpFile; EXE_HEADER tmpHead; @@ -381,6 +442,7 @@ int Load(const char *ExePath) { int retval = 0; u8 opcode; u32 section_address, section_size; + void *mem; strncpy(CdromId, "SLUS99999", 9); strncpy(CdromLabel, "SLUS_999.99", 11); @@ -394,8 +456,14 @@ int Load(const char *ExePath) { 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_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); @@ -417,7 +485,11 @@ int Load(const char *ExePath) { #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_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 */ @@ -438,7 +510,8 @@ int Load(const char *ExePath) { retval = -1; break; case INVALID_EXE: - SysPrintf(_("This file does not appear to be a valid PSX file.\n")); + SysPrintf(_("This file does not appear to be a valid PSX EXE file.\n")); + SysPrintf(_("(did you forget -cdfile ?)\n")); retval = -1; break; } @@ -454,55 +527,86 @@ int Load(const char *ExePath) { // STATES +static void *zlib_open(const char *name, const char *mode) +{ + return gzopen(name, mode); +} + +static int zlib_read(void *file, void *buf, u32 len) +{ + return gzread(file, buf, len); +} + +static int zlib_write(void *file, const void *buf, u32 len) +{ + return gzwrite(file, buf, len); +} + +static long zlib_seek(void *file, long offs, int whence) +{ + return gzseek(file, offs, whence); +} + +static void zlib_close(void *file) +{ + gzclose(file); +} + +struct PcsxSaveFuncs SaveFuncs = { + zlib_open, zlib_read, zlib_write, zlib_seek, zlib_close +}; + static const char PcsxHeader[32] = "STv4 PCSX v" PACKAGE_VERSION; // Savestate Versioning! // If you make changes to the savestate version, please increment the value below. -static const u32 SaveVersion = 0x8b410004; +static const u32 SaveVersion = 0x8b410006; int SaveState(const char *file) { - gzFile f; + void *f; GPUFreeze_t *gpufP; SPUFreeze_t *spufP; int Size; unsigned char *pMem; - f = gzopen(file, "wb"); + f = SaveFuncs.open(file, "wb"); if (f == NULL) return -1; - gzwrite(f, (void *)PcsxHeader, 32); - gzwrite(f, (void *)&SaveVersion, sizeof(u32)); - gzwrite(f, (void *)&Config.HLE, sizeof(boolean)); + new_dyna_save(); + + SaveFuncs.write(f, (void *)PcsxHeader, 32); + SaveFuncs.write(f, (void *)&SaveVersion, sizeof(u32)); + SaveFuncs.write(f, (void *)&Config.HLE, sizeof(boolean)); pMem = (unsigned char *)malloc(128 * 96 * 3); if (pMem == NULL) return -1; GPU_getScreenPic(pMem); - gzwrite(f, pMem, 128 * 96 * 3); + SaveFuncs.write(f, pMem, 128 * 96 * 3); free(pMem); if (Config.HLE) psxBiosFreeze(1); - gzwrite(f, psxM, 0x00200000); - gzwrite(f, psxR, 0x00080000); - gzwrite(f, psxH, 0x00010000); - gzwrite(f, (void *)&psxRegs, sizeof(psxRegs)); + SaveFuncs.write(f, psxM, 0x00200000); + SaveFuncs.write(f, psxR, 0x00080000); + SaveFuncs.write(f, psxH, 0x00010000); + SaveFuncs.write(f, (void *)&psxRegs, sizeof(psxRegs)); // gpu gpufP = (GPUFreeze_t *)malloc(sizeof(GPUFreeze_t)); gpufP->ulFreezeVersion = 1; GPU_freeze(1, gpufP); - gzwrite(f, gpufP, sizeof(GPUFreeze_t)); + SaveFuncs.write(f, gpufP, sizeof(GPUFreeze_t)); free(gpufP); // spu spufP = (SPUFreeze_t *) malloc(16); SPU_freeze(2, spufP); - Size = spufP->Size; gzwrite(f, &Size, 4); + Size = spufP->Size; SaveFuncs.write(f, &Size, 4); free(spufP); spufP = (SPUFreeze_t *) malloc(Size); SPU_freeze(1, spufP); - gzwrite(f, spufP, Size); + SaveFuncs.write(f, spufP, Size); free(spufP); sioFreeze(f, 1); @@ -511,13 +615,15 @@ int SaveState(const char *file) { psxRcntFreeze(f, 1); mdecFreeze(f, 1); - gzclose(f); + SaveFuncs.close(f); + + new_dyna_after_save(); return 0; } int LoadState(const char *file) { - gzFile f; + void *f; GPUFreeze_t *gpufP; SPUFreeze_t *spufP; int Size; @@ -525,39 +631,45 @@ int LoadState(const char *file) { u32 version; boolean hle; - f = gzopen(file, "rb"); + f = SaveFuncs.open(file, "rb"); if (f == NULL) return -1; - gzread(f, header, sizeof(header)); - gzread(f, &version, sizeof(u32)); - gzread(f, &hle, sizeof(boolean)); + SaveFuncs.read(f, header, sizeof(header)); + SaveFuncs.read(f, &version, sizeof(u32)); + SaveFuncs.read(f, &hle, sizeof(boolean)); - if (strncmp("STv4 PCSX", header, 9) != 0 || version != SaveVersion || hle != Config.HLE) { - gzclose(f); + if (strncmp("STv4 PCSX", header, 9) != 0 || version != SaveVersion) { + SaveFuncs.close(f); return -1; } + Config.HLE = hle; + + if (Config.HLE) + psxBiosInit(); psxCpu->Reset(); - gzseek(f, 128 * 96 * 3, SEEK_CUR); + SaveFuncs.seek(f, 128 * 96 * 3, SEEK_CUR); - gzread(f, psxM, 0x00200000); - gzread(f, psxR, 0x00080000); - gzread(f, psxH, 0x00010000); - gzread(f, (void *)&psxRegs, sizeof(psxRegs)); + SaveFuncs.read(f, psxM, 0x00200000); + SaveFuncs.read(f, psxR, 0x00080000); + SaveFuncs.read(f, psxH, 0x00010000); + SaveFuncs.read(f, (void *)&psxRegs, sizeof(psxRegs)); if (Config.HLE) psxBiosFreeze(0); // gpu gpufP = (GPUFreeze_t *)malloc(sizeof(GPUFreeze_t)); - gzread(f, gpufP, sizeof(GPUFreeze_t)); + SaveFuncs.read(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); + SaveFuncs.read(f, &Size, 4); spufP = (SPUFreeze_t *)malloc(Size); - gzread(f, spufP, Size); + SaveFuncs.read(f, spufP, Size); SPU_freeze(0, spufP); free(spufP); @@ -567,27 +679,28 @@ int LoadState(const char *file) { psxRcntFreeze(f, 0); mdecFreeze(f, 0); - gzclose(f); + SaveFuncs.close(f); + new_dyna_restore(); return 0; } int CheckState(const char *file) { - gzFile f; + void *f; char header[32]; u32 version; boolean hle; - f = gzopen(file, "rb"); + f = SaveFuncs.open(file, "rb"); if (f == NULL) return -1; - gzread(f, header, sizeof(header)); - gzread(f, &version, sizeof(u32)); - gzread(f, &hle, sizeof(boolean)); + SaveFuncs.read(f, header, sizeof(header)); + SaveFuncs.read(f, &version, sizeof(u32)); + SaveFuncs.read(f, &hle, sizeof(boolean)); - gzclose(f); + SaveFuncs.close(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;