From 73943385cd320a92b24bb0331bc587e31a39b9f9 Mon Sep 17 00:00:00 2001 From: Sjoerd van der Berg Date: Tue, 13 Jan 2004 21:41:58 +0000 Subject: [PATCH] Fix effective address calculation of bittesting opcodes with register operand Imported-from: https://svn.code.sf.net/p/dosbox/code-0/dosbox/trunk@1582 --- src/cpu/core_normal/prefix_0f.h | 12 ++++++++---- src/cpu/core_normal/prefix_66_0f.h | 12 ++++++++---- 2 files changed, 16 insertions(+), 8 deletions(-) diff --git a/src/cpu/core_normal/prefix_0f.h b/src/cpu/core_normal/prefix_0f.h index 23897681..44bb1b24 100644 --- a/src/cpu/core_normal/prefix_0f.h +++ b/src/cpu/core_normal/prefix_0f.h @@ -255,7 +255,8 @@ GetEArw; SETFLAGBIT(CF,(*earw & mask)); } else { - GetEAa;Bit16u old=LoadMw(eaa); + GetEAa;eaa+=(((Bit16s)*rmrw)>>4)*2; + Bit16u old=LoadMw(eaa); SETFLAGBIT(CF,(old & mask)); } break; @@ -279,7 +280,8 @@ SETFLAGBIT(CF,(*earw & mask)); *earw|=mask; } else { - GetEAa;Bit16u old=LoadMw(eaa); + GetEAa;eaa+=(((Bit16s)*rmrw)>>4)*2; + Bit16u old=LoadMw(eaa); SETFLAGBIT(CF,(old & mask)); SaveMw(eaa,old | mask); } @@ -311,7 +313,8 @@ SETFLAGBIT(CF,(*earw & mask)); *earw&= ~mask; } else { - GetEAa;Bit16u old=LoadMw(eaa); + GetEAa;eaa+=(((Bit16s)*rmrw)>>4)*2; + Bit16u old=LoadMw(eaa); SETFLAGBIT(CF,(old & mask)); SaveMw(eaa,old & ~mask); } @@ -399,7 +402,8 @@ SETFLAGBIT(CF,(*earw & mask)); *earw^=mask; } else { - GetEAa;Bit16u old=LoadMw(eaa); + GetEAa;eaa+=(((Bit16s)*rmrw)>>4)*2; + Bit16u old=LoadMw(eaa); SETFLAGBIT(CF,(old & mask)); SaveMw(eaa,old ^ mask); } diff --git a/src/cpu/core_normal/prefix_66_0f.h b/src/cpu/core_normal/prefix_66_0f.h index a4439be8..65a10402 100644 --- a/src/cpu/core_normal/prefix_66_0f.h +++ b/src/cpu/core_normal/prefix_66_0f.h @@ -168,7 +168,8 @@ GetEArd; SETFLAGBIT(CF,(*eard & mask)); } else { - GetEAa;Bit32u old=LoadMd(eaa); + GetEAa;eaa+=(((Bit32s)*rmrd)>>5)*4; + Bit32u old=LoadMd(eaa); SETFLAGBIT(CF,(old & mask)); } break; @@ -192,7 +193,8 @@ SETFLAGBIT(CF,(*eard & mask)); *eard|=mask; } else { - GetEAa;Bit32u old=LoadMd(eaa); + GetEAa;eaa+=(((Bit32s)*rmrd)>>5)*4; + Bit32u old=LoadMd(eaa); SETFLAGBIT(CF,(old & mask)); SaveMd(eaa,old | mask); } @@ -227,7 +229,8 @@ SETFLAGBIT(CF,(*eard & mask)); *eard&= ~mask; } else { - GetEAa;Bit32u old=LoadMd(eaa); + GetEAa;eaa+=(((Bit32s)*rmrd)>>5)*4; + Bit32u old=LoadMd(eaa); SETFLAGBIT(CF,(old & mask)); SaveMd(eaa,old & ~mask); } @@ -317,7 +320,8 @@ SETFLAGBIT(CF,(*eard & mask)); *eard^=mask; } else { - GetEAa;Bit32u old=LoadMd(eaa); + GetEAa;eaa+=(((Bit32s)*rmrd)>>5)*4; + Bit32u old=LoadMd(eaa); SETFLAGBIT(CF,(old & mask)); SaveMd(eaa,old ^ mask); }