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)
14 #include "x86context.h"
16 /* PRIVATE VARIABLES **********************************************************/
18 // This structure must by synced with our CPU context
19 X86CONTEXT IntelRegPtr
;
21 /* PUBLIC FUNCTIONS ***********************************************************/
25 getIntelRegistersPointer(VOID
)
28 * Sync the Intel Registers x86 Context with our CPU context
31 if (IntelRegPtr
.ContextFlags
& CONTEXT_DEBUG_REGISTERS
)
33 IntelRegPtr
.Dr0
= EmulatorContext
.DebugRegisters
[FAST486_REG_DR0
];
34 IntelRegPtr
.Dr1
= EmulatorContext
.DebugRegisters
[FAST486_REG_DR1
];
35 IntelRegPtr
.Dr2
= EmulatorContext
.DebugRegisters
[FAST486_REG_DR2
];
36 IntelRegPtr
.Dr3
= EmulatorContext
.DebugRegisters
[FAST486_REG_DR3
];
37 IntelRegPtr
.Dr6
= EmulatorContext
.DebugRegisters
[FAST486_REG_DR6
];
38 IntelRegPtr
.Dr7
= EmulatorContext
.DebugRegisters
[FAST486_REG_DR7
];
41 #ifndef FAST486_NO_FPU
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 = ;
57 if (IntelRegPtr
.ContextFlags
& CONTEXT_SEGMENTS
)
59 IntelRegPtr
.SegGs
= EmulatorContext
.SegmentRegs
[FAST486_REG_GS
].Selector
;
60 IntelRegPtr
.SegFs
= EmulatorContext
.SegmentRegs
[FAST486_REG_FS
].Selector
;
61 IntelRegPtr
.SegEs
= EmulatorContext
.SegmentRegs
[FAST486_REG_ES
].Selector
;
62 IntelRegPtr
.SegDs
= EmulatorContext
.SegmentRegs
[FAST486_REG_DS
].Selector
;
65 if (IntelRegPtr
.ContextFlags
& CONTEXT_INTEGER
)
67 IntelRegPtr
.Edi
= EmulatorContext
.GeneralRegs
[FAST486_REG_EDI
].Long
;
68 IntelRegPtr
.Esi
= EmulatorContext
.GeneralRegs
[FAST486_REG_ESI
].Long
;
69 IntelRegPtr
.Ebx
= EmulatorContext
.GeneralRegs
[FAST486_REG_EBX
].Long
;
70 IntelRegPtr
.Edx
= EmulatorContext
.GeneralRegs
[FAST486_REG_EDX
].Long
;
71 IntelRegPtr
.Ecx
= EmulatorContext
.GeneralRegs
[FAST486_REG_ECX
].Long
;
72 IntelRegPtr
.Eax
= EmulatorContext
.GeneralRegs
[FAST486_REG_EAX
].Long
;
75 if (IntelRegPtr
.ContextFlags
& CONTEXT_CONTROL
)
77 IntelRegPtr
.Ebp
= EmulatorContext
.GeneralRegs
[FAST486_REG_EBP
].Long
;
78 IntelRegPtr
.Eip
= EmulatorContext
.InstPtr
.Long
;
79 IntelRegPtr
.SegCs
= EmulatorContext
.SegmentRegs
[FAST486_REG_CS
].Selector
;
80 IntelRegPtr
.EFlags
= EmulatorContext
.Flags
.Long
;
81 IntelRegPtr
.Esp
= EmulatorContext
.GeneralRegs
[FAST486_REG_ESP
].Long
;
82 IntelRegPtr
.SegSs
= EmulatorContext
.SegmentRegs
[FAST486_REG_SS
].Selector
;
85 if (IntelRegPtr
.ContextFlags
& CONTEXT_EXTENDED_REGISTERS
)
87 // IntelRegPtr.ExtendedRegisters = ;
90 /* Return the address of the Intel Registers x86 Context */
98 return EmulatorContext
.GeneralRegs
[FAST486_REG_EAX
].Long
;
105 EmulatorContext
.GeneralRegs
[FAST486_REG_EAX
].Long
= Value
;
112 return EmulatorContext
.GeneralRegs
[FAST486_REG_EAX
].LowWord
;
119 EmulatorContext
.GeneralRegs
[FAST486_REG_EAX
].LowWord
= Value
;
126 return EmulatorContext
.GeneralRegs
[FAST486_REG_EAX
].HighByte
;
133 EmulatorContext
.GeneralRegs
[FAST486_REG_EAX
].HighByte
= Value
;
140 return EmulatorContext
.GeneralRegs
[FAST486_REG_EAX
].LowByte
;
147 EmulatorContext
.GeneralRegs
[FAST486_REG_EAX
].LowByte
= Value
;
154 return EmulatorContext
.GeneralRegs
[FAST486_REG_EBX
].Long
;
161 EmulatorContext
.GeneralRegs
[FAST486_REG_EBX
].Long
= Value
;
168 return EmulatorContext
.GeneralRegs
[FAST486_REG_EBX
].LowWord
;
175 EmulatorContext
.GeneralRegs
[FAST486_REG_EBX
].LowWord
= Value
;
182 return EmulatorContext
.GeneralRegs
[FAST486_REG_EBX
].HighByte
;
189 EmulatorContext
.GeneralRegs
[FAST486_REG_EBX
].HighByte
= Value
;
196 return EmulatorContext
.GeneralRegs
[FAST486_REG_EBX
].LowByte
;
203 EmulatorContext
.GeneralRegs
[FAST486_REG_EBX
].LowByte
= Value
;
212 return EmulatorContext
.GeneralRegs
[FAST486_REG_ECX
].Long
;
219 EmulatorContext
.GeneralRegs
[FAST486_REG_ECX
].Long
= Value
;
226 return EmulatorContext
.GeneralRegs
[FAST486_REG_ECX
].LowWord
;
233 EmulatorContext
.GeneralRegs
[FAST486_REG_ECX
].LowWord
= Value
;
240 return EmulatorContext
.GeneralRegs
[FAST486_REG_ECX
].HighByte
;
247 EmulatorContext
.GeneralRegs
[FAST486_REG_ECX
].HighByte
= Value
;
254 return EmulatorContext
.GeneralRegs
[FAST486_REG_ECX
].LowByte
;
261 EmulatorContext
.GeneralRegs
[FAST486_REG_ECX
].LowByte
= Value
;
270 return EmulatorContext
.GeneralRegs
[FAST486_REG_EDX
].Long
;
277 EmulatorContext
.GeneralRegs
[FAST486_REG_EDX
].Long
= Value
;
284 return EmulatorContext
.GeneralRegs
[FAST486_REG_EDX
].LowWord
;
291 EmulatorContext
.GeneralRegs
[FAST486_REG_EDX
].LowWord
= Value
;
298 return EmulatorContext
.GeneralRegs
[FAST486_REG_EDX
].HighByte
;
305 EmulatorContext
.GeneralRegs
[FAST486_REG_EDX
].HighByte
= Value
;
312 return EmulatorContext
.GeneralRegs
[FAST486_REG_EDX
].LowByte
;
319 EmulatorContext
.GeneralRegs
[FAST486_REG_EDX
].LowByte
= Value
;
328 return EmulatorContext
.GeneralRegs
[FAST486_REG_ESP
].Long
;
335 Fast486SetStack(&EmulatorContext
, getSS(), Value
);
342 return EmulatorContext
.GeneralRegs
[FAST486_REG_ESP
].LowWord
;
349 Fast486SetStack(&EmulatorContext
, getSS(), Value
);
358 return EmulatorContext
.GeneralRegs
[FAST486_REG_EBP
].Long
;
365 EmulatorContext
.GeneralRegs
[FAST486_REG_EBP
].Long
= Value
;
372 return EmulatorContext
.GeneralRegs
[FAST486_REG_EBP
].LowWord
;
379 EmulatorContext
.GeneralRegs
[FAST486_REG_EBP
].LowWord
= Value
;
388 return EmulatorContext
.GeneralRegs
[FAST486_REG_ESI
].Long
;
395 EmulatorContext
.GeneralRegs
[FAST486_REG_ESI
].Long
= Value
;
402 return EmulatorContext
.GeneralRegs
[FAST486_REG_ESI
].LowWord
;
409 EmulatorContext
.GeneralRegs
[FAST486_REG_ESI
].LowWord
= Value
;
418 return EmulatorContext
.GeneralRegs
[FAST486_REG_EDI
].Long
;
425 EmulatorContext
.GeneralRegs
[FAST486_REG_EDI
].Long
= Value
;
432 return EmulatorContext
.GeneralRegs
[FAST486_REG_EDI
].LowWord
;
439 EmulatorContext
.GeneralRegs
[FAST486_REG_EDI
].LowWord
= Value
;
448 return EmulatorContext
.InstPtr
.Long
;
455 CpuExecute(getCS(), Value
);
462 return EmulatorContext
.InstPtr
.LowWord
;
469 CpuExecute(getCS(), Value
);
478 return EmulatorContext
.SegmentRegs
[FAST486_REG_CS
].Selector
;
485 Fast486SetSegment(&EmulatorContext
, FAST486_REG_CS
, Value
);
492 return EmulatorContext
.SegmentRegs
[FAST486_REG_SS
].Selector
;
499 Fast486SetSegment(&EmulatorContext
, FAST486_REG_SS
, Value
);
506 return EmulatorContext
.SegmentRegs
[FAST486_REG_DS
].Selector
;
513 Fast486SetSegment(&EmulatorContext
, FAST486_REG_DS
, Value
);
520 return EmulatorContext
.SegmentRegs
[FAST486_REG_ES
].Selector
;
527 Fast486SetSegment(&EmulatorContext
, FAST486_REG_ES
, Value
);
534 return EmulatorContext
.SegmentRegs
[FAST486_REG_FS
].Selector
;
541 Fast486SetSegment(&EmulatorContext
, FAST486_REG_FS
, Value
);
548 return EmulatorContext
.SegmentRegs
[FAST486_REG_GS
].Selector
;
555 Fast486SetSegment(&EmulatorContext
, FAST486_REG_GS
, Value
);
564 return EmulatorContext
.Flags
.Cf
;
571 EmulatorContext
.Flags
.Cf
= !!(Flag
& 1);
578 return EmulatorContext
.Flags
.Pf
;
585 EmulatorContext
.Flags
.Pf
= !!(Flag
& 1);
592 return EmulatorContext
.Flags
.Af
;
599 EmulatorContext
.Flags
.Af
= !!(Flag
& 1);
606 return EmulatorContext
.Flags
.Zf
;
613 EmulatorContext
.Flags
.Zf
= !!(Flag
& 1);
620 return EmulatorContext
.Flags
.Sf
;
627 EmulatorContext
.Flags
.Sf
= !!(Flag
& 1);
634 return EmulatorContext
.Flags
.If
;
641 EmulatorContext
.Flags
.If
= !!(Flag
& 1);
648 return EmulatorContext
.Flags
.Df
;
655 EmulatorContext
.Flags
.Df
= !!(Flag
& 1);
662 return EmulatorContext
.Flags
.Of
;
669 EmulatorContext
.Flags
.Of
= !!(Flag
& 1);
678 return EmulatorContext
.Flags
.Long
;
683 setEFLAGS(ULONG Flags
)
685 EmulatorContext
.Flags
.Long
= Flags
;
694 return LOWORD(EmulatorContext
.ControlRegisters
[FAST486_REG_CR0
]);
701 /* Set the lower 16 bits (Machine Status Word) of CR0 */
702 EmulatorContext
.ControlRegisters
[FAST486_REG_CR0
] &= 0xFFFF0000;
703 EmulatorContext
.ControlRegisters
[FAST486_REG_CR0
] |= Value
& 0xFFFF;