+/* `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 __IINSTR_I_
#define __IINSTR_I_
#include "ccpu.hpp"
+class disasm;
+
+#include "disasm.h"
+
/* concept from https://groups.google.com/group/comp.arch.embedded/msg/9d430b6d3da12c8f */
#define to_HEX__(x) 0x##x##LU
class Iinstr {
protected:
- short opcode;
+ short opcode, clockcount;
std::string name;
short m_ra, m_rb, m_rd;
bool m_c, m_d, m_hl, m_f, m_s;
- int m_imm;
+ CDat m_imm;
short m_cond;
boost::dynamic_bitset<> argbits;
- Iinstr() : opcode(0), name(""), m_ra(0), m_rb(0), m_rd(0), m_c(0), m_d(0), m_hl(0), m_f(0), m_s(0), m_imm(0), m_cond(ALWAYS), argbits(32) {}
+ CDat hexdump;
+ Iinstr() : opcode(0), clockcount(1), name(""), m_ra(0), m_rb(0), m_rd(0), m_c(0), m_d(0), m_hl(0), m_f(0), m_s(0), m_imm(0), m_cond(ALWAYS), argbits(32), hexdump(0) {}
- int generate16ImmFill(const int value) const {
- int i = value;
+ CDat generate16ImmFill(const CDat value) const {
+ CDat i = value;
if(m_hl == true && m_f == true) {
i <<= 16;
i |= 0x0000FFFF;
return i;
}
- int generate16ImmSign(const int value) const {
- int i = value;
+ CDat generate16ImmSign(const CDat value) const {
+ CDat i = value;
if(m_hl == true) {
i <<= 16;
}
return i;
}
- int generate12ImmSign(const int value) const {
- int i = value;
+ CDat generate12ImmSign(const CDat value) const {
+ CDat i = value;
if(m_s == true && (i & 0x0800) != 0) {
i |= 0xFFFFF000;
}
return i;
}
- int generate15ImmSign(const int value) const {
- int i = value;
+ CDat generate15ImmSign(const CDat value) const {
+ CDat i = value;
if(m_s == true && (i & 0x4000) != 0) {
i |= 0xFFFF8000;
}
}
static CCpu* m_cpu;
+ static disasm* m_disasm;
public:
static void setCPU(CCpu* cpu) { m_cpu = cpu; }
+ static void setDisasm(disasm* dasm) { m_disasm = dasm; }
virtual ~Iinstr() {}
virtual short getOpcode() { return this->opcode; }
virtual std::string getName() { return this->name; }
- virtual void loadBits(boost::dynamic_bitset<> bits) { argbits = bits; }
+ virtual void loadBits(boost::dynamic_bitset<> bits) { argbits = bits; this->constructHex(); }
virtual void evalInstr() = 0;
virtual void execInstr() = 0;
virtual std::string toString() = 0;
virtual Iinstr* getNew() = 0;
-
+
+ unsigned long toNum() { return this->hexdump; }
+
short getCondition() {
return m_cond;
}
+ short getClockCount() {
+ return clockcount;
+ }
+
void decodeCondition(short condition) {
if(condition >= 0 && condition <= 15) {
m_cond = condition;
protected:
+ void constructHex()
+ {
+ hexdump = this->m_cond;
+ hexdump <<= 5;
+ hexdump += this->opcode;
+ hexdump <<= 23;
+ hexdump += this->argbits.to_ulong();
+ }
+
std::string getConditionFlag()
{
stringstream cond;