summaryrefslogtreecommitdiff
path: root/Source/Core/DSPCore/Src/LabelMap.cpp
diff options
context:
space:
mode:
authorhrydgard <hrydgard@gmail.com>2009-04-18 11:31:37 +0000
committerhrydgard <hrydgard@gmail.com>2009-04-18 11:31:37 +0000
commite7e4ef4481d1c5dcce6463414d815843ae15b8e2 (patch)
tree5d7ece211ab61b465c85e668e3018084b8724db4 /Source/Core/DSPCore/Src/LabelMap.cpp
parentc395b9359087023542fabda662ead93132fbb64e (diff)
DSP: More work on dsptool. Minor bugfixes. Add some testdata for dsptool.
git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@2993 8ced0084-cf51-0410-be5f-012b33b47a6e
Diffstat (limited to 'Source/Core/DSPCore/Src/LabelMap.cpp')
-rw-r--r--Source/Core/DSPCore/Src/LabelMap.cpp83
1 files changed, 83 insertions, 0 deletions
diff --git a/Source/Core/DSPCore/Src/LabelMap.cpp b/Source/Core/DSPCore/Src/LabelMap.cpp
new file mode 100644
index 0000000000..836fef98f9
--- /dev/null
+++ b/Source/Core/DSPCore/Src/LabelMap.cpp
@@ -0,0 +1,83 @@
+// Copyright (C) 2003-2009 Dolphin Project.
+
+// 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, version 2.0.
+
+// 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 2.0 for more details.
+
+// A copy of the GPL 2.0 should have been included with the program.
+// If not, see http://www.gnu.org/licenses/
+
+// Official SVN repository and contact information can be found at
+// http://code.google.com/p/dolphin-emu/
+
+#include "LabelMap.h"
+#include "DSPTables.h"
+
+LabelMap::LabelMap()
+{
+
+}
+
+void LabelMap::RegisterDefaults()
+{
+ for (int i = 0; i < 0x24; i++)
+ {
+ RegisterLabel(regnames[i].name, regnames[i].addr);
+ }
+ for (int i = 0; i < (int)pdlabels_size; i++)
+ {
+ RegisterLabel(pdlabels[i].name, pdlabels[i].addr);
+ }
+}
+
+void LabelMap::RegisterLabel(const char *label, u16 lval, LabelType type)
+{
+ u16 old_value;
+ if (GetLabelValue(label, &old_value) && old_value != lval)
+ {
+ printf("WARNING: Redefined label %s to %04x - old value %04x\n",
+ label, lval, old_value);
+ DeleteLabel(label);
+ }
+ labels.push_back(label_t(label, lval, type));
+}
+
+void LabelMap::DeleteLabel(const char *label)
+{
+ for (std::vector<label_t>::iterator iter = labels.begin();
+ iter != labels.end(); ++iter)
+ {
+ if (!strcmp(label, iter->name.c_str()))
+ {
+ labels.erase(iter);
+ return;
+ }
+ }
+}
+
+bool LabelMap::GetLabelValue(const char *label, u16 *value, LabelType type) const
+{
+ for (int i = 0; i < labels.size(); i++)
+ {
+ if (!strcmp(labels[i].name.c_str(), label))
+ {
+ if (type & labels[i].type) {
+ *value = labels[i].addr;
+ return true;
+ } else {
+ printf("WARNING: Wrong label type requested. %s\n", label);
+ }
+ }
+ }
+ return false;
+}
+
+void LabelMap::Clear()
+{
+ labels.clear();
+}