sim: added extensionmodule support + progger
authorMartin Perner <martin@perner.cc>
Wed, 12 Jan 2011 15:20:18 +0000 (16:20 +0100)
committerMartin Perner <martin@perner.cc>
Wed, 12 Jan 2011 17:40:16 +0000 (18:40 +0100)
3b_sim/ccpu.cpp
3b_sim/ccpu.hpp
3b_sim/extensions/cprog.hpp [new file with mode: 0644]
3b_sim/iext.hpp [new file with mode: 0644]
3b_sim/sim.cpp
3c_disasm/iext.hpp [new symlink]

index 9cf728bcca924f9875797fab4e41ba46ba4c66e0..d2e64e030e3024ecb3f495b2055ce88de12d5949 100644 (file)
@@ -28,6 +28,10 @@ string CCpu::colorifyInstr(string instr)
        return boost::regex_replace(instr, e, format, boost::match_default | boost::format_all);
 }
 
+void CCpu::registerExtension(Iext* ext)
+{
+       m_exts.push_back(ext);
+}
 
 void CCpu::tick()
 {
@@ -37,9 +41,15 @@ void CCpu::tick()
        m_pc = m_pc_next;
        m_pc_next += 4;
        Iinstr* instr = this->getProg(m_pc);
+
        if(instr == NULL) {
                throw string("Out of Instructions!");
        }
+
+       for(auto iter = m_exts.begin(); iter != m_exts.end(); ++iter) {
+               (*iter)->applyTick();
+       }
+
        if(this->conditionMet(instr->getCondition())) {
                cout << color(green,black) << "Executing: " << color(white,black) << colorifyInstr(instr->toString()) << endl;
                instr->execInstr();
@@ -188,11 +198,31 @@ void CCpu::setRegister(const int addr, CDat data)
 
 CDat CCpu::getRAM(const int addr) const
 {
-       return m_ram.get(addr);
+       if((addr & EXT_MODEL_OFFSET) == 0) {
+               return m_ram.get(addr);
+       }
+       else {
+               CDat result = 0;
+               for(auto iter = m_exts.begin(); iter != m_exts.end(); ++iter) {
+                       result = (*iter)->readData(addr);
+                       if(result != 0) {
+                               break;
+                       }
+               }
+               return result;
+       }
 }
+
 void CCpu::setRAM(const int addr, CDat data)
 {
-       m_ram.set(addr, data);
+       if((addr & EXT_MODEL_OFFSET) == 0) {
+               m_ram.set(addr, data);
+       }
+       else {
+               for(auto iter = m_exts.begin(); iter != m_exts.end(); ++iter) {
+                       (*iter)->loadData(addr, data);
+               }
+       }
 }
 
 void CCpu::setProg(int addr, Iinstr* instr)
@@ -236,7 +266,7 @@ void CCpu::incPerfBy(short inc)
 }
 
 
-CCpu::CCpu(int regs, int ram, int prog) : m_Z(false), m_S(false), m_C(false), m_O(false), m_pc(0), m_pc_next(0), m_perf(0), m_reg(regs), m_ram(ram), m_prog(prog), m_stack(0)
+CCpu::CCpu(int regs, int ram, int prog) : m_Z(false), m_S(false), m_C(false), m_O(false), m_pc(0), m_pc_next(0), m_perf(0), m_reg(regs), m_ram(ram), m_prog(prog), m_exts(0), m_stack(0)
 {
 }
 
index 4a8724004733e5812d3006f57bb4ede00e7ad5c5..a9747c9092d8f61fa0d26161f56ebddbbe70a54f 100644 (file)
@@ -8,7 +8,9 @@
 #include "ccolor.h"
 
 class Iinstr;
+class Iext;
 
+#include "iext.hpp"
 #include <boost/regex.hpp>
 #include "Iinstr.hpp"
 
@@ -22,8 +24,12 @@ class CCpu {
                CMem<CDat> m_reg, m_ram;
                CPMem<Iinstr*> m_prog;
 
+               vector<Iext*> m_exts;
+
                CDat m_stack;
 
+               static const int EXT_MODEL_OFFSET = 0x2000;
+
        public:
                void registerExtension() {};
                void tick();
@@ -37,6 +43,8 @@ class CCpu {
                Iinstr* getProg(const int) const;
                void setProg(const int, Iinstr*);
 
+               void registerExtension(Iext*);
+
                CDat getPerf() const;
                void setPerf(CDat);
                void incPerf();
diff --git a/3b_sim/extensions/cprog.hpp b/3b_sim/extensions/cprog.hpp
new file mode 100644 (file)
index 0000000..82d83cf
--- /dev/null
@@ -0,0 +1,24 @@
+#include "../iext.hpp"
+
+class Cprog : public Iext {
+       public:
+               Cprog() : m_writeAddress(0) {};
+               void applyTick() {};
+               void loadData(const int address, CDat value);
+               CDat readData(const int) { return 0; }
+       private:
+               int m_writeAddress;
+};
+
+void Cprog::loadData(const int address, CDat value)
+{
+       if(address == 0x2034) {
+               m_writeAddress = value;
+               //adress pointer
+       }
+       else if(address == 0x2038) {
+               this->m_cpu->setProg(m_writeAddress, m_disasm->decodeNum(value));
+               m_writeAddress += 4;
+               //data pointer
+       }
+}
diff --git a/3b_sim/iext.hpp b/3b_sim/iext.hpp
new file mode 100644 (file)
index 0000000..99b0842
--- /dev/null
@@ -0,0 +1,27 @@
+#ifndef __IEXT_I_
+#define __IEXT_I_
+
+class CCpu;
+
+#include "ccpu.hpp"
+
+class disasm;
+
+#include "disasm.h"
+
+
+class Iext {
+       public:
+               static void setCPU(CCpu* cpu) {m_cpu = cpu;}
+               static void setDisasm(disasm* dasm) { m_disasm = dasm; }
+
+               virtual ~Iext() {}
+               //called by cpu before every tick
+               virtual void applyTick() = 0;
+               virtual void loadData(const int address, CDat value) = 0;
+               virtual CDat readData(const int address) = 0;
+               static CCpu* m_cpu;
+               static disasm* m_disasm;
+};
+
+#endif
index 6cd72b16cce203b21229d2e44ade6b6a195eac20..0e1a0aef071cfb6bc7b2304dcb938c2b5d29eb56 100644 (file)
@@ -17,6 +17,9 @@
 #include "CInstrFactory.hpp"
 #include "uint32_from_hex.hpp"
 
+#include "iext.hpp"
+#include "extensions/cprog.hpp"
+
 #include "SReadline/SReadline.h"
 using namespace swift;
 
@@ -68,7 +71,9 @@ class CHelpExec
 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;
 
@@ -536,10 +541,14 @@ int main(int argc, char* argv[])
        global_cpu = &cpu;
 
        Iinstr::setCPU(&cpu);
+       Iext::setCPU(&cpu);
 
        disasm disasm(instr);
 
        Iinstr::setDisasm(&disasm);
+       Iext::setDisasm(&disasm);
+
+       global_cpu->registerExtension(new Cprog());
 
        vector<string> commentDefer;
        vector<string> labelDefer;
diff --git a/3c_disasm/iext.hpp b/3c_disasm/iext.hpp
new file mode 120000 (symlink)
index 0000000..8f17718
--- /dev/null
@@ -0,0 +1 @@
+../3b_sim/iext.hpp
\ No newline at end of file