1
0
Fork 0

added patch 1174832 by moe. lock and xadd in corefull/normal/simple

Imported-from: https://svn.code.sf.net/p/dosbox/code-0/dosbox/trunk@2178
This commit is contained in:
Peter Veenstra 2005-04-19 08:28:41 +00:00
parent 226a00ce86
commit 77f14da8f0
6 changed files with 30 additions and 5 deletions

View file

@ -427,6 +427,9 @@ l_M_Ed:
goto nextopcode;
case D_WAIT:
case D_NOP:
case D_LOCK: /* FIXME: according to intel, LOCK should raise an exception if it's not followed by one of a small set of instructions;
probably doesn't matter for our purposes as it is a pentium prefix anyhow */
LOG(LOG_CPU,LOG_NORMAL)("CPU:LOCK");
goto nextopcode;
case D_ENTERw:
{

View file

@ -171,7 +171,7 @@ static OpCode OpCodeTable[1024]={
{L_REGw ,O_OUTb ,0 ,REGI_DX},{L_REGw ,O_OUTw ,0 ,REGI_DX},
/* 0xf0 - 0xf7 */
{0 ,0 ,0 ,0 },{0 ,0 ,0 ,0 },
{D_LOCK ,0 ,0 ,0 },{0 ,0 ,0 ,0 },
{L_PREREPNE ,0 ,0 ,0 },{L_PREREP ,0 ,0 ,0 },
{D_HLT ,0 ,0 ,0 },{D_CMC ,0 ,0 ,0 },
{L_MODRM ,8 ,0 ,M_GRP },{L_MODRM ,9 ,0 ,M_GRP },
@ -316,7 +316,7 @@ static OpCode OpCodeTable[1024]={
{L_MODRM ,0 ,S_Gw ,M_Ebx },{L_MODRM ,0 ,S_Gw ,M_Ewx },
/* 0x1c0 - 0x1cc */
{0 ,0 ,0 ,0 },{0 ,0 ,0 ,0 },
{L_MODRM ,t_ADDb ,S_EbGb ,M_GbEb },{L_MODRM ,t_ADDw ,S_EwGw ,M_GwEw },
{0 ,0 ,0 ,0 },{0 ,0 ,0 ,0 },
{0 ,0 ,0 ,0 },{0 ,0 ,0 ,0 },
{0 ,0 ,0 ,0 },{0 ,0 ,0 ,0 },
@ -526,7 +526,7 @@ static OpCode OpCodeTable[1024]={
{L_REGw ,O_OUTb ,0 ,REGI_DX},{L_REGw ,O_OUTd ,0 ,REGI_DX},
/* 0x2f0 - 0x2f7 */
{0 ,0 ,0 ,0 },{0 ,0 ,0 ,0 },
{D_LOCK ,0 ,0 ,0 },{0 ,0 ,0 ,0 },
{L_PREREPNE ,0 ,0 ,0 },{L_PREREP ,0 ,0 ,0 },
{0 ,0 ,0 ,0 },{D_CMC ,0 ,0 ,0 },
{L_MODRM ,8 ,0 ,M_GRP },{L_MODRM ,0xa ,0 ,M_GRP },
@ -672,7 +672,7 @@ static OpCode OpCodeTable[1024]={
{L_MODRM ,0 ,S_Gd ,M_Ebx },{L_MODRM ,0 ,S_Gd ,M_Ewx },
/* 0x3c0 - 0x3cc */
{0 ,0 ,0 ,0 },{0 ,0 ,0 ,0 },
{L_MODRM ,t_ADDb ,S_EbGb ,M_GbEb },{L_MODRM ,t_ADDd ,S_EdGd ,M_GdEd },
{0 ,0 ,0 ,0 },{0 ,0 ,0 ,0 },
{0 ,0 ,0 ,0 },{0 ,0 ,0 ,0 },
{0 ,0 ,0 ,0 },{0 ,0 ,0 ,0 },

View file

@ -45,6 +45,7 @@ enum {
D_SAHF,D_LAHF,
D_CPUID,
D_HLT,D_CLTS,
D_LOCK,
L_ERROR,
};

View file

@ -444,6 +444,20 @@
else {GetEAa;*rmrw=LoadMbs(eaa);}
break;
}
CASE_0F_B(0xc0) /* XADD Gb,Eb */
{
GetRMrb;Bit8u oldrmrb=*rmrb;
if (rm >= 0xc0 ) {GetEArb;*rmrb=*earb;*earb+=oldrmrb;}
else {GetEAa;*rmrb=LoadMb(eaa);SaveMb(eaa,LoadMb(eaa)+oldrmrb);}
break;
}
CASE_0F_W(0xc1) /* XADD Gw,Ew */
{
GetRMrw;Bit16u oldrmrw=*rmrw;
if (rm >= 0xc0 ) {GetEArw;*rmrw=*earw;*earw+=oldrmrw;}
else {GetEAa;*rmrw=LoadMw(eaa);SaveMw(eaa,LoadMw(eaa)+oldrmrw);}
break;
}
CASE_0F_B(0xc8) /* BSWAP EAX */
BSWAP(reg_eax);break;
CASE_0F_B(0xc9) /* BSWAP ECX */

View file

@ -376,3 +376,10 @@
else {GetEAa;*rmrd=LoadMws(eaa);}
break;
}
CASE_0F_D(0xc1) /* XADD Gd,Ed */
{
GetRMrd;Bit32u oldrmrd=*rmrd;
if (rm >= 0xc0 ) {GetEArd;*rmrd=*eard;*eard+=oldrmrd;}
else {GetEAa;*rmrd=LoadMd(eaa);SaveMd(eaa,LoadMd(eaa)+oldrmrd);}
break;
}

View file

@ -926,7 +926,7 @@
IO_WriteW(reg_dx,reg_ax);
break;
CASE_B(0xf0) /* LOCK */
LOG(LOG_CPU,LOG_NORMAL)("CPU:LOCK");
LOG(LOG_CPU,LOG_NORMAL)("CPU:LOCK"); /* FIXME: see case D_LOCK in core_full/load.h */
break;
CASE_B(0xf2) /* REPNZ */
DO_PREFIX_REP(false);