DSPLLE - AX PCM16 fix

git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@5191 8ced0084-cf51-0410-be5f-012b33b47a6e
This commit is contained in:
Marko Pusljar 2010-03-13 02:28:21 +00:00
parent 3ccbd152fd
commit 34d1d7a41e
2 changed files with 15 additions and 8 deletions

View File

@ -133,17 +133,24 @@ u16 dsp_read_accelerator()
val = ADPCM_Step(Address); val = ADPCM_Step(Address);
break; break;
case 0x0A: // 16-bit PCM audio case 0x0A: // 16-bit PCM audio
val = (DSPHost_ReadHostMemory(Address) << 8) | DSPHost_ReadHostMemory(Address + 1); val = (DSPHost_ReadHostMemory(Address*2) << 8) | DSPHost_ReadHostMemory(Address*2 + 1);
g_dsp.ifx_regs[DSP_YN2] = g_dsp.ifx_regs[DSP_YN1]; g_dsp.ifx_regs[DSP_YN2] = g_dsp.ifx_regs[DSP_YN1];
g_dsp.ifx_regs[DSP_YN1] = val; g_dsp.ifx_regs[DSP_YN1] = val;
Address += 2; Address += 1;
break; break;
case 0x19: // 8-bit PCM audio
val = DSPHost_ReadHostMemory(Address) << 8; // probably wrong
g_dsp.ifx_regs[DSP_YN2] = g_dsp.ifx_regs[DSP_YN1];
g_dsp.ifx_regs[DSP_YN1] = val;
Address += 1;
break;
default: default:
ERROR_LOG(DSPLLE, "Unknown DSP Format %x", g_dsp.ifx_regs[DSP_FORMAT]); ERROR_LOG(DSPLLE, "Unknown DSP Format %x", g_dsp.ifx_regs[DSP_FORMAT]);
break; break;
} }
// TODO: Take GAIN into account, whatever it is. // TODO: Take GAIN into account, whatever it is.
// It looks like its always 0x800 for PCM8/PCM16 and 0x0 for adpcm
if (g_dsp.ifx_regs[DSP_GAIN] > 0) if (g_dsp.ifx_regs[DSP_GAIN] > 0)
{ {
//NOTICE_LOG(DSPLLE,"format: 0x%04x - val: 0x%04x - gain: 0x%04x", g_dsp.ifx_regs[DSP_FORMAT], val, g_dsp.ifx_regs[DSP_GAIN]); //NOTICE_LOG(DSPLLE,"format: 0x%04x - val: 0x%04x - gain: 0x%04x", g_dsp.ifx_regs[DSP_FORMAT], val, g_dsp.ifx_regs[DSP_GAIN]);

View File

@ -73,7 +73,7 @@ u16 ReadCR()
void Step() void Step()
{ {
DSPCore_CheckExternalInterrupt(); //DSPCore_CheckExternalInterrupt();
DSPCore_CheckExceptions(); DSPCore_CheckExceptions();
g_dsp.step_counter++; g_dsp.step_counter++;
@ -109,7 +109,7 @@ void Run()
break; break;
// This number (500) is completely arbitrary. TODO: tweak. // This number (500) is completely arbitrary. TODO: tweak.
RunCyclesDebug(500); RunCycles(500);
if (!gdsp_running) if (!gdsp_running)
break; break;
@ -136,9 +136,9 @@ int RunCyclesDebug(int cycles)
if (cycles < 0) if (cycles < 0)
return 0; return 0;
} }
//DSPCore_CheckExternalInterrupt();
DSPCore_CheckExternalInterrupt();
// Now, let's run a few cycles with idle skipping. // Now, let's run a few cycles with idle skipping.
for (int i = 0; i < 8; i++) for (int i = 0; i < 8; i++)
{ {
@ -177,8 +177,6 @@ int RunCyclesDebug(int cycles)
// Used by non-thread mode. Meant to be efficient. // Used by non-thread mode. Meant to be efficient.
int RunCycles(int cycles) int RunCycles(int cycles)
{ {
//DSPCore_CheckExternalInterrupt();
// 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++) for (int i = 0; i < 8; i++)
{ {
@ -188,6 +186,8 @@ int RunCycles(int cycles)
cycles--; cycles--;
} }
DSPCore_CheckExternalInterrupt();
// Next, let's run a few cycles with idle skipping, so that we can skip // Next, let's run a few cycles with idle skipping, so that we can skip
// idle loops. // idle loops.
for (int i = 0; i < 8; i++) for (int i = 0; i < 8; i++)