diff options
author | Oxore <oxore@protonmail.com> | 2023-05-09 13:33:32 +0300 |
---|---|---|
committer | Oxore <oxore@protonmail.com> | 2023-05-09 13:33:32 +0300 |
commit | 9f6258ba57529403a579266ea9f958edfff9837f (patch) | |
tree | 94d9159707c713c3acdfffdc7e8f752b85e55a10 /disasm.h | |
parent | 6ace370b059dad7b723ae402f61b7060a1aa82c6 (diff) |
Begin refactoring: add new data types, remove unused members
Diffstat (limited to 'disasm.h')
-rw-r--r-- | disasm.h | 168 |
1 files changed, 165 insertions, 3 deletions
@@ -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(); |