diff options
Diffstat (limited to 'libpcsxcore/sio.c')
| -rw-r--r-- | libpcsxcore/sio.c | 225 |
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); } } |
