mirror of
https://github.com/reactos/reactos.git
synced 2025-02-23 17:05:46 +00:00
[FAST486]
Fix MOVS and STOS when DF = 1. The starting position in the block was off by 1. svn path=/branches/ntvdm/; revision=61163
This commit is contained in:
parent
e765c894f0
commit
03ecfdff3f
1 changed files with 28 additions and 8 deletions
|
@ -5398,16 +5398,16 @@ FAST486_OPCODE_HANDLER(Fast486OpcodeMovs)
|
||||||
|
|
||||||
if (State->Flags.Df)
|
if (State->Flags.Df)
|
||||||
{
|
{
|
||||||
/* Reduce ESI and EDI by the number of bytes to transfer */
|
/* Move ESI and EDI to the start of the block */
|
||||||
if (AddressSize)
|
if (AddressSize)
|
||||||
{
|
{
|
||||||
State->GeneralRegs[FAST486_REG_ESI].Long -= Processed * DataSize;
|
State->GeneralRegs[FAST486_REG_ESI].Long -= (Processed - 1) * DataSize;
|
||||||
State->GeneralRegs[FAST486_REG_EDI].Long -= Processed * DataSize;
|
State->GeneralRegs[FAST486_REG_EDI].Long -= (Processed - 1) * DataSize;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
State->GeneralRegs[FAST486_REG_ESI].LowWord -= Processed * DataSize;
|
State->GeneralRegs[FAST486_REG_ESI].LowWord -= (Processed - 1) * DataSize;
|
||||||
State->GeneralRegs[FAST486_REG_EDI].LowWord -= Processed * DataSize;
|
State->GeneralRegs[FAST486_REG_EDI].LowWord -= (Processed - 1) * DataSize;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -5458,6 +5458,20 @@ FAST486_OPCODE_HANDLER(Fast486OpcodeMovs)
|
||||||
State->GeneralRegs[FAST486_REG_EDI].LowWord += Processed * DataSize;
|
State->GeneralRegs[FAST486_REG_EDI].LowWord += Processed * DataSize;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* Reduce ESI and EDI */
|
||||||
|
if (AddressSize)
|
||||||
|
{
|
||||||
|
State->GeneralRegs[FAST486_REG_ESI].Long -= DataSize;
|
||||||
|
State->GeneralRegs[FAST486_REG_EDI].Long -= DataSize;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
State->GeneralRegs[FAST486_REG_ESI].LowWord -= DataSize;
|
||||||
|
State->GeneralRegs[FAST486_REG_EDI].LowWord -= DataSize;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* Reduce the total count by the number processed in this run */
|
/* Reduce the total count by the number processed in this run */
|
||||||
Count -= Processed;
|
Count -= Processed;
|
||||||
|
@ -5728,9 +5742,9 @@ FAST486_OPCODE_HANDLER(Fast486OpcodeStos)
|
||||||
|
|
||||||
if (State->Flags.Df)
|
if (State->Flags.Df)
|
||||||
{
|
{
|
||||||
/* Reduce EDI by the number of bytes to transfer */
|
/* Set EDI to the starting location */
|
||||||
if (AddressSize) State->GeneralRegs[FAST486_REG_EDI].Long -= Processed * DataSize;
|
if (AddressSize) State->GeneralRegs[FAST486_REG_EDI].Long -= (Processed - 1) * DataSize;
|
||||||
else State->GeneralRegs[FAST486_REG_EDI].LowWord -= Processed * DataSize;
|
else State->GeneralRegs[FAST486_REG_EDI].LowWord -= (Processed - 1) * DataSize;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Write to memory */
|
/* Write to memory */
|
||||||
|
@ -5755,6 +5769,12 @@ FAST486_OPCODE_HANDLER(Fast486OpcodeStos)
|
||||||
if (AddressSize) State->GeneralRegs[FAST486_REG_EDI].Long += Processed * DataSize;
|
if (AddressSize) State->GeneralRegs[FAST486_REG_EDI].Long += Processed * DataSize;
|
||||||
else State->GeneralRegs[FAST486_REG_EDI].LowWord += Processed * DataSize;
|
else State->GeneralRegs[FAST486_REG_EDI].LowWord += Processed * DataSize;
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* Reduce EDI */
|
||||||
|
if (AddressSize) State->GeneralRegs[FAST486_REG_EDI].Long -= DataSize;
|
||||||
|
else State->GeneralRegs[FAST486_REG_EDI].LowWord -= DataSize;
|
||||||
|
}
|
||||||
|
|
||||||
/* Reduce the total count by the number processed in this run */
|
/* Reduce the total count by the number processed in this run */
|
||||||
Count -= Processed;
|
Count -= Processed;
|
||||||
|
|
Loading…
Reference in a new issue