notaz.gp2x.de
/
pcsx_rearmed.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
log some build info
[pcsx_rearmed.git]
/
libpcsxcore
/
misc.c
diff --git
a/libpcsxcore/misc.c
b/libpcsxcore/misc.c
index
3d16471
..
50caad4
100644
(file)
--- a/
libpcsxcore/misc.c
+++ b/
libpcsxcore/misc.c
@@
-28,6
+28,7
@@
#include "mdec.h"
#include "gpu.h"
#include "ppf.h"
#include "mdec.h"
#include "gpu.h"
#include "ppf.h"
+#include "psxbios.h"
#include "database.h"
#include <zlib.h>
#include "database.h"
#include <zlib.h>
@@
-112,7
+113,7
@@
int GetCdromFile(u8 *mdir, u8 *time, char *filename) {
int i;
// only try to scan if a filename is given
int i;
// only try to scan if a filename is given
- if (!strlen(filename)) return -1;
+ if (
filename == INVALID_PTR ||
!strlen(filename)) return -1;
i = 0;
while (i < 4096) {
i = 0;
while (i < 4096) {
@@
-178,7
+179,10
@@
static void getFromCnf(char *buf, const char *key, u32 *val)
}
int LoadCdrom() {
}
int LoadCdrom() {
- EXE_HEADER tmpHead;
+ union {
+ EXE_HEADER h;
+ u32 d[sizeof(EXE_HEADER) / sizeof(u32)];
+ } tmpHead;
struct iso_directory_record *dir;
u8 time[4], *buf;
u8 mdir[4096];
struct iso_directory_record *dir;
u8 time[4], *buf;
u8 mdir[4096];
@@
-186,8
+190,10
@@
int LoadCdrom() {
u32 cnf_tcb = 4;
u32 cnf_event = 16;
u32 cnf_stack = 0;
u32 cnf_tcb = 4;
u32 cnf_event = 16;
u32 cnf_stack = 0;
+ u32 t_addr;
+ u32 t_size;
u32 sp = 0;
u32 sp = 0;
- int ret;
+ int
i,
ret;
if (!Config.HLE) {
if (psxRegs.pc != 0x80030000) // BiosBootBypass'ed or custom BIOS?
if (!Config.HLE) {
if (psxRegs.pc != 0x80030000) // BiosBootBypass'ed or custom BIOS?
@@
-243,39
+249,41
@@
int LoadCdrom() {
getFromCnf((char *)buf + 12, "EVENT", &cnf_event);
getFromCnf((char *)buf + 12, "STACK", &cnf_stack);
if (Config.HLE)
getFromCnf((char *)buf + 12, "EVENT", &cnf_event);
getFromCnf((char *)buf + 12, "STACK", &cnf_stack);
if (Config.HLE)
- psxBiosCnfLoaded(cnf_tcb, cnf_event);
+ psxBiosCnfLoaded(cnf_tcb, cnf_event
, cnf_stack
);
// Read the EXE-Header
READTRACK();
}
memcpy(&tmpHead, buf + 12, sizeof(EXE_HEADER));
// Read the EXE-Header
READTRACK();
}
memcpy(&tmpHead, buf + 12, sizeof(EXE_HEADER));
+ for (i = 2; i < sizeof(tmpHead.d) / sizeof(tmpHead.d[0]); i++)
+ tmpHead.d[i] = SWAP32(tmpHead.d[i]);
- SysPrintf("manual booting '%s' pc=%x\n", exename,
SWAP32(tmpHead.pc0)
);
- sp =
SWAP32(tmpHead.s_addr)
;
+ SysPrintf("manual booting '%s' pc=%x\n", exename,
tmpHead.h.pc0
);
+ sp =
tmpHead.h.s_addr
;
if (cnf_stack)
sp = cnf_stack;
if (cnf_stack)
sp = cnf_stack;
- SetBootRegs(SWAP32(tmpHead.pc0), SWAP32(tmpHead.gp0), sp);
-
- tmpHead.t_size = SWAP32(tmpHead.t_size);
- tmpHead.t_addr = SWAP32(tmpHead.t_addr);
-
- psxCpu->Clear(tmpHead.t_addr, tmpHead.t_size / 4);
- //psxCpu->Reset();
+ SetBootRegs(tmpHead.h.pc0, tmpHead.h.gp0, sp);
// Read the rest of the main executable
// Read the rest of the main executable
-
while (tmpHead.t_size & ~2047
) {
- void *ptr = (void *)PSXM(t
mpHead.t
_addr);
+
for (t_addr = tmpHead.h.t_addr, t_size = tmpHead.h.t_size; t_size & ~2047;
) {
+ void *ptr = (void *)PSXM(t_addr);
incTime();
READTRACK();
if (ptr != INVALID_PTR) memcpy(ptr, buf+12, 2048);
incTime();
READTRACK();
if (ptr != INVALID_PTR) memcpy(ptr, buf+12, 2048);
- t
mpHead.t_size -
= 2048;
- t
mpHead.t_addr +
= 2048;
+ t
_addr +
= 2048;
+ t
_size -
= 2048;
}
}
+ psxCpu->Clear(tmpHead.h.t_addr, tmpHead.h.t_size / 4);
+ //psxCpu->Reset();
+
+ if (Config.HLE)
+ psxBiosCheckExe(tmpHead.h.t_addr, tmpHead.h.t_size);
+
return 0;
}
return 0;
}
@@
-628,11
+636,12
@@
static const u32 SaveVersion = 0x8b410006;
int SaveState(const char *file) {
void *f;
int SaveState(const char *file) {
void *f;
- GPUFreeze_t *gpufP;
- SPUFreezeHdr_t *spufH;
- SPUFreeze_t *spufP;
+ GPUFreeze_t *gpufP = NULL;
+ SPUFreezeHdr_t spufH;
+ SPUFreeze_t *spufP = NULL;
+ unsigned char *pMem = NULL;
+ int result = -1;
int Size;
int Size;
- unsigned char *pMem;
f = SaveFuncs.open(file, "wb");
if (f == NULL) return -1;
f = SaveFuncs.open(file, "wb");
if (f == NULL) return -1;
@@
-644,7
+653,7
@@
int SaveState(const char *file) {
SaveFuncs.write(f, (void *)&Config.HLE, sizeof(boolean));
pMem = (unsigned char *)malloc(128 * 96 * 3);
SaveFuncs.write(f, (void *)&Config.HLE, sizeof(boolean));
pMem = (unsigned char *)malloc(128 * 96 * 3);
- if (pMem == NULL)
return -1
;
+ if (pMem == NULL)
goto cleanup
;
GPU_getScreenPic(pMem);
SaveFuncs.write(f, pMem, 128 * 96 * 3);
free(pMem);
GPU_getScreenPic(pMem);
SaveFuncs.write(f, pMem, 128 * 96 * 3);
free(pMem);
@@
-660,20
+669,20
@@
int SaveState(const char *file) {
// gpu
gpufP = (GPUFreeze_t *)malloc(sizeof(GPUFreeze_t));
// gpu
gpufP = (GPUFreeze_t *)malloc(sizeof(GPUFreeze_t));
+ if (gpufP == NULL) goto cleanup;
gpufP->ulFreezeVersion = 1;
GPU_freeze(1, gpufP);
SaveFuncs.write(f, gpufP, sizeof(GPUFreeze_t));
gpufP->ulFreezeVersion = 1;
GPU_freeze(1, gpufP);
SaveFuncs.write(f, gpufP, sizeof(GPUFreeze_t));
- free(gpufP);
+ free(gpufP);
gpufP = NULL;
// spu
// spu
- spufH = malloc(sizeof(*spufH));
- SPU_freeze(2, (SPUFreeze_t *)spufH, psxRegs.cycle);
- Size = spufH->Size; SaveFuncs.write(f, &Size, 4);
- free(spufH);
+ SPU_freeze(2, (SPUFreeze_t *)&spufH, psxRegs.cycle);
+ Size = spufH.Size; SaveFuncs.write(f, &Size, 4);
spufP = (SPUFreeze_t *) malloc(Size);
spufP = (SPUFreeze_t *) malloc(Size);
+ if (spufP == NULL) goto cleanup;
SPU_freeze(1, spufP, psxRegs.cycle);
SaveFuncs.write(f, spufP, Size);
SPU_freeze(1, spufP, psxRegs.cycle);
SaveFuncs.write(f, spufP, Size);
- free(spufP);
+ free(spufP);
spufP = NULL;
sioFreeze(f, 1);
cdrFreeze(f, 1);
sioFreeze(f, 1);
cdrFreeze(f, 1);
@@
-682,19
+691,22
@@
int SaveState(const char *file) {
mdecFreeze(f, 1);
new_dyna_freeze(f, 1);
mdecFreeze(f, 1);
new_dyna_freeze(f, 1);
+ result = 0;
+cleanup:
SaveFuncs.close(f);
SaveFuncs.close(f);
-
- return 0;
+ return result;
}
int LoadState(const char *file) {
}
int LoadState(const char *file) {
+ u32 biosBranchCheckOld = psxRegs.biosBranchCheck;
void *f;
void *f;
- GPUFreeze_t *gpufP;
- SPUFreeze_t *spufP;
+ GPUFreeze_t *gpufP
= NULL
;
+ SPUFreeze_t *spufP
= NULL
;
int Size;
char header[32];
u32 version;
boolean hle;
int Size;
char header[32];
u32 version;
boolean hle;
+ int result = -1;
f = SaveFuncs.open(file, "rb");
if (f == NULL) return -1;
f = SaveFuncs.open(file, "rb");
if (f == NULL) return -1;
@@
-704,8
+716,8
@@
int LoadState(const char *file) {
SaveFuncs.read(f, &hle, sizeof(boolean));
if (strncmp("STv4 PCSX", header, 9) != 0 || version != SaveVersion) {
SaveFuncs.read(f, &hle, sizeof(boolean));
if (strncmp("STv4 PCSX", header, 9) != 0 || version != SaveVersion) {
- S
aveFuncs.close(f
);
-
return -1
;
+ S
ysPrintf("incompatible savestate version %x\n", version
);
+
goto cleanup
;
}
Config.HLE = hle;
}
Config.HLE = hle;
@@
-718,6
+730,7
@@
int LoadState(const char *file) {
SaveFuncs.read(f, psxH, 0x00010000);
SaveFuncs.read(f, &psxRegs, offsetof(psxRegisters, gteBusyCycle));
psxRegs.gteBusyCycle = psxRegs.cycle;
SaveFuncs.read(f, psxH, 0x00010000);
SaveFuncs.read(f, &psxRegs, offsetof(psxRegisters, gteBusyCycle));
psxRegs.gteBusyCycle = psxRegs.cycle;
+ psxRegs.biosBranchCheck = ~0;
psxCpu->Notify(R3000ACPU_NOTIFY_AFTER_LOAD, NULL);
psxCpu->Notify(R3000ACPU_NOTIFY_AFTER_LOAD, NULL);
@@
-726,6
+739,7
@@
int LoadState(const char *file) {
// gpu
gpufP = (GPUFreeze_t *)malloc(sizeof(GPUFreeze_t));
// gpu
gpufP = (GPUFreeze_t *)malloc(sizeof(GPUFreeze_t));
+ if (gpufP == NULL) goto cleanup;
SaveFuncs.read(f, gpufP, sizeof(GPUFreeze_t));
GPU_freeze(0, gpufP);
free(gpufP);
SaveFuncs.read(f, gpufP, sizeof(GPUFreeze_t));
GPU_freeze(0, gpufP);
free(gpufP);
@@
-735,6
+749,7
@@
int LoadState(const char *file) {
// spu
SaveFuncs.read(f, &Size, 4);
spufP = (SPUFreeze_t *)malloc(Size);
// spu
SaveFuncs.read(f, &Size, 4);
spufP = (SPUFreeze_t *)malloc(Size);
+ if (spufP == NULL) goto cleanup;
SaveFuncs.read(f, spufP, Size);
SPU_freeze(0, spufP, psxRegs.cycle);
free(spufP);
SaveFuncs.read(f, spufP, Size);
SPU_freeze(0, spufP, psxRegs.cycle);
free(spufP);
@@
-746,9
+761,13
@@
int LoadState(const char *file) {
mdecFreeze(f, 0);
new_dyna_freeze(f, 0);
mdecFreeze(f, 0);
new_dyna_freeze(f, 0);
- SaveFuncs.close(f);
+ if (Config.HLE)
+ psxBiosCheckExe(biosBranchCheckOld, 0x60);
- return 0;
+ result = 0;
+cleanup:
+ SaveFuncs.close(f);
+ return result;
}
int CheckState(const char *file) {
}
int CheckState(const char *file) {