comparison m68k_to_x86.c @ 159:c1530501c215

FIx movem when src is reg list and dst is not a areg predec mode
author Mike Pavone <pavone@retrodev.com>
date Sat, 05 Jan 2013 01:31:28 -0800
parents a2ab895d9708
children 6748022656b7
comparison
equal deleted inserted replaced
158:a2ab895d9708 159:c1530501c215
981 if (inst->dst.addr_mode == MODE_AREG_PREDEC) { 981 if (inst->dst.addr_mode == MODE_AREG_PREDEC) {
982 reg = 15; 982 reg = 15;
983 dir = -1; 983 dir = -1;
984 } else { 984 } else {
985 reg = 0; 985 reg = 0;
986 dir = 1;
986 } 987 }
987 switch (inst->dst.addr_mode) 988 switch (inst->dst.addr_mode)
988 { 989 {
989 case MODE_AREG_INDIRECT: 990 case MODE_AREG_INDIRECT:
990 case MODE_AREG_PREDEC: 991 case MODE_AREG_PREDEC:
3109 opts->code_end = opts->cur_code + size; 3110 opts->code_end = opts->cur_code + size;
3110 jmp(dst, opts->cur_code); 3111 jmp(dst, opts->cur_code);
3111 dst = opts->cur_code; 3112 dst = opts->cur_code;
3112 dst_end = opts->code_end; 3113 dst_end = opts->code_end;
3113 } 3114 }
3115 if (address >= 0x400000 && address < 0xE00000) {
3116 dst = xor_rr(dst, RDI, RDI, SZ_D);
3117 dst = call(dst, (uint8_t *)exit);
3118 break;
3119 }
3114 next = m68k_decode(encoded, &instbuf, address); 3120 next = m68k_decode(encoded, &instbuf, address);
3115 address += (next-encoded)*2; 3121 address += (next-encoded)*2;
3116 encoded = next; 3122 encoded = next;
3117 //m68k_disasm(&instbuf, disbuf); 3123 //m68k_disasm(&instbuf, disbuf);
3118 //printf("%X: %s\n", instbuf.address, disbuf); 3124 //printf("%X: %s\n", instbuf.address, disbuf);