sim: replace exit() by flag
[calu.git] / 3b_sim / sim.cpp
index 64717127cc2d5adc2b5792f11ee840b117c9f740..2102c5a98682f31394273b8f5aea65cea1f492e8 100644 (file)
@@ -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<void (const vector<string> &)> 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<std::string> &);
 
 CCpu* Iinstr::m_cpu;
+disasm* Iinstr::m_disasm;
 
 CCpu* global_cpu = NULL;
 
@@ -75,9 +76,11 @@ vector<CDat> breakpoints;
 
 bool ignoreBreak = false;
 
+bool exitProg = false;
+
 void doExit(const vector<string>&)
 {
-       exit(EXIT_SUCCESS);
+       exitProg = true;
 }
 
 unsigned int convertStringToNum(const std::string& in)
@@ -296,7 +299,10 @@ void setRam(const vector<string>& in)
                        addr = (addr & (~(BYTE_COUNT-1))) / BYTE_COUNT;
                        val = convertStringToNum(in[2]);
 
-                       cout << "Setting RAM-Address " << addr << " to 0x" << std::hex << setw(8) << setfill('0') << val << std::dec << endl;
+                       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&) {
@@ -312,7 +318,11 @@ void printPROG(const vector<string>& 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)) {
@@ -348,6 +358,7 @@ void printPROG(const vector<string>& in)
                        return;
                }
        }
+
        
        for(i = start*BYTE_COUNT; i <= end*BYTE_COUNT; i += BYTE_COUNT) {
                Iinstr* pi = global_cpu->getProg(i);
@@ -385,11 +396,22 @@ void listBreaks(const vector<string>&)
        }
 }
 
+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 printStatus(const vector<string>&)
 {
        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;
 
@@ -472,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<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);
@@ -562,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;
 
@@ -595,6 +619,8 @@ int main(int argc, char* argv[])
        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);
 
@@ -602,12 +628,13 @@ int main(int argc, char* argv[])
        vector<string> 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;