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