X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=3c_disasm%2FIinstr.hpp;h=e16c26c13a90200373d6de7e9af94d2d28a121f2;hb=1008cb9007e11df5bbc5e447d11f9990ca14aa9b;hp=416db47a869cb6041163165d5e96d968b6477e78;hpb=12d2a7c14a42e01b6caf2a097db32404a403d213;p=calu.git diff --git a/3c_disasm/Iinstr.hpp b/3c_disasm/Iinstr.hpp index 416db47..e16c26c 100644 --- a/3c_disasm/Iinstr.hpp +++ b/3c_disasm/Iinstr.hpp @@ -10,6 +10,10 @@ class CCpu; #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 @@ -47,17 +51,18 @@ enum CONDITIONS { 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; @@ -76,8 +81,8 @@ class Iinstr { 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; } @@ -88,8 +93,8 @@ class Iinstr { 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; } @@ -97,8 +102,8 @@ class Iinstr { 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; } @@ -114,24 +119,32 @@ class Iinstr { } 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; @@ -143,6 +156,15 @@ class Iinstr { protected: + void constructHex() + { + hexdump = this->m_cond; + hexdump <<= 5; + hexdump += this->opcode; + hexdump <<= 23; + hexdump += this->argbits.to_ulong(); + } + std::string getConditionFlag() { stringstream cond;