#include "CInstrFactory.hpp"
#include "uint32_from_hex.hpp"
+#include "iext.hpp"
+#include "extensions/cprog.hpp"
+#include "extensions/cuart.hpp"
+
#include "SReadline/SReadline.h"
using namespace swift;
-#define RAM_END (1000)
-#define PROG_END (1000)
+#define RAM_END (0x3000)
+#define PROG_END (0x3000)
#define REG_COUNT (16)
typedef boost::function<void (const vector<string> &)> Func;
void close_prog(const std::vector<std::string> &);
CCpu* Iinstr::m_cpu;
+CCpu* Iext::m_cpu;
+disasm* Iinstr::m_disasm;
+disasm* Iext::m_disasm;
CCpu* global_cpu = NULL;
vector<CDat> breakpoints;
+
+#include <map>
+
+multimap<int,string> dataCommentsStore, progCommentsStore, dataLabelStore, progLabelStore;
+map<int,string> dataLineCommentStore, progLineCommentStore;
+
bool ignoreBreak = false;
+bool exitProg = false;
+
void doExit(const vector<string>&)
{
- exit(EXIT_SUCCESS);
+ exitProg = true;
}
unsigned int convertStringToNum(const std::string& in)
}
else {
ignoreBreak = true;
- cout << "Breakpoint 0x" << std::hex << setw(8) << setfill('0') << *breakp << std::hex << " hit" << endl;
+ cout << color(white,red) << "Breakpoint" << color(white,black) << " 0x" << std::hex << setw(8) << setfill('0') << *breakp << std::hex << " hit" << endl;
break;
}
}
}
else {
ignoreBreak = true;
- cout << "Breakpoint 0x" << std::hex << setw(8) << setfill('0') << *breakp << std::hex << " hit" << endl;
+ cout << color(white,red) << "Breakpoint" << color(white,black) << " 0x" << std::hex << setw(8) << setfill('0') << *breakp << std::hex << " hit" << endl;
return;
}
}
}
}
for(i = start*BYTE_COUNT; i <= end*BYTE_COUNT; i += BYTE_COUNT) {
+ {
+ auto range = dataLabelStore.equal_range(i);
+ for(auto iter = range.first; iter != range.second; ++iter) {
+ cout << color(yellow,black) << iter->second << ":" << color(white,black) << endl;
+ }
+ }
+ {
+ auto range = dataCommentsStore.equal_range(i);
+ for(auto iter = range.first; iter != range.second; ++iter) {
+ cout << color(blue,black) << ";" << iter->second << color(white,black) << endl;
+ }
+ }
cout << std::hex << "0x" << setw(8) << setfill('0') << i << ": 0x";
cout << std::hex << setw(8) << setfill('0') << global_cpu->getRAM(i) << " ";
cout << std::dec << setw(10) << setfill(' ') << global_cpu->getRAM(i) << " ";
- cout << std::dec << setw(10) << setfill(' ') << (int)global_cpu->getRAM(i) << endl;
+ cout << std::dec << setw(10) << setfill(' ') << (int)global_cpu->getRAM(i);
+
+ auto iter = dataLineCommentStore.find(i);
+ if(iter != dataLineCommentStore.end()) {
+ cout << color(blue,black) << " ;" << iter->second << color(white,black);
+ }
+ cout << endl;
+
}
}
for(i = start*BYTE_COUNT; i <= end*BYTE_COUNT; i += BYTE_COUNT) {
+ {
+ auto range = progLabelStore.equal_range(i);
+ for(auto iter = range.first; iter != range.second; ++iter) {
+ cout << color(yellow,black) << iter->second << ":" << color(white,black) << endl;
+ }
+ }
+ {
+ auto range = progCommentsStore.equal_range(i);
+ for(auto iter = range.first; iter != range.second; ++iter) {
+ cout << color(blue,black) << ";" << iter->second << color(white,black) << endl;
+ }
+ }
+
Iinstr* pi = global_cpu->getProg(i);
if(pi == NULL) {
- cout << std::hex << "0x" << setw(8) << setfill('0') << i << ": NOP" << endl;
+ cout << std::hex << "0x" << setw(8) << setfill('0') << i << ": NOP";
}
else {
- cout << std::hex << "0x" << setw(8) << setfill('0') << i << ": " << std::dec << pi->toString() << endl;
+ cout << std::hex << "0x" << setw(8) << setfill('0') << i << ": " << std::dec << global_cpu->colorifyInstr(pi->toString());
+ }
+ auto iter = progLineCommentStore.find(i);
+ if(iter != progLineCommentStore.end()) {
+ cout << color(blue,black) << " ;" << iter->second << color(white,black);
}
+ cout << endl;
}
}
}
}
+void getPerf(const vector<string>&)
+{
+ cout << "current perfcounter is " << std::dec << global_cpu->getPerf() << endl;
+}
+
+void resetPerf(const vector<string>&)
+{
+ cout << "reset perfcounter" << endl;
+ global_cpu->setPerf(0);
+}
+
+void applyToExtensions(const vector<string>& in)
+{
+ global_cpu->applyToExtensions(in);
+}
+
+
void printStatus(const vector<string>&)
{
CDat stackp = global_cpu->getStack();
global_cpu = &cpu;
Iinstr::setCPU(&cpu);
+ Iext::setCPU(&cpu);
+ disasm disasm(instr);
+ Iinstr::setDisasm(&disasm);
+ Iext::setDisasm(&disasm);
+
+ global_cpu->registerExtension(new Cprog());
+ global_cpu->registerExtension(new Cuart());
+
+ vector<string> commentDefer;
+ vector<string> labelDefer;
std::string str = "";
int addr = 0;
boost::char_separator<char> sep(";", "", boost::keep_empty_tokens);
boost::tokenizer<boost::char_separator<char> > tokens(str, sep);
- disasm disasm(instr);
while(getline(inFile, str)) {
int count = 0;
tokens.assign(str);
if(count == 1) {
try {
addr = lexical_cast<uint32_from_hex>(*tok_iter);
+ for(unsigned int i = 0; i < commentDefer.size(); i++) {
+ dataCommentsStore.insert(pair<int,string>(addr, commentDefer.at(i)));
+ }
+ for(unsigned int i = 0; i < labelDefer.size(); i++) {
+ dataLabelStore.insert(pair<int,string>(addr, labelDefer.at(i)));
+ }
+
+ commentDefer.clear();
+ labelDefer.clear();
}
catch(bad_lexical_cast& e) {
cerr << e.what() << endl;
exit(EXIT_FAILURE);
}
}
+ else if(count == 4) {
+ if((*tok_iter).size() > 0) {
+ dataLabelStore.insert(pair<int,string>(addr, *tok_iter));
+ }
+ }
+ else if(count == 5) {
+ if((*tok_iter).size() > 0) {
+ dataLineCommentStore.insert(pair<int,string>(addr, *tok_iter));
+ }
+ }
break;
case 1:
if(count == 1) {
try {
addr = lexical_cast<uint32_from_hex>(*tok_iter);
+ for(unsigned int i = 0; i < commentDefer.size(); i++) {
+ progCommentsStore.insert(pair<int,string>(addr, commentDefer.at(i)));
+ }
+ for(unsigned int i = 0; i < labelDefer.size(); i++) {
+ progLabelStore.insert(pair<int,string>(addr, labelDefer.at(i)));
+ }
+
+ commentDefer.clear();
+ labelDefer.clear();
}
catch(bad_lexical_cast& e) {
cerr << e.what() << endl;
Iinstr *pi = disasm.decode(*tok_iter);
cpu.setProg(addr, pi);
}
+ else if(count == 4) {
+ if((*tok_iter).size() > 0) {
+ progLabelStore.insert(pair<int,string>(addr, *tok_iter));
+ }
+ }
+ else if(count == 5) {
+ if((*tok_iter).size() > 0) {
+ progLineCommentStore.insert(pair<int,string>(addr, *tok_iter));
+ }
+ }
+
break;
case 2:
+ if((*tok_iter).size() > 0) {
+ commentDefer.push_back(*tok_iter);
+ }
+ break;
case 3:
- cerr << "ignoring labels and comments for now" << endl;
+ if((*tok_iter).size() > 0) {
+ labelDefer.push_back(*tok_iter);
+ }
break;
default:
cerr << "i was to lazy to implement the other format types for now" << endl;
cout << i << " : " << std::hex << i << std::dec << " " << data << endl;
}
*/
- cpu.setRegister(1, 4);
+/* cpu.setRegister(1, 4);
cpu.setRegister(2, 0);
cpu.setRAM(0,5);
cpu.setRAM(4,0x66334455);
cpu.setRAM(8,32);
cpu.setRAM(12,45);
-
+*/
// following: job of the bootloader
//set stackpointer
cpu.setStack(500);
Completers.push_back(CompleterElement("setreg [s] [num]",&setReg, "Sets Register s to num."));
Completers.push_back(CompleterElement("setdata [s] [num]",&setRam, "Sets RAM-Addr s to num."));
Completers.push_back(CompleterElement("status",&printStatus, "Prints status of CPU."));
-
+ Completers.push_back(CompleterElement("getperf",&getPerf, "Prints performance counter."));
+ Completers.push_back(CompleterElement("resetperf",&resetPerf, "Resets performance counter to 0."));
+ Completers.push_back(CompleterElement("extension",&applyToExtensions, "Write to extensions."));
Reader.RegisterCompletions(Completers);
string UserInput;
Func lastFunc = NULL;
- while(1) {
+ while(!exitProg) {
UserInput = Reader.GetLine("> ", Tokens, EndOfInput);
if(EndOfInput) {
break;