static void write_return_cycles(const char *s, int end)
{
- if (!end) {
+ if (end <= 0) {
clearmmufixup(0, 1);
clearmmufixup(1, 1);
}
if (using_ce || using_prefetch) {
- if (count_read + count_write + count_cycles == 0)
- count_cycles = 4;
- returncycles(s, (count_read + count_write) * 4 + count_cycles);
- if (end) {
- printf("}\n");
- printf("/* %d%s (%d/%d)",
- (count_read + count_write) * 4 + count_cycles, count_ncycles ? "+" : "", count_read, count_write);
- printf(" */\n");
+ if (end < 0) {
+ if (using_ce) {
+ printf("%sreturn;\n", s);
+ } else {
+ printf("%sreturn 0;\n", s);
+ }
+ } else {
+ int cc = count_cycles;
+ if (count_read + count_write + cc == 0)
+ cc = 4;
+ returncycles(s, (count_read + count_write) * 4 + cc);
+ if (end) {
+ printf("}\n");
+ printf("/* %d%s (%d/%d)",
+ (count_read + count_write) * 4 + cc, count_ncycles ? "+" : "", count_read, count_write);
+ printf(" */\n");
+ }
}
} else if (count_read + count_write) {
- returncycles(s, (count_read + count_write) * 4 + count_cycles);
- if (end) {
- printf("}\n");
+ if (end < 0) {
+ if (using_ce020) {
+ printf("%sreturn;\n", s);
+ } else {
+ printf("%sreturn 0;\n", s);
+ }
+ } else {
+ returncycles(s, (count_read + count_write) * 4 + count_cycles);
+ if (end) {
+ printf("}\n");
+ }
}
} else {
- returncycles(s, insn_n_cycles);
- if (end) {
- printf("}\n");
+ if (end < 0) {
+ if (using_ce020) {
+ printf("%sreturn;\n", s);
+ } else {
+ printf("%sreturn 0;\n", s);
+ }
+ } else {
+ returncycles(s, insn_n_cycles);
+ if (end) {
+ printf("}\n");
+ }
}
}
}
term ();
if (store_dir) {
printf("\t%s(%sa + 2, %s);\n", dstwx, to, from);
+ count_write++;
check_bus_error(to, 0, 1, 1, from, 1);
check_bus_error(to, 2, 1, 1, from, 1);
if (opcode_nextcopy)
genflags(flag_logical, g_instr->size, "src", "", "");
}
printf("\t%s(%sa, %s >> 16); \n", dstwx, to, from);
+ count_write++;
sprintf(tmp, "%s >> 16", from);
check_bus_error(to, 0, 1, 1, from, 1);
check_bus_error(to, 0, 1, 1, tmp, 1);
} else {
printf("\t%s(%sa, %s >> 16);\n", dstwx, to, from);
+ count_write++;
sprintf(tmp, "%s >> 16", from);
check_bus_error(to, 0, 1, 1, from, 1);
check_bus_error(to, 0, 1, 1, tmp, 1);
if (flags & GF_SECONDWORDSETFLAGS) {
genflags(flag_logical, g_instr->size, "src", "", "");
}
+ count_write++;
printf("\t%s(%sa + 2, %s); \n", dstwx, to, from);
check_bus_error(to, 0, 1, 1, from, 1);
check_bus_error(to, 2, 1, 1, from, 1);
case 2: /* priviledged */
printf(
"\tif (!regs.s) {\n"
- "\t\tException (8);\n");
- write_return_cycles("\t\t", 0);
+ "\t\tException(8);\n");
+ write_return_cycles("\t\t", -1);
printf("\t}\n");
break;
case 3: /* privileged if size == word */
break;
printf(
"\tif (!regs.s) {\n"
- "\t\tException (8);\n");
- write_return_cycles("\t\t", 0);
+ "\t\tException(8);\n");
+ write_return_cycles("\t\t", -1);
printf("\t}\n");
break;
}
case i_EORSR:
next_level_000();
printf("\tMakeSR();\n");
- if (cpu_level == 0)
+ if (cpu_level == 0) {
printf("\tint t1 = regs.t1;\n");
+ }
genamode (curi, curi->smode, "srcreg", curi->size, "src", 1, 0, cpu_level == 1 ? GF_NOREFILL : 0);
if (curi->size == sz_byte) {
printf("\tsrc &= 0xFF;\n");
printf("\tuaecptr oldpc = %s;\n", getpc);
printf("\tuaecptr nextpc = oldpc + %d;\n", m68k_pc_offset);
if (using_exception_3 && cpu_level <= 1) {
+ push_ins_cnt();
printf("\tif (srca & 1) {\n");
if (curi->smode >= Ad16 && cpu_level == 1 && using_prefetch) {
dummy_prefetch("srca", NULL);
printf("\t\texception3i(opcode, srca);\n");
write_return_cycles("\t\t", 0);
printf("\t}\n");
+ pop_ins_cnt();
}
if (using_mmu) {
printf("\t%s(m68k_areg(regs, 7) - 4, nextpc);\n", dstl);
no_prefetch_ce020 = true;
genamode (curi, curi->smode, "srcreg", curi->size, "src", 0, 0, GF_AA|GF_NOREFILL);
if (using_exception_3) {
+ push_ins_cnt();
printf("\tif (srca & 1) {\n");
if (curi->smode >= Ad16 && cpu_level == 1 && using_prefetch) {
dummy_prefetch("srca", NULL);
printf("\t\texception3i(opcode, srca);\n");
write_return_cycles("\t\t", 0);
printf("\t}\n");
+ pop_ins_cnt();
}
if (curi->smode == Ad16 || curi->smode == absw || curi->smode == PC16)
addcycles000 (2);
genamodedual (curi,
curi->smode, "srcreg", sz_word, "src", 1, 0,
curi->dmode, "dstreg", sz_long, "dst", 1, 0);
+ push_ins_cnt();
printf("\tif (src == 0) {\n");
printf("\t\tdivbyzero_special(0, dst);\n");
incpc("%d", m68k_pc_offset);
printf("\t\tException_cpu(5);\n");
write_return_cycles("\t\t", 0);
printf("\t}\n");
+ pop_ins_cnt();
printf("\tuae_u32 newv = (uae_u32)dst / (uae_u32)(uae_u16)src;\n");
printf("\tuae_u32 rem = (uae_u32)dst %% (uae_u32)(uae_u16)src;\n");
if (using_ce) {
genamodedual(curi,
curi->smode, "srcreg", sz_word, "src", 1, 0,
curi->dmode, "dstreg", sz_long, "dst", 1, 0);
+ push_ins_cnt();
printf("\tif (src == 0) {\n");
printf("\t\tdivbyzero_special (1, dst);\n");
incpc("%d", m68k_pc_offset);
printf("\t\tException_cpu(5);\n");
write_return_cycles("\t\t", 0);
printf("\t}\n");
+ pop_ins_cnt();
if (using_ce) {
printf("\tint cycles = getDivs68kCycles((uae_s32)dst, (uae_s16)src);\n");
addcycles000_3("\t");