X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?p=pcsx_rearmed.git;a=blobdiff_plain;f=libpcsxcore%2Fsio.c;h=4a0a73c48af1efa77c097f01dff9358dc016f418;hp=b63f56b90d8aa3a4ff29792cc5665dd83517b9e2;hb=f3a770329bf0ac2d47d442eb70e8fcc25a7f8db2;hpb=654e8cfb205bebc40b26761a900db354b4920931 diff --git a/libpcsxcore/sio.c b/libpcsxcore/sio.c index b63f56b9..4a0a73c4 100644 --- a/libpcsxcore/sio.c +++ b/libpcsxcore/sio.c @@ -48,7 +48,8 @@ // *** 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; @@ -64,25 +65,28 @@ static unsigned char adrH, adrL; static unsigned int padst; char Mcd1Data[MCD_SIZE], Mcd2Data[MCD_SIZE]; +char McdDisable[2]; + +#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); \ + } \ +} // clk cycle byte // 4us * 8bits = (PSXCLK / 1000000) * 32; (linuzappz) // TODO: add SioModePrescaler and BaudReg -static inline void SIO_INT() { - if (!Config.Sio) { - psxRegs.interrupt |= 0x80; - psxRegs.intCycle[7 + 1] = 400; - psxRegs.intCycle[7] = psxRegs.cycle; - new_dyna_set_event(1, 400); - } -} +#define SIO_CYCLES 535 void sioWrite8(unsigned char value) { #ifdef PAD_LOG PAD_LOG("sio write8 %x\n", value); #endif switch (padst) { - case 1: SIO_INT(); + case 1: SIO_INT(SIO_CYCLES); if ((value & 0x40) == 0x40) { padst = 2; parp = 1; if (!Config.UseNet) { @@ -120,7 +124,7 @@ void sioWrite8(unsigned char value) { parp++; /* if (buf[1] == 0x45) { buf[parp] = 0; - SIO_INT(); + SIO_INT(SIO_CYCLES); return; }*/ if (!Config.UseNet) { @@ -131,13 +135,13 @@ void sioWrite8(unsigned char value) { } if (parp == bufcount) { padst = 0; return; } - SIO_INT(); + SIO_INT(SIO_CYCLES); return; } switch (mcdst) { case 1: - SIO_INT(); + SIO_INT(SIO_CYCLES); if (rdwr) { parp++; return; } parp = 1; switch (value) { @@ -147,7 +151,7 @@ void sioWrite8(unsigned char value) { } return; case 2: // address H - SIO_INT(); + SIO_INT(SIO_CYCLES); adrH = value; *buf = 0; parp = 0; @@ -155,7 +159,7 @@ void sioWrite8(unsigned char value) { mcdst = 3; return; case 3: // address L - SIO_INT(); + SIO_INT(SIO_CYCLES); adrL = value; *buf = adrH; parp = 0; @@ -163,7 +167,7 @@ void sioWrite8(unsigned char value) { mcdst = 4; return; case 4: - SIO_INT(); + SIO_INT(SIO_CYCLES); parp = 0; switch (rdwr) { case 1: // read @@ -202,10 +206,18 @@ void sioWrite8(unsigned char value) { 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; } - SIO_INT(); + SIO_INT(SIO_CYCLES); return; } @@ -253,16 +265,34 @@ void sioWrite8(unsigned char value) { bufcount = 2; parp = 0; padst = 1; - SIO_INT(); + 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; - memcpy(buf, cardh, 4); parp = 0; bufcount = 3; mcdst = 1; rdwr = 0; - SIO_INT(); + SIO_INT(SIO_CYCLES); + return; + default: + no_device: + StatReg |= RX_RDY; + buf[0] = 0xff; + parp = 0; + bufcount = 0; return; } } @@ -277,10 +307,10 @@ void sioWriteMode16(unsigned short value) { void sioWriteCtrl16(unsigned short value) { CtrlReg = value & ~RESET_ERR; if (value & RESET_ERR) StatReg &= ~IRQ; - if ((CtrlReg & SIO_RESET) || (!CtrlReg)) { + if ((CtrlReg & SIO_RESET) || !(CtrlReg & DTR)) { padst = 0; mcdst = 0; parp = 0; StatReg = TX_RDY | TX_EMPTY; - psxRegs.interrupt &= ~0x80; + psxRegs.interrupt &= ~(1 << PSXINT_SIO); } } @@ -364,12 +394,22 @@ 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; + if (str == NULL || *str == 0) { + McdDisable[mcd - 1] = 1; + return; } f = fopen(str, "rb"); if (f == NULL) { @@ -671,13 +711,19 @@ void ConvertMcd(char *mcd, char *data) { } 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; 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;