DSPLLE: More minor clean up, some log mistake fixes and revert the +1 loop (it seems to got
zelda ucode stuck for some weird reason) git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@3694 8ced0084-cf51-0410-be5f-012b33b47a6e
This commit is contained in:
parent
c44dabfe8b
commit
ce6e8ed798
|
@ -170,7 +170,7 @@ void DSPCore_CheckExternalInterrupt()
|
||||||
g_dsp.cr &= ~CR_EXTERNAL_INT;
|
g_dsp.cr &= ~CR_EXTERNAL_INT;
|
||||||
} else {
|
} else {
|
||||||
#ifdef DEBUG_EXP
|
#ifdef DEBUG_EXP
|
||||||
ERROR_LOG(DSPLLE, "External interupt firing failed");
|
ERROR_LOG(DSPLLE, "External interrupt firing failed");
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -189,8 +189,8 @@ void DSPCore_CheckExceptions()
|
||||||
// check exceptions should it be 0..7 or 7..0?
|
// check exceptions should it be 0..7 or 7..0?
|
||||||
for (int i = 0; i < 8; i++) {
|
for (int i = 0; i < 8; i++) {
|
||||||
// Seems exp int is not masked by sr_int_enable
|
// 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)) {
|
||||||
if (g_dsp.exceptions & (1 << i)) {
|
if (dsp_SR_is_flag_set(SR_INT_ENABLE) || i == EXP_INT) {
|
||||||
_assert_msg_(MASTER_LOG, !g_dsp.exception_in_progress_hack, "assert while exception");
|
_assert_msg_(MASTER_LOG, !g_dsp.exception_in_progress_hack, "assert while exception");
|
||||||
|
|
||||||
// store pc and sr until RTI
|
// store pc and sr until RTI
|
||||||
|
@ -201,11 +201,11 @@ void DSPCore_CheckExceptions()
|
||||||
g_dsp.exceptions &= ~(1 << i);
|
g_dsp.exceptions &= ~(1 << i);
|
||||||
g_dsp.exception_in_progress_hack = true;
|
g_dsp.exception_in_progress_hack = true;
|
||||||
break;
|
break;
|
||||||
}
|
} else {
|
||||||
} else {
|
|
||||||
#ifdef DEBUG_EXP
|
#ifdef DEBUG_EXP
|
||||||
ERROR_LOG(DSPLLE, "Firing exception %d failed");
|
ERROR_LOG(DSPLLE, "Firing exception %d failed");
|
||||||
#endif
|
#endif
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -92,7 +92,7 @@ void gdsp_mbox_write_l(u8 mbx, u16 val)
|
||||||
{
|
{
|
||||||
NOTICE_LOG(DSPLLE, "DSP(WM) B:%i M:0x%08x (pc=0x%04x)", mbx, gdsp_mbox_peek(GDSP_MBOX_DSP), g_dsp.pc);
|
NOTICE_LOG(DSPLLE, "DSP(WM) B:%i M:0x%08x (pc=0x%04x)", mbx, gdsp_mbox_peek(GDSP_MBOX_DSP), g_dsp.pc);
|
||||||
} else {
|
} else {
|
||||||
NOTICE_LOG(DSPLLE, "CPU(WM) B:%i M:0x%08x (pc=0x%04x)", mbx, gdsp_mbox_peek(GDSP_MBOX_DSP), g_dsp.pc);
|
NOTICE_LOG(DSPLLE, "CPU(WM) B:%i M:0x%08x (pc=0x%04x)", mbx, gdsp_mbox_peek(GDSP_MBOX_CPU), g_dsp.pc);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
@ -121,7 +121,7 @@ u16 gdsp_mbox_read_l(u8 mbx)
|
||||||
{
|
{
|
||||||
NOTICE_LOG(DSPLLE, "DSP(RM) B:%i M:0x%08x (pc=0x%04x)", mbx, gdsp_mbox_peek(GDSP_MBOX_DSP), g_dsp.pc);
|
NOTICE_LOG(DSPLLE, "DSP(RM) B:%i M:0x%08x (pc=0x%04x)", mbx, gdsp_mbox_peek(GDSP_MBOX_DSP), g_dsp.pc);
|
||||||
} else {
|
} else {
|
||||||
NOTICE_LOG(DSPLLE, "CPU(RM) B:%i M:0x%08x (pc=0x%04x)", mbx, gdsp_mbox_peek(GDSP_MBOX_DSP), g_dsp.pc);
|
NOTICE_LOG(DSPLLE, "CPU(RM) B:%i M:0x%08x (pc=0x%04x)", mbx, gdsp_mbox_peek(GDSP_MBOX_CPU), g_dsp.pc);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -33,6 +33,7 @@
|
||||||
#include "DSPMemoryMap.h"
|
#include "DSPMemoryMap.h"
|
||||||
#include "DSPStacks.h"
|
#include "DSPStacks.h"
|
||||||
|
|
||||||
|
|
||||||
// ---------------------------------------------------------------------------------------
|
// ---------------------------------------------------------------------------------------
|
||||||
// --- SR
|
// --- SR
|
||||||
// ---------------------------------------------------------------------------------------
|
// ---------------------------------------------------------------------------------------
|
||||||
|
|
|
@ -71,34 +71,6 @@ u16 ReadCR()
|
||||||
return g_dsp.cr;
|
return g_dsp.cr;
|
||||||
}
|
}
|
||||||
|
|
||||||
void HandleLoop()
|
|
||||||
{
|
|
||||||
// Handle looping hardware.
|
|
||||||
u16& rLoopCounter = g_dsp.r[DSP_REG_ST3];
|
|
||||||
if (rLoopCounter > 0)
|
|
||||||
{
|
|
||||||
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--;
|
|
||||||
if (rLoopCounter > 0)
|
|
||||||
{
|
|
||||||
g_dsp.pc = rCallAddress;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// end of loop
|
|
||||||
dsp_reg_load_stack(0);
|
|
||||||
dsp_reg_load_stack(2);
|
|
||||||
dsp_reg_load_stack(3);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void Step()
|
void Step()
|
||||||
{
|
{
|
||||||
DSPCore_CheckExceptions();
|
DSPCore_CheckExceptions();
|
||||||
|
|
|
@ -27,6 +27,9 @@ namespace DSPInterpreter {
|
||||||
void Step();
|
void Step();
|
||||||
void Run();
|
void Run();
|
||||||
|
|
||||||
|
// See: DspIntBranch.cpp
|
||||||
|
void HandleLoop();
|
||||||
|
|
||||||
// If these simply return the same number of cycles as was passed into them,
|
// If these simply return the same number of cycles as was passed into them,
|
||||||
// chances are that the DSP is halted.
|
// chances are that the DSP is halted.
|
||||||
// The difference between them is that the debug one obeys breakpoints.
|
// The difference between them is that the debug one obeys breakpoints.
|
||||||
|
|
|
@ -145,6 +145,33 @@ void halt(const UDSPInstruction& opc)
|
||||||
// then PC is modified with calue from call stack $st0. Otherwise values from
|
// then PC is modified with calue from call stack $st0. Otherwise values from
|
||||||
// callstack $st0 and both loop stacks $st2 and $st3 are poped and execution
|
// callstack $st0 and both loop stacks $st2 and $st3 are poped and execution
|
||||||
// continues at next opcode.
|
// continues at next opcode.
|
||||||
|
void HandleLoop()
|
||||||
|
{
|
||||||
|
// Handle looping hardware.
|
||||||
|
u16& rLoopCounter = g_dsp.r[DSP_REG_ST3];
|
||||||
|
if (rLoopCounter > 0)
|
||||||
|
{
|
||||||
|
const u16 rCallAddress = g_dsp.r[DSP_REG_ST0];
|
||||||
|
const u16 rLoopAddress = g_dsp.r[DSP_REG_ST2];
|
||||||
|
|
||||||
|
|
||||||
|
if (g_dsp.pc == (rLoopAddress + 1)) //opSize[rLoopAddress]))
|
||||||
|
{
|
||||||
|
rLoopCounter--;
|
||||||
|
if (rLoopCounter > 0)
|
||||||
|
{
|
||||||
|
g_dsp.pc = rCallAddress;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// end of loop
|
||||||
|
dsp_reg_load_stack(0);
|
||||||
|
dsp_reg_load_stack(2);
|
||||||
|
dsp_reg_load_stack(3);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// LOOP $R
|
// LOOP $R
|
||||||
|
|
|
@ -6,11 +6,10 @@ files = [
|
||||||
"assemble.cpp",
|
"assemble.cpp",
|
||||||
"disassemble.cpp",
|
"disassemble.cpp",
|
||||||
"DSPAccelerator.cpp",
|
"DSPAccelerator.cpp",
|
||||||
"DSPBreakpoints.cpp",
|
"DSPBreakpoints.cpp",
|
||||||
"DSPIntCCUtil.cpp",
|
"DSPIntCCUtil.cpp",
|
||||||
"DSPIntExtOps.cpp",
|
"DSPIntExtOps.cpp",
|
||||||
"DSPHWInterface.cpp",
|
"DSPHWInterface.cpp",
|
||||||
"DSPInterpreter.cpp",
|
|
||||||
"DSPMemoryMap.cpp",
|
"DSPMemoryMap.cpp",
|
||||||
"DSPStacks.cpp",
|
"DSPStacks.cpp",
|
||||||
"DSPAnalyzer.cpp",
|
"DSPAnalyzer.cpp",
|
||||||
|
@ -22,6 +21,7 @@ files = [
|
||||||
"DSPJit.cpp",
|
"DSPJit.cpp",
|
||||||
"DSPCodeUtil.cpp",
|
"DSPCodeUtil.cpp",
|
||||||
"LabelMap.cpp",
|
"LabelMap.cpp",
|
||||||
|
"DSPInterpreter.cpp",
|
||||||
"DSPCore.cpp",
|
"DSPCore.cpp",
|
||||||
"DSPTables.cpp",
|
"DSPTables.cpp",
|
||||||
]
|
]
|
||||||
|
|
Loading…
Reference in New Issue