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