# defines
.SUFFIXES: .asm .x .exe
MAKEFILE=makefile
# uncomment the next line to rebuild everything if this makefile changes
#MAKEDEP=$(MAKEFILE)
# chose ELF, COFF, or PE in the next two lines
LSCRIPT	=ldscript/coffkrnl.ld
INCDIR	=inc
AFLAGS	=-f coff -dUNDERBARS=1 -i$(INCDIR)/
CFLAGS	=-g -Wall -W -O2 -I$(INCDIR) -fno-builtin -nostdinc
LFLAGS	=-g -T$(LSCRIPT)
LIBC	=tinylib/libc.a
OBJS	=krnl/kstart.o krnl/main.o krnl/video.o krnl/kbd.o krnl/loader.o \
	krnl/time.o krnl/paging.o krnl/syscalls.o krnl/debug.o krnl/mm.o \
	krnl/tasks.o
DELETE	=deltree /y

# targets
all:	krnl.dsk

clean:
	$(DELETE) *.dsk *.lst *.sym *.x *.com krnl\*.o util\*.exe

realclean:
	make -f $(MAKEFILE) clean
	make -C tinylib -f $(MAKEFILE) clean
	make -C apps -f $(MAKEFILE) clean

# implicit rules
.c.exe:
	gcc -s -O2 -o$@ $<

.c.o:
	gcc $(CFLAGS) -c -o$@ $<

.asm.o:
	nasm $(AFLAGS) -o$@ $<

# dependencies
util/rdsk.exe: util/rdsk.c $(MAKEDEP)

krnl/kstart.o: krnl/kstart.asm $(MAKEDEP)

krnl/main.o: krnl/main.c $(MAKEDEP)

krnl/video.o: krnl/video.c $(MAKEDEP)

krnl/kbd.o: krnl/kbd.c $(MAKEDEP)

krnl/loader.o: krnl/loader.c $(MAKEDEP)

krnl/time.o: krnl/time.c $(MAKEDEP)

krnl/paging.o: krnl/paging.c $(MAKEDEP)

krnl/mm.o: krnl/mm.c $(MAKEDEP)

krnl/tasks.o: krnl/tasks.c $(MAKEDEP)

# explicit rules
load.com: load.asm $(MAKEDEP)
	nasm -f bin -o$@ $<

$(LIBC): tinylib/$(MAKEFILE)
	make -C tinylib -f $(MAKEFILE)

krnl.x: $(LIBC) $(OBJS) $(LSCRIPT) $(MAKEDEP)
	ld $(LFLAGS) -o$@ $(OBJS) $(LIBC)
	objdump --line-numbers --source $@ >krnl.lst
	nm --line-numbers $@ | sort >krnl.sym
	strip $@

krnl.dsk: util/rdsk.exe krnl.x $(MAKEDEP)
	make -C apps -f $(MAKEFILE)
	echo krnl.x >x
	echo apps/hello.x >>x
	echo apps/echo.x >>x
	echo apps/time.x >>x
	echo apps/tetris.x >>x
	echo apps/tetris.x >>x
	echo apps/invade.x >>x
	echo apps/protect.x >>x
	echo apps/protect.x >>x
	echo apps/protect.x >>x
	echo apps/protect.x >>x
	echo apps/protect.x >>x
#	echo apps/protect.x >>x
	util\rdsk.exe -o $@ @x
	del x
