return true;
}
-static void addmmufixup(const char *reg)
+static void addmmufixup(const char *reg, int size, int mode)
{
if (!needmmufixup())
return;
- printf("\tmmufixup[%d].reg = %s;\n", mmufixupcnt, reg);
+ int flags = 0;
+ if (cpu_level == 3 && size >= 0 && mode >= 0) {
+ if (mode == Aipi) {
+ flags |= 0x100;
+ } else if (mode == Apdi) {
+ flags |= 0x200;
+ }
+ if (size == sz_long) {
+ flags |= 0x800;
+ } else if (size == sz_word) {
+ flags |= 0x400;
+ }
+ }
+ printf("\tmmufixup[%d].reg = %s | 0x%x;\n", mmufixupcnt, reg, flags);
printf("\tmmufixup[%d].value = m68k_areg(regs, %s);\n", mmufixupcnt, reg);
mmufixupstate |= 1 << mmufixupcnt;
mmufixupcnt++;
else if (flags & GF_IR2IRC)
irc2ir (true);
+ if (!movem && (mode == Aipi || mode == Apdi)) {
+ addmmufixup(reg, size, mode);
+ }
+
if (getv == 1) {
const char *srcbx = !(flags & GF_FC) ? srcb : "sfc_nommu_get_byte";
const char *srcwx = !(flags & GF_FC) ? srcw : "sfc_nommu_get_word";
/* We now might have to fix up the register for pre-dec or post-inc
* addressing modes. */
- if (!movem)
+ if (!movem) {
switch (mode) {
case Aipi:
- addmmufixup (reg);
switch (size) {
case sz_byte:
printf("\tm68k_areg(regs, %s) += areg_byteinc[%s];\n", reg, reg);
printf("\tm68k_areg(regs, %s) += 4;\n", reg);
break;
default:
- term ();
+ term();
}
break;
case Apdi:
- addmmufixup (reg);
printf("\tm68k_areg(regs, %s) = %sa;\n", reg, name);
break;
default:
break;
+ }
}
if (movem == 3) {
// ce confirmed
// 68040 uses different order than other CPU models.
if (using_mmu) {
- addmmufixup("srcreg");
+ addmmufixup("srcreg", -1, -1);
genamode(NULL, curi->dmode, "dstreg", curi->size, "offs", GENA_GETV_FETCH, GENA_MOVEM_DO_INC, 0);
if (cpu_level == 4) {
genamode(NULL, Apdi, "7", sz_long, "old", GENA_GETV_FETCH_ALIGN, GENA_MOVEM_DO_INC, 0);
printf("\tm68k_dreg(regs, dstreg) = (m68k_dreg(regs, dstreg) & 0xffffff00) | ((val >> 4) & 0xf0) | (val & 0xf);\n");
} else {
printf("\tuae_u16 val;\n");
- addmmufixup ("srcreg");
+ addmmufixup("srcreg", curi->size, curi->smode);
printf("\tm68k_areg(regs, srcreg) -= 2;\n");
printf("\tval = (uae_u16)(%s(m68k_areg(regs, srcreg)));\n", srcw);
printf("\tval += %s;\n", gen_nextiword(0));
- addmmufixup ("dstreg");
+ addmmufixup("dstreg", curi->size, curi->dmode);
printf("\tm68k_areg(regs, dstreg) -= areg_byteinc[dstreg];\n");
gen_set_fault_pc (false, false);
printf("\t%s(m68k_areg(regs, dstreg),((val >> 4) & 0xf0) | (val & 0xf));\n", dstb);
printf("\tm68k_dreg(regs, dstreg) = (m68k_dreg(regs, dstreg) & 0xffff0000) | (val & 0xffff);\n");
} else {
printf("\tuae_u16 val;\n");
- addmmufixup ("srcreg");
+ addmmufixup ("srcreg", curi->size, curi->smode);
printf("\tm68k_areg(regs, srcreg) -= areg_byteinc[srcreg];\n");
printf("\tval = (uae_u16)(%s(m68k_areg(regs, srcreg)) & 0xff);\n", srcb);
printf("\tval = (((val << 4) & 0xf00) | (val & 0xf)) + %s;\n", gen_nextiword (0));
- addmmufixup ("dstreg");
+ addmmufixup ("dstreg", curi->size, curi->dmode);
printf("\tm68k_areg(regs, dstreg) -= 2;\n");
gen_set_fault_pc(false, false);
printf("\t%s(m68k_areg(regs, dstreg), val);\n", dstw);