diff options
author | Oxore <oxore@protonmail.com> | 2023-04-22 01:01:30 +0300 |
---|---|---|
committer | Oxore <oxore@protonmail.com> | 2023-04-22 01:01:30 +0300 |
commit | 05ec3fc2f3b8f11e562954f81434a5623cd2f2a3 (patch) | |
tree | b7dd8c2a86bc82b4bf51c24a01b501f478176bd1 /disasm.cpp | |
parent | 8856f2ee0e19f50c4c4fb3dc7fccc8150a00da81 (diff) |
Impl JMP by simply reusing JSR
Diffstat (limited to 'disasm.cpp')
-rw-r--r-- | disasm.cpp | 30 |
1 files changed, 19 insertions, 11 deletions
@@ -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); } |