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 *******************************************************************/
15 // TODO: Should be moved to fast486.h
35 /* PUBLIC FUNCTIONS ***********************************************************/
37 ULONG
EmulatorGetRegister(ULONG Register
)
39 if (Register
< EMULATOR_REG_ES
)
41 return EmulatorContext
.GeneralRegs
[Register
].Long
;
45 return EmulatorContext
.SegmentRegs
[Register
- EMULATOR_REG_ES
].Selector
;
49 VOID
EmulatorSetRegister(ULONG Register
, ULONG Value
)
51 if (Register
< EMULATOR_REG_ES
)
53 EmulatorContext
.GeneralRegs
[Register
].Long
= Value
;
57 Fast486SetSegment(&EmulatorContext
, Register
- EMULATOR_REG_ES
, (USHORT
)Value
);
61 BOOLEAN
EmulatorGetFlag(ULONG Flag
)
63 return (EmulatorContext
.Flags
.Long
& Flag
) ? TRUE
: FALSE
;
66 VOID
EmulatorSetFlag(ULONG Flag
)
68 EmulatorContext
.Flags
.Long
|= Flag
;
71 VOID
EmulatorClearFlag(ULONG Flag
)
73 EmulatorContext
.Flags
.Long
&= ~Flag
;
76 VOID
EmulatorSetStack(WORD Segment
, DWORD Offset
)
78 Fast486SetStack(&EmulatorContext
, Segment
, Offset
);
87 return EmulatorContext
.GeneralRegs
[EMULATOR_REG_EAX
].Long
;
94 EmulatorContext
.GeneralRegs
[EMULATOR_REG_EAX
].Long
= Value
;
101 return EmulatorContext
.GeneralRegs
[EMULATOR_REG_EAX
].LowWord
;
108 EmulatorContext
.GeneralRegs
[EMULATOR_REG_EAX
].LowWord
= Value
;
115 return EmulatorContext
.GeneralRegs
[EMULATOR_REG_EAX
].HighByte
;
122 EmulatorContext
.GeneralRegs
[EMULATOR_REG_EAX
].HighByte
= Value
;
129 return EmulatorContext
.GeneralRegs
[EMULATOR_REG_EAX
].LowByte
;
136 EmulatorContext
.GeneralRegs
[EMULATOR_REG_EAX
].LowByte
= Value
;
143 return EmulatorContext
.GeneralRegs
[EMULATOR_REG_EBX
].Long
;
150 EmulatorContext
.GeneralRegs
[EMULATOR_REG_EBX
].Long
= Value
;
157 return EmulatorContext
.GeneralRegs
[EMULATOR_REG_EBX
].LowWord
;
164 EmulatorContext
.GeneralRegs
[EMULATOR_REG_EBX
].LowWord
= Value
;
171 return EmulatorContext
.GeneralRegs
[EMULATOR_REG_EBX
].HighByte
;
178 EmulatorContext
.GeneralRegs
[EMULATOR_REG_EBX
].HighByte
= Value
;
185 return EmulatorContext
.GeneralRegs
[EMULATOR_REG_EBX
].LowByte
;
192 EmulatorContext
.GeneralRegs
[EMULATOR_REG_EBX
].LowByte
= Value
;
201 return EmulatorContext
.GeneralRegs
[EMULATOR_REG_ECX
].Long
;
208 EmulatorContext
.GeneralRegs
[EMULATOR_REG_ECX
].Long
= Value
;
215 return EmulatorContext
.GeneralRegs
[EMULATOR_REG_ECX
].LowWord
;
222 EmulatorContext
.GeneralRegs
[EMULATOR_REG_ECX
].LowWord
= Value
;
229 return EmulatorContext
.GeneralRegs
[EMULATOR_REG_ECX
].HighByte
;
236 EmulatorContext
.GeneralRegs
[EMULATOR_REG_ECX
].HighByte
= Value
;
243 return EmulatorContext
.GeneralRegs
[EMULATOR_REG_ECX
].LowByte
;
250 EmulatorContext
.GeneralRegs
[EMULATOR_REG_ECX
].LowByte
= Value
;
259 return EmulatorContext
.GeneralRegs
[EMULATOR_REG_EDX
].Long
;
266 EmulatorContext
.GeneralRegs
[EMULATOR_REG_EDX
].Long
= Value
;
273 return EmulatorContext
.GeneralRegs
[EMULATOR_REG_EDX
].LowWord
;
280 EmulatorContext
.GeneralRegs
[EMULATOR_REG_EDX
].LowWord
= Value
;
287 return EmulatorContext
.GeneralRegs
[EMULATOR_REG_EDX
].HighByte
;
294 EmulatorContext
.GeneralRegs
[EMULATOR_REG_EDX
].HighByte
= Value
;
301 return EmulatorContext
.GeneralRegs
[EMULATOR_REG_EDX
].LowByte
;
308 EmulatorContext
.GeneralRegs
[EMULATOR_REG_EDX
].LowByte
= Value
;
317 return EmulatorGetRegister(EMULATOR_REG_ESP
);
324 EmulatorSetStack(EmulatorGetRegister(EMULATOR_REG_SS
), Value
);
331 return LOWORD(EmulatorGetRegister(EMULATOR_REG_ESP
));
338 EmulatorSetStack(EmulatorGetRegister(EMULATOR_REG_SS
), Value
);
347 return EmulatorContext
.GeneralRegs
[EMULATOR_REG_EBP
].Long
;
354 EmulatorContext
.GeneralRegs
[EMULATOR_REG_EBP
].Long
= Value
;
361 return EmulatorContext
.GeneralRegs
[EMULATOR_REG_EBP
].LowWord
;
368 EmulatorContext
.GeneralRegs
[EMULATOR_REG_EBP
].LowWord
= Value
;
377 return EmulatorContext
.GeneralRegs
[EMULATOR_REG_ESI
].Long
;
384 EmulatorContext
.GeneralRegs
[EMULATOR_REG_ESI
].Long
= Value
;
391 return EmulatorContext
.GeneralRegs
[EMULATOR_REG_ESI
].LowWord
;
398 EmulatorContext
.GeneralRegs
[EMULATOR_REG_ESI
].LowWord
= Value
;
407 return EmulatorContext
.GeneralRegs
[EMULATOR_REG_EDI
].Long
;
414 EmulatorContext
.GeneralRegs
[EMULATOR_REG_EDI
].Long
= Value
;
421 return EmulatorContext
.GeneralRegs
[EMULATOR_REG_EDI
].LowWord
;
428 EmulatorContext
.GeneralRegs
[EMULATOR_REG_EDI
].LowWord
= Value
;
437 return EmulatorContext
.InstPtr
.Long
;
444 EmulatorExecute(EmulatorGetRegister(EMULATOR_REG_CS
), Value
);
451 return EmulatorContext
.InstPtr
.LowWord
;
458 EmulatorExecute(EmulatorGetRegister(EMULATOR_REG_CS
), Value
);
467 return EmulatorGetRegister(EMULATOR_REG_CS
);
474 EmulatorSetRegister(EMULATOR_REG_CS
, Value
);
481 return EmulatorGetRegister(EMULATOR_REG_SS
);
488 EmulatorSetRegister(EMULATOR_REG_SS
, Value
);
495 return EmulatorGetRegister(EMULATOR_REG_DS
);
502 EmulatorSetRegister(EMULATOR_REG_DS
, Value
);
509 return EmulatorGetRegister(EMULATOR_REG_ES
);
516 EmulatorSetRegister(EMULATOR_REG_ES
, Value
);
523 return EmulatorGetRegister(EMULATOR_REG_FS
);
530 EmulatorSetRegister(EMULATOR_REG_FS
, Value
);
537 return EmulatorGetRegister(EMULATOR_REG_GS
);
544 EmulatorSetRegister(EMULATOR_REG_GS
, Value
);
553 return EmulatorGetFlag(EMULATOR_FLAG_CF
);
561 EmulatorSetFlag(EMULATOR_FLAG_CF
);
563 EmulatorClearFlag(EMULATOR_FLAG_CF
);
570 return EmulatorGetFlag(EMULATOR_FLAG_PF
);
578 EmulatorSetFlag(EMULATOR_FLAG_PF
);
580 EmulatorClearFlag(EMULATOR_FLAG_PF
);
587 return EmulatorGetFlag(EMULATOR_FLAG_AF
);
595 EmulatorSetFlag(EMULATOR_FLAG_AF
);
597 EmulatorClearFlag(EMULATOR_FLAG_AF
);
604 return EmulatorGetFlag(EMULATOR_FLAG_ZF
);
612 EmulatorSetFlag(EMULATOR_FLAG_ZF
);
614 EmulatorClearFlag(EMULATOR_FLAG_ZF
);
621 return EmulatorGetFlag(EMULATOR_FLAG_SF
);
629 EmulatorSetFlag(EMULATOR_FLAG_SF
);
631 EmulatorClearFlag(EMULATOR_FLAG_SF
);
638 return EmulatorGetFlag(EMULATOR_FLAG_IF
);
646 EmulatorSetFlag(EMULATOR_FLAG_IF
);
648 EmulatorClearFlag(EMULATOR_FLAG_IF
);
655 return EmulatorGetFlag(EMULATOR_FLAG_DF
);
663 EmulatorSetFlag(EMULATOR_FLAG_DF
);
665 EmulatorClearFlag(EMULATOR_FLAG_DF
);
672 return EmulatorGetFlag(EMULATOR_FLAG_OF
);
680 EmulatorSetFlag(EMULATOR_FLAG_OF
);
682 EmulatorClearFlag(EMULATOR_FLAG_OF
);
691 return EmulatorContext
.Flags
.Long
;
696 setEFLAGS(ULONG Flags
)
698 EmulatorContext
.Flags
.Long
= Flags
;
707 return 0; // UNIMPLEMENTED