#else
cycle_multiplier = 200;
#endif
+ pl_rearmed_cbs.gpu_peops.iUseDither = 1;
McdDisable[0] = 0;
McdDisable[1] = 1;
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");
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);
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");
// 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) {
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);
char *buf;
unsigned char mdir[4096];
char exename[256];
- int i, c;
+ int i, len, c;
FreePPFCache();
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);
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) {
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];
}
}
}
SysPrintf(_("CD-ROM Label: %.32s\n"), CdromLabel);
SysPrintf(_("CD-ROM ID: %.9s\n"), CdromId);
+ SysPrintf(_("CD-ROM EXE Name: %.255s\n"), exename);
BuildPPFCache();
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;
}
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;
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;
}
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;
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;
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);
*/
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;
ClearWorkingState();\r
spu.cycles_played = cycles;\r
\r
+ if (spu.spuCtrl & CTRL_IRQ)\r
+ schedule_next_irq();\r
+\r
return 1;\r
}\r
\r
\r
pFO=(SPUOSSFreeze_t *)(pF+1);\r
\r
- if(pFO->pSpuIrq) spu.pSpuIrq = spu.spuMemC+((long)pFO->pSpuIrq&0x7fff0); else spu.pSpuIrq=NULL;\r
+ spu.pSpuIrq = spu.spuMemC + ((spu.regArea[(H_SPUirqAddr - 0x0c00) / 2] << 3) & ~0xf);\r
\r
if(pFO->spuAddr)\r
{\r
spu.dwNewChannel=0;\r
spu.dwChannelOn=0;\r
spu.dwChannelDead=0;\r
- spu.pSpuIrq=0;\r
+ spu.pSpuIrq=spu.spuMemC;\r
\r
for(i=0;i<0xc0;i++)\r
{\r
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
***************************************************************************/
/***************************************************************************
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
}
// 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;
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