From 400da21a32e3c4558e84b46dfb4b6342c8770b53 Mon Sep 17 00:00:00 2001 From: Sjoerd van der Berg Date: Mon, 9 Jun 2003 23:28:24 +0000 Subject: [PATCH] Added WAIT and 16-bit BSF,BSR Imported-from: https://svn.code.sf.net/p/dosbox/code-0/dosbox/trunk@1044 --- src/cpu/core_full/load.h | 1 + src/cpu/core_full/op.h | 26 ++++++++++++++++++++++++++ src/cpu/core_full/optable.h | 7 +++---- src/cpu/core_full/support.h | 2 +- 4 files changed, 31 insertions(+), 5 deletions(-) diff --git a/src/cpu/core_full/load.h b/src/cpu/core_full/load.h index 2dfbfbd2..f90180fc 100644 --- a/src/cpu/core_full/load.h +++ b/src/cpu/core_full/load.h @@ -371,6 +371,7 @@ l_M_Ed: case D_STD: SETFLAGBIT(DF,true); goto nextopcode; + case D_WAIT: case D_NOP: goto nextopcode; case D_ENTERw: diff --git a/src/cpu/core_full/op.h b/src/cpu/core_full/op.h index ee493b5a..26057cb6 100644 --- a/src/cpu/core_full/op.h +++ b/src/cpu/core_full/op.h @@ -483,6 +483,32 @@ switch (inst.code.op) { inst.op1.d=new_sel; } break; + case O_BSFw: + { + FILLFLAGS; + if (!inst.op1.w) SETFLAGBIT(ZF,true); + Bitu count=0; + while (count<16) { + if ((inst.op1.w>>count) & 1) break; + count++; + } + inst.op1.d=count; + SETFLAGBIT(ZF,false); + } + break; + case O_BSRw: + { + FILLFLAGS; + if (!inst.op1.w) SETFLAGBIT(ZF,true); + Bits count=15; + while (count>0) { + if ((inst.op1.w>>count) & 1) break; + count--; + } + inst.op1.d=count; + SETFLAGBIT(ZF,false); + } + break; case O_BTw: case O_BTSw: case O_BTCw: diff --git a/src/cpu/core_full/optable.h b/src/cpu/core_full/optable.h index b06b0ffd..367d46f7 100644 --- a/src/cpu/core_full/optable.h +++ b/src/cpu/core_full/optable.h @@ -109,7 +109,7 @@ static OpCode OpCodeTable[1024]={ {L_REGw ,O_XCHG_AX ,S_REGw ,REGI_SI},{L_REGw ,O_XCHG_AX ,S_REGw ,REGI_DI}, /* 0x98 - 0x9f */ {D_CBW ,0 ,0 ,0 },{D_CWD ,0 ,0 ,0 }, -{L_Ifw ,O_CALLFw ,0 ,0 },{L_ERROR ,0 ,0 ,0 }, +{L_Ifw ,O_CALLFw ,0 ,0 },{D_WAIT ,0 ,0 ,0 }, {L_FLG ,0 ,S_PUSHw,0 },{L_POPw ,0 ,S_FLGw ,0 }, {L_REGb ,0 ,S_FLGb ,REGI_AH},{L_FLG ,0 ,S_REGb ,REGI_AH}, @@ -311,7 +311,7 @@ static OpCode OpCodeTable[1024]={ /* 0x1b8 - 0x1bf */ {0 ,0 ,0 ,0 },{0 ,0 ,0 ,0 }, {L_MODRM ,0xe ,0 ,M_GRP },{L_MODRM ,O_BTCw ,0 ,0 }, -{0 ,0 ,0 ,0 },{0 ,0 ,0 ,0 }, +{L_MODRM ,O_BSFw ,S_Gw ,M_Ew },{L_MODRM ,O_BSRw ,S_Gw ,M_Ew }, {L_MODRM ,0 ,S_Gw ,M_Ebx },{L_MODRM ,0 ,S_Gw ,M_Ewx }, /* 0x1c0 - 0x1cc */ @@ -466,8 +466,7 @@ static OpCode OpCodeTable[1024]={ {L_REGd ,O_XCHG_EAX ,S_REGd ,REGI_SI},{L_REGd ,O_XCHG_EAX ,S_REGd ,REGI_DI}, /* 0x298 - 0x29f */ {D_CWDE ,0 ,0 ,0 },{D_CDQ ,0 ,0 ,0 }, -//TODO Wait shoudn't be nop -{L_Ifd ,O_CALLFd ,0 ,0 },{D_NOP ,0 ,0 ,0 }, +{L_Ifd ,O_CALLFd ,0 ,0 },{D_WAIT ,0 ,0 ,0 }, {L_FLG ,0 ,S_PUSHd,0 },{L_POPd ,0 ,S_FLGd ,0 }, {L_REGb ,0 ,S_FLGb ,REGI_AH},{L_FLG ,0 ,S_REGb ,REGI_AH}, diff --git a/src/cpu/core_full/support.h b/src/cpu/core_full/support.h index 5a9e9634..2d2477de 100644 --- a/src/cpu/core_full/support.h +++ b/src/cpu/core_full/support.h @@ -36,7 +36,7 @@ enum { D_SETALC, D_XLATw,D_XLATd, D_CLI,D_STI,D_STC,D_CLC,D_CMC,D_CLD,D_STD, - D_NOP, + D_NOP,D_WAIT, D_ENTERw,D_ENTERd, D_LEAVEw,D_LEAVEd, L_ERROR,