1
0
Fork 0

Added instructions: BSF,BSR,BSWAP

Imported-from: https://svn.code.sf.net/p/dosbox/code-0/dosbox/trunk@227
This commit is contained in:
Ulf Wohlers 2002-08-27 10:15:38 +00:00
parent 7349874d3a
commit cb780cd6e6
2 changed files with 46 additions and 1 deletions

View file

@ -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);

View file

@ -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) */