summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--disasm.cpp30
1 files changed, 19 insertions, 11 deletions
diff --git a/disasm.cpp b/disasm.cpp
index 033349b..e4e776b 100644
--- a/disasm.cpp
+++ b/disasm.cpp
@@ -35,9 +35,15 @@ static size_t disasm_mfff0_v4e70(
return disasm_verbatim(out, out_sz, instr_sz, instr, offset, code);
}
-static size_t disasm_jsr(
- char *out, size_t out_sz, size_t *instr_sz, uint16_t instr, uint32_t offset, const DataBuffer & code)
+enum class JsrJmp {
+ kJsr,
+ kJmp,
+};
+
+static size_t disasm_jsr_jmp(
+ char *out, size_t out_sz, size_t *instr_sz, uint16_t instr, uint32_t offset, const DataBuffer & code, JsrJmp jsrjmp)
{
+ const char *instr_repr = (jsrjmp == JsrJmp::kJsr) ? "jsr" : "jmp";
const int addrmode = instr & 0x3f;
const int m = (addrmode >> 3) & 0x7;
const int xn = addrmode & 0x7;
@@ -49,7 +55,7 @@ static size_t disasm_jsr(
if (instr_sz) {
*instr_sz = kInstructionSizeStepBytes;
}
- return Min(out_sz, snprintf(out, out_sz, " jsr %%a%d@", xn));
+ return Min(out_sz, snprintf(out, out_sz, " %s %%a%d@", instr_repr, xn));
case 3: // 4e98 .. 4e9f
case 4: // 4ea0 .. 4ea7
break;
@@ -59,7 +65,7 @@ static size_t disasm_jsr(
*instr_sz = kInstructionSizeStepBytes * 2;
}
const int16_t dispmt = GetI16BE(code.buffer + offset + kInstructionSizeStepBytes);
- return Min(out_sz, snprintf(out, out_sz, " jsr %%a%d@(%d:w)", xn, dispmt));
+ return Min(out_sz, snprintf(out, out_sz, " %s %%a%d@(%d:w)", instr_repr, xn, dispmt));
}
case 6: // 4eb0 .. 4eb7, Brief Extension Word
{
@@ -72,8 +78,8 @@ static size_t disasm_jsr(
const char size_spec = ((briefext >> 11) & 1) ? 'l' : 'w';
const int8_t dispmt = briefext & 0xff;
return Min(out_sz, snprintf(
- out, out_sz, " jsr %%a%d@(%d,%%%c%d:%c)",
- xn, dispmt, reg, xn2, size_spec));
+ out, out_sz, " %s %%a%d@(%d,%%%c%d:%c)",
+ instr_repr, xn, dispmt, reg, xn2, size_spec));
}
case 7: // 4eb8 .. 4ebf, some are with Brief Extension Word
switch (xn) {
@@ -83,7 +89,7 @@ static size_t disasm_jsr(
*instr_sz = kInstructionSizeStepBytes * 2;
}
const int32_t dispmt = GetI16BE(code.buffer + offset + kInstructionSizeStepBytes);
- return Min(out_sz, snprintf(out, out_sz, " jsr 0x%x:w", dispmt));
+ return Min(out_sz, snprintf(out, out_sz, " %s 0x%x:w", instr_repr, dispmt));
}
case 1: // 4eb9 (xxx).L
{
@@ -91,7 +97,7 @@ static size_t disasm_jsr(
*instr_sz = kInstructionSizeStepBytes * 3;
}
const int32_t dispmt = GetI32BE(code.buffer + offset + kInstructionSizeStepBytes);
- return Min(out_sz, snprintf(out, out_sz, " jsr 0x%x:l", dispmt));
+ return Min(out_sz, snprintf(out, out_sz, " %s 0x%x:l", instr_repr, dispmt));
}
case 2: // 4eba, Displacement
{
@@ -99,7 +105,7 @@ static size_t disasm_jsr(
*instr_sz = kInstructionSizeStepBytes * 2;
}
const int16_t dispmt = GetI16BE(code.buffer + offset + kInstructionSizeStepBytes);
- return Min(out_sz, snprintf(out, out_sz, " jsr %%pc@(%d:w)", dispmt));
+ return Min(out_sz, snprintf(out, out_sz, " %s %%pc@(%d:w)", instr_repr, dispmt));
}
case 3: // 4ebb
{
@@ -113,7 +119,7 @@ static size_t disasm_jsr(
const char size_spec = ((briefext >> 11) & 1) ? 'l' : 'w';
const int8_t dispmt = briefext & 0xff;
return Min(out_sz, snprintf(
- out, out_sz, " jsr %%pc@(%d,%%%c%d:%c)", dispmt, reg, xn2, size_spec));
+ out, out_sz, " %s %%pc@(%d,%%%c%d:%c)", instr_repr, dispmt, reg, xn2, size_spec));
}
case 4: // 4ebc
case 5: // 4ebd
@@ -131,7 +137,9 @@ size_t m68k_disasm(
if ((instr & 0xfff0) == 0x4e70) {
return disasm_mfff0_v4e70(out, out_sz, instr_sz, instr, offset, code);
} else if ((instr & 0xffc0) == 0x4e80) {
- return disasm_jsr(out, out_sz, instr_sz, instr, offset, code);
+ return disasm_jsr_jmp(out, out_sz, instr_sz, instr, offset, code, JsrJmp::kJsr);
+ } else if ((instr & 0xffc0) == 0x4ec0) {
+ return disasm_jsr_jmp(out, out_sz, instr_sz, instr, offset, code, JsrJmp::kJmp);
}
return disasm_verbatim(out, out_sz, instr_sz, instr, offset, code);
}