2 * COPYRIGHT: GPL - See COPYING in the top level directory
3 * PROJECT: ReactOS Virtual DOS Machine
4 * FILE: subsystems/mvdm/ntvdm/cpu/registers.c
5 * PURPOSE: Exported functions for manipulating registers
6 * PROGRAMMERS: Hermes Belusca-Maito (hermes.belusca@sfr.fr)
9 /* INCLUDES *******************************************************************/
18 #include "x86context.h"
20 /* PRIVATE VARIABLES **********************************************************/
22 // This structure must by synced with our CPU context
23 X86CONTEXT IntelRegPtr
;
25 /* PUBLIC FUNCTIONS ***********************************************************/
29 getIntelRegistersPointer(VOID
)
32 * Sync the Intel Registers x86 Context with our CPU context
35 if (IntelRegPtr
.ContextFlags
& CONTEXT_DEBUG_REGISTERS
)
37 IntelRegPtr
.Dr0
= EmulatorContext
.DebugRegisters
[FAST486_REG_DR0
];
38 IntelRegPtr
.Dr1
= EmulatorContext
.DebugRegisters
[FAST486_REG_DR1
];
39 IntelRegPtr
.Dr2
= EmulatorContext
.DebugRegisters
[FAST486_REG_DR2
];
40 IntelRegPtr
.Dr3
= EmulatorContext
.DebugRegisters
[FAST486_REG_DR3
];
41 IntelRegPtr
.Dr6
= EmulatorContext
.DebugRegisters
[FAST486_REG_DR6
];
42 IntelRegPtr
.Dr7
= EmulatorContext
.DebugRegisters
[FAST486_REG_DR7
];
45 #ifndef FAST486_NO_FPU
46 if (IntelRegPtr
.ContextFlags
& CONTEXT_FLOATING_POINT
)
48 // IntelRegPtr.FloatSave = ;
49 IntelRegPtr
.FloatSave
.ControlWord
= EmulatorContext
.FpuControl
.Value
;
50 IntelRegPtr
.FloatSave
.StatusWord
= EmulatorContext
.FpuStatus
.Value
;
51 // IntelRegPtr.FloatSave.TagWord = ;
52 // IntelRegPtr.FloatSave.ErrorOffset = ;
53 // IntelRegPtr.FloatSave.ErrorSelector = ;
54 // IntelRegPtr.FloatSave.DataOffset = ;
55 // IntelRegPtr.FloatSave.DataSelector = ;
56 // IntelRegPtr.FloatSave.RegisterArea = ; // This is a region of size SIZE_OF_80387_REGISTERS == 80 bytes
57 // IntelRegPtr.FloatSave.Cr0NpxState = ;
61 if (IntelRegPtr
.ContextFlags
& CONTEXT_SEGMENTS
)
63 IntelRegPtr
.SegGs
= EmulatorContext
.SegmentRegs
[FAST486_REG_GS
].Selector
;
64 IntelRegPtr
.SegFs
= EmulatorContext
.SegmentRegs
[FAST486_REG_FS
].Selector
;
65 IntelRegPtr
.SegEs
= EmulatorContext
.SegmentRegs
[FAST486_REG_ES
].Selector
;
66 IntelRegPtr
.SegDs
= EmulatorContext
.SegmentRegs
[FAST486_REG_DS
].Selector
;
69 if (IntelRegPtr
.ContextFlags
& CONTEXT_INTEGER
)
71 IntelRegPtr
.Edi
= EmulatorContext
.GeneralRegs
[FAST486_REG_EDI
].Long
;
72 IntelRegPtr
.Esi
= EmulatorContext
.GeneralRegs
[FAST486_REG_ESI
].Long
;
73 IntelRegPtr
.Ebx
= EmulatorContext
.GeneralRegs
[FAST486_REG_EBX
].Long
;
74 IntelRegPtr
.Edx
= EmulatorContext
.GeneralRegs
[FAST486_REG_EDX
].Long
;
75 IntelRegPtr
.Ecx
= EmulatorContext
.GeneralRegs
[FAST486_REG_ECX
].Long
;
76 IntelRegPtr
.Eax
= EmulatorContext
.GeneralRegs
[FAST486_REG_EAX
].Long
;
79 if (IntelRegPtr
.ContextFlags
& CONTEXT_CONTROL
)
81 IntelRegPtr
.Ebp
= EmulatorContext
.GeneralRegs
[FAST486_REG_EBP
].Long
;
82 IntelRegPtr
.Eip
= EmulatorContext
.InstPtr
.Long
;
83 IntelRegPtr
.SegCs
= EmulatorContext
.SegmentRegs
[FAST486_REG_CS
].Selector
;
84 IntelRegPtr
.EFlags
= EmulatorContext
.Flags
.Long
;
85 IntelRegPtr
.Esp
= EmulatorContext
.GeneralRegs
[FAST486_REG_ESP
].Long
;
86 IntelRegPtr
.SegSs
= EmulatorContext
.SegmentRegs
[FAST486_REG_SS
].Selector
;
89 if (IntelRegPtr
.ContextFlags
& CONTEXT_EXTENDED_REGISTERS
)
91 // IntelRegPtr.ExtendedRegisters = ;
94 /* Return the address of the Intel Registers x86 Context */
102 return EmulatorContext
.GeneralRegs
[FAST486_REG_EAX
].Long
;
109 EmulatorContext
.GeneralRegs
[FAST486_REG_EAX
].Long
= Value
;
116 return EmulatorContext
.GeneralRegs
[FAST486_REG_EAX
].LowWord
;
123 EmulatorContext
.GeneralRegs
[FAST486_REG_EAX
].LowWord
= Value
;
130 return EmulatorContext
.GeneralRegs
[FAST486_REG_EAX
].HighByte
;
137 EmulatorContext
.GeneralRegs
[FAST486_REG_EAX
].HighByte
= Value
;
144 return EmulatorContext
.GeneralRegs
[FAST486_REG_EAX
].LowByte
;
151 EmulatorContext
.GeneralRegs
[FAST486_REG_EAX
].LowByte
= Value
;
158 return EmulatorContext
.GeneralRegs
[FAST486_REG_EBX
].Long
;
165 EmulatorContext
.GeneralRegs
[FAST486_REG_EBX
].Long
= Value
;
172 return EmulatorContext
.GeneralRegs
[FAST486_REG_EBX
].LowWord
;
179 EmulatorContext
.GeneralRegs
[FAST486_REG_EBX
].LowWord
= Value
;
186 return EmulatorContext
.GeneralRegs
[FAST486_REG_EBX
].HighByte
;
193 EmulatorContext
.GeneralRegs
[FAST486_REG_EBX
].HighByte
= Value
;
200 return EmulatorContext
.GeneralRegs
[FAST486_REG_EBX
].LowByte
;
207 EmulatorContext
.GeneralRegs
[FAST486_REG_EBX
].LowByte
= Value
;
216 return EmulatorContext
.GeneralRegs
[FAST486_REG_ECX
].Long
;
223 EmulatorContext
.GeneralRegs
[FAST486_REG_ECX
].Long
= Value
;
230 return EmulatorContext
.GeneralRegs
[FAST486_REG_ECX
].LowWord
;
237 EmulatorContext
.GeneralRegs
[FAST486_REG_ECX
].LowWord
= Value
;
244 return EmulatorContext
.GeneralRegs
[FAST486_REG_ECX
].HighByte
;
251 EmulatorContext
.GeneralRegs
[FAST486_REG_ECX
].HighByte
= Value
;
258 return EmulatorContext
.GeneralRegs
[FAST486_REG_ECX
].LowByte
;
265 EmulatorContext
.GeneralRegs
[FAST486_REG_ECX
].LowByte
= Value
;
274 return EmulatorContext
.GeneralRegs
[FAST486_REG_EDX
].Long
;
281 EmulatorContext
.GeneralRegs
[FAST486_REG_EDX
].Long
= Value
;
288 return EmulatorContext
.GeneralRegs
[FAST486_REG_EDX
].LowWord
;
295 EmulatorContext
.GeneralRegs
[FAST486_REG_EDX
].LowWord
= Value
;
302 return EmulatorContext
.GeneralRegs
[FAST486_REG_EDX
].HighByte
;
309 EmulatorContext
.GeneralRegs
[FAST486_REG_EDX
].HighByte
= Value
;
316 return EmulatorContext
.GeneralRegs
[FAST486_REG_EDX
].LowByte
;
323 EmulatorContext
.GeneralRegs
[FAST486_REG_EDX
].LowByte
= Value
;
332 return EmulatorContext
.GeneralRegs
[FAST486_REG_ESP
].Long
;
339 Fast486SetStack(&EmulatorContext
, getSS(), Value
);
346 return EmulatorContext
.GeneralRegs
[FAST486_REG_ESP
].LowWord
;
353 Fast486SetStack(&EmulatorContext
, getSS(), Value
);
362 return EmulatorContext
.GeneralRegs
[FAST486_REG_EBP
].Long
;
369 EmulatorContext
.GeneralRegs
[FAST486_REG_EBP
].Long
= Value
;
376 return EmulatorContext
.GeneralRegs
[FAST486_REG_EBP
].LowWord
;
383 EmulatorContext
.GeneralRegs
[FAST486_REG_EBP
].LowWord
= Value
;
392 return EmulatorContext
.GeneralRegs
[FAST486_REG_ESI
].Long
;
399 EmulatorContext
.GeneralRegs
[FAST486_REG_ESI
].Long
= Value
;
406 return EmulatorContext
.GeneralRegs
[FAST486_REG_ESI
].LowWord
;
413 EmulatorContext
.GeneralRegs
[FAST486_REG_ESI
].LowWord
= Value
;
422 return EmulatorContext
.GeneralRegs
[FAST486_REG_EDI
].Long
;
429 EmulatorContext
.GeneralRegs
[FAST486_REG_EDI
].Long
= Value
;
436 return EmulatorContext
.GeneralRegs
[FAST486_REG_EDI
].LowWord
;
443 EmulatorContext
.GeneralRegs
[FAST486_REG_EDI
].LowWord
= Value
;
452 return EmulatorContext
.InstPtr
.Long
;
459 CpuExecute(getCS(), Value
);
466 return EmulatorContext
.InstPtr
.LowWord
;
473 CpuExecute(getCS(), Value
);
482 return EmulatorContext
.SegmentRegs
[FAST486_REG_CS
].Selector
;
489 Fast486SetSegment(&EmulatorContext
, FAST486_REG_CS
, Value
);
496 return EmulatorContext
.SegmentRegs
[FAST486_REG_SS
].Selector
;
503 Fast486SetSegment(&EmulatorContext
, FAST486_REG_SS
, Value
);
510 return EmulatorContext
.SegmentRegs
[FAST486_REG_DS
].Selector
;
517 Fast486SetSegment(&EmulatorContext
, FAST486_REG_DS
, Value
);
524 return EmulatorContext
.SegmentRegs
[FAST486_REG_ES
].Selector
;
531 Fast486SetSegment(&EmulatorContext
, FAST486_REG_ES
, Value
);
538 return EmulatorContext
.SegmentRegs
[FAST486_REG_FS
].Selector
;
545 Fast486SetSegment(&EmulatorContext
, FAST486_REG_FS
, Value
);
552 return EmulatorContext
.SegmentRegs
[FAST486_REG_GS
].Selector
;
559 Fast486SetSegment(&EmulatorContext
, FAST486_REG_GS
, Value
);
568 return EmulatorContext
.Flags
.Cf
;
575 EmulatorContext
.Flags
.Cf
= !!(Flag
& 1);
582 return EmulatorContext
.Flags
.Pf
;
589 EmulatorContext
.Flags
.Pf
= !!(Flag
& 1);
596 return EmulatorContext
.Flags
.Af
;
603 EmulatorContext
.Flags
.Af
= !!(Flag
& 1);
610 return EmulatorContext
.Flags
.Zf
;
617 EmulatorContext
.Flags
.Zf
= !!(Flag
& 1);
624 return EmulatorContext
.Flags
.Sf
;
631 EmulatorContext
.Flags
.Sf
= !!(Flag
& 1);
638 return EmulatorContext
.Flags
.If
;
645 EmulatorContext
.Flags
.If
= !!(Flag
& 1);
652 return EmulatorContext
.Flags
.Df
;
659 EmulatorContext
.Flags
.Df
= !!(Flag
& 1);
666 return EmulatorContext
.Flags
.Of
;
673 EmulatorContext
.Flags
.Of
= !!(Flag
& 1);
682 return EmulatorContext
.Flags
.Long
;
687 setEFLAGS(ULONG Flags
)
689 EmulatorContext
.Flags
.Long
= Flags
;
698 return LOWORD(EmulatorContext
.ControlRegisters
[FAST486_REG_CR0
]);
705 /* Set the lower 16 bits (Machine Status Word) of CR0 */
706 EmulatorContext
.ControlRegisters
[FAST486_REG_CR0
] &= 0xFFFF0000;
707 EmulatorContext
.ControlRegisters
[FAST486_REG_CR0
] |= Value
& 0xFFFF;