# ------------------------------------------------------- # Real Mode OS Makefile # Tools: NASM, OpenWatcom (wcc/wlink), QEMU # ------------------------------------------------------- # Tools NASM := nasm WCC := wcc WLINK := wlink QEMU := qemu-system-i386 DD := dd # Flags NASM_BIN := -f bin NASM_OBJ := -f obj WCC_FLAGS := -ms -0 -wx -s -ecc # small model, 8086, warnings, no stack check, cdecl QEMU_FLAGS = -fda $(IMG) -monitor stdio # Output names BOOT_SRC := boot.asm ENTRY_SRC := entry.asm KMAIN_SRC := kmain.c LINK_FILE := kernel.lnk BOOT_BIN := bootloader.bin ENTRY_OBJ := entry.obj KMAIN_OBJ := kmain.obj KERNEL_BIN := kernel.bin IMG := floppy.img BIOS_SRC := bios.asm BIOS_OBJ := bios.obj # ------------------------------------------------------- # Default target # ------------------------------------------------------- .PHONY: all clean run debug all: $(IMG) # ------------------------------------------------------- # Bootloader — flat binary # ------------------------------------------------------- $(BOOT_BIN): $(BOOT_SRC) $(NASM) $(NASM_BIN) $< -o $@ # ------------------------------------------------------- # Kernel entry point — OMF object # ------------------------------------------------------- $(ENTRY_OBJ): $(ENTRY_SRC) $(NASM) $(NASM_OBJ) $< -o $@ # ------------------------------------------------------- # C kernel — OMF object via OpenWatcom # ------------------------------------------------------- $(KMAIN_OBJ): $(KMAIN_SRC) $(WCC) $< $(WCC_FLAGS) -fo=$@ $(BIOS_OBJ): $(BIOS_SRC) $(NASM) $(NASM_OBJ) $< -o $@ $(KERNEL_BIN): $(ENTRY_OBJ) $(BIOS_OBJ) $(KMAIN_OBJ) $(LINK_FILE) $(WLINK) @$(LINK_FILE) # ------------------------------------------------------- # Floppy image # ------------------------------------------------------- $(IMG): $(BOOT_BIN) $(KERNEL_BIN) $(DD) if=/dev/zero of=$@ bs=512 count=2880 $(DD) if=$(BOOT_BIN) of=$@ conv=notrunc $(DD) if=$(KERNEL_BIN) of=$@ seek=1 conv=notrunc bs=512 # ------------------------------------------------------- # Run in QEMU # ------------------------------------------------------- run: $(IMG) $(QEMU) $(QEMU_FLAGS) # ------------------------------------------------------- # Debug — QEMU with GDB stub and interrupt logging # ------------------------------------------------------- debug: $(IMG) $(QEMU) $(QEMU_FLAGS) \ -s -S \ -d int \ -D qemu.log # ------------------------------------------------------- # Clean # ------------------------------------------------------- clean: rm -f $(BOOT_BIN) $(ENTRY_OBJ) $(KMAIN_OBJ) $(KERNEL_BIN) $(IMG) $(BIOS_OBJ)\ kernel.map qemu.log