summaryrefslogtreecommitdiff
path: root/disasm.h
diff options
context:
space:
mode:
authorOxore <oxore@protonmail.com>2023-05-09 13:33:32 +0300
committerOxore <oxore@protonmail.com>2023-05-09 13:33:32 +0300
commit9f6258ba57529403a579266ea9f958edfff9837f (patch)
tree94d9159707c713c3acdfffdc7e8f752b85e55a10 /disasm.h
parent6ace370b059dad7b723ae402f61b7060a1aa82c6 (diff)
Begin refactoring: add new data types, remove unused members
Diffstat (limited to 'disasm.h')
-rw-r--r--disasm.h168
1 files changed, 165 insertions, 3 deletions
diff --git a/disasm.h b/disasm.h
index 5d2a9ae..e6ca13c 100644
--- a/disasm.h
+++ b/disasm.h
@@ -6,6 +6,166 @@
#include <cstddef>
#include <cstdint>
+enum class OpCode: uint8_t {
+ kNone = 0,
+ kORI,
+ kANDI,
+ kSUBI,
+ kADDI,
+ kEORI,
+ kCMPI,
+ kBTST,
+ kBCHG,
+ kBCLR,
+ kBSET,
+ kMOVEP,
+ kMOVEA,
+ kMOVE,
+ kNEGX,
+ kCLR,
+ kNEG,
+ kNOT,
+ kEXT,
+ kNBCD,
+ kSWAP,
+ kPEA,
+ kILLEGAL,
+ kTAS,
+ kTST,
+ kTRAP,
+ kLINK,
+ kUNLK,
+ kRESET,
+ kNOP,
+ kSTOP,
+ kRTE,
+ kRTS,
+ kTRAPV,
+ kRTR,
+ kJSR,
+ kJMP,
+ kMOVEM,
+ kLEA,
+ kCHK,
+ kADDQ,
+ kSUBQ,
+ kScc,
+ kDBcc,
+ kBcc,
+ kMOVEQ,
+ kDIVU,
+ kDIVS,
+ kSBCD,
+ kOR,
+ kSUB,
+ kSUBX,
+ kSUBA,
+ kEOR,
+ kCMPM,
+ kCMP,
+ kCMPA,
+ kMULU,
+ kMULS,
+ kABCD,
+ kEXG,
+ kAND,
+ kADD,
+ kADDX,
+ kADDA,
+ kASR,
+ kASL,
+ kLSR,
+ kLSL,
+ kROXR,
+ kROXL,
+ kROR,
+ kROL,
+};
+
+enum class Condition: uint8_t {
+ kT,
+ kBRA = kT,
+ kF,
+ kBSR = kF,
+ kHI,
+ kLS,
+ kCC,
+ kCS,
+ kNE,
+ kEQ,
+ kVC,
+ kVS,
+ kPL,
+ kMI,
+ kGE,
+ kLT,
+ kGT,
+ kLE,
+};
+
+enum class SizeSpec: uint8_t {
+ kNone,
+ kByte,
+ kWord,
+ kLong,
+};
+
+enum class ArgType: uint8_t {
+ kNone,
+ kDn, ///< Dn
+ kAn, ///< An
+ kAnAddr, ///< (An)
+ kAnAddrIncr, ///< (An)+
+ kAnAddrDecr, ///< -(An)
+ kD16AnAddr, ///< (d16,An)
+ kD8AnXiAddr, ///< (d8,An,Xi)
+ kWord, ///< (xxx).W
+ kLong, ///< (xxx).L
+ kD16PCAddr, ///< (d16,PC)
+ kD8PCXiAddr, ///< (d8,PC,Xn)
+ kImmediate, ///< #imm
+ kRegMask,
+ kDisplacement, ///< BRA, BSR, Bcc, DBcc
+ kCCR,
+ kSR,
+ kUSP,
+};
+
+enum class RegKind: uint8_t {
+ kDn,
+ kAn,
+};
+
+struct D8AnPCXiAddr {
+ RegKind kind; ///< Kind of Xi reg, for kD8AnXiAddr and kD8PCXiAddr
+ uint8_t an; ///< ID number of An reg, for kD8AnXiAddr only
+ uint8_t xi; ///< ID number of Xi reg, for kD8AnXiAddr and kD8PCXiAddr
+ int8_t d8; ///< Displacement, for kD8AnXiAddr and kD8PCXiAddr
+};
+
+struct D16AnPCAddr {
+ uint8_t an; ///< ID number of An reg, for kD16AnAddr only
+ int16_t d16; ///< Displacement, for D16AnAddr and kD16PCAddr
+};
+
+static_assert(sizeof(D8AnPCXiAddr) == sizeof(uint32_t), "");
+static_assert(sizeof(D16AnPCAddr) == sizeof(uint32_t), "");
+
+struct Arg {
+ using Self = Arg;
+ ArgType type{ArgType::kNone};
+ union {
+ int32_t lword{}; ///< kLong, kWord, kDisplacement
+ uint16_t uword; ///< kRegMask
+ uint8_t xn; ///< kDn, kAn, kAnAddr, kAnAddrIncr, kAnAddrDecr
+ D16AnPCAddr d16_an; ///< kD16AnAddr
+ D16AnPCAddr d16_pc; ///< kD16PCAddr
+ D8AnPCXiAddr d8_an_xi; ///< kD8AnXiAddr
+ D8AnPCXiAddr d8_pc_xi; ///< kD8PCXiAddr
+ };
+ static constexpr Self None() { return Arg{}; }
+};
+
enum class TracedNodeType {
kInstruction,
kData,
@@ -50,11 +210,13 @@ struct DisasmNode {
char mnemonic[kMnemonicBufferSize]{};
/// Formatted arguments of the instruction;
char arguments[kArgsBufferSize]{};
- /// Additional instruction specific info to put in a comment
- char additional[kArgsBufferSize]{};
- /// Additional instruction specific info to put in a comment
ReferenceNode *ref_by{};
ReferenceNode *last_ref_by{};
+ OpCode opcode{OpCode::kNone}; ///< Should replace `mnemonic` field
+ /// Size specifier, the suffix `b`, `w` or `l`
+ SizeSpec size_spec{SizeSpec::kNone};
+ Condition condition{Condition::kT}; ///< For Scc, Bcc and Dbcc
+ Arg args[2]{}; ///< Should replace `arguments` field
void Disasm(const DataBuffer &code, const Settings&);
void AddReferencedBy(uint32_t offset, ReferenceType);
~DisasmNode();