about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2021-03-08 21:07:56 +0100
committerptitSeb <sebastien.chev@gmail.com>2021-03-08 21:07:56 +0100
commit13214318124084f52103077a5560ac397cdce2a8 (patch)
tree3716a76011f4f53bab3a8caf62d6b74e5ceeb39f /src
parentd93a243738e98a58a97d6be7959f171e8b23f155 (diff)
downloadbox64-13214318124084f52103077a5560ac397cdce2a8.tar.gz
box64-13214318124084f52103077a5560ac397cdce2a8.zip
Added (F2/F3) AE (REPNZ/REPZ) SCASB opcode
Diffstat (limited to 'src')
-rwxr-xr-xsrc/emu/x64run.c34
1 files changed, 34 insertions, 0 deletions
diff --git a/src/emu/x64run.c b/src/emu/x64run.c
index c95a7fbb..9d6312d1 100755
--- a/src/emu/x64run.c
+++ b/src/emu/x64run.c
@@ -482,6 +482,40 @@ x64emurun:
             if(rep)
                 R_RCX = tmp64u;
             break;
+        
+        case 0xAE:                      /* (REPZ/REPNE) SCASB */
+            tmp8s = ACCESS_FLAG(F_DF)?-1:+1;
+            switch(rep) {
+                case 1:
+                    tmp64u = R_RCX;
+                    while(tmp64u) {
+                        --tmp64u;
+                        tmp8u = *(uint8_t*)R_RDI;
+                        R_RDI += tmp8s;
+                        if(R_AL==tmp8u)
+                            break;
+                    }
+                    if(tmp64u) cmp8(emu, R_AL, tmp8u);
+                    R_RCX = tmp64u;
+                    break;
+                case 2:
+                    tmp64u = R_RCX;
+                    while(tmp64u) {
+                        --tmp64u;
+                        tmp8u = *(uint8_t*)R_RDI;
+                        R_EDI += tmp8s;
+                        if(R_AL!=tmp8u)
+                            break;
+                    }
+                    if(tmp64u) cmp8(emu, R_AL, tmp8u);
+                    R_RCX = tmp64u;
+                    break;
+                default:
+                    cmp8(emu, R_AL, *(uint8_t*)R_RDI);
+                    R_EDI += tmp8s;
+            }
+            break;
+
 
         case 0xB0:                      /* MOV AL,Ib */
         case 0xB1:                      /* MOV CL,Ib */