mirror of https://github.com/PCSX2/pcsx2.git
SIO: KrossX new changes for Memcards, seems ok on a test of random 10-15 random games, please report if any errors appear!
git-svn-id: http://pcsx2.googlecode.com/svn/trunk@5781 96395faa-99c1-11dd-bbfe-3dabce05a288
This commit is contained in:
parent
bcb8a0e991
commit
e8f31a3e3e
272
pcsx2/Sio.cpp
272
pcsx2/Sio.cpp
|
@ -303,46 +303,22 @@ SIO_WRITE memcardAuth(u8 data)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
SIO_WRITE memcardTransfer(u8 data)
|
SIO_WRITE memcardErase(u8 data)
|
||||||
{
|
{
|
||||||
static MEMCARD_TRANSFER mode;
|
|
||||||
static u8 subCmd = 0;
|
|
||||||
static u8 checksum_pos = 0;
|
|
||||||
static u8 transfer_size = 0;
|
|
||||||
|
|
||||||
switch(sio.bufCount)
|
switch(sio.bufCount)
|
||||||
{
|
{
|
||||||
case 0: break;
|
case 0:
|
||||||
|
if(data != 0x81) sio.bufCount = -1;
|
||||||
|
break;
|
||||||
|
|
||||||
case 1:
|
case 1:
|
||||||
{
|
{
|
||||||
u8 header[] = {0xFF, 0xFF, 0xFF, 0x2B, mcd->term};
|
u8 header[] = {0xFF, 0xFF, 0xFF, 0x2B, mcd->term};
|
||||||
|
|
||||||
switch(data)
|
switch(data)
|
||||||
{
|
{
|
||||||
case 0x42: // Write
|
|
||||||
memcpy_fast(sio.buf, header, 4);
|
|
||||||
mode = MEM_WRITE;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 0x43: // Read
|
|
||||||
memcpy_fast(sio.buf, header, 4);
|
|
||||||
mode = MEM_READ;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 0x81: // Commit
|
|
||||||
siomode = SIO_DUMMY; // Nothing more to do here.
|
|
||||||
mode = MEM_COMMIT;
|
|
||||||
memcpy_fast(sio.buf, &header[1], 4);
|
|
||||||
sio.bufSize = 3;
|
|
||||||
|
|
||||||
if(subCmd == 0x42) sio2.packet.recvVal1 = 0x1600; // Writing
|
|
||||||
if(subCmd == 0x43) sio2.packet.recvVal1 = 0x1700; // Reading
|
|
||||||
|
|
||||||
sio2.packet.recvVal3 = 0x8C;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 0x82: // Erase
|
case 0x82: // Erase
|
||||||
siomode = SIO_DUMMY; // Nothing more to do here.
|
//siomode = SIO_DUMMY; // Nothing more to do here.
|
||||||
mode = MEM_ERASE;
|
|
||||||
memcpy_fast(sio.buf, &header[1], 4);
|
memcpy_fast(sio.buf, &header[1], 4);
|
||||||
sio.bufSize = 3;
|
sio.bufSize = 3;
|
||||||
mcd->EraseBlock();
|
mcd->EraseBlock();
|
||||||
|
@ -350,13 +326,73 @@ SIO_WRITE memcardTransfer(u8 data)
|
||||||
|
|
||||||
default:
|
default:
|
||||||
DevCon.Warning("%s cmd: %02X??\n", __FUNCTION__, data);
|
DevCon.Warning("%s cmd: %02X??\n", __FUNCTION__, data);
|
||||||
mode = MEM_INVALID;
|
sio.bufCount = -1;
|
||||||
sio.bufSize = 3;
|
//sio.bufSize = 3;
|
||||||
sio.bufCount = 4;
|
//sio.bufCount = 4;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
SIO_INT();
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
if(sio.bufCount > sio.bufSize)
|
||||||
|
{
|
||||||
|
if(data == 0x81)
|
||||||
|
{
|
||||||
|
SIO_STAT_READY();
|
||||||
|
sio.bufCount = 0x00;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
SIO_WRITE memcardWrite(u8 data)
|
||||||
|
{
|
||||||
|
static u8 checksum_pos = 0;
|
||||||
|
static u8 transfer_size = 0;
|
||||||
|
static bool once = false;
|
||||||
|
|
||||||
|
switch(sio.bufCount)
|
||||||
|
{
|
||||||
|
case 0:
|
||||||
|
if(data != 0x81) sio.bufCount = -1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 1:
|
||||||
|
{
|
||||||
|
u8 header[] = {0xFF, 0xFF, 0xFF, 0x2B, mcd->term};
|
||||||
|
|
||||||
|
switch(data)
|
||||||
|
{
|
||||||
|
case 0x42: // Write
|
||||||
|
memcpy_fast(sio.buf, header, 4);
|
||||||
|
once = true;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 0x81: // Commit
|
||||||
|
if(once)
|
||||||
|
{
|
||||||
|
siomode = SIO_DUMMY; // Nothing more to do here.
|
||||||
|
memcpy_fast(sio.buf, &header[1], 4);
|
||||||
|
sio.bufSize = 3;
|
||||||
|
|
||||||
|
sio2.packet.recvVal1 = 0x1600; // Writing
|
||||||
|
sio2.packet.recvVal3 = 0x8C;
|
||||||
|
|
||||||
|
once = false;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
default:
|
||||||
|
DevCon.Warning("%s cmd: %02X??\n", __FUNCTION__, data);
|
||||||
|
sio.bufCount = -1;
|
||||||
|
//sio.bufSize = 3;
|
||||||
|
//sio.bufCount = 4;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
subCmd = data;
|
|
||||||
}
|
}
|
||||||
SIO_INT();
|
SIO_INT();
|
||||||
break;
|
break;
|
||||||
|
@ -364,45 +400,27 @@ SIO_WRITE memcardTransfer(u8 data)
|
||||||
case 2:
|
case 2:
|
||||||
transfer_size = data;
|
transfer_size = data;
|
||||||
|
|
||||||
switch(mode)
|
sio.buf[data + 5] = mcd->term;
|
||||||
{
|
sio.bufSize = data + 5;
|
||||||
case MEM_WRITE:
|
checksum_pos = data + 4;
|
||||||
sio.buf[data + 5] = mcd->term;
|
|
||||||
sio.bufSize = data + 5;
|
|
||||||
checksum_pos = data + 4;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case MEM_READ:
|
|
||||||
mcd->Read(&sio.buf[4], transfer_size);
|
|
||||||
mcd->transferAddr += transfer_size;
|
|
||||||
|
|
||||||
sio.buf[transfer_size + 4] = mcd->DoXor(&sio.buf[4], transfer_size);
|
|
||||||
sio.buf[transfer_size + 5] = mcd->term;
|
|
||||||
sio.bufSize = transfer_size + 5;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
switch(mode)
|
|
||||||
|
if(sio.bufCount < checksum_pos)
|
||||||
{
|
{
|
||||||
case MEM_WRITE:
|
sio.buf[sio.bufCount+1] = data;
|
||||||
if(sio.bufCount < checksum_pos)
|
}
|
||||||
{
|
else if(sio.bufCount == checksum_pos)
|
||||||
sio.buf[sio.bufCount+1] = data;
|
{
|
||||||
}
|
u8 xor_check = mcd->DoXor(&sio.buf[4], checksum_pos - 4);
|
||||||
else if(sio.bufCount == checksum_pos)
|
|
||||||
{
|
|
||||||
u8 xor_check = mcd->DoXor(&sio.buf[4], checksum_pos - 4);
|
|
||||||
|
|
||||||
if(xor_check != sio.buf[sio.bufCount])
|
if(xor_check != sio.buf[sio.bufCount])
|
||||||
Console.Warning("MemWrite: Checksum invalid! XOR: %02X, IN: %02X\n", xor_check, sio.buf[sio.bufCount]);
|
Console.Warning("MemWrite: Checksum invalid! XOR: %02X, IN: %02X\n", xor_check, sio.buf[sio.bufCount]);
|
||||||
|
|
||||||
sio.buf[sio.bufCount] = xor_check;
|
sio.buf[sio.bufCount] = xor_check;
|
||||||
mcd->Write(&sio.buf[4], transfer_size);
|
mcd->Write(&sio.buf[4], transfer_size);
|
||||||
mcd->transferAddr += transfer_size;
|
mcd->transferAddr += transfer_size;
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if(sio.bufCount > sio.bufSize)
|
if(sio.bufCount > sio.bufSize)
|
||||||
|
@ -417,33 +435,103 @@ SIO_WRITE memcardTransfer(u8 data)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SIO_WRITE memcardRead(u8 data)
|
||||||
|
{
|
||||||
|
static u8 checksum_pos = 0;
|
||||||
|
static u8 transfer_size = 0;
|
||||||
|
static bool once = false;
|
||||||
|
|
||||||
|
switch(sio.bufCount)
|
||||||
|
{
|
||||||
|
case 0:
|
||||||
|
if(data != 0x81) sio.bufCount = -1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 1:
|
||||||
|
{
|
||||||
|
u8 header[] = {0xFF, 0xFF, 0xFF, 0x2B, mcd->term};
|
||||||
|
|
||||||
|
switch(data)
|
||||||
|
{
|
||||||
|
case 0x43: // Read
|
||||||
|
memcpy_fast(sio.buf, header, 4);
|
||||||
|
once = true;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 0x81: // Commit
|
||||||
|
if(once)
|
||||||
|
{
|
||||||
|
siomode = SIO_DUMMY; // Nothing more to do here.
|
||||||
|
memcpy_fast(sio.buf, &header[1], 4);
|
||||||
|
sio.bufSize = 3;
|
||||||
|
|
||||||
|
sio2.packet.recvVal1 = 0x1700; // Reading
|
||||||
|
sio2.packet.recvVal3 = 0x8C;
|
||||||
|
|
||||||
|
once = false;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
default:
|
||||||
|
DevCon.Warning("%s cmd: %02X??\n", __FUNCTION__, data);
|
||||||
|
sio.bufCount = -1;
|
||||||
|
//sio.bufSize = 3;
|
||||||
|
//sio.bufCount = 4;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
SIO_INT();
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 2:
|
||||||
|
transfer_size = data;
|
||||||
|
|
||||||
|
mcd->Read(&sio.buf[4], transfer_size);
|
||||||
|
mcd->transferAddr += transfer_size;
|
||||||
|
|
||||||
|
sio.buf[transfer_size + 4] = mcd->DoXor(&sio.buf[4], transfer_size);
|
||||||
|
sio.buf[transfer_size + 5] = mcd->term;
|
||||||
|
sio.bufSize = transfer_size + 5;
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
if(sio.bufCount > sio.bufSize)
|
||||||
|
{
|
||||||
|
if(data == 0x81)
|
||||||
|
{
|
||||||
|
SIO_STAT_READY();
|
||||||
|
sio.bufCount = 0x00;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
SIO_WRITE memcardSector(u8 data)
|
SIO_WRITE memcardSector(u8 data)
|
||||||
{
|
{
|
||||||
static u8 xor_check = 0;
|
static u8 xor_check = 0;
|
||||||
static bool sectorDone = false;
|
|
||||||
|
|
||||||
if(!sectorDone)
|
switch(sio.bufCount)
|
||||||
{
|
{
|
||||||
switch(sio.bufCount)
|
|
||||||
{
|
|
||||||
case 2: mcd->sectorAddr = data << 0; xor_check = data; break;
|
case 2: mcd->sectorAddr = data << 0; xor_check = data; break;
|
||||||
case 3: mcd->sectorAddr |= data << 8; xor_check ^= data; break;
|
case 3: mcd->sectorAddr |= data << 8; xor_check ^= data; break;
|
||||||
case 4: mcd->sectorAddr |= data << 16; xor_check ^= data; break;
|
case 4: mcd->sectorAddr |= data << 16; xor_check ^= data; break;
|
||||||
case 5: mcd->sectorAddr |= data << 24; xor_check ^= data; break;
|
case 5: mcd->sectorAddr |= data << 24; xor_check ^= data; break;
|
||||||
case 6: mcd->goodSector = data == xor_check; break;
|
case 6: mcd->goodSector = data == xor_check; break;
|
||||||
case 8: mcd->transferAddr = (512+16) * mcd->sectorAddr; break;
|
case 8: mcd->transferAddr = (512+16) * mcd->sectorAddr; break;
|
||||||
case 9: memset8<0xFF>(sio.buf); sectorDone = true;
|
case 9:
|
||||||
}
|
{
|
||||||
}
|
switch(sio.cmd)
|
||||||
else
|
{
|
||||||
{
|
case 0x21: siomode = SIO_MEMCARD_ERASE; break;
|
||||||
if (data == 0x81) // SET_SECTOR End
|
case 0x22: siomode = SIO_MEMCARD_WRITE; break;
|
||||||
{
|
case 0x23: siomode = SIO_MEMCARD_READ; break;
|
||||||
SIO_STAT_READY();
|
}
|
||||||
sectorDone = false;
|
|
||||||
sio.bufCount = 0;
|
memset8<0xFF>(sio.buf);
|
||||||
siomode = SIO_MEMCARD_TRANSFER;
|
sio.bufCount = -1;
|
||||||
};
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -500,8 +588,6 @@ SIO_WRITE memcardInit()
|
||||||
|
|
||||||
SIO_WRITE sioWriteMemcard(u8 data)
|
SIO_WRITE sioWriteMemcard(u8 data)
|
||||||
{
|
{
|
||||||
static u8 siocmd = 0;
|
|
||||||
|
|
||||||
switch(sio.bufCount)
|
switch(sio.bufCount)
|
||||||
{
|
{
|
||||||
case 0:
|
case 0:
|
||||||
|
@ -511,7 +597,7 @@ SIO_WRITE sioWriteMemcard(u8 data)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 1:
|
case 1:
|
||||||
siocmd = data;
|
sio.cmd = data;
|
||||||
switch(data)
|
switch(data)
|
||||||
{
|
{
|
||||||
case 0x21: // SET_SECTOR_ERASE
|
case 0x21: // SET_SECTOR_ERASE
|
||||||
|
@ -585,7 +671,7 @@ SIO_WRITE sioWriteMemcard(u8 data)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 2:
|
case 2:
|
||||||
switch(siocmd)
|
switch(sio.cmd)
|
||||||
{
|
{
|
||||||
case 0x27: // SET_TERMINATOR
|
case 0x27: // SET_TERMINATOR
|
||||||
mcd->term = data;
|
mcd->term = data;
|
||||||
|
@ -598,8 +684,6 @@ SIO_WRITE sioWriteMemcard(u8 data)
|
||||||
|
|
||||||
SIO_WRITE sioWriteMemcardPSX(u8 data)
|
SIO_WRITE sioWriteMemcardPSX(u8 data)
|
||||||
{
|
{
|
||||||
static u8 siocmd = 0;
|
|
||||||
|
|
||||||
switch(sio.bufCount)
|
switch(sio.bufCount)
|
||||||
{
|
{
|
||||||
case 0: // Same init stuff...
|
case 0: // Same init stuff...
|
||||||
|
@ -609,7 +693,7 @@ SIO_WRITE sioWriteMemcardPSX(u8 data)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 1:
|
case 1:
|
||||||
siocmd = data;
|
sio.cmd = data;
|
||||||
switch(data)
|
switch(data)
|
||||||
{
|
{
|
||||||
case 0x53: // PSX 'S'tate // haven't seen it happen yet
|
case 0x53: // PSX 'S'tate // haven't seen it happen yet
|
||||||
|
@ -655,7 +739,7 @@ SIO_WRITE sioWriteMemcardPSX(u8 data)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 6:
|
case 6:
|
||||||
if(siocmd == 0x52)
|
if(sio.cmd == 0x52)
|
||||||
{
|
{
|
||||||
// READ
|
// READ
|
||||||
|
|
||||||
|
@ -724,7 +808,9 @@ static void sioWrite8inl(u8 data)
|
||||||
case SIO_INFRARED: sioWriteInfraRed(data); break;
|
case SIO_INFRARED: sioWriteInfraRed(data); break;
|
||||||
case SIO_MEMCARD: sioWriteMemcard(data); break;
|
case SIO_MEMCARD: sioWriteMemcard(data); break;
|
||||||
case SIO_MEMCARD_AUTH: memcardAuth(data); break;
|
case SIO_MEMCARD_AUTH: memcardAuth(data); break;
|
||||||
case SIO_MEMCARD_TRANSFER: memcardTransfer(data); break;
|
case SIO_MEMCARD_ERASE: memcardErase(data); break;
|
||||||
|
case SIO_MEMCARD_WRITE: memcardWrite(data); break;
|
||||||
|
case SIO_MEMCARD_READ: memcardRead(data); break;
|
||||||
case SIO_MEMCARD_SECTOR: memcardSector(data); break;
|
case SIO_MEMCARD_SECTOR: memcardSector(data); break;
|
||||||
case SIO_MEMCARD_PSX: sioWriteMemcardPSX(data); break;
|
case SIO_MEMCARD_PSX: sioWriteMemcardPSX(data); break;
|
||||||
case SIO_DUMMY: break;
|
case SIO_DUMMY: break;
|
||||||
|
|
|
@ -94,6 +94,7 @@ struct _sio
|
||||||
|
|
||||||
u8 buf[256];
|
u8 buf[256];
|
||||||
u8 ret; // default return value;
|
u8 ret; // default return value;
|
||||||
|
u8 cmd; // command backup
|
||||||
|
|
||||||
u16 bufCount; // current buffer counter
|
u16 bufCount; // current buffer counter
|
||||||
u16 bufSize; // supposed buffer size
|
u16 bufSize; // supposed buffer size
|
||||||
|
|
|
@ -67,15 +67,6 @@ void inline DEVICE_UNPLUGGED()
|
||||||
memset8<0x00>(sio.buf);
|
memset8<0x00>(sio.buf);
|
||||||
}
|
}
|
||||||
|
|
||||||
enum MEMCARD_TRANSFER
|
|
||||||
{
|
|
||||||
MEM_INVALID = 0,
|
|
||||||
MEM_WRITE,
|
|
||||||
MEM_READ,
|
|
||||||
MEM_ERASE,
|
|
||||||
MEM_COMMIT
|
|
||||||
};
|
|
||||||
|
|
||||||
enum SIO_MODE
|
enum SIO_MODE
|
||||||
{
|
{
|
||||||
SIO_START = 0,
|
SIO_START = 0,
|
||||||
|
@ -84,7 +75,9 @@ enum SIO_MODE
|
||||||
SIO_INFRARED,
|
SIO_INFRARED,
|
||||||
SIO_MEMCARD,
|
SIO_MEMCARD,
|
||||||
SIO_MEMCARD_AUTH,
|
SIO_MEMCARD_AUTH,
|
||||||
SIO_MEMCARD_TRANSFER,
|
SIO_MEMCARD_ERASE,
|
||||||
|
SIO_MEMCARD_WRITE,
|
||||||
|
SIO_MEMCARD_READ,
|
||||||
SIO_MEMCARD_SECTOR,
|
SIO_MEMCARD_SECTOR,
|
||||||
SIO_MEMCARD_PSX,
|
SIO_MEMCARD_PSX,
|
||||||
SIO_DUMMY
|
SIO_DUMMY
|
||||||
|
|
Loading…
Reference in New Issue