summaryrefslogtreecommitdiff
path: root/Source/Core/DSPCore
diff options
context:
space:
mode:
authorhrydgard <hrydgard@gmail.com>2009-04-14 22:30:31 +0000
committerhrydgard <hrydgard@gmail.com>2009-04-14 22:30:31 +0000
commitd973a9e0011acd93e2ed306aa423d0aa9b516c4a (patch)
tree4be007deef61e86fb35a69a400dad476dbe5b388 /Source/Core/DSPCore
parentf9903f2054cc94195638e077a3142a4146acfad6 (diff)
DSP: Give the assembler and disassembler saner public APIs. Fix bug in fileutil ReadFileToString. More cleanup.
git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@2970 8ced0084-cf51-0410-be5f-012b33b47a6e
Diffstat (limited to 'Source/Core/DSPCore')
-rw-r--r--Source/Core/DSPCore/Src/DSPCodeUtil.cpp56
-rw-r--r--Source/Core/DSPCore/Src/DSPTables.cpp4
-rw-r--r--Source/Core/DSPCore/Src/DSPTables.h4
-rw-r--r--Source/Core/DSPCore/Src/assemble.cpp51
-rw-r--r--Source/Core/DSPCore/Src/assemble.h18
-rw-r--r--Source/Core/DSPCore/Src/disassemble.cpp236
-rw-r--r--Source/Core/DSPCore/Src/disassemble.h22
-rw-r--r--Source/Core/DSPCore/Src/gdsp_interpreter.cpp1
-rw-r--r--Source/Core/DSPCore/Src/gdsp_interpreter.h7
9 files changed, 158 insertions, 241 deletions
diff --git a/Source/Core/DSPCore/Src/DSPCodeUtil.cpp b/Source/Core/DSPCore/Src/DSPCodeUtil.cpp
index fde2e9dcdf..9ddf2c9405 100644
--- a/Source/Core/DSPCore/Src/DSPCodeUtil.cpp
+++ b/Source/Core/DSPCore/Src/DSPCodeUtil.cpp
@@ -26,7 +26,6 @@
bool Assemble(const char *text, std::vector<u16> *code)
{
- const char *fname = "tmp.asm";
AssemblerSettings settings;
settings.pc = 0;
// settings.decode_registers = false;
@@ -34,22 +33,11 @@ bool Assemble(const char *text, std::vector<u16> *code)
settings.print_tabs = false;
settings.ext_separator = '\'';
- if (!File::WriteStringToFile(true, text, fname))
- return false;
-
// TODO: fix the terrible api of the assembler.
DSPAssembler assembler(settings);
- assembler.gd_ass_init_pass(1);
- if (!assembler.gd_ass_file(fname, 1))
- return false;
- assembler.gd_ass_init_pass(2);
- if (!assembler.gd_ass_file(fname, 2))
- return false;
+ if (!assembler.Assemble(text, code))
+ printf("%s", assembler.GetErrorString().c_str());
- code->resize(assembler.gdg_buffer_size);
- for (int i = 0; i < assembler.gdg_buffer_size; i++) {
- (*code)[i] = *(u16 *)(assembler.gdg_buffer + i * 2);
- }
return true;
}
@@ -57,34 +45,19 @@ bool Disassemble(const std::vector<u16> &code, bool line_numbers, std::string *t
{
if (code.empty())
return false;
- const char *tmp1 = "tmp1.bin";
- const char *tmp2 = "tmp.txt";
-
- // First we have to dump the code to a bin file.
- FILE *f = fopen(tmp1, "wb");
- fwrite(&code[0], 1, code.size() * 2, f);
- fclose(f);
- FILE* t = fopen(tmp2, "w");
- if (t != NULL)
- {
- AssemblerSettings settings;
-
- // These two prevent roundtripping.
- settings.show_hex = false;
- settings.show_pc = line_numbers;
- settings.ext_separator = '\'';
- settings.decode_names = false;
- settings.decode_registers = true;
+ AssemblerSettings settings;
- DSPDisassembler disasm(settings);
- bool success = disasm.gd_dis_file(tmp1, t);
- fclose(t);
+ // These two prevent roundtripping.
+ settings.show_hex = false;
+ settings.show_pc = line_numbers;
+ settings.ext_separator = '\'';
+ settings.decode_names = false;
+ settings.decode_registers = true;
- File::ReadFileToString(true, tmp2, text);
- return success;
- }
- return false;
+ DSPDisassembler disasm(settings);
+ bool success = disasm.Disassemble(0, code, text);
+ return success;
}
bool Compare(const std::vector<u16> &code1, const std::vector<u16> &code2)
@@ -92,7 +65,7 @@ bool Compare(const std::vector<u16> &code1, const std::vector<u16> &code2)
if (code1.size() != code2.size())
printf("Size difference! 1=%i 2=%i\n", (int)code1.size(), (int)code2.size());
int count_equal = 0;
- const int min_size = std::min(code1.size(), code2.size());
+ const int min_size = (int)std::min(code1.size(), code2.size());
for (int i = 0; i < min_size; i++)
{
if (code1[i] == code2[i])
@@ -150,7 +123,7 @@ void BinaryStringBEToCode(const std::string &str, std::vector<u16> *code)
code->resize(str.size() / 2);
for (int i = 0; i < code->size(); i++)
{
- (*code)[i] = (str[i * 2 + 0] << 8) | (str[i * 2 + 1]);
+ (*code)[i] = ((u16)(u8)str[i * 2 + 0] << 8) | ((u16)(u8)str[i * 2 + 1]);
}
}
@@ -159,6 +132,7 @@ bool LoadBinary(const char *filename, std::vector<u16> *code)
std::string buffer;
if (!File::ReadFileToString(false, filename, &buffer))
return false;
+
BinaryStringBEToCode(buffer, code);
return true;
}
diff --git a/Source/Core/DSPCore/Src/DSPTables.cpp b/Source/Core/DSPCore/Src/DSPTables.cpp
index 025a018bba..a1d3222906 100644
--- a/Source/Core/DSPCore/Src/DSPTables.cpp
+++ b/Source/Core/DSPCore/Src/DSPTables.cpp
@@ -352,8 +352,8 @@ const DSPOPCTemplate opcodes_ext[] =
{"XXX", 0x0000, 0x0000, nop, nop, 1, 1, {{P_VAL, 1, 0, 0, 0x00ff}}, NULL, NULL,},
};
-const u32 opcodes_size = sizeof(opcodes) / sizeof(DSPOPCTemplate);
-const u32 opcodes_ext_size = sizeof(opcodes_ext) / sizeof(DSPOPCTemplate);
+const int opcodes_size = sizeof(opcodes) / sizeof(DSPOPCTemplate);
+const int opcodes_ext_size = sizeof(opcodes_ext) / sizeof(DSPOPCTemplate);
const pdlabel_t pdlabels[] =
{
diff --git a/Source/Core/DSPCore/Src/DSPTables.h b/Source/Core/DSPCore/Src/DSPTables.h
index 650953abfd..42dae8841a 100644
--- a/Source/Core/DSPCore/Src/DSPTables.h
+++ b/Source/Core/DSPCore/Src/DSPTables.h
@@ -120,9 +120,9 @@ typedef DSPOPCTemplate opc_t;
// Opcodes
extern const DSPOPCTemplate opcodes[];
-extern const u32 opcodes_size;
+extern const int opcodes_size;
extern const DSPOPCTemplate opcodes_ext[];
-extern const u32 opcodes_ext_size;
+extern const int opcodes_ext_size;
extern u8 opSize[OPTABLE_SIZE];
extern const DSPOPCTemplate cw;
diff --git a/Source/Core/DSPCore/Src/assemble.cpp b/Source/Core/DSPCore/Src/assemble.cpp
index c7a6267a47..59ca640ee6 100644
--- a/Source/Core/DSPCore/Src/assemble.cpp
+++ b/Source/Core/DSPCore/Src/assemble.cpp
@@ -44,6 +44,7 @@ Initial import
#include <map>
#include "Common.h"
+#include "FileUtil.h"
#include "DSPInterpreter.h"
#include "DSPTables.h"
#include "disassemble.h"
@@ -80,38 +81,60 @@ DSPAssembler::DSPAssembler(const AssemblerSettings &settings)
: current_param(0),
cur_addr(0),
cur_pass(0),
- settings_(settings)
+ settings_(settings)
{
gdg_buffer = NULL;
}
-
DSPAssembler::~DSPAssembler()
{
+}
+
+bool DSPAssembler::Assemble(const char *text, std::vector<u16> *code, std::vector<int> *line_numbers)
+{
+ if (line_numbers)
+ line_numbers->clear();
+ const char *fname = "tmp.asm";
+ if (!File::WriteStringToFile(true, text, fname))
+ return false;
+ InitPass(1);
+ if (!AssembleFile(fname, 1))
+ return false;
+ InitPass(2);
+ if (!AssembleFile(fname, 2))
+ return false;
+ code->resize(gdg_buffer_size);
+ for (int i = 0; i < gdg_buffer_size; i++) {
+ (*code)[i] = *(u16 *)(gdg_buffer + i * 2);
+ }
+
+ last_error_str = "(no errors)";
+ last_error = ERR_OK;
+ return true;
}
void DSPAssembler::parse_error(err_t err_code, const char *extra_info)
{
- fprintf(stderr, "%i : %s\n", code_line, cur_line);
failed = true;
+ char error_buffer[1024];
+ char *buf_ptr = error_buffer;
+ buf_ptr += sprintf(buf_ptr, "%i : %s\n", code_line, cur_line);
if (!extra_info)
extra_info = "-";
if (fsrc)
fclose(fsrc);
else
- {
- fprintf(stderr, "ERROR: %s : %s\n", err_string[err_code], extra_info);
- }
-
- // modified by Hermes
+ buf_ptr += sprintf(buf_ptr, "ERROR: %s : %s\n", err_string[err_code], extra_info);
if (current_param == 0)
- fprintf(stderr, "ERROR: %s Line: %d : %s\n", err_string[err_code], code_line, extra_info);
+ buf_ptr += sprintf(buf_ptr, "ERROR: %s Line: %d : %s\n", err_string[err_code], code_line, extra_info);
else
- fprintf(stderr, "ERROR: %s Line: %d Param: %d : %s\n",
- err_string[err_code], code_line, current_param, extra_info);
+ buf_ptr += sprintf(buf_ptr, "ERROR: %s Line: %d Param: %d : %s\n",
+ err_string[err_code], code_line, current_param, extra_info);
+ last_error_str = error_buffer;
+ last_error = err_code;
}
char *skip_spaces(char *ptr)
@@ -692,7 +715,7 @@ void DSPAssembler::build_code(const opc_t *opc, param_t *par, u32 par_count, u16
}
}
-void DSPAssembler::gd_ass_init_pass(int pass)
+void DSPAssembler::InitPass(int pass)
{
failed = false;
if (pass == 1)
@@ -719,7 +742,7 @@ void DSPAssembler::gd_ass_init_pass(int pass)
segment_addr[SEGMENT_OVERLAY] = 0;
}
-bool DSPAssembler::gd_ass_file(const char *fname, int pass)
+bool DSPAssembler::AssembleFile(const char *fname, int pass)
{
int disable_text = 0; // modified by Hermes
@@ -892,7 +915,7 @@ bool DSPAssembler::gd_ass_file(const char *fname, int pass)
tmpstr = (char *)malloc(strlen(params[0].str) + 1);
strcpy(tmpstr, params[0].str);
}
- gd_ass_file(tmpstr, pass);
+ AssembleFile(tmpstr, pass);
free(tmpstr);
}
else
diff --git a/Source/Core/DSPCore/Src/assemble.h b/Source/Core/DSPCore/Src/assemble.h
index af3db5dca1..3d3800d343 100644
--- a/Source/Core/DSPCore/Src/assemble.h
+++ b/Source/Core/DSPCore/Src/assemble.h
@@ -67,8 +67,16 @@ public:
DSPAssembler(const AssemblerSettings &settings);
~DSPAssembler();
- void Assemble(const char *text, std::vector<u16> *code);
+ // line_numbers is optional (and not yet implemented). It'll receieve a list of ints,
+ // one for each word of code, indicating the source assembler code line number it came from.
+ // If returns false, call GetErrorString to get some text to present to the user.
+ bool Assemble(const char *text, std::vector<u16> *code, std::vector<int> *line_numbers = NULL);
+
+ std::string GetErrorString() const { return last_error_str; }
+ err_t GetError() const { return last_error; }
+
+private:
struct label_t
{
label_t(const char *lbl, s32 address) : label(lbl), addr(address) {}
@@ -90,13 +98,13 @@ public:
SEGMENT_OVERLAY,
SEGMENT_MAX
};
- void gd_ass_init_pass(int pass);
- bool gd_ass_file(const char *fname, int pass);
+
+ void InitPass(int pass);
+ bool AssembleFile(const char *fname, int pass);
char *gdg_buffer;
int gdg_buffer_size;
-private:
void parse_error(err_t err_code, const char *extra_info = NULL);
void gd_ass_register_label(const char *label, u16 lval);
void gd_ass_clear_labels();
@@ -119,6 +127,8 @@ private:
FILE *fsrc;
u32 code_line;
bool failed;
+ std::string last_error_str;
+ err_t last_error;
typedef std::map<std::string, std::string> AliasMap;
AliasMap aliases;
diff --git a/Source/Core/DSPCore/Src/disassemble.cpp b/Source/Core/DSPCore/Src/disassemble.cpp
index 32fb1d0817..8accae2ecf 100644
--- a/Source/Core/DSPCore/Src/disassemble.cpp
+++ b/Source/Core/DSPCore/Src/disassemble.cpp
@@ -27,6 +27,7 @@
#include <stdio.h>
#include <stdlib.h>
+#include "FileUtil.h"
#include "disassemble.h"
#include "DSPTables.h"
@@ -39,31 +40,81 @@ extern void nop(const UDSPInstruction& opc);
DSPDisassembler::DSPDisassembler(const AssemblerSettings &settings)
: settings_(settings)
{
- memset(unk_opcodes, 0, sizeof(unk_opcodes));
}
-char *DSPDisassembler::gd_dis_params(const DSPOPCTemplate* opc, u16 op1, u16 op2, char *strbuf)
+DSPDisassembler::~DSPDisassembler()
+{
+ // Some old code for logging unknown ops.
+ char filename[MAX_PATH];
+ sprintf(filename, "%sUnkOps.txt", FULL_DSP_DUMP_DIR);
+ FILE *uo = fopen(filename, "w");
+ if (!uo)
+ return;
+
+ int count = 0;
+ for (std::map<u16, int>::const_iterator iter = unk_opcodes.begin();
+ iter != unk_opcodes.end(); ++iter)
+ {
+ if (iter->second > 0)
+ {
+ count++;
+ fprintf(uo, "OP%04x\t%d", iter->first, iter->second);
+ for (int j = 15; j >= 0; j--) // print op bits
+ {
+ if ((j & 0x3) == 3)
+ fprintf(uo, "\tb");
+ fprintf(uo, "%d", (iter->first >> j) & 0x1);
+ }
+ fprintf(uo, "\n");
+ }
+ }
+ fprintf(uo, "Unknown opcodes count: %d\n", count);
+ fclose(uo);
+}
+
+bool DSPDisassembler::Disassemble(int start_pc, const std::vector<u16> &code, std::string *text)
+{
+ const char *tmp1 = "tmp1.bin";
+ const char *tmp2 = "tmp.txt";
+
+ // First we have to dump the code to a bin file.
+ FILE *f = fopen(tmp1, "wb");
+ fwrite(&code[0], 1, code.size() * 2, f);
+ fclose(f);
+
+ FILE* t = fopen(tmp2, "w");
+ if (!t)
+ return false;
+
+ bool success = DisFile(tmp1, t);
+ fclose(t);
+
+ File::ReadFileToString(true, tmp2, text);
+ return success;
+}
+
+char *DSPDisassembler::DisParams(const DSPOPCTemplate& opc, u16 op1, u16 op2, char *strbuf)
{
char *buf = strbuf;
- for (int j = 0; j < opc->param_count; j++)
+ for (int j = 0; j < opc.param_count; j++)
{
if (j > 0)
buf += sprintf(buf, ", ");
u32 val;
- if (opc->params[j].loc >= 1)
+ if (opc.params[j].loc >= 1)
val = op2;
else
val = op1;
- val &= opc->params[j].mask;
+ val &= opc.params[j].mask;
- if (opc->params[j].lshift < 0)
- val = val << (-opc->params[j].lshift);
+ if (opc.params[j].lshift < 0)
+ val = val << (-opc.params[j].lshift);
else
- val = val >> opc->params[j].lshift;
+ val = val >> opc.params[j].lshift;
- u32 type = opc->params[j].type;
+ u32 type = opc.params[j].type;
if ((type & 0xff) == 0x10)
type &= 0xff00;
@@ -102,9 +153,9 @@ char *DSPDisassembler::gd_dis_params(const DSPOPCTemplate* opc, u16 op1, u16 op2
break;
case P_IMM:
- if (opc->params[j].size != 2)
+ if (opc.params[j].size != 2)
{
- if (opc->params[j].mask == 0x003f) // LSL, LSR, ASL, ASR
+ if (opc.params[j].mask == 0x003f) // LSL, LSR, ASL, ASR
sprintf(buf, "#%d", (val & 0x20) ? (val | 0xFFFFFFC0) : val);
else
sprintf(buf, "#0x%02x", val);
@@ -114,7 +165,7 @@ char *DSPDisassembler::gd_dis_params(const DSPOPCTemplate* opc, u16 op1, u16 op2
break;
case P_MEM:
- if (opc->params[j].size != 2)
+ if (opc.params[j].size != 2)
val = (u16)(s8)val;
if (settings_.decode_names)
@@ -124,7 +175,7 @@ char *DSPDisassembler::gd_dis_params(const DSPOPCTemplate* opc, u16 op1, u16 op2
break;
default:
- ERROR_LOG(DSPLLE, "Unknown parameter type: %x", opc->params[j].type);
+ ERROR_LOG(DSPLLE, "Unknown parameter type: %x", opc.params[j].type);
break;
}
@@ -134,70 +185,7 @@ char *DSPDisassembler::gd_dis_params(const DSPOPCTemplate* opc, u16 op1, u16 op2
return strbuf;
}
-#if 0
-u16 gd_dis_get_opcode_size(gd_globals_t* gdg)
-{
- const DSPOPCTemplate* opc = 0;
- const DSPOPCTemplate* opc_ext = 0;
- bool extended;
-
- // Undefined memory.
- if ((gdg->pc & 0x7fff) >= 0x1000)
- return 1;
-
- u32 op1 = gdg->binbuf[gdg->pc & 0x0fff];
-
- for (u32 j = 0; j < opcodes_size; j++)
- {
- u16 mask;
-
- if (opcodes[j].size & P_EXT)
- mask = opcodes[j].opcode_mask & 0xff00;
- else
- mask = opcodes[j].opcode_mask;
-
- if ((op1 & mask) == opcodes[j].opcode)
- {
- opc = &opcodes[j];
- break;
- }
- }
-
- if (!opc)
- {
- ERROR_LOG(DSPLLE, "get_opcode_size ARGH");
- }
-
- if (opc->size & P_EXT && op1 & 0x00ff)
- extended = true;
- else
- extended = false;
-
- if (extended)
- {
- // opcode has an extension
- // find opcode
- for (u32 j = 0; j < opcodes_ext_size; j++)
- {
- if ((op1 & opcodes_ext[j].opcode_mask) == opcodes_ext[j].opcode)
- {
- opc_ext = &opcodes_ext[j];
- break;
- }
- }
- if (!opc_ext)
- {
- ERROR_LOG(DSPLLE, "get_opcode_size ext ARGH");
- }
- return opc_ext->size;
- }
-
- return opc->size & ~P_EXT;
-}
-#endif
-
-
-void DSPDisassembler::gd_dis_opcode(const u16 *binbuf, u16 *pc, std::string *dest)
+void DSPDisassembler::DisOpcode(const u16 *binbuf, u16 *pc, std::string *dest)
{
u32 op2;
char buffer[256];
@@ -297,22 +285,19 @@ void DSPDisassembler::gd_dis_opcode(const u16 *binbuf, u16 *pc, std::string *des
buf += strlen(buf);
if (opc->param_count > 0)
- gd_dis_params(opc, op1, op2, buf);
+ DisParams(*opc, op1, op2, buf);
buf += strlen(buf);
if (extended)
{
if (opc->param_count > 0)
- sprintf(buf, " ");
+ buf += sprintf(buf, " ");
- buf += strlen(buf);
-
- sprintf(buf, ": ");
- buf += strlen(buf);
+ buf += sprintf(buf, ": ");
if (opc_ext->param_count > 0)
- gd_dis_params(opc_ext, op1, op2, buf);
+ DisParams(*opc_ext, op1, op2, buf);
buf += strlen(buf);
}
@@ -332,10 +317,8 @@ void DSPDisassembler::gd_dis_opcode(const u16 *binbuf, u16 *pc, std::string *des
dest->append(buffer);
}
-bool DSPDisassembler::gd_dis_file(const char* name, FILE* output)
+bool DSPDisassembler::DisFile(const char* name, FILE* output)
{
- gd_dis_open_unkop();
-
FILE* in;
u32 size;
@@ -346,95 +329,24 @@ bool DSPDisassembler::gd_dis_file(const char* name, FILE* output)
}
fseek(in, 0, SEEK_END);
- size = (int)ftell(in);
+ size = (int)ftell(in) & ~1;
fseek(in, 0, SEEK_SET);
- u16 *binbuf = (u16*)malloc(size);
+ u16 *binbuf = new u16[size / 2];
fread(binbuf, 1, size, in);
for (u16 pc = 0; pc < (size / 2);)
{
std::string str;
- gd_dis_opcode(binbuf, &pc, &str);
+ DisOpcode(binbuf, &pc, &str);
fprintf(output, "%s\n", str.c_str());
}
fclose(in);
-
- free(binbuf);
-
- gd_dis_close_unkop();
-
+ delete [] binbuf;
return true;
}
-void DSPDisassembler::gd_dis_close_unkop()
-{
- FILE* uo;
- int i, j;
- u32 count = 0;
-
- char filename[MAX_PATH];
- sprintf(filename, "%sUnkOps.bin", FULL_DSP_DUMP_DIR);
-
- uo = fopen(filename, "wb");
-
- if (uo)
- {
- fwrite(unk_opcodes, 1, sizeof(unk_opcodes), uo);
- fclose(uo);
- }
-
- sprintf(filename, "%sUnkOps.txt", FULL_DSP_DUMP_DIR);
- uo = fopen(filename, "w");
-
- if (uo)
- {
- for (i = 0; i < 0x10000; i++)
- {
- if (unk_opcodes[i])
- {
- count++;
- fprintf(uo, "OP%04x\t%d", i, unk_opcodes[i]);
-
- for (j = 15; j >= 0; j--)
- {
- if ((j & 0x3) == 3)
- fprintf(uo, "\tb");
-
- fprintf(uo, "%d", (i >> j) & 0x1);
- }
-
- fprintf(uo, "\n");
- }
- }
-
- fprintf(uo, "Unknown opcodes count: %d\n", count);
- fclose(uo);
- }
-}
-
-void DSPDisassembler::gd_dis_open_unkop()
-{
- FILE* uo;
- char filename[MAX_PATH];
- sprintf(filename, "%sUnkOps.bin", FULL_DSP_DUMP_DIR);
- uo = fopen(filename, "rb");
-
- if (uo)
- {
- fread(unk_opcodes, 1, sizeof(unk_opcodes), uo);
- fclose(uo);
- }
- else
- {
- for (int i = 0; i < 0x10000; i++)
- {
- unk_opcodes[i] = 0;
- }
- }
-}
-
const char *gd_get_reg_name(u16 reg)
{
return regnames[reg].name;
diff --git a/Source/Core/DSPCore/Src/disassemble.h b/Source/Core/DSPCore/Src/disassemble.h
index 621983611a..610755407a 100644
--- a/Source/Core/DSPCore/Src/disassemble.h
+++ b/Source/Core/DSPCore/Src/disassemble.h
@@ -25,6 +25,9 @@
#ifndef _DSP_DISASSEMBLE_H
#define _DSP_DISASSEMBLE_H
+#include <map>
+#include <vector>
+
#include "Common.h"
#include "DSPTables.h"
@@ -55,25 +58,24 @@ class DSPDisassembler
{
public:
DSPDisassembler(const AssemblerSettings &settings);
- ~DSPDisassembler() {}
+ ~DSPDisassembler();
- // Moves PC forward and writes the result to dest.
- void gd_dis_opcode(const u16 *binbuf, u16 *pc, std::string *dest);
- bool gd_dis_file(const char* name, FILE *output);
+ bool Disassemble(int start_pc, const std::vector<u16> &code, std::string *text);
- void gd_dis_close_unkop();
- void gd_dis_open_unkop();
- const char* gd_dis_get_reg_name(u16 reg);
+ // Warning - this one is trickier to use right.
+ void DisOpcode(const u16 *binbuf, u16 *pc, std::string *dest);
private:
- char* gd_dis_params(const DSPOPCTemplate* opc, u16 op1, u16 op2, char* strbuf);
- u32 unk_opcodes[0x10000];
+ // Moves PC forward and writes the result to dest.
+ bool DisFile(const char* name, FILE *output);
+
+ char* DisParams(const DSPOPCTemplate& opc, u16 op1, u16 op2, char* strbuf);
+ std::map<u16, int> unk_opcodes;
const AssemblerSettings settings_;
};
const char *gd_get_reg_name(u16 reg);
-//u16 gd_dis_get_opcode_size(gd_globals_t* gdg);
#endif // _DSP_DISASSEMBLE_H
diff --git a/Source/Core/DSPCore/Src/gdsp_interpreter.cpp b/Source/Core/DSPCore/Src/gdsp_interpreter.cpp
index 9c5fd4136f..3e71eba2a0 100644
--- a/Source/Core/DSPCore/Src/gdsp_interpreter.cpp
+++ b/Source/Core/DSPCore/Src/gdsp_interpreter.cpp
@@ -44,6 +44,7 @@ volatile u32 gdsp_running;
static bool cr_halt = true;
static bool cr_external_int = false;
+
void UpdateCachedCR()
{
cr_halt = (g_dsp.cr & 0x4) != 0;
diff --git a/Source/Core/DSPCore/Src/gdsp_interpreter.h b/Source/Core/DSPCore/Src/gdsp_interpreter.h
index 26fd5d2844..a5d3fb9044 100644
--- a/Source/Core/DSPCore/Src/gdsp_interpreter.h
+++ b/Source/Core/DSPCore/Src/gdsp_interpreter.h
@@ -116,12 +116,7 @@ void gdsp_run_cycles(int cycles);
void gdsp_stop();
void gdsp_write_cr(u16 val);
-u16 gdsp_read_cr(void);
-
-u16* gdsp_get_iram(void);
-u16* gdsp_get_irom(void);
-u16* gdsp_get_dram(void);
-u16* gdsp_get_drom(void);
+u16 gdsp_read_cr();
// sets a flag in the pending exception register.
void gdsp_generate_exception(u8 level);