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 BOOLEAN
EmulatorGetFlag(ULONG Flag
)
20 return (EmulatorContext
.Flags
.Long
& Flag
) ? TRUE
: FALSE
;
23 VOID
EmulatorSetFlag(ULONG Flag
)
25 EmulatorContext
.Flags
.Long
|= Flag
;
28 VOID
EmulatorClearFlag(ULONG Flag
)
30 EmulatorContext
.Flags
.Long
&= ~Flag
;
33 VOID
EmulatorSetStack(WORD Segment
, DWORD Offset
)
35 Fast486SetStack(&EmulatorContext
, Segment
, Offset
);
44 return EmulatorContext
.GeneralRegs
[FAST486_REG_EAX
].Long
;
51 EmulatorContext
.GeneralRegs
[FAST486_REG_EAX
].Long
= Value
;
58 return EmulatorContext
.GeneralRegs
[FAST486_REG_EAX
].LowWord
;
65 EmulatorContext
.GeneralRegs
[FAST486_REG_EAX
].LowWord
= Value
;
72 return EmulatorContext
.GeneralRegs
[FAST486_REG_EAX
].HighByte
;
79 EmulatorContext
.GeneralRegs
[FAST486_REG_EAX
].HighByte
= Value
;
86 return EmulatorContext
.GeneralRegs
[FAST486_REG_EAX
].LowByte
;
93 EmulatorContext
.GeneralRegs
[FAST486_REG_EAX
].LowByte
= Value
;
100 return EmulatorContext
.GeneralRegs
[FAST486_REG_EBX
].Long
;
107 EmulatorContext
.GeneralRegs
[FAST486_REG_EBX
].Long
= Value
;
114 return EmulatorContext
.GeneralRegs
[FAST486_REG_EBX
].LowWord
;
121 EmulatorContext
.GeneralRegs
[FAST486_REG_EBX
].LowWord
= Value
;
128 return EmulatorContext
.GeneralRegs
[FAST486_REG_EBX
].HighByte
;
135 EmulatorContext
.GeneralRegs
[FAST486_REG_EBX
].HighByte
= Value
;
142 return EmulatorContext
.GeneralRegs
[FAST486_REG_EBX
].LowByte
;
149 EmulatorContext
.GeneralRegs
[FAST486_REG_EBX
].LowByte
= Value
;
158 return EmulatorContext
.GeneralRegs
[FAST486_REG_ECX
].Long
;
165 EmulatorContext
.GeneralRegs
[FAST486_REG_ECX
].Long
= Value
;
172 return EmulatorContext
.GeneralRegs
[FAST486_REG_ECX
].LowWord
;
179 EmulatorContext
.GeneralRegs
[FAST486_REG_ECX
].LowWord
= Value
;
186 return EmulatorContext
.GeneralRegs
[FAST486_REG_ECX
].HighByte
;
193 EmulatorContext
.GeneralRegs
[FAST486_REG_ECX
].HighByte
= Value
;
200 return EmulatorContext
.GeneralRegs
[FAST486_REG_ECX
].LowByte
;
207 EmulatorContext
.GeneralRegs
[FAST486_REG_ECX
].LowByte
= Value
;
216 return EmulatorContext
.GeneralRegs
[FAST486_REG_EDX
].Long
;
223 EmulatorContext
.GeneralRegs
[FAST486_REG_EDX
].Long
= Value
;
230 return EmulatorContext
.GeneralRegs
[FAST486_REG_EDX
].LowWord
;
237 EmulatorContext
.GeneralRegs
[FAST486_REG_EDX
].LowWord
= Value
;
244 return EmulatorContext
.GeneralRegs
[FAST486_REG_EDX
].HighByte
;
251 EmulatorContext
.GeneralRegs
[FAST486_REG_EDX
].HighByte
= Value
;
258 return EmulatorContext
.GeneralRegs
[FAST486_REG_EDX
].LowByte
;
265 EmulatorContext
.GeneralRegs
[FAST486_REG_EDX
].LowByte
= Value
;
274 return EmulatorContext
.GeneralRegs
[FAST486_REG_ESP
].Long
;
281 EmulatorSetStack(getSS(), Value
);
288 return EmulatorContext
.GeneralRegs
[FAST486_REG_ESP
].LowWord
;
295 EmulatorSetStack(getSS(), Value
);
304 return EmulatorContext
.GeneralRegs
[FAST486_REG_EBP
].Long
;
311 EmulatorContext
.GeneralRegs
[FAST486_REG_EBP
].Long
= Value
;
318 return EmulatorContext
.GeneralRegs
[FAST486_REG_EBP
].LowWord
;
325 EmulatorContext
.GeneralRegs
[FAST486_REG_EBP
].LowWord
= Value
;
334 return EmulatorContext
.GeneralRegs
[FAST486_REG_ESI
].Long
;
341 EmulatorContext
.GeneralRegs
[FAST486_REG_ESI
].Long
= Value
;
348 return EmulatorContext
.GeneralRegs
[FAST486_REG_ESI
].LowWord
;
355 EmulatorContext
.GeneralRegs
[FAST486_REG_ESI
].LowWord
= Value
;
364 return EmulatorContext
.GeneralRegs
[FAST486_REG_EDI
].Long
;
371 EmulatorContext
.GeneralRegs
[FAST486_REG_EDI
].Long
= Value
;
378 return EmulatorContext
.GeneralRegs
[FAST486_REG_EDI
].LowWord
;
385 EmulatorContext
.GeneralRegs
[FAST486_REG_EDI
].LowWord
= Value
;
394 return EmulatorContext
.InstPtr
.Long
;
401 EmulatorExecute(getCS(), Value
);
408 return EmulatorContext
.InstPtr
.LowWord
;
415 EmulatorExecute(getCS(), Value
);
424 return EmulatorContext
.SegmentRegs
[FAST486_REG_CS
].Selector
;
431 Fast486SetSegment(&EmulatorContext
, FAST486_REG_CS
, Value
);
438 return EmulatorContext
.SegmentRegs
[FAST486_REG_SS
].Selector
;
445 Fast486SetSegment(&EmulatorContext
, FAST486_REG_SS
, Value
);
452 return EmulatorContext
.SegmentRegs
[FAST486_REG_DS
].Selector
;
459 Fast486SetSegment(&EmulatorContext
, FAST486_REG_DS
, Value
);
466 return EmulatorContext
.SegmentRegs
[FAST486_REG_ES
].Selector
;
473 Fast486SetSegment(&EmulatorContext
, FAST486_REG_ES
, Value
);
480 return EmulatorContext
.SegmentRegs
[FAST486_REG_FS
].Selector
;
487 Fast486SetSegment(&EmulatorContext
, FAST486_REG_FS
, Value
);
494 return EmulatorContext
.SegmentRegs
[FAST486_REG_GS
].Selector
;
501 Fast486SetSegment(&EmulatorContext
, FAST486_REG_GS
, Value
);
510 return EmulatorGetFlag(EMULATOR_FLAG_CF
);
518 EmulatorSetFlag(EMULATOR_FLAG_CF
);
520 EmulatorClearFlag(EMULATOR_FLAG_CF
);
527 return EmulatorGetFlag(EMULATOR_FLAG_PF
);
535 EmulatorSetFlag(EMULATOR_FLAG_PF
);
537 EmulatorClearFlag(EMULATOR_FLAG_PF
);
544 return EmulatorGetFlag(EMULATOR_FLAG_AF
);
552 EmulatorSetFlag(EMULATOR_FLAG_AF
);
554 EmulatorClearFlag(EMULATOR_FLAG_AF
);
561 return EmulatorGetFlag(EMULATOR_FLAG_ZF
);
569 EmulatorSetFlag(EMULATOR_FLAG_ZF
);
571 EmulatorClearFlag(EMULATOR_FLAG_ZF
);
578 return EmulatorGetFlag(EMULATOR_FLAG_SF
);
586 EmulatorSetFlag(EMULATOR_FLAG_SF
);
588 EmulatorClearFlag(EMULATOR_FLAG_SF
);
595 return EmulatorGetFlag(EMULATOR_FLAG_IF
);
603 EmulatorSetFlag(EMULATOR_FLAG_IF
);
605 EmulatorClearFlag(EMULATOR_FLAG_IF
);
612 return EmulatorGetFlag(EMULATOR_FLAG_DF
);
620 EmulatorSetFlag(EMULATOR_FLAG_DF
);
622 EmulatorClearFlag(EMULATOR_FLAG_DF
);
629 return EmulatorGetFlag(EMULATOR_FLAG_OF
);
637 EmulatorSetFlag(EMULATOR_FLAG_OF
);
639 EmulatorClearFlag(EMULATOR_FLAG_OF
);
648 return EmulatorContext
.Flags
.Long
;
653 setEFLAGS(ULONG Flags
)
655 EmulatorContext
.Flags
.Long
= Flags
;
664 return LOWORD(EmulatorContext
.ControlRegisters
[FAST486_REG_CR0
]);
671 /* Set the lowest word (8 bits) */
672 EmulatorContext
.ControlRegisters
[FAST486_REG_CR0
] &= 0xFFFF0000;
673 EmulatorContext
.ControlRegisters
[FAST486_REG_CR0
] |= Value
& 0xFFFF;