From 80d3306840a1bdb12bb3d8d41dfe03574f38aa4c Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Mon, 13 Jul 2020 12:33:32 +0200 Subject: [PATCH] UserspaceEmulator: Fix wrong ESI/EDI step sizes in MOVSW and MOVSD --- DevTools/UserspaceEmulator/SoftCPU.cpp | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/DevTools/UserspaceEmulator/SoftCPU.cpp b/DevTools/UserspaceEmulator/SoftCPU.cpp index 233a9d1956..67c715f29f 100644 --- a/DevTools/UserspaceEmulator/SoftCPU.cpp +++ b/DevTools/UserspaceEmulator/SoftCPU.cpp @@ -1031,15 +1031,15 @@ void SoftCPU::MOVSD(const X86::Instruction& insn) do_once_or_repeat(insn, [&] { auto src = read_memory32({ src_segment, si() }); write_memory32({ es(), di() }, src); - set_di(di() + (df() ? -1 : 1)); - set_si(si() + (df() ? -1 : 1)); + set_di(di() + (df() ? -4 : 4)); + set_si(si() + (df() ? -4 : 4)); }); } else { do_once_or_repeat(insn, [&] { auto src = read_memory32({ src_segment, esi() }); write_memory32({ es(), edi() }, src); - set_edi(edi() + (df() ? -1 : 1)); - set_esi(esi() + (df() ? -1 : 1)); + set_edi(edi() + (df() ? -4 : 4)); + set_esi(esi() + (df() ? -4 : 4)); }); } } @@ -1051,15 +1051,15 @@ void SoftCPU::MOVSW(const X86::Instruction& insn) do_once_or_repeat(insn, [&] { auto src = read_memory16({ src_segment, si() }); write_memory16({ es(), di() }, src); - set_di(di() + (df() ? -1 : 1)); - set_si(si() + (df() ? -1 : 1)); + set_di(di() + (df() ? -2 : 2)); + set_si(si() + (df() ? -2 : 2)); }); } else { do_once_or_repeat(insn, [&] { auto src = read_memory16({ src_segment, esi() }); write_memory16({ es(), edi() }, src); - set_edi(edi() + (df() ? -1 : 1)); - set_esi(esi() + (df() ? -1 : 1)); + set_edi(edi() + (df() ? -2 : 2)); + set_esi(esi() + (df() ? -2 : 2)); }); } }