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