# HG changeset patch # User Mike Pavone # Date 1356737664 28800 # Node ID 8b50d2c975b29cf3fe0329a8e462144ad34834fb # Parent a575808dd90b623a861bc50399d00e679c035e0c Fix decoding of Scc diff -r a575808dd90b -r 8b50d2c975b2 68kinst.c --- a/68kinst.c Fri Dec 28 15:16:36 2012 -0800 +++ b/68kinst.c Fri Dec 28 15:34:24 2012 -0800 @@ -683,26 +683,22 @@ if (size == 0x3) { //DBcc, TRAPcc or Scc m68k_decode_cond(*istream, decoded); - switch ((*istream >> 3) & 0x7) - { - case 1: //DBcc + if (((*istream >> 3) & 0x7) == 1) { decoded->op = M68K_DBCC; decoded->src.addr_mode = MODE_IMMEDIATE; decoded->dst.addr_mode = MODE_REG; decoded->dst.params.regs.pri = *istream & 0x7; decoded->src.params.immed = sign_extend16(*(++istream)); - break; - case 7: //TRAPcc + } else if(((*istream >> 3) & 0x7) == 1 && (*istream & 0x7) > 1 && (*istream & 0x7) < 5) { #ifdef M68020 decoded->op = M68K_TRAPCC; decoded->src.addr_mode = MODE_IMMEDIATE; //TODO: Figure out what to do with OPMODE and optional extention words #endif - break; - default: //Scc + } else { decoded->op = M68K_SCC; + decoded->extra.cond = (*istream >> 8) & 0xF; istream = m68k_decode_op(istream, OPSIZE_BYTE, &(decoded->dst)); - break; } } else { //ADDQ, SUBQ diff -r a575808dd90b -r 8b50d2c975b2 dis.c --- a/dis.c Fri Dec 28 15:16:36 2012 -0800 +++ b/dis.c Fri Dec 28 15:34:24 2012 -0800 @@ -26,7 +26,7 @@ if (is_visited(address)) { return next; } - printf("deferring %X\n", address); + //printf("deferring %X\n", address); deferred * d = malloc(sizeof(deferred)); d->address = address; d->next = next; @@ -84,8 +84,8 @@ next = m68k_decode(encoded, &instbuf, address); address += (next-encoded)*2; encoded = next; - m68k_disasm(&instbuf, disbuf); - printf("%X: %s\n", instbuf.address, disbuf); + //m68k_disasm(&instbuf, disbuf); + //printf("%X: %s\n", instbuf.address, disbuf); if (instbuf.op == M68K_ILLEGAL || instbuf.op == M68K_RTS || instbuf.op == M68K_RTE) { break; } else if (instbuf.op == M68K_BCC || instbuf.op == M68K_DBCC || instbuf.op == M68K_BSR) {