summaryrefslogtreecommitdiff
path: root/Source/Core/DSPCore/Src/DSPCore.cpp
diff options
context:
space:
mode:
authorhrydgard <hrydgard@gmail.com>2009-06-07 11:06:40 +0000
committerhrydgard <hrydgard@gmail.com>2009-06-07 11:06:40 +0000
commitbb06a53e28ee3403e92e42aeba303ac69aecf3d6 (patch)
tree2621a68067ad0a6b29653c2b6f62c339ab579442 /Source/Core/DSPCore/Src/DSPCore.cpp
parent89cd1a4a76b02f24a9477c4c5b5db84d6565b9b2 (diff)
DSP LLE: Just some renaming and cleanup. Prepared for proper base address support in disassembly. Added a "DebugInterface" for the DSP which would allow us to hook up a CodeView .. although CoreView currently doesn't have any support for variable-length instructions.
git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@3351 8ced0084-cf51-0410-be5f-012b33b47a6e
Diffstat (limited to 'Source/Core/DSPCore/Src/DSPCore.cpp')
-rw-r--r--Source/Core/DSPCore/Src/DSPCore.cpp122
1 files changed, 51 insertions, 71 deletions
diff --git a/Source/Core/DSPCore/Src/DSPCore.cpp b/Source/Core/DSPCore/Src/DSPCore.cpp
index ac684f5e9a..d9903871e2 100644
--- a/Source/Core/DSPCore/Src/DSPCore.cpp
+++ b/Source/Core/DSPCore/Src/DSPCore.cpp
@@ -32,16 +32,38 @@
#include "gdsp_registers.h"
#include "gdsp_opcodes_helper.h"
-//namespace DSPCore
-//{
-
SDSP g_dsp;
+static bool LoadRom(const char *fname, int size_in_words, u16 *rom)
+{
+ FILE *pFile = fopen(fname, "rb");
+ const size_t size_in_bytes = size_in_words * sizeof(u16);
+ if (pFile)
+ {
+ size_t read_bytes = fread(rom, 1, size_in_bytes, pFile);
+ if (read_bytes != size_in_bytes)
+ {
+ PanicAlert("ROM %s too short : %i/%i", fname, (int)read_bytes, (int)size_in_bytes);
+ fclose(pFile);
+ return false;
+ }
+ fclose(pFile);
+
+ // Byteswap the rom.
+ for (int i = 0; i < DSP_IROM_SIZE; i++)
+ rom[i] = Common::swap16(rom[i]);
-//-------------------------------------------------------------------------------
+ return true;
+ }
+ // Always keep ROMs write protected.
+ WriteProtectMemory(g_dsp.irom, size_in_bytes, false);
+ return false;
+}
-void gdsp_init()
+bool DSPCore_Init(const char *irom_filename, const char *coef_filename)
{
+ g_dsp.step_counter = 0;
+
g_dsp.irom = (u16*)AllocateMemoryPages(DSP_IROM_BYTE_SIZE);
g_dsp.iram = (u16*)AllocateMemoryPages(DSP_IRAM_BYTE_SIZE);
g_dsp.dram = (u16*)AllocateMemoryPages(DSP_DRAM_BYTE_SIZE);
@@ -51,6 +73,10 @@ void gdsp_init()
memset(g_dsp.irom, 0, DSP_IROM_BYTE_SIZE);
memset(g_dsp.coef, 0, DSP_COEF_BYTE_SIZE);
+ // Try to load real ROM contents. Failing this, only homebrew will work correctly with the DSP.
+ LoadRom(irom_filename, DSP_IROM_SIZE, g_dsp.irom);
+ LoadRom(coef_filename, DSP_COEF_SIZE, g_dsp.coef);
+
for (int i = 0; i < 32; i++)
{
g_dsp.r[i] = 0;
@@ -74,14 +100,15 @@ void gdsp_init()
// Just zero out DRAM.
for (int i = 0; i < DSP_DRAM_SIZE; i++)
{
- g_dsp.dram[i] = 0x2100;
+ g_dsp.dram[i] = 0;
}
- // copied from a real console after the custom UCode has been loaded
- g_dsp.r[0x08] = 0xffff;
- g_dsp.r[0x09] = 0xffff;
- g_dsp.r[0x0a] = 0xffff;
- g_dsp.r[0x0b] = 0xffff;
+ // Copied from a real console after the custom UCode has been loaded.
+ // These are the indexing wrapping registers.
+ g_dsp.r[DSP_REG_WR0] = 0xffff;
+ g_dsp.r[DSP_REG_WR1] = 0xffff;
+ g_dsp.r[DSP_REG_WR2] = 0xffff;
+ g_dsp.r[DSP_REG_WR3] = 0xffff;
g_dsp.cr = 0x804;
gdsp_ifx_init();
@@ -90,9 +117,11 @@ void gdsp_init()
// in new ucodes.
WriteProtectMemory(g_dsp.iram, DSP_IRAM_BYTE_SIZE, false);
DSPAnalyzer::Analyze();
+
+ return true;
}
-void gdsp_shutdown()
+void DSPCore_Shutdown()
{
FreeMemoryPages(g_dsp.irom, DSP_IROM_BYTE_SIZE);
FreeMemoryPages(g_dsp.iram, DSP_IRAM_BYTE_SIZE);
@@ -100,71 +129,24 @@ void gdsp_shutdown()
FreeMemoryPages(g_dsp.coef, DSP_COEF_BYTE_SIZE);
}
-
-void gdsp_reset()
+void DSPCore_Reset()
{
_assert_msg_(MASTER_LOG, !g_dsp.exception_in_progress_hack, "reset while exception");
g_dsp.pc = DSP_RESET_VECTOR;
g_dsp.exception_in_progress_hack = false;
-}
-
-void gdsp_generate_exception(u8 level)
-{
- g_dsp.exceptions |= 1 << level;
+ g_dsp.r[DSP_REG_WR0] = 0xffff;
+ g_dsp.r[DSP_REG_WR1] = 0xffff;
+ g_dsp.r[DSP_REG_WR2] = 0xffff;
+ g_dsp.r[DSP_REG_WR3] = 0xffff;
}
-bool gdsp_load_irom(const char *fname)
+void DSPCore_SetException(u8 level)
{
- FILE *pFile = fopen(fname, "rb");
- if (pFile)
- {
- size_t size_in_bytes = DSP_IROM_SIZE * sizeof(u16);
- size_t read_bytes = fread(g_dsp.irom, 1, size_in_bytes, pFile);
- if (read_bytes != size_in_bytes)
- {
- PanicAlert("IROM too short : %i/%i", (int)read_bytes, (int)size_in_bytes);
- fclose(pFile);
- return false;
- }
- fclose(pFile);
-
- // Byteswap the rom.
- for (int i = 0; i < DSP_IROM_SIZE; i++)
- g_dsp.irom[i] = Common::swap16(g_dsp.irom[i]);
-
- return true;
- }
- // Always keep IROM write protected.
- WriteProtectMemory(g_dsp.irom, DSP_IROM_BYTE_SIZE, false);
- return false;
-}
-
-bool gdsp_load_coef(const char *fname)
-{
- FILE *pFile = fopen(fname, "rb");
- if (pFile)
- {
- size_t size_in_bytes = DSP_COEF_SIZE * sizeof(u16);
- size_t read_bytes = fread(g_dsp.coef, 1, size_in_bytes, pFile);
- if (read_bytes != size_in_bytes)
- {
- PanicAlert("COEF too short : %i/%i", (int)read_bytes, (int)size_in_bytes);
- fclose(pFile);
- return false;
- }
- fclose(pFile);
- // Byteswap the rom.
- for (int i = 0; i < DSP_IROM_SIZE; i++)
- g_dsp.coef[i] = Common::swap16(g_dsp.coef[i]);
- return true;
- }
- // Always keep COEF write protected. We unprotect only when DMA-ing
- WriteProtectMemory(g_dsp.coef, DSP_COEF_BYTE_SIZE, false);
- return false;
+ g_dsp.exceptions |= 1 << level;
}
-void gdsp_check_external_int()
+void DSPCore_CheckExternalInterrupt()
{
// check if there is an external interrupt
if (g_dsp.cr & CR_EXTERNAL_INT)
@@ -172,13 +154,13 @@ void gdsp_check_external_int()
if (dsp_SR_is_flag_set(FLAG_ENABLE_INTERUPT) && (g_dsp.exception_in_progress_hack == false))
{
// level 7 is the interrupt exception
- gdsp_generate_exception(7);
+ DSPCore_SetException(7);
g_dsp.cr &= ~0x0002;
}
}
}
-void gdsp_check_exceptions()
+void DSPCore_CheckExceptions()
{
// check exceptions
if ((g_dsp.exceptions != 0) && (!g_dsp.exception_in_progress_hack))
@@ -201,5 +183,3 @@ void gdsp_check_exceptions()
}
}
}
-
-//} // namespace