Fixed up minor error with SPU2 interrupts.

This commit is contained in:
Marco Satti 2017-07-06 22:09:59 +08:00
parent ab51de1680
commit f634a14c5f
9 changed files with 68 additions and 79 deletions

View file

@ -21,15 +21,15 @@ bool FIFOQueue_t::readByte(const Context_t context, u8 & data)
if (mDebugReads)
{
#if DEBUG_LOG_VALUE_AS_HEX
log(Debug, "%s: %s Read u8 (S = %d), Used Size = %d, Value = 0x%X.", DEBUG_CONTEXT_STRINGS[context], mMnemonic.c_str(), success, mFIFOQueue.read_available(), data);
log(Debug, "%s: %s Read u8 (Ok = %d), Used Size = %d, Value = 0x%X.", DEBUG_CONTEXT_STRINGS[context], mMnemonic.c_str(), success, getReadAvailable(), data);
#else
log(Debug, "%s: %s Read u8 (S = %d), Used Size = %d, Value = %d.", SYSTEM_STR[context], mMnemonic.c_str(), success, mFIFOQueue.read_available(), data);
log(Debug, "%s: %s Read u8 (Ok = %d), Used Size = %d, Value = %d.", SYSTEM_STR[context], mMnemonic.c_str(), success, getReadAvailable(), data);
#endif
}
#endif
if (!success)
log(Debug, "FIFOQueue_t: Failed to push a byte to the FIFO queue. This **might** be ok, but you have been warned...");
log(Debug, "FIFOQueue_t: Failed to read a byte to the FIFO queue. This **might** be ok, but you have been warned...");
return success;
}
@ -42,9 +42,9 @@ bool FIFOQueue_t::writeByte(const Context_t context, const u8 data)
if (mDebugWrites)
{
#if DEBUG_LOG_VALUE_AS_HEX
log(Debug, "%s: %s Write u8 (S = %d), Free Size = %d, Value = 0x%X.", DEBUG_CONTEXT_STRINGS[context], mMnemonic.c_str(), success, mFIFOQueue.write_available(), data);
log(Debug, "%s: %s Write u8 (Ok = %d), Used Size = %d, Value = 0x%X.", DEBUG_CONTEXT_STRINGS[context], mMnemonic.c_str(), success, getReadAvailable(), data);
#else
log(Debug, "%s: %s Write u8 (S = %d), Free Size = %d, Value = %d.", SYSTEM_STR[context], mMnemonic.c_str(), success, mFIFOQueue.write_available(), data);
log(Debug, "%s: %s Write u8 (Ok = %d), Used Size = %d, Value = %d.", SYSTEM_STR[context], mMnemonic.c_str(), success, getReadAvailable(), data);
#endif
}
#endif

View file

@ -7,8 +7,8 @@
CDVD_t::CDVD_t() :
N_COMMAND(std::make_shared<CDVDRegister_NS_COMMAND_t>("CDVD N_COMMAND", true, true)),
N_RDY_DIN(std::make_shared<CDVDRegister_NS_RDY_DIN_t>("CDVD N_READY", "CDVD N_DATA_IN", false, false, 16)),
N_DATA_OUT(std::make_shared<CDVDFIFOQueue_NS_DATA_OUT_t>("CDVD N_DATA_OUT", false, false, 16, N_RDY_DIN)),
N_RDY_DIN(std::make_shared<CDVDRegister_NS_RDY_DIN_t>("CDVD N_READY", "CDVD N_DATA_IN", true, true, 16)),
N_DATA_OUT(std::make_shared<CDVDFIFOQueue_NS_DATA_OUT_t>("CDVD N_DATA_OUT", true, true, 16, N_RDY_DIN)),
BREAK(std::make_shared<Register8_t>("CDVD BREAK", true, true)),
INTR_STAT(std::make_shared<Register8_t>("CDVD INTR_STAT", true, true)),
STATUS(std::make_shared<Register8_t>("CDVD STATUS", true, true)),
@ -19,9 +19,9 @@ CDVD_t::CDVD_t() :
TYPE(std::make_shared<Register8_t>("CDVD TYPE", true, true)),
REGISTER_2013(std::make_shared<Register8_t>("CDVD REGISTER_2013", true, true)),
RSV(std::make_shared<Register8_t>("CDVD RSV", true, true)),
S_COMMAND(std::make_shared<CDVDRegister_NS_COMMAND_t>("CDVD S_COMMAND", false, false)),
S_RDY_DIN(std::make_shared<CDVDRegister_NS_RDY_DIN_t>("CDVD S_READY", "CDVD S_DATA_IN", false, false, 16)),
S_DATA_OUT(std::make_shared<CDVDFIFOQueue_NS_DATA_OUT_t>("CDVD S_DATA_OUT", false, false, 16, S_RDY_DIN)),
S_COMMAND(std::make_shared<CDVDRegister_NS_COMMAND_t>("CDVD S_COMMAND", true, false)),
S_RDY_DIN(std::make_shared<CDVDRegister_NS_RDY_DIN_t>("CDVD S_READY", "CDVD S_DATA_IN", true, true, 16)),
S_DATA_OUT(std::make_shared<CDVDFIFOQueue_NS_DATA_OUT_t>("CDVD S_DATA_OUT", true, true, 16, S_RDY_DIN)),
KEY_20(std::make_shared<Register8_t>("CDVD KEY_20", true, true)),
KEY_21(std::make_shared<Register8_t>("CDVD KEY_21", true, true)),
KEY_22(std::make_shared<Register8_t>("CDVD KEY_22", true, true)),

View file

@ -124,7 +124,7 @@ public:
};
/*
Represents IOP DMAC channel 5 - PIO (parallel I/O?) channel.
Represents IOP DMAC channel 5 - PIO (parallel I/O) channel.
This channel inherits a base IOP DMAC channel.
*/
class IOPDmacChannel_PIO_t : public IOPDmacChannel_t
@ -138,7 +138,7 @@ public:
/*
Represents IOP DMAC channel 6 - the OTClear channel.
The OTClear channel inherits a base IOP DMAC channel.
TODO: what is this???
TODO: Ordering table clear - related to PSX GPU. Probably don't have to worry about for now.
*/
class IOPDmacChannel_OTClear_t : public IOPDmacChannel_t
{

View file

@ -37,29 +37,29 @@ IOPDmacRegister_PCR0_t::IOPDmacRegister_PCR0_t(const char * mnemonic, const bool
IOPDmacRegister_ICR0_t::IOPDmacRegister_ICR0_t(const char * mnemonic, const bool debugReads, const bool debugWrites) :
BitfieldRegister32_t(mnemonic, debugReads, debugWrites)
{
registerField(Fields::IRM0, "IRM0", 0, 1, 0);
registerField(Fields::IRM1, "IRM1", 1, 1, 0);
registerField(Fields::IRM2, "IRM2", 2, 1, 0);
registerField(Fields::IRM3, "IRM3", 3, 1, 0);
registerField(Fields::IRM4, "IRM4", 4, 1, 0);
registerField(Fields::IRM5, "IRM5", 5, 1, 0);
registerField(Fields::IRM6, "IRM6", 6, 1, 0);
registerField(Fields::IRM0, "IRM0 (fromMDEC)", 0, 1, 0);
registerField(Fields::IRM1, "IRM1 (toMDEC)", 1, 1, 0);
registerField(Fields::IRM2, "IRM2 (SIF2/GPU)", 2, 1, 0);
registerField(Fields::IRM3, "IRM3 (CDROM)", 3, 1, 0);
registerField(Fields::IRM4, "IRM4 (SPU2c0)", 4, 1, 0);
registerField(Fields::IRM5, "IRM5 (PIO)", 5, 1, 0);
registerField(Fields::IRM6, "IRM6 (OTClear)", 6, 1, 0);
registerField(Fields::Error, "Error", 15, 1, 0);
registerField(Fields::TCM0, "TCM0", 16, 1, 0);
registerField(Fields::TCM1, "TCM1", 17, 1, 0);
registerField(Fields::TCM2, "TCM2", 18, 1, 0);
registerField(Fields::TCM3, "TCM3", 19, 1, 0);
registerField(Fields::TCM4, "TCM4", 20, 1, 0);
registerField(Fields::TCM5, "TCM5", 21, 1, 0);
registerField(Fields::TCM6, "TCM6", 22, 1, 0);
registerField(Fields::TCM0, "TCM0 (fromMDEC)", 16, 1, 0);
registerField(Fields::TCM1, "TCM1 (toMDEC)", 17, 1, 0);
registerField(Fields::TCM2, "TCM2 (SIF2/GPU)", 18, 1, 0);
registerField(Fields::TCM3, "TCM3 (CDROM)", 19, 1, 0);
registerField(Fields::TCM4, "TCM4 (SPU2c0)", 20, 1, 0);
registerField(Fields::TCM5, "TCM5 (PIO)", 21, 1, 0);
registerField(Fields::TCM6, "TCM6 (OTClear)", 22, 1, 0);
registerField(Fields::MasterEnable, "MasterEnable", 23, 1, 0);
registerField(Fields::TCI0, "TCI0", 24, 1, 0);
registerField(Fields::TCI1, "TCI1", 25, 1, 0);
registerField(Fields::TCI2, "TCI2", 26, 1, 0);
registerField(Fields::TCI3, "TCI3", 27, 1, 0);
registerField(Fields::TCI4, "TCI4", 28, 1, 0);
registerField(Fields::TCI5, "TCI5", 29, 1, 0);
registerField(Fields::TCI6, "TCI6", 30, 1, 0);
registerField(Fields::TCI0, "TCI0 (fromMDEC)", 24, 1, 0);
registerField(Fields::TCI1, "TCI1 (toMDEC)", 25, 1, 0);
registerField(Fields::TCI2, "TCI2 (SIF2/GPU)", 26, 1, 0);
registerField(Fields::TCI3, "TCI3 (CDROM)", 27, 1, 0);
registerField(Fields::TCI4, "TCI4 (SPU2c0)", 28, 1, 0);
registerField(Fields::TCI5, "TCI5 (PIO)", 29, 1, 0);
registerField(Fields::TCI6, "TCI6 (OTClear)", 30, 1, 0);
registerField(Fields::MasterInterrupt, "MasterInterrupt", 31, 1, 0);
}
@ -112,34 +112,34 @@ IOPDmacRegister_ICR1_t::IOPDmacRegister_ICR1_t(const char * mnemonic, const bool
BitfieldRegister32_t(mnemonic, debugReads, debugWrites),
mICR0(ICR0)
{
registerField(Fields::IQE0, "IQE0", 0, 1, 0);
registerField(Fields::IQE1, "IQE1", 1, 1, 0);
registerField(Fields::IQE2, "IQE2", 2, 1, 0);
registerField(Fields::IQE3, "IQE3", 3, 1, 0);
registerField(Fields::IQE4, "IQE4", 4, 1, 0);
registerField(Fields::IQE5, "IQE5", 5, 1, 0);
registerField(Fields::IQE6, "IQE6", 6, 1, 0);
registerField(Fields::IQE7, "IQE7", 7, 1, 0);
registerField(Fields::IQE8, "IQE8", 8, 1, 0);
registerField(Fields::IQE9, "IQE9", 9, 1, 0);
registerField(Fields::IQE10, "IQE10", 10, 1, 0);
registerField(Fields::IQE11, "IQE11", 11, 1, 0);
registerField(Fields::IQE12, "IQE12", 12, 1, 0);
registerField(Fields::IQE13, "IQE13", 13, 1, 0);
registerField(Fields::TCM7, "TCM7", 16, 1, 0);
registerField(Fields::TCM8, "TCM8", 17, 1, 0);
registerField(Fields::TCM9, "TCM9", 18, 1, 0);
registerField(Fields::TCM10, "TCM10", 19, 1, 0);
registerField(Fields::TCM11, "TCM11", 20, 1, 0);
registerField(Fields::TCM12, "TCM12", 21, 1, 0);
registerField(Fields::TCM13, "TCM13", 22, 1, 0);
registerField(Fields::TCI7, "TCI7", 24, 1, 0);
registerField(Fields::TCI8, "TCI8", 25, 1, 0);
registerField(Fields::TCI9, "TCI9", 26, 1, 0);
registerField(Fields::TCI10, "TCI10", 27, 1, 0);
registerField(Fields::TCI11, "TCI11", 28, 1, 0);
registerField(Fields::TCI12, "TCI12", 29, 1, 0);
registerField(Fields::TCI13, "TCI13", 30, 1, 0);
registerField(Fields::IQE0, "IQE0 (fromMDEC)", 0, 1, 0);
registerField(Fields::IQE1, "IQE1 (toMDEC)", 1, 1, 0);
registerField(Fields::IQE2, "IQE2 (SIF2/GPU)", 2, 1, 0);
registerField(Fields::IQE3, "IQE3 (CDROM)", 3, 1, 0);
registerField(Fields::IQE4, "IQE4 (SPU2c0)", 4, 1, 0);
registerField(Fields::IQE5, "IQE5 (PIO)", 5, 1, 0);
registerField(Fields::IQE6, "IQE6 (OTClear)", 6, 1, 0);
registerField(Fields::IQE7, "IQE7 (SPU2c1)", 7, 1, 0);
registerField(Fields::IQE8, "IQE8 (DEV9)", 8, 1, 0);
registerField(Fields::IQE9, "IQE9 (SIF0)", 9, 1, 0);
registerField(Fields::IQE10, "IQE10 (SIF1)", 10, 1, 0);
registerField(Fields::IQE11, "IQE11 (fromSIO2)", 11, 1, 0);
registerField(Fields::IQE12, "IQE12 (toSIO2)", 12, 1, 0);
registerField(Fields::IQE13, "IQE13 (dummy)", 13, 1, 0);
registerField(Fields::TCM7, "TCM7 (SPU2c1)", 16, 1, 0);
registerField(Fields::TCM8, "TCM8 (DEV9)", 17, 1, 0);
registerField(Fields::TCM9, "TCM9 (SIF0)", 18, 1, 0);
registerField(Fields::TCM10, "TCM10 (SIF1)", 19, 1, 0);
registerField(Fields::TCM11, "TCM11 (fromSIO2)", 20, 1, 0);
registerField(Fields::TCM12, "TCM12 (toSIO2)", 21, 1, 0);
registerField(Fields::TCM13, "TCM13 (dummy)", 22, 1, 0);
registerField(Fields::TCI7, "TCI7 (SPU2c1)", 24, 1, 0);
registerField(Fields::TCI8, "TCI8 (DEV9)", 25, 1, 0);
registerField(Fields::TCI9, "TCI9 (SIF0)", 26, 1, 0);
registerField(Fields::TCI10, "TCI10 (SIF1)", 27, 1, 0);
registerField(Fields::TCI11, "TCI11 (fromSIO2)", 28, 1, 0);
registerField(Fields::TCI12, "TCI12 (toSIO2)", 29, 1, 0);
registerField(Fields::TCI13, "TCI13 (dummy)", 30, 1, 0);
}
void IOPDmacRegister_ICR1_t::writeWord(const Context_t context, const u32 value)

View file

@ -58,7 +58,7 @@ IOPIntcRegister_MASK_t::IOPIntcRegister_MASK_t(const char * mnemonic, const bool
registerField(Fields::SIO1, "SIO1", 8, 1, 0);
registerField(Fields::SPU, "SPU", 9, 1, 0);
registerField(Fields::PIO, "PIO", 10, 1, 0);
registerField(Fields::EVBLANK, "EVBLANK", 11, 1, 0); // End of VBLANK?
registerField(Fields::EVBLANK, "EVBLANK", 11, 1, 0); // End of VBLANK.
registerField(Fields::DVD, "DVD", 12, 1, 0);
registerField(Fields::PCMCIA, "PCMCIA", 13, 1, 0);
registerField(Fields::TMR3, "TMR3", 14, 1, 0);

View file

@ -7,10 +7,4 @@ SPU2Register_SPDIF_IRQINFO_t::SPU2Register_SPDIF_IRQINFO_t(const char * mnemonic
{
registerField(Fields::IrqCore0, "IrqCore0", 2, 1, 0);
registerField(Fields::IrqCore1, "IrqCore1", 3, 1, 0);
}
bool SPU2Register_SPDIF_IRQINFO_t::isInterrupted(const Context_t context)
{
// Core 0 and 1 IRQ bits located at bits 2 and 3 (0xC mask).
return ((readHword(context) & 0xC) > 0);
}

View file

@ -9,7 +9,7 @@ The SPU2 SPDIF_IRQINFO register.
Contains information about the SPU2 cores' interrupted states.
See the SPU2-X/spu2sys.cpp file for information about the IRQ's.
IRQ's are set, for example, when an address is accessed equaling the IRQA register pair value.
Weird how general IRQ's not related to SPDIF use this register...
TODO: Weird how general IRQ's not related to SPDIF use this register... Check this?
*/
class SPU2Register_SPDIF_IRQINFO_t : public BitfieldRegister16_t
{
@ -23,9 +23,4 @@ public:
};
SPU2Register_SPDIF_IRQINFO_t(const char * mnemonic, const bool debugReads, const bool debugWrites);
/*
Returns if any of the core IRQ's are set.
*/
bool isInterrupted(const Context_t context);
};

View file

@ -57,7 +57,7 @@ int EECoreInterpreter_s::step(const Event_t & event)
mEECoreInstruction = EECoreInstruction_t(mByteMMU->readWord(getContext(), physicalAddress));
#if defined(BUILD_DEBUG)
static u64 DEBUG_LOOP_BREAKPOINT = 0x10000000143138b;
static u64 DEBUG_LOOP_BREAKPOINT = 0x100000004F94E00;
static u32 DEBUG_PC_BREAKPOINT = 0x0;
if (DEBUG_LOOP_COUNTER >= DEBUG_LOOP_BREAKPOINT)
{

View file

@ -49,10 +49,10 @@ int SPU2_s::step(const Event_t & event)
workDone |= handleDMATransfer();
workDone |= handleSoundGeneration();
}
// Do an interrupt check, and send signal to the IOP INTC if needed.
handleInterruptCheck();
// Do an interrupt check, and send signal to the IOP INTC if needed.
handleInterruptCheck();
}
// SPU2 has completed 1 cycle.
#if ACCURACY_SKIP_TICKS_ON_NO_WORK
@ -246,7 +246,7 @@ void SPU2_s::writeHwordMemory(const u32 hwordPhysicalAddress, const u16 value) c
void SPU2_s::handleInterruptCheck() const
{
if (mCore->ATTR->getFieldValue(getContext(), SPU2CoreRegister_ATTR_t::Fields::IRQEnable)
&& mSPU2->SPDIF_IRQINFO->isInterrupted(getContext()))
&& mSPU2->SPDIF_IRQINFO->getFieldValue(getContext(), SPU2Register_SPDIF_IRQINFO_t::Fields::IRQ_KEYS[mCore->getCoreID()]))
{
// IRQ was set, notify the IOP INTC.
mINTC->STAT->setFieldValue(getContext(), IOPIntcRegister_STAT_t::Fields::SPU, 1);