# HG changeset patch # User Mike Pavone # Date 1355420860 28800 # Node ID 4836d1f3841a75db01b0db632daabd9683e9cc0f # Parent d2e43d64e9995b1871cb3d6088a8ca0cc211cdc6 Fix shift rotate instruction decoding and improve disassembly of move USP and conditional branch instructions diff -r d2e43d64e999 -r 4836d1f3841a 68kinst.c --- a/68kinst.c Wed Dec 12 23:21:11 2012 -0800 +++ b/68kinst.c Thu Dec 13 09:47:40 2012 -0800 @@ -1008,11 +1008,14 @@ decoded->extra.size = (*istream >> 6) & 0x3; immed = (*istream >> 9) & 0x7; if (*istream & 0x100) { - decoded->src.addr_mode = MODE_IMMEDIATE; - decoded->src.params.immed = immed; - } else { decoded->src.addr_mode = MODE_REG; decoded->src.params.regs.pri = immed; + } else { + decoded->src.addr_mode = MODE_IMMEDIATE; + if (!immed) { + immed = 8; + } + decoded->src.params.immed = immed; } decoded->dst.addr_mode = MODE_REG; decoded->dst.params.regs.pri = *istream & 0x7; @@ -1067,7 +1070,7 @@ "move",//ccr "move",//from_sr "move",//sr - "move_usp", + "move",//usp "movem", "movep", "muls", @@ -1217,12 +1220,16 @@ ret = strlen(mnemonics[decoded->op]) - 2; memcpy(dst, mnemonics[decoded->op], ret); dst[ret] = 0; - strcat(dst, cond_mnem[decoded->extra.cond]); + strcpy(dst+ret, cond_mnem[decoded->extra.cond]); ret = strlen(dst); + if (decoded->op != M68K_SCC) { + ret += sprintf(dst+ret, " #%d <%X>", decoded->src.params.immed, decoded->address + 2 + decoded->src.params.immed); + return ret; + } break; case M68K_BSR: - ret = sprintf(dst, "bsr%s", decoded->variant == VAR_BYTE ? ".s" : ""); - break; + ret = sprintf(dst, "bsr%s #%d <%X>", decoded->variant == VAR_BYTE ? ".s" : "", decoded->src.params.immed, decoded->address + 2 + decoded->src.params.immed); + return ret; case M68K_MOVE_FROM_SR: ret = sprintf(dst, "%s", mnemonics[decoded->op]); ret += sprintf(dst + ret, " SR"); @@ -1241,6 +1248,16 @@ ret += m68k_disasm_op(&(decoded->src), dst + ret, 0); ret += sprintf(dst + ret, ", %s", special_op); return ret; + case M68K_MOVE_USP: + ret = sprintf(dst, "%s", mnemonics[decoded->op]); + if (decoded->src.addr_mode != MODE_UNUSED) { + ret += m68k_disasm_op(&(decoded->src), dst + ret, 0); + ret += sprintf(dst + ret, ", USP"); + } else { + ret += sprintf(dst + ret, "USP, "); + ret += m68k_disasm_op(&(decoded->dst), dst + ret, 0); + } + return ret; default: size = decoded->extra.size; ret = sprintf(dst, "%s%s%s",