comparison 68kinst.c @ 111:8b50d2c975b2

Fix decoding of Scc
author Mike Pavone <pavone@retrodev.com>
date Fri, 28 Dec 2012 15:34:24 -0800
parents d7789186ba5e
children 9eaba47c429d
comparison
equal deleted inserted replaced
110:a575808dd90b 111:8b50d2c975b2
681 case QUICK_ARITH_LOOP: 681 case QUICK_ARITH_LOOP:
682 size = (*istream >> 6) & 3; 682 size = (*istream >> 6) & 3;
683 if (size == 0x3) { 683 if (size == 0x3) {
684 //DBcc, TRAPcc or Scc 684 //DBcc, TRAPcc or Scc
685 m68k_decode_cond(*istream, decoded); 685 m68k_decode_cond(*istream, decoded);
686 switch ((*istream >> 3) & 0x7) 686 if (((*istream >> 3) & 0x7) == 1) {
687 {
688 case 1: //DBcc
689 decoded->op = M68K_DBCC; 687 decoded->op = M68K_DBCC;
690 decoded->src.addr_mode = MODE_IMMEDIATE; 688 decoded->src.addr_mode = MODE_IMMEDIATE;
691 decoded->dst.addr_mode = MODE_REG; 689 decoded->dst.addr_mode = MODE_REG;
692 decoded->dst.params.regs.pri = *istream & 0x7; 690 decoded->dst.params.regs.pri = *istream & 0x7;
693 decoded->src.params.immed = sign_extend16(*(++istream)); 691 decoded->src.params.immed = sign_extend16(*(++istream));
694 break; 692 } else if(((*istream >> 3) & 0x7) == 1 && (*istream & 0x7) > 1 && (*istream & 0x7) < 5) {
695 case 7: //TRAPcc
696 #ifdef M68020 693 #ifdef M68020
697 decoded->op = M68K_TRAPCC; 694 decoded->op = M68K_TRAPCC;
698 decoded->src.addr_mode = MODE_IMMEDIATE; 695 decoded->src.addr_mode = MODE_IMMEDIATE;
699 //TODO: Figure out what to do with OPMODE and optional extention words 696 //TODO: Figure out what to do with OPMODE and optional extention words
700 #endif 697 #endif
701 break; 698 } else {
702 default: //Scc
703 decoded->op = M68K_SCC; 699 decoded->op = M68K_SCC;
700 decoded->extra.cond = (*istream >> 8) & 0xF;
704 istream = m68k_decode_op(istream, OPSIZE_BYTE, &(decoded->dst)); 701 istream = m68k_decode_op(istream, OPSIZE_BYTE, &(decoded->dst));
705 break;
706 } 702 }
707 } else { 703 } else {
708 //ADDQ, SUBQ 704 //ADDQ, SUBQ
709 decoded->variant = VAR_QUICK; 705 decoded->variant = VAR_QUICK;
710 decoded->extra.size = size; 706 decoded->extra.size = size;