]> git.unchartedbackwaters.co.uk Git - francis/winuae.git/commitdiff
Match FPCR and FPSR masking with real FPU.
authorToni Wilen <twilen@winuae.net>
Sun, 3 Jun 2018 16:23:42 +0000 (19:23 +0300)
committerToni Wilen <twilen@winuae.net>
Sun, 3 Jun 2018 16:23:42 +0000 (19:23 +0300)
fpp.cpp

diff --git a/fpp.cpp b/fpp.cpp
index aa27041342e38c80e34b4fb0ea4499c4e59d8200..2150a5e45eb7116a8b14c453c9b4c98fbe3897c7 100644 (file)
--- a/fpp.cpp
+++ b/fpp.cpp
@@ -665,7 +665,12 @@ uae_u32 fpp_get_fpsr (void)
                        regs.fpsr |= FPSR_CC_N;
        }
 #endif
-       return regs.fpsr;
+       return regs.fpsr & 0x0ffffff8;
+}
+
+static uae_u32 fpp_get_fpcr(void)
+{
+       return regs.fpcr & (currprefs.fpu_model == 68040 ? 0xffff : 0xfff0);
 }
 
 static void fpp_set_fpcr (uae_u32 val)
@@ -2825,9 +2830,9 @@ static void fpuop_arithmetic2 (uae_u32 opcode, uae_u16 extra)
                                        return;
                                if (extra & 0x2000) {
                                        if (extra & 0x1000)
-                                               m68k_dreg (regs, opcode & 7) = regs.fpcr & 0xffff;
+                                               m68k_dreg (regs, opcode & 7) = fpp_get_fpcr();
                                        if (extra & 0x0800)
-                                               m68k_dreg (regs, opcode & 7) = fpp_get_fpsr ();
+                                               m68k_dreg (regs, opcode & 7) = fpp_get_fpsr();
                                        if (extra & 0x0400)
                                                m68k_dreg (regs, opcode & 7) = regs.fpiar;
                                } else {
@@ -2843,9 +2848,9 @@ static void fpuop_arithmetic2 (uae_u32 opcode, uae_u16 extra)
                                        return;
                                if (extra & 0x2000) {
                                        if (extra & 0x1000)
-                                               m68k_areg (regs, opcode & 7) = regs.fpcr & 0xffff;
+                                               m68k_areg (regs, opcode & 7) = fpp_get_fpcr();
                                        if (extra & 0x0800)
-                                               m68k_areg (regs, opcode & 7) = fpp_get_fpsr ();
+                                               m68k_areg (regs, opcode & 7) = fpp_get_fpsr();
                                        if (extra & 0x0400)
                                                m68k_areg (regs, opcode & 7) = regs.fpiar;
                                } else {
@@ -2908,15 +2913,15 @@ static void fpuop_arithmetic2 (uae_u32 opcode, uae_u16 extra)
                                }
                                ad -= incr;
                                if (extra & 0x1000) {
-                                       x_cp_put_long (ad, regs.fpcr & 0xffff);
+                                       x_cp_put_long(ad, fpp_get_fpcr());
                                        ad += 4;
                                }
                                if (extra & 0x0800) {
-                                       x_cp_put_long (ad, fpp_get_fpsr ());
+                                       x_cp_put_long(ad, fpp_get_fpsr());
                                        ad += 4;
                                }
                                if (extra & 0x0400) {
-                                       x_cp_put_long (ad, regs.fpiar);
+                                       x_cp_put_long(ad, regs.fpiar);
                                        ad += 4;
                                }
                                ad -= incr;