2 * COPYRIGHT: GPL - See COPYING in the top level directory
3 * PROJECT: ReactOS Virtual DOS Machine
5 * PURPOSE: Exported functions for manipulating registers
6 * PROGRAMMERS: Hermes Belusca-Maito (hermes.belusca@sfr.fr)
9 /* INCLUDES *******************************************************************/
15 #include "x86context.h"
17 /* PRIVATE VARIABLES **********************************************************/
19 // This structure must by synced with our CPU context
20 X86CONTEXT IntelRegPtr
;
22 /* PUBLIC FUNCTIONS ***********************************************************/
26 getIntelRegistersPointer(VOID
)
29 * Sync the Intel Registers x86 Context with our CPU context
32 if (IntelRegPtr
.ContextFlags
& CONTEXT_DEBUG_REGISTERS
)
34 IntelRegPtr
.Dr0
= EmulatorContext
.DebugRegisters
[FAST486_REG_DR0
];
35 IntelRegPtr
.Dr1
= EmulatorContext
.DebugRegisters
[FAST486_REG_DR1
];
36 IntelRegPtr
.Dr2
= EmulatorContext
.DebugRegisters
[FAST486_REG_DR2
];
37 IntelRegPtr
.Dr3
= EmulatorContext
.DebugRegisters
[FAST486_REG_DR3
];
38 IntelRegPtr
.Dr6
= EmulatorContext
.DebugRegisters
[FAST486_REG_DR6
];
39 IntelRegPtr
.Dr7
= EmulatorContext
.DebugRegisters
[FAST486_REG_DR7
];
42 if (IntelRegPtr
.ContextFlags
& CONTEXT_FLOATING_POINT
)
44 // IntelRegPtr.FloatSave = ;
45 IntelRegPtr
.FloatSave
.ControlWord
= EmulatorContext
.FpuControl
.Value
;
46 IntelRegPtr
.FloatSave
.StatusWord
= EmulatorContext
.FpuStatus
.Value
;
47 // IntelRegPtr.FloatSave.TagWord = ;
48 // IntelRegPtr.FloatSave.ErrorOffset = ;
49 // IntelRegPtr.FloatSave.ErrorSelector = ;
50 // IntelRegPtr.FloatSave.DataOffset = ;
51 // IntelRegPtr.FloatSave.DataSelector = ;
52 // IntelRegPtr.FloatSave.RegisterArea = ; // This is a region of size SIZE_OF_80387_REGISTERS == 80 bytes
53 // IntelRegPtr.FloatSave.Cr0NpxState = ;
56 if (IntelRegPtr
.ContextFlags
& CONTEXT_SEGMENTS
)
58 IntelRegPtr
.SegGs
= EmulatorContext
.SegmentRegs
[FAST486_REG_GS
].Selector
;
59 IntelRegPtr
.SegFs
= EmulatorContext
.SegmentRegs
[FAST486_REG_FS
].Selector
;
60 IntelRegPtr
.SegEs
= EmulatorContext
.SegmentRegs
[FAST486_REG_ES
].Selector
;
61 IntelRegPtr
.SegDs
= EmulatorContext
.SegmentRegs
[FAST486_REG_DS
].Selector
;
64 if (IntelRegPtr
.ContextFlags
& CONTEXT_INTEGER
)
66 IntelRegPtr
.Edi
= EmulatorContext
.GeneralRegs
[FAST486_REG_EDI
].Long
;
67 IntelRegPtr
.Esi
= EmulatorContext
.GeneralRegs
[FAST486_REG_ESI
].Long
;
68 IntelRegPtr
.Ebx
= EmulatorContext
.GeneralRegs
[FAST486_REG_EBX
].Long
;
69 IntelRegPtr
.Edx
= EmulatorContext
.GeneralRegs
[FAST486_REG_EDX
].Long
;
70 IntelRegPtr
.Ecx
= EmulatorContext
.GeneralRegs
[FAST486_REG_ECX
].Long
;
71 IntelRegPtr
.Eax
= EmulatorContext
.GeneralRegs
[FAST486_REG_EAX
].Long
;
74 if (IntelRegPtr
.ContextFlags
& CONTEXT_CONTROL
)
76 IntelRegPtr
.Ebp
= EmulatorContext
.GeneralRegs
[FAST486_REG_EBP
].Long
;
77 IntelRegPtr
.Eip
= EmulatorContext
.InstPtr
.Long
;
78 IntelRegPtr
.SegCs
= EmulatorContext
.SegmentRegs
[FAST486_REG_CS
].Selector
;
79 IntelRegPtr
.EFlags
= EmulatorContext
.Flags
.Long
;
80 IntelRegPtr
.Esp
= EmulatorContext
.GeneralRegs
[FAST486_REG_ESP
].Long
;
81 IntelRegPtr
.SegSs
= EmulatorContext
.SegmentRegs
[FAST486_REG_SS
].Selector
;
84 if (IntelRegPtr
.ContextFlags
& CONTEXT_EXTENDED_REGISTERS
)
86 // IntelRegPtr.ExtendedRegisters = ;
89 /* Return the address of the Intel Registers x86 Context */
97 return EmulatorContext
.GeneralRegs
[FAST486_REG_EAX
].Long
;
104 EmulatorContext
.GeneralRegs
[FAST486_REG_EAX
].Long
= Value
;
111 return EmulatorContext
.GeneralRegs
[FAST486_REG_EAX
].LowWord
;
118 EmulatorContext
.GeneralRegs
[FAST486_REG_EAX
].LowWord
= Value
;
125 return EmulatorContext
.GeneralRegs
[FAST486_REG_EAX
].HighByte
;
132 EmulatorContext
.GeneralRegs
[FAST486_REG_EAX
].HighByte
= Value
;
139 return EmulatorContext
.GeneralRegs
[FAST486_REG_EAX
].LowByte
;
146 EmulatorContext
.GeneralRegs
[FAST486_REG_EAX
].LowByte
= Value
;
153 return EmulatorContext
.GeneralRegs
[FAST486_REG_EBX
].Long
;
160 EmulatorContext
.GeneralRegs
[FAST486_REG_EBX
].Long
= Value
;
167 return EmulatorContext
.GeneralRegs
[FAST486_REG_EBX
].LowWord
;
174 EmulatorContext
.GeneralRegs
[FAST486_REG_EBX
].LowWord
= Value
;
181 return EmulatorContext
.GeneralRegs
[FAST486_REG_EBX
].HighByte
;
188 EmulatorContext
.GeneralRegs
[FAST486_REG_EBX
].HighByte
= Value
;
195 return EmulatorContext
.GeneralRegs
[FAST486_REG_EBX
].LowByte
;
202 EmulatorContext
.GeneralRegs
[FAST486_REG_EBX
].LowByte
= Value
;
211 return EmulatorContext
.GeneralRegs
[FAST486_REG_ECX
].Long
;
218 EmulatorContext
.GeneralRegs
[FAST486_REG_ECX
].Long
= Value
;
225 return EmulatorContext
.GeneralRegs
[FAST486_REG_ECX
].LowWord
;
232 EmulatorContext
.GeneralRegs
[FAST486_REG_ECX
].LowWord
= Value
;
239 return EmulatorContext
.GeneralRegs
[FAST486_REG_ECX
].HighByte
;
246 EmulatorContext
.GeneralRegs
[FAST486_REG_ECX
].HighByte
= Value
;
253 return EmulatorContext
.GeneralRegs
[FAST486_REG_ECX
].LowByte
;
260 EmulatorContext
.GeneralRegs
[FAST486_REG_ECX
].LowByte
= Value
;
269 return EmulatorContext
.GeneralRegs
[FAST486_REG_EDX
].Long
;
276 EmulatorContext
.GeneralRegs
[FAST486_REG_EDX
].Long
= Value
;
283 return EmulatorContext
.GeneralRegs
[FAST486_REG_EDX
].LowWord
;
290 EmulatorContext
.GeneralRegs
[FAST486_REG_EDX
].LowWord
= Value
;
297 return EmulatorContext
.GeneralRegs
[FAST486_REG_EDX
].HighByte
;
304 EmulatorContext
.GeneralRegs
[FAST486_REG_EDX
].HighByte
= Value
;
311 return EmulatorContext
.GeneralRegs
[FAST486_REG_EDX
].LowByte
;
318 EmulatorContext
.GeneralRegs
[FAST486_REG_EDX
].LowByte
= Value
;
327 return EmulatorContext
.GeneralRegs
[FAST486_REG_ESP
].Long
;
334 Fast486SetStack(&EmulatorContext
, getSS(), Value
);
341 return EmulatorContext
.GeneralRegs
[FAST486_REG_ESP
].LowWord
;
348 Fast486SetStack(&EmulatorContext
, getSS(), Value
);
357 return EmulatorContext
.GeneralRegs
[FAST486_REG_EBP
].Long
;
364 EmulatorContext
.GeneralRegs
[FAST486_REG_EBP
].Long
= Value
;
371 return EmulatorContext
.GeneralRegs
[FAST486_REG_EBP
].LowWord
;
378 EmulatorContext
.GeneralRegs
[FAST486_REG_EBP
].LowWord
= Value
;
387 return EmulatorContext
.GeneralRegs
[FAST486_REG_ESI
].Long
;
394 EmulatorContext
.GeneralRegs
[FAST486_REG_ESI
].Long
= Value
;
401 return EmulatorContext
.GeneralRegs
[FAST486_REG_ESI
].LowWord
;
408 EmulatorContext
.GeneralRegs
[FAST486_REG_ESI
].LowWord
= Value
;
417 return EmulatorContext
.GeneralRegs
[FAST486_REG_EDI
].Long
;
424 EmulatorContext
.GeneralRegs
[FAST486_REG_EDI
].Long
= Value
;
431 return EmulatorContext
.GeneralRegs
[FAST486_REG_EDI
].LowWord
;
438 EmulatorContext
.GeneralRegs
[FAST486_REG_EDI
].LowWord
= Value
;
447 return EmulatorContext
.InstPtr
.Long
;
454 CpuExecute(getCS(), Value
);
461 return EmulatorContext
.InstPtr
.LowWord
;
468 CpuExecute(getCS(), Value
);
477 return EmulatorContext
.SegmentRegs
[FAST486_REG_CS
].Selector
;
484 Fast486SetSegment(&EmulatorContext
, FAST486_REG_CS
, Value
);
491 return EmulatorContext
.SegmentRegs
[FAST486_REG_SS
].Selector
;
498 Fast486SetSegment(&EmulatorContext
, FAST486_REG_SS
, Value
);
505 return EmulatorContext
.SegmentRegs
[FAST486_REG_DS
].Selector
;
512 Fast486SetSegment(&EmulatorContext
, FAST486_REG_DS
, Value
);
519 return EmulatorContext
.SegmentRegs
[FAST486_REG_ES
].Selector
;
526 Fast486SetSegment(&EmulatorContext
, FAST486_REG_ES
, Value
);
533 return EmulatorContext
.SegmentRegs
[FAST486_REG_FS
].Selector
;
540 Fast486SetSegment(&EmulatorContext
, FAST486_REG_FS
, Value
);
547 return EmulatorContext
.SegmentRegs
[FAST486_REG_GS
].Selector
;
554 Fast486SetSegment(&EmulatorContext
, FAST486_REG_GS
, Value
);
563 return EmulatorContext
.Flags
.Cf
;
570 EmulatorContext
.Flags
.Cf
= !!(Flag
& 1);
577 return EmulatorContext
.Flags
.Pf
;
584 EmulatorContext
.Flags
.Pf
= !!(Flag
& 1);
591 return EmulatorContext
.Flags
.Af
;
598 EmulatorContext
.Flags
.Af
= !!(Flag
& 1);
605 return EmulatorContext
.Flags
.Zf
;
612 EmulatorContext
.Flags
.Zf
= !!(Flag
& 1);
619 return EmulatorContext
.Flags
.Sf
;
626 EmulatorContext
.Flags
.Sf
= !!(Flag
& 1);
633 return EmulatorContext
.Flags
.If
;
640 EmulatorContext
.Flags
.If
= !!(Flag
& 1);
647 return EmulatorContext
.Flags
.Df
;
654 EmulatorContext
.Flags
.Df
= !!(Flag
& 1);
661 return EmulatorContext
.Flags
.Of
;
668 EmulatorContext
.Flags
.Of
= !!(Flag
& 1);
677 return EmulatorContext
.Flags
.Long
;
682 setEFLAGS(ULONG Flags
)
684 EmulatorContext
.Flags
.Long
= Flags
;
693 return LOWORD(EmulatorContext
.ControlRegisters
[FAST486_REG_CR0
]);
700 /* Set the lower 16 bits (Machine Status Word) of CR0 */
701 EmulatorContext
.ControlRegisters
[FAST486_REG_CR0
] &= 0xFFFF0000;
702 EmulatorContext
.ControlRegisters
[FAST486_REG_CR0
] |= Value
& 0xFFFF;