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,