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 *******************************************************************/
16 #include "x86context.h"
18 /* PRIVATE VARIABLES **********************************************************/
20 // This structure must by synced with our CPU context
21 X86CONTEXT IntelRegPtr
;
23 /* PUBLIC FUNCTIONS ***********************************************************/
27 getIntelRegistersPointer(VOID
)
30 * Sync the Intel Registers x86 Context with our CPU context
33 if (IntelRegPtr
.ContextFlags
& CONTEXT_DEBUG_REGISTERS
)
35 IntelRegPtr
.Dr0
= EmulatorContext
.DebugRegisters
[FAST486_REG_DR0
];
36 IntelRegPtr
.Dr1
= EmulatorContext
.DebugRegisters
[FAST486_REG_DR1
];
37 IntelRegPtr
.Dr2
= EmulatorContext
.DebugRegisters
[FAST486_REG_DR2
];
38 IntelRegPtr
.Dr3
= EmulatorContext
.DebugRegisters
[FAST486_REG_DR3
];
39 IntelRegPtr
.Dr6
= EmulatorContext
.DebugRegisters
[FAST486_REG_DR6
];
40 IntelRegPtr
.Dr7
= EmulatorContext
.DebugRegisters
[FAST486_REG_DR7
];
43 #ifndef FAST486_NO_FPU
44 if (IntelRegPtr
.ContextFlags
& CONTEXT_FLOATING_POINT
)
46 // IntelRegPtr.FloatSave = ;
47 IntelRegPtr
.FloatSave
.ControlWord
= EmulatorContext
.FpuControl
.Value
;
48 IntelRegPtr
.FloatSave
.StatusWord
= EmulatorContext
.FpuStatus
.Value
;
49 // IntelRegPtr.FloatSave.TagWord = ;
50 // IntelRegPtr.FloatSave.ErrorOffset = ;
51 // IntelRegPtr.FloatSave.ErrorSelector = ;
52 // IntelRegPtr.FloatSave.DataOffset = ;
53 // IntelRegPtr.FloatSave.DataSelector = ;
54 // IntelRegPtr.FloatSave.RegisterArea = ; // This is a region of size SIZE_OF_80387_REGISTERS == 80 bytes
55 // IntelRegPtr.FloatSave.Cr0NpxState = ;
59 if (IntelRegPtr
.ContextFlags
& CONTEXT_SEGMENTS
)
61 IntelRegPtr
.SegGs
= EmulatorContext
.SegmentRegs
[FAST486_REG_GS
].Selector
;
62 IntelRegPtr
.SegFs
= EmulatorContext
.SegmentRegs
[FAST486_REG_FS
].Selector
;
63 IntelRegPtr
.SegEs
= EmulatorContext
.SegmentRegs
[FAST486_REG_ES
].Selector
;
64 IntelRegPtr
.SegDs
= EmulatorContext
.SegmentRegs
[FAST486_REG_DS
].Selector
;
67 if (IntelRegPtr
.ContextFlags
& CONTEXT_INTEGER
)
69 IntelRegPtr
.Edi
= EmulatorContext
.GeneralRegs
[FAST486_REG_EDI
].Long
;
70 IntelRegPtr
.Esi
= EmulatorContext
.GeneralRegs
[FAST486_REG_ESI
].Long
;
71 IntelRegPtr
.Ebx
= EmulatorContext
.GeneralRegs
[FAST486_REG_EBX
].Long
;
72 IntelRegPtr
.Edx
= EmulatorContext
.GeneralRegs
[FAST486_REG_EDX
].Long
;
73 IntelRegPtr
.Ecx
= EmulatorContext
.GeneralRegs
[FAST486_REG_ECX
].Long
;
74 IntelRegPtr
.Eax
= EmulatorContext
.GeneralRegs
[FAST486_REG_EAX
].Long
;
77 if (IntelRegPtr
.ContextFlags
& CONTEXT_CONTROL
)
79 IntelRegPtr
.Ebp
= EmulatorContext
.GeneralRegs
[FAST486_REG_EBP
].Long
;
80 IntelRegPtr
.Eip
= EmulatorContext
.InstPtr
.Long
;
81 IntelRegPtr
.SegCs
= EmulatorContext
.SegmentRegs
[FAST486_REG_CS
].Selector
;
82 IntelRegPtr
.EFlags
= EmulatorContext
.Flags
.Long
;
83 IntelRegPtr
.Esp
= EmulatorContext
.GeneralRegs
[FAST486_REG_ESP
].Long
;
84 IntelRegPtr
.SegSs
= EmulatorContext
.SegmentRegs
[FAST486_REG_SS
].Selector
;
87 if (IntelRegPtr
.ContextFlags
& CONTEXT_EXTENDED_REGISTERS
)
89 // IntelRegPtr.ExtendedRegisters = ;
92 /* Return the address of the Intel Registers x86 Context */
100 return EmulatorContext
.GeneralRegs
[FAST486_REG_EAX
].Long
;
107 EmulatorContext
.GeneralRegs
[FAST486_REG_EAX
].Long
= Value
;
114 return EmulatorContext
.GeneralRegs
[FAST486_REG_EAX
].LowWord
;
121 EmulatorContext
.GeneralRegs
[FAST486_REG_EAX
].LowWord
= Value
;
128 return EmulatorContext
.GeneralRegs
[FAST486_REG_EAX
].HighByte
;
135 EmulatorContext
.GeneralRegs
[FAST486_REG_EAX
].HighByte
= Value
;
142 return EmulatorContext
.GeneralRegs
[FAST486_REG_EAX
].LowByte
;
149 EmulatorContext
.GeneralRegs
[FAST486_REG_EAX
].LowByte
= Value
;
156 return EmulatorContext
.GeneralRegs
[FAST486_REG_EBX
].Long
;
163 EmulatorContext
.GeneralRegs
[FAST486_REG_EBX
].Long
= Value
;
170 return EmulatorContext
.GeneralRegs
[FAST486_REG_EBX
].LowWord
;
177 EmulatorContext
.GeneralRegs
[FAST486_REG_EBX
].LowWord
= Value
;
184 return EmulatorContext
.GeneralRegs
[FAST486_REG_EBX
].HighByte
;
191 EmulatorContext
.GeneralRegs
[FAST486_REG_EBX
].HighByte
= Value
;
198 return EmulatorContext
.GeneralRegs
[FAST486_REG_EBX
].LowByte
;
205 EmulatorContext
.GeneralRegs
[FAST486_REG_EBX
].LowByte
= Value
;
214 return EmulatorContext
.GeneralRegs
[FAST486_REG_ECX
].Long
;
221 EmulatorContext
.GeneralRegs
[FAST486_REG_ECX
].Long
= Value
;
228 return EmulatorContext
.GeneralRegs
[FAST486_REG_ECX
].LowWord
;
235 EmulatorContext
.GeneralRegs
[FAST486_REG_ECX
].LowWord
= Value
;
242 return EmulatorContext
.GeneralRegs
[FAST486_REG_ECX
].HighByte
;
249 EmulatorContext
.GeneralRegs
[FAST486_REG_ECX
].HighByte
= Value
;
256 return EmulatorContext
.GeneralRegs
[FAST486_REG_ECX
].LowByte
;
263 EmulatorContext
.GeneralRegs
[FAST486_REG_ECX
].LowByte
= Value
;
272 return EmulatorContext
.GeneralRegs
[FAST486_REG_EDX
].Long
;
279 EmulatorContext
.GeneralRegs
[FAST486_REG_EDX
].Long
= Value
;
286 return EmulatorContext
.GeneralRegs
[FAST486_REG_EDX
].LowWord
;
293 EmulatorContext
.GeneralRegs
[FAST486_REG_EDX
].LowWord
= Value
;
300 return EmulatorContext
.GeneralRegs
[FAST486_REG_EDX
].HighByte
;
307 EmulatorContext
.GeneralRegs
[FAST486_REG_EDX
].HighByte
= Value
;
314 return EmulatorContext
.GeneralRegs
[FAST486_REG_EDX
].LowByte
;
321 EmulatorContext
.GeneralRegs
[FAST486_REG_EDX
].LowByte
= Value
;
330 return EmulatorContext
.GeneralRegs
[FAST486_REG_ESP
].Long
;
337 Fast486SetStack(&EmulatorContext
, getSS(), Value
);
344 return EmulatorContext
.GeneralRegs
[FAST486_REG_ESP
].LowWord
;
351 Fast486SetStack(&EmulatorContext
, getSS(), Value
);
360 return EmulatorContext
.GeneralRegs
[FAST486_REG_EBP
].Long
;
367 EmulatorContext
.GeneralRegs
[FAST486_REG_EBP
].Long
= Value
;
374 return EmulatorContext
.GeneralRegs
[FAST486_REG_EBP
].LowWord
;
381 EmulatorContext
.GeneralRegs
[FAST486_REG_EBP
].LowWord
= Value
;
390 return EmulatorContext
.GeneralRegs
[FAST486_REG_ESI
].Long
;
397 EmulatorContext
.GeneralRegs
[FAST486_REG_ESI
].Long
= Value
;
404 return EmulatorContext
.GeneralRegs
[FAST486_REG_ESI
].LowWord
;
411 EmulatorContext
.GeneralRegs
[FAST486_REG_ESI
].LowWord
= Value
;
420 return EmulatorContext
.GeneralRegs
[FAST486_REG_EDI
].Long
;
427 EmulatorContext
.GeneralRegs
[FAST486_REG_EDI
].Long
= Value
;
434 return EmulatorContext
.GeneralRegs
[FAST486_REG_EDI
].LowWord
;
441 EmulatorContext
.GeneralRegs
[FAST486_REG_EDI
].LowWord
= Value
;
450 return EmulatorContext
.InstPtr
.Long
;
457 CpuExecute(getCS(), Value
);
464 return EmulatorContext
.InstPtr
.LowWord
;
471 CpuExecute(getCS(), Value
);
480 return EmulatorContext
.SegmentRegs
[FAST486_REG_CS
].Selector
;
487 Fast486SetSegment(&EmulatorContext
, FAST486_REG_CS
, Value
);
494 return EmulatorContext
.SegmentRegs
[FAST486_REG_SS
].Selector
;
501 Fast486SetSegment(&EmulatorContext
, FAST486_REG_SS
, Value
);
508 return EmulatorContext
.SegmentRegs
[FAST486_REG_DS
].Selector
;
515 Fast486SetSegment(&EmulatorContext
, FAST486_REG_DS
, Value
);
522 return EmulatorContext
.SegmentRegs
[FAST486_REG_ES
].Selector
;
529 Fast486SetSegment(&EmulatorContext
, FAST486_REG_ES
, Value
);
536 return EmulatorContext
.SegmentRegs
[FAST486_REG_FS
].Selector
;
543 Fast486SetSegment(&EmulatorContext
, FAST486_REG_FS
, Value
);
550 return EmulatorContext
.SegmentRegs
[FAST486_REG_GS
].Selector
;
557 Fast486SetSegment(&EmulatorContext
, FAST486_REG_GS
, Value
);
566 return EmulatorContext
.Flags
.Cf
;
573 EmulatorContext
.Flags
.Cf
= !!(Flag
& 1);
580 return EmulatorContext
.Flags
.Pf
;
587 EmulatorContext
.Flags
.Pf
= !!(Flag
& 1);
594 return EmulatorContext
.Flags
.Af
;
601 EmulatorContext
.Flags
.Af
= !!(Flag
& 1);
608 return EmulatorContext
.Flags
.Zf
;
615 EmulatorContext
.Flags
.Zf
= !!(Flag
& 1);
622 return EmulatorContext
.Flags
.Sf
;
629 EmulatorContext
.Flags
.Sf
= !!(Flag
& 1);
636 return EmulatorContext
.Flags
.If
;
643 EmulatorContext
.Flags
.If
= !!(Flag
& 1);
650 return EmulatorContext
.Flags
.Df
;
657 EmulatorContext
.Flags
.Df
= !!(Flag
& 1);
664 return EmulatorContext
.Flags
.Of
;
671 EmulatorContext
.Flags
.Of
= !!(Flag
& 1);
680 return EmulatorContext
.Flags
.Long
;
685 setEFLAGS(ULONG Flags
)
687 EmulatorContext
.Flags
.Long
= Flags
;
696 return LOWORD(EmulatorContext
.ControlRegisters
[FAST486_REG_CR0
]);
703 /* Set the lower 16 bits (Machine Status Word) of CR0 */
704 EmulatorContext
.ControlRegisters
[FAST486_REG_CR0
] &= 0xFFFF0000;
705 EmulatorContext
.ControlRegisters
[FAST486_REG_CR0
] |= Value
& 0xFFFF;