-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathbuild.bat
More file actions
143 lines (126 loc) · 4.8 KB
/
build.bat
File metadata and controls
143 lines (126 loc) · 4.8 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
@echo off
setlocal enabledelayedexpansion
REM Kill any existing QEMU instances to prevent file locking issues
taskkill /f /im qemu-system-x86_64.exe >nul 2>&1
set NASM=tools\nasm\nasm-2.16.03\nasm.exe
set GCC=tools\i686-elf-tools\bin\i686-elf-gcc.exe
set LD=tools\i686-elf-tools\bin\i686-elf-ld.exe
set QEMU="C:\Program Files\qemu\qemu-system-x86_64.exe"
set QEMU_IMG="C:\Program Files\qemu\qemu-img.exe"
set CFLAGS=-O2 -ffreestanding -fno-pie -fno-stack-protector
echo Compiling C Kernel Entry...
%NASM% -f elf src\kernel_entry.asm -o kernel_entry.o
if %errorlevel% neq 0 (
echo [ERROR] Failed to compile kernel entry.
pause
exit /b
)
echo Compiling Interrupts ASM...
%NASM% -f elf src\interrupt.asm -o interrupt.o
%NASM% -f elf src\gdt_flush.asm -o gdt_flush.o
if %errorlevel% neq 0 (
echo [ERROR] Failed to compile Interrupt ASM.
pause
exit /b
)
echo Compiling C Kernel ^& Drivers...
%GCC% %CFLAGS% -c src\kernel.c -o kernel.o
%GCC% %CFLAGS% -c src\screen.c -o screen.o
%GCC% %CFLAGS% -c src\ports.c -o ports.o
%GCC% %CFLAGS% -c src\idt.c -o idt.o
%GCC% %CFLAGS% -c src\isr.c -o isr.o
%GCC% %CFLAGS% -c src\keyboard.c -o keyboard.o
%GCC% %CFLAGS% -c src\mouse.c -o mouse.o
%GCC% %CFLAGS% -c src\window.c -o window.o
%GCC% %CFLAGS% -c src\font.c -o font.o
%GCC% %CFLAGS% -c src\string.c -o string.o
%GCC% %CFLAGS% -c src\serial.c -o serial.o
%GCC% %CFLAGS% -c src\system_calls.c -o system_calls.o
%GCC% %CFLAGS% -c src\syscall_handler.c -o syscall_handler.o
%GCC% %CFLAGS% -c src\shell.c -o shell.o
%GCC% %CFLAGS% -c src\panic.c -o panic.o
%GCC% %CFLAGS% -c src\pmm.c -o pmm.o
%GCC% %CFLAGS% -c src\vmm.c -o vmm.o
%GCC% %CFLAGS% -c src\gdt.c -o gdt.o
%GCC% %CFLAGS% -c src\ata.c -o ata.o
%GCC% %CFLAGS% -c src\timer.c -o timer.o
%GCC% %CFLAGS% -c src\process.c -o process.o
%GCC% %CFLAGS% -c src\fat16.c -o fat16.o
%GCC% %CFLAGS% -c src\elf.c -o elf.o
%GCC% %CFLAGS% -c src\kmalloc.c -o kmalloc.o
if %errorlevel% neq 0 (
echo [ERROR] Failed to compile C kernel/drivers.
pause
exit /b
)
echo Compiling User Space C Library (libc)...
%GCC% %CFLAGS% -Iapps/libc -c apps\libc\string.c -o apps\libc\string.o
%GCC% %CFLAGS% -Iapps/libc -c apps\libc\stdlib.c -o apps\libc\stdlib.o
%GCC% %CFLAGS% -Iapps/libc -c apps\libc\stdio.c -o apps\libc\stdio.o
%GCC% %CFLAGS% -Iapps/libc -c apps\libc\errno.c -o apps\libc\errno.o
%GCC% %CFLAGS% -Iapps/libc -c apps\libc\math.c -o apps\libc\math.o
%GCC% %CFLAGS% -Iapps/libc -c apps\libc\unistd.c -o apps\libc\unistd.o
if %errorlevel% neq 0 (
echo [ERROR] Failed to compile libc!
pause
exit /b
)
echo Compiling User Space Apps...
%NASM% -f elf apps\crt0.asm -o apps\crt0.o
%GCC% %CFLAGS% -Iapps/libc -c apps\hello.c -o apps\hello.o
%LD% -T apps\linker.ld -o tools\hello.elf apps\crt0.o apps\hello.o apps\libc\string.o apps\libc\stdlib.o apps\libc\stdio.o apps\libc\errno.o
if %errorlevel% neq 0 (
echo [ERROR] Failed to build hello.elf!
pause
exit /b
)
echo Compiling Doom...
cd apps\doom
call doom_build.bat
if %errorlevel% neq 0 (
echo [ERROR] Failed to compile Doom!
cd ..\..
exit /b
)
cd ..\..
call link_doom.bat
if %errorlevel% neq 0 (
echo [ERROR] Failed to link DOOM.ELF!
pause
exit /b
)
copy /Y tools\DOOM.ELF apps\doom\tools\DOOM.ELF >nul 2>&1
echo DOOM.ELF successfully built!
echo Linking Kernel...
%LD% -T linker.ld -o kernel.bin kernel_entry.o interrupt.o gdt_flush.o gdt.o ata.o kernel.o screen.o ports.o idt.o isr.o keyboard.o mouse.o window.o font.o string.o serial.o system_calls.o syscall_handler.o shell.o panic.o pmm.o vmm.o timer.o process.o fat16.o elf.o kmalloc.o --oformat binary
if %errorlevel% neq 0 (
echo [ERROR] Failed to link kernel.
pause
exit /b
)
REM Auto-calculate the number of 512-byte sectors needed to load kernel.bin
for %%A in (kernel.bin) do set KSIZE=%%~zA
set /a SECTORS=(%KSIZE% + 511) / 512
echo Kernel is %KSIZE% bytes = %SECTORS% sectors
echo Compiling Bootloader (with KERNEL_SECTORS=%SECTORS%)...
%NASM% -i src\ -f bin -dKERNEL_SECTORS=%SECTORS% src\bootsect.asm -o bootsect.bin
if %errorlevel% neq 0 (
echo [ERROR] Failed to compile bootloader.
pause
exit /b
)
echo Building OS Image...
copy /b /Y bootsect.bin + kernel.bin os-image.bin
if %errorlevel% neq 0 (
echo [ERROR] Failed to build OS image.
pause
exit /b
)
REM Pad os-image.bin to exactly 1.44MB so QEMU uses correct floppy geometry (18 sectors/track)
REM Without this, QEMU may pick a smaller geometry where sectors > 9 don't exist.
powershell -Command "$f=[System.IO.File]::OpenWrite('os-image.bin'); $f.SetLength(1474560); $f.Close()"
echo.
if exist disk.img del /Q disk.img
echo Creating 16MB FAT16 virtual hard drive with ELF binaries...
python tools\make_fat16.py
%QEMU% -m 32 -drive file=os-image.bin,format=raw,index=0,if=floppy -drive file=disk.img,format=raw,index=0,if=ide -boot a -display gtk,zoom-to-fit=on -serial stdio