mirror of https://github.com/PCSX2/pcsx2.git
IOP: Revert a change from #6267
Think this was a misunderstanding of how the interrupts worked (was actually one shot)
This commit is contained in:
parent
66c25b3cb6
commit
5668bcf19b
|
@ -175,17 +175,12 @@ void psxRcntInit()
|
||||||
|
|
||||||
static bool _rcntFireInterrupt(int i, bool isOverflow)
|
static bool _rcntFireInterrupt(int i, bool isOverflow)
|
||||||
{
|
{
|
||||||
const int flag = IOPCNT_INT_CMPFLAG << (1 * isOverflow);
|
|
||||||
bool ret = false;
|
bool ret = false;
|
||||||
#
|
#
|
||||||
// IRQ doesn't trigger if the status flag is already set
|
|
||||||
if (psxCounters[i].mode & flag)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
if (psxCounters[i].mode & IOPCNT_INT_REQ)
|
if (psxCounters[i].mode & IOPCNT_INT_REQ)
|
||||||
{
|
{
|
||||||
// IRQ fired
|
// IRQ fired
|
||||||
//DevCon.Warning("Counter %d %s IRQ Fired count %x", i, isOverflow ? "Overflow" : "Target", psxCounters[i].count);
|
PSXCNT_LOG("Counter %d %s IRQ Fired count %x", i, isOverflow ? "Overflow" : "Target", psxCounters[i].count);
|
||||||
psxHu32(0x1070) |= psxCounters[i].interrupt;
|
psxHu32(0x1070) |= psxCounters[i].interrupt;
|
||||||
iopTestIntc();
|
iopTestIntc();
|
||||||
ret = true;
|
ret = true;
|
||||||
|
@ -195,7 +190,7 @@ static bool _rcntFireInterrupt(int i, bool isOverflow)
|
||||||
//DevCon.Warning("Counter %d IRQ not fired count %x", i, psxCounters[i].count);
|
//DevCon.Warning("Counter %d IRQ not fired count %x", i, psxCounters[i].count);
|
||||||
if (!(psxCounters[i].mode & IOPCNT_INT_REPEAT)) // One shot
|
if (!(psxCounters[i].mode & IOPCNT_INT_REPEAT)) // One shot
|
||||||
{
|
{
|
||||||
Console.WriteLn("Counter %x repeat intr not set on zero ret, ignoring target", i);
|
PSXCNT_LOG("Counter %x ignoring %s interrupt (One Shot)", i, isOverflow ? "Overflow" : "Target");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -223,7 +218,6 @@ static void _rcntTestTarget(int i)
|
||||||
if (psxCounters[i].mode & IOPCNT_INT_TARGET)
|
if (psxCounters[i].mode & IOPCNT_INT_TARGET)
|
||||||
{
|
{
|
||||||
// Target interrupt
|
// Target interrupt
|
||||||
|
|
||||||
if (_rcntFireInterrupt(i, false))
|
if (_rcntFireInterrupt(i, false))
|
||||||
psxCounters[i].mode |= IOPCNT_INT_CMPFLAG;
|
psxCounters[i].mode |= IOPCNT_INT_CMPFLAG;
|
||||||
}
|
}
|
||||||
|
@ -246,10 +240,10 @@ static __fi void _rcntTestOverflow(int i)
|
||||||
|
|
||||||
PSXCNT_LOG("IOP Counter[%d] overflow 0x%I64x >= 0x%I64x (mode: %x)",
|
PSXCNT_LOG("IOP Counter[%d] overflow 0x%I64x >= 0x%I64x (mode: %x)",
|
||||||
i, psxCounters[i].count, maxTarget, psxCounters[i].mode);
|
i, psxCounters[i].count, maxTarget, psxCounters[i].mode);
|
||||||
|
|
||||||
// Overflow interrupt
|
|
||||||
if ((psxCounters[i].mode & IOPCNT_INT_OVERFLOW))
|
if ((psxCounters[i].mode & IOPCNT_INT_OVERFLOW))
|
||||||
{
|
{
|
||||||
|
// Overflow interrupt
|
||||||
if (_rcntFireInterrupt(i, true))
|
if (_rcntFireInterrupt(i, true))
|
||||||
psxCounters[i].mode |= IOPCNT_INT_OFLWFLAG; // Overflow flag
|
psxCounters[i].mode |= IOPCNT_INT_OFLWFLAG; // Overflow flag
|
||||||
}
|
}
|
||||||
|
@ -776,7 +770,7 @@ __fi void psxRcntWmode32(int index, u32 value)
|
||||||
void psxRcntWtarget16(int index, u32 value)
|
void psxRcntWtarget16(int index, u32 value)
|
||||||
{
|
{
|
||||||
pxAssert(index < 3);
|
pxAssert(index < 3);
|
||||||
//DevCon.Warning("IOP Counter[%d] writeTarget16 = %lx", index, value);
|
PSXCNT_LOG("IOP Counter[%d] writeTarget16 = %lx", index, value);
|
||||||
psxCounters[index].target = value & 0xffff;
|
psxCounters[index].target = value & 0xffff;
|
||||||
|
|
||||||
if (!(psxCounters[index].mode & IOPCNT_INT_TOGGLE))
|
if (!(psxCounters[index].mode & IOPCNT_INT_TOGGLE))
|
||||||
|
@ -797,7 +791,7 @@ void psxRcntWtarget16(int index, u32 value)
|
||||||
void psxRcntWtarget32(int index, u32 value)
|
void psxRcntWtarget32(int index, u32 value)
|
||||||
{
|
{
|
||||||
pxAssert(index >= 3 && index < 6);
|
pxAssert(index >= 3 && index < 6);
|
||||||
//DevCon.Warning("IOP Counter[%d] writeTarget32 = %lx mode %x", index, value, psxCounters[index].mode);
|
PSXCNT_LOG("IOP Counter[%d] writeTarget32 = %lx mode %x", index, value, psxCounters[index].mode);
|
||||||
|
|
||||||
psxCounters[index].target = value;
|
psxCounters[index].target = value;
|
||||||
|
|
||||||
|
|
|
@ -193,7 +193,7 @@ static __fi T _HwRead_16or32_Page1( u32 addr )
|
||||||
|
|
||||||
case 0x4:
|
case 0x4:
|
||||||
ret = psxCounters[cntidx].mode;
|
ret = psxCounters[cntidx].mode;
|
||||||
|
PSXCNT_LOG("IOP Counter[%d] modeRead%d = %lx", cntidx, sizeof(T) * 8, ret);
|
||||||
// hmm! The old code only did the following bitwise math for 16 bit reads.
|
// hmm! The old code only did the following bitwise math for 16 bit reads.
|
||||||
// Logic indicates it should do the math consistently. Question is,
|
// Logic indicates it should do the math consistently. Question is,
|
||||||
// should it do the logic for both 16 and 32, or not do logic at all?
|
// should it do the logic for both 16 and 32, or not do logic at all?
|
||||||
|
@ -203,10 +203,12 @@ static __fi T _HwRead_16or32_Page1( u32 addr )
|
||||||
|
|
||||||
case 0x8:
|
case 0x8:
|
||||||
ret = psxCounters[cntidx].target;
|
ret = psxCounters[cntidx].target;
|
||||||
|
PSXCNT_LOG("IOP Counter[%d] targetRead%d = %lx", cntidx, sizeof(T), ret);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 0xa:
|
case 0xa:
|
||||||
ret = psxCounters[cntidx].target >> 16;
|
ret = psxCounters[cntidx].target >> 16;
|
||||||
|
PSXCNT_LOG("IOP Counter[%d] targetUpperRead%d = %lx", cntidx, sizeof(T), ret);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
|
Loading…
Reference in New Issue