summaryrefslogtreecommitdiff
path: root/Source/Core/DSPCore
diff options
context:
space:
mode:
authornakeee <nakeee@gmail.com>2009-07-06 18:15:01 +0000
committernakeee <nakeee@gmail.com>2009-07-06 18:15:01 +0000
commitc44dabfe8b935da4a6b3970ffc0575d21f9f606d (patch)
tree537c526f362c00a8d7cced051c45195b391d0ceb /Source/Core/DSPCore
parent45771c8614ed8ce9edb70f6b97fbe35d4c5c362f (diff)
DSPLLE: comments and logging clean up
git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@3693 8ced0084-cf51-0410-be5f-012b33b47a6e
Diffstat (limited to 'Source/Core/DSPCore')
-rw-r--r--Source/Core/DSPCore/Src/DSPAccelerator.cpp18
-rw-r--r--Source/Core/DSPCore/Src/DSPCore.cpp32
-rw-r--r--Source/Core/DSPCore/Src/DSPHWInterface.cpp17
-rw-r--r--Source/Core/DSPCore/Src/DSPInterpreter.cpp12
4 files changed, 41 insertions, 38 deletions
diff --git a/Source/Core/DSPCore/Src/DSPAccelerator.cpp b/Source/Core/DSPCore/Src/DSPAccelerator.cpp
index 96b49e5342..223d4fabf8 100644
--- a/Source/Core/DSPCore/Src/DSPAccelerator.cpp
+++ b/Source/Core/DSPCore/Src/DSPAccelerator.cpp
@@ -106,12 +106,12 @@ u16 dsp_read_accelerator()
u16 val;
- // let's do the "hardware" decode
- // DSP_FORMAT is interesting - the Zelda ucode seems to indicate that the bottom
- // two bits specify the "read size" and the address multiplier.
- // The bits above that may be things like sign extention and do/do not use ADPCM.
- // It also remains to be figured out whether there's a difference between the usual
- // accelerator "read address" and 0xd3.
+ // let's do the "hardware" decode DSP_FORMAT is interesting - the Zelda
+ // ucode seems to indicate that the bottom two bits specify the "read size"
+ // and the address multiplier. The bits above that may be things like sign
+ // extention and do/do not use ADPCM. It also remains to be figured out
+ // whether there's a difference between the usual accelerator "read
+ // address" and 0xd3.
switch (gdsp_ifx_regs[DSP_FORMAT])
{
case 0x00: // ADPCM audio
@@ -146,9 +146,9 @@ u16 dsp_read_accelerator()
DSPCore_SetException(EXP_4);
DSPCore_SetException(EXP_ACCOV);
- // Somehow, YN1 and YN2 must be initialized with their "loop" values, so yeah,
- // it seems likely that we should raise an exception to let the DSP program do that,
- // at least if DSP_FORMAT == 0x0A.
+ // Somehow, YN1 and YN2 must be initialized with their "loop" values,
+ // so yeah, it seems likely that we should raise an exception to let
+ // the DSP program do that, at least if DSP_FORMAT == 0x0A.
}
gdsp_ifx_regs[DSP_ACCAH] = Address >> 16;
diff --git a/Source/Core/DSPCore/Src/DSPCore.cpp b/Source/Core/DSPCore/Src/DSPCore.cpp
index 0dafd25259..21f99b2a18 100644
--- a/Source/Core/DSPCore/Src/DSPCore.cpp
+++ b/Source/Core/DSPCore/Src/DSPCore.cpp
@@ -153,51 +153,59 @@ void DSPCore_SetException(u8 level)
g_dsp.exceptions |= 1 << level;
}
+// Comming from the CPU
void DSPCore_CheckExternalInterrupt()
{
// check if there is an external interrupt
if (g_dsp.cr & CR_EXTERNAL_INT && !g_dsp.exception_in_progress_hack)
{
#ifdef DEBUG_EXP
- NOTICE_LOG(DSPLLE, "trying External interupt fired");
+ NOTICE_LOG(DSPLLE, "Firing external interrupt");
#endif
if (dsp_SR_is_flag_set(SR_EXT_INT_ENABLE))
{
-#ifdef DEBUG_EXP
- NOTICE_LOG(DSPLLE, "External interupt fired");
-#endif
- // level 7 is the interrupt exception
+ // Signal the SPU about new mail
DSPCore_SetException(EXP_INT);
g_dsp.cr &= ~CR_EXTERNAL_INT;
+ } else {
+#ifdef DEBUG_EXP
+ ERROR_LOG(DSPLLE, "External interupt firing failed");
+#endif
}
+
}
}
void DSPCore_CheckExceptions()
{
+ // it's unclear what to do when there are two exceptions are the same time
+ // but for sure they should not be called together therefore the
+ // g_dsp.exception_in_progress_hack
if (g_dsp.exceptions != 0 && !g_dsp.exception_in_progress_hack) {
#ifdef DEBUG_EXP
- NOTICE_LOG(DSPLLE, "trying exception %d fired", g_dsp.exceptions);
+ NOTICE_LOG(DSPLLE, "Firing exception %d", g_dsp.exceptions);
#endif
- // check exceptions
+ // check exceptions should it be 0..7 or 7..0?
for (int i = 0; i < 8; i++) {
- // Seems 7 must pass or zelda dies
+ // Seems exp int is not masked by sr_int_enable
if (dsp_SR_is_flag_set(SR_INT_ENABLE) || i == EXP_INT) {
if (g_dsp.exceptions & (1 << i)) {
_assert_msg_(MASTER_LOG, !g_dsp.exception_in_progress_hack, "assert while exception");
+ // store pc and sr until RTI
dsp_reg_store_stack(DSP_STACK_C, g_dsp.pc);
dsp_reg_store_stack(DSP_STACK_D, g_dsp.r[DSP_REG_SR]);
- g_dsp.pc = i * 2;
+ g_dsp.pc = i * 2;
g_dsp.exceptions &= ~(1 << i);
-#ifdef DEBUG_EXP
- NOTICE_LOG(DSPLLE, "exception %d fired");
-#endif
g_dsp.exception_in_progress_hack = true;
break;
}
+ } else {
+#ifdef DEBUG_EXP
+ ERROR_LOG(DSPLLE, "Firing exception %d failed");
+#endif
}
}
}
diff --git a/Source/Core/DSPCore/Src/DSPHWInterface.cpp b/Source/Core/DSPCore/Src/DSPHWInterface.cpp
index c19730be70..34089cb1c9 100644
--- a/Source/Core/DSPCore/Src/DSPHWInterface.cpp
+++ b/Source/Core/DSPCore/Src/DSPHWInterface.cpp
@@ -90,14 +90,9 @@ void gdsp_mbox_write_l(u8 mbx, u16 val)
#ifdef DEBUG_EXP
if (mbx == GDSP_MBOX_DSP)
{
- NOTICE_LOG(DSPLLE, " - DSP writes mail to mbx low %i: 0x%08x (pc=0x%04x)", mbx, gdsp_mbox_peek(GDSP_MBOX_DSP), g_dsp.pc);
- //DSPHost_InterruptRequest();
- //DSPCore_SetException(EXP_INT);
+ NOTICE_LOG(DSPLLE, "DSP(WM) B:%i M:0x%08x (pc=0x%04x)", mbx, gdsp_mbox_peek(GDSP_MBOX_DSP), g_dsp.pc);
} else {
- NOTICE_LOG(DSPLLE, " - CPU writes mail to mbx low %i: 0x%08x (pc=0x%04x)", mbx, gdsp_mbox_peek(GDSP_MBOX_CPU), g_dsp.pc);
-
- // DSPHost_InterruptRequest();
- // DSPCore_SetException(EXP_INT);
+ NOTICE_LOG(DSPLLE, "CPU(WM) B:%i M:0x%08x (pc=0x%04x)", mbx, gdsp_mbox_peek(GDSP_MBOX_DSP), g_dsp.pc);
}
#endif
}
@@ -124,13 +119,9 @@ u16 gdsp_mbox_read_l(u8 mbx)
#ifdef DEBUG_EXP
if (mbx == GDSP_MBOX_DSP)
{
- NOTICE_LOG(DSPLLE, "- DSP reads mail from mbx %i: %08x (pc=0x%04x)", mbx, gdsp_mbox_peek(mbx), g_dsp.pc);
- // DSPCore_SetException(EXP_INT);
- // DSPHost_InterruptRequest();
+ NOTICE_LOG(DSPLLE, "DSP(RM) B:%i M:0x%08x (pc=0x%04x)", mbx, gdsp_mbox_peek(GDSP_MBOX_DSP), g_dsp.pc);
} else {
- NOTICE_LOG(DSPLLE, "- CPU reads mail from mbx %i: %08x (pc=0x%04x)", mbx, gdsp_mbox_peek(mbx), g_dsp.pc);
- // DSPCore_SetException(EXP_INT);
- // DSPHost_InterruptRequest();
+ NOTICE_LOG(DSPLLE, "CPU(RM) B:%i M:0x%08x (pc=0x%04x)", mbx, gdsp_mbox_peek(GDSP_MBOX_DSP), g_dsp.pc);
}
#endif
diff --git a/Source/Core/DSPCore/Src/DSPInterpreter.cpp b/Source/Core/DSPCore/Src/DSPInterpreter.cpp
index a04e0654ea..1417a2ad89 100644
--- a/Source/Core/DSPCore/Src/DSPInterpreter.cpp
+++ b/Source/Core/DSPCore/Src/DSPInterpreter.cpp
@@ -80,6 +80,7 @@ void HandleLoop()
const u16 rCallAddress = g_dsp.r[DSP_REG_ST0];
const u16 rLoopAddress = g_dsp.r[DSP_REG_ST2];
+
if (g_dsp.pc == (rLoopAddress + opSize[rLoopAddress]))
{
rLoopCounter--;
@@ -148,7 +149,8 @@ void Run()
// This one has basic idle skipping, and checks breakpoints.
int RunCyclesDebug(int cycles)
{
- // First, let's run a few cycles with no idle skipping so that things can progress a bit.
+ // First, let's run a few cycles with no idle skipping so that things can
+ // progress a bit.
for (int i = 0; i < 8; i++)
{
if (g_dsp.cr & CR_HALT)
@@ -231,7 +233,8 @@ int RunCycles(int cycles)
cycles--;
}
- // Next, let's run a few cycles with idle skipping, so that we can skip idle loops.
+ // Next, let's run a few cycles with idle skipping, so that we can skip
+ // idle loops.
for (int i = 0; i < 8; i++)
{
if (g_dsp.cr & CR_HALT)
@@ -242,8 +245,9 @@ int RunCycles(int cycles)
cycles--;
}
- // Now, run the rest of the block without idle skipping. It might trip into a
- // idle loop and if so we waste some time here. Might be beneficial to slice even further.
+ // Now, run the rest of the block without idle skipping. It might trip into
+ // a idle loop and if so we waste some time here. Might be beneficial to
+ // slice even further.
while (cycles > 0)
{
Step();