X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=3b_sim%2Fccpu.hpp;h=9545445af260f6352dbab06636082c897b04e2ab;hb=HEAD;hp=89867efc9c8f13345622bc9dc7cb65fe102cec8f;hpb=31d88f201bf427d70924b9737ecdb6e0611939d3;p=calu.git diff --git a/3b_sim/ccpu.hpp b/3b_sim/ccpu.hpp index 89867ef..9545445 100644 --- a/3b_sim/ccpu.hpp +++ b/3b_sim/ccpu.hpp @@ -1,4 +1,23 @@ +/* `Deep Thought', a softcore CPU implemented on a FPGA + Copyright (C) 2010 Markus Hofstaetter + Copyright (C) 2010 Martin Perner + Copyright (C) 2010 Stefan Rebernig + Copyright (C) 2010 Manfred Schwarz + Copyright (C) 2010 Bernhard Urban + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ #ifndef __CPU__H__ #define __CPU__H__ @@ -6,31 +25,81 @@ #include "cdat.hpp" #include "cmem.hpp" #include "cpmem.hpp" + +#include "ccolor.h" + +class Iinstr; +class Iext; + +#include "iext.hpp" +#include #include "Iinstr.hpp" + class CCpu { private: - CDat m_pc, m_pc_next; - CMem m_regfile, m_ram; + bool m_Z, m_S, m_C, m_O, m_breakNext; + + CDat m_pc, m_pc_next, m_perf; + CMem m_reg, m_ram; CPMem m_prog; + vector m_exts; + + CDat m_stack; + + static const int EXT_MODEL_OFFSET = 0x2000; + public: void registerExtension() {}; + void applyToExtensions(const vector& in); void tick(); + void breakNext(); + bool shouldBreak(); + 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); };