// BTST special case where destination is read access
fc = 2;
}
+ if (g_instr->mnemo == i_MVMEL && (g_instr->dmode == PC16 || g_instr->dmode == PC8r)) {
+ // MOVEM to registers
+ fc = 2;
+ }
printf("\t\texception2_%s(opcode, %sa + %d, %d);\n",
write ? "write" : "read", name, offset,
// printf ("\tint op_cycles = get_cycles ();\n");
}
-static void addop_ce020 (instr *curi, int subhead, int flags)
+static void addop_ce020 (struct instr *curi, int subhead, int flags)
{
if (isce020()) {
int h = curi->head;
static void genmovemel_ce (uae_u16 opcode)
{
int size = table68k[opcode].size == sz_long ? 4 : 2;
- printf ("\tuae_u16 mask = %s;\n", gen_nextiword (0));
- printf ("\tuae_u32 dmask = mask & 0xff, amask = (mask >> 8) & 0xff;\n");
+ printf("\tuae_u16 mask = %s;\n", gen_nextiword (0));
+ printf("\tuae_u32 dmask = mask & 0xff, amask = (mask >> 8) & 0xff;\n");
if (table68k[opcode].dmode == Ad8r || table68k[opcode].dmode == PC8r)
- addcycles000 (2);
- genamode (NULL, table68k[opcode].dmode, "dstreg", table68k[opcode].size, "src", 2, -1, GF_AA | GF_MOVE);
+ addcycles000(2);
+ genamode(NULL, table68k[opcode].dmode, "dstreg", table68k[opcode].size, "src", 2, -1, GF_AA | GF_MOVE);
movem_ex3(0);
- start_brace ();
+ start_brace();
if (table68k[opcode].size == sz_long) {
- printf ("\twhile (dmask) {\n");
- printf ("\t\tuae_u32 v = %s (srca) << 16;\n", srcw);
- printf ("\t\tv |= %s (srca + 2);\n", srcw);
- printf ("\t\tm68k_dreg (regs, movem_index1[dmask]) = v;\n");
- printf ("\t\tsrca += %d;\n", size);
- printf ("\t\tdmask = movem_next[dmask];\n");
+ printf("\twhile (dmask) {\n");
+ printf("\t\tuae_u32 v = %s (srca) << 16;\n", srcw);
+ check_bus_error("src", 0, 0, 1);
+ printf("\t\tv |= %s (srca + 2);\n", srcw);
+ check_bus_error("src", 2, 0, 1);
+ printf("\t\tm68k_dreg (regs, movem_index1[dmask]) = v;\n");
+ printf("\t\tsrca += %d;\n", size);
+ printf("\t\tdmask = movem_next[dmask];\n");
addcycles000_nonce("\t\t", 8);
- printf ("\t}\n");
- printf ("\twhile (amask) {\n");
- printf ("\t\tuae_u32 v = %s (srca) << 16;\n", srcw);
- printf ("\t\tv |= %s (srca + 2);\n", srcw);
- printf ("\t\tm68k_areg (regs, movem_index1[amask]) = v;\n");
- printf ("\t\tsrca += %d;\n", size);
- printf ("\t\tamask = movem_next[amask];\n");
+ printf("\t}\n");
+ printf("\twhile (amask) {\n");
+ printf("\t\tuae_u32 v = %s (srca) << 16;\n", srcw);
+ check_bus_error("src", 0, 0, 1);
+ printf("\t\tv |= %s (srca + 2);\n", srcw);
+ check_bus_error("src", 2, 0, 1);
+ printf("\t\tm68k_areg (regs, movem_index1[amask]) = v;\n");
+ printf("\t\tsrca += %d;\n", size);
+ printf("\t\tamask = movem_next[amask];\n");
addcycles000_nonce("\t\t", 8);
- printf ("\t}\n");
+ printf("\t}\n");
} else {
- printf ("\twhile (dmask) {\n");
- printf ("\t\tm68k_dreg (regs, movem_index1[dmask]) = (uae_s32)(uae_s16)%s (srca);\n", srcw);
- printf ("\t\tsrca += %d;\n", size);
- printf ("\t\tdmask = movem_next[dmask];\n");
+ printf("\twhile (dmask) {\n");
+ printf("\t\tuae_u32 v = (uae_s32)(uae_s16)%s (srca);\n", srcw);
+ check_bus_error("src", 0, 0, 1);
+ printf("\t\tm68k_dreg (regs, movem_index1[dmask]) = v;\n");
+ printf("\t\tsrca += %d;\n", size);
+ printf("\t\tdmask = movem_next[dmask];\n");
addcycles000_nonce("\t\t", 4);
- printf ("\t}\n");
- printf ("\twhile (amask) {\n");
- printf ("\t\tm68k_areg (regs, movem_index1[amask]) = (uae_s32)(uae_s16)%s (srca);\n", srcw);
- printf ("\t\tsrca += %d;\n", size);
- printf ("\t\tamask = movem_next[amask];\n");
+ printf("\t}\n");
+ printf("\twhile (amask) {\n");
+ printf("\t\tuae_u32 v = (uae_s32)(uae_s16)%s (srca);\n", srcw);
+ check_bus_error("src", 0, 0, 1);
+ printf("\t\tm68k_areg (regs, movem_index1[amask]) = v;\n");
+ printf("\t\tsrca += %d;\n", size);
+ printf("\t\tamask = movem_next[amask];\n");
addcycles000_nonce("\t\t", 4);
- printf ("\t}\n");
+ printf("\t}\n");
}
- printf ("\t%s (srca);\n", srcw); // and final extra word fetch that goes nowhere..
+ printf("\t%s (srca);\n", srcw); // and final extra word fetch that goes nowhere..
+ check_bus_error("src", 0, 0, 1);
count_read++;
if (table68k[opcode].dmode == Aipi)
- printf ("\tm68k_areg (regs, dstreg) = srca;\n");
+ printf("\tm68k_areg (regs, dstreg) = srca;\n");
count_ncycles++;
fill_prefetch_next ();
}
movem_ex3(1);
printf ("\twhile (amask) {\n");
printf ("\t\t%s (srca - 2, m68k_areg (regs, movem_index2[amask]));\n", dstw);
+ check_bus_error("src", -2, 1, 1);
printf ("\t\t%s (srca - 4, m68k_areg (regs, movem_index2[amask]) >> 16);\n", dstw);
+ check_bus_error("src", -4, 1, 1);
printf("\t\tsrca -= %d;\n", size);
printf ("\t\tamask = movem_next[amask];\n");
addcycles000_nonce("\t\t", 8);
printf ("\t}\n");
printf ("\twhile (dmask) {\n");
printf ("\t\t%s (srca - 2, m68k_dreg (regs, movem_index2[dmask]));\n", dstw);
+ check_bus_error("src", -2, 1, 1);
printf ("\t\t%s (srca - 4, m68k_dreg (regs, movem_index2[dmask]) >> 16);\n", dstw);
+ check_bus_error("src", -4, 1, 1);
printf("\t\tsrca -= %d;\n", size);
printf ("\t\tdmask = movem_next[dmask];\n");
addcycles000_nonce("\t\t", 8);
movem_ex3(1);
printf ("\twhile (dmask) {\n");
printf ("\t\t%s (srca, m68k_dreg (regs, movem_index1[dmask]) >> 16);\n", dstw);
+ check_bus_error("src", 0, 1, 1);
printf ("\t\t%s (srca + 2, m68k_dreg (regs, movem_index1[dmask]));\n", dstw);
+ check_bus_error("src", 2, 1, 1);
printf ("\t\tsrca += %d;\n", size);
printf ("\t\tdmask = movem_next[dmask];\n");
addcycles000_nonce("\t\t", 8);
printf ("\t}\n");
printf ("\twhile (amask) {\n");
printf ("\t\t%s (srca, m68k_areg (regs, movem_index1[amask]) >> 16);\n", dstw);
+ check_bus_error("src", 0, 1, 1);
printf ("\t\t%s (srca + 2, m68k_areg (regs, movem_index1[amask]));\n", dstw);
+ check_bus_error("src", 2, 1, 1);
printf ("\t\tsrca += %d;\n", size);
printf ("\t\tamask = movem_next[amask];\n");
addcycles000_nonce("\t\t", 8);
printf ("\twhile (amask) {\n");
printf ("\t\tsrca -= %d;\n", size);
printf ("\t\t%s (srca, m68k_areg (regs, movem_index2[amask]));\n", dstw);
+ check_bus_error("src", 0, 1, 1);
printf ("\tamask = movem_next[amask];\n");
addcycles000_nonce("\t\t", 4);
printf ("\t}\n");
printf ("\twhile (dmask) {\n");
printf ("\t\tsrca -= %d;\n", size);
printf ("\t\t%s (srca, m68k_dreg (regs, movem_index2[dmask]));\n", dstw);
+ check_bus_error("src", 0, 1, 1);
printf ("\t\tdmask = movem_next[dmask];\n");
addcycles000_nonce("\t\t", 4);
printf ("\t}\n");
movem_ex3(1);
printf ("\twhile (dmask) {\n");
printf ("\t\t%s (srca, m68k_dreg (regs, movem_index1[dmask]));\n", dstw);
+ check_bus_error("src", 0, 1, 1);
printf ("\t\tsrca += %d;\n", size);
printf ("\t\tdmask = movem_next[dmask];\n");
addcycles000_nonce("\t\t", 4);
printf ("\t}\n");
printf ("\twhile (amask) {\n");
printf ("\t\t%s (srca, m68k_areg (regs, movem_index1[amask]));\n", dstw);
+ check_bus_error("src", 0, 1, 1);
printf ("\t\tsrca += %d;\n", size);
printf ("\t\tamask = movem_next[amask];\n");
addcycles000_nonce("\t\t", 4);