2 * COPYRIGHT: GPL - See COPYING in the top level directory
3 * PROJECT: ReactOS Virtual DOS Machine
5 * PURPOSE: Header file to define commonly used stuff
6 * PROGRAMMERS: Aleksandar Andrejevic <theflash AT sdf DOT lonestar DOT org>
9 /* INCLUDES *******************************************************************/
20 /* DEFINES ********************************************************************/
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
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
46 /* System console constants */
47 #define CONSOLE_FONT_HEIGHT 8
48 #define CONSOLE_VIDEO_MEM_START 0xB8000
49 #define CONSOLE_VIDEO_MEM_END 0xBFFFF
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
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
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
73 /* 8042 PS/2 controller */
74 #define KEYBOARD_BUFFER_SIZE 32
75 #define PS2_DATA_PORT 0x60
76 #define PS2_CONTROL_PORT 0x64
77 #define PS2_DEFAULT_CONFIG 0x05
78 #define KEYBOARD_ACK 0xFA
79 #define KEYBOARD_RESEND 0xFE
81 #define EMULATOR_FLAG_CF (1 << 0)
82 #define EMULATOR_FLAG_PF (1 << 2)
83 #define EMULATOR_FLAG_AF (1 << 4)
84 #define EMULATOR_FLAG_ZF (1 << 6)
85 #define EMULATOR_FLAG_SF (1 << 7)
86 #define EMULATOR_FLAG_TF (1 << 8)
87 #define EMULATOR_FLAG_IF (1 << 9)
88 #define EMULATOR_FLAG_DF (1 << 10)
89 #define EMULATOR_FLAG_OF (1 << 11)
90 #define EMULATOR_FLAG_NT (1 << 14)
91 #define EMULATOR_FLAG_RF (1 << 16)
92 #define EMULATOR_FLAG_VM (1 << 17)
93 #define EMULATOR_FLAG_AC (1 << 18)
94 #define EMULATOR_FLAG_VIF (1 << 19)
95 #define EMULATOR_FLAG_VIP (1 << 20)
96 #define EMULATOR_FLAG_ID (1 << 21)
100 EMULATOR_EXCEPTION_DIVISION_BY_ZERO
,
101 EMULATOR_EXCEPTION_DEBUG
,
102 EMULATOR_EXCEPTION_NMI
,
103 EMULATOR_EXCEPTION_BREAKPOINT
,
104 EMULATOR_EXCEPTION_OVERFLOW
,
105 EMULATOR_EXCEPTION_BOUND
,
106 EMULATOR_EXCEPTION_INVALID_OPCODE
,
107 EMULATOR_EXCEPTION_NO_FPU
126 #pragma pack(push, 1)
128 typedef struct _DOS_MCB
135 } DOS_MCB
, *PDOS_MCB
;
137 typedef struct _DOS_FCB
149 BYTE RecordNumber
[3];
150 } DOS_FCB
, *PDOS_FCB
;
152 typedef struct _DOS_PSP
157 DWORD TerminateAddress
;
159 DWORD CriticalAddress
;
161 BYTE HandleTable
[20];
164 WORD HandleTableSize
;
165 DWORD HandleTablePtr
;
173 BYTE CommandLineSize
;
174 CHAR CommandLine
[127];
175 } DOS_PSP
, *PDOS_PSP
;
177 typedef struct _DOS_SFT_ENTRY
183 DWORD DriveParamBlock
;
189 WORD LastClusterAccessed
;
196 } DOS_SFT_ENTRY
, *PDOS_SFT_ENTRY
;
198 typedef struct _DOS_SFT
202 DOS_SFT_ENTRY Entry
[ANYSIZE_ARRAY
];
203 } DOS_SFT
, *PDOS_SFT
;
205 typedef struct _DOS_INPUT_BUFFER
207 BYTE MaxLength
, Length
;
208 CHAR Buffer
[ANYSIZE_ARRAY
];
209 } DOS_INPUT_BUFFER
, *PDOS_INPUT_BUFFER
;
213 /* FUNCTIONS ******************************************************************/
215 extern LPVOID BaseAddress
;
216 extern BOOLEAN VdmRunning
;
217 extern LPCWSTR ExceptionName
[];
219 VOID
DisplayMessage(LPCWSTR Format
, ...);
220 BOOLEAN
BiosInitialize();
221 VOID
BiosUpdateConsole(ULONG StartAddress
, ULONG EndAddress
);
222 VOID
BiosPrintCharacter(CHAR Character
, BYTE Attribute
);
223 BOOLEAN
DosInitialize();
224 WORD
DosAllocateMemory(WORD Size
, WORD
*MaxAvailable
);
225 BOOLEAN
DosFreeMemory(WORD BlockData
);
226 BOOLEAN
DosResizeMemory(WORD BlockData
, WORD NewSize
, WORD
*MaxAvailable
);
227 BOOLEAN
DosCreateProcess(LPCSTR CommandLine
, WORD EnvBlock
);
228 VOID
DosInt20h(WORD CodeSegment
);
229 VOID
DosInt21h(WORD CodeSegment
);
230 VOID
DosBreakInterrupt();
231 VOID
BiosVideoService();
232 VOID
BiosHandleIrq(BYTE IrqNumber
);
233 BYTE
PicReadCommand(BYTE Port
);
234 VOID
PicWriteCommand(BYTE Port
, BYTE Value
);
235 BYTE
PicReadData(BYTE Port
);
236 VOID
PicWriteData(BYTE Port
, BYTE Value
);
237 VOID
PicInterruptRequest(BYTE Number
);
238 VOID
PitInitialize();
239 VOID
PitWriteCommand(BYTE Value
);
240 BYTE
PitReadData(BYTE Channel
);
241 VOID
PitWriteData(BYTE Channel
, BYTE Value
);
242 VOID
PitDecrementCount();
243 VOID
CheckForInputEvents();
244 BYTE
KeyboardReadStatus();
245 VOID
KeyboardWriteCommand(BYTE Command
);
246 BYTE
KeyboardReadData();
247 VOID
KeyboardWriteData(BYTE Data
);
248 VOID
EmulatorSetStack(WORD Segment
, WORD Offset
);
249 VOID
EmulatorExecute(WORD Segment
, WORD Offset
);
250 VOID
EmulatorInterrupt(BYTE Number
);
251 VOID
EmulatorExternalInterrupt(BYTE Number
);
252 ULONG
EmulatorGetRegister(ULONG Register
);
253 VOID
EmulatorSetRegister(ULONG Register
, ULONG Value
);
254 VOID
EmulatorSetFlag(ULONG Flag
);
255 VOID
EmulatorClearFlag(ULONG Flag
);
256 BOOLEAN
EmulatorGetFlag(ULONG Flag
);
257 BOOLEAN
EmulatorInitialize();
259 VOID
EmulatorCleanup();
261 VOID
EmulatorSetA20(BOOLEAN Enabled
);