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