comparison 68kinst.c @ 4:6f6a2d7cc889

Add support for some bit instructions and a few others in the same "category"
author Mike Pavone <pavone@retrodev.com>
date Sun, 04 Nov 2012 23:43:03 -0800
parents a4ad0e3e3e0e
children 85699517043f
comparison
equal deleted inserted replaced
3:a4ad0e3e3e0e 4:6f6a2d7cc889
93 93
94 uint16_t * m68K_decode(uint16_t * istream, m68kinst * decoded) 94 uint16_t * m68K_decode(uint16_t * istream, m68kinst * decoded)
95 { 95 {
96 uint8_t optype = *istream >> 12; 96 uint8_t optype = *istream >> 12;
97 uint8_t size; 97 uint8_t size;
98 uint8_t reg;
99 uint8_t opmode;
98 uint32_t immed; 100 uint32_t immed;
99 decoded->op = M68K_INVALID; 101 decoded->op = M68K_INVALID;
100 decoded->src.addr_mode = decoded->dst.addr_mode = MODE_UNUSED; 102 decoded->src.addr_mode = decoded->dst.addr_mode = MODE_UNUSED;
101 decoded->variant = VAR_NORMAL; 103 decoded->variant = VAR_NORMAL;
102 switch(optype) 104 switch(optype)
103 { 105 {
104 case BIT_MOVEP_IMMED: 106 case BIT_MOVEP_IMMED:
105 //TODO: Implement me 107 if (*istream & 0x100) {
108 //BTST, BCHG, BCLR, BSET
109 switch ((*istream >> 6) & 0x3)
110 {
111 case 0:
112 decoded->op = M68K_BTST;
113 break;
114 case 1:
115 decoded->op = M68K_BCHG;
116 break;
117 case 2:
118 decoded->op = M68K_BCLR;
119 break;
120 case 3:
121 decoded->op = M68K_BSET;
122 break;
123 }
124 decoded->src.addr_mode = MODE_REG;
125 decoded->src.params.regs.pri = m68K_reg_quick_field(*istream);
126 istream = m68k_decode_op(istream, OPSIZE_LONG, &(decoded->dst));
127 } else {
128 switch ((*istream >> 9) & 0x7)
129 {
130 case 0:
131 if ((*istream & 0xFF) == 0x3C) {
132 decoded->op = M68K_ORI_CCR;
133 decoded->extra.size = OPSIZE_BYTE;
134 decoded->src.addr_mode = MODE_IMMEDIATE;
135 decoded->src.params.u8 = *(++istream);
136 } else if((*istream & 0xFF) == 0x7C) {
137 decoded->op = M68K_ORI_SR;
138 decoded->extra.size = OPSIZE_WORD;
139 decoded->src.addr_mode = MODE_IMMEDIATE;
140 decoded->src.params.u16 = *(++istream);
141 } else {
142 //ORI, CMP2.b, CHK2.b
143 if ((*istream & 0xC0) != 0xC0) {
144 decoded->op = M68K_OR;
145 decoded->src.addr_mode = MODE_IMMEDIATE;
146 decoded->extra.size = size = (*istream >> 6) & 3;
147 reg = *istream & 0x7;
148 opmode = (*istream >> 3) & 0x7;
149 switch (size)
150 {
151 case OPSIZE_BYTE:
152 decoded->src.params.u8 = *(++istream);
153 break;
154 case OPSIZE_WORD:
155 decoded->src.params.16 = *(++istream);
156 break;
157 case OPSIZE_LONG:
158 immed = *(++istream);
159 decoded->src.params.u32 = immed << 16 | *(++istream);
160 break;
161 }
162 istream = m68k_decode_op_ex(istream, opmode, reg, size, &(decoded->dst));
163 } else {
164 #ifdef M68020
165 //TODO: Implement me for 68020 support
166 #endif
167 }
168 }
169 break;
170 case 1:
171 break;
172 case 2:
173 break;
174 case 3:
175 break;
176 case 4:
177 break;
178 case 5:
179 break;
180 case 6:
181 break;
182 case 7:
183 break;
184 }
185 }
106 break; 186 break;
107 case MOVE_BYTE: 187 case MOVE_BYTE:
108 case MOVE_LONG: 188 case MOVE_LONG:
109 case MOVE_WORD: 189 case MOVE_WORD:
110 decoded->op = M68K_MOVE; 190 decoded->op = M68K_MOVE;