summaryrefslogtreecommitdiff
path: root/Source/Core/DSPCore/Src/DSPCodeUtil.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/DSPCodeUtil.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/DSPCodeUtil.cpp')
-rw-r--r--Source/Core/DSPCore/Src/DSPCodeUtil.cpp56
1 files changed, 15 insertions, 41 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;
}