# ==============================
# Target : Samsung S3C2416 / ARM926EJ-S
# Toolchain : arm-none-eabi-gcc
# ==============================

CROSS   := arm-none-eabi-
CC      := $(CROSS)gcc
CXX     := $(CROSS)g++
AS      := $(CROSS)gcc
LD      := $(CROSS)g++
AR      := $(CROSS)ar
OBJCOPY := $(CROSS)objcopy
SIZE    := $(CROSS)size
G1SDK := ../g1sdk/

# -----------------------------------------------------------------------------
BUILD_DIR := obj

# -----------------------------------------------------------------------------
# CPU — ARM926EJ-S = ARMv5TEJ, little-endian, pas de Thumb-2
# -----------------------------------------------------------------------------
# CPU_FLAGS := -mcpu=arm926ej-s -march=armv5tej -mthumb -mlittle-endian -mfloat-abi=soft -mthumb-interwork # -marm
CPU_FLAGS := -mcpu=arm926ej-s -marm -mlittle-endian -mfloat-abi=soft -mthumb-interwork -mno-unaligned-access # -march=armv5t 

# Optim=4 dans Keil = -O2 (level 4 Keil ≈ O2 GCC, pas O3)
#OPT_FLAGS := -Os -fno-builtin-sprintf -fno-delete-null-pointer-checks
OPT_FLAGS := -O3 -fno-builtin-sprintf -fno-delete-null-pointer-checks

# -----------------------------------------------------------------------------
# Defines (depuis <Define> du .uvprojx)
# NOTE: sprintf=__sprintf suppressed — armcc specific, 
# ?LDFLAGS += -Wl,--defsym,sprintf=__sprintf
# -----------------------------------------------------------------------------
DEFINES := -DHPG1 -DMUTEKI_HAS_PRIME_UI_EVENT -DQUEUE # -DNOFRENDO_DEBUG -DNES6502_DISASM -DNES6502_DEBUG

# -----------------------------------------------------------------------------
# Include paths
# -----------------------------------------------------------------------------
INCLUDES := -I$(G1SDK)/include -I.

# -----------------------------------------------------------------------------
# Flags communs C et C++
# -----------------------------------------------------------------------------
COMMON_FLAGS := $(CPU_FLAGS) $(OPT_FLAGS) $(DEFINES) $(INCLUDES) \
    -ffunction-sections -fdata-sections -fshort-wchar -fno-short-enums -Wall -Wno-narrowing -fno-tree-loop-distribute-patterns -fno-isolate-erroneous-paths-dereference -fomit-frame-pointer -pipe

CFLAGS   := -I. -include $(G1SDK)/include/besta_fixes.h $(COMMON_FLAGS) -std=gnu99
CXXFLAGS := -I. -include $(G1SDK)/include/besta_fixes.h $(COMMON_FLAGS) -std=gnu++11 -fno-exceptions -fpermissive # -fno-rtti

# Assembleur
ASFLAGS  := $(CPU_FLAGS) -x assembler-with-cpp

# -----------------------------------------------------------------------------
# Linker
#   IRAM : 0x40000000, taille 0x10000   (64 Ko — SRAM interne)
#   SDRAM: 0x30000000 (depuis OCR_RVCT9, taille 0x1000000 = 16 Mo)
#
# code at 0x30600000 
# entry point AppMain 
#
# -----------------------------------------------------------------------------

LDFLAGS := -L. \
    -T $(G1SDK)/lib/g1app.ld \
    -Wl,--gc-sections \
    -Wl,-Map=$(BUILD_DIR)/armfir.map \
    -Wl,--entry=AppMain \
    -nostartfiles \
    -Wl,--no-wchar-size-warning -Wl,--no-enum-size-warning -Wl,--allow-multiple-definition -Wl,-n 

#LDLIBS := -lsdk --specs=nano.specs --specs=nosys.specs -lgcc
LDLIBS := --specs=nano.specs -L$(G1SDK)/lib/  -lsyscalls -lgcc

TARGET := $(BUILD_DIR)/armfir.elf


# ======================================
ALL_CXX_SRCS := besta_fixes.cc

.PHONY: all clean size

all: $(TARGET)

OBJS = reversi.o \
	besta_fixes.o k_csdk.o extapp_api.o

epsilon/rom.c: $(NES_ROM) FORCE
	echo "const unsigned char _rom_data[] = {" > $@
	cat "$(NES_ROM)" | xxd -i >> $@
	echo "};" >> $@

FORCE:

%.o: %.c
	$(CC) $(CFLAGS) -c $< -o $@

%.o: %.cc
	$(CXX) $(CXXFLAGS) -c $< -o $@


$(TARGET): $(OBJS) 
	@mkdir -p $(dir $@)
	$(LD) $(LDFLAGS) -o $@ $^ $(LDLIBS)
	$(SIZE) $@
	arm-none-eabi-nm -n obj/armfir.elf > symbols.txt
	arm-none-eabi-objcopy -j ER_RO -j ER_RW -j ER_ZI obj/armfir.elf clean_armfir.elf
	arm-none-eabi-strip -s clean_armfir.elf -o armfir_final.elf
	arm-none-eabi-readelf -S armfir_final.elf
	arm-none-eabi-readelf -h armfir_final.elf | grep "Entry point"
	./g1app.sh

size: $(TARGET)
	$(SIZE) --format=berkeley $<

clean:
	rm -rf $(BUILD_DIR) *.o  *.elf


