summaryrefslogtreecommitdiff
path: root/Source/Core/DSPCore/Src/assemble.cpp
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/Src/assemble.cpp
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/Src/assemble.cpp')
-rw-r--r--Source/Core/DSPCore/Src/assemble.cpp51
1 files changed, 37 insertions, 14 deletions
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