Mercurial > repos > blastem
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; |