summaryrefslogtreecommitdiff
path: root/disasm.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'disasm.cpp')
-rw-r--r--disasm.cpp195
1 files changed, 97 insertions, 98 deletions
diff --git a/disasm.cpp b/disasm.cpp
index 54b082d..a3f7a36 100644
--- a/disasm.cpp
+++ b/disasm.cpp
@@ -52,9 +52,27 @@ enum class AddrMode: uint8_t {
kImmediate,
};
+enum class Cond {
+ kT = 0,
+ kF = 1,
+ kHI = 2,
+ kLS = 3,
+ kCC = 4,
+ kCS = 5,
+ kNE = 6,
+ kEQ = 7,
+ kVC = 8,
+ kVS = 9,
+ kPL = 10,
+ kMI = 11,
+ kGE = 12,
+ kLT = 13,
+ kGT = 14,
+ kLE = 15,
+};
+
struct AddrModeArg {
AddrMode mode{};
- uint8_t m{};
uint8_t xn{}; /// Xn register number: 0..7
char r{}; /// Xi register type specifier letter: either 'd' or 'a'
uint8_t xi{}; /// Xi register number: 0..7
@@ -87,53 +105,53 @@ struct AddrModeArg {
}
static constexpr AddrModeArg Dn(uint8_t xn)
{
- return AddrModeArg{AddrMode::kDn, 0, xn};
+ return AddrModeArg{AddrMode::kDn, xn};
}
static constexpr AddrModeArg An(uint8_t xn)
{
- return AddrModeArg{AddrMode::kAn, 1, xn};
+ return AddrModeArg{AddrMode::kAn, xn};
}
static constexpr AddrModeArg AnAddr(uint8_t xn)
{
- return AddrModeArg{AddrMode::kAnAddr, 2, xn};
+ return AddrModeArg{AddrMode::kAnAddr, xn};
}
static constexpr AddrModeArg AnAddrIncr(uint8_t xn)
{
- return AddrModeArg{AddrMode::kAnAddrIncr, 3, xn};
+ return AddrModeArg{AddrMode::kAnAddrIncr, xn};
}
static constexpr AddrModeArg AnAddrDecr(uint8_t xn)
{
- return AddrModeArg{AddrMode::kAnAddrDecr, 4, xn};
+ return AddrModeArg{AddrMode::kAnAddrDecr, xn};
}
static constexpr AddrModeArg D16AnAddr(uint8_t xn, int16_t d16)
{
- return AddrModeArg{AddrMode::kD16AnAddr, 5, xn, 0, 0, 0, d16};
+ return AddrModeArg{AddrMode::kD16AnAddr, xn, 0, 0, 0, d16};
}
static constexpr AddrModeArg D8AnXiAddr(
uint8_t xn, char r, uint8_t xi, char s, int8_t d8)
{
- return AddrModeArg{AddrMode::kD8AnXiAddr, 6, xn, r, xi, s, d8};
+ return AddrModeArg{AddrMode::kD8AnXiAddr, xn, r, xi, s, d8};
}
- static constexpr AddrModeArg Word(uint8_t m, uint8_t xn, int16_t w)
+ static constexpr AddrModeArg Word(uint8_t xn, int16_t w)
{
- return AddrModeArg{AddrMode::kWord, m, xn, 0, 0, 0, w};
+ return AddrModeArg{AddrMode::kWord, xn, 0, 0, 0, w};
}
- static constexpr AddrModeArg Long(uint8_t m, uint8_t xn, int32_t l)
+ static constexpr AddrModeArg Long(uint8_t xn, int32_t l)
{
- return AddrModeArg{AddrMode::kLong, m, xn, 0, 0, 0, l};
+ return AddrModeArg{AddrMode::kLong, xn, 0, 0, 0, l};
}
- static constexpr AddrModeArg D16PCAddr(uint8_t m, uint8_t xn, int16_t d16)
+ static constexpr AddrModeArg D16PCAddr(uint8_t xn, int16_t d16)
{
- return AddrModeArg{AddrMode::kD16PCAddr, m, xn, 0, 0, 0, d16};
+ return AddrModeArg{AddrMode::kD16PCAddr, xn, 0, 0, 0, d16};
}
static constexpr AddrModeArg D8PCXiAddr(
- uint8_t m, uint8_t xn, char r, uint8_t xi, char s, int8_t d8)
+ uint8_t xn, char r, uint8_t xi, char s, int8_t d8)
{
- return AddrModeArg{AddrMode::kD8PCXiAddr, m, xn, r, xi, s, d8};
+ return AddrModeArg{AddrMode::kD8PCXiAddr, xn, r, xi, s, d8};
}
- static constexpr AddrModeArg Immediate(uint8_t m, uint8_t xn, char s, int32_t value)
+ static constexpr AddrModeArg Immediate(uint8_t xn, char s, int32_t value)
{
- return AddrModeArg{AddrMode::kImmediate, m, xn, 0, 0, s, value};
+ return AddrModeArg{AddrMode::kImmediate, xn, 0, 0, s, value};
}
static constexpr AddrModeArg Fetch(
const uint32_t offset, const DataBuffer &code, int16_t instr, char s)
@@ -222,19 +240,19 @@ constexpr AddrModeArg AddrModeArg::Fetch(
case 0: // (xxx).W, Additional Word
if (offset < code.occupied_size) {
const int32_t w = GetI16BE(code.buffer + offset);
- return AddrModeArg::Word(m, xn, w);
+ return AddrModeArg::Word(xn, w);
}
break;
case 1: // (xxx).L, Additional Long
if (offset + kInstructionSizeStepBytes < code.occupied_size) {
const int32_t l = GetI32BE(code.buffer + offset);
- return AddrModeArg::Long(m, xn, l);
+ return AddrModeArg::Long(xn, l);
}
break;
case 2: // (d16, PC), Additional Word
if (offset < code.occupied_size) {
const int16_t d16 = GetI16BE(code.buffer + offset);
- return AddrModeArg::D16PCAddr(m, xn, d16);
+ return AddrModeArg::D16PCAddr(xn, d16);
}
break;
case 3: // (d8, PC, Xi), Brief Extension Word
@@ -249,14 +267,14 @@ constexpr AddrModeArg AddrModeArg::Fetch(
const uint8_t xi = (briefext >> 12) & 7;
const char s = ((briefext >> 11) & 1) ? 'l' : 'w';
const int8_t d8 = briefext & 0xff;
- return AddrModeArg::D8PCXiAddr(m, xn, r, xi, s, d8);
+ return AddrModeArg::D8PCXiAddr(xn, r, xi, s, d8);
}
break;
case 4: // #imm
if (s == 'l') {
if (offset + kInstructionSizeStepBytes < code.occupied_size) {
const int32_t value = GetI32BE(code.buffer + offset);
- return AddrModeArg::Immediate(m, xn, s, value);
+ return AddrModeArg::Immediate(xn, s, value);
}
} else if (offset < code.occupied_size) {
const int16_t value = GetI16BE(code.buffer + offset);
@@ -267,7 +285,7 @@ constexpr AddrModeArg AddrModeArg::Fetch(
break;
}
}
- return AddrModeArg::Immediate(m, xn, s, value);
+ return AddrModeArg::Immediate(xn, s, value);
}
case 5: // Does not exist
case 6: // Does not exist
@@ -543,44 +561,25 @@ static void disasm_chk(
node.size = kInstructionSizeStepBytes + src.Size() + dst.Size();
}
-enum class Condition {
- kT = 0,
- kF = 1,
- kHI = 2,
- kLS = 3,
- kCC = 4,
- kCS = 5,
- kNE = 6,
- kEQ = 7,
- kVC = 8,
- kVS = 9,
- kPL = 10,
- kMI = 11,
- kGE = 12,
- kLT = 13,
- kGT = 14,
- kLE = 15,
-};
-
-static inline const char *bcc_mnemonic_by_condition(Condition condition)
+static inline const char *bcc_mnemonic_by_condition(Cond condition)
{
switch (condition) {
- case Condition::kT: return "bra"; // 60xx
- case Condition::kF: return "bsr"; // 61xx
- case Condition::kHI: return "bhi"; // 62xx
- case Condition::kLS: return "bls"; // 63xx
- case Condition::kCC: return "bcc"; // 64xx
- case Condition::kCS: return "bcs"; // 65xx
- case Condition::kNE: return "bne"; // 66xx
- case Condition::kEQ: return "beq"; // 67xx
- case Condition::kVC: return "bvc"; // 68xx
- case Condition::kVS: return "bvs"; // 69xx
- case Condition::kPL: return "bpl"; // 6axx
- case Condition::kMI: return "bmi"; // 6bxx
- case Condition::kGE: return "bge"; // 6cxx
- case Condition::kLT: return "blt"; // 6dxx
- case Condition::kGT: return "bgt"; // 6exx
- case Condition::kLE: return "ble"; // 6fxx
+ case Cond::kT: return "bra"; // 60xx
+ case Cond::kF: return "bsr"; // 61xx
+ case Cond::kHI: return "bhi"; // 62xx
+ case Cond::kLS: return "bls"; // 63xx
+ case Cond::kCC: return "bcc"; // 64xx
+ case Cond::kCS: return "bcs"; // 65xx
+ case Cond::kNE: return "bne"; // 66xx
+ case Cond::kEQ: return "beq"; // 67xx
+ case Cond::kVC: return "bvc"; // 68xx
+ case Cond::kVS: return "bvs"; // 69xx
+ case Cond::kPL: return "bpl"; // 6axx
+ case Cond::kMI: return "bmi"; // 6bxx
+ case Cond::kGE: return "bge"; // 6cxx
+ case Cond::kLT: return "blt"; // 6dxx
+ case Cond::kGT: return "bgt"; // 6exx
+ case Cond::kLE: return "ble"; // 6fxx
}
assert(false);
return "?";
@@ -589,7 +588,7 @@ static inline const char *bcc_mnemonic_by_condition(Condition condition)
static void disasm_bra_bsr_bcc(
DisasmNode &node, uint16_t instr, const DataBuffer &code, const Settings &s)
{
- Condition condition = static_cast<Condition>((instr >> 8) & 0xf);
+ Cond condition = static_cast<Cond>((instr >> 8) & 0xf);
const char *mnemonic = bcc_mnemonic_by_condition(condition);
// False condition Indicates BSR
int dispmt = static_cast<int8_t>(instr & 0xff);
@@ -610,7 +609,7 @@ static void disasm_bra_bsr_bcc(
} else {
node.size = kInstructionSizeStepBytes;
}
- node.is_call = (condition == Condition::kF);
+ node.is_call = (condition == Cond::kF);
dispmt += kInstructionSizeStepBytes;
const uint32_t branch_addr = static_cast<uint32_t>(node.offset + dispmt);
node.branch_addr = branch_addr;
@@ -1287,25 +1286,25 @@ static void disasm_addq_subq(
a.SNPrint(node.arguments + ret, kArgsBufferSize - ret);
}
-static inline const char *dbcc_mnemonic_by_condition(Condition condition)
+static inline const char *dbcc_mnemonic_by_condition(Cond condition)
{
switch (condition) {
- case Condition::kT: return "dbt"; // 50c8..50cf
- case Condition::kF: return "dbf"; // 51c8..51cf
- case Condition::kHI: return "dbhi"; // 52c8..52cf
- case Condition::kLS: return "dbls"; // 53c8..53cf
- case Condition::kCC: return "dbcc"; // 54c8..54cf
- case Condition::kCS: return "dbcs"; // 55c8..55cf
- case Condition::kNE: return "dbne"; // 56c8..56cf
- case Condition::kEQ: return "dbeq"; // 57c8..57cf
- case Condition::kVC: return "dbvc"; // 58c8..58cf
- case Condition::kVS: return "dbvs"; // 59c8..59cf
- case Condition::kPL: return "dbpl"; // 5ac8..5acf
- case Condition::kMI: return "dbmi"; // 5bc8..5bcf
- case Condition::kGE: return "dbge"; // 5cc8..5ccf
- case Condition::kLT: return "dblt"; // 5dc8..5dcf
- case Condition::kGT: return "dbgt"; // 5ec8..5ecf
- case Condition::kLE: return "dble"; // 5fc8..5fcf
+ case Cond::kT: return "dbt"; // 50c8..50cf
+ case Cond::kF: return "dbf"; // 51c8..51cf
+ case Cond::kHI: return "dbhi"; // 52c8..52cf
+ case Cond::kLS: return "dbls"; // 53c8..53cf
+ case Cond::kCC: return "dbcc"; // 54c8..54cf
+ case Cond::kCS: return "dbcs"; // 55c8..55cf
+ case Cond::kNE: return "dbne"; // 56c8..56cf
+ case Cond::kEQ: return "dbeq"; // 57c8..57cf
+ case Cond::kVC: return "dbvc"; // 58c8..58cf
+ case Cond::kVS: return "dbvs"; // 59c8..59cf
+ case Cond::kPL: return "dbpl"; // 5ac8..5acf
+ case Cond::kMI: return "dbmi"; // 5bc8..5bcf
+ case Cond::kGE: return "dbge"; // 5cc8..5ccf
+ case Cond::kLT: return "dblt"; // 5dc8..5dcf
+ case Cond::kGT: return "dbgt"; // 5ec8..5ecf
+ case Cond::kLE: return "dble"; // 5fc8..5fcf
}
assert(false);
return "?";
@@ -1321,7 +1320,7 @@ static void disasm_dbcc(DisasmNode &node, uint16_t instr, const DataBuffer &code
return disasm_verbatim(node, instr, code, s);
}
node.size = kInstructionSizeStepBytes * 2;
- Condition condition = static_cast<Condition>((instr >> 8) & 0xf);
+ Cond condition = static_cast<Cond>((instr >> 8) & 0xf);
const char *mnemonic = dbcc_mnemonic_by_condition(condition);
const int dn = (instr & 7);
const uint32_t branch_addr = static_cast<uint32_t>(
@@ -1336,25 +1335,25 @@ static void disasm_dbcc(DisasmNode &node, uint16_t instr, const DataBuffer &code
return;
}
-static inline const char *scc_mnemonic_by_condition(Condition condition)
+static inline const char *scc_mnemonic_by_condition(Cond condition)
{
switch (condition) {
- case Condition::kT: return "st"; // 50cx..50fx
- case Condition::kF: return "sf"; // 51cx..51fx
- case Condition::kHI: return "shi"; // 52cx..52fx
- case Condition::kLS: return "sls"; // 53cx..53fx
- case Condition::kCC: return "scc"; // 54cx..54fx
- case Condition::kCS: return "scs"; // 55cx..55fx
- case Condition::kNE: return "sne"; // 56cx..56fx
- case Condition::kEQ: return "seq"; // 57cx..57fx
- case Condition::kVC: return "svc"; // 58cx..58fx
- case Condition::kVS: return "svs"; // 59cx..59fx
- case Condition::kPL: return "spl"; // 5acx..5afx
- case Condition::kMI: return "smi"; // 5bcx..5bfx
- case Condition::kGE: return "sge"; // 5ccx..5cfx
- case Condition::kLT: return "slt"; // 5dcx..5dfx
- case Condition::kGT: return "sgt"; // 5ecx..5efx
- case Condition::kLE: return "sle"; // 5fcx..5ffx
+ case Cond::kT: return "st"; // 50cx..50fx
+ case Cond::kF: return "sf"; // 51cx..51fx
+ case Cond::kHI: return "shi"; // 52cx..52fx
+ case Cond::kLS: return "sls"; // 53cx..53fx
+ case Cond::kCC: return "scc"; // 54cx..54fx
+ case Cond::kCS: return "scs"; // 55cx..55fx
+ case Cond::kNE: return "sne"; // 56cx..56fx
+ case Cond::kEQ: return "seq"; // 57cx..57fx
+ case Cond::kVC: return "svc"; // 58cx..58fx
+ case Cond::kVS: return "svs"; // 59cx..59fx
+ case Cond::kPL: return "spl"; // 5acx..5afx
+ case Cond::kMI: return "smi"; // 5bcx..5bfx
+ case Cond::kGE: return "sge"; // 5ccx..5cfx
+ case Cond::kLT: return "slt"; // 5dcx..5dfx
+ case Cond::kGT: return "sgt"; // 5ecx..5efx
+ case Cond::kLE: return "sle"; // 5fcx..5ffx
}
assert(false);
return "?";
@@ -1386,7 +1385,7 @@ static void disasm_scc_dbcc(
return disasm_verbatim(node, instr, code, s);
}
node.size = kInstructionSizeStepBytes + a.Size();
- Condition condition = static_cast<Condition>((instr >> 8) & 0xf);
+ Cond condition = static_cast<Cond>((instr >> 8) & 0xf);
const char *mnemonic = scc_mnemonic_by_condition(condition);
snprintf(node.mnemonic, kMnemonicBufferSize, mnemonic);
a.SNPrint(node.arguments, kArgsBufferSize);