b3bfe5066a534ec8017e41477c1d92f80db48fb2
[reactos.git] / subsystems / ntvdm / ntvdm.h
1 /*
2 * COPYRIGHT: GPL - See COPYING in the top level directory
3 * PROJECT: ReactOS Virtual DOS Machine
4 * FILE: ntvdm.h
5 * PURPOSE: Header file to define commonly used stuff
6 * PROGRAMMERS: Aleksandar Andrejevic <theflash AT sdf DOT lonestar DOT org>
7 */
8
9 /* INCLUDES *******************************************************************/
10
11 #include <windows.h>
12 #include <tchar.h>
13 #include <stdio.h>
14 #include <conio.h>
15 #include <assert.h>
16 #include <stdarg.h>
17
18 /* DEFINES ********************************************************************/
19
20 #define TO_LINEAR(seg, off) (((seg) << 4) + (off))
21 #define MAX_SEGMENT 0xFFFF
22 #define MAX_OFFSET 0xFFFF
23 #define MAX_ADDRESS TO_LINEAR(MAX_SEGMENT, MAX_OFFSET)
24 #define ROM_AREA_START 0xC0000
25 #define ROM_AREA_END 0xFFFFF
26 #define BIOS_SEGMENT 0xF000
27 #define VIDEO_BIOS_INTERRUPT 0x10
28 #define SPECIAL_INT_NUM 0xFF
29 #define SEGMENT_TO_MCB(seg) ((PDOS_MCB)((ULONG_PTR)BaseAddress + TO_LINEAR((seg), 0)))
30 #define SEGMENT_TO_PSP(seg) ((PDOS_PSP)((ULONG_PTR)BaseAddress + TO_LINEAR((seg), 0)))
31
32 /* DOS constants */
33 #define DOS_VERSION 0x0600
34 #define DOS_CONFIG_PATH L"%SystemRoot%\\system32\\CONFIG.NT"
35 #define DOS_COMMAND_INTERPRETER L"%SystemRoot%\\system32\\COMMAND.COM /k %SystemRoot%\\system32\\AUTOEXEC.NT"
36 #define FIRST_MCB_SEGMENT 0x1000
37 #define USER_MEMORY_SIZE 0x8FFFF
38 #define SYSTEM_PSP 0x08
39 #define SYSTEM_ENV_BLOCK 0x800
40
41 /* System console constants */
42 #define CONSOLE_FONT_HEIGHT 8
43 #define CONSOLE_VIDEO_MEM_START 0xB8000
44 #define CONSOLE_VIDEO_MEM_END 0xBFFFF
45
46 #define EMULATOR_FLAG_CF (1 << 0)
47 #define EMULATOR_FLAG_PF (1 << 2)
48 #define EMULATOR_FLAG_AF (1 << 4)
49 #define EMULATOR_FLAG_ZF (1 << 6)
50 #define EMULATOR_FLAG_SF (1 << 7)
51 #define EMULATOR_FLAG_TF (1 << 8)
52 #define EMULATOR_FLAG_IF (1 << 9)
53 #define EMULATOR_FLAG_DF (1 << 10)
54 #define EMULATOR_FLAG_OF (1 << 11)
55 #define EMULATOR_FLAG_NT (1 << 14)
56 #define EMULATOR_FLAG_RF (1 << 16)
57 #define EMULATOR_FLAG_VM (1 << 17)
58 #define EMULATOR_FLAG_AC (1 << 18)
59 #define EMULATOR_FLAG_VIF (1 << 19)
60 #define EMULATOR_FLAG_VIP (1 << 20)
61 #define EMULATOR_FLAG_ID (1 << 21)
62
63 typedef enum
64 {
65 EMULATOR_REG_AX,
66 EMULATOR_REG_CX,
67 EMULATOR_REG_DX,
68 EMULATOR_REG_BX,
69 EMULATOR_REG_SI,
70 EMULATOR_REG_DI,
71 EMULATOR_REG_SP,
72 EMULATOR_REG_BP,
73 EMULATOR_REG_CS,
74 EMULATOR_REG_SS,
75 EMULATOR_REG_DS,
76 EMULATOR_REG_ES,
77 EMULATOR_REG_FS,
78 EMULATOR_REG_GS
79 } EMULATOR_REGISTER;
80
81 #pragma pack(push, 1)
82
83 typedef struct _DOS_MCB
84 {
85 CHAR BlockType;
86 WORD OwnerPsp;
87 WORD Size;
88 BYTE Unused[3];
89 CHAR Name[8];
90 } DOS_MCB, *PDOS_MCB;
91
92 typedef struct _DOS_FCB
93 {
94 BYTE DriveNumber;
95 CHAR FileName[8];
96 CHAR FileExt[3];
97 WORD BlockNumber;
98 WORD RecordSize;
99 DWORD FileSize;
100 WORD LastWriteDate;
101 WORD LastWriteTime;
102 BYTE Reserved[8];
103 BYTE BlockRecord;
104 BYTE RecordNumber[3];
105 } DOS_FCB, *PDOS_FCB;
106
107 typedef struct _DOS_PSP
108 {
109 BYTE Exit[2];
110 WORD MemSize;
111 BYTE Reserved0[6];
112 DWORD TerminateAddress;
113 DWORD BreakAddress;
114 DWORD CriticalAddress;
115 WORD ParentPsp;
116 BYTE HandleTable[20];
117 WORD EnvBlock;
118 DWORD LastStack;
119 WORD HandleTableSize;
120 DWORD HandleTablePtr;
121 DWORD PreviousPsp;
122 DWORD Reserved1;
123 WORD DosVersion;
124 BYTE Reserved2[14];
125 BYTE FarCall[3];
126 BYTE Reserved3[9];
127 DOS_FCB Fcb;
128 BYTE CommandLineSize;
129 CHAR CommandLine[127];
130 } DOS_PSP, *PDOS_PSP;
131
132 typedef struct _DOS_SFT_ENTRY
133 {
134 WORD ReferenceCount;
135 WORD Mode;
136 BYTE Attribute;
137 WORD DeviceInfo;
138 DWORD DriveParamBlock;
139 WORD FirstCluster;
140 WORD FileTime;
141 WORD FileDate;
142 DWORD FileSize;
143 DWORD CurrentOffset;
144 WORD LastClusterAccessed;
145 DWORD DirEntSector;
146 BYTE DirEntryIndex;
147 CHAR FileName[11];
148 BYTE Reserved0[6];
149 WORD OwnerPsp;
150 BYTE Reserved1[8];
151 } DOS_SFT_ENTRY, *PDOS_SFT_ENTRY;
152
153 typedef struct _DOS_SFT
154 {
155 DWORD NextTablePtr;
156 WORD FileCount;
157 DOS_SFT_ENTRY Entry[ANYSIZE_ARRAY];
158 } DOS_SFT, *PDOS_SFT;
159
160 typedef struct _DOS_INPUT_BUFFER
161 {
162 BYTE MaxLength, Length;
163 CHAR Buffer[ANYSIZE_ARRAY];
164 } DOS_INPUT_BUFFER, *PDOS_INPUT_BUFFER;
165
166 #pragma pack(pop)
167
168 /* FUNCTIONS ******************************************************************/
169
170 extern LPVOID BaseAddress;
171 extern BOOLEAN VdmRunning;
172 extern LPCWSTR ExceptionName[];
173
174 VOID DisplayMessage(LPCWSTR Format, ...);
175 BOOLEAN BiosInitialize();
176 VOID BiosUpdateConsole(ULONG StartAddress, ULONG EndAddress);
177 VOID BiosPrintCharacter(CHAR Character, BYTE Attribute);
178 BOOLEAN DosInitialize();
179 WORD DosAllocateMemory(WORD Size);
180 BOOLEAN DosFreeMemory(WORD Segment);
181 WORD DosResizeMemory(WORD Segment, WORD NewSize);
182 BOOLEAN DosCreateProcess(LPCSTR CommandLine, WORD EnvBlock);
183 VOID DosInt20h(WORD CodeSegment);
184 VOID DosInt21h(WORD CodeSegment);
185 VOID DosBreakInterrupt();
186 VOID BiosVideoService();
187 VOID EmulatorSetStack(WORD Segment, WORD Offset);
188 VOID EmulatorExecute(WORD Segment, WORD Offset);
189 VOID EmulatorInterrupt(BYTE Number);
190 ULONG EmulatorGetRegister(ULONG Register);
191 VOID EmulatorSetRegister(ULONG Register, ULONG Value);
192 VOID EmulatorSetFlag(ULONG Flag);
193 VOID EmulatorClearFlag(ULONG Flag);
194 BOOLEAN EmulatorGetFlag(ULONG Flag);
195 BOOLEAN EmulatorInitialize();
196 VOID EmulatorStep();
197 VOID EmulatorCleanup();
198
199 /* EOF */