comparison 68kinst.c @ 61:918468c623e9

Add support for BTST instruction (untested), absolute addressing mode for instructions other than move (untested) and fix decoding of MOVEM.
author Mike Pavone <pavone@retrodev.com>
date Wed, 19 Dec 2012 20:23:59 -0800
parents 6ffea8607730
children b37cb596bc21
comparison
equal deleted inserted replaced
60:6ffea8607730 61:918468c623e9
122 decoded->op = M68K_BSET; 122 decoded->op = M68K_BSET;
123 break; 123 break;
124 } 124 }
125 decoded->src.addr_mode = MODE_REG; 125 decoded->src.addr_mode = MODE_REG;
126 decoded->src.params.regs.pri = m68k_reg_quick_field(*istream); 126 decoded->src.params.regs.pri = m68k_reg_quick_field(*istream);
127 decoded->extra.size = OPSIZE_LONG; 127 decoded->extra.size = OPSIZE_BYTE;
128 istream = m68k_decode_op(istream, OPSIZE_LONG, &(decoded->dst)); 128 istream = m68k_decode_op(istream, decoded->extra.size, &(decoded->dst));
129 if (decoded->dst.addr_mode == MODE_REG) {
130 decoded->extra.size = OPSIZE_LONG;
131 }
129 } else if ((*istream & 0xF00) == 0x800) { 132 } else if ((*istream & 0xF00) == 0x800) {
130 //BTST, BCHG, BCLR, BSET 133 //BTST, BCHG, BCLR, BSET
131 switch ((*istream >> 6) & 0x3) 134 switch ((*istream >> 6) & 0x3)
132 { 135 {
133 case 0: 136 case 0:
143 decoded->op = M68K_BSET; 146 decoded->op = M68K_BSET;
144 break; 147 break;
145 } 148 }
146 opmode = (*istream >> 3) & 0x7; 149 opmode = (*istream >> 3) & 0x7;
147 reg = *istream & 0x7; 150 reg = *istream & 0x7;
148 decoded->src.addr_mode = MODE_IMMEDIATE; 151 decoded->src.addr_mode = MODE_IMMEDIATE_WORD;
149 decoded->src.params.immed = *(++istream) & 0xFF; 152 decoded->src.params.immed = *(++istream) & 0xFF;
150 decoded->extra.size = OPSIZE_BYTE; 153 decoded->extra.size = OPSIZE_BYTE;
151 istream = m68k_decode_op_ex(istream, opmode, reg, OPSIZE_BYTE, &(decoded->dst)); 154 istream = m68k_decode_op_ex(istream, opmode, reg, decoded->extra.size, &(decoded->dst));
155 if (decoded->dst.addr_mode == MODE_REG) {
156 decoded->extra.size = OPSIZE_LONG;
157 }
152 } else if ((*istream & 0xC0) == 0xC0) { 158 } else if ((*istream & 0xC0) == 0xC0) {
153 #ifdef M68020 159 #ifdef M68020
154 //CMP2, CHK2, CAS, CAS2, RTM, CALLM 160 //CMP2, CHK2, CAS, CAS2, RTM, CALLM
155 #endif 161 #endif
156 } else { 162 } else {
405 istream = m68k_decode_op(istream, decoded->extra.size, &(decoded->src)); 411 istream = m68k_decode_op(istream, decoded->extra.size, &(decoded->src));
406 decoded->dst.addr_mode = MODE_REG; 412 decoded->dst.addr_mode = MODE_REG;
407 decoded->dst.addr_mode = m68k_reg_quick_field(*istream); 413 decoded->dst.addr_mode = m68k_reg_quick_field(*istream);
408 } else { 414 } else {
409 opmode = (*istream >> 3) & 0x7; 415 opmode = (*istream >> 3) & 0x7;
410 if ((*istream & 0xB80) == 0x880 && opmode != MODE_REG && opmode != MODE_AREG && opmode != MODE_AREG_POSTINC) { 416 if ((*istream & 0xB80) == 0x880 && opmode != MODE_REG && opmode != MODE_AREG) {
417 //TODO: Check for invalid modes that are dependent on direction
411 decoded->op = M68K_MOVEM; 418 decoded->op = M68K_MOVEM;
412 decoded->extra.size = *istream & 0x40 ? OPSIZE_LONG : OPSIZE_WORD; 419 decoded->extra.size = *istream & 0x40 ? OPSIZE_LONG : OPSIZE_WORD;
413 reg = *istream & 0x7; 420 reg = *istream & 0x7;
414 immed = *(++istream); 421 immed = *(++istream);
415 if(*istream & 0x400) { 422 if(*istream & 0x400) {
1141 case MODE_AREG_PREDEC: 1148 case MODE_AREG_PREDEC:
1142 return sprintf(dst, "%s -(a%d)", c, decoded->params.regs.pri); 1149 return sprintf(dst, "%s -(a%d)", c, decoded->params.regs.pri);
1143 case MODE_AREG_DISPLACE: 1150 case MODE_AREG_DISPLACE:
1144 return sprintf(dst, "%s (a%d, %d)", c, decoded->params.regs.pri, decoded->params.regs.displacement); 1151 return sprintf(dst, "%s (a%d, %d)", c, decoded->params.regs.pri, decoded->params.regs.displacement);
1145 case MODE_IMMEDIATE: 1152 case MODE_IMMEDIATE:
1153 case MODE_IMMEDIATE_WORD:
1146 return sprintf(dst, "%s #%d", c, decoded->params.immed); 1154 return sprintf(dst, "%s #%d", c, decoded->params.immed);
1147 case MODE_ABSOLUTE_SHORT: 1155 case MODE_ABSOLUTE_SHORT:
1148 return sprintf(dst, "%s $%X.w", c, decoded->params.immed); 1156 return sprintf(dst, "%s $%X.w", c, decoded->params.immed);
1149 case MODE_ABSOLUTE: 1157 case MODE_ABSOLUTE:
1150 return sprintf(dst, "%s $%X", c, decoded->params.immed); 1158 return sprintf(dst, "%s $%X", c, decoded->params.immed);