xref: /reactos/subsystems/mvdm/ntvdm/cpu/registers.c (revision c2c66aff)
1 /*
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)
7  */
8 
9 /* INCLUDES *******************************************************************/
10 
11 #include "ntvdm.h"
12 
13 #define NDEBUG
14 #include <debug.h>
15 
16 #include "emulator.h"
17 #include "cpu.h"
18 #include "x86context.h"
19 
20 /* PRIVATE VARIABLES **********************************************************/
21 
22 // This structure must by synced with our CPU context
23 X86CONTEXT IntelRegPtr;
24 
25 /* PUBLIC FUNCTIONS ***********************************************************/
26 
27 PVOID
28 WINAPI
getIntelRegistersPointer(VOID)29 getIntelRegistersPointer(VOID)
30 {
31     /*
32      * Sync the Intel Registers x86 Context with our CPU context
33      */
34 
35     if (IntelRegPtr.ContextFlags & CONTEXT_DEBUG_REGISTERS)
36     {
37         IntelRegPtr.Dr0 = EmulatorContext.DebugRegisters[FAST486_REG_DR0];
38         IntelRegPtr.Dr1 = EmulatorContext.DebugRegisters[FAST486_REG_DR1];
39         IntelRegPtr.Dr2 = EmulatorContext.DebugRegisters[FAST486_REG_DR2];
40         IntelRegPtr.Dr3 = EmulatorContext.DebugRegisters[FAST486_REG_DR3];
41         IntelRegPtr.Dr6 = EmulatorContext.DebugRegisters[FAST486_REG_DR6];
42         IntelRegPtr.Dr7 = EmulatorContext.DebugRegisters[FAST486_REG_DR7];
43     }
44 
45 #ifndef FAST486_NO_FPU
46     if (IntelRegPtr.ContextFlags & CONTEXT_FLOATING_POINT)
47     {
48         // IntelRegPtr.FloatSave = ;
49         IntelRegPtr.FloatSave.ControlWord   = EmulatorContext.FpuControl.Value;
50         IntelRegPtr.FloatSave.StatusWord    = EmulatorContext.FpuStatus.Value;
51         // IntelRegPtr.FloatSave.TagWord       = ;
52         // IntelRegPtr.FloatSave.ErrorOffset   = ;
53         // IntelRegPtr.FloatSave.ErrorSelector = ;
54         // IntelRegPtr.FloatSave.DataOffset    = ;
55         // IntelRegPtr.FloatSave.DataSelector  = ;
56         // IntelRegPtr.FloatSave.RegisterArea  = ; // This is a region of size SIZE_OF_80387_REGISTERS == 80 bytes
57         // IntelRegPtr.FloatSave.Cr0NpxState   = ;
58     }
59 #endif
60 
61     if (IntelRegPtr.ContextFlags & CONTEXT_SEGMENTS)
62     {
63         IntelRegPtr.SegGs = EmulatorContext.SegmentRegs[FAST486_REG_GS].Selector;
64         IntelRegPtr.SegFs = EmulatorContext.SegmentRegs[FAST486_REG_FS].Selector;
65         IntelRegPtr.SegEs = EmulatorContext.SegmentRegs[FAST486_REG_ES].Selector;
66         IntelRegPtr.SegDs = EmulatorContext.SegmentRegs[FAST486_REG_DS].Selector;
67     }
68 
69     if (IntelRegPtr.ContextFlags & CONTEXT_INTEGER)
70     {
71         IntelRegPtr.Edi = EmulatorContext.GeneralRegs[FAST486_REG_EDI].Long;
72         IntelRegPtr.Esi = EmulatorContext.GeneralRegs[FAST486_REG_ESI].Long;
73         IntelRegPtr.Ebx = EmulatorContext.GeneralRegs[FAST486_REG_EBX].Long;
74         IntelRegPtr.Edx = EmulatorContext.GeneralRegs[FAST486_REG_EDX].Long;
75         IntelRegPtr.Ecx = EmulatorContext.GeneralRegs[FAST486_REG_ECX].Long;
76         IntelRegPtr.Eax = EmulatorContext.GeneralRegs[FAST486_REG_EAX].Long;
77     }
78 
79     if (IntelRegPtr.ContextFlags & CONTEXT_CONTROL)
80     {
81         IntelRegPtr.Ebp     = EmulatorContext.GeneralRegs[FAST486_REG_EBP].Long;
82         IntelRegPtr.Eip     = EmulatorContext.InstPtr.Long;
83         IntelRegPtr.SegCs   = EmulatorContext.SegmentRegs[FAST486_REG_CS].Selector;
84         IntelRegPtr.EFlags  = EmulatorContext.Flags.Long;
85         IntelRegPtr.Esp     = EmulatorContext.GeneralRegs[FAST486_REG_ESP].Long;
86         IntelRegPtr.SegSs   = EmulatorContext.SegmentRegs[FAST486_REG_SS].Selector;
87     }
88 
89     if (IntelRegPtr.ContextFlags & CONTEXT_EXTENDED_REGISTERS)
90     {
91         // IntelRegPtr.ExtendedRegisters = ;
92     }
93 
94     /* Return the address of the Intel Registers x86 Context */
95     return &IntelRegPtr;
96 }
97 
98 ULONG
99 WINAPI
getEAX(VOID)100 getEAX(VOID)
101 {
102     return EmulatorContext.GeneralRegs[FAST486_REG_EAX].Long;
103 }
104 
105 VOID
106 WINAPI
setEAX(ULONG Value)107 setEAX(ULONG Value)
108 {
109     EmulatorContext.GeneralRegs[FAST486_REG_EAX].Long = Value;
110 }
111 
112 USHORT
113 WINAPI
getAX(VOID)114 getAX(VOID)
115 {
116     return EmulatorContext.GeneralRegs[FAST486_REG_EAX].LowWord;
117 }
118 
119 VOID
120 WINAPI
setAX(USHORT Value)121 setAX(USHORT Value)
122 {
123     EmulatorContext.GeneralRegs[FAST486_REG_EAX].LowWord = Value;
124 }
125 
126 UCHAR
127 WINAPI
getAH(VOID)128 getAH(VOID)
129 {
130     return EmulatorContext.GeneralRegs[FAST486_REG_EAX].HighByte;
131 }
132 
133 VOID
134 WINAPI
setAH(UCHAR Value)135 setAH(UCHAR Value)
136 {
137     EmulatorContext.GeneralRegs[FAST486_REG_EAX].HighByte = Value;
138 }
139 
140 UCHAR
141 WINAPI
getAL(VOID)142 getAL(VOID)
143 {
144     return EmulatorContext.GeneralRegs[FAST486_REG_EAX].LowByte;
145 }
146 
147 VOID
148 WINAPI
setAL(UCHAR Value)149 setAL(UCHAR Value)
150 {
151     EmulatorContext.GeneralRegs[FAST486_REG_EAX].LowByte = Value;
152 }
153 
154 ULONG
155 WINAPI
getEBX(VOID)156 getEBX(VOID)
157 {
158     return EmulatorContext.GeneralRegs[FAST486_REG_EBX].Long;
159 }
160 
161 VOID
162 WINAPI
setEBX(ULONG Value)163 setEBX(ULONG Value)
164 {
165     EmulatorContext.GeneralRegs[FAST486_REG_EBX].Long = Value;
166 }
167 
168 USHORT
169 WINAPI
getBX(VOID)170 getBX(VOID)
171 {
172     return EmulatorContext.GeneralRegs[FAST486_REG_EBX].LowWord;
173 }
174 
175 VOID
176 WINAPI
setBX(USHORT Value)177 setBX(USHORT Value)
178 {
179     EmulatorContext.GeneralRegs[FAST486_REG_EBX].LowWord = Value;
180 }
181 
182 UCHAR
183 WINAPI
getBH(VOID)184 getBH(VOID)
185 {
186     return EmulatorContext.GeneralRegs[FAST486_REG_EBX].HighByte;
187 }
188 
189 VOID
190 WINAPI
setBH(UCHAR Value)191 setBH(UCHAR Value)
192 {
193     EmulatorContext.GeneralRegs[FAST486_REG_EBX].HighByte = Value;
194 }
195 
196 UCHAR
197 WINAPI
getBL(VOID)198 getBL(VOID)
199 {
200     return EmulatorContext.GeneralRegs[FAST486_REG_EBX].LowByte;
201 }
202 
203 VOID
204 WINAPI
setBL(UCHAR Value)205 setBL(UCHAR Value)
206 {
207     EmulatorContext.GeneralRegs[FAST486_REG_EBX].LowByte = Value;
208 }
209 
210 
211 
212 ULONG
213 WINAPI
getECX(VOID)214 getECX(VOID)
215 {
216     return EmulatorContext.GeneralRegs[FAST486_REG_ECX].Long;
217 }
218 
219 VOID
220 WINAPI
setECX(ULONG Value)221 setECX(ULONG Value)
222 {
223     EmulatorContext.GeneralRegs[FAST486_REG_ECX].Long = Value;
224 }
225 
226 USHORT
227 WINAPI
getCX(VOID)228 getCX(VOID)
229 {
230     return EmulatorContext.GeneralRegs[FAST486_REG_ECX].LowWord;
231 }
232 
233 VOID
234 WINAPI
setCX(USHORT Value)235 setCX(USHORT Value)
236 {
237     EmulatorContext.GeneralRegs[FAST486_REG_ECX].LowWord = Value;
238 }
239 
240 UCHAR
241 WINAPI
getCH(VOID)242 getCH(VOID)
243 {
244     return EmulatorContext.GeneralRegs[FAST486_REG_ECX].HighByte;
245 }
246 
247 VOID
248 WINAPI
setCH(UCHAR Value)249 setCH(UCHAR Value)
250 {
251     EmulatorContext.GeneralRegs[FAST486_REG_ECX].HighByte = Value;
252 }
253 
254 UCHAR
255 WINAPI
getCL(VOID)256 getCL(VOID)
257 {
258     return EmulatorContext.GeneralRegs[FAST486_REG_ECX].LowByte;
259 }
260 
261 VOID
262 WINAPI
setCL(UCHAR Value)263 setCL(UCHAR Value)
264 {
265     EmulatorContext.GeneralRegs[FAST486_REG_ECX].LowByte = Value;
266 }
267 
268 
269 
270 ULONG
271 WINAPI
getEDX(VOID)272 getEDX(VOID)
273 {
274     return EmulatorContext.GeneralRegs[FAST486_REG_EDX].Long;
275 }
276 
277 VOID
278 WINAPI
setEDX(ULONG Value)279 setEDX(ULONG Value)
280 {
281     EmulatorContext.GeneralRegs[FAST486_REG_EDX].Long = Value;
282 }
283 
284 USHORT
285 WINAPI
getDX(VOID)286 getDX(VOID)
287 {
288     return EmulatorContext.GeneralRegs[FAST486_REG_EDX].LowWord;
289 }
290 
291 VOID
292 WINAPI
setDX(USHORT Value)293 setDX(USHORT Value)
294 {
295     EmulatorContext.GeneralRegs[FAST486_REG_EDX].LowWord = Value;
296 }
297 
298 UCHAR
299 WINAPI
getDH(VOID)300 getDH(VOID)
301 {
302     return EmulatorContext.GeneralRegs[FAST486_REG_EDX].HighByte;
303 }
304 
305 VOID
306 WINAPI
setDH(UCHAR Value)307 setDH(UCHAR Value)
308 {
309     EmulatorContext.GeneralRegs[FAST486_REG_EDX].HighByte = Value;
310 }
311 
312 UCHAR
313 WINAPI
getDL(VOID)314 getDL(VOID)
315 {
316     return EmulatorContext.GeneralRegs[FAST486_REG_EDX].LowByte;
317 }
318 
319 VOID
320 WINAPI
setDL(UCHAR Value)321 setDL(UCHAR Value)
322 {
323     EmulatorContext.GeneralRegs[FAST486_REG_EDX].LowByte = Value;
324 }
325 
326 
327 
328 ULONG
329 WINAPI
getESP(VOID)330 getESP(VOID)
331 {
332     return EmulatorContext.GeneralRegs[FAST486_REG_ESP].Long;
333 }
334 
335 VOID
336 WINAPI
setESP(ULONG Value)337 setESP(ULONG Value)
338 {
339     Fast486SetStack(&EmulatorContext, getSS(), Value);
340 }
341 
342 USHORT
343 WINAPI
getSP(VOID)344 getSP(VOID)
345 {
346     return EmulatorContext.GeneralRegs[FAST486_REG_ESP].LowWord;
347 }
348 
349 VOID
350 WINAPI
setSP(USHORT Value)351 setSP(USHORT Value)
352 {
353     Fast486SetStack(&EmulatorContext, getSS(), Value);
354 }
355 
356 
357 
358 ULONG
359 WINAPI
getEBP(VOID)360 getEBP(VOID)
361 {
362     return EmulatorContext.GeneralRegs[FAST486_REG_EBP].Long;
363 }
364 
365 VOID
366 WINAPI
setEBP(ULONG Value)367 setEBP(ULONG Value)
368 {
369     EmulatorContext.GeneralRegs[FAST486_REG_EBP].Long = Value;
370 }
371 
372 USHORT
373 WINAPI
getBP(VOID)374 getBP(VOID)
375 {
376     return EmulatorContext.GeneralRegs[FAST486_REG_EBP].LowWord;
377 }
378 
379 VOID
380 WINAPI
setBP(USHORT Value)381 setBP(USHORT Value)
382 {
383     EmulatorContext.GeneralRegs[FAST486_REG_EBP].LowWord = Value;
384 }
385 
386 
387 
388 ULONG
389 WINAPI
getESI(VOID)390 getESI(VOID)
391 {
392     return EmulatorContext.GeneralRegs[FAST486_REG_ESI].Long;
393 }
394 
395 VOID
396 WINAPI
setESI(ULONG Value)397 setESI(ULONG Value)
398 {
399     EmulatorContext.GeneralRegs[FAST486_REG_ESI].Long = Value;
400 }
401 
402 USHORT
403 WINAPI
getSI(VOID)404 getSI(VOID)
405 {
406     return EmulatorContext.GeneralRegs[FAST486_REG_ESI].LowWord;
407 }
408 
409 VOID
410 WINAPI
setSI(USHORT Value)411 setSI(USHORT Value)
412 {
413     EmulatorContext.GeneralRegs[FAST486_REG_ESI].LowWord = Value;
414 }
415 
416 
417 
418 ULONG
419 WINAPI
getEDI(VOID)420 getEDI(VOID)
421 {
422     return EmulatorContext.GeneralRegs[FAST486_REG_EDI].Long;
423 }
424 
425 VOID
426 WINAPI
setEDI(ULONG Value)427 setEDI(ULONG Value)
428 {
429     EmulatorContext.GeneralRegs[FAST486_REG_EDI].Long = Value;
430 }
431 
432 USHORT
433 WINAPI
getDI(VOID)434 getDI(VOID)
435 {
436     return EmulatorContext.GeneralRegs[FAST486_REG_EDI].LowWord;
437 }
438 
439 VOID
440 WINAPI
setDI(USHORT Value)441 setDI(USHORT Value)
442 {
443     EmulatorContext.GeneralRegs[FAST486_REG_EDI].LowWord = Value;
444 }
445 
446 
447 
448 ULONG
449 WINAPI
getEIP(VOID)450 getEIP(VOID)
451 {
452     return EmulatorContext.InstPtr.Long;
453 }
454 
455 VOID
456 WINAPI
setEIP(ULONG Value)457 setEIP(ULONG Value)
458 {
459     CpuExecute(getCS(), Value);
460 }
461 
462 USHORT
463 WINAPI
getIP(VOID)464 getIP(VOID)
465 {
466     return EmulatorContext.InstPtr.LowWord;
467 }
468 
469 VOID
470 WINAPI
setIP(USHORT Value)471 setIP(USHORT Value)
472 {
473     CpuExecute(getCS(), Value);
474 }
475 
476 
477 
478 USHORT
479 WINAPI
getCS(VOID)480 getCS(VOID)
481 {
482     return EmulatorContext.SegmentRegs[FAST486_REG_CS].Selector;
483 }
484 
485 VOID
486 WINAPI
setCS(USHORT Value)487 setCS(USHORT Value)
488 {
489     Fast486SetSegment(&EmulatorContext, FAST486_REG_CS, Value);
490 }
491 
492 USHORT
493 WINAPI
getSS(VOID)494 getSS(VOID)
495 {
496     return EmulatorContext.SegmentRegs[FAST486_REG_SS].Selector;
497 }
498 
499 VOID
500 WINAPI
setSS(USHORT Value)501 setSS(USHORT Value)
502 {
503     Fast486SetSegment(&EmulatorContext, FAST486_REG_SS, Value);
504 }
505 
506 USHORT
507 WINAPI
getDS(VOID)508 getDS(VOID)
509 {
510     return EmulatorContext.SegmentRegs[FAST486_REG_DS].Selector;
511 }
512 
513 VOID
514 WINAPI
setDS(USHORT Value)515 setDS(USHORT Value)
516 {
517     Fast486SetSegment(&EmulatorContext, FAST486_REG_DS, Value);
518 }
519 
520 USHORT
521 WINAPI
getES(VOID)522 getES(VOID)
523 {
524     return EmulatorContext.SegmentRegs[FAST486_REG_ES].Selector;
525 }
526 
527 VOID
528 WINAPI
setES(USHORT Value)529 setES(USHORT Value)
530 {
531     Fast486SetSegment(&EmulatorContext, FAST486_REG_ES, Value);
532 }
533 
534 USHORT
535 WINAPI
getFS(VOID)536 getFS(VOID)
537 {
538     return EmulatorContext.SegmentRegs[FAST486_REG_FS].Selector;
539 }
540 
541 VOID
542 WINAPI
setFS(USHORT Value)543 setFS(USHORT Value)
544 {
545     Fast486SetSegment(&EmulatorContext, FAST486_REG_FS, Value);
546 }
547 
548 USHORT
549 WINAPI
getGS(VOID)550 getGS(VOID)
551 {
552     return EmulatorContext.SegmentRegs[FAST486_REG_GS].Selector;
553 }
554 
555 VOID
556 WINAPI
setGS(USHORT Value)557 setGS(USHORT Value)
558 {
559     Fast486SetSegment(&EmulatorContext, FAST486_REG_GS, Value);
560 }
561 
562 
563 
564 ULONG
565 WINAPI
getCF(VOID)566 getCF(VOID)
567 {
568     return EmulatorContext.Flags.Cf;
569 }
570 
571 VOID
572 WINAPI
setCF(ULONG Flag)573 setCF(ULONG Flag)
574 {
575     EmulatorContext.Flags.Cf = !!(Flag & 1);
576 }
577 
578 ULONG
579 WINAPI
getPF(VOID)580 getPF(VOID)
581 {
582     return EmulatorContext.Flags.Pf;
583 }
584 
585 VOID
586 WINAPI
setPF(ULONG Flag)587 setPF(ULONG Flag)
588 {
589     EmulatorContext.Flags.Pf = !!(Flag & 1);
590 }
591 
592 ULONG
593 WINAPI
getAF(VOID)594 getAF(VOID)
595 {
596     return EmulatorContext.Flags.Af;
597 }
598 
599 VOID
600 WINAPI
setAF(ULONG Flag)601 setAF(ULONG Flag)
602 {
603     EmulatorContext.Flags.Af = !!(Flag & 1);
604 }
605 
606 ULONG
607 WINAPI
getZF(VOID)608 getZF(VOID)
609 {
610     return EmulatorContext.Flags.Zf;
611 }
612 
613 VOID
614 WINAPI
setZF(ULONG Flag)615 setZF(ULONG Flag)
616 {
617     EmulatorContext.Flags.Zf = !!(Flag & 1);
618 }
619 
620 ULONG
621 WINAPI
getSF(VOID)622 getSF(VOID)
623 {
624     return EmulatorContext.Flags.Sf;
625 }
626 
627 VOID
628 WINAPI
setSF(ULONG Flag)629 setSF(ULONG Flag)
630 {
631     EmulatorContext.Flags.Sf = !!(Flag & 1);
632 }
633 
634 ULONG
635 WINAPI
getIF(VOID)636 getIF(VOID)
637 {
638     return EmulatorContext.Flags.If;
639 }
640 
641 VOID
642 WINAPI
setIF(ULONG Flag)643 setIF(ULONG Flag)
644 {
645     EmulatorContext.Flags.If = !!(Flag & 1);
646 }
647 
648 ULONG
649 WINAPI
getDF(VOID)650 getDF(VOID)
651 {
652     return EmulatorContext.Flags.Df;
653 }
654 
655 VOID
656 WINAPI
setDF(ULONG Flag)657 setDF(ULONG Flag)
658 {
659     EmulatorContext.Flags.Df = !!(Flag & 1);
660 }
661 
662 ULONG
663 WINAPI
getOF(VOID)664 getOF(VOID)
665 {
666     return EmulatorContext.Flags.Of;
667 }
668 
669 VOID
670 WINAPI
setOF(ULONG Flag)671 setOF(ULONG Flag)
672 {
673     EmulatorContext.Flags.Of = !!(Flag & 1);
674 }
675 
676 
677 
678 ULONG
679 WINAPI
getEFLAGS(VOID)680 getEFLAGS(VOID)
681 {
682     return EmulatorContext.Flags.Long;
683 }
684 
685 VOID
686 WINAPI
setEFLAGS(ULONG Flags)687 setEFLAGS(ULONG Flags)
688 {
689     EmulatorContext.Flags.Long = Flags;
690 }
691 
692 
693 
694 USHORT
695 WINAPI
getMSW(VOID)696 getMSW(VOID)
697 {
698     return LOWORD(EmulatorContext.ControlRegisters[FAST486_REG_CR0]);
699 }
700 
701 VOID
702 WINAPI
setMSW(USHORT Value)703 setMSW(USHORT Value)
704 {
705     /* Set the lower 16 bits (Machine Status Word) of CR0 */
706     EmulatorContext.ControlRegisters[FAST486_REG_CR0] &= 0xFFFF0000;
707     EmulatorContext.ControlRegisters[FAST486_REG_CR0] |= Value & 0xFFFF;
708 }
709 
710 /* EOF */
711