Author: aandrejevic
Date: Sun Dec 1 03:16:49 2013
New Revision: 61163
URL:
http://svn.reactos.org/svn/reactos?rev=61163&view=rev
Log:
[FAST486]
Fix MOVS and STOS when DF = 1. The starting position in the block was off by 1.
Modified:
branches/ntvdm/lib/fast486/opcodes.c
Modified: branches/ntvdm/lib/fast486/opcodes.c
URL:
http://svn.reactos.org/svn/reactos/branches/ntvdm/lib/fast486/opcodes.c?rev…
==============================================================================
--- branches/ntvdm/lib/fast486/opcodes.c [iso-8859-1] (original)
+++ branches/ntvdm/lib/fast486/opcodes.c [iso-8859-1] Sun Dec 1 03:16:49 2013
@@ -5398,16 +5398,16 @@
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)
{
- State->GeneralRegs[FAST486_REG_ESI].Long -= Processed * DataSize;
- State->GeneralRegs[FAST486_REG_EDI].Long -= Processed * DataSize;
+ State->GeneralRegs[FAST486_REG_ESI].Long -= (Processed - 1) *
DataSize;
+ State->GeneralRegs[FAST486_REG_EDI].Long -= (Processed - 1) *
DataSize;
}
else
{
- State->GeneralRegs[FAST486_REG_ESI].LowWord -= Processed *
DataSize;
- State->GeneralRegs[FAST486_REG_EDI].LowWord -= Processed *
DataSize;
+ State->GeneralRegs[FAST486_REG_ESI].LowWord -= (Processed - 1) *
DataSize;
+ State->GeneralRegs[FAST486_REG_EDI].LowWord -= (Processed - 1) *
DataSize;
}
}
@@ -5458,6 +5458,20 @@
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 */
Count -= Processed;
@@ -5728,9 +5742,9 @@
if (State->Flags.Df)
{
- /* Reduce EDI by the number of bytes to transfer */
- if (AddressSize) State->GeneralRegs[FAST486_REG_EDI].Long -= Processed
* DataSize;
- else State->GeneralRegs[FAST486_REG_EDI].LowWord -= Processed *
DataSize;
+ /* Set EDI to the starting location */
+ if (AddressSize) State->GeneralRegs[FAST486_REG_EDI].Long -=
(Processed - 1) * DataSize;
+ else State->GeneralRegs[FAST486_REG_EDI].LowWord -= (Processed - 1) *
DataSize;
}
/* Write to memory */
@@ -5754,6 +5768,12 @@
/* Increase EDI by the number of bytes transfered */
if (AddressSize) State->GeneralRegs[FAST486_REG_EDI].Long += 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 */