comparison m68k_to_x86.c @ 210:4beaad3a9a50

Fix movem reg to mem for certain addressing modes
author Mike Pavone <pavone@retrodev.com>
date Sun, 27 Jan 2013 13:07:26 -0800
parents 922b59c09259
children 464513050c85
comparison
equal deleted inserted replaced
209:922b59c09259 210:4beaad3a9a50
1162 uint8_t early_cycles; 1162 uint8_t early_cycles;
1163 if(inst->src.addr_mode == MODE_REG) { 1163 if(inst->src.addr_mode == MODE_REG) {
1164 //reg to mem 1164 //reg to mem
1165 early_cycles = 8; 1165 early_cycles = 8;
1166 int8_t dir; 1166 int8_t dir;
1167 if (inst->dst.addr_mode == MODE_AREG_PREDEC) {
1168 reg = 15;
1169 dir = -1;
1170 } else {
1171 reg = 0;
1172 dir = 1;
1173 }
1174 switch (inst->dst.addr_mode) 1167 switch (inst->dst.addr_mode)
1175 { 1168 {
1176 case MODE_AREG_INDIRECT: 1169 case MODE_AREG_INDIRECT:
1177 case MODE_AREG_PREDEC: 1170 case MODE_AREG_PREDEC:
1178 if (opts->aregs[inst->dst.params.regs.pri] >= 0) { 1171 if (opts->aregs[inst->dst.params.regs.pri] >= 0) {
1283 break; 1276 break;
1284 default: 1277 default:
1285 m68k_disasm(inst, disasm_buf); 1278 m68k_disasm(inst, disasm_buf);
1286 printf("%X: %s\naddress mode %d not implemented (movem dst)\n", inst->address, disasm_buf, inst->dst.addr_mode); 1279 printf("%X: %s\naddress mode %d not implemented (movem dst)\n", inst->address, disasm_buf, inst->dst.addr_mode);
1287 exit(1); 1280 exit(1);
1281 }
1282 if (inst->dst.addr_mode == MODE_AREG_PREDEC) {
1283 reg = 15;
1284 dir = -1;
1285 } else {
1286 reg = 0;
1287 dir = 1;
1288 } 1288 }
1289 dst = cycles(dst, early_cycles); 1289 dst = cycles(dst, early_cycles);
1290 for(bit=0; reg < 16 && reg >= 0; reg += dir, bit++) { 1290 for(bit=0; reg < 16 && reg >= 0; reg += dir, bit++) {
1291 if (inst->src.params.immed & (1 << bit)) { 1291 if (inst->src.params.immed & (1 << bit)) {
1292 if (inst->dst.addr_mode == MODE_AREG_PREDEC) { 1292 if (inst->dst.addr_mode == MODE_AREG_PREDEC) {