about summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--src/emu/modrm.h66
-rwxr-xr-xsrc/emu/x64run.c1
-rw-r--r--src/emu/x64run0f.c8
3 files changed, 58 insertions, 17 deletions
diff --git a/src/emu/modrm.h b/src/emu/modrm.h
index 78dbddb3..d5479a1d 100644
--- a/src/emu/modrm.h
+++ b/src/emu/modrm.h
@@ -30,100 +30,132 @@
 #define EX  opex

 #define GX  opgx

 

-#define GOCOND(BASE, PREFIX, CONDITIONAL)       \

+#define GOCOND(BASE, PREFIX, COND, NOTCOND)     \

     case BASE+0x0:                              \

         PREFIX                                  \

         if(ACCESS_FLAG(F_OF)) {                 \

-            CONDITIONAL                         \

+            COND                                \

+        } else {                                \

+            NOTCOND                             \

         }                                       \

         break;                                  \

     case BASE+0x1:                              \

         PREFIX                                  \

         if(!ACCESS_FLAG(F_OF)) {                \

-            CONDITIONAL                         \

+            COND                                \

+        } else {                                \

+            NOTCOND                             \

         }                                       \

         break;                                  \

     case BASE+0x2:                              \

         PREFIX                                  \

         if(ACCESS_FLAG(F_CF)) {                 \

-            CONDITIONAL                         \

+            COND                                \

+        } else {                                \

+            NOTCOND                             \

         }                                       \

         break;                                  \

     case BASE+0x3:                              \

         PREFIX                                  \

         if(!ACCESS_FLAG(F_CF)) {                \

-            CONDITIONAL                         \

+            COND                                \

+        } else {                                \

+            NOTCOND                             \

         }                                       \

         break;                                  \

     case BASE+0x4:                              \

         PREFIX                                  \

         if(ACCESS_FLAG(F_ZF)) {                 \

-            CONDITIONAL                         \

+            COND                                \

+        } else {                                \

+            NOTCOND                             \

         }                                       \

         break;                                  \

     case BASE+0x5:                              \

         PREFIX                                  \

         if(!ACCESS_FLAG(F_ZF)) {                \

-            CONDITIONAL                         \

+            COND                                \

+        } else {                                \

+            NOTCOND                             \

         }                                       \

         break;                                  \

     case BASE+0x6:                              \

         PREFIX                                  \

         if((ACCESS_FLAG(F_ZF) || ACCESS_FLAG(F_CF))) {  \

-            CONDITIONAL                         \

+            COND                                \

+        } else {                                \

+            NOTCOND                             \

         }                                       \

         break;                                  \

     case BASE+0x7:                              \

         PREFIX                                  \

         if(!(ACCESS_FLAG(F_ZF) || ACCESS_FLAG(F_CF))) { \

-            CONDITIONAL                         \

+            COND                                \

+        } else {                                \

+            NOTCOND                             \

         }                                       \

         break;                                  \

     case BASE+0x8:                              \

         PREFIX                                  \

         if(ACCESS_FLAG(F_SF)) {                 \

-            CONDITIONAL                         \

+            COND                                \

+        } else {                                \

+            NOTCOND                             \

         }                                       \

         break;                                  \

     case BASE+0x9:                              \

         PREFIX                                  \

         if(!ACCESS_FLAG(F_SF)) {                \

-            CONDITIONAL                         \

+            COND                                \

+        } else {                                \

+            NOTCOND                             \

         }                                       \

         break;                                  \

     case BASE+0xA:                              \

         PREFIX                                  \

         if(ACCESS_FLAG(F_PF)) {                 \

-            CONDITIONAL                         \

+            COND                                \

+        } else {                                \

+            NOTCOND                             \

         }                                       \

         break;                                  \

     case BASE+0xB:                              \

         PREFIX                                  \

         if(!ACCESS_FLAG(F_PF)) {                \

-            CONDITIONAL                         \

+            COND                                \

+        } else {                                \

+            NOTCOND                             \

         }                                       \

         break;                                  \

     case BASE+0xC:                              \

         PREFIX                                  \

         if(ACCESS_FLAG(F_SF) != ACCESS_FLAG(F_OF)) {\

-            CONDITIONAL                         \

+            COND                                \

+        } else {                                \

+            NOTCOND                             \

         }                                       \

         break;                                  \

     case BASE+0xD:                              \

         PREFIX                                  \

         if(ACCESS_FLAG(F_SF) == ACCESS_FLAG(F_OF)) {\

-            CONDITIONAL                         \

+            COND                                \

+        } else {                                \

+            NOTCOND                             \

         }                                       \

         break;                                  \

     case BASE+0xE:                              \

         PREFIX                                  \

         if(ACCESS_FLAG(F_ZF) || (ACCESS_FLAG(F_SF) != ACCESS_FLAG(F_OF))) {\

-            CONDITIONAL                         \

+            COND                                \

+        } else {                                \

+            NOTCOND                             \

         }                                       \

         break;                                  \

     case BASE+0xF:                              \

         PREFIX                                  \

         if(!ACCESS_FLAG(F_ZF) && (ACCESS_FLAG(F_SF) == ACCESS_FLAG(F_OF))) {\

-            CONDITIONAL                         \

+            COND                                \

+        } else {                                \

+            NOTCOND                             \

         }                                       \

         break;

diff --git a/src/emu/x64run.c b/src/emu/x64run.c
index 03d40a1d..d54849fa 100755
--- a/src/emu/x64run.c
+++ b/src/emu/x64run.c
@@ -257,6 +257,7 @@ x64emurun:
         GOCOND(0x70
             ,   tmp8s = F8S; CHECK_FLAGS(emu);
             ,   R_RIP += tmp8s;
+            ,
             )                           /* Jxx Ib */
         
         case 0x80:                      /* GRP Eb,Ib */
diff --git a/src/emu/x64run0f.c b/src/emu/x64run0f.c
index 80f612f7..50867d5a 100644
--- a/src/emu/x64run0f.c
+++ b/src/emu/x64run0f.c
@@ -64,12 +64,20 @@ int Run0F(x64emu_t *emu, rex_t rex)
             GETGD;

             CHECK_FLAGS(emu);

             , if(rex.w) {GD->q[0] = ED->q[0]; } else {GD->dword[0] = ED->dword[0];}

+            ,

         )                               /* 0x40 -> 0x4F CMOVxx Gd,Ed */ // conditional move, no sign

         

         GOCOND(0x80

             , tmp32s = F32S; CHECK_FLAGS(emu);

             , R_RIP += tmp32s;

+            ,

         )                               /* 0x80 -> 0x8F Jxx */

+        GOCOND(0x90

+            , nextop = F8; CHECK_FLAGS(emu);

+            GETEB;

+            , EB->byte[0]=1;

+            , EB->byte[0]=0;

+        )                               /* 0x90 -> 0x9F SETxx Eb */

 

         case 0xA2:                      /* CPUID */

             tmp32u = R_EAX;