From 03ecfdff3f62dae169495e2a0d269bd355567c44 Mon Sep 17 00:00:00 2001 From: Aleksandar Andrejevic Date: Sun, 1 Dec 2013 03:16:49 +0000 Subject: [PATCH] [FAST486] Fix MOVS and STOS when DF = 1. The starting position in the block was off by 1. svn path=/branches/ntvdm/; revision=61163 --- lib/fast486/opcodes.c | 36 ++++++++++++++++++++++++++++-------- 1 file changed, 28 insertions(+), 8 deletions(-) diff --git a/lib/fast486/opcodes.c b/lib/fast486/opcodes.c index 539b8fe0825..303f87e0f10 100644 --- a/lib/fast486/opcodes.c +++ b/lib/fast486/opcodes.c @@ -5398,16 +5398,16 @@ FAST486_OPCODE_HANDLER(Fast486OpcodeMovs) 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 @@ FAST486_OPCODE_HANDLER(Fast486OpcodeMovs) 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 @@ FAST486_OPCODE_HANDLER(Fast486OpcodeStos) 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 */ @@ -5755,6 +5769,12 @@ FAST486_OPCODE_HANDLER(Fast486OpcodeStos) 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 */ Count -= Processed;