From cb780cd6e6fe6e91f3971a052abb7aa4a09657b2 Mon Sep 17 00:00:00 2001 From: Ulf Wohlers Date: Tue, 27 Aug 2002 10:15:38 +0000 Subject: [PATCH] Added instructions: BSF,BSR,BSWAP Imported-from: https://svn.code.sf.net/p/dosbox/code-0/dosbox/trunk@227 --- src/cpu/core_16/instructions.h | 3 +++ src/cpu/core_16/prefix_of.h | 44 +++++++++++++++++++++++++++++++++- 2 files changed, 46 insertions(+), 1 deletion(-) diff --git a/src/cpu/core_16/instructions.h b/src/cpu/core_16/instructions.h index 9863b2e0..8bd1901c 100644 --- a/src/cpu/core_16/instructions.h +++ b/src/cpu/core_16/instructions.h @@ -649,3 +649,6 @@ flags.result.d=(flags.var1.d >> flags.var2.b) | (op2 << (32-flags.var2.b)); \ save(op1,flags.result.d); \ flags.type=t_DSHRd; + +#define BSWAP(op1) \ + op1 = (op1>>24)|((op1>>8)&0xFF00)|((op1<<8)&0xFF0000)|((op1<<24)&0xFF000000); diff --git a/src/cpu/core_16/prefix_of.h b/src/cpu/core_16/prefix_of.h index 951ef21b..5d845201 100644 --- a/src/cpu/core_16/prefix_of.h +++ b/src/cpu/core_16/prefix_of.h @@ -350,7 +350,40 @@ switch(Fetchb()) { if (flags.type!=t_CF) { flags.prev_type=flags.type;flags.type=t_CF; } break; } - /* 0xbc BSF Gw,Ew */ + case 0xbc: /* 0xbc BSF Gw,Ew */ + { + GetRMrw; + Bit16u result,value; + if (rm >= 0xc0) { GetEArw; value=*earw; } + else { GetEAa; value=LoadMw(eaa); } + if (value==0) { + flags.zf = true; + } else { + result = 0; + while ((value & 0x01)==0) { result++; value>>=1; } + flags.zf = false; + *rmrw = result; + } + flags.type=t_UNKNOWN; + break; + } + case 0xbd: /* 0xbd BSR Gw,Ew */ + { + GetRMrw; + Bit16u result,value; + if (rm >= 0xc0) { GetEArw; value=*earw; } + else { GetEAa; value=LoadMw(eaa); } + if (value==0) { + flags.zf = true; + } else { + result = 15; // Operandsize-1 + while ((value & 0x8000)==0) { result--; value<<=1; } + flags.zf = false; + *rmrw = result; + } + flags.type=t_UNKNOWN; + break; + } /* 0xbd BSR Gw,Ew */ case 0xbe: /* MOVSX Gw,Eb */ { @@ -363,6 +396,15 @@ switch(Fetchb()) { /* 0xc1 XADD Ew,Gw (486) */ /* 0xc7 CMPXCHG8B Mq (P5) */ /* 0xc8-cf BSWAP Rw (odd behavior,486) */ + case 0xc8: BSWAP(reg_eax); break; + case 0xc9: BSWAP(reg_ecx); break; + case 0xca: BSWAP(reg_edx); break; + case 0xcb: BSWAP(reg_ebx); break; + case 0xcc: BSWAP(reg_esp); break; + case 0xcd: BSWAP(reg_ebp); break; + case 0xce: BSWAP(reg_esi); break; + case 0xcf: BSWAP(reg_edi); break; + /* 0xd1 PSRLW Rq,Eq (MMX) */ /* 0xd2 PSRLD Rq,Eq (MMX) */ /* 0xd3 PSRLQ Rq,Eq (MMX) */