/* `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__ #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: 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); CDat getRAM(const int) const; 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(int,int,int); }; #endif