TARGET = mame

# Modules are one of: CapSega, Vector, Classic, Konami, Atari, Namco, William, Other, Taito, Technos, Mitch, Deast, M68KZ80
ifeq ($(MODULE),)
MODULE = M68KZ80
endif

# uncomment next line to include the debugger
# DEBUG = 1

# set this the operating system you're building for
# (actually you'll probably need your own main makefile anyways)
# MAMEOS = msdos
MAMEOS = gp32

# extension for executables
# EXE = .exe
ELF = .elf
GXB = .gxb
FXE = .fxe

# CPU core include paths
CYCLONE_VERSION=m68000_cyclone
VPATH=src $(wildcard src/cpu/*[0-9u]) src/cpu/$(CYCLONE_VERSION)

# Devkit & SDK Home
DEVKIT=$(HOME)/devkitARM
DEVKITBIN=$(DEVKIT)/bin
GP32SDK=../GPSDK_EABI

##DEVKIT=$(HOME)/devkitARM
##DEVKITBIN=$(DEVKIT)/bin
##GP32SDK=$(HOME)/proj/gp32/lib/gamepark_sdk_noeabi

# Devkit Type
CROSS = arm-eabi

# compiler, linker and utilities
AR = $(DEVKITBIN)/$(CROSS)-ar
CC = $(DEVKITBIN)/$(CROSS)-g++
LD = $(DEVKITBIN)/$(CROSS)-g++
ASM = $(DEVKITBIN)/$(CROSS)-g++
OBJCP = $(DEVKITBIN)/$(CROSS)-objcopy
B2FXE = $(DEVKITBIN)/b2fxec
MD = @mkdir
RM = @rm -f
FIND = @find
CHMOD = @chmod ug+x 


LIBPATH = -L$(DEVKIT)/$(CROSS)/lib -L$(GP32SDK)/lib
INCLUDES = -I$(DEVKIT)/$(CROSS)/include -I$(GP32SDK)/include -I$(GP32SDK)/target  -Isrc/zlib -Isrc -Isrc/$(MAMEOS)

OBJ = obj

EMULATOR = $(TARGET)$(EXE)

DEFS = -DLSB_FIRST -DALIGN_INTS -DINLINE="static __inline__" -Dasm="__asm__ __volatile__" -DUSE_GP_MEM -DMAME_UNDERCLOCK -DGP32 -DENABLE_AUTOFIRE -DMODULE_$(MODULE)

# Additional optional FLAGS.
# GP32_GDB enables GDB stub and USB debugging. Can't get this to work (yet)
# FASTVEC uses assembler routine line drawing. Doesn't seem to be faster (yet)
# NOPROFILER removes the profiler. Supposedly uses ~3% CPU.
# PROFILE_GENERATE is used to profile the code
# GP32_DEBUG switches on full debugging.

#-DGP32_DEBUG
#-DGP32_GDB
#-DFASTVEC=1
#-DNOPROFILER=1 
#-DPROFILE_GENERATE

CFLAGS = $(INCLUDES) -mcpu=arm920t -mtune=arm920t \
	-mno-thumb-interwork -mstructure-size-boundary=32 -fomit-frame-pointer \
	-falign-functions=4 -falign-loops=4 -falign-labels=4 -falign-jumps=4 \
	-ffast-math -freciprocal-math -fsingle-precision-constant \
	-fstrict-aliasing -finline -finline-functions -fno-common \
	-fexpensive-optimizations -fno-rtti -fomit-frame-pointer \
	-funsafe-math-optimizations \
	-Wall -Wno-sign-compare -Wunused -Wpointer-arith -Waggregate-return -Wshadow

#-fno-builtin 
LDFLAGS = $(CFLAGS) -specs=gp32_gpsdk.specs -s -static -Wl,-Map,$(MODULE).map

LIBS = -lgpgraphic -lgpmem -lgpos -lgpstdlib -lgpstdio -lgpsound -lgpfont -lm

OBJDIRS = $(OBJ) $(OBJ)/cpu $(OBJ)/sound \
	$(OBJ)/drivers $(OBJ)/machine $(OBJ)/vidhrdw $(OBJ)/sndhrdw \
	$(OBJ)/zlib $(OBJ)/$(MAMEOS)

all:	maketree $(EMULATOR)$(FXE)

# include the various .mak files
include src/core.mak
include src/$(MODULE).mak
include src/rules.mak
include src/$(MAMEOS)/$(MAMEOS).mak

ifdef DEBUG
DBGDEFS = -DMAME_DEBUG
else
DBGDEFS =
DBGOBJS =
endif

# combine the various definitions to one
CDEFS = $(DEFS) $(COREDEFS) $(CPUDEFS) $(SOUNDDEFS) $(ASMDEFS) $(DBGDEFS)

$(TARGET)$(FXE): $(EMULATOR)$(GXB)
	$(B2FXE) -t 'MAME $(MODULE)' -b "src/gp32/$(MODULE).bmp" -a "Slaanesh" -F 133 $(TARGET)$(GXB) m$(MODULE)$(FXE)

$(EMULATOR)$(GXB): $(EMULATOR)$(ELF)
	@echo "Making $(EMULATOR)$(GXB)..."
	$(OBJCP) -O binary $(EMULATOR)$(ELF) $(EMULATOR)$(GXB)

$(EMULATOR)$(ELF): $(OBJS) $(COREOBJS) $(OSOBJS) $(DRVLIBS) $(ZLIB)
	@echo "Making $(EMULATOR)$(ELF)..."
	$(LD) $(LDFLAGS) $(LIBPATH) $(OBJS) $(COREOBJS) $(OSOBJS) $(DRVLIBS) $(LIBS) $(ZLIB) -o $@

$(OBJ)/driver$(MODSUFFIX).o: src/driver.c
	@echo Compiling -O2 $<...
	$(CC) $(CDEFS) -O2 $(CFLAGS) -c $< -o $@

$(OBJ)/sound/fm$(MODSUFFIX).o: src/sound/fm.c
	@echo Compiling -O3 $<...
	$(CC) $(CDEFS) -O3 $(CFLAGS) -c $< -o $@

$(OBJ)/sound/fmopl$(MODSUFFIX).o: src/sound/fmopl.c
	@echo Compiling -O3 $<...
	$(CC) $(CDEFS) -O3 $(CFLAGS) -c $< -o $@

$(OBJ)/sound/ay8910.o: src/sound/ay8910.c
	@echo Compiling -O2 $<...
	$(CC) $(CDEFS) -O2 $(CFLAGS) -c $< -o $@

$(OBJ)/cpu/i86/i86.o: src/cpu/i86/i86.c
	@echo Compiling -O2 $<...
	$(CC) $(CDEFS) -O2 $(CFLAGS) -c $< -o $@

$(OBJ)/cpu/tms9900/tms9900a.o: src/cpu/tms9900/tms9900a.c
	@echo Compiling -O2 $<...
	$(CC) $(CDEFS) -O2 $(CFLAGS) -c $< -o $@

$(OBJ)/cpu/s2650/s2650.o: src/cpu/s2650/s2650.c
	@echo Compiling -O2 $<...
	$(CC) $(CDEFS) -O2 $(CFLAGS) -c $< -o $@

$(OBJ)/cpu/ccpu/ccpu.o: src/cpu/ccpu/ccpu.c
	@echo Compiling -O2 $<...
	$(CC) $(CDEFS) -O2 $(CFLAGS) -c $< -o $@

$(OBJ)/cpu/adsp2100/adsp2100.o: src/cpu/adsp2100/adsp2100.c
	@echo Compiling -O2 $<...
	$(CC) $(CDEFS) -O2 $(CFLAGS) -c $< -o $@

$(OBJ)/cpu/i8085/i8085$(MODSUFFIX).o: src/cpu/i8085/i8085.c
	@echo Compiling -O2 $<...
	$(CC) $(CDEFS) -O2 $(CFLAGS) -c $< -o $@

$(OBJ)/cpu/i8039/i8039$(MODSUFFIX).o: src/cpu/i8039/i8039.c
	@echo Compiling -O2 $<...
	$(CC) $(CDEFS) -O2 $(CFLAGS) -c $< -o $@

$(OBJ)/cpu/m6800/m6800$(MODSUFFIX).o: src/cpu/m6800/m6800.c
	@echo Compiling -O2 $<...
	$(CC) $(CDEFS) -O2 $(CFLAGS) -c $< -o $@

$(OBJ)/cpu/m6805/m6805$(MODSUFFIX).o: src/cpu/m6805/m6805.c
	@echo Compiling -O2 $<...
	$(CC) $(CDEFS) -O2 $(CFLAGS) -c $< -o $@

$(OBJ)/cpu/m6809/m6809$(MODSUFFIX).o: src/cpu/m6809/m6809.c
	@echo Compiling -O3 $<...
	$(CC) $(CDEFS) -O3 $(CFLAGS) -c $< -o $@

$(OBJ)/cpu/m6502/m6502$(MODSUFFIX).o: src/cpu/m6502/m6502.c
	@echo Compiling -O3 $<...
	$(CC) $(CDEFS) -O3 $(CFLAGS) -c $< -o $@

$(OBJ)/cpuint$(MODSUFFIX).o: src/cpuintrf.c
	@echo Compiling -O2 $<...
	$(CC) $(CDEFS) -O2 $(CFLAGS) -c $< -o $@

$(OBJ)/sndint$(MODSUFFIX).o: src/sndintrf.c
	@echo Compiling -O2 $<...
	$(CC) $(CDEFS) -O2 $(CFLAGS) -c $< -o $@

$(OBJ)/memory$(MODSUFFIX).o: src/memory.c
	@echo Compiling -O3 $<...
	$(CC) $(CDEFS) -O3 $(CFLAGS) -c $< -o $@

$(OBJ)/cpu/z80/%.o: src/cpu/z80/%.c
	@echo Compiling -O3 $<...
	$(CC) $(CDEFS) -O3 $(CFLAGS) -c $< -o $@

$(OBJ)/cpu/%.o: src/cpu/%.c
	@echo Compiling -O2 $<...
	$(CC) $(CDEFS) -O2 $(CFLAGS) -c $< -o $@

$(OBJ)/inptport.o: src/inptport.c
	@echo Compiling -O2 $<...
	$(CC) $(CDEFS) -O2 $(CFLAGS) -c $< -o $@

$(OBJ)/sound/ym2151.o: src/sound/ym2151.c
	@echo Compiling -O2 $<...
	$(CC) $(CDEFS) -O2 $(CFLAGS) -c $< -o $@

$(OBJ)/gp32/gp32$(MODSUFFIX).o: src/gp32/gp32.c
	@echo Compiling -O2 $<...
	$(CC) $(CDEFS) -O2 $(CFLAGS) -c $< -o $@

$(OBJ)/gp32/config.o: src/gp32/config.c
	@echo Compiling -O2 $<...
	$(CC) $(CDEFS) -O2 $(CFLAGS) -c $< -o $@

$(OBJ)/gp32/blit.o: src/gp32/blit.c
	@echo Compiling -O3 $<...
	$(CC) $(CDEFS) -O3 $(CFLAGS) -c $< -o $@

$(OBJ)/drawgfx.o: src/drawgfx.c
	@echo Compiling -O3 $<...
	$(CC) $(CDEFS) -O3 $(CFLAGS) -c $< -o $@

$(OBJ)/machine/mathbox.o: src/machine/mathbox.c
	@echo Compiling -O3 $<...
	$(CC) $(CDEFS) -O3 $(CFLAGS) -c $< -o $@

$(OBJ)/vidhrdw/%.o: src/vidhrdw/%.c
	@echo Compiling -O3 $<...
	$(CC) $(CDEFS) -O3 $(CFLAGS) -c $< -o $@

$(OBJ)/tilemap.o: src/tilemap.c
	@echo Compiling -O2 $<...
	$(CC) $(CDEFS) -O2 $(CFLAGS) -c $< -o $@

$(OBJ)/drivers/%.o: src/drivers/%.c
	@echo Compiling -O2  $<...
	$(CC) $(CDEFS) -O2 $(CFLAGS) -c $< -o $@

$(OBJ)/%.o: src/%.c
	@echo Compiling -O3  $<...
	$(CC) $(CDEFS) -O3 $(CFLAGS) -c $< -o $@

$(OBJ)/%.o: src/%.s
	$(CC) $(CDEFS) $(CFLAGS) -c $< -o $@

$(OBJ)/%.o: src/%.S
	$(CC) $(CDEFS) $(CFLAGS) -c $< -o $@

$(OBJ)/%.a:
	$(RM) $@
	$(AR) cr $@ $^

$(sort $(OBJDIRS)):
	$(MD) $@
	$(CHMOD) $@

maketree: $(sort $(OBJDIRS))

clean:	cleanexe
	@echo Cleaning $(OBJ) tree
	$(FIND) $(OBJ) -type f -name "*.o" -exec rm -f {} \;
	$(RM) $(TARGET).map
	

cleanexe:
	$(RM) $(EMULATOR)$(FXE)
	$(RM) $(EMULATOR)$(GXB)
	$(RM) $(EMULATOR)$(ELF)

gameslist:
	@egrep "^{" src/$(MAMEOS)/gp32_frontend_list.h | cut -d\" -f4,2 | sed 's/\(..*\)"\(..*\)/\2,\1/' > gameslist.txt
