summaryrefslogtreecommitdiff
path: root/libpcsxcore/sio.c
diff options
context:
space:
mode:
Diffstat (limited to 'libpcsxcore/sio.c')
-rw-r--r--libpcsxcore/sio.c225
1 files changed, 116 insertions, 109 deletions
diff --git a/libpcsxcore/sio.c b/libpcsxcore/sio.c
index e1b8a3e1..1659b73a 100644
--- a/libpcsxcore/sio.c
+++ b/libpcsxcore/sio.c
@@ -38,12 +38,16 @@
// Control Flags
#define TX_PERM 0x0001
-#define DTR 0x0002
+#define DTR_PERM 0x0002
#define RX_PERM 0x0004
#define BREAK 0x0008
#define RESET_ERR 0x0010
#define RTS 0x0020
#define SIO_RESET 0x0040
+#define TX_INTEN 0x0400
+#define RX_INTEN 0x0800
+#define DSR_INTEN 0x1000
+#define DTR 0x2000
// *** FOR WORKS ON PADS AND MEMORY CARDS *****
@@ -121,21 +125,12 @@ static int DongleInit;
// ePSXe 1.7.0
//#define SIO_CYCLES 635
-unsigned char reverse_8( unsigned char bits )
+static unsigned char reverse_8( unsigned char bits )
{
- unsigned char tmp;
- int lcv;
-
- tmp = 0;
- for( lcv = 0; lcv < 8; lcv++ )
- {
- tmp >>= 1;
- tmp |= (bits & 0x80);
-
- bits <<= 1;
- }
-
- return tmp;
+ bits = ((bits & 0xaa) >> 1) | ((bits & 0x55) << 1);
+ bits = ((bits & 0xcc) >> 2) | ((bits & 0x33) << 2);
+ bits = ((bits & 0xf0) >> 4) | ((bits & 0x0f) << 4);
+ return bits;
}
@@ -145,75 +140,75 @@ void sioWrite8(unsigned char value) {
#endif
switch (padst) {
case 1: SIO_INT(SIO_CYCLES);
- /*
- $41-4F
- $41 = Find bits in poll respones
- $42 = Polling command
- $43 = Config mode (Dual shock?)
- $44 = Digital / Analog (after $F3)
- $45 = Get status info (Dual shock?)
-
- ID:
- $41 = Digital
- $73 = Analogue Red LED
- $53 = Analogue Green LED
-
- $23 = NegCon
- $12 = Mouse
- */
-
+ /*
+ $41-4F
+ $41 = Find bits in poll respones
+ $42 = Polling command
+ $43 = Config mode (Dual shock?)
+ $44 = Digital / Analog (after $F3)
+ $45 = Get status info (Dual shock?)
+
+ ID:
+ $41 = Digital
+ $73 = Analogue Red LED
+ $53 = Analogue Green LED
+
+ $23 = NegCon
+ $12 = Mouse
+ */
+
if ((value & 0x40) == 0x40) {
padst = 2; parp = 1;
if (!Config.UseNet) {
- switch (CtrlReg & 0x2002) {
- case 0x0002:
+ switch (CtrlReg & (DTR_PERM|DTR)) {
+ case DTR_PERM:
buf[parp] = PAD1_poll(value);
break;
- case 0x2002:
+ case (DTR_PERM|DTR):
buf[parp] = PAD2_poll(value);
break;
}
}/* else {
-// SysPrintf("%x: %x, %x, %x, %x\n", CtrlReg&0x2002, buf[2], buf[3], buf[4], buf[5]);
+// SysPrintf("%x: %x, %x, %x, %x\n", CtrlReg&(DTR_PERM|DTR), buf[2], buf[3], buf[4], buf[5]);
}*/
if (!(buf[parp] & 0x0f)) {
bufcount = 2 + 32;
} else {
bufcount = 2 + (buf[parp] & 0x0f) * 2;
- }
-
-
- // Digital / Dual Shock Controller
- if (buf[parp] == 0x41) {
- switch (value) {
- // enter config mode
- case 0x43:
- buf[1] = 0x43;
- break;
-
- // get status
- case 0x45:
- buf[1] = 0xf3;
- break;
- }
- }
-
-
- // NegCon - Wipeout 3
- if( buf[parp] == 0x23 ) {
- switch (value) {
- // enter config mode
- case 0x43:
- buf[1] = 0x79;
- break;
-
- // get status
- case 0x45:
- buf[1] = 0xf3;
- break;
- }
- }
+ }
+
+
+ // Digital / Dual Shock Controller
+ if (buf[parp] == 0x41) {
+ switch (value) {
+ // enter config mode
+ case 0x43:
+ buf[1] = 0x43;
+ break;
+
+ // get status
+ case 0x45:
+ buf[1] = 0xf3;
+ break;
+ }
+ }
+
+
+ // NegCon - Wipeout 3
+ if( buf[parp] == 0x23 ) {
+ switch (value) {
+ // enter config mode
+ case 0x43:
+ buf[1] = 0x79;
+ break;
+
+ // get status
+ case 0x45:
+ buf[1] = 0xf3;
+ break;
+ }
+ }
}
else padst = 0;
return;
@@ -225,9 +220,9 @@ void sioWrite8(unsigned char value) {
return;
}*/
if (!Config.UseNet) {
- switch (CtrlReg & 0x2002) {
- case 0x0002: buf[parp] = PAD1_poll(value); break;
- case 0x2002: buf[parp] = PAD2_poll(value); break;
+ switch (CtrlReg & (DTR_PERM|DTR)) {
+ case DTR_PERM: buf[parp] = PAD1_poll(value); break;
+ case (DTR_PERM|DTR): buf[parp] = PAD2_poll(value); break;
}
}
@@ -272,11 +267,11 @@ void sioWrite8(unsigned char value) {
buf[1] = 0x5d;
buf[2] = adrH;
buf[3] = adrL;
- switch (CtrlReg & 0x2002) {
- case 0x0002:
+ switch (CtrlReg & (DTR_PERM|DTR)) {
+ case DTR_PERM:
memcpy(&buf[4], Mcd1Data + (adrL | (adrH << 8)) * 128, 128);
break;
- case 0x2002:
+ case (DTR_PERM|DTR):
memcpy(&buf[4], Mcd2Data + (adrL | (adrH << 8)) * 128, 128);
break;
}
@@ -672,12 +667,12 @@ void sioWrite8(unsigned char value) {
StatReg |= RX_RDY; // Transfer is Ready
if (!Config.UseNet) {
- switch (CtrlReg & 0x2002) {
- case 0x0002: buf[0] = PAD1_startPoll(1); break;
- case 0x2002: buf[0] = PAD2_startPoll(2); break;
+ switch (CtrlReg & (DTR_PERM|DTR)) {
+ case DTR_PERM: buf[0] = PAD1_startPoll(1); break;
+ case (DTR_PERM|DTR): buf[0] = PAD2_startPoll(2); break;
}
} else {
- if ((CtrlReg & 0x2002) == 0x0002) {
+ if ((CtrlReg & (DTR_PERM|DTR)) == DTR_PERM) {
int i, j;
PAD1_startPoll(1);
@@ -778,12 +773,12 @@ unsigned char sioRead8() {
if (mcdst == 5) {
mcdst = 0;
if (rdwr == 2) {
- switch (CtrlReg & 0x2002) {
- case 0x0002:
+ switch (CtrlReg & (DTR_PERM|DTR)) {
+ case DTR_PERM:
memcpy(Mcd1Data + (adrL | (adrH << 8)) * 128, &buf[1], 128);
SaveMcd(Config.Mcd1, Mcd1Data, (adrL | (adrH << 8)) * 128, 128);
break;
- case 0x2002:
+ case (DTR_PERM|DTR):
memcpy(Mcd2Data + (adrL | (adrH << 8)) * 128, &buf[1], 128);
SaveMcd(Config.Mcd2, Mcd2Data, (adrL | (adrH << 8)) * 128, 128);
break;
@@ -805,20 +800,20 @@ unsigned char sioRead8() {
}
unsigned short sioReadStat16() {
- u16 hard;
-
- hard = StatReg;
-
-#if 0
- // wait for IRQ first
- if( psxRegs.interrupt & (1 << PSXINT_SIO) )
- {
- hard &= ~TX_RDY;
- hard &= ~RX_RDY;
- hard &= ~TX_EMPTY;
- }
-#endif
-
+ u16 hard;
+
+ hard = StatReg;
+
+#if 0
+ // wait for IRQ first
+ if( psxRegs.interrupt & (1 << PSXINT_SIO) )
+ {
+ hard &= ~TX_RDY;
+ hard &= ~RX_RDY;
+ hard &= ~TX_EMPTY;
+ }
+#endif
+
return hard;
}
@@ -885,7 +880,8 @@ void LoadMcd(int mcd, char *str) {
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)
+ perror(str);
fclose(f);
}
else
@@ -900,7 +896,8 @@ void LoadMcd(int mcd, char *str) {
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)
+ perror(str);
fclose(f);
}
}
@@ -927,8 +924,10 @@ void SaveMcd(char *mcd, char *data, uint32_t adr, int size) {
} else
fseek(f, adr, SEEK_SET);
- fwrite(data + adr, 1, size, f);
- fclose(f);
+ if(fwrite(data + adr, 1, size, f) != size)
+ perror(mcd);
+ if(fclose(f) != 0)
+ perror(mcd);
return;
}
@@ -1108,7 +1107,8 @@ void ConvertMcd(char *mcd, char *data) {
if (strstr(mcd, ".gme")) {
f = fopen(mcd, "wb");
if (f != NULL) {
- fwrite(data - 3904, 1, MCD_SIZE + 3904, f);
+ if(fwrite(data - 3904, MCD_SIZE + 3904, 1, f) != 1)
+ perror(mcd);
fclose(f);
}
f = fopen(mcd, "r+");
@@ -1142,8 +1142,10 @@ void ConvertMcd(char *mcd, char *data) {
} else if(strstr(mcd, ".mem") || strstr(mcd,".vgs")) {
f = fopen(mcd, "wb");
if (f != NULL) {
- fwrite(data-64, 1, MCD_SIZE+64, f);
- fclose(f);
+ if(fwrite(data-64, MCD_SIZE+64, 1, f) != 1)
+ perror(mcd);
+ if(fclose(f) != 0)
+ perror(mcd);;
}
f = fopen(mcd, "r+");
s = s + 64;
@@ -1164,14 +1166,16 @@ void ConvertMcd(char *mcd, char *data) {
} else {
f = fopen(mcd, "wb");
if (f != NULL) {
- fwrite(data, 1, MCD_SIZE, f);
- fclose(f);
+ if(fwrite(data, 1, MCD_SIZE, f) != MCD_SIZE)
+ perror(mcd);
+ if(fclose(f) != 0)
+ perror(mcd);
}
}
}
void GetMcdBlockInfo(int mcd, int block, McdBlock *Info) {
- unsigned char *data = NULL, *ptr, *str, *sstr;
+ char *data = NULL, *ptr, *str, *sstr;
unsigned short clut[16];
unsigned short c;
int i, x;
@@ -1282,7 +1286,8 @@ void LoadDongle( char *str )
f = fopen(str, "r+b");
if (f != NULL) {
- fread( DongleData, 1, DONGLE_SIZE, f );
+ if(fread( DongleData, 1, DONGLE_SIZE, f ) != DONGLE_SIZE)
+ perror(str);
fclose( f );
}
else {
@@ -1318,7 +1323,9 @@ void SaveDongle( char *str )
f = fopen(str, "wb");
if (f != NULL) {
- fwrite( DongleData, 1, DONGLE_SIZE, f );
- fclose( f );
+ if(fwrite( DongleData, 1, DONGLE_SIZE, f ) != DONGLE_SIZE)
+ perror(str);
+ if(fclose( f ) != 0)
+ perror(str);
}
}