mirror of
https://github.com/reactos/reactos.git
synced 2024-09-06 10:52:52 +00:00
[SOFT386]
Fix more prefix handling code. Implement the XLAT instruction. svn path=/branches/ntvdm/; revision=60586
This commit is contained in:
parent
9339e12e69
commit
182d7c8725
|
@ -549,8 +549,7 @@ SOFT386_OPCODE_HANDLER(Soft386OpcodeDecrement)
|
||||||
|
|
||||||
SOFT386_OPCODE_HANDLER(Soft386OpcodePushReg)
|
SOFT386_OPCODE_HANDLER(Soft386OpcodePushReg)
|
||||||
{
|
{
|
||||||
if ((State->PrefixFlags != SOFT386_PREFIX_OPSIZE)
|
if (State->PrefixFlags & SOFT386_PREFIX_LOCK)
|
||||||
&& (State->PrefixFlags != 0))
|
|
||||||
{
|
{
|
||||||
/* Invalid prefix */
|
/* Invalid prefix */
|
||||||
Soft386Exception(State, SOFT386_EXCEPTION_UD);
|
Soft386Exception(State, SOFT386_EXCEPTION_UD);
|
||||||
|
@ -569,12 +568,13 @@ SOFT386_OPCODE_HANDLER(Soft386OpcodePopReg)
|
||||||
ULONG Value;
|
ULONG Value;
|
||||||
BOOLEAN Size = State->SegmentRegs[SOFT386_REG_SS].Size;
|
BOOLEAN Size = State->SegmentRegs[SOFT386_REG_SS].Size;
|
||||||
|
|
||||||
if (State->PrefixFlags == SOFT386_PREFIX_OPSIZE)
|
if (State->PrefixFlags & SOFT386_PREFIX_OPSIZE)
|
||||||
{
|
{
|
||||||
/* The OPSIZE prefix toggles the size */
|
/* The OPSIZE prefix toggles the size */
|
||||||
Size = !Size;
|
Size = !Size;
|
||||||
}
|
}
|
||||||
else if (State->PrefixFlags != 0)
|
|
||||||
|
if (State->PrefixFlags & SOFT386_PREFIX_LOCK)
|
||||||
{
|
{
|
||||||
/* Invalid prefix */
|
/* Invalid prefix */
|
||||||
Soft386Exception(State, SOFT386_EXCEPTION_UD);
|
Soft386Exception(State, SOFT386_EXCEPTION_UD);
|
||||||
|
@ -3880,12 +3880,13 @@ SOFT386_OPCODE_HANDLER(Soft386OpcodePushAll)
|
||||||
/* Make sure this is the right instruction */
|
/* Make sure this is the right instruction */
|
||||||
ASSERT(Opcode == 0x60);
|
ASSERT(Opcode == 0x60);
|
||||||
|
|
||||||
if (State->PrefixFlags == SOFT386_PREFIX_OPSIZE)
|
if (State->PrefixFlags & SOFT386_PREFIX_OPSIZE)
|
||||||
{
|
{
|
||||||
/* The OPSIZE prefix toggles the size */
|
/* The OPSIZE prefix toggles the size */
|
||||||
Size = !Size;
|
Size = !Size;
|
||||||
}
|
}
|
||||||
else
|
|
||||||
|
if (State->PrefixFlags & SOFT386_PREFIX_LOCK)
|
||||||
{
|
{
|
||||||
/* Invalid prefix */
|
/* Invalid prefix */
|
||||||
Soft386Exception(State, SOFT386_EXCEPTION_UD);
|
Soft386Exception(State, SOFT386_EXCEPTION_UD);
|
||||||
|
@ -3928,12 +3929,13 @@ SOFT386_OPCODE_HANDLER(Soft386OpcodePopAll)
|
||||||
/* Make sure this is the right instruction */
|
/* Make sure this is the right instruction */
|
||||||
ASSERT(Opcode == 0x61);
|
ASSERT(Opcode == 0x61);
|
||||||
|
|
||||||
if (State->PrefixFlags == SOFT386_PREFIX_OPSIZE)
|
if (State->PrefixFlags & SOFT386_PREFIX_OPSIZE)
|
||||||
{
|
{
|
||||||
/* The OPSIZE prefix toggles the size */
|
/* The OPSIZE prefix toggles the size */
|
||||||
Size = !Size;
|
Size = !Size;
|
||||||
}
|
}
|
||||||
else
|
|
||||||
|
if (State->PrefixFlags & SOFT386_PREFIX_LOCK)
|
||||||
{
|
{
|
||||||
/* Invalid prefix */
|
/* Invalid prefix */
|
||||||
Soft386Exception(State, SOFT386_EXCEPTION_UD);
|
Soft386Exception(State, SOFT386_EXCEPTION_UD);
|
||||||
|
@ -5437,10 +5439,34 @@ SOFT386_OPCODE_HANDLER(Soft386OpcodeAad)
|
||||||
|
|
||||||
SOFT386_OPCODE_HANDLER(Soft386OpcodeXlat)
|
SOFT386_OPCODE_HANDLER(Soft386OpcodeXlat)
|
||||||
{
|
{
|
||||||
// TODO: NOT IMPLEMENTED
|
UCHAR Value;
|
||||||
UNIMPLEMENTED;
|
BOOLEAN AddressSize = State->SegmentRegs[SOFT386_REG_CS].Size;
|
||||||
|
|
||||||
return FALSE;
|
if (State->PrefixFlags & SOFT386_PREFIX_ADSIZE)
|
||||||
|
{
|
||||||
|
/* The ADSIZE prefix toggles the size */
|
||||||
|
AddressSize = !AddressSize;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Read a byte from DS:[(E)BX + AL] */
|
||||||
|
if (!Soft386ReadMemory(State,
|
||||||
|
SOFT386_REG_DS,
|
||||||
|
AddressSize ? State->GeneralRegs[SOFT386_REG_EBX].Long
|
||||||
|
: State->GeneralRegs[SOFT386_REG_EBX].LowWord
|
||||||
|
+ State->GeneralRegs[SOFT386_REG_EAX].LowByte,
|
||||||
|
FALSE,
|
||||||
|
&Value,
|
||||||
|
sizeof(UCHAR)))
|
||||||
|
{
|
||||||
|
/* Exception occurred */
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Set AL to the result */
|
||||||
|
State->GeneralRegs[SOFT386_REG_EAX].LowByte = Value;
|
||||||
|
|
||||||
|
/* Return success */
|
||||||
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
SOFT386_OPCODE_HANDLER(Soft386OpcodeLoop)
|
SOFT386_OPCODE_HANDLER(Soft386OpcodeLoop)
|
||||||
|
|
Loading…
Reference in a new issue