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 *******************************************************************/
14 #include "registers.h"
16 /* PUBLIC FUNCTIONS ***********************************************************/
18 static inline BOOLEAN
EmulatorGetFlag(ULONG Flag
)
20 return (EmulatorContext
.Flags
.Long
& Flag
) ? TRUE
: FALSE
;
23 static inline VOID
EmulatorSetFlag(ULONG Flag
)
25 EmulatorContext
.Flags
.Long
|= Flag
;
28 static inline VOID
EmulatorClearFlag(ULONG Flag
)
30 EmulatorContext
.Flags
.Long
&= ~Flag
;
33 VOID
EmulatorSetStack(WORD Segment
, DWORD Offset
)
35 Fast486SetStack(&EmulatorContext
, Segment
, Offset
);
42 getIntelRegistersPointer(VOID
)
52 return EmulatorContext
.GeneralRegs
[FAST486_REG_EAX
].Long
;
59 EmulatorContext
.GeneralRegs
[FAST486_REG_EAX
].Long
= Value
;
66 return EmulatorContext
.GeneralRegs
[FAST486_REG_EAX
].LowWord
;
73 EmulatorContext
.GeneralRegs
[FAST486_REG_EAX
].LowWord
= Value
;
80 return EmulatorContext
.GeneralRegs
[FAST486_REG_EAX
].HighByte
;
87 EmulatorContext
.GeneralRegs
[FAST486_REG_EAX
].HighByte
= Value
;
94 return EmulatorContext
.GeneralRegs
[FAST486_REG_EAX
].LowByte
;
101 EmulatorContext
.GeneralRegs
[FAST486_REG_EAX
].LowByte
= Value
;
108 return EmulatorContext
.GeneralRegs
[FAST486_REG_EBX
].Long
;
115 EmulatorContext
.GeneralRegs
[FAST486_REG_EBX
].Long
= Value
;
122 return EmulatorContext
.GeneralRegs
[FAST486_REG_EBX
].LowWord
;
129 EmulatorContext
.GeneralRegs
[FAST486_REG_EBX
].LowWord
= Value
;
136 return EmulatorContext
.GeneralRegs
[FAST486_REG_EBX
].HighByte
;
143 EmulatorContext
.GeneralRegs
[FAST486_REG_EBX
].HighByte
= Value
;
150 return EmulatorContext
.GeneralRegs
[FAST486_REG_EBX
].LowByte
;
157 EmulatorContext
.GeneralRegs
[FAST486_REG_EBX
].LowByte
= Value
;
166 return EmulatorContext
.GeneralRegs
[FAST486_REG_ECX
].Long
;
173 EmulatorContext
.GeneralRegs
[FAST486_REG_ECX
].Long
= Value
;
180 return EmulatorContext
.GeneralRegs
[FAST486_REG_ECX
].LowWord
;
187 EmulatorContext
.GeneralRegs
[FAST486_REG_ECX
].LowWord
= Value
;
194 return EmulatorContext
.GeneralRegs
[FAST486_REG_ECX
].HighByte
;
201 EmulatorContext
.GeneralRegs
[FAST486_REG_ECX
].HighByte
= Value
;
208 return EmulatorContext
.GeneralRegs
[FAST486_REG_ECX
].LowByte
;
215 EmulatorContext
.GeneralRegs
[FAST486_REG_ECX
].LowByte
= Value
;
224 return EmulatorContext
.GeneralRegs
[FAST486_REG_EDX
].Long
;
231 EmulatorContext
.GeneralRegs
[FAST486_REG_EDX
].Long
= Value
;
238 return EmulatorContext
.GeneralRegs
[FAST486_REG_EDX
].LowWord
;
245 EmulatorContext
.GeneralRegs
[FAST486_REG_EDX
].LowWord
= Value
;
252 return EmulatorContext
.GeneralRegs
[FAST486_REG_EDX
].HighByte
;
259 EmulatorContext
.GeneralRegs
[FAST486_REG_EDX
].HighByte
= Value
;
266 return EmulatorContext
.GeneralRegs
[FAST486_REG_EDX
].LowByte
;
273 EmulatorContext
.GeneralRegs
[FAST486_REG_EDX
].LowByte
= Value
;
282 return EmulatorContext
.GeneralRegs
[FAST486_REG_ESP
].Long
;
289 EmulatorSetStack(getSS(), Value
);
296 return EmulatorContext
.GeneralRegs
[FAST486_REG_ESP
].LowWord
;
303 EmulatorSetStack(getSS(), Value
);
312 return EmulatorContext
.GeneralRegs
[FAST486_REG_EBP
].Long
;
319 EmulatorContext
.GeneralRegs
[FAST486_REG_EBP
].Long
= Value
;
326 return EmulatorContext
.GeneralRegs
[FAST486_REG_EBP
].LowWord
;
333 EmulatorContext
.GeneralRegs
[FAST486_REG_EBP
].LowWord
= Value
;
342 return EmulatorContext
.GeneralRegs
[FAST486_REG_ESI
].Long
;
349 EmulatorContext
.GeneralRegs
[FAST486_REG_ESI
].Long
= Value
;
356 return EmulatorContext
.GeneralRegs
[FAST486_REG_ESI
].LowWord
;
363 EmulatorContext
.GeneralRegs
[FAST486_REG_ESI
].LowWord
= Value
;
372 return EmulatorContext
.GeneralRegs
[FAST486_REG_EDI
].Long
;
379 EmulatorContext
.GeneralRegs
[FAST486_REG_EDI
].Long
= Value
;
386 return EmulatorContext
.GeneralRegs
[FAST486_REG_EDI
].LowWord
;
393 EmulatorContext
.GeneralRegs
[FAST486_REG_EDI
].LowWord
= Value
;
402 return EmulatorContext
.InstPtr
.Long
;
409 EmulatorExecute(getCS(), Value
);
416 return EmulatorContext
.InstPtr
.LowWord
;
423 EmulatorExecute(getCS(), Value
);
432 return EmulatorContext
.SegmentRegs
[FAST486_REG_CS
].Selector
;
439 Fast486SetSegment(&EmulatorContext
, FAST486_REG_CS
, Value
);
446 return EmulatorContext
.SegmentRegs
[FAST486_REG_SS
].Selector
;
453 Fast486SetSegment(&EmulatorContext
, FAST486_REG_SS
, Value
);
460 return EmulatorContext
.SegmentRegs
[FAST486_REG_DS
].Selector
;
467 Fast486SetSegment(&EmulatorContext
, FAST486_REG_DS
, Value
);
474 return EmulatorContext
.SegmentRegs
[FAST486_REG_ES
].Selector
;
481 Fast486SetSegment(&EmulatorContext
, FAST486_REG_ES
, Value
);
488 return EmulatorContext
.SegmentRegs
[FAST486_REG_FS
].Selector
;
495 Fast486SetSegment(&EmulatorContext
, FAST486_REG_FS
, Value
);
502 return EmulatorContext
.SegmentRegs
[FAST486_REG_GS
].Selector
;
509 Fast486SetSegment(&EmulatorContext
, FAST486_REG_GS
, Value
);
518 return EmulatorGetFlag(EMULATOR_FLAG_CF
);
526 EmulatorSetFlag(EMULATOR_FLAG_CF
);
528 EmulatorClearFlag(EMULATOR_FLAG_CF
);
535 return EmulatorGetFlag(EMULATOR_FLAG_PF
);
543 EmulatorSetFlag(EMULATOR_FLAG_PF
);
545 EmulatorClearFlag(EMULATOR_FLAG_PF
);
552 return EmulatorGetFlag(EMULATOR_FLAG_AF
);
560 EmulatorSetFlag(EMULATOR_FLAG_AF
);
562 EmulatorClearFlag(EMULATOR_FLAG_AF
);
569 return EmulatorGetFlag(EMULATOR_FLAG_ZF
);
577 EmulatorSetFlag(EMULATOR_FLAG_ZF
);
579 EmulatorClearFlag(EMULATOR_FLAG_ZF
);
586 return EmulatorGetFlag(EMULATOR_FLAG_SF
);
594 EmulatorSetFlag(EMULATOR_FLAG_SF
);
596 EmulatorClearFlag(EMULATOR_FLAG_SF
);
603 return EmulatorGetFlag(EMULATOR_FLAG_IF
);
611 EmulatorSetFlag(EMULATOR_FLAG_IF
);
613 EmulatorClearFlag(EMULATOR_FLAG_IF
);
620 return EmulatorGetFlag(EMULATOR_FLAG_DF
);
628 EmulatorSetFlag(EMULATOR_FLAG_DF
);
630 EmulatorClearFlag(EMULATOR_FLAG_DF
);
637 return EmulatorGetFlag(EMULATOR_FLAG_OF
);
645 EmulatorSetFlag(EMULATOR_FLAG_OF
);
647 EmulatorClearFlag(EMULATOR_FLAG_OF
);
656 return EmulatorContext
.Flags
.Long
;
661 setEFLAGS(ULONG Flags
)
663 EmulatorContext
.Flags
.Long
= Flags
;
672 return LOWORD(EmulatorContext
.ControlRegisters
[FAST486_REG_CR0
]);
679 /* Set the lower 16 bits (Machine Status Word) of CR0 */
680 EmulatorContext
.ControlRegisters
[FAST486_REG_CR0
] &= 0xFFFF0000;
681 EmulatorContext
.ControlRegisters
[FAST486_REG_CR0
] |= Value
& 0xFFFF;