summaryrefslogtreecommitdiff
path: root/disasm.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'disasm.cpp')
-rw-r--r--disasm.cpp48
1 files changed, 22 insertions, 26 deletions
diff --git a/disasm.cpp b/disasm.cpp
index 2377bd1..ab1c91e 100644
--- a/disasm.cpp
+++ b/disasm.cpp
@@ -10,11 +10,6 @@
#include <cstdlib>
#include <cstring>
-enum class JKind {
- kJsr,
- kJmp,
-};
-
enum class MoveDirection: bool {
kRegisterToMemory = 0,
kMemoryToRegister = 1,
@@ -156,7 +151,7 @@ static size_t disasm_verbatim(DisasmNode &node, const uint16_t instr)
}
static size_t disasm_jsr_jmp(
- DisasmNode &node, const uint16_t instr, const DataBuffer &code, const JKind jtype)
+ DisasmNode &node, const uint16_t instr, const DataBuffer &code)
{
const OpSize opsize = OpSize::kWord;
const auto a = FetchArg(node.offset + kInstructionSizeStepBytes, code, instr, opsize);
@@ -209,8 +204,9 @@ static size_t disasm_jsr_jmp(
case AddrMode::kImmediate: // 4ebc / 4efc
return disasm_verbatim(node, instr);
}
- node.is_call = (jtype == JKind::kJsr);
- node.op = Op::Typical((jtype == JKind::kJsr) ? OpCode::kJSR : OpCode::kJMP, OpSize::kNone, a);
+ const bool is_jmp = instr & 0x40;
+ node.is_call = !is_jmp;
+ node.op = Op::Typical(is_jmp ? OpCode::kJMP : OpCode::kJSR, OpSize::kNone, a);
return node.size = kInstructionSizeStepBytes + a.Size(opsize);
}
@@ -925,24 +921,24 @@ static size_t disasm_chunk_4(DisasmNode &node, const uint16_t instr, const DataB
return disasm_link_unlink(node, instr, code);
} else if ((instr & 0xfff0) == 0x4e60) {
return disasm_move_usp(node, instr);
- } else if (instr == 0x4e70) {
- return disasm_trivial(node, OpCode::kRESET);
- } else if (instr == 0x4e71) {
- return disasm_trivial(node, OpCode::kNOP);
- } else if (instr == 0x4e72) {
- return disasm_stop(node, instr, code);
- } else if (instr == 0x4e73) {
- return disasm_trivial(node, OpCode::kRTE);
- } else if (instr == 0x4e75) {
- return disasm_trivial(node, OpCode::kRTS);
- } else if (instr == 0x4e76) {
- return disasm_trivial(node, OpCode::kTRAPV);
- } else if (instr == 0x4e77) {
- return disasm_trivial(node, OpCode::kRTR);
- } else if ((instr & 0xffc0) == 0x4e80) {
- return disasm_jsr_jmp(node, instr, code, JKind::kJsr);
- } else if ((instr & 0xffc0) == 0x4ec0) {
- return disasm_jsr_jmp(node, instr, code, JKind::kJmp);
+ } else if ((instr & 0xfff8) == 0x4e70) {
+ if (instr == 0x4e70) {
+ return disasm_trivial(node, OpCode::kRESET);
+ } else if (instr == 0x4e71) {
+ return disasm_trivial(node, OpCode::kNOP);
+ } else if (instr == 0x4e72) {
+ return disasm_stop(node, instr, code);
+ } else if (instr == 0x4e73) {
+ return disasm_trivial(node, OpCode::kRTE);
+ } else if (instr == 0x4e75) {
+ return disasm_trivial(node, OpCode::kRTS);
+ } else if (instr == 0x4e76) {
+ return disasm_trivial(node, OpCode::kTRAPV);
+ } else if (instr == 0x4e77) {
+ return disasm_trivial(node, OpCode::kRTR);
+ }
+ } else if ((instr & 0xff80) == 0x4e80) {
+ return disasm_jsr_jmp(node, instr, code);
} else if ((instr & 0xfb80) == 0x4880) {
return disasm_ext_movem(node, instr, code);
} else if ((instr & 0xf1c0) == 0x41c0) {