]> git.unchartedbackwaters.co.uk Git - francis/winuae.git/commitdiff
More compatible/cycle-exact FBcc and FDBcc fix.
authorToni Wilen <twilen@winuae.net>
Sat, 2 May 2015 16:22:03 +0000 (19:22 +0300)
committerToni Wilen <twilen@winuae.net>
Sat, 2 May 2015 16:22:03 +0000 (19:22 +0300)
fpp.cpp
gencpu.cpp
include/newcpu.h

diff --git a/fpp.cpp b/fpp.cpp
index cc6cfc754395d40fb3f705c5c42a5f86e3128d5d..ff254d551bf9d4a5914c5b054d180d4b23329640 100644 (file)
--- 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;
        }
 }
 
index 5a1feb8aa958ff536e6d07d187d6acc3902745ba..65ead6490fee7af5dae0595ad57d92a8b6f02fb4 100644 (file)
@@ -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;
index 5f9232fb81b68f9410938fbd513157017599e881..3ee191a52609f08717eab57b8f7db4ab799cc0dd 100644 (file)
@@ -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;