summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--68kinst.c12
-rw-r--r--dis.c6
2 files changed, 7 insertions, 11 deletions
diff --git a/68kinst.c b/68kinst.c
index da7e00d..2d4dc4e 100644
--- a/68kinst.c
+++ b/68kinst.c
@@ -683,26 +683,22 @@ uint16_t * m68k_decode(uint16_t * istream, m68kinst * decoded, uint32_t address)
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 --git a/dis.c b/dis.c
index be943f9..c6357d8 100644
--- a/dis.c
+++ b/dis.c
@@ -26,7 +26,7 @@ deferred * defer(uint32_t address, deferred * next)
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 @@ int main(int argc, char ** argv)
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) {