# HG changeset patch # User Mike Pavone # Date 1352527286 28800 # Node ID 23b83d94c633fa6aa4bf8959505fdbdb3c183ff6 # Parent a74c2969e8f3a4a4ba48cb0445c649d80b42068b Finish bit/movep/immediate group except for 68020 instructions diff -r a74c2969e8f3 -r 23b83d94c633 68kinst.c --- a/68kinst.c Tue Nov 06 02:07:45 2012 -0800 +++ b/68kinst.c Fri Nov 09 22:01:26 2012 -0800 @@ -124,6 +124,11 @@ decoded->src.addr_mode = MODE_REG; decoded->src.params.regs.pri = m68K_reg_quick_field(*istream); istream = m68k_decode_op(istream, OPSIZE_LONG, &(decoded->dst)); + } else if ((*istream & 0xF00) == 0x800) { + } else if ((*istream & 0xC0) == 0xC0) { +#ifdef M68020 + //CMP2, CHK2, CAS, CAS2, RTM, CALLM +#endif } else { switch ((*istream >> 9) & 0x7) { @@ -139,36 +144,30 @@ decoded->src.addr_mode = MODE_IMMEDIATE; decoded->src.params.u16 = *(++istream); } else { - //ORI, CMP2.b, CHK2.b - if ((*istream & 0xC0) != 0xC0) { - decoded->op = M68K_OR; - decoded->src.addr_mode = MODE_IMMEDIATE; - decoded->extra.size = size = (*istream >> 6) & 3; - reg = *istream & 0x7; - opmode = (*istream >> 3) & 0x7; - switch (size) - { - case OPSIZE_BYTE: - decoded->src.params.u8 = *(++istream); - break; - case OPSIZE_WORD: - decoded->src.params.16 = *(++istream); - break; - case OPSIZE_LONG: - immed = *(++istream); - decoded->src.params.u32 = immed << 16 | *(++istream); - break; - } - istream = m68k_decode_op_ex(istream, opmode, reg, size, &(decoded->dst)); - } else { - #ifdef M68020 - //TODO: Implement me for 68020 support - #endif + decoded->op = M68K_OR; + decoded->variant = VAR_IMMEDIATE; + decoded->src.addr_mode = MODE_IMMEDIATE; + decoded->extra.size = size = (*istream >> 6) & 3; + reg = *istream & 0x7; + opmode = (*istream >> 3) & 0x7; + switch (size) + { + case OPSIZE_BYTE: + decoded->src.params.u8 = *(++istream); + break; + case OPSIZE_WORD: + decoded->src.params.u16 = *(++istream); + break; + case OPSIZE_LONG: + immed = *(++istream); + decoded->src.params.u32 = immed << 16 | *(++istream); + break; } + istream = m68k_decode_op_ex(istream, opmode, reg, size, &(decoded->dst)); } break; case 1: - //ANDI, ANDI to CCR, ANDI to SR, CMP2.w CHK2.w + //ANDI, ANDI to CCR, ANDI to SR if ((*istream & 0xFF) == 0x3C) { decoded->op = M68K_ANDI_CCR; decoded->extra.size = OPSIZE_BYTE; @@ -180,38 +179,8 @@ decoded->src.addr_mode = MODE_IMMEDIATE; decoded->src.params.u16 = *(++istream); } else { - //ANDI, CMP2.w, CHK2.w - if ((*istream & 0xC0) != 0xC0) { - decoded->op = M68K_AND; - decoded->src.addr_mode = MODE_IMMEDIATE; - decoded->extra.size = size = (*istream >> 6) & 3; - reg = *istream & 0x7; - opmode = (*istream >> 3) & 0x7; - switch (size) - { - case OPSIZE_BYTE: - decoded->src.params.u8 = *(++istream); - break; - case OPSIZE_WORD: - decoded->src.params.16 = *(++istream); - break; - case OPSIZE_LONG: - immed = *(++istream); - decoded->src.params.u32 = immed << 16 | *(++istream); - break; - } - istream = m68k_decode_op_ex(istream, opmode, reg, size, &(decoded->dst)); - } else { - #ifdef M68020 - //TODO: Implement me for 68020 support - #endif - } - } - break; - case 2: - //SUBI, CMP2.l, CHK2.l - if ((*istream & 0xC0) != 0xC0) { - decoded->op = M68K_SUB; + decoded->op = M68K_AND; + decoded->variant = VAR_IMMEDIATE; decoded->src.addr_mode = MODE_IMMEDIATE; decoded->extra.size = size = (*istream >> 6) & 3; reg = *istream & 0x7; @@ -222,7 +191,7 @@ decoded->src.params.u8 = *(++istream); break; case OPSIZE_WORD: - decoded->src.params.16 = *(++istream); + decoded->src.params.u16 = *(++istream); break; case OPSIZE_LONG: immed = *(++istream); @@ -230,39 +199,51 @@ break; } istream = m68k_decode_op_ex(istream, opmode, reg, size, &(decoded->dst)); - } else { - #ifdef M68020 - //TODO: Implement me for 68020 support - #endif } break; + case 2: + decoded->op = M68K_SUB; + decoded->variant = VAR_IMMEDIATE; + decoded->src.addr_mode = MODE_IMMEDIATE; + decoded->extra.size = size = (*istream >> 6) & 3; + reg = *istream & 0x7; + opmode = (*istream >> 3) & 0x7; + switch (size) + { + case OPSIZE_BYTE: + decoded->src.params.u8 = *(++istream); + break; + case OPSIZE_WORD: + decoded->src.params.u16 = *(++istream); + break; + case OPSIZE_LONG: + immed = *(++istream); + decoded->src.params.u32 = immed << 16 | *(++istream); + break; + } + istream = m68k_decode_op_ex(istream, opmode, reg, size, &(decoded->dst)); + break; case 3: - //RTM, CALLM, ADDI - if ((*istream & 0xC0) != 0xC0) { - decoded->op = M68K_ADD; - decoded->src.addr_mode = MODE_IMMEDIATE; - decoded->extra.size = size = (*istream >> 6) & 3; - reg = *istream & 0x7; - opmode = (*istream >> 3) & 0x7; - switch (size) - { - case OPSIZE_BYTE: - decoded->src.params.u8 = *(++istream); - break; - case OPSIZE_WORD: - decoded->src.params.16 = *(++istream); - break; - case OPSIZE_LONG: - immed = *(++istream); - decoded->src.params.u32 = immed << 16 | *(++istream); - break; - } - istream = m68k_decode_op_ex(istream, opmode, reg, size, &(decoded->dst)); - } else { - #ifdef M68020 - //TODO: Implement me for 68020 support - #endif + decoded->op = M68K_ADD; + decoded->variant = VAR_IMMEDIATE; + decoded->src.addr_mode = MODE_IMMEDIATE; + decoded->extra.size = size = (*istream >> 6) & 3; + reg = *istream & 0x7; + opmode = (*istream >> 3) & 0x7; + switch (size) + { + case OPSIZE_BYTE: + decoded->src.params.u8 = *(++istream); + break; + case OPSIZE_WORD: + decoded->src.params.u16 = *(++istream); + break; + case OPSIZE_LONG: + immed = *(++istream); + decoded->src.params.u32 = immed << 16 | *(++istream); + break; } + istream = m68k_decode_op_ex(istream, opmode, reg, size, &(decoded->dst)); break; case 4: //BTST, BCHG, BCLR, BSET @@ -298,34 +279,69 @@ decoded->src.addr_mode = MODE_IMMEDIATE; decoded->src.params.u16 = *(++istream); } else { - //EORI, CMP2.w, CHK2.w - if ((*istream & 0xC0) != 0xC0) { - decoded->op = M68K_EOR; - decoded->src.addr_mode = MODE_IMMEDIATE; - decoded->extra.size = size = (*istream >> 6) & 3; - reg = *istream & 0x7; - opmode = (*istream >> 3) & 0x7; - switch (size) - { - case OPSIZE_BYTE: - decoded->src.params.u8 = *(++istream); - break; - case OPSIZE_WORD: - decoded->src.params.16 = *(++istream); - break; - case OPSIZE_LONG: - immed = *(++istream); - decoded->src.params.u32 = immed << 16 | *(++istream); - break; - } - istream = m68k_decode_op_ex(istream, opmode, reg, size, &(decoded->dst)); + decoded->op = M68K_EOR; + decoded->variant = VAR_IMMEDIATE; + decoded->src.addr_mode = MODE_IMMEDIATE; + decoded->extra.size = size = (*istream >> 6) & 3; + reg = *istream & 0x7; + opmode = (*istream >> 3) & 0x7; + switch (size) + { + case OPSIZE_BYTE: + decoded->src.params.u8 = *(++istream); + break; + case OPSIZE_WORD: + decoded->src.params.u16 = *(++istream); + break; + case OPSIZE_LONG: + immed = *(++istream); + decoded->src.params.u32 = immed << 16 | *(++istream); + break; } + istream = m68k_decode_op_ex(istream, opmode, reg, size, &(decoded->dst)); } break; case 6: - + decoded->op = M68K_CMP; + decoded->variant = VAR_IMMEDIATE; + decoded->extra.size = (*istream >> 6) & 0x3; + decoded->src.addr_mode = MODE_IMMEDIATE; + reg = *istream & 0x7; + opmode = (*istream >> 3) & 0x7; + switch (decoded->extra.size) + { + case OPSIZE_BYTE: + decoded->src.params.u8 = *(++istream); + break; + case OPSIZE_WORD: + decoded->src.params.u16 = *(++istream); + break; + case OPSIZE_LONG: + immed = *(++istream); + decoded->src.params.u32 = (immed << 16) | *(++istream); + break; + } + istream = m68k_decode_op_ex(istream, opmode, reg, size, &(decoded->dst)); break; case 7: + //MOVEP + deocded->op = M68K_MOVEP; + decoded->extra.size = *istream & 0x40 ? OPSIZE_LONG : OPSIZE_WORD; + if (*istream & 0x80) { + //memory dest + decoded->src.addr_mode = MODE_REG; + decoded->src.params.regs.pri = m68K_reg_quick_field(*istream); + decoded->dst.addr_mode = MODE_AREG_DISPLACE; + decoded->dst.params.regs.pri = *istream & 0x7; + } else { + //memory source + decoded->dst.addr_mode = MODE_REG; + decoded->dst.params.regs.pri = m68K_reg_quick_field(*istream); + decoded->sr.addr_mode = MODE_AREG_DISPLACE; + decoded->sr.params.regs.pri = *istream & 0x7; + } + immed = *(++istream); + break; } } @@ -860,7 +876,7 @@ size = decoded->extra.size; ret = sprintf(dst, "%s%s.%c", mnemonics[decoded->op], - decoded->variant == VAR_QUICK ? "q" : "", + decoded->variant == VAR_QUICK ? "q" : (decoded->variant == VAR_IMMEDIATE ? "i" : ""), decoded->extra.size == OPSIZE_BYTE ? 'b' : (size == OPSIZE_WORD ? 'w' : 'l')); } op1len = m68K_disasm_op(&(decoded->src), size, dst + ret, 0); diff -r a74c2969e8f3 -r 23b83d94c633 68kinst.h --- a/68kinst.h Tue Nov 06 02:07:45 2012 -0800 +++ b/68kinst.h Fri Nov 09 22:01:26 2012 -0800 @@ -95,6 +95,7 @@ typedef enum { VAR_NORMAL, VAR_QUICK, + VAR_IMMEDIATE, VAR_BYTE, VAR_WORD, VAR_LONG diff -r a74c2969e8f3 -r 23b83d94c633 dis.c --- a/dis.c Tue Nov 06 02:07:45 2012 -0800 +++ b/dis.c Fri Nov 09 22:01:26 2012 -0800 @@ -18,13 +18,11 @@ fclose(f); for(cur = filebuf; cur - filebuf < (filesize/2); ++cur) { - //printf("%x:", *cur); *cur = (*cur >> 8) | (*cur << 8); - //printf("%x\n", *cur); } - for(cur = filebuf; (cur - filebuf) < (filesize/2); ++cur) + for(cur = filebuf; (cur - filebuf) < (filesize/2); ) { - printf("cur: %p: %x\n", cur, *cur); + //printf("cur: %p: %x\n", cur, *cur); cur = m68K_decode(cur, &instbuf); m68k_disasm(&instbuf, disbuf); puts(disbuf);