[NTOSKRNL]
[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 <stdarg.h>
16
17 #define NDEBUG
18 #include <debug.h>
19
20 /* DEFINES ********************************************************************/
21
22 #define TO_LINEAR(seg, off) (((seg) << 4) + (off))
23 #define MAX_SEGMENT 0xFFFF
24 #define MAX_OFFSET 0xFFFF
25 #define MAX_ADDRESS TO_LINEAR(MAX_SEGMENT, MAX_OFFSET)
26 #define ROM_AREA_START 0xC0000
27 #define ROM_AREA_END 0xFFFFF
28 #define BIOS_PIC_MASTER_INT 0x08
29 #define BIOS_PIC_SLAVE_INT 0x70
30 #define BIOS_SEGMENT 0xF000
31 #define VIDEO_BIOS_INTERRUPT 0x10
32 #define SPECIAL_INT_NUM 0xFF
33 #define SEGMENT_TO_MCB(seg) ((PDOS_MCB)((ULONG_PTR)BaseAddress + TO_LINEAR((seg), 0)))
34 #define SEGMENT_TO_PSP(seg) ((PDOS_PSP)((ULONG_PTR)BaseAddress + TO_LINEAR((seg), 0)))
35 #define STEPS_PER_CYCLE 256
36
37 /* DOS constants */
38 #define DOS_VERSION 0x0600
39 #define DOS_CONFIG_PATH L"%SystemRoot%\\system32\\CONFIG.NT"
40 #define DOS_COMMAND_INTERPRETER L"%SystemRoot%\\system32\\COMMAND.COM /k %SystemRoot%\\system32\\AUTOEXEC.NT"
41 #define FIRST_MCB_SEGMENT 0x1000
42 #define USER_MEMORY_SIZE 0x8FFFF
43 #define SYSTEM_PSP 0x08
44 #define SYSTEM_ENV_BLOCK 0x800
45
46 /* System console constants */
47 #define CONSOLE_FONT_HEIGHT 8
48 #define CONSOLE_VIDEO_MEM_START 0xB8000
49 #define CONSOLE_VIDEO_MEM_END 0xBFFFF
50
51 /* Programmable interval timer (PIT) */
52 #define PIT_CHANNELS 3
53 #define PIT_BASE_FREQUENCY 1193182LL
54 #define PIT_DATA_PORT(x) (0x40 + (x))
55 #define PIT_COMMAND_PORT 0x43
56
57 /* Programmable interrupt controller (PIC) */
58 #define PIC_MASTER_CMD 0x20
59 #define PIC_MASTER_DATA 0x21
60 #define PIC_SLAVE_CMD 0xA0
61 #define PIC_SLAVE_DATA 0xA1
62 #define PIC_ICW1 0x10
63 #define PIC_ICW1_ICW4 (1 << 0)
64 #define PIC_ICW1_SINGLE (1 << 1)
65 #define PIC_ICW4_8086 (1 << 0)
66 #define PIC_ICW4_AEOI (1 << 1)
67 #define PIC_OCW2_NUM_MASK 0x07
68 #define PIC_OCW2_EOI (1 << 5)
69 #define PIC_OCW2_SL (1 << 6)
70 #define PIC_OCW3 (1 << 3)
71 #define PIC_OCW3_READ_ISR 0x0B
72
73 /* 8042 PS/2 controller */
74 #define KEYBOARD_BUFFER_SIZE 32
75 #define PS2_DATA_PORT 0x60
76 #define PS2_CONTROL_PORT 0x64
77
78 #define EMULATOR_FLAG_CF (1 << 0)
79 #define EMULATOR_FLAG_PF (1 << 2)
80 #define EMULATOR_FLAG_AF (1 << 4)
81 #define EMULATOR_FLAG_ZF (1 << 6)
82 #define EMULATOR_FLAG_SF (1 << 7)
83 #define EMULATOR_FLAG_TF (1 << 8)
84 #define EMULATOR_FLAG_IF (1 << 9)
85 #define EMULATOR_FLAG_DF (1 << 10)
86 #define EMULATOR_FLAG_OF (1 << 11)
87 #define EMULATOR_FLAG_NT (1 << 14)
88 #define EMULATOR_FLAG_RF (1 << 16)
89 #define EMULATOR_FLAG_VM (1 << 17)
90 #define EMULATOR_FLAG_AC (1 << 18)
91 #define EMULATOR_FLAG_VIF (1 << 19)
92 #define EMULATOR_FLAG_VIP (1 << 20)
93 #define EMULATOR_FLAG_ID (1 << 21)
94
95 typedef enum
96 {
97 EMULATOR_REG_AX,
98 EMULATOR_REG_CX,
99 EMULATOR_REG_DX,
100 EMULATOR_REG_BX,
101 EMULATOR_REG_SI,
102 EMULATOR_REG_DI,
103 EMULATOR_REG_SP,
104 EMULATOR_REG_BP,
105 EMULATOR_REG_ES,
106 EMULATOR_REG_CS,
107 EMULATOR_REG_SS,
108 EMULATOR_REG_DS,
109 } EMULATOR_REGISTER;
110
111 #pragma pack(push, 1)
112
113 typedef struct _DOS_MCB
114 {
115 CHAR BlockType;
116 WORD OwnerPsp;
117 WORD Size;
118 BYTE Unused[3];
119 CHAR Name[8];
120 } DOS_MCB, *PDOS_MCB;
121
122 typedef struct _DOS_FCB
123 {
124 BYTE DriveNumber;
125 CHAR FileName[8];
126 CHAR FileExt[3];
127 WORD BlockNumber;
128 WORD RecordSize;
129 DWORD FileSize;
130 WORD LastWriteDate;
131 WORD LastWriteTime;
132 BYTE Reserved[8];
133 BYTE BlockRecord;
134 BYTE RecordNumber[3];
135 } DOS_FCB, *PDOS_FCB;
136
137 typedef struct _DOS_PSP
138 {
139 BYTE Exit[2];
140 WORD MemSize;
141 BYTE Reserved0[6];
142 DWORD TerminateAddress;
143 DWORD BreakAddress;
144 DWORD CriticalAddress;
145 WORD ParentPsp;
146 BYTE HandleTable[20];
147 WORD EnvBlock;
148 DWORD LastStack;
149 WORD HandleTableSize;
150 DWORD HandleTablePtr;
151 DWORD PreviousPsp;
152 DWORD Reserved1;
153 WORD DosVersion;
154 BYTE Reserved2[14];
155 BYTE FarCall[3];
156 BYTE Reserved3[9];
157 DOS_FCB Fcb;
158 BYTE CommandLineSize;
159 CHAR CommandLine[127];
160 } DOS_PSP, *PDOS_PSP;
161
162 typedef struct _DOS_SFT_ENTRY
163 {
164 WORD ReferenceCount;
165 WORD Mode;
166 BYTE Attribute;
167 WORD DeviceInfo;
168 DWORD DriveParamBlock;
169 WORD FirstCluster;
170 WORD FileTime;
171 WORD FileDate;
172 DWORD FileSize;
173 DWORD CurrentOffset;
174 WORD LastClusterAccessed;
175 DWORD DirEntSector;
176 BYTE DirEntryIndex;
177 CHAR FileName[11];
178 BYTE Reserved0[6];
179 WORD OwnerPsp;
180 BYTE Reserved1[8];
181 } DOS_SFT_ENTRY, *PDOS_SFT_ENTRY;
182
183 typedef struct _DOS_SFT
184 {
185 DWORD NextTablePtr;
186 WORD FileCount;
187 DOS_SFT_ENTRY Entry[ANYSIZE_ARRAY];
188 } DOS_SFT, *PDOS_SFT;
189
190 typedef struct _DOS_INPUT_BUFFER
191 {
192 BYTE MaxLength, Length;
193 CHAR Buffer[ANYSIZE_ARRAY];
194 } DOS_INPUT_BUFFER, *PDOS_INPUT_BUFFER;
195
196 #pragma pack(pop)
197
198 /* FUNCTIONS ******************************************************************/
199
200 extern LPVOID BaseAddress;
201 extern BOOLEAN VdmRunning;
202 extern LPCWSTR ExceptionName[];
203
204 VOID DisplayMessage(LPCWSTR Format, ...);
205 BOOLEAN BiosInitialize();
206 VOID BiosUpdateConsole(ULONG StartAddress, ULONG EndAddress);
207 VOID BiosPrintCharacter(CHAR Character, BYTE Attribute);
208 BOOLEAN DosInitialize();
209 WORD DosAllocateMemory(WORD Size);
210 BOOLEAN DosFreeMemory(WORD Segment);
211 WORD DosResizeMemory(WORD Segment, WORD NewSize);
212 BOOLEAN DosCreateProcess(LPCSTR CommandLine, WORD EnvBlock);
213 VOID DosInt20h(WORD CodeSegment);
214 VOID DosInt21h(WORD CodeSegment);
215 VOID DosBreakInterrupt();
216 VOID BiosVideoService();
217 VOID BiosHandleIrq(BYTE IrqNumber);
218 BYTE PicReadCommand(BYTE Port);
219 VOID PicWriteCommand(BYTE Port, BYTE Value);
220 BYTE PicReadData(BYTE Port);
221 VOID PicWriteData(BYTE Port, BYTE Value);
222 VOID PicInterruptRequest(BYTE Number);
223 VOID PitInitialize();
224 VOID PitWriteCommand(BYTE Value);
225 BYTE PitReadData(BYTE Channel);
226 VOID PitWriteData(BYTE Channel, BYTE Value);
227 VOID PitDecrementCount();
228 VOID CheckForInputEvents();
229 VOID EmulatorSetStack(WORD Segment, WORD Offset);
230 VOID EmulatorExecute(WORD Segment, WORD Offset);
231 VOID EmulatorInterrupt(BYTE Number);
232 ULONG EmulatorGetRegister(ULONG Register);
233 VOID EmulatorSetRegister(ULONG Register, ULONG Value);
234 VOID EmulatorSetFlag(ULONG Flag);
235 VOID EmulatorClearFlag(ULONG Flag);
236 BOOLEAN EmulatorGetFlag(ULONG Flag);
237 BOOLEAN EmulatorInitialize();
238 VOID EmulatorStep();
239 VOID EmulatorCleanup();
240
241 /* EOF */