From 2db98723c7fb3c9e7f5cd723c4c3115dde4e58b5 Mon Sep 17 00:00:00 2001 From: TomW Date: Fri, 7 Aug 2015 21:31:00 +0100 Subject: [PATCH] REP instructions in 32-bit mode with both 0x66 and 0x67 prefixes now work correctly - fixes QEMM and DESQview. --- src/386.c | 4 ++-- src/386_dynarec.c | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/386.c b/src/386.c index 20ba4c7..07639ae 100644 --- a/src/386.c +++ b/src/386.c @@ -322,10 +322,10 @@ int rep386(int fv) ea_seg = &_gs; goto startrep; case 0x66: case 0x166: case 0x266: case 0x366: /*Data size prefix*/ - rep32 = (rep32 & 0x200) | (use32 ^ 0x100); + rep32 = (rep32 & 0x200) | ((use32 ^ 0x100) & 0x100); goto startrep; case 0x67: case 0x167: case 0x267: case 0x367: /*Address size prefix*/ - rep32 = (rep32 & 0x100) | (use32 ^ 0x200); + rep32 = (rep32 & 0x100) | ((use32 ^ 0x200) & 0x200); goto startrep; case 0x6C: case 0x16C: /*REP INSB*/ if (c>0) diff --git a/src/386_dynarec.c b/src/386_dynarec.c index 3c83e0b..dfd6e37 100644 --- a/src/386_dynarec.c +++ b/src/386_dynarec.c @@ -336,10 +336,10 @@ int rep386(int fv) ea_seg = &_gs; goto startrep; case 0x66: case 0x166: case 0x266: case 0x366: /*Data size prefix*/ - rep32 = (rep32 & 0x200) | (use32 ^ 0x100); + rep32 = (rep32 & 0x200) | ((use32 ^ 0x100) & 0x100); goto startrep; case 0x67: case 0x167: case 0x267: case 0x367: /*Address size prefix*/ - rep32 = (rep32 & 0x100) | (use32 ^ 0x200); + rep32 = (rep32 & 0x100) | ((use32 ^ 0x200) & 0x200); goto startrep; case 0x6C: case 0x16C: /*REP INSB*/ // cpu_notreps++;