From 2352cf0fed03f29a0ed6a180f1dae68beb0f016c Mon Sep 17 00:00:00 2001 From: hrydgard Date: Fri, 1 May 2009 20:06:24 +0000 Subject: [PATCH] DSPLLE: Enable the SET40 sign extension stuff. Try to separate the "core" from the "interpreter" logically, a little bit. It's still a bit of a fuzzy border. git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@3128 8ced0084-cf51-0410-be5f-012b33b47a6e --- Source/Core/DSPCore/DSPCore.vcproj | 8 + Source/Core/DSPCore/Src/DSPCore.cpp | 205 ++++++++++++++++++ Source/Core/DSPCore/Src/DSPCore.h | 101 +++++++++ Source/Core/DSPCore/Src/SConscript | 2 +- Source/Core/DSPCore/Src/gdsp_aram.cpp | 1 + .../Core/DSPCore/Src/gdsp_condition_codes.cpp | 1 + Source/Core/DSPCore/Src/gdsp_ext_op.cpp | 2 + Source/Core/DSPCore/Src/gdsp_interface.cpp | 2 +- Source/Core/DSPCore/Src/gdsp_interpreter.cpp | 199 +---------------- Source/Core/DSPCore/Src/gdsp_interpreter.h | 66 +----- Source/Core/DSPCore/Src/gdsp_memory.cpp | 2 + Source/Core/DSPCore/Src/gdsp_memory.h | 1 + Source/Core/DSPCore/Src/gdsp_opcodes_helper.h | 39 +--- Source/Core/DSPCore/Src/gdsp_registers.cpp | 5 +- Source/Core/DSPCore/Src/gdsp_registers.h | 6 +- Source/Plugins/Plugin_DSP_LLE/Src/Globals.cpp | 2 +- Source/Plugins/Plugin_DSP_LLE/Src/Tools.cpp | 1 + Source/Plugins/Plugin_DSP_LLE/Src/main.cpp | 13 +- 18 files changed, 363 insertions(+), 293 deletions(-) create mode 100644 Source/Core/DSPCore/Src/DSPCore.cpp create mode 100644 Source/Core/DSPCore/Src/DSPCore.h diff --git a/Source/Core/DSPCore/DSPCore.vcproj b/Source/Core/DSPCore/DSPCore.vcproj index f7a0fc90f6..73ae94b8c6 100644 --- a/Source/Core/DSPCore/DSPCore.vcproj +++ b/Source/Core/DSPCore/DSPCore.vcproj @@ -434,6 +434,14 @@ RelativePath=".\Src\DSPCodeUtil.h" > + + + + diff --git a/Source/Core/DSPCore/Src/DSPCore.cpp b/Source/Core/DSPCore/Src/DSPCore.cpp new file mode 100644 index 0000000000..270952f8ed --- /dev/null +++ b/Source/Core/DSPCore/Src/DSPCore.cpp @@ -0,0 +1,205 @@ +/*==================================================================== + + filename: gdsp_interpreter.cpp + project: GCemu + created: 2004-6-18 + mail: duddie@walla.com + + Copyright (c) 2005 Duddie & Tratax + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version 2 + of the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + + ====================================================================*/ + +#include "Common.h" +#include "DSPCore.h" +#include "DSPAnalyzer.h" +#include "MemoryUtil.h" + +#include "gdsp_interface.h" +#include "gdsp_registers.h" +#include "gdsp_opcodes_helper.h" + +//namespace DSPCore +//{ + +SDSP g_dsp; + + +//------------------------------------------------------------------------------- + +void gdsp_init() +{ + 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); + g_dsp.coef = (u16*)AllocateMemoryPages(DSP_COEF_BYTE_SIZE); + + // Fill roms with zeros. + memset(g_dsp.irom, 0, DSP_IROM_BYTE_SIZE); + memset(g_dsp.coef, 0, DSP_COEF_BYTE_SIZE); + + for (int i = 0; i < 32; i++) + { + g_dsp.r[i] = 0; + } + + for (int i = 0; i < 4; i++) + { + g_dsp.reg_stack_ptr[i] = 0; + for (int j = 0; j < DSP_STACK_DEPTH; j++) + { + g_dsp.reg_stack[i][j] = 0; + } + } + + // Fill IRAM with HALT opcodes. + for (int i = 0; i < DSP_IRAM_SIZE; i++) + { + g_dsp.iram[i] = 0x0021; // HALT opcode + } + + // Just zero out DRAM. + for (int i = 0; i < DSP_DRAM_SIZE; i++) + { + g_dsp.dram[i] = 0x2100; + } + + // 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; + + g_dsp.cr = 0x804; + gdsp_ifx_init(); + + // Mostly keep IRAM write protected. We unprotect only when DMA-ing + // in new ucodes. + WriteProtectMemory(g_dsp.iram, DSP_IRAM_BYTE_SIZE, false); + DSPAnalyzer::Analyze(); +} + +void gdsp_shutdown() +{ + FreeMemoryPages(g_dsp.irom, DSP_IROM_BYTE_SIZE); + FreeMemoryPages(g_dsp.iram, DSP_IRAM_BYTE_SIZE); + FreeMemoryPages(g_dsp.dram, DSP_DRAM_BYTE_SIZE); + FreeMemoryPages(g_dsp.coef, DSP_COEF_BYTE_SIZE); +} + + +void gdsp_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; +} + +bool gdsp_load_irom(const char *fname) +{ + 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; +} + +void gdsp_check_external_int() +{ + // check if there is an external interrupt + if (g_dsp.cr & CR_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); + g_dsp.cr &= ~0x0002; + } + } +} + +void gdsp_check_exceptions() +{ + // check exceptions + if ((g_dsp.exceptions != 0) && (!g_dsp.exception_in_progress_hack)) + { + for (int i = 0; i < 8; i++) + { + if (g_dsp.exceptions & (1 << i)) + { + _assert_msg_(MASTER_LOG, !g_dsp.exception_in_progress_hack, "assert while exception"); + + 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.exceptions &= ~(1 << i); + + g_dsp.exception_in_progress_hack = true; + break; + } + } + } +} + +//} // namespace \ No newline at end of file diff --git a/Source/Core/DSPCore/Src/DSPCore.h b/Source/Core/DSPCore/Src/DSPCore.h new file mode 100644 index 0000000000..fa0232929b --- /dev/null +++ b/Source/Core/DSPCore/Src/DSPCore.h @@ -0,0 +1,101 @@ +/*==================================================================== + + filename: DSPCore.h + project: GCemu + created: 2004-6-18 + mail: duddie@walla.com + + Copyright (c) 2005 Duddie & Tratax + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version 2 + of the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + + ====================================================================*/ + +#ifndef _DSPCORE_H +#define _DSPCORE_H + +//namespace DSPCore +//{ + +#define DSP_IRAM_BYTE_SIZE 0x2000 +#define DSP_IRAM_SIZE 0x1000 +#define DSP_IRAM_MASK 0x0fff + +#define DSP_IROM_BYTE_SIZE 0x2000 +#define DSP_IROM_SIZE 0x1000 +#define DSP_IROM_MASK 0x0fff + +#define DSP_DRAM_BYTE_SIZE 0x2000 +#define DSP_DRAM_SIZE 0x1000 +#define DSP_DRAM_MASK 0x0fff + +#define DSP_COEF_BYTE_SIZE 0x2000 +#define DSP_COEF_SIZE 0x1000 +#define DSP_COEF_MASK 0x0fff + +#define DSP_RESET_VECTOR 0x8000 + +#define DSP_STACK_DEPTH 0x20 +#define DSP_STACK_MASK 0x1f + +#define DSP_CR_IMEM 2 +#define DSP_CR_DMEM 0 +#define DSP_CR_TO_CPU 1 +#define DSP_CR_FROM_CPU 0 + +struct SDSP +{ + u16 r[32]; + u16 pc; +#if PROFILE + u16 err_pc; +#endif + u16 *iram; + u16 *dram; + u16 *irom; + u16 *coef; + u8 *cpu_ram; + u16 cr; + u8 reg_stack_ptr[4]; + u8 exceptions; // pending exceptions? + bool exception_in_progress_hack; // is this the same as "exception enabled"? + + // lets make stack depth to 32 for now + u16 reg_stack[4][DSP_STACK_DEPTH]; + void (*irq_request)(void); + + // for debugger only + u32 iram_crc; + u64 step_counter; +}; + +extern SDSP g_dsp; + +void gdsp_init(); +void gdsp_reset(); +void gdsp_shutdown(); + +bool gdsp_load_irom(const char *filename); +bool gdsp_load_coef(const char *filename); + +void gdsp_check_external_int(); +void gdsp_check_exceptions(); + +// sets a flag in the pending exception register. +void gdsp_generate_exception(u8 level); + +//} // namespace + +#endif // _DSPCORE_H diff --git a/Source/Core/DSPCore/Src/SConscript b/Source/Core/DSPCore/Src/SConscript index 19ca950856..6f577930b0 100644 --- a/Source/Core/DSPCore/Src/SConscript +++ b/Source/Core/DSPCore/Src/SConscript @@ -17,7 +17,7 @@ files = [ "DSPJit.cpp", "DSPCodeUtil.cpp", "LabelMap.cpp", - # "DSPHost.cpp", + "DSPCore.cpp", "DSPTables.cpp", ] diff --git a/Source/Core/DSPCore/Src/gdsp_aram.cpp b/Source/Core/DSPCore/Src/gdsp_aram.cpp index b3cb15d67e..1c6955e98b 100644 --- a/Source/Core/DSPCore/Src/gdsp_aram.cpp +++ b/Source/Core/DSPCore/Src/gdsp_aram.cpp @@ -16,6 +16,7 @@ // http://code.google.com/p/dolphin-emu/ #include "Common.h" +#include "DSPCore.h" #include "DSPHost.h" #include "gdsp_interface.h" #include "gdsp_interpreter.h" diff --git a/Source/Core/DSPCore/Src/gdsp_condition_codes.cpp b/Source/Core/DSPCore/Src/gdsp_condition_codes.cpp index 0db30bbfb3..a4f3767a62 100644 --- a/Source/Core/DSPCore/Src/gdsp_condition_codes.cpp +++ b/Source/Core/DSPCore/Src/gdsp_condition_codes.cpp @@ -22,6 +22,7 @@ #include "gdsp_condition_codes.h" #include "gdsp_interpreter.h" +#include "DSPCore.h" #include "DSPInterpreter.h" namespace DSPInterpreter { diff --git a/Source/Core/DSPCore/Src/gdsp_ext_op.cpp b/Source/Core/DSPCore/Src/gdsp_ext_op.cpp index 554d5a391b..4d0bde0ed2 100644 --- a/Source/Core/DSPCore/Src/gdsp_ext_op.cpp +++ b/Source/Core/DSPCore/Src/gdsp_ext_op.cpp @@ -24,6 +24,7 @@ ====================================================================*/ #include "gdsp_opcodes_helper.h" +#include "gdsp_memory.h" // Extended opcodes do not exist on their own. These opcodes can only be // attached to opcodes that allow extending (8 lower bits of opcode not used by @@ -41,6 +42,7 @@ namespace DSPInterpreter { + namespace Ext { diff --git a/Source/Core/DSPCore/Src/gdsp_interface.cpp b/Source/Core/DSPCore/Src/gdsp_interface.cpp index f5e864bcfa..225815c80f 100644 --- a/Source/Core/DSPCore/Src/gdsp_interface.cpp +++ b/Source/Core/DSPCore/Src/gdsp_interface.cpp @@ -28,6 +28,7 @@ #include "Thread.h" #include "MemoryUtil.h" +#include "DSPCore.h" #include "DSPHost.h" #include "DSPAnalyzer.h" #include "gdsp_aram.h" @@ -68,7 +69,6 @@ u32 gdsp_mbox_peek(u8 mbx) return value; } - void gdsp_mbox_write_h(u8 mbx, u16 val) { if (DSPHost_OnThread()) diff --git a/Source/Core/DSPCore/Src/gdsp_interpreter.cpp b/Source/Core/DSPCore/Src/gdsp_interpreter.cpp index 6dcfa019c9..ea816486dc 100644 --- a/Source/Core/DSPCore/Src/gdsp_interpreter.cpp +++ b/Source/Core/DSPCore/Src/gdsp_interpreter.cpp @@ -27,158 +27,17 @@ #include #include "DSPTables.h" -#include "DSPAnalyzer.h" #include "DSPHost.h" +#include "DSPCore.h" +#include "DSPAnalyzer.h" #include "gdsp_interface.h" #include "gdsp_opcodes_helper.h" -// #include "Tools.h" -#include "MemoryUtil.h" -//------------------------------------------------------------------------------- - -SDSP g_dsp; +namespace DSPInterpreter { volatile u32 gdsp_running; -static bool cr_halt = true; -static bool cr_external_int = false; - - -void UpdateCachedCR() -{ - cr_halt = (g_dsp.cr & 0x4) != 0; - cr_external_int = (g_dsp.cr & 0x02) != 0; -} - -//------------------------------------------------------------------------------- - -void gdsp_init() -{ - 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); - g_dsp.coef = (u16*)AllocateMemoryPages(DSP_COEF_BYTE_SIZE); - - // Fill roms with zeros. - memset(g_dsp.irom, 0, DSP_IROM_BYTE_SIZE); - memset(g_dsp.coef, 0, DSP_COEF_BYTE_SIZE); - - for (int i = 0; i < 32; i++) - { - g_dsp.r[i] = 0; - } - - for (int i = 0; i < 4; i++) - { - g_dsp.reg_stack_ptr[i] = 0; - - for (int j = 0; j < DSP_STACK_DEPTH; j++) - { - g_dsp.reg_stack[i][j] = 0; - } - } - - // Fill IRAM with HALT opcodes. - for (int i = 0; i < DSP_IRAM_SIZE; i++) - { - g_dsp.iram[i] = 0x0021; // HALT opcode - } - - // Just zero out DRAM. - for (int i = 0; i < DSP_DRAM_SIZE; i++) - { - g_dsp.dram[i] = 0x2100; - } - - // 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; - - g_dsp.cr = 0x804; - gdsp_ifx_init(); - - UpdateCachedCR(); - - // Mostly keep IRAM write protected. We unprotect only when DMA-ing - // in new ucodes. - WriteProtectMemory(g_dsp.iram, DSP_IRAM_BYTE_SIZE, false); - DSPAnalyzer::Analyze(); -} - -void gdsp_shutdown() -{ - FreeMemoryPages(g_dsp.irom, DSP_IROM_BYTE_SIZE); - FreeMemoryPages(g_dsp.iram, DSP_IRAM_BYTE_SIZE); - FreeMemoryPages(g_dsp.dram, DSP_DRAM_BYTE_SIZE); - FreeMemoryPages(g_dsp.coef, DSP_COEF_BYTE_SIZE); -} - - -void gdsp_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; -} - -bool gdsp_load_irom(const char *fname) -{ - 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; -} // Hm, should instructions that change CR use this? Probably not (but they // should call UpdateCachedCR()) @@ -194,8 +53,6 @@ void gdsp_write_cr(u16 val) // update cr g_dsp.cr = val; - - UpdateCachedCR(); } @@ -211,49 +68,9 @@ u16 gdsp_read_cr() g_dsp.cr &= ~0x800; } - UpdateCachedCR(); - return g_dsp.cr; } -void gdsp_check_external_int() -{ - // check if there is an external interrupt - if (cr_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); - g_dsp.cr &= ~0x0002; - UpdateCachedCR(); - } - } -} - -void gdsp_check_exceptions() -{ - // check exceptions - if ((g_dsp.exceptions != 0) && (!g_dsp.exception_in_progress_hack)) - { - for (int i = 0; i < 8; i++) - { - if (g_dsp.exceptions & (1 << i)) - { - _assert_msg_(MASTER_LOG, !g_dsp.exception_in_progress_hack, "assert while exception"); - - 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.exceptions &= ~(1 << i); - - g_dsp.exception_in_progress_hack = true; - break; - } - } - } -} void gdsp_handle_loop() { @@ -313,7 +130,7 @@ void gdsp_step() void gdsp_run() { gdsp_running = true; - while (!cr_halt) + while (!(g_dsp.cr & CR_HALT)) { // Are we running? if (DSPHost_Running()) @@ -321,7 +138,7 @@ void gdsp_run() gdsp_check_external_int(); // This number (500) is completely arbitrary. TODO: tweak. - for (int i = 0; i < 500 && !cr_halt; i++) + for (int i = 0; i < 500 && !(g_dsp.cr & CR_HALT); i++) gdsp_step(); if (!gdsp_running) @@ -338,7 +155,7 @@ void gdsp_run_cycles(int cycles) // 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 (cr_halt) + if (g_dsp.cr & CR_HALT) return; gdsp_step(); cycles--; @@ -347,7 +164,7 @@ void gdsp_run_cycles(int cycles) // Next, let's run a few cycles with idle skipping, so that we can skip loops. for (int i = 0; i < 8; i++) { - if (cr_halt) + if (g_dsp.cr & CR_HALT) return; if (DSPAnalyzer::code_flags[g_dsp.pc] & DSPAnalyzer::CODE_IDLE_SKIP) return; @@ -370,3 +187,5 @@ void gdsp_stop() { gdsp_running = false; } + +} // namespace \ No newline at end of file diff --git a/Source/Core/DSPCore/Src/gdsp_interpreter.h b/Source/Core/DSPCore/Src/gdsp_interpreter.h index a5d3fb9044..06869b4004 100644 --- a/Source/Core/DSPCore/Src/gdsp_interpreter.h +++ b/Source/Core/DSPCore/Src/gdsp_interpreter.h @@ -45,68 +45,7 @@ #include "Common.h" -#define DSP_IRAM_BYTE_SIZE 0x2000 -#define DSP_IRAM_SIZE 0x1000 -#define DSP_IRAM_MASK 0x0fff - -#define DSP_IROM_BYTE_SIZE 0x2000 -#define DSP_IROM_SIZE 0x1000 -#define DSP_IROM_MASK 0x0fff - -#define DSP_DRAM_BYTE_SIZE 0x2000 -#define DSP_DRAM_SIZE 0x1000 -#define DSP_DRAM_MASK 0x0fff - -#define DSP_COEF_BYTE_SIZE 0x2000 -#define DSP_COEF_SIZE 0x1000 -#define DSP_COEF_MASK 0x0fff - -#define DSP_RESET_VECTOR 0x8000 - -#define DSP_STACK_DEPTH 0x20 -#define DSP_STACK_MASK 0x1f - -#define DSP_CR_IMEM 2 -#define DSP_CR_DMEM 0 -#define DSP_CR_TO_CPU 1 -#define DSP_CR_FROM_CPU 0 - -struct SDSP -{ - u16 r[32]; - u16 pc; -#if PROFILE - u16 err_pc; -#endif - u16* iram; - u16* dram; - u16* irom; - u16* coef; - u8* cpu_ram; - u16 cr; - u8 reg_stack_ptr[4]; - u8 exceptions; // pending exceptions? - bool exception_in_progress_hack; // is this the same as "exception enabled"? - - // lets make stack depth to 32 for now - u16 reg_stack[4][DSP_STACK_DEPTH]; - void (* irq_request)(void); - - // for debugger only - u32 iram_crc; - u64 step_counter; -}; - -extern SDSP g_dsp; - - -void gdsp_init(); -void gdsp_reset(); -void gdsp_shutdown(); - -bool gdsp_load_irom(const char *fname); -bool gdsp_load_coef(const char *fname); - +namespace DSPInterpreter { // steps through DSP code, returns false if error occured void gdsp_step(); @@ -118,7 +57,6 @@ void gdsp_stop(); void gdsp_write_cr(u16 val); u16 gdsp_read_cr(); -// sets a flag in the pending exception register. -void gdsp_generate_exception(u8 level); +} // namespace #endif diff --git a/Source/Core/DSPCore/Src/gdsp_memory.cpp b/Source/Core/DSPCore/Src/gdsp_memory.cpp index ef2b3beefb..46ca4a98d5 100644 --- a/Source/Core/DSPCore/Src/gdsp_memory.cpp +++ b/Source/Core/DSPCore/Src/gdsp_memory.cpp @@ -29,6 +29,8 @@ #include "gdsp_memory.h" #include "gdsp_interface.h" +#include "DSPCore.h" + u16 dsp_imem_read(u16 addr) { switch (addr >> 12) diff --git a/Source/Core/DSPCore/Src/gdsp_memory.h b/Source/Core/DSPCore/Src/gdsp_memory.h index 2318eb4c58..21a2d648f0 100644 --- a/Source/Core/DSPCore/Src/gdsp_memory.h +++ b/Source/Core/DSPCore/Src/gdsp_memory.h @@ -27,6 +27,7 @@ #include "Common.h" #include "gdsp_interpreter.h" +#include "DSPCore.h" u16 dsp_imem_read(u16 addr); void dsp_dmem_write(u16 addr, u16 val); diff --git a/Source/Core/DSPCore/Src/gdsp_opcodes_helper.h b/Source/Core/DSPCore/Src/gdsp_opcodes_helper.h index e1bbc236ed..a53902be17 100644 --- a/Source/Core/DSPCore/Src/gdsp_opcodes_helper.h +++ b/Source/Core/DSPCore/Src/gdsp_opcodes_helper.h @@ -29,18 +29,17 @@ #include "Common.h" #include "DSPInterpreter.h" +#include "DSPCore.h" #include "gdsp_memory.h" #include "gdsp_interpreter.h" #include "gdsp_registers.h" #include "gdsp_ext_op.h" -// --------------------------------------------------------------------------------------- -// -// --- SR -// -// --------------------------------------------------------------------------------------- +// --------------------------------------------------------------------------------------- +// --- SR +// --------------------------------------------------------------------------------------- inline void dsp_SR_set_flag(int flag) { g_dsp.r[DSP_REG_SR] |= (1 << flag); @@ -51,45 +50,34 @@ inline bool dsp_SR_is_flag_set(int flag) return (g_dsp.r[DSP_REG_SR] & (1 << flag)) != 0; } - // --------------------------------------------------------------------------------------- -// // --- reg -// // --------------------------------------------------------------------------------------- inline u16 dsp_op_read_reg(u8 reg) { - u16 val; - switch (reg & 0x1f) { case 0x0c: case 0x0d: case 0x0e: case 0x0f: - - val = dsp_reg_load_stack(reg - 0x0c); - break; - + return dsp_reg_load_stack(reg - 0x0c); default: - val = g_dsp.r[reg]; - break; + return g_dsp.r[reg]; } - - return val; } - inline void dsp_op_write_reg(u8 reg, u16 val) { switch (reg & 0x1f) { - /* + // 8-bit sign extended registers. Should look at prod.h too... case DSP_REG_ACH0: case DSP_REG_ACH1: // sign extend from the bottom 8 bits. g_dsp.r[reg] = (u16)(s16)(s8)(u8)val; break; -*/ + + // Stack registers. case 0x0c: case 0x0d: case 0x0e: @@ -105,7 +93,6 @@ inline void dsp_op_write_reg(u8 reg, u16 val) inline void dsp_conditional_extend_accum(u8 reg) { -#if 0 switch (reg) { case DSP_REG_ACM0: @@ -118,7 +105,6 @@ inline void dsp_conditional_extend_accum(u8 reg) g_dsp.r[reg - DSP_REG_ACM0 + DSP_REG_ACL0] = 0; } } -#endif } @@ -166,7 +152,7 @@ inline void dsp_set_long_prod(s64 val) } // --------------------------------------------------------------------------------------- -// --- acc +// --- ACC - main accumulators (40-bit) // --------------------------------------------------------------------------------------- inline s64 dsp_get_long_acc(int reg) @@ -218,12 +204,9 @@ inline s16 dsp_get_acc_h(int _reg) // --------------------------------------------------------------------------------------- -// -// --- acx -// +// --- AX - extra accumulators (32-bit) // --------------------------------------------------------------------------------------- - inline s64 dsp_get_long_acx(int _reg) { #if PROFILE diff --git a/Source/Core/DSPCore/Src/gdsp_registers.cpp b/Source/Core/DSPCore/Src/gdsp_registers.cpp index f0bec2b5f9..ed6cef1685 100644 --- a/Source/Core/DSPCore/Src/gdsp_registers.cpp +++ b/Source/Core/DSPCore/Src/gdsp_registers.cpp @@ -24,6 +24,9 @@ ====================================================================*/ #include "Common.h" + +#include "DSPCore.h" + #include "gdsp_registers.h" #include "gdsp_interpreter.h" @@ -54,4 +57,4 @@ u16 dsp_reg_load_stack(u8 stack_reg) u16 val = g_dsp.r[DSP_REG_ST0 + stack_reg]; dsp_reg_stack_pop(stack_reg); return val; -} +} \ No newline at end of file diff --git a/Source/Core/DSPCore/Src/gdsp_registers.h b/Source/Core/DSPCore/Src/gdsp_registers.h index 473f5993b8..8b60e02183 100644 --- a/Source/Core/DSPCore/Src/gdsp_registers.h +++ b/Source/Core/DSPCore/Src/gdsp_registers.h @@ -85,7 +85,6 @@ #define DSP_REG_CMBH 0xfffe // CPU Mailbox H #define DSP_REG_CMBL 0xffff // CPU Mailbox L - #define DMA_TO_DSP 0 #define DMA_TO_CPU 1 @@ -93,6 +92,11 @@ #define DSP_STACK_C 0 #define DSP_STACK_D 1 + +// CR bits +#define CR_HALT 0x0004 +#define CR_EXTERNAL_INT 0x0002 + // SR bits #define SR_CARRY 0x0001 #define SR_2 0x0002 // overflow??? diff --git a/Source/Plugins/Plugin_DSP_LLE/Src/Globals.cpp b/Source/Plugins/Plugin_DSP_LLE/Src/Globals.cpp index c1b4ea09ad..377386af15 100644 --- a/Source/Plugins/Plugin_DSP_LLE/Src/Globals.cpp +++ b/Source/Plugins/Plugin_DSP_LLE/Src/Globals.cpp @@ -20,8 +20,8 @@ #include #include "Common.h" // for Common::swap +#include "DSPCore.h" #include "Globals.h" -#include "gdsp_interpreter.h" // ======================================================================================= // For PB address detection diff --git a/Source/Plugins/Plugin_DSP_LLE/Src/Tools.cpp b/Source/Plugins/Plugin_DSP_LLE/Src/Tools.cpp index c05a5306d5..adefc11e41 100644 --- a/Source/Plugins/Plugin_DSP_LLE/Src/Tools.cpp +++ b/Source/Plugins/Plugin_DSP_LLE/Src/Tools.cpp @@ -22,6 +22,7 @@ #include "Globals.h" #include "FileUtil.h" +#include "DSPCore.h" #include "DSPCodeUtil.h" #include "Tools.h" #include "disassemble.h" diff --git a/Source/Plugins/Plugin_DSP_LLE/Src/main.cpp b/Source/Plugins/Plugin_DSP_LLE/Src/main.cpp index d96676abb4..e7de70632e 100644 --- a/Source/Plugins/Plugin_DSP_LLE/Src/main.cpp +++ b/Source/Plugins/Plugin_DSP_LLE/Src/main.cpp @@ -33,6 +33,7 @@ #include "ChunkFile.h" #include "DSPTables.h" +#include "DSPCore.h" #if defined(HAVE_WX) && HAVE_WX #include "DSPConfigDlgLLE.h" @@ -178,7 +179,7 @@ THREAD_RETURN dsp_thread(void* lpParameter) { while (bIsRunning) { - gdsp_run(); + DSPInterpreter::gdsp_run(); } return 0; } @@ -248,7 +249,7 @@ void Initialize(void *init) void DSP_StopSoundStream() { - gdsp_stop(); + DSPInterpreter::gdsp_stop(); bIsRunning = false; if (g_dspInitialize.bOnThread) { @@ -265,13 +266,13 @@ void Shutdown() u16 DSP_WriteControlRegister(u16 _uFlag) { - gdsp_write_cr(_uFlag); - return gdsp_read_cr(); + DSPInterpreter::gdsp_write_cr(_uFlag); + return DSPInterpreter::gdsp_read_cr(); } u16 DSP_ReadControlRegister() { - return gdsp_read_cr(); + return DSPInterpreter::gdsp_read_cr(); } u16 DSP_ReadMailboxHigh(bool _CPUMailbox) @@ -342,7 +343,7 @@ void DSP_Update(int cycles) // If we're not on a thread, run cycles here. if (!g_dspInitialize.bOnThread) { - gdsp_run_cycles(cycles); + DSPInterpreter::gdsp_run_cycles(cycles); } }