sim: added uart extension
[calu.git] / 3b_sim / ccpu.hpp
index 89867efc9c8f13345622bc9dc7cb65fe102cec8f..fb9447db2c6fb1aee57abcc70f2d4785b95c6b0a 100644 (file)
@@ -1,36 +1,81 @@
-
-
 #ifndef __CPU__H__
 #define __CPU__H__
 
 #include "cdat.hpp"
 #include "cmem.hpp"
 #include "cpmem.hpp"
+
+#include "ccolor.h"
+
+class Iinstr;
+class Iext;
+
+#include "iext.hpp"
+#include <boost/regex.hpp>
 #include "Iinstr.hpp"
 
+
 class CCpu {
        private:
 
-               CDat m_pc, m_pc_next;
-               CMem<CDat> m_regfile, m_ram;
+               bool m_Z, m_S, m_C, m_O;
+
+               CDat m_pc, m_pc_next, m_perf;
+               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 applyToExtensions(const vector<string>& in);
                void tick();
 
                CDat getRegister(const int) const;
-               void setRegister(const int, CDat&);
+               void setRegister(const int, CDat);
 
                CDat getRAM(const int) const;
-               void setRAM(const int, CDat&);
+               void setRAM(const int, CDat);
 
                Iinstr* getProg(const int) const;
                void setProg(const int, Iinstr*);
 
+               void registerExtension(Iext*);
+
+               CDat getPerf() const;
+               void setPerf(CDat);
+               void incPerf();
+               void incPerfBy(short);
+
+               CDat getCurPC() const;
                CDat getNextPC() const;
+               void setNextPC(CDat);
+
+               CDat getFlags() const;
+               void setFlags(CDat);
+               /* will only change zero and sign */
+               void updateFlags(CDat);
+               /* will change all flags */
+               void updateFlags(CDatd, CDat, CDat);
+               /* will change all flags */
+               void updateFlags(bool z, bool o, bool c, bool s);
+               /* will change carry */
+               void updateCarry(bool c);
+
+               bool getCarry();
+
+               bool conditionMet(short);
+
+               int getStack() const;
+               void setStack(const int);
+
+               string colorifyInstr(string instr);
 
-               CCpu();
+               CCpu(int,int,int);
 
 };