X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=3b_sim%2Fsim.cpp;h=2102c5a98682f31394273b8f5aea65cea1f492e8;hb=9d614879c7ca259c7d0150e87d27e88416c11777;hp=0a6f14613ba573f1dc38391044b013e89644e475;hpb=65bff8f91cfc8dcb8df6b220126c81c17d14ef56;p=calu.git diff --git a/3b_sim/sim.cpp b/3b_sim/sim.cpp index 0a6f146..2102c5a 100644 --- a/3b_sim/sim.cpp +++ b/3b_sim/sim.cpp @@ -20,8 +20,8 @@ #include "SReadline/SReadline.h" using namespace swift; -#define RAM_END (1000) -#define PROG_END (1000) +#define RAM_END (0x1000) +#define PROG_END (0x1000) #define REG_COUNT (16) typedef boost::function &)> Func; @@ -60,7 +60,7 @@ class CHelpExec { cout << "Available commands: " << endl; for(auto iter = m_completers.begin(); iter != m_completers.end(); ++iter) { - cout << setw(15) << (*iter).get<0>() << ": " << (*iter).get<2>() << endl; + cout << setw(19) << setfill(' ') << (*iter).get<0>() << ": " << (*iter).get<2>() << endl; } } }; @@ -68,6 +68,7 @@ class CHelpExec void close_prog(const std::vector &); CCpu* Iinstr::m_cpu; +disasm* Iinstr::m_disasm; CCpu* global_cpu = NULL; @@ -75,9 +76,11 @@ vector breakpoints; bool ignoreBreak = false; +bool exitProg = false; + void doExit(const vector&) { - exit(EXIT_SUCCESS); + exitProg = true; } unsigned int convertStringToNum(const std::string& in) @@ -198,7 +201,35 @@ void printReg(const vector& in) } for(i = start; i <= end; i++) { - cout << setw(2) << setfill('0') << i << ": 0x" << std::hex << setw(8) << setfill('0') << global_cpu->getRegister(i) << " " << std::dec << setw(10) << setfill(' ') << global_cpu->getRegister(i) << endl; + cout << setw(2) << setfill('0') << i << ": 0x"; + cout << std::hex << setw(8) << setfill('0') << global_cpu->getRegister(i) << " "; + cout << std::dec << setw(10) << setfill(' ') << global_cpu->getRegister(i) << " "; + cout << std::dec << setw(10) << setfill(' ') << (int)global_cpu->getRegister(i) << endl; + } +} + +void setReg(const vector& in) +{ + int reg = 0; + CDat val = 0; + + if(in.size() >= 3) { + try { + reg = convertStringToNum(in[1]); + if(reg < 0 || reg > (REG_COUNT-1)) { + cerr << "register is out of range" << endl; + return; + } + + val = convertStringToNum(in[2]); + + cout << "Setting register " << reg << " to 0x" << std::hex << setw(8) << setfill('0') << val << std::dec << endl; + global_cpu->setRegister(reg,val); + } + catch(bad_cast&) { + cerr << "given parameter is not a number" << endl; + return; + } } } @@ -245,10 +276,41 @@ void printRAM(const vector& in) } } for(i = start*BYTE_COUNT; i <= end*BYTE_COUNT; i += BYTE_COUNT) { - cout << std::hex << "0x" << setw(8) << setfill('0') << i << ": 0x" << std::hex << setw(8) << setfill('0') << global_cpu->getRAM(i) << " " << std::dec << setw(10) << setfill(' ') << global_cpu->getRAM(i) << 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; } } +void setRam(const vector& in) +{ + int addr = 0; + CDat val = 0; + + if(in.size() >= 3) { + try { + addr = convertStringToNum(in[1]); + if(addr < 0 || addr > (RAM_END-1)) { + cerr << "RAM-Address is out of range" << endl; + return; + } + + addr = (addr & (~(BYTE_COUNT-1))) / BYTE_COUNT; + val = convertStringToNum(in[2]); + + addr *= BYTE_COUNT; + + cout << "Setting RAM-Address 0x" << std::hex << setw(8) << setfill('0') << addr; + cout << " to 0x" << setw(8) << setfill('0') << val << std::dec << endl; + global_cpu->setRAM(addr,val); + } + catch(bad_cast&) { + cerr << "given parameter is not a number" << endl; + return; + } + } +} void printPROG(const vector& in) { int i, start = 0, end = 15; @@ -256,7 +318,11 @@ void printPROG(const vector& in) * 1) make 2 columns */ - if(in.size() >= 2) { + if(in.size() >= 2 && in[1][0] == 'c') { + start = global_cpu->getCurPC() / BYTE_COUNT; + end = start + 9; + } + else if(in.size() >= 2) { try { start = convertStringToNum(in[1]); if(start < 0 || start > (PROG_END-1)) { @@ -292,6 +358,7 @@ void printPROG(const vector& in) return; } } + for(i = start*BYTE_COUNT; i <= end*BYTE_COUNT; i += BYTE_COUNT) { Iinstr* pi = global_cpu->getProg(i); @@ -311,7 +378,7 @@ void setBreak(const vector& in) try { addr = convertStringToNum(in.back()); breakpoints.push_back(addr); - cout << "Breakpoint 0x" << std::hex << setw(8) << setfill('0') << addr << std::hex << " set" << endl; + cout << "Breakpoint 0x" << std::hex << setw(8) << setfill('0') << addr << std::dec << " set" << endl; } catch(bad_cast&) { cerr << "Given parameter is not a valid address" << endl; @@ -322,11 +389,29 @@ void setBreak(const vector& in) } } +void listBreaks(const vector&) +{ + for(auto iter = breakpoints.begin(); iter != breakpoints.end(); ++iter) { + cout << "Breakpoint at 0x" << std::hex << setw(8) << setfill('0') << *iter << std::dec << endl; + } +} + +void getPerf(const vector&) +{ + cout << "current perfcounter is " << std::dec << global_cpu->getPerf() << endl; +} + +void resetPerf(const vector&) +{ + cout << "reset perfcounter" << endl; + global_cpu->setPerf(0); +} + void printStatus(const vector&) { CDat stackp = global_cpu->getStack(); CDat stackd = global_cpu->getRAM(stackp); - cout << "Stack pointer: " << stackp << " @stackpointer: " << stackd << endl; + cout << "Stack pointer: 0x" << std::hex << setw(8) << setfill('0') << stackp << " @stackpointer: 0x" << setw(8) << stackd << std::dec << " (" << stackd << ")" << endl; cout << "PSW: 0x" << std::hex << setw(8) << setfill('0') << global_cpu->getFlags() << std::dec << endl; cout << "cur PC: 0x" << std::hex << setw(8) << setfill('0') << global_cpu->getCurPC() << " next PC: 0x" << setw(8) << setfill('0') << global_cpu->getNextPC() << std::dec << endl; @@ -409,12 +494,14 @@ int main(int argc, char* argv[]) Iinstr::setCPU(&cpu); + disasm disasm(instr); + + Iinstr::setDisasm(&disasm); std::string str = ""; int addr = 0; boost::char_separator sep(";", "", boost::keep_empty_tokens); boost::tokenizer > tokens(str, sep); - disasm disasm(instr); while(getline(inFile, str)) { int count = 0; tokens.assign(str); @@ -499,18 +586,18 @@ int main(int argc, char* argv[]) 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,50); + cpu.setRAM(4,0x66334455); cpu.setRAM(8,32); cpu.setRAM(12,45); - +*/ // following: job of the bootloader //set stackpointer cpu.setStack(500); //set return to nowhere for ret - cpu.setRAM(500,50); + cpu.setRAM(500,500); SReadline Reader; @@ -526,9 +613,14 @@ int main(int argc, char* argv[]) Completers.push_back(CompleterElement("ddata [s] [e]",&printRAM, "Prints RAM. if s is given, only RAM-Addr. s is printed. if s and e are given the RAM-Addrs from s to e are printed. if omitted the first 16 RAM-Addrs are printed.")); Completers.push_back(CompleterElement("dprog [s] [e]",&printPROG, "Prints program. if s is given, only Prog-Addr. s is printed. if s and e are given the Prog-Addrs from s to e are printed. if omitted the first 16 Prog-Addrs are printed.")); Completers.push_back(CompleterElement("break addr",&setBreak, "Sets a breakpoint for address addr.")); + Completers.push_back(CompleterElement("listbreaks",&listBreaks, "Lists all breakpoints.")); Completers.push_back(CompleterElement("run",&execRun, "Runs till next breakpoint or end of program.")); Completers.push_back(CompleterElement("setpc [num]",&setPC, "Sets PC to num. if num is omitted 0 is used.")); + 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.")); Reader.RegisterCompletions(Completers); @@ -536,12 +628,13 @@ int main(int argc, char* argv[]) vector Tokens, lastTokens; bool EndOfInput = false; - auto Found(Completers.end()); + //tilab g++44 doesn't like auto here + MyCompleterContainer::iterator Found(Completers.end()); Func lastFunc = NULL; - while(1) { + while(!exitProg) { UserInput = Reader.GetLine("> ", Tokens, EndOfInput); if(EndOfInput) { break;