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
libretro: allow unlimited cheat length
[pcsx_rearmed.git]
/
libpcsxcore
/
sio.c
diff --git
a/libpcsxcore/sio.c
b/libpcsxcore/sio.c
index
12fd0bd
..
7aa669b
100644
(file)
--- a/
libpcsxcore/sio.c
+++ b/
libpcsxcore/sio.c
@@
-24,6
+24,10
@@
#include "sio.h"
#include <sys/stat.h>
#include "sio.h"
#include <sys/stat.h>
+#ifdef USE_LIBRETRO_VFS
+#include <streams/file_stream_transforms.h>
+#endif
+
// Status Flags
#define TX_RDY 0x0001
#define RX_RDY 0x0002
// Status Flags
#define TX_RDY 0x0001
#define RX_RDY 0x0002
@@
-48,7
+52,8
@@
// *** FOR WORKS ON PADS AND MEMORY CARDS *****
static unsigned char buf[256];
// *** FOR WORKS ON PADS AND MEMORY CARDS *****
static unsigned char buf[256];
-unsigned char cardh[4] = { 0x00, 0x00, 0x5a, 0x5d };
+static unsigned char cardh1[4] = { 0xff, 0x08, 0x5a, 0x5d };
+static unsigned char cardh2[4] = { 0xff, 0x08, 0x5a, 0x5d };
// Transfer Ready and the Buffer is Empty
// static unsigned short StatReg = 0x002b;
// Transfer Ready and the Buffer is Empty
// static unsigned short StatReg = 0x002b;
@@
-64,14
+69,13
@@
static unsigned char adrH, adrL;
static unsigned int padst;
char Mcd1Data[MCD_SIZE], Mcd2Data[MCD_SIZE];
static unsigned int padst;
char Mcd1Data[MCD_SIZE], Mcd2Data[MCD_SIZE];
+char McdDisable[2];
#define SIO_INT(eCycle) { \
#define SIO_INT(eCycle) { \
- if (!Config.Sio) { \
- psxRegs.interrupt |= (1 << PSXINT_SIO); \
- psxRegs.intCycle[PSXINT_SIO].cycle = eCycle; \
- psxRegs.intCycle[PSXINT_SIO].sCycle = psxRegs.cycle; \
- new_dyna_set_event(PSXINT_SIO, eCycle); \
- } \
+ psxRegs.interrupt |= (1 << PSXINT_SIO); \
+ psxRegs.intCycle[PSXINT_SIO].cycle = eCycle; \
+ psxRegs.intCycle[PSXINT_SIO].sCycle = psxRegs.cycle; \
+ new_dyna_set_event(PSXINT_SIO, eCycle); \
}
// clk cycle byte
}
// clk cycle byte
@@
-204,6
+208,14
@@
void sioWrite8(unsigned char value) {
return;
case 5:
parp++;
return;
case 5:
parp++;
+ if ((rdwr == 1 && parp == 132) ||
+ (rdwr == 2 && parp == 129)) {
+ // clear "new card" flags
+ if (CtrlReg & 0x2000)
+ cardh2[1] &= ~8;
+ else
+ cardh1[1] &= ~8;
+ }
if (rdwr == 2) {
if (parp < 128) buf[parp + 1] = value;
}
if (rdwr == 2) {
if (parp < 128) buf[parp + 1] = value;
}
@@
-258,14
+270,32
@@
void sioWrite8(unsigned char value) {
SIO_INT(SIO_CYCLES);
return;
case 0x81: // start memcard
SIO_INT(SIO_CYCLES);
return;
case 0x81: // start memcard
+ if (CtrlReg & 0x2000)
+ {
+ if (McdDisable[1])
+ goto no_device;
+ memcpy(buf, cardh2, 4);
+ }
+ else
+ {
+ if (McdDisable[0])
+ goto no_device;
+ memcpy(buf, cardh1, 4);
+ }
StatReg |= RX_RDY;
StatReg |= RX_RDY;
- memcpy(buf, cardh, 4);
parp = 0;
bufcount = 3;
mcdst = 1;
rdwr = 0;
SIO_INT(SIO_CYCLES);
return;
parp = 0;
bufcount = 3;
mcdst = 1;
rdwr = 0;
SIO_INT(SIO_CYCLES);
return;
+ default:
+ no_device:
+ StatReg |= RX_RDY;
+ buf[0] = 0xff;
+ parp = 0;
+ bufcount = 0;
+ return;
}
}
}
}
@@
-358,21
+388,42
@@
void sioInterrupt() {
PAD_LOG("Sio Interrupt (CP0.Status = %x)\n", psxRegs.CP0.n.Status);
#endif
// SysPrintf("Sio Interrupt\n");
PAD_LOG("Sio Interrupt (CP0.Status = %x)\n", psxRegs.CP0.n.Status);
#endif
// SysPrintf("Sio Interrupt\n");
- StatReg |= IRQ;
- psxHu32ref(0x1070) |= SWAPu32(0x80);
+ if (!(StatReg & IRQ)) {
+ StatReg |= IRQ;
+ psxHu32ref(0x1070) |= SWAPu32(0x80);
+ }
}
void LoadMcd(int mcd, char *str) {
FILE *f;
char *data = NULL;
}
void LoadMcd(int mcd, char *str) {
FILE *f;
char *data = NULL;
- if (mcd == 1) data = Mcd1Data;
- if (mcd == 2) data = Mcd2Data;
+ if (mcd != 1 && mcd != 2)
+ return;
+
+ if (mcd == 1) {
+ data = Mcd1Data;
+ cardh1[1] |= 8; // mark as new
+ }
+ if (mcd == 2) {
+ data = Mcd2Data;
+ cardh2[1] |= 8;
+ }
- if (*str == 0) {
- sprintf(str, "memcards/card%d.mcd", mcd);
- SysPrintf(_("No memory card value was specified - creating a default card %s\n"), str);
+ McdDisable[mcd - 1] = 0;
+#ifdef HAVE_LIBRETRO
+ // memcard1 is handled by libretro
+ if (mcd == 1)
+ return;
+#endif
+
+ if (str == NULL || strcmp(str, "none") == 0) {
+ McdDisable[mcd - 1] = 1;
+ return;
}
}
+ if (*str == 0)
+ return;
+
f = fopen(str, "rb");
if (f == NULL) {
SysPrintf(_("The memory card %s doesn't exist - creating it\n"), str);
f = fopen(str, "rb");
if (f == NULL) {
SysPrintf(_("The memory card %s doesn't exist - creating it\n"), str);
@@
-387,7
+438,12
@@
void LoadMcd(int mcd, char *str) {
else if(buf.st_size == MCD_SIZE + 3904)
fseek(f, 3904, SEEK_SET);
}
else if(buf.st_size == MCD_SIZE + 3904)
fseek(f, 3904, SEEK_SET);
}
- fread(data, 1, MCD_SIZE, f);
+ if (fread(data, 1, MCD_SIZE, f) != MCD_SIZE) {
+#ifndef NDEBUG
+ SysPrintf(_("File IO error in <%s:%s>.\n"), __FILE__, __func__);
+#endif
+ memset(data, 0x00, MCD_SIZE);
+ }
fclose(f);
}
else
fclose(f);
}
else
@@
-402,7
+458,12
@@
void LoadMcd(int mcd, char *str) {
else if(buf.st_size == MCD_SIZE + 3904)
fseek(f, 3904, SEEK_SET);
}
else if(buf.st_size == MCD_SIZE + 3904)
fseek(f, 3904, SEEK_SET);
}
- fread(data, 1, MCD_SIZE, f);
+ if (fread(data, 1, MCD_SIZE, f) != MCD_SIZE) {
+#ifndef NDEBUG
+ SysPrintf(_("File IO error in <%s:%s>.\n"), __FILE__, __func__);
+#endif
+ memset(data, 0x00, MCD_SIZE);
+ }
fclose(f);
}
}
fclose(f);
}
}
@@
-415,6
+476,9
@@
void LoadMcds(char *mcd1, char *mcd2) {
void SaveMcd(char *mcd, char *data, uint32_t adr, int size) {
FILE *f;
void SaveMcd(char *mcd, char *data, uint32_t adr, int size) {
FILE *f;
+ if (mcd == NULL || *mcd == 0 || strcmp(mcd, "none") == 0)
+ return;
+
f = fopen(mcd, "r+b");
if (f != NULL) {
struct stat buf;
f = fopen(mcd, "r+b");
if (f != NULL) {
struct stat buf;
@@
-614,6
+678,7
@@
void ConvertMcd(char *mcd, char *data) {
fclose(f);
}
f = fopen(mcd, "r+");
fclose(f);
}
f = fopen(mcd, "r+");
+ if (f == NULL) return;
s = s + 3904;
fputc('1', f); s--;
fputc('2', f); s--;
s = s + 3904;
fputc('1', f); s--;
fputc('2', f); s--;
@@
-648,6
+713,7
@@
void ConvertMcd(char *mcd, char *data) {
fclose(f);
}
f = fopen(mcd, "r+");
fclose(f);
}
f = fopen(mcd, "r+");
+ if (f == NULL) return;
s = s + 64;
fputc('V', f); s--;
fputc('g', f); s--;
s = s + 64;
fputc('V', f); s--;
fputc('g', f); s--;
@@
-680,6
+746,12
@@
void GetMcdBlockInfo(int mcd, int block, McdBlock *Info) {
memset(Info, 0, sizeof(McdBlock));
memset(Info, 0, sizeof(McdBlock));
+ if (mcd != 1 && mcd != 2)
+ return;
+
+ if (McdDisable[mcd - 1])
+ return;
+
if (mcd == 1) data = Mcd1Data;
if (mcd == 2) data = Mcd2Data;
if (mcd == 1) data = Mcd1Data;
if (mcd == 2) data = Mcd2Data;
@@
-760,7
+832,7
@@
void GetMcdBlockInfo(int mcd, int block, McdBlock *Info) {
strncpy(Info->Name, ptr, 16);
}
strncpy(Info->Name, ptr, 16);
}
-int sioFreeze(
gzFile
f, int Mode) {
+int sioFreeze(
void *
f, int Mode) {
gzfreeze(buf, sizeof(buf));
gzfreeze(&StatReg, sizeof(StatReg));
gzfreeze(&ModeReg, sizeof(ModeReg));
gzfreeze(buf, sizeof(buf));
gzfreeze(&StatReg, sizeof(StatReg));
gzfreeze(&ModeReg, sizeof(ModeReg));