xref: /reactos/subsystems/mvdm/ntvdm/emulator.h (revision 9d3c3a75)
1 /*
2  * COPYRIGHT:       GPL - See COPYING in the top level directory
3  * PROJECT:         ReactOS Virtual DOS Machine
4  * FILE:            subsystems/mvdm/ntvdm/emulator.h
5  * PURPOSE:         Minimal x86 machine emulator for the VDM
6  * PROGRAMMERS:     Aleksandar Andrejevic <theflash AT sdf DOT lonestar DOT org>
7  */
8 
9 #ifndef _EMULATOR_H_
10 #define _EMULATOR_H_
11 
12 /* INCLUDES *******************************************************************/
13 
14 #include <fast486.h>
15 
16 /* DEFINES ********************************************************************/
17 
18 /*
19  * Basic Memory Management
20  */
21 #define NULL32  ((ULONG)0)
22 
23 #define MEM_ALIGN_DOWN(ptr, align)  (PVOID)((ULONG_PTR)(ptr) & ~((align) - 1l))
24 #define MEM_ALIGN_UP(ptr, align)    MEM_ALIGN_DOWN((ULONG_PTR)(ptr) + (align) - 1l, (align))
25 
26 #define TO_LINEAR(seg, off) (((seg) << 4) + (off))
27 #define MAX_SEGMENT 0xFFFF
28 #define MAX_OFFSET  0xFFFF
29 #define MAX_ADDRESS 0x1000000 // 16 MB of RAM; see also: kernel32/client/vdm.c!BaseGetVdmConfigInfo
30 C_ASSERT(0x100000 <= MAX_ADDRESS);  // A minimum of 1 MB is required for PC emulation.
31 
32 #define SEG_OFF_TO_PTR(seg, off)    \
33     (PVOID)((ULONG_PTR)BaseAddress + TO_LINEAR((seg), (off)))
34 
35 #define FAR_POINTER(x)      SEG_OFF_TO_PTR(HIWORD(x), LOWORD(x))
36 
37 #define REAL_TO_PHYS(ptr)   (PVOID)((ULONG_PTR)(ptr) + (ULONG_PTR)BaseAddress)
38 #define PHYS_TO_REAL(ptr)   (PVOID)((ULONG_PTR)(ptr) - (ULONG_PTR)BaseAddress)
39 
40 #define ARRAY_INDEX(ptr, array) ((ULONG)(((ULONG_PTR)(ptr) - (ULONG_PTR)(array)) / sizeof(*array)))
41 
42 /*
43  * BCD-Binary conversion
44  */
45 
46 FORCEINLINE
47 USHORT
48 BINARY_TO_BCD(USHORT Value)
49 {
50     USHORT Result;
51 
52     Result = (Value / 1000) << 12;
53     Value %= 1000;
54     Result |= (Value / 100) << 8;
55     Value %= 100;
56     Result |= (Value / 10) << 4;
57     Value %= 10;
58     Result |= Value;
59 
60     return Result;
61 }
62 
63 FORCEINLINE
64 USHORT
65 BCD_TO_BINARY(USHORT Value)
66 {
67     USHORT Result;
68 
69     Result = Value & 0xF;
70     Value >>= 4;
71     Result += (Value & 0xF) * 10;
72     Value >>= 4;
73     Result += (Value & 0xF) * 100;
74     Value >>= 4;
75     Result += Value * 1000;
76 
77     return Result;
78 }
79 
80 
81 /*
82  * Emulator state
83  */
84 
85 enum
86 {
87     EMULATOR_EXCEPTION_DIVISION_BY_ZERO,
88     EMULATOR_EXCEPTION_DEBUG,
89     EMULATOR_EXCEPTION_NMI,
90     EMULATOR_EXCEPTION_BREAKPOINT,
91     EMULATOR_EXCEPTION_OVERFLOW,
92     EMULATOR_EXCEPTION_BOUND,
93     EMULATOR_EXCEPTION_INVALID_OPCODE,
94     EMULATOR_EXCEPTION_NO_FPU,
95     EMULATOR_EXCEPTION_DOUBLE_FAULT,
96     EMULATOR_EXCEPTION_FPU_SEGMENT,
97     EMULATOR_EXCEPTION_INVALID_TSS,
98     EMULATOR_EXCEPTION_NO_SEGMENT,
99     EMULATOR_EXCEPTION_STACK_SEGMENT,
100     EMULATOR_EXCEPTION_GPF,
101     EMULATOR_EXCEPTION_PAGE_FAULT
102 };
103 
104 extern FAST486_STATE EmulatorContext;
105 extern LPVOID  BaseAddress;
106 extern BOOLEAN VdmRunning;
107 
108 
109 /* FUNCTIONS ******************************************************************/
110 
111 VOID DumpMemory(BOOLEAN TextFormat);
112 
113 VOID MountFloppy(IN ULONG DiskNumber);
114 VOID EjectFloppy(IN ULONG DiskNumber);
115 
116 UCHAR FASTCALL EmulatorIntAcknowledge
117 (
118     PFAST486_STATE State
119 );
120 
121 VOID FASTCALL EmulatorFpu
122 (
123     PFAST486_STATE State
124 );
125 
126 VOID EmulatorInterruptSignal(VOID);
127 VOID EmulatorException(BYTE ExceptionNumber, LPWORD Stack);
128 
129 VOID EmulatorPause(VOID);
130 VOID EmulatorResume(VOID);
131 VOID EmulatorTerminate(VOID);
132 
133 BOOLEAN EmulatorInitialize(HANDLE ConsoleInput, HANDLE ConsoleOutput);
134 VOID EmulatorCleanup(VOID);
135 
136 #endif // _EMULATOR_H_
137 
138 /* EOF */
139