summaryrefslogtreecommitdiff
path: root/libpcsxcore
diff options
context:
space:
mode:
authoriCatButler <i.am.catbutler@gmail.com>2016-03-30 15:07:35 +0100
committeriCatButler <i.am.catbutler@gmail.com>2016-03-30 15:07:35 +0100
commit8b4350fee747708ffd376744ef5dc1e239a87ba6 (patch)
treea9ab6e2f25e06edc7c668353f8000856704f7fa3 /libpcsxcore
parente3df273095a5800e3dcdcb63bd66e269c0c2d3a8 (diff)
downloadpcsxr-8b4350fee747708ffd376744ef5dc1e239a87ba6.tar.gz
Bring up to date with PCSX-R master (97809)
Diffstat (limited to 'libpcsxcore')
-rwxr-xr-xlibpcsxcore/cdrom.c2
-rwxr-xr-xlibpcsxcore/ix86/iR3000A.c4
-rwxr-xr-xlibpcsxcore/ix86_64/iR3000A-64.c5
-rwxr-xr-xlibpcsxcore/misc.c28
-rwxr-xr-xlibpcsxcore/plugins.c3
-rwxr-xr-xlibpcsxcore/plugins.h2
-rwxr-xr-xlibpcsxcore/psxbios.c218
-rwxr-xr-xlibpcsxcore/psxcommon.h2
-rwxr-xr-xlibpcsxcore/sio.c12
-rwxr-xr-xlibpcsxcore/sio.h3
10 files changed, 187 insertions, 92 deletions
diff --git a/libpcsxcore/cdrom.c b/libpcsxcore/cdrom.c
index 2aa6f9ad..f92cdd22 100755
--- a/libpcsxcore/cdrom.c
+++ b/libpcsxcore/cdrom.c
@@ -1328,7 +1328,7 @@ void cdrWrite1(unsigned char rt) {
set_loc[i] = btoi(cdr.Param[i]);
i = msf2sec(cdr.SetSectorPlay);
- i = abs(i - msf2sec(set_loc));
+ i = abs(i - (int)msf2sec(set_loc));
if (i > 16)
cdr.Seeked = SEEK_PENDING;
diff --git a/libpcsxcore/ix86/iR3000A.c b/libpcsxcore/ix86/iR3000A.c
index 2ba1cd18..3d662537 100755
--- a/libpcsxcore/ix86/iR3000A.c
+++ b/libpcsxcore/ix86/iR3000A.c
@@ -418,6 +418,8 @@ static int recInit() {
for (i = 0; i < 0x08; i++) psxRecLUT[i + 0xbfc0] = (u32)&recROM[i << 16];
+ x86Init();
+
return 0;
}
@@ -425,8 +427,6 @@ static void recReset() {
memset(recRAM, 0, 0x200000);
memset(recROM, 0, 0x080000);
- x86Init();
-
x86SetPtr(recMem);
branch = 0;
diff --git a/libpcsxcore/ix86_64/iR3000A-64.c b/libpcsxcore/ix86_64/iR3000A-64.c
index 13cb432c..5c24142a 100755
--- a/libpcsxcore/ix86_64/iR3000A-64.c
+++ b/libpcsxcore/ix86_64/iR3000A-64.c
@@ -482,6 +482,9 @@ static int recInit() {
for (i=0; i<0x08; i++) psxRecLUT[i + 0xbfc0] = (uptr)&recROM[PTRMULT*(i << 16)];
+ //x86Init();
+ cpudetectInit();
+
return 0;
}
@@ -489,8 +492,6 @@ static void recReset() {
memset(recRAM, 0, 0x200000 * PTRMULT);
memset(recROM, 0, 0x080000 * PTRMULT);
- //x86Init();
- cpudetectInit();
x86SetPtr(recMem);
branch = 0;
diff --git a/libpcsxcore/misc.c b/libpcsxcore/misc.c
index f0f1c4ee..33944cd3 100755
--- a/libpcsxcore/misc.c
+++ b/libpcsxcore/misc.c
@@ -229,8 +229,17 @@ int LoadCdromFile(const char *filename, EXE_HEADER *head) {
u8 time[4],*buf;
u8 mdir[4096], exename[256];
u32 size, addr;
-
- sscanf(filename, "cdrom:\\%255s", exename);
+ void *psxaddr;
+
+ if (sscanf(filename, "cdrom:\\%255s", exename) <= 0)
+ {
+ // Some games omit backslash (NFS4)
+ if (sscanf(filename, "cdrom:%255s", exename) <= 0)
+ {
+ SysPrintf("LoadCdromFile: EXE NAME PARSING ERROR (%s (%u))\n", filename, strlen(filename));
+ exit (1);
+ }
+ }
time[0] = itob(0); time[1] = itob(2); time[2] = itob(0x10);
@@ -259,7 +268,9 @@ int LoadCdromFile(const char *filename, EXE_HEADER *head) {
incTime();
READTRACK();
- memcpy((void *)PSXM(addr), buf + 12, 2048);
+ psxaddr = (void *)PSXM(addr);
+ assert(psxaddr != NULL);
+ memcpy(psxaddr, buf + 12, 2048);
size -= 2048;
addr += 2048;
@@ -360,13 +371,15 @@ int CheckCdrom() {
static int PSXGetFileType(FILE *f) {
unsigned long current;
- u8 mybuf[2048];
+ u8 mybuf[sizeof(EXE_HEADER)]; // EXE_HEADER currently biggest
EXE_HEADER *exe_hdr;
FILHDR *coff_hdr;
+ size_t amt;
+ memset(mybuf, 0, sizeof(mybuf));
current = ftell(f);
fseek(f, 0L, SEEK_SET);
- fread(mybuf, 2048, 1, f);
+ amt = fread(mybuf, sizeof(mybuf), 1, f);
fseek(f, current, SEEK_SET);
exe_hdr = (EXE_HEADER *)mybuf;
@@ -408,6 +421,7 @@ int Load(const char *ExePath) {
int retval = 0;
u8 opcode;
u32 section_address, section_size;
+ void* psxmaddr;
strncpy(CdromId, "SLUS99999", 9);
strncpy(CdromLabel, "SLUS_999.99", 11);
@@ -479,7 +493,9 @@ int Load(const char *ExePath) {
fseek(tmpFile, SWAP32(section.s_scnptr), SEEK_SET);
fread(PSXM(SWAP32(section.s_paddr)), SWAP32(section.s_size), 1, tmpFile);
} else {
- memset(PSXM(SWAP32(section.s_paddr)), 0, SWAP32(section.s_size));
+ psxmaddr = PSXM(SWAP32(section.s_paddr));
+ assert(psxmaddr != NULL);
+ memset(psxmaddr, 0, SWAP32(section.s_size));
}
}
break;
diff --git a/libpcsxcore/plugins.c b/libpcsxcore/plugins.c
index 54c7e468..1713670e 100755
--- a/libpcsxcore/plugins.c
+++ b/libpcsxcore/plugins.c
@@ -54,6 +54,7 @@ GPUvBlank GPU_vBlank;
GPUvisualVibration GPU_visualVibration;
GPUcursor GPU_cursor;
GPUaddVertex GPU_addVertex;
+GPUsetSpeed GPU_setSpeed;
GPUpgxpMemory GPU_pgxpMemory;
CDRinit CDR_init;
@@ -215,6 +216,7 @@ void CALLBACK GPU__vBlank(int val) {}
void CALLBACK GPU__visualVibration(unsigned long iSmall, unsigned long iBig) {}
void CALLBACK GPU__cursor(int player, int x, int y) {}
void CALLBACK GPU__addVertex(short sx,short sy,s64 fx,s64 fy,s64 fz) {}
+void CALLBACK GPU__setSpeed(float newSpeed) {}
void CALLBACK GPU__pgxpMemory(unsigned char* pMem, unsigned int count, unsigned int addr, unsigned char* pVRAM) {}
#define LoadGpuSym1(dest, name) \
@@ -261,6 +263,7 @@ static int LoadGPUplugin(const char *GPUdll) {
LoadGpuSym0(visualVibration, "GPUvisualVibration");
LoadGpuSym0(cursor, "GPUcursor");
LoadGpuSym0(addVertex, "GPUaddVertex");
+ LoadGpuSym0(setSpeed, "GPUsetSpeed");
LoadGpuSym0(pgxpMemory, "GPUpgxpMemory");
LoadGpuSym0(configure, "GPUconfigure");
LoadGpuSym0(test, "GPUtest");
diff --git a/libpcsxcore/plugins.h b/libpcsxcore/plugins.h
index 8f2cc189..c77c0ae0 100755
--- a/libpcsxcore/plugins.h
+++ b/libpcsxcore/plugins.h
@@ -96,6 +96,7 @@ typedef void (CALLBACK* GPUvBlank)(int);
typedef void (CALLBACK* GPUvisualVibration)(uint32_t, uint32_t);
typedef void (CALLBACK* GPUcursor)(int, int, int);
typedef void (CALLBACK* GPUaddVertex)(short,short,s64,s64,s64);
+typedef void (CALLBACK* GPUsetSpeed)(float); // 1.0 = natural speed
typedef void (CALLBACK* GPUpgxpMemory)(unsigned int, unsigned char*);
// GPU function pointers
@@ -126,6 +127,7 @@ extern GPUvBlank GPU_vBlank;
extern GPUvisualVibration GPU_visualVibration;
extern GPUcursor GPU_cursor;
extern GPUaddVertex GPU_addVertex;
+extern GPUsetSpeed GPU_setSpeed;
extern GPUpgxpMemory GPU_pgxpMemory;
// CD-ROM Functions
diff --git a/libpcsxcore/psxbios.c b/libpcsxcore/psxbios.c
index 204e7536..2f6ce415 100755
--- a/libpcsxcore/psxbios.c
+++ b/libpcsxcore/psxbios.c
@@ -165,12 +165,21 @@ char *biosC0n[256] = {
#define ra (psxRegs.GPR.n.ra)
#define pc0 (psxRegs.pc)
+#ifdef __NO_ASSERTS__
#define Ra0 ((char *)PSXM(a0))
#define Ra1 ((char *)PSXM(a1))
#define Ra2 ((char *)PSXM(a2))
#define Ra3 ((char *)PSXM(a3))
#define Rv0 ((char *)PSXM(v0))
#define Rsp ((char *)PSXM(sp))
+#else
+#define Ra0 (assert(PSXM(a0) != NULL), (char *)PSXM(a0))
+#define Ra1 (assert(PSXM(a1) != NULL), (char *)PSXM(a1))
+#define Ra2 (assert(PSXM(a2) != NULL), (char *)PSXM(a2))
+#define Ra3 (assert(PSXM(a3) != NULL), (char *)PSXM(a3))
+#define Rv0 (assert(PSXM(v0) != NULL), (char *)PSXM(v0))
+#define Rsp (assert(PSXM(sp) != NULL), (char *)PSXM(sp))
+#endif
typedef struct {
u32 desc;
@@ -655,7 +664,7 @@ void psxBios_memset() { // 0x2b
while((s32)a2 > 0)
{
a2--;
- psxMu8ref(a0) = a1;
+ *PSXM(a0) = a1;
a0++;
}
}
@@ -964,7 +973,7 @@ void psxBios_printf() { // 0x3f
char *ptmp = tmp;
int n=1, i=0, j;
- memcpy(save, (char*)PSXM(sp), 4 * 4);
+ memcpy(save, Rsp, 4 * 4);
psxMu32ref(sp) = SWAP32((u32)a0);
psxMu32ref(sp + 4) = SWAP32((u32)a1);
psxMu32ref(sp + 8) = SWAP32((u32)a2);
@@ -1018,7 +1027,7 @@ _start:
}
*ptmp = 0;
- memcpy((char*)PSXM(sp), save, 4 * 4);
+ memcpy(Rsp, save, 4 * 4);
#ifdef PSXBIOS_LOG
PSXBIOS_LOG("psxBios_%s: %s\n", biosA0n[0x3f], tmp);
@@ -1273,16 +1282,34 @@ void psxBios_SetMem() { // 9f
}
void psxBios__card_info() { // ab
- // COTS password option
- boolean nocard = (Config.NoMemcard || ((strlen(Config.Mcd1) <=0) && (strlen(Config.Mcd2) <=0)));
+ u32 ret;
#ifdef PSXBIOS_LOG
- PSXBIOS_LOG("psxBios_%s: %x\n", biosA0n[0xab], a0);
+ PSXBIOS_LOG("psxBios_%s: 0x%x\n", biosA0n[0xab], a0);
#endif
card_active_chan = a0;
+ switch (card_active_chan) {
+ case 0x00: case 0x01: case 0x02: case 0x03:
+ ret = Config.Mcd1[0] ? 0x2 : 0x8;
+ break;
+ case 0x10: case 0x11: case 0x12: case 0x13:
+ ret = Config.Mcd2[0] ? 0x2 : 0x8;
+ break;
+ default:
+#ifdef PSXBIOS_LOG
+ PSXBIOS_LOG("psxBios_%s: UNKNOWN PORT 0x%x\n", biosA0n[0xab], card_active_chan);
+#endif
+ ret = 0x11;
+ break;
+ }
+
+ // COTS password option
+ if (Config.NoMemcard)
+ ret = 0x8;
+
// DeliverEvent(0x11, 0x2); // 0xf0000011, 0x0004
- DeliverEvent(0x81, nocard ? 0x8 : 0x2); // 0xf4000001, 0x0004
+ DeliverEvent(0x81, ret); // 0xf4000001, 0x0004
v0 = 1; pc0 = ra;
}
@@ -1673,43 +1700,68 @@ void psxBios_UnDeliverEvent() { // 0x20
pc0 = ra;
}
-#define buopen(mcd) { \
- strcpy(FDesc[1 + mcd].name, Ra0+5); \
- FDesc[1 + mcd].offset = 0; \
- FDesc[1 + mcd].mode = a1; \
- \
- for (i=1; i<16; i++) { \
- ptr = Mcd##mcd##Data + 128 * i; \
- if ((*ptr & 0xF0) != 0x50) continue; \
- if (strcmp(FDesc[1 + mcd].name, ptr+0xa)) continue; \
- FDesc[1 + mcd].mcfile = i; \
- SysPrintf("open %s\n", ptr+0xa); \
- v0 = 1 + mcd; \
- break; \
- } \
- if (a1 & 0x200 && v0 == -1) { /* FCREAT */ \
- for (i=1; i<16; i++) { \
- int j, xor = 0; \
- \
- ptr = Mcd##mcd##Data + 128 * i; \
- if ((*ptr & 0xF0) == 0x50) continue; \
- ptr[0] = 0x50 | (u8)(a1 >> 16); \
- ptr[4] = 0x00; \
- ptr[5] = 0x20; \
- ptr[6] = 0x00; \
- ptr[7] = 0x00; \
- ptr[8] = 'B'; \
- ptr[9] = 'I'; \
- strcpy(ptr+0xa, FDesc[1 + mcd].name); \
- for (j=0; j<127; j++) xor^= ptr[j]; \
- ptr[127] = xor; \
- FDesc[1 + mcd].mcfile = i; \
- SysPrintf("openC %s\n", ptr); \
- v0 = 1 + mcd; \
- SaveMcd(Config.Mcd##mcd, Mcd##mcd##Data, 128 * i, 128); \
- break; \
- } \
- } \
+static void buopen(int mcd, u8 *ptr, u8 *cfg)
+{
+ int i;
+ u8 *fptr = ptr;
+
+ strcpy(FDesc[1 + mcd].name, Ra0+5);
+ FDesc[1 + mcd].offset = 0;
+ FDesc[1 + mcd].mode = a1;
+
+ for (i=1; i<16; i++) {
+ fptr += 128;
+ if ((*fptr & 0xF0) != 0x50) continue;
+ if (strcmp(FDesc[1 + mcd].name, fptr+0xa)) continue;
+ FDesc[1 + mcd].mcfile = i;
+ SysPrintf("open %s\n", fptr+0xa);
+ v0 = 1 + mcd;
+ break;
+ }
+ if (a1 & 0x200 && v0 == -1) { /* FCREAT */
+ fptr = ptr;
+ for (i=1; i<16; i++) {
+ int j, xor, nblk = a1 >> 16;
+ u8 *pptr, *fptr2;
+
+ fptr += 128;
+ if ((*fptr & 0xF0) != 0xa0) continue;
+
+ FDesc[1 + mcd].mcfile = i;
+ fptr[0] = 0x51;
+ fptr[4] = 0x00;
+ fptr[5] = 0x20 * nblk;
+ fptr[6] = 0x00;
+ fptr[7] = 0x00;
+ strcpy(fptr+0xa, FDesc[1 + mcd].name);
+ pptr = fptr2 = fptr;
+ for(j=2; j<=nblk; j++) {
+ int k;
+ for(i++; i<16; i++) {
+ fptr2 += 128;
+
+ memset(fptr2, 0, 128);
+ fptr2[0] = j < nblk ? 0x52 : 0x53;
+ pptr[8] = i - 1;
+ pptr[9] = 0;
+ for (k=0, xor=0; k<127; k++) xor^= pptr[k];
+ pptr[127] = xor;
+ pptr = fptr2;
+ break;
+ }
+ /* shouldn't this return ENOSPC if i == 16? */
+ }
+ pptr[8] = pptr[9] = 0xff;
+ for (j=0, xor=0; j<127; j++) xor^= pptr[j];
+ pptr[127] = xor;
+ SysPrintf("openC %s %d\n", ptr, nblk);
+ v0 = 1 + mcd;
+ /* just go ahead and resave them all */
+ SaveMcd(cfg, ptr, 128, 128 * 15);
+ break;
+ }
+ /* shouldn't this return ENOSPC if i == 16? */
+ }
}
/*
@@ -1717,8 +1769,7 @@ void psxBios_UnDeliverEvent() { // 0x20
*/
void psxBios_open() { // 0x32
- int i;
- char *ptr;
+
#ifdef PSXBIOS_LOG
PSXBIOS_LOG("psxBios_%s: %s,%x\n", biosB0n[0x32], Ra0, a1);
@@ -1727,11 +1778,11 @@ void psxBios_open() { // 0x32
v0 = -1;
if (!strncmp(Ra0, "bu00", 4)) {
- buopen(1);
+ buopen(1, Mcd1Data, Config.Mcd1);
}
if (!strncmp(Ra0, "bu10", 4)) {
- buopen(2);
+ buopen(2, Mcd2Data, Config.Mcd2);
}
pc0 = ra;
@@ -1770,7 +1821,7 @@ void psxBios_lseek() { // 0x33
if (FDesc[1 + mcd].mode & 0x8000) v0 = 0; \
else v0 = a2; \
FDesc[1 + mcd].offset += v0; \
- DeliverEvent(0x11, 0x2); /* 0xf0000011, 0x0004 */ \
+ DeliverEvent(0x11, 0x2); /* 0xf0000011, 0x0004 */ \
DeliverEvent(0x81, 0x2); /* 0xf4000001, 0x0004 */ \
}
@@ -1791,7 +1842,7 @@ void psxBios_read() { // 0x34
case 2: buread(1); break;
case 3: buread(2); break;
}
-
+
pc0 = ra;
}
@@ -1804,7 +1855,7 @@ void psxBios_read() { // 0x34
SaveMcd(Config.Mcd##mcd, Mcd##mcd##Data, offset, a2); \
if (FDesc[1 + mcd].mode & 0x8000) v0 = 0; \
else v0 = a2; \
- DeliverEvent(0x11, 0x2); /* 0xf0000011, 0x0004 */ \
+ DeliverEvent(0x11, 0x2); /* 0xf0000011, 0x0004 */ \
DeliverEvent(0x81, 0x2); /* 0xf4000001, 0x0004 */ \
}
@@ -1855,21 +1906,21 @@ char psxstrbuf[PSXSTRBUFMAX+1];
unsigned short psxstrbuf_count = 0;
void psxBios_putchar() { // 3d
- char logchar = ( a0 == 0xa ? '>' : (char)a0 );
- if (psxstrbuf_count < PSXSTRBUFMAX) psxstrbuf[psxstrbuf_count++] = logchar;
+ char logchar = ( a0 == 0xa ? '>' : (char)a0 );
+ if (psxstrbuf_count < PSXSTRBUFMAX) psxstrbuf[psxstrbuf_count++] = logchar;
#ifdef PSXBIOS_LOG
PSXBIOS_LOG("psxBios_%s: %x (%c)\n", biosB0n[0x3d], a0, logchar);
#else
SysPrintf("%c", (char)a0);
#endif
- if ((a0 == 0xa && psxstrbuf_count >= 2) || psxstrbuf_count >= PSXSTRBUFMAX) {
- psxstrbuf[psxstrbuf_count++] = '\0';
+ if ((a0 == 0xa && psxstrbuf_count >= 2) || psxstrbuf_count >= PSXSTRBUFMAX) {
+ psxstrbuf[psxstrbuf_count++] = '\0';
#ifdef PSXBIOS_LOG
- PSXBIOS_LOG("psxBios_%s: string_[%d]_cr: %s\n", biosB0n[0x3d], psxstrbuf_count, psxstrbuf);
+ PSXBIOS_LOG("psxBios_%s: string_[%d]_cr: %s\n", biosB0n[0x3d], psxstrbuf_count, psxstrbuf);
#endif
- psxstrbuf_count = 0;
- }
+ psxstrbuf_count = 0;
+ }
pc0 = ra;
}
@@ -1890,17 +1941,18 @@ int nfile;
while (nfile < 16) { \
int match=1; \
\
- ptr = Mcd##mcd##Data + 128 * nfile; \
+ ptr = Mcd##mcd##Data + 128 * (nfile + 1); \
nfile++; \
if ((*ptr & 0xF0) != 0x50) continue; \
+ /* Bug link files show up as free block. */ \
+ if (!ptr[0xa]) continue; \
ptr+= 0xa; \
if (pfile[0] == 0) { \
strncpy(dir->name, ptr, sizeof(dir->name)); \
- dir->name[sizeof(dir->name) - 1] = '\0'; \
+ dir->name[sizeof(dir->name)] = '\0'; \
} else for (i=0; i<20; i++) { \
if (pfile[i] == ptr[i]) { \
- dir->name[i] = ptr[i]; \
- if (ptr[i] == 0) break; else continue; } \
+ dir->name[i] = ptr[i]; continue; } \
if (pfile[i] == '?') { \
dir->name[i] = ptr[i]; continue; } \
if (pfile[i] == '*') { \
@@ -1908,7 +1960,7 @@ int nfile;
match = 0; break; \
} \
SysPrintf("%d : %s = %s + %s (match=%d)\n", nfile, dir->name, pfile, ptr, match); \
- if (match == 0) continue; \
+ if (match == 0) { continue; } \
dir->size = 8192; \
v0 = _dir; \
break; \
@@ -1933,10 +1985,13 @@ void psxBios_firstfile() { // 42
strcpy(ffile, Ra0);
pfile = ffile+5;
- nfile = 1;
+ nfile = 0;
+
if (!strncmp(Ra0, "bu00", 4)) {
+ DeliverEvent(0x11, 0x2);
bufile(1);
} else if (!strncmp(Ra0, "bu10", 4)) {
+ DeliverEvent(0x11, 0x2);
bufile(2);
}
@@ -2082,21 +2137,21 @@ void psxBios_StopCARD() { // 4c
}
void psxBios__card_write() { // 0x4e
- int port;
+ int const port = a0 >> 4;
+ u32 const sect = a1 % (MCD_SIZE/8); // roll on range 0...3FFF
#ifdef PSXBIOS_LOG
- PSXBIOS_LOG("psxBios_%s: %x,%x,%x\n", biosB0n[0x4e], a0, a1, a2);
+ PSXBIOS_LOG("psxBios_%s, PORT=%i, SECT=%u(%u), DEST=%p\n", biosB0n[0x4e], port, sect, a1, a2);
#endif
card_active_chan = a0;
- port = a0 >> 4;
if (port == 0) {
- memcpy(Mcd1Data + a1 * 128, Ra2, 128);
- SaveMcd(Config.Mcd1, Mcd1Data, a1 * 128, 128);
+ memcpy(Mcd1Data + (sect * MCD_SECT_SIZE), Ra2, MCD_SECT_SIZE);
+ SaveMcd(Config.Mcd1, Mcd1Data, sect * MCD_SECT_SIZE, MCD_SECT_SIZE);
} else {
- memcpy(Mcd2Data + a1 * 128, Ra2, 128);
- SaveMcd(Config.Mcd2, Mcd2Data, a1 * 128, 128);
+ memcpy(Mcd2Data + (sect * MCD_SECT_SIZE), Ra2, MCD_SECT_SIZE);
+ SaveMcd(Config.Mcd2, Mcd2Data, sect * MCD_SECT_SIZE, MCD_SECT_SIZE);
}
DeliverEvent(0x11, 0x2); // 0xf0000011, 0x0004
@@ -2106,19 +2161,19 @@ void psxBios__card_write() { // 0x4e
}
void psxBios__card_read() { // 0x4f
- int port;
+ int const port = a0 >> 4;
+ u32 const sect = a1 % (MCD_SIZE/8); // roll on range 0...3FFF
#ifdef PSXBIOS_LOG
- PSXBIOS_LOG("psxBios_%s\n", biosB0n[0x4f]);
+ PSXBIOS_LOG("psxBios_%s, PORT=%i, SECT=%u(%u), DEST=%p\n", biosB0n[0x4f], port, sect, a1, a2);
#endif
card_active_chan = a0;
- port = a0 >> 4;
if (port == 0) {
- memcpy(Ra2, Mcd1Data + a1 * 128, 128);
+ memcpy(Ra2, Mcd1Data + (sect * MCD_SECT_SIZE), MCD_SECT_SIZE);
} else {
- memcpy(Ra2, Mcd2Data + a1 * 128, 128);
+ memcpy(Ra2, Mcd2Data + (sect * MCD_SECT_SIZE), MCD_SECT_SIZE);
}
DeliverEvent(0x11, 0x2); // 0xf0000011, 0x0004
@@ -2178,6 +2233,15 @@ void psxBios_Krom2RawAdd() { // 0x51
pc0 = ra;
}
+// stub?
+void psxBios__get_error() { // 55
+#ifdef PSXBIOS_LOG
+ PSXBIOS_LOG("psxBios_%s\n", biosB0n[0x55]);
+#endif
+
+ v0 = 0; pc0 = ra;
+}
+
void psxBios_GetC0Table() { // 56
#ifdef PSXBIOS_LOG
PSXBIOS_LOG("psxBios_%s\n", biosB0n[0x56]);
@@ -2566,7 +2630,7 @@ void psxBiosInit() {
//biosB0[0x52] = psxBios_sys_b0_52;
//biosB0[0x53] = psxBios_sys_b0_53;
//biosB0[0x54] = psxBios__get_errno;
- //biosB0[0x55] = psxBios__get_error;
+ biosB0[0x55] = psxBios__get_error;
biosB0[0x56] = psxBios_GetC0Table;
biosB0[0x57] = psxBios_GetB0Table;
biosB0[0x58] = psxBios__card_chan;
diff --git a/libpcsxcore/psxcommon.h b/libpcsxcore/psxcommon.h
index fc1a0c02..3f13dfa8 100755
--- a/libpcsxcore/psxcommon.h
+++ b/libpcsxcore/psxcommon.h
@@ -159,6 +159,8 @@ typedef struct {
u8 PsxType; // PSX_TYPE_NTSC or PSX_TYPE_PAL
u32 RewindCount;
u32 RewindInterval;
+ u32 AltSpeed1; // Percent relative to natural speed.
+ u32 AltSpeed2;
u8 HackFix;
#ifdef _WIN32
char Lang[256];
diff --git a/libpcsxcore/sio.c b/libpcsxcore/sio.c
index 22ca23e5..e4b8fea1 100755
--- a/libpcsxcore/sio.c
+++ b/libpcsxcore/sio.c
@@ -59,6 +59,10 @@ void SaveDongle( char *str );
static unsigned char buf[ BUFFER_SIZE ];
+//[0] -> dummy
+//[1] -> memory card status flag
+//[2] -> card 1 id, 0x5a->plugged, any other not plugged
+//[3] -> card 2 id, 0x5d->plugged, any other not plugged
unsigned char cardh[4] = { 0x00, 0x08, 0x5a, 0x5d };
// Transfer Ready and the Buffer is Empty
@@ -722,10 +726,12 @@ void sioWrite8(unsigned char value) {
StatReg |= RX_RDY;
// Chronicles of the Sword - no memcard = password options
- if( Config.NoMemcard || ((strlen(Config.Mcd1) <=0) && (strlen(Config.Mcd2) <=0)) ) {
+ if( Config.NoMemcard || (!Config.Mcd1[0] && !Config.Mcd2[0])) {
memset(buf, 0x00, 4);
} else {
memcpy(buf, cardh, 4);
+ if (!Config.Mcd1[0]) buf[2]=0; // is card 1 plugged? (Codename Tenka)
+ if (!Config.Mcd2[0]) buf[3]=0; // is card 2 plugged?
}
parp = 0;
@@ -883,8 +889,8 @@ void LoadMcd(int mcd, char *str) {
if (mcd == 2) data = Mcd2Data;
if (*str == 0) {
- sprintf(str, "%s/.pcsxr/memcards/card%d.mcd", getenv("HOME"), mcd); // TODO: maybe just whine and quit..
- SysPrintf(_("No memory card value was specified - using a default card %s\n"), str);
+ SysPrintf(_("No memory card value was specified - card %i is not plugged.\n"), mcd);
+ return;
}
f = fopen(str, "rb");
if (f == NULL) {
diff --git a/libpcsxcore/sio.h b/libpcsxcore/sio.h
index f22218b3..64993992 100755
--- a/libpcsxcore/sio.h
+++ b/libpcsxcore/sio.h
@@ -31,7 +31,8 @@ extern "C" {
#include "plugins.h"
#include "psemu_plugin_defs.h"
-#define MCD_SIZE (1024 * 8 * 16)
+#define MCD_SECT_SIZE (8 * 16)
+#define MCD_SIZE (1024 * MCD_SECT_SIZE)
extern char Mcd1Data[MCD_SIZE], Mcd2Data[MCD_SIZE];