From: Toni Wilen Date: Sat, 2 May 2015 16:22:03 +0000 (+0300) Subject: More compatible/cycle-exact FBcc and FDBcc fix. X-Git-Tag: 3100~41 X-Git-Url: https://git.unchartedbackwaters.co.uk/w/?a=commitdiff_plain;h=e89297fe6c39b0112db1f84c04b8553731b3ac9b;p=francis%2Fwinuae.git More compatible/cycle-exact FBcc and FDBcc fix. --- diff --git a/fpp.cpp b/fpp.cpp index cc6cfc75..ff254d55 100644 --- a/fpp.cpp +++ b/fpp.cpp @@ -1886,8 +1886,10 @@ void fpuop_dbcc (uae_u32 opcode, uae_u16 extra) m68k_dreg (regs, reg) = ((m68k_dreg (regs, reg) & 0xffff0000) | (((m68k_dreg (regs, reg) & 0xffff) - 1) & 0xffff)); - if ((m68k_dreg (regs, reg) & 0xffff) != 0xffff) + if ((m68k_dreg (regs, reg) & 0xffff) != 0xffff) { m68k_setpc (pc + disp); + regs.fp_branch = true; + } } } @@ -1971,6 +1973,7 @@ void fpuop_bcc (uae_u32 opcode, uaecptr oldpc, uae_u32 extra) if ((opcode & 0x40) == 0) extra = (uae_s32) (uae_s16) extra; m68k_setpc (oldpc + extra); + regs.fp_branch = true; } } diff --git a/gencpu.cpp b/gencpu.cpp index 5a1feb8a..65ead649 100644 --- a/gencpu.cpp +++ b/gencpu.cpp @@ -5132,6 +5132,11 @@ bccl_not68020: printf ("\tfpuop_dbcc (opcode, extra);\n"); if (using_prefetch || using_prefetch_020) { printf ("\tif (regs.fp_exception) goto %s;\n", endlabelstr); + printf ("\tif (regs.fp_branch) {\n"); + printf ("\t\tregs.fp_branch = false;\n"); + printf ("\t\tfill_prefetch();\n"); + printf ("\t\tgoto %s;\n", endlabelstr); + printf ("\t}\n"); need_endlabel = 1; } break; @@ -5168,6 +5173,11 @@ bccl_not68020: printf ("\tfpuop_bcc (opcode, pc,extra);\n"); if (using_prefetch || using_prefetch_020) { printf ("\tif (regs.fp_exception) goto %s;\n", endlabelstr); + printf ("\tif (regs.fp_branch) {\n"); + printf ("\t\tregs.fp_branch = false;\n"); + printf ("\t\tfill_prefetch();\n"); + printf ("\t\tgoto %s;\n", endlabelstr); + printf ("\t}\n"); need_endlabel = 1; } break; diff --git a/include/newcpu.h b/include/newcpu.h index 5f9232fb..3ee191a5 100644 --- a/include/newcpu.h +++ b/include/newcpu.h @@ -180,6 +180,7 @@ struct regstruct uae_u16 exp_opcode, exp_extra, exp_type; uae_u16 exp_size; bool fp_exception; + bool fp_branch; #endif #ifndef CPUEMU_68000_ONLY uae_u32 cacr, caar;