X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?p=pcsx_rearmed.git;a=blobdiff_plain;f=libpcsxcore%2Fmisc.c;h=ad2e5d55848d6d798af6ab086bb80c6f398844f3;hp=68ad17ed54691fe087fb1cf774f15dd139d5a94b;hb=3601e36bd526c63c842f68b2ff6cac82954e5e7e;hpb=ebe6ff2b3de3b1cd41ba685764340a1e305bc3fa diff --git a/libpcsxcore/misc.c b/libpcsxcore/misc.c index 68ad17ed..ad2e5d55 100644 --- a/libpcsxcore/misc.c +++ b/libpcsxcore/misc.c @@ -24,6 +24,7 @@ #include "misc.h" #include "cdrom.h" #include "mdec.h" +#include "gpu.h" #include "ppf.h" char CdromId[10] = ""; @@ -92,8 +93,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 +105,9 @@ 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]; + u8 ddir[4096]; u8 *buf; int i; @@ -141,14 +143,41 @@ int GetCdromFile(u8 *mdir, u8 *time, s8 *filename) { 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 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 +208,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++; @@ -230,8 +259,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); @@ -260,7 +291,9 @@ int LoadCdromFile(const char *filename, EXE_HEADER *head) { incTime(); READTRACK(); - memcpy((void *)PSXM(addr), buf + 12, 2048); + mem = PSXM(addr); + if (mem) + memcpy(mem, buf + 12, 2048); size -= 2048; addr += 2048; @@ -271,7 +304,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; @@ -299,9 +333,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) { @@ -336,6 +370,9 @@ int CheckCdrom() { } } + if (CdromId[0] == '\0') + strcpy(CdromId, "SLUS99999"); + if (Config.PsxAuto) { // autodetect system (pal or ntsc) if (CdromId[2] == 'e' || CdromId[2] == 'E') Config.PsxType = PSX_TYPE_PAL; // pal @@ -378,6 +415,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; @@ -404,7 +457,7 @@ int Load(const char *ExePath) { mem = PSXM(section_address); if (mem != NULL) { fseek(tmpFile, 0x800, SEEK_SET); - fread(mem, section_size, 1, tmpFile); + fread_to_ram(mem, section_size, 1, tmpFile); psxCpu->Clear(section_address, section_size / 4); } fclose(tmpFile); @@ -430,7 +483,7 @@ int Load(const char *ExePath) { #endif mem = PSXM(section_address); if (mem != NULL) { - fread(mem, section_size, 1, tmpFile); + fread_to_ram(mem, section_size, 1, tmpFile); psxCpu->Clear(section_address, section_size / 4); } break; @@ -530,6 +583,8 @@ int SaveState(const char *file) { gzclose(f); + new_dyna_after_save(); + return 0; } @@ -574,6 +629,8 @@ int LoadState(const char *file) { 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);