# -*- makefile -*-
ATHENA  := $(shell test -f /etc/athena/version && echo "yes")
ifeq ($(ATHENA),yes)
CROSS := /mit/6.097
GENBOCHSRC := /mit/6.097/bin/generate-bochsrc
else
CROSS := /usr/local/aout-cross
GENBOCHSRC := ../../../tools/generate-bochsrc
endif

CC      := $(CROSS)/bin/i386-osclass-aout-gcc
OBJCOPY := $(CROSS)/bin/i386-osclass-aout-objcopy
LD      := $(CROSS)/bin/i386-osclass-aout-ld 
STRIP   := $(CROSS)/bin/i386-osclass-aout-strip


BOOTLOADER_LINK_ADDRESS=0x7c00
KERNEL_LINK_ADDRESS=0xF0100020

all:
	@echo "ERROR: You must specify a target."

%:
	@echo
	@echo "ERROR: '$@' is not a valid target."
	@echo "ERROR: You probably meant '$@.img'."
	exit 1

%.o: %.S
	@echo "**** ASSEMBLING: $< ==> $@"
	$(CC) -c $<

%.o: %.c
	@echo "**** COMPILING: $< ==> $@"
	$(CC) -O2 -c $<

%.aout: $(OBJS)
	@echo "**** LINKING: $<  ==> $@"
	$(LD) -N -e start -Ttext $(LINK) -o $@ $(OBJS)
	cp $@ $@.dbg
	$(STRIP) $@

# This target builds the Bochs disk image.
#
# It would be cool if it bailed with an error
# if the bootloader was greater than 512 bytes.

%.img:
	@echo "**** UPDATING .bocshrc"
	$(GENBOCHSRC) $@ 10 16 63
	@echo "**** CREATING Bochs disk image: $@"
	@echo "     **** step 1: zero the image" 
	dd if=/dev/zero of=$@ count=3000
	@echo "     **** step 2: write boot sector"
	dd if=$(BOOTLOADER) of=$@ conv=notrunc bs=1 skip=32 seek=0
ifdef KERNEL	
	@echo "     **** step 3: write kernel, starting at sector 1"
	dd if=$(KERNEL)   of=$@ conv=notrunc bs=? skip=? seek=?
endif
	@echo "     **** done: bochs disk image file = $@"

ex1:
	gmake clean
	gmake ex1.aout OBJS=ex1.o LINK=$(BOOTLOADER_LINK_ADDRESS)
	gmake disk.img BOOTLOADER=ex1.aout

ex2:
	gmake clean
	gmake ex2.aout OBJS=ex2.o LINK=$(BOOTLOADER_LINK_ADDRESS)
	gmake disk.img BOOTLOADER=ex2.aout

ex4:
	gmake clean
	gmake ex4.aout OBJS=ex4.o LINK=$(BOOTLOADER_LINK_ADDRESS)
	gmake disk.img BOOTLOADER=ex4.aout

ex5:
	gmake clean
	gmake bootloader.aout OBJS="bootloader_asm.o bootloader_c.o" LINK=$(BOOTLOADER_LINK_ADDRESS)
	gmake kernel.aout     OBJS=kernel.o LINK=$(KERNEL_LINK_ADDRESS)
	gmake disk.img BOOTLOADER=bootloader.aout KERNEL=kernel.aout

ex6_kernel_only:
	gmake kernel.aout     OBJS="locore.o kernel2.o" LINK=$(KERNEL_LINK_ADDRESS)

ex6:
	gmake clean
	gmake bootloader.aout OBJS="bootloader_asm.o bootloader_c.o" LINK=$(BOOTLOADER_LINK_ADDRESS)
	gmake kernel.aout     OBJS="locore.o kernel2.o" LINK=$(KERNEL_LINK_ADDRESS)
	gmake disk.img BOOTLOADER=bootloader.aout KERNEL=kernel.aout

clean:
	rm -f *.o *.img *.out *.raw *.linked *~ *.aout *.s *.core out.bochs *.dbg

