From aef0bf1635a24b0fb0662968e3cb102c92dd5430 Mon Sep 17 00:00:00 2001 From: Aleksandar Andrejevic Date: Wed, 9 Oct 2013 21:48:52 +0000 Subject: [PATCH] [SOFT386] Implement an API for external segment modification. [NTVDM] Implement EmulatorSetRegister for NEW_EMULATOR. svn path=/branches/ntvdm/; revision=60591 --- include/reactos/libs/soft386/soft386.h | 9 +++++++++ lib/soft386/soft386.c | 9 +++++++++ subsystems/ntvdm/emulator.c | 15 +++++++++++---- 3 files changed, 29 insertions(+), 4 deletions(-) diff --git a/include/reactos/libs/soft386/soft386.h b/include/reactos/libs/soft386/soft386.h index 9c07bc3db92..5b4acfe76f1 100644 --- a/include/reactos/libs/soft386/soft386.h +++ b/include/reactos/libs/soft386/soft386.h @@ -369,6 +369,15 @@ VOID NTAPI Soft386SetStack(PSOFT386_STATE State, USHORT Segment, ULONG Offset); +VOID +NTAPI +Soft386SetSegment +( + PSOFT386_STATE State, + SOFT386_SEG_REGS Segment, + USHORT Selector +); + #endif // _SOFT386_H_ /* EOF */ diff --git a/lib/soft386/soft386.c b/lib/soft386/soft386.c index 396cb6ec470..14154730362 100644 --- a/lib/soft386/soft386.c +++ b/lib/soft386/soft386.c @@ -306,5 +306,14 @@ Soft386SetStack(PSOFT386_STATE State, USHORT Segment, ULONG Offset) State->GeneralRegs[SOFT386_REG_ESP].Long = Offset; } +VOID +NTAPI +Soft386SetSegment(PSOFT386_STATE State, + SOFT386_SEG_REGS Segment, + USHORT Selector) +{ + /* Call the internal function */ + Soft386LoadSegment(State, Segment, Selector); +} /* EOF */ diff --git a/subsystems/ntvdm/emulator.c b/subsystems/ntvdm/emulator.c index b1bf5635e87..e3b80276591 100644 --- a/subsystems/ntvdm/emulator.c +++ b/subsystems/ntvdm/emulator.c @@ -521,16 +521,23 @@ ULONG EmulatorGetProgramCounter(VOID) VOID EmulatorSetRegister(ULONG Register, ULONG Value) { #ifndef NEW_EMULATOR - if (Register < EMULATOR_REG_CS) + if (Register < EMULATOR_REG_ES) { EmulatorContext.state->general_reg[Register].val = Value; } else { - EmulatorContext.state->segment_reg[Register - EMULATOR_REG_ES].val = (WORD)Value; + EmulatorContext.state->segment_reg[Register - EMULATOR_REG_ES].val = (USHORT)Value; } #else - // TODO: NOT IMPLEMENTED + if (Register < EMULATOR_REG_ES) + { + EmulatorContext.GeneralRegs[Register].Long = Value; + } + else + { + Soft386SetSegment(&EmulatorContext, Register - EMULATOR_REG_ES, (USHORT)Value); + } #endif } @@ -596,7 +603,7 @@ VOID EmulatorStep(VOID) } #else /* Dump the state for debugging purposes */ - Soft386DumpState(&EmulatorContext); + // Soft386DumpState(&EmulatorContext); /* Execute the next instruction */ Soft386StepInto(&EmulatorContext);