aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authortwinaphex2014-12-21 23:19:03 +0100
committertwinaphex2014-12-21 23:19:03 +0100
commite63a9dc66d0ce5a9d88353f880ef88a6590d06fd (patch)
tree6489b0d548ece33a4e92df40db442d839b934eb2
parent247fc699be6b3bd95fd9126541e0804cc8dffdd4 (diff)
parent5ec7acdfb1bc4c3da372f7f8e1a0a1022becce21 (diff)
downloadpcsx_rearmed-e63a9dc66d0ce5a9d88353f880ef88a6590d06fd.tar.gz
pcsx_rearmed-e63a9dc66d0ce5a9d88353f880ef88a6590d06fd.tar.bz2
pcsx_rearmed-e63a9dc66d0ce5a9d88353f880ef88a6590d06fd.zip
Merge https://github.com/notaz/pcsx_rearmed
-rw-r--r--frontend/libretro.c1
-rw-r--r--libpcsxcore/cdriso.c8
-rw-r--r--libpcsxcore/misc.c33
-rw-r--r--libpcsxcore/psxbios.c39
-rw-r--r--plugins/dfsound/freeze.c7
-rw-r--r--plugins/dfsound/spu.c15
6 files changed, 66 insertions, 37 deletions
diff --git a/frontend/libretro.c b/frontend/libretro.c
index 74b5dbf..fa544fd 100644
--- a/frontend/libretro.c
+++ b/frontend/libretro.c
@@ -1253,6 +1253,7 @@ void retro_init(void)
#else
cycle_multiplier = 200;
#endif
+ pl_rearmed_cbs.gpu_peops.iUseDither = 1;
McdDisable[0] = 0;
McdDisable[1] = 1;
diff --git a/libpcsxcore/cdriso.c b/libpcsxcore/cdriso.c
index d6672f9..b733f5b 100644
--- a/libpcsxcore/cdriso.c
+++ b/libpcsxcore/cdriso.c
@@ -552,9 +552,9 @@ static int parsecue(const char *isofile) {
pregapOffset = -1; // mark to fill track start_offset
}
else if (!strcmp(token, "FILE")) {
- t = sscanf(linebuf, " FILE \"%256[^\"]\"", tmpb);
+ t = sscanf(linebuf, " FILE \"%255[^\"]\"", tmpb);
if (t != 1)
- sscanf(linebuf, " FILE %256s", tmpb);
+ sscanf(linebuf, " FILE %255s", tmpb);
// absolute path?
ti[numtracks + 1].handle = fopen(tmpb, "rb");
@@ -795,6 +795,8 @@ static int handlepbp(const char *isofile) {
if (ext == NULL || (strcmp(ext, ".pbp") != 0 && strcmp(ext, ".PBP") != 0))
return -1;
+ fseek(cdHandle, 0, SEEK_SET);
+
numtracks = 0;
ret = fread(&pbp_hdr, 1, sizeof(pbp_hdr), cdHandle);
@@ -958,6 +960,8 @@ static int handlecbin(const char *isofile) {
if (ext == NULL || (strcasecmp(ext + 1, ".cbn") != 0 && strcasecmp(ext, ".cbin") != 0))
return -1;
+ fseek(cdHandle, 0, SEEK_SET);
+
ret = fread(&ciso_hdr, 1, sizeof(ciso_hdr), cdHandle);
if (ret != sizeof(ciso_hdr)) {
SysPrintf("failed to read ciso header\n");
diff --git a/libpcsxcore/misc.c b/libpcsxcore/misc.c
index 917a567..3ee9876 100644
--- a/libpcsxcore/misc.c
+++ b/libpcsxcore/misc.c
@@ -208,9 +208,9 @@ int LoadCdrom() {
// read the SYSTEM.CNF
READTRACK();
- sscanf((char *)buf + 12, "BOOT = cdrom:\\%256s", exename);
+ sscanf((char *)buf + 12, "BOOT = cdrom:\\%255s", exename);
if (GetCdromFile(mdir, time, exename) == -1) {
- sscanf((char *)buf + 12, "BOOT = cdrom:%256s", exename);
+ sscanf((char *)buf + 12, "BOOT = cdrom:%255s", exename);
if (GetCdromFile(mdir, time, exename) == -1) {
char *ptr = strstr((char *)buf + 12, "cdrom:");
if (ptr != NULL) {
@@ -268,7 +268,7 @@ int LoadCdromFile(const char *filename, EXE_HEADER *head) {
u32 size, addr;
void *mem;
- sscanf(filename, "cdrom:\\%256s", exename);
+ sscanf(filename, "cdrom:\\%255s", exename);
time[0] = itob(0); time[1] = itob(2); time[2] = itob(0x10);
@@ -312,7 +312,7 @@ int CheckCdrom() {
char *buf;
unsigned char mdir[4096];
char exename[256];
- int i, c;
+ int i, len, c;
FreePPFCache();
@@ -322,8 +322,9 @@ int CheckCdrom() {
READTRACK();
- CdromLabel[0] = '\0';
- CdromId[0] = '\0';
+ memset(CdromLabel, 0, sizeof(CdromLabel));
+ memset(CdromId, 0, sizeof(CdromId));
+ memset(exename, 0, sizeof(exename));
strncpy(CdromLabel, buf + 52, 32);
@@ -337,9 +338,9 @@ int CheckCdrom() {
if (GetCdromFile(mdir, time, "SYSTEM.CNF;1") != -1) {
READTRACK();
- sscanf(buf + 12, "BOOT = cdrom:\\%256s", exename);
+ sscanf(buf + 12, "BOOT = cdrom:\\%255s", exename);
if (GetCdromFile(mdir, time, exename) == -1) {
- sscanf(buf + 12, "BOOT = cdrom:%256s", exename);
+ sscanf(buf + 12, "BOOT = cdrom:%255s", exename);
if (GetCdromFile(mdir, time, exename) == -1) {
char *ptr = strstr(buf + 12, "cdrom:"); // possibly the executable is in some subdir
if (ptr != NULL) {
@@ -363,14 +364,13 @@ int CheckCdrom() {
return -1; // SYSTEM.CNF and PSX.EXE not found
if (CdromId[0] == '\0') {
- i = strlen(exename);
- if (i >= 2) {
- if (exename[i - 2] == ';') i-= 2;
- c = 8; i--;
- while (i >= 0 && c >= 0) {
- if (isalnum(exename[i])) CdromId[c--] = exename[i];
- i--;
- }
+ len = strlen(exename);
+ c = 0;
+ for (i = 0; i < len; ++i) {
+ if (exename[i] == ';' || c >= sizeof(CdromId) - 1)
+ break;
+ if (isalnum(exename[i]))
+ CdromId[c++] = exename[i];
}
}
@@ -388,6 +388,7 @@ int CheckCdrom() {
}
SysPrintf(_("CD-ROM Label: %.32s\n"), CdromLabel);
SysPrintf(_("CD-ROM ID: %.9s\n"), CdromId);
+ SysPrintf(_("CD-ROM EXE Name: %.255s\n"), exename);
BuildPPFCache();
diff --git a/libpcsxcore/psxbios.c b/libpcsxcore/psxbios.c
index 04c959a..292d80d 100644
--- a/libpcsxcore/psxbios.c
+++ b/libpcsxcore/psxbios.c
@@ -613,14 +613,14 @@ void psxBios_tolower() { // 0x26
void psxBios_bcopy() { // 0x27
char *p1 = (char *)Ra1, *p2 = (char *)Ra0;
- while (a2-- > 0) *p1++ = *p2++;
+ while ((s32)a2-- > 0) *p1++ = *p2++;
pc0 = ra;
}
void psxBios_bzero() { // 0x28
char *p = (char *)Ra0;
- while (a1-- > 0) *p++ = '\0';
+ while ((s32)a1-- > 0) *p++ = '\0';
pc0 = ra;
}
@@ -630,7 +630,7 @@ void psxBios_bcmp() { // 0x29
if (a0 == 0 || a1 == 0) { v0 = 0; pc0 = ra; return; }
- while (a2-- > 0) {
+ while ((s32)a2-- > 0) {
if (*p1++ != *p2++) {
v0 = *p1 - *p2; // BUG: compare the NEXT byte
pc0 = ra;
@@ -643,15 +643,16 @@ void psxBios_bcmp() { // 0x29
void psxBios_memcpy() { // 0x2a
char *p1 = (char *)Ra0, *p2 = (char *)Ra1;
- while (a2-- > 0) *p1++ = *p2++;
+ while ((s32)a2-- > 0) *p1++ = *p2++;
v0 = a0; pc0 = ra;
}
void psxBios_memset() { // 0x2b
char *p = (char *)Ra0;
- while (a2-- > 0) *p++ = (char)a1;
+ while ((s32)a2-- > 0) *p++ = (char)a1;
+ a2 = 0;
v0 = a0; pc0 = ra;
}
@@ -662,9 +663,9 @@ void psxBios_memmove() { // 0x2c
a2++; // BUG: copy one more byte here
p1 += a2;
p2 += a2;
- while (a2-- > 0) *--p1 = *--p2;
+ while ((s32)a2-- > 0) *--p1 = *--p2;
} else {
- while (a2-- > 0) *p1++ = *p2++;
+ while ((s32)a2-- > 0) *p1++ = *p2++;
}
v0 = a0; pc0 = ra;
@@ -677,7 +678,7 @@ void psxBios_memcmp() { // 0x2d
void psxBios_memchr() { // 0x2e
char *p = (char *)Ra0;
- while (a2-- > 0) {
+ while ((s32)a2-- > 0) {
if (*p++ != (s8)a1) continue;
v0 = a0 + (p - (char *)Ra0 - 1);
pc0 = ra;
@@ -1025,6 +1026,26 @@ _start:
pc0 = ra;
}
+void psxBios_format() { // 0x41
+ if (strcmp(Ra0, "bu00:") == 0 && Config.Mcd1[0] != '\0')
+ {
+ CreateMcd(Config.Mcd1);
+ LoadMcd(1, Config.Mcd1);
+ v0 = 1;
+ }
+ else if (strcmp(Ra0, "bu10:") == 0 && Config.Mcd2[0] != '\0')
+ {
+ CreateMcd(Config.Mcd2);
+ LoadMcd(2, Config.Mcd2);
+ v0 = 1;
+ }
+ else
+ {
+ v0 = 0;
+ }
+ pc0 = ra;
+}
+
/*
* long Load(char *name, struct EXEC *header);
*/
@@ -2521,7 +2542,7 @@ void psxBiosInit() {
biosB0[0x3c] = psxBios_getchar;
//biosB0[0x3e] = psxBios_gets;
//biosB0[0x40] = psxBios_cd;
- //biosB0[0x41] = psxBios_format;
+ biosB0[0x41] = psxBios_format;
biosB0[0x42] = psxBios_firstfile;
biosB0[0x43] = psxBios_nextfile;
biosB0[0x44] = psxBios_rename;
diff --git a/plugins/dfsound/freeze.c b/plugins/dfsound/freeze.c
index b865b84..d38faa6 100644
--- a/plugins/dfsound/freeze.c
+++ b/plugins/dfsound/freeze.c
@@ -307,6 +307,9 @@ long CALLBACK SPUfreeze(uint32_t ulFreezeMode, SPUFreeze_t * pF,
ClearWorkingState();
spu.cycles_played = cycles;
+ if (spu.spuCtrl & CTRL_IRQ)
+ schedule_next_irq();
+
return 1;
}
@@ -318,7 +321,7 @@ void LoadStateV5(SPUFreeze_t * pF)
pFO=(SPUOSSFreeze_t *)(pF+1);
- if(pFO->pSpuIrq) spu.pSpuIrq = spu.spuMemC+((long)pFO->pSpuIrq&0x7fff0); else spu.pSpuIrq=NULL;
+ spu.pSpuIrq = spu.spuMemC + ((spu.regArea[(H_SPUirqAddr - 0x0c00) / 2] << 3) & ~0xf);
if(pFO->spuAddr)
{
@@ -353,7 +356,7 @@ void LoadStateUnknown(SPUFreeze_t * pF, uint32_t cycles)
spu.dwNewChannel=0;
spu.dwChannelOn=0;
spu.dwChannelDead=0;
- spu.pSpuIrq=0;
+ spu.pSpuIrq=spu.spuMemC;
for(i=0;i<0xc0;i++)
{
diff --git a/plugins/dfsound/spu.c b/plugins/dfsound/spu.c
index ca362b7..835555d 100644
--- a/plugins/dfsound/spu.c
+++ b/plugins/dfsound/spu.c
@@ -5,7 +5,7 @@
copyright : (C) 2002 by Pete Bernert
email : BlackDove@addcom.de
- Portions (C) Gražvydas "notaz" Ignotas, 2010-2012
+ Portions (C) Gražvydas "notaz" Ignotas, 2010-2012,2014
***************************************************************************/
/***************************************************************************
@@ -253,14 +253,13 @@ INLINE void StartSound(int ch)
s_chan[ch].SB[26]=0; // init mixing vars
s_chan[ch].SB[27]=0;
- s_chan[ch].iSBPos=28;
+ s_chan[ch].iSBPos=27;
+ s_chan[ch].SB[28]=0;
s_chan[ch].SB[29]=0; // init our interpolation helpers
s_chan[ch].SB[30]=0;
-
- if(spu_config.iUseInterpolation>=2) // gauss interpolation?
- {s_chan[ch].spos=0x30000L;s_chan[ch].SB[28]=0;} // -> start with more decoding
- else {s_chan[ch].spos=0x10000L;s_chan[ch].SB[31]=0;} // -> no/simple interpolation starts with one 44100 decoding
+ s_chan[ch].SB[31]=0;
+ s_chan[ch].spos=0;
spu.dwNewChannel&=~(1<<ch); // clear new channel bit
}
@@ -738,7 +737,7 @@ void do_samples(unsigned int cycles_to)
// an IRQ.
if (unlikely((spu.spuCtrl & CTRL_IRQ)
- && spu.pSpuIrq && spu.pSpuIrq < spu.spuMemC+0x1000))
+ && spu.pSpuIrq < spu.spuMemC+0x1000))
{
int irq_pos = (spu.pSpuIrq - spu.spuMemC) / 2 & 0x1ff;
int left = (irq_pos - spu.decode_pos) & 0x1ff;
@@ -1027,7 +1026,7 @@ long CALLBACK SPUinit(void)
spu.spuAddr = 0xffffffff;
spu.decode_pos = 0;
memset((void *)s_chan, 0, sizeof(s_chan));
- spu.pSpuIrq = 0;
+ spu.pSpuIrq = spu.spuMemC;
SetupStreams(); // prepare streaming