# HG changeset patch # User Mike Pavone # Date 1352913880 28800 # Node ID 4553fc97b15e74a7ae33ec8d464727313266adb2 # Parent 0a0cd3705c19d99824c7a9f0d4cb7a82984cb892 Added new OPSIZE for unsized instructions so they can be properly disassembled without making them special cases diff -r 0a0cd3705c19 -r 4553fc97b15e 68kinst.c --- a/68kinst.c Tue Nov 13 18:26:43 2012 -0800 +++ b/68kinst.c Wed Nov 14 09:24:40 2012 -0800 @@ -473,8 +473,8 @@ #ifdef M68010 decoded->op = M68K_BKPT; decoded->src.addr_mode = MODE_IMMEDIATE; - decoded->extra.size = OPSIZE_BYTE; - decoded->src.params.u8 = *istream & 0x7; + decoded->extra.size = OPSIZE_UNSIZED; + decoded->src.params.u32 = *istream & 0x7; #endif break; case 0x10: @@ -512,6 +512,7 @@ //BGND - CPU32 only } else if (optype == 0xFC) { decoded->op = M68K_ILLEGAL; + decoded->extra.size = OPSIZE_UNSIZED; } else { if (size == OPSIZE_INVALID) { decoded->op = M68K_TAS; @@ -537,7 +538,8 @@ } else { decoded->op = M68K_JSR; } - istream = m68k_decode_op(istream, OPSIZE_INVALID, &(decoded->src)); + decoded->extra.size = OPSIZE_UNSIZED; + istream = m68k_decode_op(istream, OPSIZE_UNSIZED, &(decoded->src)); } else { //it would appear bit 6 needs to be set for it to be a valid instruction here switch((*istream >> 3) & 0x7) @@ -546,9 +548,9 @@ case 1: //TRAP decoded->op = M68K_TRAP; - decoded->extra.size = OPSIZE_BYTE; + decoded->extra.size = OPSIZE_UNSIZED; decoded->src.addr_mode = MODE_IMMEDIATE; - decoded->src.params.u8 = *istream & 0xF; + decoded->src.params.u32 = *istream & 0xF; break; case 2: //LINK.w @@ -562,6 +564,7 @@ case 3: //UNLK decoded->op = M68K_UNLK; + decoded->extra.size = OPSIZE_UNSIZED; decoded->dst.addr_mode = MODE_AREG; decoded->dst.params.regs.pri = *istream & 0x7; break; @@ -578,6 +581,7 @@ } break; case 6: + decoded->extra.size = OPSIZE_UNSIZED; switch(*istream & 0x7) { case 0: @@ -588,9 +592,8 @@ break; case 2: decoded->op = M68K_STOP; - decoded->extra.size = OPSIZE_WORD; decoded->src.addr_mode = MODE_IMMEDIATE; - decoded->src.params.u16 =*(++istream); + decoded->src.params.u32 =*(++istream); break; case 3: decoded->op = M68K_RTE; @@ -598,9 +601,8 @@ case 4: #ifdef M68010 decoded->op = M68K_RTD; - decoded->extra.size = OPSIZE_WORD; decoded->src.addr_mode = MODE_IMMEDIATE; - decoded->src.params.u16 =*(++istream); + decoded->src.params.u32 =*(++istream); #endif break; case 5: @@ -1080,7 +1082,7 @@ case MODE_AREG_PREDEC: return sprintf(dst, "%s -(a%d)", c, decoded->params.regs.pri); case MODE_IMMEDIATE: - return sprintf(dst, "%s #%d", c, size == OPSIZE_LONG ? decoded->params.u32 : (size == OPSIZE_WORD ? decoded->params.u16 : decoded->params.u8)); + return sprintf(dst, "%s #%d", c, (size == OPSIZE_LONG || size == OPSIZE_UNSIZED) ? decoded->params.u32 : (size == OPSIZE_WORD ? decoded->params.u16 : decoded->params.u8)); default: return 0; } @@ -1102,10 +1104,10 @@ ret = sprintf(dst, "bsr%s", decoded->variant == VAR_BYTE ? ".s" : ""); } else { size = decoded->extra.size; - ret = sprintf(dst, "%s%s.%c", + ret = sprintf(dst, "%s%s.%s", mnemonics[decoded->op], decoded->variant == VAR_QUICK ? "q" : (decoded->variant == VAR_IMMEDIATE ? "i" : ""), - decoded->extra.size == OPSIZE_BYTE ? 'b' : (size == OPSIZE_WORD ? 'w' : 'l')); + size == OPSIZE_BYTE ? "b" : (size == OPSIZE_WORD ? "w" : (size == OPSIZE_LONG ? "l" : ""))); } op1len = m68K_disasm_op(&(decoded->src), size, dst + ret, 0); ret += op1len; diff -r 0a0cd3705c19 -r 4553fc97b15e 68kinst.h --- a/68kinst.h Tue Nov 13 18:26:43 2012 -0800 +++ b/68kinst.h Wed Nov 14 09:24:40 2012 -0800 @@ -105,7 +105,8 @@ OPSIZE_BYTE=0, OPSIZE_WORD, OPSIZE_LONG, - OPSIZE_INVALID + OPSIZE_INVALID, + OPSIZE_UNSIZED } m68K_opsizes; typedef enum {