+/* `Deep Thought', a softcore CPU implemented on a FPGA
+ Copyright (C) 2010 Markus Hofstaetter <markus.manrow@gmx.at>
+ Copyright (C) 2010 Martin Perner <e0725782@student.tuwien.ac.at>
+ Copyright (C) 2010 Stefan Rebernig <stefan.rebernig@gmail.com>
+ Copyright (C) 2010 Manfred Schwarz <e0725898@student.tuwien.ac.at>
+ Copyright (C) 2010 Bernhard Urban <lewurm@gmail.com>
+
+ 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 <http://www.gnu.org/licenses/>. */
#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, m_breakNext;
+
+ 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();
+ 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);
};