Files
sylverb-game-and-watch-retr…/Makefile.common

1289 lines
49 KiB
Makefile

SHELL := /bin/bash
######################################
# building variables
######################################
# debug build?
DEBUG ?= 1
# optimization
OPT ?= -Og
# Set to 0 to suppress dirty submodule warning
CHECK_DIRTY_SUBMODULE ?= 1
# Set to 0 to skip tools check
CHECK_TOOLS ?= 1
# Set to 1 to enable 16MB external flash support. (deprecated, use EXTFLASH_SIZE_MB instead!)
LARGE_FLASH ?= 0
# Configure where data is stored in the external flash by
# setting EXTFLASH_OFFSET. Useful if the first 1MB are to be preserved.
EXTFLASH_OFFSET ?= 0
SINGLE_FONT ?= 0
# Configure Game & Watch target device mario|zelda
ifneq ($(findstring flash,$(MAKECMDGOALS)),flash)
GNW_TARGET ?= mario
endif
OFF_SAVESTATE = 0
ifeq ($(SHARED_HIBERNATE_SAVESTATE),1)
OFF_SAVESTATE = 1
endif
# Configure Game & Watch target device mario|zelda
# Set the preprocessor options
ifeq ($(GNW_TARGET),mario)
GNW_TARGET_ZELDA = 0
GNW_TARGET_MARIO = 1
else ifeq ($(GNW_TARGET),zelda)
GNW_TARGET_ZELDA = 1
GNW_TARGET_MARIO = 0
else
$(error Missing or invalid GNW_TARGET option. Valid values {mario|zelda})
endif
# Disable system logos splash screen at startup
DISABLE_SPLASH_SCREEN ?= 0
# Default NES emulator is fceumm
FORCE_NOFRENDO ?= 0
NOFRENDO_PARAM := --nofrendo=$(FORCE_NOFRENDO)
# Default GB emulator is tgb-dual
FORCE_GNUBOY ?= 0
GNUBOY_PARAM := --gnuboy=$(FORCE_GNUBOY)
# Configure external flash size by setting EXTFLASH_SIZE
ifeq ($(LARGE_FLASH),1)
# 16MB
EXTFLASH_SIZE_MB ?= 16
else
# 4MB for Zelda otherwise 1MB
ifeq ($(GNW_TARGET),zelda)
EXTFLASH_SIZE_MB ?= 4
else
EXTFLASH_SIZE_MB ?= 1
endif
endif
# Configure INTFLASH_BANK and INTFLASH_ADDRESS
ifdef INTFLASH_ADDRESS
INTFLASH_ADDRESS_DECIMAL = $(shell printf "%d" $(INTFLASH_ADDRESS))
ifdef INTFLASH_BANK
# defined INTFLASH_ADDRESS INTFLASH_BANK
# Sanity check that INTFLASH_ADDRESS and INTFLASH_BANK agree
ifeq ($(shell [ $(INTFLASH_ADDRESS_DECIMAL) -ge 134217728 -a $(INTFLASH_ADDRESS_DECIMAL) -lt 135266304 ] && echo true),true)
# INTFLASH_ADDRESS is in range [0x08000000, 0x08100000)
ifneq ($(INTFLASH_BANK),1)
$(error Inconsistent INTFLASH_BANK=$(INTFLASH_BANK) and INTFLASH_ADDRESS=$(INTFLASH_ADDRESS))
endif
else
ifneq ($(INTFLASH_BANK),2)
$(error Inconsistent INTFLASH_BANK=$(INTFLASH_BANK) and INTFLASH_ADDRESS=$(INTFLASH_ADDRESS))
endif
endif
else # ifdef INTFLASH_BANK
# defined INTFLASH_ADDRESS; not defined INTFLASH_BANK
# Derive flashbank from INTFLASH_ADDRESS
ifeq ($(shell [ $(INTFLASH_ADDRESS_DECIMAL) -ge 134217728 -a $(INTFLASH_ADDRESS_DECIMAL) -lt 135266304 ] && echo true),true)
# INTFLASH_ADDRESS is in range [0x08000000, 0x08100000)
INTFLASH_BANK = 1
else
INTFLASH_BANK = 2
endif
endif
else # ifdef INTFLASH_ADDRESS
ifdef INTFLASH_BANK
# not defined INTFLASH_ADDRESS; defined INTFLASH_BANK
ifeq ($(INTFLASH_BANK),1)
INTFLASH_ADDRESS = 0x08000000
else
INTFLASH_ADDRESS = 0x08100000
endif
else # ifdef INTFLASH_BANK
# not defined INTFLASH_ADDRESS INTFLASH_BANK
INTFLASH_ADDRESS = 0x08000000
INTFLASH_BANK = 1
endif
endif
FORCE_PYOCD ?= 0
GNWMANAGER_DEBUG ?= 0
GNWMANAGER_PATH ?= gnwmanager
GNWMANAGERVERBOSITY := $(if $(filter 1,$(GNWMANAGER_DEBUG)),--verbosity debug,)
ifeq ($(FORCE_PYOCD),1)
GNWMANAGER = $(GNWMANAGER_PATH) $(GNWMANAGERVERBOSITY) -b pyocd
else
GNWMANAGER = $(GNWMANAGER_PATH) $(GNWMANAGERVERBOSITY)
endif
# Configure external flash size in MB (Megabytes)
EXTFLASH_SIZE_MB ?= 1
BIG_BANK ?= 1
EXTFLASH_SIZE ?= $(shell echo "$$(( $(EXTFLASH_SIZE_MB) * 1024 * 1024 ))")
EXTFLASH_END = $(shell echo $$(($(EXTFLASH_OFFSET) + $(EXTFLASH_SIZE))))
EXTFLASH_FORCE_SPI ?= 0
# Heuristic: if not set; 10% of your extflash should be good for filesystem.
# Rounded down to the nearest 4096.
FILESYSTEM_SIZE := $(shell \
if [ -z "$$FILESYSTEM_SIZE" ]; then \
echo $$(($(EXTFLASH_SIZE) / 10 / 4096 * 4096)); \
else \
echo $$FILESYSTEM_SIZE; \
fi)
FILESYSTEM_OFFSET ?= $(shell echo $$(($(EXTFLASH_SIZE) - $(FILESYSTEM_SIZE))))
FILESYSTEM_END = $(shell echo $$(($(FILESYSTEM_OFFSET) + $(FILESYSTEM_SIZE))))
FILESYSTEM_OFFSET_FROM_END ?= $(shell echo $$(($(EXTFLASH_SIZE) - $(FILESYSTEM_END))))
# Check to see if the filesystem is within specified extflash
FILESYSTEM_START_IN_EXTFLASH_RANGE := $(shell \
if [ $(FILESYSTEM_OFFSET) -ge $(EXTFLASH_OFFSET) \
-a $(FILESYSTEM_OFFSET) -lt $(EXTFLASH_END) ]; then \
echo "1"; \
else \
echo "0"; \
fi)
FILESYSTEM_END_IN_EXTFLASH_RANGE := $(shell \
if [ $(FILESYSTEM_END) -gt $(EXTFLASH_OFFSET) \
-a $(FILESYSTEM_END) -le $(EXTFLASH_END) ]; then \
echo "1"; \
else \
echo "0"; \
fi)
ifneq ($(FILESYSTEM_START_IN_EXTFLASH_RANGE), $(FILESYSTEM_END_IN_EXTFLASH_RANGE))
$(error Filesystem partition must be completely inside, or outside of EXTFLASH_SIZE.)
endif
FILESYSTEM_IN_EXTFLASH_RANGE = $(FILESYSTEM_START_IN_EXTFLASH_RANGE)
# If the filesystem is external, we don't need to include it in size computation.
ifeq ($(FILESYSTEM_IN_EXTFLASH_RANGE),0)
EXTFLASH_TOTAL_LENGTH := $(EXTFLASH_SIZE)
else ifeq ($(FILESYSTEM_START_IN_EXTFLASH_RANGE),1)
EXTFLASH_TOTAL_LENGTH := $(shell echo $$(($(EXTFLASH_SIZE) - $(FILESYSTEM_SIZE))))
endif
ENABLE_SCREENSHOT ?= 1
# Set to 1 to add game genie support
CHEAT_CODES ?= 0
ifeq ($(GAME_GENIE),1)
CHEAT_CODES = 1
endif
# Compress supported ROMs by default. Set to 0 to disable.
COMPRESS ?= lzma
ifeq ($(COMPRESS),0)
COMPRESS_PARAM :=
else
COMPRESS_PARAM := --compress=$(COMPRESS)
endif
# Reset the DBGMCU configuration register (DBGMCU_CR) after flashing
# Set to 0 to keep the clocks running when suspended (makes debugging easier)
RESET_DBGMCU ?= 1
ifeq ($(RESET_DBGMCU),1)
RESET_DBGMCU_CMD = -- disable-debug
else
RESET_DBGMCU_CMD =
endif
PYTHON3 ?= /usr/bin/env python3
#######################################
# paths
#######################################
# Build path
BUILD_DIR ?= build
#######################################
# i18n Codepage
#######################################
CODEPAGE ?= 1252
ES_ES ?= 1
PT_PT ?= 1
FR_FR ?= 1
IT_IT ?= 1
RU_RU ?= 1
DE_DE ?= 1
ZH_CN ?= 0
ZH_TW ?= 0
KO_KR ?= 0
JA_JP ?= 0
SCODEPAGE = "ascii"
ifeq ($(CODEPAGE), 936)
SCODEPAGE = "gbk"
ZH_CN = 1
else ifeq ($(CODEPAGE), 950)
SCODEPAGE = "big5"
ZH_TW = 1
else ifeq ($(CODEPAGE), 932)
SCODEPAGE = "eucjp"
JA_JP = 1
else ifeq ($(CODEPAGE), 949)
KO_KR = 1
SCODEPAGE = "euckr"
else ifeq ($(CODEPAGE), 12511)
RU_RU = 1
SCODEPAGE = "windows-1251"
else ifeq ($(CODEPAGE), 12521)
ES_ES = 1
SCODEPAGE = "iso-8859-1"
else ifeq ($(CODEPAGE), 12522)
PT_PT = 1
SCODEPAGE = "iso-8859-1"
else ifeq ($(CODEPAGE), 12523)
FR_FR = 1
SCODEPAGE = "iso-8859-1"
else ifeq ($(CODEPAGE), 12524)
IT_IT = 1
SCODEPAGE = "iso-8859-1"
else ifeq ($(CODEPAGE), 12521)
RU_RU = 1
SCODEPAGE = "iso-8859-5"
else ifeq ($(CODEPAGE), 12525)
DE_DE = 1
SCODEPAGE = "iso-8859-1"
else
SCODEPAGE = "iso-8859-1"
endif
UICODEPAGE ?= CODEPAGE
ifeq ($(UICODEPAGE), 936)
ZH_CN = 1
else ifeq ($(UICODEPAGE), 950)
ZH_TW = 1
else ifeq ($(UICODEPAGE), 932)
JA_JP = 1
else ifeq ($(UICODEPAGE), 949)
KO_KR = 1
else ifeq ($(UICODEPAGE), 12521)
ES_ES = 1
else ifeq ($(UICODEPAGE), 12522)
PT_PT = 1
else ifeq ($(UICODEPAGE), 12523)
FR_FR = 1
else ifeq ($(UICODEPAGE), 12524)
IT_IT = 1
else ifeq ($(UICODEPAGE), 12521)
RU_RU = 1
else ifeq ($(UICODEPAGE), 12525)
DE_DE = 1
endif
ROMINFOCODE ?= $(SCODEPAGE)
CODEPAGE_PARAM := --codepage=$(ROMINFOCODE)
#######################################
# MSX
#######################################
MSX_USE_BANK_2 ?= 0
#######################################
# cover flow
#######################################
COVERFLOW ?= 0
ifdef COVERFLOW
COVERFLOW_PARAM := --coverflow=$(COVERFLOW)
endif
JPG_QUALITY ?= 90
JPG_QUALITY_PARAM := --jpg_quality=$(JPG_QUALITY)
# Common C sources
C_SOURCES += \
retro-go-stm32/retro-go/main/gui.c \
Core/Src/porting/gw_alloc.c \
Core/Src/retro-go/rg_main.c \
Core/Src/retro-go/rg_rtc.c \
Core/Src/retro-go/rg_emulators.c \
Core/Src/retro-go/rom_manager.c \
Core/Src/porting/odroid_settings.c \
Core/Src/retro-go/i18n/rg_i18n.c \
Core/Src/retro-go/rg_logos.c
# Version and URL for the STM32CubeH7 SDK
SDK_VERSION ?= v1.11.1
SDK_URL ?= https://raw.githubusercontent.com/STMicroelectronics/STM32CubeH7
# Local path for the SDK
SDK_DIR ?= Drivers
# SDK C sources
SDK_C_SOURCES = \
Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_adc.c \
Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_adc_ex.c \
Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_cortex.c \
Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_dac_ex.c \
Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_dac.c \
Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_dma_ex.c \
Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_dma.c \
Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_dma2d.c \
Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_exti.c \
Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_flash_ex.c \
Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_flash.c \
Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_gpio.c \
Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_hsem.c \
Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_i2c_ex.c \
Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_i2c.c \
Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_jpeg.c \
Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_ltdc_ex.c \
Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_ltdc.c \
Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_mdma.c \
Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_ospi.c \
Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_pwr_ex.c \
Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_pwr.c \
Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_rcc_ex.c \
Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_rcc.c \
Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_rtc_ex.c \
Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_rtc.c \
Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_sai_ex.c \
Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_sai.c \
Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_spi_ex.c \
Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_spi.c \
Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_tim_ex.c \
Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_tim.c \
Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_wwdg.c \
Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal.c \
# SDK ASM sources
SDK_ASM_SOURCES = \
Drivers/CMSIS/Device/ST/STM32H7xx/Source/Templates/gcc/startup_stm32h7b0xx.s \
Core/Src/memcpy-armv7m.s
# SDK headers
SDK_HEADERS = \
Drivers/CMSIS/Device/ST/STM32H7xx/Include/stm32h7b0xx.h \
Drivers/CMSIS/Device/ST/STM32H7xx/Include/stm32h7xx.h \
Drivers/CMSIS/Device/ST/STM32H7xx/Include/system_stm32h7xx.h \
Drivers/CMSIS/Include/cmsis_compiler.h \
Drivers/CMSIS/Include/cmsis_gcc.h \
Drivers/CMSIS/Include/cmsis_version.h \
Drivers/CMSIS/Include/core_cm7.h \
Drivers/CMSIS/Include/mpu_armv7.h \
Drivers/STM32H7xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h \
Drivers/STM32H7xx_HAL_Driver/Inc/stm32h7xx_ll_adc.h \
Drivers/STM32H7xx_HAL_Driver/Inc/stm32h7xx_hal_adc.h \
Drivers/STM32H7xx_HAL_Driver/Inc/stm32h7xx_hal_adc_ex.h \
Drivers/STM32H7xx_HAL_Driver/Inc/stm32h7xx_hal_cortex.h \
Drivers/STM32H7xx_HAL_Driver/Inc/stm32h7xx_hal_dac_ex.h \
Drivers/STM32H7xx_HAL_Driver/Inc/stm32h7xx_hal_dac.h \
Drivers/STM32H7xx_HAL_Driver/Inc/stm32h7xx_hal_def.h \
Drivers/STM32H7xx_HAL_Driver/Inc/stm32h7xx_hal_dma_ex.h \
Drivers/STM32H7xx_HAL_Driver/Inc/stm32h7xx_hal_dma.h \
Drivers/STM32H7xx_HAL_Driver/Inc/stm32h7xx_hal_dma2d.h \
Drivers/STM32H7xx_HAL_Driver/Inc/stm32h7xx_hal_exti.h \
Drivers/STM32H7xx_HAL_Driver/Inc/stm32h7xx_hal_flash_ex.h \
Drivers/STM32H7xx_HAL_Driver/Inc/stm32h7xx_hal_flash.h \
Drivers/STM32H7xx_HAL_Driver/Inc/stm32h7xx_hal_gpio_ex.h \
Drivers/STM32H7xx_HAL_Driver/Inc/stm32h7xx_hal_gpio.h \
Drivers/STM32H7xx_HAL_Driver/Inc/stm32h7xx_hal_hsem.h \
Drivers/STM32H7xx_HAL_Driver/Inc/stm32h7xx_hal_i2c_ex.h \
Drivers/STM32H7xx_HAL_Driver/Inc/stm32h7xx_hal_i2c.h \
Drivers/STM32H7xx_HAL_Driver/Inc/stm32h7xx_hal_jpeg.h \
Drivers/STM32H7xx_HAL_Driver/Inc/stm32h7xx_hal_ltdc_ex.h \
Drivers/STM32H7xx_HAL_Driver/Inc/stm32h7xx_hal_ltdc.h \
Drivers/STM32H7xx_HAL_Driver/Inc/stm32h7xx_hal_mdma.h \
Drivers/STM32H7xx_HAL_Driver/Inc/stm32h7xx_hal_ospi.h \
Drivers/STM32H7xx_HAL_Driver/Inc/stm32h7xx_hal_pwr_ex.h \
Drivers/STM32H7xx_HAL_Driver/Inc/stm32h7xx_hal_pwr.h \
Drivers/STM32H7xx_HAL_Driver/Inc/stm32h7xx_hal_rcc_ex.h \
Drivers/STM32H7xx_HAL_Driver/Inc/stm32h7xx_hal_rcc.h \
Drivers/STM32H7xx_HAL_Driver/Inc/stm32h7xx_hal_rtc_ex.h \
Drivers/STM32H7xx_HAL_Driver/Inc/stm32h7xx_hal_rtc.h \
Drivers/STM32H7xx_HAL_Driver/Inc/stm32h7xx_hal_sai_ex.h \
Drivers/STM32H7xx_HAL_Driver/Inc/stm32h7xx_hal_sai.h \
Drivers/STM32H7xx_HAL_Driver/Inc/stm32h7xx_hal_spi_ex.h \
Drivers/STM32H7xx_HAL_Driver/Inc/stm32h7xx_hal_spi.h \
Drivers/STM32H7xx_HAL_Driver/Inc/stm32h7xx_hal_tim.h \
Drivers/STM32H7xx_HAL_Driver/Inc/stm32h7xx_hal_tim_ex.h \
Drivers/STM32H7xx_HAL_Driver/Inc/stm32h7xx_hal_wwdg.h \
Drivers/STM32H7xx_HAL_Driver/Inc/stm32h7xx_hal.h \
#######################################
# binaries
#######################################
PREFIX = arm-none-eabi-
# The gcc compiler bin path can be either defined in make command via GCC_PATH variable (> make GCC_PATH=xxx)
# either it can be added to the PATH environment variable.
ifdef GCC_PATH
CC = $(GCC_PATH)/$(PREFIX)gcc
CXX = $(GCC_PATH)/$(PREFIX)g++
AS = $(GCC_PATH)/$(PREFIX)gcc -x assembler-with-cpp
CP = $(GCC_PATH)/$(PREFIX)objcopy
SZ = $(GCC_PATH)/$(PREFIX)size
GDB = $(GCC_PATH)/$(PREFIX)gdb
DUMP = $(GCC_PATH)/$(PREFIX)objdump
else
CC = $(PREFIX)gcc
CXX = $(PREFIX)g++
AS = $(PREFIX)gcc -x assembler-with-cpp
CP = $(PREFIX)objcopy
SZ = $(PREFIX)size
GDB = $(PREFIX)gdb
DUMP = $(PREFIX)objdump
endif
HEX = $(CP) -O ihex
BIN = $(CP) -O binary -S
ECHO = echo
TOUCH = touch
#######################################
# CFLAGS
#######################################
# cpu
CPU = -mcpu=cortex-m7 -mtune=cortex-m7
# fpu
FPU = -mfpu=fpv5-d16
# float-abi
FLOAT-ABI = -mfloat-abi=hard
# mcu
MCU = $(CPU) -mthumb -mno-unaligned-access $(FPU) $(FLOAT-ABI)
# macros for gcc
# AS defines
AS_DEFS +=
# C defines
C_DEFS += \
-D_GNU_SOURCE \
-DINTFLASH_BANK=$(INTFLASH_BANK) \
-DINTFLASH_ADDRESS=$(INTFLASH_ADDRESS) \
-DBIG_BANK=$(BIG_BANK) \
-DEXTFLASH_SIZE=$(EXTFLASH_SIZE) \
-DMSX_USE_BANK_2=$(MSX_USE_BANK_2) \
-DOFF_SAVESTATE=$(OFF_SAVESTATE) \
-DCODEPAGE=$(CODEPAGE) \
-DUICODEPAGE=$(UICODEPAGE) \
-DINCLUDED_ES_ES=$(ES_ES) \
-DINCLUDED_PT_PT=$(PT_PT) \
-DINCLUDED_FR_FR=$(FR_FR) \
-DINCLUDED_IT_IT=$(IT_IT) \
-DINCLUDED_DE_DE=$(DE_DE) \
-DINCLUDED_RU_RU=$(RU_RU) \
-DINCLUDED_ZH_CN=$(ZH_CN) \
-DINCLUDED_ZH_TW=$(ZH_TW) \
-DINCLUDED_KO_KR=$(KO_KR) \
-DINCLUDED_JA_JP=$(JA_JP) \
-DSINGLE_FONT=$(SINGLE_FONT) \
-DLANG=$(LANG) \
-DCOVERFLOW=$(COVERFLOW) \
-DEXTFLASH_FORCE_SPI=$(EXTFLASH_FORCE_SPI) \
-DUSE_HAL_DRIVER \
-DSTM32H7B0xx \
-DIS_LITTLE_ENDIAN \
-DMINIZ_NO_MALLOC \
-DMINIZ_NO_ZLIB_APIS \
-DDEBUG_RG_ALLOC \
-DLFS_NO_MALLOC \
-DENABLE_SCREENSHOT=$(ENABLE_SCREENSHOT) \
-DGNW_TARGET_MARIO=$(GNW_TARGET_MARIO) \
-DGNW_TARGET_ZELDA=$(GNW_TARGET_ZELDA) \
-DCHEAT_CODES=$(CHEAT_CODES) \
-DFORCE_NOFRENDO=$(FORCE_NOFRENDO) \
-DFORCE_GNUBOY=$(FORCE_GNUBOY) \
-DDISABLE_SPLASH_SCREEN=$(DISABLE_SPLASH_SCREEN) \
-DTARGET_GNW \
-DNO_EMBEDDED_SAMPLES \
-D__LIBRETRO__ \
-DZ80_CUSTOM_CONFIGURATION \
-DMSX_NO_ZIP \
-DMSX_NO_FILESYSTEM \
-DMSX_NO_MALLOC \
-DMAX_VIDEO_WIDTH_320 \
-DPIXEL_WIDTH=8 \
-DMSX_NO_STEREO \
-DFCEU_VERSION_NUMERIC=9813 \
-DFCEU_LOW_RAM \
-DFCEU_NO_MALLOC \
-DVIDEO_RGB565 \
-DCELESTE_SLOW_CPU
# AS includes
AS_INCLUDES +=
# C includes
C_INCLUDES += \
-ICore/Inc \
-ICore/Inc/porting \
-ICore/Inc/porting/gb \
-ICore/Inc/porting/gb_tgbdual \
-ICore/Inc/porting/nes \
-ICore/Inc/porting/nes_fceu \
-ICore/Inc/porting/smsplusgx \
-ICore/Inc/porting/pce \
-ICore/Inc/porting/msx \
-ICore/Inc/porting/wsv \
-ICore/Inc/porting/gw \
-ICore/Inc/porting/gwenesis \
-ICore/Inc/porting/a2600 \
-ICore/Inc/porting/a7800 \
-ICore/Inc/porting/amstrad \
-ICore/Inc/porting/zelda3 \
-ICore/Inc/porting/smw \
-ICore/Inc/porting/videopac \
-ICore/Inc/porting/celeste \
-ICore/Inc/porting/tama \
-ICore/Inc/retro-go \
-IDrivers/STM32H7xx_HAL_Driver/Inc \
-IDrivers/STM32H7xx_HAL_Driver/Inc/Legacy \
-IDrivers/CMSIS/Device/ST/STM32H7xx/Include \
-IDrivers/CMSIS/Include \
-Iretro-go-stm32/components/lupng \
CXX_INCLUDES += \
# Force include the configuration
CFLAGS += $(CFLAGS_EXTRA) -include $(BUILD_DIR)/config.h
# compile gcc flags
ASFLAGS += $(MCU) $(AS_DEFS) $(AS_INCLUDES) $(OPT) -Wall -fdata-sections -ffunction-sections
CFLAGS += $(MCU) $(C_DEFS) $(C_INCLUDES) $(OPT) -Wall -fdata-sections -ffunction-sections -falign-functions -falign-jumps -fmerge-all-constants
ifeq ($(DEBUG), 1)
CFLAGS += -ggdb -gdwarf-2
endif
CFLAGS += -fstack-usage -Wstack-usage=20480
# Generate dependency information
CFLAGS += -MMD -MP -MF"$(@:%.o=%.d)"
CXXFLAGS = $(CFLAGS) $(CXX_INCLUDES) \
-fno-rtti \
-fno-math-errno \
-fomit-frame-pointer \
-fno-stack-protector \
-fno-threadsafe-statics \
-nostartfiles \
-DHAVE_STDINT_H \
-Wno-error=format-truncation
LDFLAGS += -Wl,--defsym=__EXTFLASH_OFFSET__=$(EXTFLASH_OFFSET)
LDFLAGS += -Wl,--defsym=__EXTFLASH_TOTAL_LENGTH__=$(EXTFLASH_TOTAL_LENGTH)
LDFLAGS += -Wl,--defsym=ENABLE_SCREENSHOT=$(ENABLE_SCREENSHOT)
LDFLAGS += -Wl,--defsym=__FILESYSTEM_OFFSET__=$(FILESYSTEM_OFFSET)
LDFLAGS += -Wl,--defsym=__FILESYSTEM_LENGTH__=$(FILESYSTEM_SIZE)
LDFLAGS += -Wl,--defsym=__INTFLASH__=$(INTFLASH_ADDRESS)
ifeq ($(BIG_BANK), 1)
FLASH_LENGTH = 256k
else
FLASH_LENGTH = 128k
endif
LDFLAGS += -Wl,--defsym=__FLASH_LENGTH__=$(FLASH_LENGTH)
#######################################
# LDFLAGS
#######################################
# link script
LDSCRIPT ?= STM32H7B0VBTx_FLASH.ld
# libraries
LIBS = -lc -lm -lnosys
CXXLIBS = -lstdc++
LIBDIR +=
LDFLAGS += $(MCU) -specs=nano.specs -T$(LDSCRIPT) $(LIBDIR) $(LIBS) $(CXXLIBS) -Wl,-Map=$(BUILD_DIR)/$(TARGET).map,--cref -Wl,--gc-sections
# default action: build all
all: CheckTools CheckDirtySubmodules $(BUILD_DIR) $(BUILD_DIR)/$(TARGET).elf $(BUILD_DIR)/$(TARGET)_extflash.bin $(BUILD_DIR)/$(TARGET)_intflash.bin $(BUILD_DIR)/$(TARGET)_intflash2.bin
#######################################
# build the application
#######################################
# list of objects
OBJECTS = $(addprefix $(BUILD_DIR)/core/,$(notdir $(C_SOURCES:.c=.o) $(SDK_C_SOURCES:.c=.o)))
TAMP_OBJECTS = $(addprefix $(BUILD_DIR)/tamp/,$(notdir $(TAMP_C_SOURCES:.c=.o)))
GNUBOY_OBJECTS = $(addprefix $(BUILD_DIR)/gnuboy/,$(notdir $(GNUBOY_C_SOURCES:.c=.o)))
TGBDUAL_OBJECTS = $(addprefix $(BUILD_DIR)/tgbdual/,$(notdir $(TGBDUAL_C_SOURCES:.c=.o)))
NES_OBJECTS = $(addprefix $(BUILD_DIR)/nes/,$(notdir $(NES_C_SOURCES:.c=.o)))
NES_FCEU_OBJECTS = $(addprefix $(BUILD_DIR)/nes_fceu/,$(notdir $(NES_FCEU_C_SOURCES:.c=.o)))
SMSPLUSGX_OBJECTS = $(addprefix $(BUILD_DIR)/smsplusgx/,$(notdir $(SMSPLUSGX_C_SOURCES:.c=.o)))
PCE_OBJECTS = $(addprefix $(BUILD_DIR)/pce/,$(notdir $(PCE_C_SOURCES:.c=.o)))
GW_OBJECTS = $(addprefix $(BUILD_DIR)/gw/,$(notdir $(GW_C_SOURCES:.c=.o)))
MSX_OBJECTS = $(addprefix $(BUILD_DIR)/msx/,$(notdir $(MSX_C_SOURCES:.c=.o)))
WSV_OBJECTS = $(addprefix $(BUILD_DIR)/wsv/,$(notdir $(WSV_C_SOURCES:.c=.o)))
MD_OBJECTS = $(addprefix $(BUILD_DIR)/md/,$(notdir $(MD_C_SOURCES:.c=.o)))
A2600_OBJECTS = $(addprefix $(BUILD_DIR)/a2600/,$(notdir $(A2600_C_SOURCES:.c=.o)))
A7800_OBJECTS = $(addprefix $(BUILD_DIR)/a7800/,$(notdir $(A7800_C_SOURCES:.c=.o)))
AMSTRAD_OBJECTS = $(addprefix $(BUILD_DIR)/amstrad/,$(notdir $(AMSTRAD_C_SOURCES:.c=.o)))
ZELDA3_OBJECTS = $(addprefix $(BUILD_DIR)/zelda3/,$(notdir $(ZELDA3_C_SOURCES:.c=.o)))
SMW_OBJECTS = $(addprefix $(BUILD_DIR)/smw/,$(notdir $(SMW_C_SOURCES:.c=.o)))
VIDEOPAC_OBJECTS = $(addprefix $(BUILD_DIR)/videopac/,$(notdir $(VIDEOPAC_C_SOURCES:.c=.o)))
CELESTE_OBJECTS = $(addprefix $(BUILD_DIR)/celeste/,$(notdir $(CELESTE_C_SOURCES:.c=.o)))
TAMA_OBJECTS = $(addprefix $(BUILD_DIR)/tama/,$(notdir $(TAMA_C_SOURCES:.c=.o)))
vpath %.c $(sort $(dir $(C_SOURCES) $(TAMP_C_SOURCES) $(NES_C_SOURCES) $(NES_FCEU_C_SOURCES) $(GNUBOY_C_SOURCES) $(TGBDUAL_C_SOURCES) $(TGBDUAL_C_SOURCES) $(SMSPLUSGX_C_SOURCES) $(PCE_C_SOURCES) $(MSX_C_SOURCES) $(GW_C_SOURCES) $(WSV_C_SOURCES) $(MD_C_SOURCES) $(A2600_C_SOURCES) $(A7800_C_SOURCES) $(AMSTRAD_C_SOURCES) $(ZELDA3_C_SOURCES) $(SMW_C_SOURCES) $(VIDEOPAC_C_SOURCES) $(CELESTE_C_SOURCES) $(TAMA_C_SOURCES) $(SDK_C_SOURCES)))
# CXX
CXX_OBJECTS = $(addprefix $(BUILD_DIR)/core/,$(notdir $(CXX_SOURCES:.cpp=.o) ))
TGBDUAL_CXX_OBJECTS = $(addprefix $(BUILD_DIR)/tgbdual/,$(notdir $(TGBDUAL_CXX_SOURCES:.cpp=.o)))
A2600_CXX_OBJECTS = $(addprefix $(BUILD_DIR)/a2600/,$(notdir $(A2600_CXX_SOURCES:.cxx=.o)))
vpath %.cpp $(sort $(dir $(CXX_SOURCES) $(TGBDUAL_CXX_SOURCES) ))
vpath %.cxx $(sort $(dir $(A2600_CXX_SOURCES) ))
# list of ASM program objects
OBJECTS += $(addprefix $(BUILD_DIR)/,$(notdir $(SDK_ASM_SOURCES:.s=.o)))
vpath %.s $(sort $(dir $(SDK_ASM_SOURCES)))
OBJECTS += $(addprefix $(BUILD_DIR)/,roms.a)
# function used to generate prerequisite rules for SDK objects
define sdk_obj_prereq_gen
$(BUILD_DIR)/$(patsubst %.c,%.o,$(patsubst %.s,%.o,$(notdir $1))): $1
endef
# note: the blank line above is intentional
# generate all object prerequisite rules
$(eval $(foreach obj,$(SDK_C_SOURCES) $(SDK_ASM_SOURCES),$(call sdk_obj_prereq_gen,$(obj))))
FORCE:
Core/Inc/githash.h: FORCE | $(BUILD_DIR)
$(V)./scripts/update_githash.sh $@
$(BUILD_DIR)/core/error_screens.o: Core/Inc/githash.h
$(BUILD_DIR)/core/filesystem.o: Core/Inc/githash.h
$(BUILD_DIR)/core/main.o: Core/Inc/githash.h
$(BUILD_DIR)/core/rg_main.o: Core/Inc/githash.h
# Run parse_roms.py to generate information about the roms
$(BUILD_DIR)/rom_files.txt: FORCE | $(BUILD_DIR)
$(V)$(ECHO) [ BASH ] Checking for updated roms
$(V)./scripts/update_rom_files.sh build/rom_files.txt roms/gb roms/nes roms/sms roms/gg roms/col roms/pce roms/sg roms/msx roms/gw roms/wsv roms/md roms/a2600 roms/a7800 roms/amstrad roms/videopac roms/homebrew roms/tama
$(BUILD_DIR)/roms.a: $(BUILD_DIR)/rom_files.txt parse_roms.py
$(V)$(ECHO) [ PYTHON3 ] $(notdir $<)
$(V)$(PYTHON3) parse_roms.py \
--flash-size=$(EXTFLASH_SIZE) \
$(SAVE_PARAM) \
$(COMPRESS_PARAM) \
$(CODEPAGE_PARAM) \
$(COVERFLOW_PARAM) \
$(JPG_QUALITY_PARAM) \
$(NOFRENDO_PARAM)
$(BUILD_DIR)/config.h $(BUILD_DIR)/cacheflash.ld &: $(BUILD_DIR)/roms.a
$(V)/bin/sh -c true
STM32H7B0VBTx_FLASH.ld: $(BUILD_DIR)/cacheflash.ld
# rom_manager.c depends on the different *_roms.c files but they only change when roms.a changes
$(BUILD_DIR)/core/rom_manager.o: Core/Src/retro-go/rom_manager.c $(BUILD_DIR)/roms.a
ifeq (${CHECK_DIRTY_SUBMODULE},1)
CheckDirtySubmodules:
$(V)git submodule foreach "git diff --quiet" 2> /dev/null || \
(echo -e "\n\n\nYou have changes in the submodule. This is not normal.\nPlease clean the submodule by running 'git submodule update --init'\n\n(You may set CHECK_DIRTY_SUBMODULE=0 to suppress this warning)\n\n\n" && exit 1)
$(V)git submodule status | grep -v '+' 2> /dev/null > /dev/null || \
(echo -e "\n\n\nYou are using a submodule that is not updated.\nPlease sync the submodules by running 'git submodule update --init'\n\n(You may set CHECK_DIRTY_SUBMODULE=0 to suppress this warning)\n\n\n" && exit 1)
else
CheckDirtySubmodules:
endif
.PHONY: CheckDirtySubmodules
ifeq (${CHECK_TOOLS},1)
CheckTools:
@# Check that the tools in the toolchain exist
$(V)/usr/bin/env bash -c " \
for tool in $(CC) $(CP) $(SZ) $(GDB) $(DUMP); do \
which \$$tool 2> /dev/null > /dev/null || \
( \
echo -e \"\nCannot find \$$tool\n\" && \
exit 1 \
) \
done"
@# Check that GCC version 10 or higher is used
$(V)$(CC) -v 2>&1 | grep "gcc version 1[0-9]" > /dev/null || \
( \
echo -e "\n\n\nPlease use GCC version 10 or higher.\n\n\nYou are using:" && \
$(CC) -v 2>&1 | grep "gcc version" ; \
echo -e "\n\n\n" && \
exit 1 \
)
$(V)$(CP) --info | grep "elf32-littlearm" > /dev/null || \
( \
echo -e "\n\n\n$(CP) does not suport elf32-littlearm.\nPlease install a toolchain that supports elf32-littlearm and armv7e-m.\n\n\n" && \
exit 1 \
)
$(V)$(DUMP) --help | grep "armv7e-m" > /dev/null || \
( \
echo -e "\n\n\nobjdump does not suport armv7e-m.\nPlease install a toolchain that supports elf32-littlearm and armv7e-m.\n\n\n" && \
exit 1 \
)
$(V)$(PYTHON3) scripts/python_version_check.py
else
CheckTools:
endif
.PHONY: CheckTools
$(BUILD_DIR)/%.o: %.s Makefile.common Makefile $(BUILD_DIR)/config.h | $(BUILD_DIR)
$(V)$(ECHO) [ AS ] $(notdir $<)
$(V)$(AS) -c $(CFLAGS) $< -o $@
$(BUILD_DIR)/$(TARGET).elf: $(OBJECTS) $(TAMP_OBJECTS) $(A2600_OBJECTS) $(A7800_OBJECTS) $(NES_OBJECTS) $(NES_FCEU_OBJECTS) $(GNUBOY_OBJECTS) $(TGBDUAL_OBJECTS) $(SMSPLUSGX_OBJECTS) $(PCE_OBJECTS) $(MSX_OBJECTS) $(GW_OBJECTS) $(WSV_OBJECTS) $(MD_OBJECTS) $(AMSTRAD_OBJECTS) $(VIDEOPAC_OBJECTS) $(CELESTE_OBJECTS) $(CXX_OBJECTS) $(TGBDUAL_CXX_OBJECTS) $(A2600_CXX_OBJECTS) $(ZELDA3_OBJECTS) $(SMW_OBJECTS) $(TAMA_OBJECTS) Makefile.common Makefile $(LDSCRIPT)
$(V)$(ECHO) [ LD ] $(notdir $@)
$(V)$(CC) $(OBJECTS) $(A2600_OBJECTS) $(A7800_OBJECTS) $(TAMP_OBJECTS) $(NES_OBJECTS) $(NES_FCEU_OBJECTS) $(GNUBOY_OBJECTS) $(TGBDUAL_OBJECTS) $(SMSPLUSGX_OBJECTS) $(PCE_OBJECTS) $(MSX_OBJECTS) $(GW_OBJECTS) $(WSV_OBJECTS) $(MD_OBJECTS) $(AMSTRAD_OBJECTS) $(VIDEOPAC_OBJECTS) $(CELESTE_OBJECTS) $(CXX_OBJECTS) $(TGBDUAL_CXX_OBJECTS) $(A2600_CXX_OBJECTS) $(ZELDA3_OBJECTS) $(SMW_OBJECTS) $(TAMA_OBJECTS) $(LDFLAGS) -o $@
$(V)./scripts/extflash_size.sh $@
$(BUILD_DIR)/core/%.o: %.c Makefile.common Makefile $(SDK_HEADERS) $(BUILD_DIR)/config.h | $(BUILD_DIR)
$(V)$(ECHO) [ CC core ] $(notdir $<)
$(V)$(CC) -c $(CFLAGS) -Wa,-a,-ad,-alms=$(BUILD_DIR)/core/$(notdir $(<:.c=.lst)) $< -o $@
$(BUILD_DIR)/tamp/%.o: $(TAMP_DIR)/tamp/%.c Makefile.common Makefile $(SDK_HEADERS) $(BUILD_DIR)/config.h | $(BUILD_DIR)
$(V)$(ECHO) [ CC tamp ] $(notdir $<)
$(V)$(CC) -c $(CFLAGS) $(TAMP_C_INCLUDES) -Wa,-a,-ad,-alms=$(BUILD_DIR)/tamp/$(notdir $(<:.c=.lst)) $< -o $@
$(BUILD_DIR)/nes/%.o: %.c Makefile.common Makefile $(SDK_HEADERS) $(BUILD_DIR)/config.h | $(BUILD_DIR)
$(V)$(ECHO) [ CC nes ] $(notdir $<)
$(V)$(CC) -c $(CFLAGS) $(NES_C_INCLUDES) -Wa,-a,-ad,-alms=$(BUILD_DIR)/nes/$(notdir $(<:.c=.lst)) $< -o $@
$(BUILD_DIR)/nes_fceu/%.o: %.c Makefile.common Makefile $(SDK_HEADERS) $(BUILD_DIR)/config.h | $(BUILD_DIR)
$(V)$(ECHO) [ CC nes-fceu ] $(notdir $<)
$(V)$(CC) -c $(CFLAGS) $(NES_FCEU_C_INCLUDES) -Wno-sequence-point -Wno-parentheses -Wa,-a,-ad,-alms=$(BUILD_DIR)/nes_fceu/$(notdir $(<:.c=.lst)) $< -o $@
$(BUILD_DIR)/gnuboy/%.o: %.c Makefile.common Makefile $(SDK_HEADERS) $(BUILD_DIR)/config.h | $(BUILD_DIR)
$(V)$(ECHO) [ CC gb ] $(notdir $<)
$(V)$(CC) -c $(CFLAGS) $(GNUBOY_C_INCLUDES) -Wa,-a,-ad,-alms=$(BUILD_DIR)/gnuboy/$(notdir $(<:.c=.lst)) $< -o $@
$(BUILD_DIR)/tgbdual/%.o: %.c Makefile.common Makefile $(SDK_HEADERS) $(BUILD_DIR)/config.h | $(BUILD_DIR)
$(V)$(ECHO) [ CC GB TGB Dual ] $(notdir $<)
$(V)$(CC) -c $(CFLAGS) $(TGBDUAL_C_INCLUDES) -Wa,-a,-ad,-alms=$(BUILD_DIR)/tgbdual/$(notdir $(<:.c=.lst)) $< -o $@
$(BUILD_DIR)/smsplusgx/%.o: %.c Makefile.common Makefile $(SDK_HEADERS) $(BUILD_DIR)/config.h | $(BUILD_DIR)
$(V)$(ECHO) [ CC sms ] $(notdir $<)
$(V)$(CC) -c $(CFLAGS) $(SMSPLUSGX_C_INCLUDES) -Wa,-a,-ad,-alms=$(BUILD_DIR)/smsplusgx/$(notdir $(<:.c=.lst)) $< -o $@
$(BUILD_DIR)/pce/%.o: %.c Makefile.common Makefile $(SDK_HEADERS) $(BUILD_DIR)/config.h | $(BUILD_DIR)
$(V)$(ECHO) [ CC pce ] $(notdir $<)
$(V)$(CC) -c $(CFLAGS) $(PCE_C_INCLUDES) -Wa,-a,-ad,-alms=$(BUILD_DIR)/pce/$(notdir $(<:.c=.lst)) $< -o $@
$(BUILD_DIR)/msx/%.o: %.c Makefile.common Makefile $(SDK_HEADERS) $(BUILD_DIR)/config.h | $(BUILD_DIR)
$(V)$(ECHO) [ CC msx ] $(notdir $<)
$(V)$(CC) -c $(CFLAGS) $(MSX_C_INCLUDES) -Wa,-a,-ad,-alms=$(BUILD_DIR)/msx/$(notdir $(<:.c=.lst)) $< -o $@
$(BUILD_DIR)/gw/%.o: %.c Makefile.common Makefile $(SDK_HEADERS) $(BUILD_DIR)/config.h | $(BUILD_DIR)
$(V)$(ECHO) [ CC gw ] $(notdir $<)
$(V)$(CC) -c $(CFLAGS) $(GW_C_INCLUDES) -Wa,-a,-ad,-alms=$(BUILD_DIR)/gw/$(notdir $(<:.c=.lst)) $< -o $@
$(BUILD_DIR)/wsv/%.o: %.c Makefile.common Makefile $(SDK_HEADERS) $(BUILD_DIR)/config.h | $(BUILD_DIR)
$(V)$(ECHO) [ CC wsv ] $(notdir $<)
$(V)$(CC) -c $(CFLAGS) $(WSV_C_INCLUDES) -Wa,-a,-ad,-alms=$(BUILD_DIR)/wsv/$(notdir $(<:.c=.lst)) $< -o $@
$(BUILD_DIR)/md/%.o: %.c Makefile.common Makefile $(SDK_HEADERS) $(BUILD_DIR)/config.h | $(BUILD_DIR)
$(V)$(ECHO) [ CC md ] $(notdir $<)
$(V)$(CC) -c $(CFLAGS) $(MD_C_INCLUDES) -Wa,-a,-ad,-alms=$(BUILD_DIR)/md/$(notdir $(<:.c=.lst)) $< -o $@
$(BUILD_DIR)/a7800/%.o: %.c Makefile.common Makefile $(SDK_HEADERS) $(BUILD_DIR)/config.h | $(BUILD_DIR)
$(V)$(ECHO) [ CC a7800 ] $(notdir $<)
$(V)$(CC) -c $(CFLAGS) $(A7800_C_INCLUDES) -Wa,-a,-ad,-alms=$(BUILD_DIR)/a7800/$(notdir $(<:.c=.lst)) $< -o $@
$(BUILD_DIR)/a2600/%.o: %.c Makefile.common Makefile $(SDK_HEADERS) $(BUILD_DIR)/config.h | $(BUILD_DIR)
$(V)$(ECHO) [ CC a2600 ] $(notdir $<)
$(V)$(CC) -c $(CFLAGS) $(A2600_C_INCLUDES) -Wa,-a,-ad,-alms=$(BUILD_DIR)/a2600/$(notdir $(<:.c=.lst)) $< -o $@
$(BUILD_DIR)/amstrad/%.o: %.c Makefile.common Makefile $(SDK_HEADERS) $(BUILD_DIR)/config.h | $(BUILD_DIR)
$(V)$(ECHO) [ CC amstrad CPC ] $(notdir $<)
$(V)$(CC) -c $(CFLAGS) $(AMSTRAD_C_INCLUDES) -Wa,-a,-ad,-alms=$(BUILD_DIR)/amstrad/$(notdir $(<:.c=.lst)) $< -o $@
$(BUILD_DIR)/videopac/%.o: %.c Makefile.common Makefile $(SDK_HEADERS) $(BUILD_DIR)/config.h | $(BUILD_DIR)
$(V)$(ECHO) [ CC o2em ] $(notdir $<)
$(V)$(CC) -c $(CFLAGS) $(VIDEOPAC_C_INCLUDES) -Wa,-a,-ad,-alms=$(BUILD_DIR)/videopac/$(notdir $(<:.c=.lst)) $< -o $@
$(BUILD_DIR)/celeste/%.o: %.c Makefile.common Makefile $(SDK_HEADERS) $(BUILD_DIR)/config.h | $(BUILD_DIR)
$(V)$(ECHO) [ CC celeste ] $(notdir $<)
$(V)$(CC) -c $(CFLAGS) $(CELESTE_C_INCLUDES) -Wa,-a,-ad,-alms=$(BUILD_DIR)/celeste/$(notdir $(<:.c=.lst)) $< -o $@
$(BUILD_DIR)/tama/%.o: %.c Makefile.common Makefile $(SDK_HEADERS) $(BUILD_DIR)/config.h | $(BUILD_DIR)
$(V)$(ECHO) [ CC tama ] $(notdir $<)
$(V)$(CC) -c $(CFLAGS) $(TAMA_C_INCLUDES) -Wa,-a,-ad,-alms=$(BUILD_DIR)/tama/$(notdir $(<:.c=.lst)) $< -o $@
# CXX
$(BUILD_DIR)/core/%.o: %.cpp Makefile Makefile.common $(SDK_HEADERS) $(BUILD_DIR)/config.h | $(BUILD_DIR)
$(V)$(ECHO) [ CXX core ] $(notdir $<)
$(V)$(CXX) -c $(CXXFLAGS) -Wa,-a,-ad,-alms=$(BUILD_DIR)/core/$(notdir $(<:.cpp=.lst)) $< -o $@
$(BUILD_DIR)/tgbdual/%.o: %.cpp Makefile Makefile.common $(SDK_HEADERS) $(BUILD_DIR)/config.h | $(BUILD_DIR)
$(V)$(ECHO) [ CXX GB TGB Dual ] $(notdir $<)
$(V)$(CXX) -c $(CXXFLAGS) $(TGBDUAL_C_INCLUDES) -Wa,-a,-ad,-alms=$(BUILD_DIR)/tgbdual/$(notdir $(<:.cpp=.lst)) $< -o $@
$(BUILD_DIR)/a2600/%.o: %.cxx Makefile Makefile.common $(SDK_HEADERS) $(BUILD_DIR)/config.h | $(BUILD_DIR)
$(V)$(ECHO) [ CXX a2600 ] $(notdir $<)
$(V)$(CXX) -c $(CXXFLAGS) $(A2600_C_INCLUDES) -Wa,-a,-ad,-alms=$(BUILD_DIR)/a2600/$(notdir $(<:.cxx=.lst)) $< -o $@
# Zelda3 configuration
# Limit to 30 fps for improved stability
ZELDA3_LIMIT_30FPS ?= 1
# Increase UI speed (item menu, etc.)
ZELDA3_FASTER_UI ?= 1
# Display battery indicator in item menu
ZELDA3_BATTERY_INDICATOR ?= 1
# Item switch on L/R. Also allows reordering of items in inventory by pressing Y+direction.
# Hold X, L, or R inside of the item selection screen to assign items to those buttons.
# If X is reassigned, Select opens the map. Push Select while paused to save or quit.
# When L or R are assigned items, those buttons will no longer cycle items.
ZELDA3_FEATURE_SWITCH_LR ?= 0
# Allow turning while dashing
ZELDA3_FEATURE_TURN_WHILE_DASHING ?= 0
# Allow mirror to be used to warp to the Dark World
ZELDA3_FEATURE_MIRROR_TO_DARK_WORLD ?= 0
# Collect items (like hearts) with sword instead of having to touch them
ZELDA3_FEATURE_COLLECT_ITEMS_WITH_SWORD ?= 0
# Level 2-4 sword can be used to break pots
ZELDA3_FEATURE_BREAK_POTS_WITH_SWORD ?= 0
# Disable the low health beep
ZELDA3_FEATURE_DISABLE_LOW_HEALTH_BEEP ?= 0
# Avoid waiting too much at the start
ZELDA3_FEATURE_SKIP_INTRO_ON_KEYPRESS ?= 1
# Display max rupees/bombs/arrows with orange/yellow color
ZELDA3_FEATURE_SHOW_MAX_ITEMS_IN_YELLOW ?= 0
# Allows up to four bombs active at a time instead of two.
ZELDA3_FEATURE_MORE_ACTIVE_BOMBS ?= 0
# Can carry 9999 rupees instead of 999
ZELDA3_FEATURE_CARRY_MORE_RUPEES ?= 0
# Enable various zelda bug fixes
ZELDA3_FEATURE_MISC_BUG_FIXES ?= 0
# Allow bird travel to be cancelled by hitting the X key
ZELDA3_FEATURE_CANCEL_BIRD_TRAVEL ?= 0
# Enable some more advanced zelda bugfixes that change game behavior
ZELDA3_FEATURE_GAME_CHANGING_BUG_FIXES ?= 0
# Enable this to limit the ItemSwitchLR item cycling to the first 4 items.
ZELDA3_FEATURE_SWITCH_LR_LIMIT ?= 0
ZELDA3_FEATURES := 0
ZELDA3_FEATURES := $(shell echo "$$(( $(ZELDA3_FEATURES) | $(ZELDA3_FEATURE_SWITCH_LR) << 1 ))")
ZELDA3_FEATURES := $(shell echo "$$(( $(ZELDA3_FEATURES) | $(ZELDA3_FEATURE_TURN_WHILE_DASHING) << 2 ))")
ZELDA3_FEATURES := $(shell echo "$$(( $(ZELDA3_FEATURES) | $(ZELDA3_FEATURE_MIRROR_TO_DARK_WORLD) << 3 ))")
ZELDA3_FEATURES := $(shell echo "$$(( $(ZELDA3_FEATURES) | $(ZELDA3_FEATURE_COLLECT_ITEMS_WITH_SWORD) << 4 ))")
ZELDA3_FEATURES := $(shell echo "$$(( $(ZELDA3_FEATURES) | $(ZELDA3_FEATURE_BREAK_POTS_WITH_SWORD) << 5 ))")
ZELDA3_FEATURES := $(shell echo "$$(( $(ZELDA3_FEATURES) | $(ZELDA3_FEATURE_DISABLE_LOW_HEALTH_BEEP) << 6 ))")
ZELDA3_FEATURES := $(shell echo "$$(( $(ZELDA3_FEATURES) | $(ZELDA3_FEATURE_SKIP_INTRO_ON_KEYPRESS) << 7 ))")
ZELDA3_FEATURES := $(shell echo "$$(( $(ZELDA3_FEATURES) | $(ZELDA3_FEATURE_SHOW_MAX_ITEMS_IN_YELLOW) << 8 ))")
ZELDA3_FEATURES := $(shell echo "$$(( $(ZELDA3_FEATURES) | $(ZELDA3_FEATURE_MORE_ACTIVE_BOMBS) << 9 ))")
ZELDA3_FEATURES := $(shell echo "$$(( $(ZELDA3_FEATURES) | $(ZELDA3_FEATURE_CARRY_MORE_RUPEES) << 11 ))")
ZELDA3_FEATURES := $(shell echo "$$(( $(ZELDA3_FEATURES) | $(ZELDA3_FEATURE_MISC_BUG_FIXES) << 12 ))")
ZELDA3_FEATURES := $(shell echo "$$(( $(ZELDA3_FEATURES) | $(ZELDA3_FEATURE_CANCEL_BIRD_TRAVEL) << 13 ))")
ZELDA3_FEATURES := $(shell echo "$$(( $(ZELDA3_FEATURES) | $(ZELDA3_FEATURE_GAME_CHANGING_BUG_FIXES) << 14 ))")
ZELDA3_FEATURES := $(shell echo "$$(( $(ZELDA3_FEATURES) | $(ZELDA3_FEATURE_SWITCH_LR_LIMIT) << 15 ))")
# Support multiple languages
ZELDA3_LOCALIZED_ROM=$(wildcard roms/zelda3/zelda3_*.sfc)
ifneq ("$(ZELDA3_LOCALIZED_ROM)","")
ZELDA3_DIALOGUES_LANGUAGE="$(patsubst roms/zelda3/zelda3_%.sfc,%,$(ZELDA3_LOCALIZED_ROM))"
else
ZELDA3_DIALOGUES_LANGUAGE=us
endif
# C defines for zelda3
C_DEFS_ZELDA3 = \
-DHEADLESS \
-DLIMIT_30FPS=$(ZELDA3_LIMIT_30FPS) \
-DDIALOGUES_LANGUAGE=$(ZELDA3_DIALOGUES_LANGUAGE) \
-DFEATURES=$(ZELDA3_FEATURES) \
-DFASTER_UI=$(ZELDA3_FASTER_UI) \
-DBATTERY_INDICATOR=$(ZELDA3_BATTERY_INDICATOR) \
# function used to generate prerequisite rules for zelda3 objects
define zelda3_obj_prereq_gen
$$(BUILD_DIR)/zelda3/$(patsubst %.c,%.o,$(notdir $1)): $1 Makefile.common Makefile $$(SDK_HEADERS) $$(BUILD_DIR)/config.h | $$(BUILD_DIR)
$$(V)$$(ECHO) [ CC zelda3 ] $$(notdir $$<)
$$(V)$$(CC) -c $$(CFLAGS) $$(C_DEFS_ZELDA3) $$(ZELDA3_C_INCLUDES)-Wa,-a,-ad,-alms=$$(BUILD_DIR)/zelda3/$$(notdir $$(<:.c=.lst)) $$< -o $$@ \
-Wno-parentheses -Wno-unknown-pragmas -Wno-incompatible-pointer-types -Wno-unused-const-variable -Wno-strict-aliasing -Wno-comment -Wno-unused-function -Wno-stack-usage -Wno-int-in-bool-context -Wno-unused-variable -Wno-unused-but-set-variable
$$(V)$$(CP) --redefine-syms=zelda3_redefines $$@
endef
# note: the blank line above is intentional
# generate all zelda3 object prerequisite rules
$(eval $(foreach obj,$(ZELDA3_C_SOURCES),$(call zelda3_obj_prereq_gen,$(obj))))
Core/Src/porting/zelda3/zelda_assets.c: scripts/zelda3/update_assets.py external/zelda3/tables/zelda3_assets.dat | $(BUILD_DIR)
$(PYTHON3) ./scripts/zelda3/update_assets.py
ifneq ("$(ZELDA3_LOCALIZED_ROM)","")
external/zelda3/tables/zelda3_assets.dat: roms/zelda3/zelda3.sfc $(ZELDA3_LOCALIZED_ROM) | $(BUILD_DIR)
$(ECHO) "Extracting dialogues from localized ROM: $<"
cd external/zelda3/tables; $(PYTHON3) restool.py --extract-dialogue -r ../../../$(ZELDA3_LOCALIZED_ROM)
$(ECHO) "Extracting game resources"
cd external/zelda3/tables; $(PYTHON3) restool.py --extract-from-rom --languages=$(ZELDA3_DIALOGUES_LANGUAGE) -r ../../../roms/zelda3/zelda3.sfc
else
external/zelda3/tables/zelda3_assets.dat: roms/zelda3/zelda3.sfc | $(BUILD_DIR)
$(ECHO) "Extracting game resources"
cd external/zelda3/tables; $(PYTHON3) restool.py --extract-from-rom -r ../../../$<
endif
# SMW configuration
# Limit to 30 fps for improved stability
SMW_LIMIT_30FPS ?= 1
# Controller bindings
# A physical button (or combination of buttons) is assigned for each SNES controller button
# Each nibble represents a physical button assignment
# Order of assignments (SNES buttons) from most-significant to least-significant nibble: Select,Start,A,B,X,Y,L,R
# Values for physical buttons mapping: GAME modifier (MSB) + 3-bits physical button index (0=A, 1=B, 2=Select, 3=Start, 4=Time)
# A value of 0xf means no assignment
# Binding "A" for zelda consoles: Use Reserve Item: TIME / Pause Game: GAME + TIME / Spin Jump: A / Regular Jump: B / Dash/Shoot: SELECT or START / Scroll Left: GAME + B / Scroll Right: GAME + A
SMW_BINDINGS_ZELDA_A = 0x4c012398
# Binding "B" for zelda consoles: Use Reserve Item: TIME / Pause Game: START / Spin Jump: SELECT / Regular Jump: A / Dash/Shoot: B / Scroll Left: GAME + B / Scroll Right: GAME + A
SMW_BINDINGS_ZELDA_B = 0x43201198
# Binding "A" for mario consoles: Use Reserve Item: GAME + A / Pause Game: GAME + TIME / Spin Jump: A / Regular Jump: B / Dash/Shoot: TIME / Scroll Left: Unassigned / Scroll Right: Unassigned
SMW_BINDINGS_MARIO_A = 0x8c0144ff
# Binding "B" for mario consoles: Use Reserve Item: TIME / Pause Game: GAME + TIME / Spin Jump: GAME + A / Regular Jump: A / Dash/Shoot: B / Scroll Left: Unassigned / Scroll Right: Unassigned
SMW_BINDINGS_MARIO_B = 0x4c8011ff
# Replace with the binding of your choice
ifeq ($(GNW_TARGET_ZELDA),1)
SMW_CONTROLLER_BINDINGS = $(SMW_BINDINGS_ZELDA_A)
else
SMW_CONTROLLER_BINDINGS = $(SMW_BINDINGS_MARIO_B)
endif
# Save to SRAM after each beaten level (instead of saving after castle is beaten).
# SRAM save remains valid/compatible with emulators.
SMW_FEATURE_SAVE_AFTER_EACH_BEATEN_LEVEL ?= 0
SMW_FEATURES := 0
SMW_FEATURES := $(shell echo "$$(( $(SMW_FEATURES) | $(SMW_FEATURE_SAVE_AFTER_EACH_BEATEN_LEVEL) << 0 ))")
# C defines for smw
C_DEFS_SMW = \
-DHEADLESS \
-DLIMIT_30FPS=$(SMW_LIMIT_30FPS) \
-DCONTROLLER_BINDINGS=$(SMW_CONTROLLER_BINDINGS) \
-DFEATURES=$(SMW_FEATURES) \
# function used to generate prerequisite rules for smw objects
define smw_obj_prereq_gen
$$(BUILD_DIR)/smw/$(patsubst %.c,%.o,$(notdir $1)): $1 Makefile.common Makefile $$(SDK_HEADERS) $$(BUILD_DIR)/config.h | $$(BUILD_DIR)
$$(V)$$(ECHO) [ CC smw ] $$(notdir $$<)
$$(V)$$(CC) -c $$(CFLAGS) $$(C_DEFS_SMW) $$(SMW_C_INCLUDES) -Wa,-a,-ad,-alms=$$(BUILD_DIR)/smw/$$(notdir $$(<:.c=.lst)) $$< -o $$@ \
-Wno-parentheses -Wno-unknown-pragmas -Wno-unused-variable -Wno-unused-but-set-variable -Wno-unused-const-variable -Wno-int-in-bool-context -Wno-unused-value -Wno-unused-function -Wno-incompatible-pointer-types -Wno-implicit-function-declaration -Wno-format -Wno-array-bounds -Wno-strict-aliasing -Wno-maybe-uninitialized
$$(V)$$(CP) --redefine-syms=smw_redefines $$@
endef
# note: the blank line above is intentional
# generate all smw object prerequisite rules
$(eval $(foreach obj,$(SMW_C_SOURCES),$(call smw_obj_prereq_gen,$(obj))))
Core/Src/porting/smw/smw_assets.c: scripts/smw/update_assets.py external/smw/smw_assets.dat | $(BUILD_DIR)
$(PYTHON3) ./scripts/smw/update_assets.py
external/smw/smw_assets.dat: roms/smw/smw.sfc | $(BUILD_DIR)
cp $< external/smw/assets/smw.sfc
$(MAKE) -C external/smw smw_assets.dat
$(BUILD_DIR):
$(V)mkdir $@
$(V)mkdir $@/tamp
$(V)mkdir $@/core
$(V)mkdir $@/nes
$(V)mkdir $@/nes_fceu
$(V)mkdir $@/gnuboy
$(V)mkdir $@/tgbdual
$(V)mkdir $@/smsplusgx
$(V)mkdir $@/pce
$(V)mkdir $@/msx
$(V)mkdir $@/gw
$(V)mkdir $@/wsv
$(V)mkdir $@/md
$(V)mkdir $@/a2600
$(V)mkdir $@/a7800
$(V)mkdir $@/amstrad
$(V)mkdir $@/zelda3
$(V)mkdir $@/smw
$(V)mkdir $@/videopac
$(V)mkdir $@/celeste
$(V)mkdir $@/tama
#######################################
# Flashing
#######################################
ADAPTER ?= stlink
reset:
@$(GNWMANAGER) start bank1
.PHONY: reset
erase_intflash_1:
@$(GNWMANAGER) erase bank1
.PHONY: erase_intflash_1
erase_intflash_2:
@$(GNWMANAGER) erase bank2
.PHONY: erase_intflash_2
erase_extflash:
@echo "Erasing External Flash..."
@$(GNWMANAGER) erase ext
@echo "Erasing Complete!"
.PHONY: erase_extflash
erase_all:
@echo "Erasing Internal & External Flash..."
@$(GNWMANAGER) erase all
@echo "Erasing Complete!"
.PHONY: erase_all
format:
@$(GNWMANAGER) format --offset=$(FILESYSTEM_OFFSET_FROM_END)
start_bank_1:
$(GNWMANAGER) start bank1
.PHONY: start_bank_1
start_bank_2:
$(GNWMANAGER) start bank2
.PHONY: start_bank_2
start: # Start code located at INTFLASH_ADDRESS
$(GNWMANAGER) start $(INTFLASH_ADDRESS)
.PHONY: start
flash_intflash: $(BUILD_DIR)/$(TARGET)_intflash.bin
$(GNWMANAGER) flash $(INTFLASH_ADDRESS) $< -- start $(INTFLASH_ADDRESS)
.PHONY: flash_intflash
flash_extflash: $(BUILD_DIR)/$(TARGET)_extflash.bin
@$(GNWMANAGER) flash ext $< --offset=$(EXTFLASH_OFFSET) -- start $(INTFLASH_ADDRESS)
.PHONY: flash_extflash
# Programs both the external and internal flash.
flash: CheckTools CheckDirtySubmodules $(BUILD_DIR)/$(TARGET)_intflash.bin $(BUILD_DIR)/$(TARGET)_extflash.bin
@$(GNWMANAGER) flash $(INTFLASH_ADDRESS) $(BUILD_DIR)/$(TARGET)_intflash.bin \
-- flash ext $(BUILD_DIR)/$(TARGET)_extflash.bin --offset=$(EXTFLASH_OFFSET) \
-- format $(FILESYSTEM_SIZE) --offset=$(FILESYSTEM_OFFSET_FROM_END) --only-if-shrinking \
-- start $(INTFLASH_ADDRESS) \
$(RESET_DBGMCU_CMD)
.PHONY: flash
monitor:
@$(GNWMANAGER) monitor
.PHONY: monitor
flash-monitor: flash
$(V)$(MAKE) monitor
.PHONY: flash-monitor
# Alias for flash
flash_all: flash
# Transfers save files from the device to the host machine
flash_saves_backup:
mkdir -p backup
rm -rf backup/savestate
@$(GNWMANAGER) pull savestate backup/savestate
@echo "Backup to \"backup/\" complete."
.PHONY: flash_saves_backup
# Transfers save files from the host machine to the device
flash_saves_restore:
@$(GNWMANAGER) mkdir savestate -- push savestate backup/savestate/*
@echo "Restore from \"backup/\" complete."
.PHONY: flash_saves_restore
size: $(BUILD_DIR)/$(TARGET).elf $(BUILD_DIR)/$(TARGET)_intflash.bin
$(V)printf "Internal Flash Usage (for developers): $(shell cat $(BUILD_DIR)/$(TARGET)_intflash.bin | wc -c) B\n"
$(V)./scripts/size.sh $<
.PHONY: size
gdb: $(BUILD_DIR)/$(TARGET).elf
$(GDB) $< -ex "target extended-remote :3333"
.PHONY: gdb
# Flashes intflash *only* and launches gdb afterwards
gdb_intflash: $(BUILD_DIR)/$(TARGET)_intflash.bin
$(GNWMANAGER) flash $(INTFLASH_ADDRESS) $< -- start $(INTFLASH_ADDRESS) --halt -- gdb
.PHONY: gdb_intflash
dump_screenshot:
@$(GNWMANAGER) screenshot dump
.PHONY: dump_screenshot
docker_build:
$(V)docker build -f Dockerfile --platform linux/amd64 --tag kbeckmann/retro-go-builder .
.PHONY: docker_build
docker:
$(V)docker run --rm -it --privileged --user $(shell id -u):$(shell id -g) --platform linux/amd64 -v $(PWD):/opt/workdir -v /dev/bus/usb:/dev/bus/usb kbeckmann/retro-go-builder
.PHONY: docker
help:
@echo "Game and Watch Retro Go"
@echo ""
@echo "Configuration variables:"
@echo " EXTFLASH_FORCE_SPI - Forces the use of legacy SPI mode for the external flash driver"
@echo " EXTFLASH_SIZE_MB - Sets the external flash size in megabytes"
@echo " EXTFLASH_SIZE - Sets the external flash size in bytes (has precedence over EXTFLASH_SIZE_MB)"
@echo " FILESYSTEM_SIZE - Sets the filesystem flash size in bytes. Defaults to 10% of flash."
@echo " FILESYSTEM_OFFSET - Places the filesystem at a specified offset in the external flash. "
@echo " Defaults to placing the filesystem at the end of flash."
@echo " This value is offset from EXTFLASH_OFFSET."
@echo " LARGE_FLASH - Sets the external flash size to 16MB (deprecated)"
@echo " EXTFLASH_OFFSET - Places the data at an offset in the external flash (useful for dual boot)"
@echo " INTFLASH_BANK - Sets the internal flash bank. Valid values {1,2} (default=1)."
@echo " INTFLASH_ADDRESS - Explicit internal flash address. If not provided, derived from INTFLASH_BANK."
@echo " BIG_BANK - Use internal flash bank as undocumented 256k.(default=1, set 0 to 128k)."
@echo " COMPRESS - Configures ROM compression, Valid values {0,lzma} (default=lzma)."
@echo " RESET_DBGMCU - Configures if DBGMCU should be reset after flashing."
@echo " Set to 0 to disable power saving (default=1)"
@echo " CODEPAGE - Sets codepage to configures default display language.(default=1252)"
@echo " set 932 as Japanese; 936 as simple Chinese; 950 as traditional Chinese;"
@echo " 949 as Korean; 12511 as Russian; 12521 as Spanish; 12522 as Portuguese;"
@echo " 12523 as French; 12524 as Italian; 12525 as German;"
@echo " UICODEPAGE - Sets ui display language.(default=CODEPAGE=1252 as English)"
@echo " ROMINFOCODE - Sets encoding of parse rom name, default = ascii"
@echo " ES_ES,PT_PT,FR_FR, "
@echo " IT_IT,ZH_CN,ZH_TW, "
@echo " KO_KR,JA_JP,DE_DE, "
@echo " RU_RU - Set to 1 to include or exclude some other language"
@echo " SINGLE_FONT - Set to 1 to only include a single default font."
@echo " Saves a few dozen KB of external flash."
@echo " COVERFLOW - Set to 1 include cover art with rom (default=0)"
@echo " JPG_QUALITY - Set convert cover art image jpg quality (default = 90)"
@echo " ENABLE_SCREENSHOT - Set to 1 to enable screenshot support (default enabled)"
@echo " GNW_TARGET - Game & Watch target, Valid values {mario,zelda} (default=mario)"makefile.
@echo " GAME_GENIE - Set to 1 to enable game genie support (deprecated, use CHEAT_CODES instead)"
@echo " CHEAT_CODES - Set to 1 to enable cheat codes support (default=0)"
@echo " MSX_USE_BANK_2 - Set to 1 to use Internal Bank 2 for MSX performance improvements."
@echo " Retro-Go must be in Bank 1."
@echo " SHARED_HIBERNATE_SAVESTATE - Set to 1 to enable a separate savestate for off/on (default=0)"
@echo " DISABLE_SPLASH_SCREEN - Set to 1 to disable the slash screen animation at startup (default=0)"
@echo " FORCE_NOFRENDO - Set to 1 to force use of previous nofrendo-go emulator instead of fceumm (default=0)"
@echo " FORCE_GNUBOY - Set to 1 to force use of previous gnuboy emulator instead of tgb-dual (default=0)"
@echo ""
@echo "Current configuration:"
@echo " EXTFLASH_FORCE_SPI=$(EXTFLASH_FORCE_SPI)"
@echo " EXTFLASH_SIZE_MB=$(EXTFLASH_SIZE_MB)"
@echo " EXTFLASH_SIZE=$(EXTFLASH_SIZE)"
@echo " FILESYSTEM_SIZE=$(FILESYSTEM_SIZE)"
@echo " LARGE_FLASH=$(LARGE_FLASH)"
@echo " EXTFLASH_OFFSET=$(EXTFLASH_OFFSET)"
@echo " INTFLASH_BANK=$(INTFLASH_BANK)"
@echo " BIG_BANK=$(BIG_BANK)"
@echo " COMPRESS=$(COMPRESS)"
@echo " RESET_DBGMCU=$(RESET_DBGMCU)"
@echo " ENABLE_SCREENSHOT=$(ENABLE_SCREENSHOT)"
@echo " GNW_TARGET=$(GNW_TARGET)"
@echo " CHEAT_CODES=$(CHEAT_CODES)"
@echo " MSX_USE_BANK_2=$(MSX_USE_BANK_2)"
@echo " GCC_PATH=$(GCC_PATH)"
@echo " PREFIX=$(PREFIX)"
@echo " CODEPAGE=$(CODEPAGE)"
@echo " UICODEPAGE=$(UICODEPAGE)"
@echo " COVERFLOW=$(COVERFLOW)"
@echo " ROMINFOCODE=$(ROMINFOCODE)"
@echo " SHARED_HIBERNATE_SAVESTATE=$(SHARED_HIBERNATE_SAVESTATE)"
@echo " ES_ES=$(ES_ES)"
@echo " PT_PT=$(PT_PT)"
@echo " FR_FR=$(FR_FR)"
@echo " IT_IT=$(IT_IT)"
@echo " RU_RU=$(RU_RU)"
@echo " DE_DE=$(DE_DE)"
@echo " ZH_CN=$(ZH_CN)"
@echo " ZH_TW=$(ZH_TW)"
@echo " KO_KR=$(KO_KR)"
@echo " JA_JP=$(JA_JP)"
@echo ""
@echo "Targets:"
@echo " docker - Runs a docker container using the image created by docker_build"
@echo " docker_build - Builds a docker image"
@echo " dump_screenshot - Downloads the stored screenshot."
@echo " flash - Programs the internal and external flash"
@echo " flash_all - Alias for 'flash' (deprecated)"
@echo " flash_extflash - Only programs the external flash"
@echo " flash_intflash - Only programs the internal flash"
@echo " gdb - Starts gdb and attaches to gdbserver"
@echo " gdb_intflash - Flashes intflash and then starts gdb and attaches to gdbserver"
@echo " reset_dbgmcu - Resets the unit and turns off DBGMCU (lowers battery drain)"
@echo " reset_mcu - Resets the unit"
@echo " romdef - Dumps all rom info to roms.json in roms directory to custom display name and"
@echo " publish property under edit that file before make flash "
@echo " size - Prints size information for all sections"
@echo ""
.PHONY: help
#######################################
# Define rom's display name and publish property
#######################################
romdef:
$(V)$(ECHO) [ PYTHON3 ] $(notdir $<)
$(V)$(PYTHON3) parse_romdef.py
$(V)$(ECHO) [ RM ] $(BUILD_DIR)/roms.a
$(V)rm -rf $(BUILD_DIR)/roms.a
$(V)$(ECHO) [ RM ] $(BUILD_DIR)/core/rom_manager.*
$(V)rm -rf $(BUILD_DIR)/core/rom_manager.*
.PHONY: romdef
#######################################
# download SDK files
#######################################
$(SDK_DIR)/%:
$(V)$(ECHO) [ WGET ] $(notdir $@)
$(V)wget -q $(SDK_URL)/$(SDK_VERSION)/$@ -P $(dir $@)
.PHONY: download_sdk
download_sdk: $(SDK_HEADERS) $(SDK_C_SOURCES) $(SDK_ASM_SOURCES)
#######################################
# clean up
#######################################
clean:
$(V)$(ECHO) [ RM ] $(BUILD_DIR)
$(V)-rm -fR $(BUILD_DIR)
$(V)-rm -fR Core/Src/porting/zelda3/zelda_assets.c
$(V)-rm -fR external/zelda3/tables/zelda3.sfc
$(V)$(MAKE) -C external/zelda3 clean
$(V)-rm -fR Core/Src/porting/smw/smw_assets.c
$(V)-rm -fR external/smw/assets/smw.sfc
$(V)$(MAKE) -C external/smw clean
distclean: clean
$(V)$(ECHO) [ RM ] $(SDK_DIR)
$(V)rm -rf $(SDK_DIR)
#######################################
# dependencies
#######################################
-include $(wildcard $(BUILD_DIR)/*.d)
# *** EOF ***