CC			= arm-none-eabi-gcc
LD			= arm-none-eabi-gcc
OBJCOPY		= arm-none-eabi-objcopy
LTO			= -flto
COMMON		= -ffixed-r9 -Wno-multichar -mthumb-interwork -mno-unaligned-access -masm-syntax-unified -funsafe-math-optimizations -Os -g -ggdb3
WARN		= -Wsign-compare -Wextra -Wall -Werror -Wno-unused-parameter -Wno-old-style-declaration -Wno-unused-function -Wno-unused-variable -Wno-error=cpp -Wpointer-arith
CCFLAGS		= $(LTO) $(WARN) $(COMMON) -I. -ffunction-sections -fdata-sections -ffixed-r9 -DUSE_TRAPS=0 
LDFLAGS		= $(LTO) $(WARN) $(COMMON) -Wl,--gc-sections -Wl,-T $(LKR) -mno-unaligned-access

BUILD		?= CortexEmu_loram

DAL_VER		= "1.5.0.5"

#options
SONY_SUPPORT	= no
OS50_SUPPORT	= no
GARNET_SUPPORT	= no
ZODIAC_SUPPORT	= no

ifeq ($(BUILD),CortexEmu_hiram)
	BUILD_TYPE	=	CortexEmu
	BUILD_VAR	=	hiram
else ifeq ($(BUILD),CortexEmu_loram)
	BUILD_TYPE	=	CortexEmu
	BUILD_VAR	=	loram
else ifeq ($(BUILD),CortexEmu)
	BUILD_TYPE	= $(error "please pick type of emu build: hi or lo ram")
else ifeq ($(BUILD),RP2040_Waveshare)
	BUILD_TYPE	=	RP2040
	BUILD_VAR	=	Waveshare
else ifeq ($(BUILD),RP2040_PalmCard)
	BUILD_TYPE	=	RP2040
	BUILD_VAR	=	PalmCard
else ifeq ($(BUILD),RP2040)
	BUILD_TYPE	= $(error "please pick type of RP2040 build: Waveshare or PalmCard")
else
	BUILD_TYPE	= $(BUILD)
endif



ifeq ($(BUILD_TYPE),virtual)
	CCFLAGS		+= -DMACH_TYPE_VIRTUAL
	KERNEL		= virtual
	CPU			?= m4f
else ifeq ($(BUILD_TYPE),CortexEmu)
	CCFLAGS		+= -DFLUSH_GROW_TICKS=2000 # slow cpu means needs more time to allow for tc growth
	KERNEL		= cortex
	CPU			?= m4f
else ifeq ($(BUILD_TYPE),RP2040)
	KERNEL		= cortex
	CPU			?= m0
else ifeq ($(BUILD_TYPE),stm32f429)
	KERNEL		= cortex
	CPU			?= m4f
else ifeq ($(BUILD_TYPE),stm32f469)
	KERNEL		= cortex
	CPU			?= m4f
else ifeq ($(BUILD_TYPE),reSpring)
	KERNEL		= cortex
	CPU			?= m4f
else ifeq ($(BUILD_TYPE),msio)
	KERNEL		= cortex
	CPU			?= m7f
else ifeq ($(BUILD_TYPE),t3)
	KERNEL		= legacy
	CPU			?= v5te
else ifeq ($(BUILD_TYPE),aximX3)
	KERNEL		= legacy
	CPU			?= v5te
else
	ERR			+= $(error BUILD type not set, saw $(BUILD_TYPE))
endif

ifeq ($(CPU),m7f)
	ARCH 		= -mthumb -march=armv7e-m -mfpu=fpv5-d16 -mfloat-abi=softfp -DHAVE_v7E_SUPPORT -DHAVE_FPU -DHAVE_DOUBLE_FPU
	CCFLAGS		+= -DOUT_MIX_FUNC_BYTES=256 -DIN_CONVERT_FUNC_BYTES=128 -DPLATFORM_MUST_DEAL_WITH_CACHE_COHERENCY
	JIT_BACKEND = kernel/emuJitBackendBase_m3.c kernel/emuJitBackendEdsp_m4.c
	SRCS		+= emit_v7m.c audioMixerBackend_v7.c
	CRTGENARCH	= v7m
else ifeq ($(CPU),m4f)
	ARCH 		= -mthumb -march=armv7e-m -mfpu=fpv4-sp-d16 -mfloat-abi=softfp -DHAVE_v7E_SUPPORT -DHAVE_FPU
	CCFLAGS		+= -DOUT_MIX_FUNC_BYTES=256 -DIN_CONVERT_FUNC_BYTES=128
	JIT_BACKEND = kernel/emuJitBackendBase_m3.c kernel/emuJitBackendEdsp_m4.c
	SRCS		+= emit_v7m.c audioMixerBackend_v7.c
	CRTGENARCH	= v7m
else ifeq ($(CPU),m4)
	ARCH 		= -mthumb -march=armv7e-m -mfloat-abi=soft -DHAVE_v7E_SUPPORT
	CCFLAGS		+= -DOUT_MIX_FUNC_BYTES=256 -DIN_CONVERT_FUNC_BYTES=128
	JIT_BACKEND = kernel/emuJitBackendBase_m3.c kernel/emuJitBackendEdsp_m4.c
	SRCS		+= emit_v7m.c audioMixerBackend_v7.c
	CRTGENARCH	= v7m
else ifeq ($(CPU),m3)
	ARCH 		= -mthumb -march=armv7-m -mfloat-abi=soft
	CCFLAGS		+= -DOUT_MIX_FUNC_BYTES=256 -DIN_CONVERT_FUNC_BYTES=128
	JIT_BACKEND = kernel/emuJitBackendBase_m3.c kernel/emuJitBackendEdsp_m3.c
	SRCS		+= emit_v7m.c audioMixerBackend_v7.c
	CRTGENARCH	= v7m
else ifeq ($(CPU),m23)
	ARCH 		= -mthumb -march=armv8-m.base -mfloat-abi=soft -DHAVE_v8M_BASE -DBUILD_FOR_THUMB_1
	JIT_BACKEND = kernel/emuJitBackend_m0.c
	CCFLAGS		+= -DMAX_LITERALS_BEFORE_SPILL=256	# literals are in heavy use on m0
	CCFLAGS		+= -DOUT_MIX_FUNC_BYTES=384 -DIN_CONVERT_FUNC_BYTES=192		# mix funcs are necessarily longer on m0
	SRCS		+= emit_v6m.c audioMixerBackend_v6.c
	CRTGENARCH	= v8m-base
else ifeq ($(CPU),m0)
	ARCH 		= -mthumb -march=armv6s-m -mfloat-abi=soft -DBUILD_FOR_THUMB_1
	JIT_BACKEND = kernel/emuJitBackend_m0.c
	CCFLAGS		+= -DMAX_LITERALS_BEFORE_SPILL=256	# literals are in heavy use on m0
	CCFLAGS		+= -DOUT_MIX_FUNC_BYTES=384 -DIN_CONVERT_FUNC_BYTES=192		# mix funcs are necessarily longer on m0
	SRCS		+= emit_v6m.c audioMixerBackend_v6.c
	CRTGENARCH	= v6m
else ifeq ($(CPU),v5te)
	ARCH 		= -mthumb -march=armv5te -mfloat-abi=soft -DBUILDING_FOR_BIG_ARM -DHAVE_ARM_v5 -DHAVE_ARM_v5_DSP_EXTS
	CCFLAGS		+= -DOUT_MIX_FUNC_BYTES=400 -DIN_CONVERT_FUNC_BYTES=200 -DPLATFORM_MUST_DEAL_WITH_CACHE_COHERENCY
	SRCS		+= emit_arm.c audioMixerBackend_arm.c
	CRTGENARCH	= v4
else
	ERR			+= $(error CPU type not valid. Available build types: m0 m23 m3 m4 m4f m7f)
endif

CCFLAGS		+= $(ARCH)
LDFLAGS		+= $(ARCH)

RSRC		= boot4A38
OTHER_RSRCS	= misc/tver03e8.bin misc/aslk4A38.bin misc/amdd4A38.bin misc/amdi4A38.bin	#amdd and amdi not optional for DAL
PRC			= DAL.prc
SRCS		+= crt.c main.c printf.c ral.c halTrace.c pace.S kal.c halSound.c disasm.c halDrawing.c
SRCS		+= halMemory.c halDisplay.c halFloatingPoint.c halPenAndKeys.c libpalmos.c librepalm.c heap.c
SRCS		+= halVibAndLed.c memoryHeap.c audioOutCommon.c audioInCommon.c halError.c dalPaceExports.c
SRCS_arm	+=
SLIBS		= 


ifeq ($(SONY_SUPPORT),yes)
	CCFLAGS	+= -DSONY_SUPPORT_ENABLED
	SRCS	+=  sony.c
endif

ifeq ($(OS50_SUPPORT),yes)
	CCFLAGS	+= -DSUPPORT_OS_50
endif

ifeq ($(GARNET_SUPPORT),yes)
	CCFLAGS	+= -DSUPPORT_OS_54
endif

ifeq ($(ZODIAC_SUPPORT),yes)
	CCFLAGS	+= -DSUPPORT_ZODIAC
	SRCS	+= zodiac/zodMisc.c zodiac/zodSound.c zodiac/zodGfx.c zodiac/zodSecurity.c
	SRCS	+= zodiac/zodInput.c zodiac/zodDeviceFwk.c zodiac/zodVibrator.c
endif

ifneq ($(BUILD_TYPE),virtual)			#if building for real hardware, add the kernel
	#add kernel
	CCFLAGS		+= -Ikernel -Ikernel/drivers
	SRCS		+= kernel/hostCtl.c kernel/bitfield.c kernel/slab.c
	
	ifeq ($(KERNEL),cortex)				#cortex kernel and emu/jit support
	
		ifeq ($(CPU),m0)
			SRCS	+= kernel/entryCortexV6.c
		else
			SRCS	+= kernel/entryCortexV7.c
		endif
	
		SRCS		+= kernel/kernelCortex.c kernel/timersCortex.c
		SRCS		+= kernel/eventPipe.c kernel/mpuCortex.c kernel/irqsCortex.c
		SRCS		+= kernel/timersCommon.c kernel/kernelCommon.c
	
		#jit?
		ENABLE_JIT		= yes
		
		#pick ONE emulation core
		#EMU_CORE	= asmM3
		#EMU_CORE	= asmM0
		#EMU_CORE	= C
		
		#decide if emulator should use pattern matchers (helps or hurts depending on workload)
		#CCFLAGS		+= -DARM_EMU_USE_PATTERN_MATCHER
	
		#decide if emulator should treat some undefined instrs in a way that some PalmOS apps require
		# EG:Bejeweled uses LDM with S bit set and pc in loaded regs as a normal ldm which is undef in user mode
		# in some cores (namely the C core) this has a small performance cost
		CCFLAGS		+= -DARM_EMU_DEFINE_THE_UNDEFINED
	
		#do not touch below
		ifeq ($(ENABLE_JIT),yes)
			CCFLAGS	+= -DEMU_CUSTOM_USAGE_FAULT_HANDLER -DEMU_CUSTOM_INV_INSTR_HANDLER -DJIT_ENABLED
			CCFLAGS += -DTHREAD_CLEANUP_PROC=emuJitThreadExit
			CCFLAGS += -DICACHE_CLEAR_PROC=emuJitInstrCacheClear
			CCFLAGS += -DSTORAGE_WRITEABLE_NOTIF=emuJitStorageTaintNotif
			SRCS	+=  kernel/emuJit.c $(JIT_BACKEND)
		else
			SRCS	+=  kernel/emuCoreAgnostic.c
		endif
		
		ifeq ($(EMU_CORE),asmM3)
			ifeq ($(CPU),m0)
				ERR	+= $(error m3 ARM core not avail for v6M)
			endif
			
			SRCS	+=  kernel/emuAsm.m3.S
			CCFLAGS	+= -DIMPLICIT_EMU_CTX
		else ifeq ($(EMU_CORE),asmM0)
			SRCS	+=  kernel/emuAsm.m0.S
			CCFLAGS	+= -DIMPLICIT_EMU_CTX
		else ifeq ($(EMU_CORE),C)
			SRCS	+=  kernel/emuC.c
			CCFLAGS	+= -DEXPLICIT_EMU_CTX
		else ifneq ($(ENABLE_JIT),yes)
			ERR		+=  $(error "no emu core defined")
		endif
	
	else								#big ARM kernel
		
		CCFLAGS		+= -Ikernel/drivers/platforms
		CCFLAGS		+= -DICACHE_CLEAR_PROC=platInstrCacheClearDataCacheClean
		SRCS		+= kernel/entryLegacy.c kernel/kernelLegacy.c kernel/mmuLegacy.c
		SRCS		+= kernel/eventPipe.c kernel/irqsLegacy.c
		SRCS		+= kernel/timersCommon.c kernel/kernelCommon.c
		
	endif
	
endif

#add drivers
ifeq ($(BUILD_TYPE),virtual)
	SRCS		+= kernel/drivers/virtual/disp.c kernel/drivers/virtual/audioOut.c kernel/drivers/virtual/audioIn.c
	SRCS		+= kernel/drivers/virtual/misc.c kernel/drivers/virtual/dockAndBattery.c
	SRCS		+= kernel/drivers/virtual/virtFakeKernel.c kernel/drivers/virtual/hyper.c
	SRCS		+= machServicesVirtual.c
	LKR			=  kernel/hw/virtual/dal.lkr
	CCFLAGS		+= -Ikernel/hw/virtual
	CCFLAGS		+= -Ikernel/drivers
	
	CCFLAGS		+= -DVIB_AND_LED_USE_SIMPLE_DRIVER
	CCFLAGS		+= -DVIB_AND_LED_SIMPLE_LED_SUPPORTED=0
	CCFLAGS		+= -DVIB_AND_LED_SIMPLE_VIB_SUPPORTED=0
	
else ifeq ($(BUILD_TYPE),CortexEmu)
	SRCS		+= kernel/drivers/CortexEmu/rtc.c kernel/drivers/CortexEmu/input.c kernel/drivers/CortexEmu/entry.c
	SRCS		+= kernel/drivers/CortexEmu/disp.c kernel/drivers/CortexEmu/hwTimer.c
	SRCS		+= kernel/drivers/CortexEmu/vibAndLed.c kernel/drivers/CortexEmu/dockAndBattery.c
	SRCS		+= kernel/drivers/CortexEmu/audioOut.c kernel/drivers/CortexEmu/audioIn.c
	CCFLAGS		+= -Ikernel/hw/CortexEmu
	
	ifeq ($(BUILD_VAR), hiram)
		CCFLAGS	+= -DLIVE_IN_HIGH_RAM
		LKR		= kernel/hw/CortexEmu/dal_hiram.lkr
	else
		LKR		= kernel/hw/CortexEmu/dal_loram.lkr
	endif
	
	CCFLAGS		+= -DM0_FAULT_DISP_IRQ_USED=31
	
	#large dyn ram?
	#CCFLAGS	+= -DHUGE_DYN_RAM
	
	#simple LED and vibrate driver. have led, no vibrator
	CCFLAGS		+= -DVIB_AND_LED_USE_SIMPLE_DRIVER
	CCFLAGS		+= -DVIB_AND_LED_SIMPLE_LED_SUPPORTED=1
	CCFLAGS		+= -DVIB_AND_LED_SIMPLE_VIB_SUPPORTED=0
	
else ifeq ($(BUILD_TYPE),RP2040)
	SRCS		+= kernel/drivers/RP2040/rt.S kernel/drivers/RP2040/time.c

	SRCS		+= kernel/drivers/RP2040/audioIn.c
	CCFLAGS		+= -Ikernel/hw/RP2040
	
	ifeq ($(BUILD_VAR), Waveshare)
		
		#some board-specific sources
		SRCS		+= kernel/drivers/RP2040/entryWaveshare.c kernel/drivers/RP2040/dispWaveshareLcd.c kernel/drivers/RP2040/dockAndBatteryWaveshare.c
		SRCS		+= kernel/drivers/RP2040/audioOutNull.c kernel/drivers/RP2040/vibAndLedNull.c
		
		#people might use an old chip
		CCFLAGS		+=  -DSUPPORT_OLD_BOOTROMS
		
		#hw cfg
		CCFLAGS		+=  -DWAVESHARE_PINOUT -DWAVESHARE_MEMMAP
		CCFLAGS		+=	-DCPU_CLOCK_RATE=128000000
		CCFLAGS		+=	-DCPU_HARDWIRED_VRAM_SIZE=0x4b00
	
		#pre-calibrate
		CCFLAGS		+= -DTOUCH_SLOPE_X=0.068 -DTOUCH_YINT_X=-20
		CCFLAGS		+= -DTOUCH_SLOPE_Y=0.092 -DTOUCH_YINT_Y=-23
	
		#simple LED and vibrate driver. have led, no vibrator
		CCFLAGS		+= -DVIB_AND_LED_USE_SIMPLE_DRIVER
		CCFLAGS		+= -DVIB_AND_LED_SIMPLE_LED_SUPPORTED=1
		CCFLAGS		+= -DVIB_AND_LED_SIMPLE_VIB_SUPPORTED=0
		
		#audio
		CCFLAGS		+= -DABSOLUTELY_NO_AUDIO_SUPORT
		
	else ifeq ($(BUILD_VAR),PalmCard)
		
		#firmware
		EXTRA_DELETABLES += kernel/drivers/RP2040/remoteBootstrap.inc  kernel/drivers/RP2040/remoteMain.inc

		#some board-specific sources
		SRCS		+= kernel/drivers/RP2040/entryPalmcard.c kernel/drivers/RP2040/ioPalmcard.c kernel/drivers/RP2040/palmcardComms.c
		SRCS		+= kernel/drivers/RP2040/palmcardSDIO.c kernel/drivers/RP2040/palmcardIR.c kernel/drivers/RP2040/i2cIO.c
		SRCS		+= kernel/drivers/RP2040/vibAndLedPalmcard.c
		
		
		##pick an audio driver: sampled
		#SRCS		+= kernel/drivers/RP2040/audioOutPalmcardSampled.c
		#CCFLAGS	+= -DPALMCARD_SUPPORT_SAMPLED_AUDIO
		
		#pick an audio driver: simple
		SRCS		+= kernel/drivers/RP2040/audioOutPalmcardSimple.c
		
		#hw cfg
		CCFLAGS		+=  -DPALMCARD_PINOUT
		CCFLAGS		+=  -DROMRAM_MEMMAP
		CCFLAGS		+=	-DCPU_CLOCK_RATE=220000000
		CCFLAGS		+=	-DCPU_HARDWIRED_VRAM_SIZE=0x3200
		CCFLAGS		+=	-DCUSTOM_RP2040_FAULT_DISPATCHER
		CCFLAGS		+=	-DJIT_NO_EXC_MODE_WRITES
		
		#no led, no vib
		CCFLAGS		+= -DVIB_AND_LED_USE_SIMPLE_DRIVER
		CCFLAGS		+= -DVIB_AND_LED_SIMPLE_LED_SUPPORTED=1
		CCFLAGS		+= -DVIB_AND_LED_SIMPLE_VIB_SUPPORTED=0
	
		#pre-calibrate
		CCFLAGS		+= -DTOUCH_SLOPE_X=-0.044 -DTOUCH_YINT_X=160
		CCFLAGS		+= -DTOUCH_SLOPE_Y=-0.059 -DTOUCH_YINT_Y=219
		
		USE_XRAM_FOR_DYN = yes
		ifeq ($(USE_XRAM_FOR_DYN),yes)
			
			#force stacks into internal memory
			CCFLAGS		+= -DKAL_USE_STATIC_MEM_FOR_STACKS
			CCFLAGS		+= -DUSE_XRAM_FOR_DYNHEAP
		endif
	
		
		
	else
		
		CCFLAGS	+= $(error "bad RP2040 build var")
		
	endif
	
	LKR			= kernel/hw/RP2040/dal.lkr
	
	CCFLAGS		+= -DNO_CRT_MEMCPY -fno-builtin -fno-builtin-function -DCPU_CUSTOM_ATOMICS -DM0_FAULT_DISP_IRQ_USED=31
	
else ifeq ($(BUILD_TYPE),stm32f429)
	CCFLAGS		+= -Ikernel/hw/stm32f429
	SRCS		+= kernel/drivers/stm32f429/entry.c kernel/drivers/stm32f429/hwTimer.c
	SRCS		+= kernel/drivers/stm32f429/disp.c kernel/drivers/stm32f429/rtc.c kernel/drivers/stm32f429/input.c
	SRCS		+= kernel/drivers/stm32f429/vibAndLed.c kernel/drivers/stm32f429/dockAndBattery.c kernel/drivers/stm32f429/audio.c
	SRCS		+= DmaLib.S
	LKR			= kernel/hw/stm32f429/dal.lkr
	
	#simple LED and vibrate driver. have led, no vibrator
	CCFLAGS		+= -DVIB_AND_LED_USE_SIMPLE_DRIVER
	CCFLAGS		+= -DVIB_AND_LED_SIMPLE_LED_SUPPORTED=1
	CCFLAGS		+= -DVIB_AND_LED_SIMPLE_VIB_SUPPORTED=0
	
	#force stacks into internal memory
	CCFLAGS		+= -DKAL_USE_STATIC_MEM_FOR_STACKS
	
else ifeq ($(BUILD_TYPE),stm32f469)
	CCFLAGS		+= -Ikernel/hw/stm32f469
	SRCS		+= kernel/drivers/stm32f469/entry.c kernel/drivers/stm32f469/hwTimer.c
	SRCS		+= kernel/drivers/stm32f469/disp.c kernel/drivers/stm32f469/rtc.c kernel/drivers/stm32f469/input.c
	SRCS		+= kernel/drivers/stm32f469/vibAndLed.c kernel/drivers/stm32f469/dockAndBattery.c kernel/drivers/stm32f469/audio.c
	LKR			= kernel/hw/stm32f469/dal.lkr
	
	#simple LED and vibrate driver. have led, no vibrator
	CCFLAGS		+= -DVIB_AND_LED_USE_SIMPLE_DRIVER
	CCFLAGS		+= -DVIB_AND_LED_SIMPLE_LED_SUPPORTED=1
	CCFLAGS		+= -DVIB_AND_LED_SIMPLE_VIB_SUPPORTED=0
	
	#force stacks into internal memory
	CCFLAGS		+= -DKAL_USE_STATIC_MEM_FOR_STACKS
	
else ifeq ($(BUILD_TYPE),reSpring)
	CCFLAGS		+= -Ikernel/hw/reSpring
	SRCS		+= kernel/drivers/reSpring/entry.c kernel/drivers/reSpring/hwTimer.c kernel/drivers/reSpring/remoteioComms.c
	SRCS		+= kernel/drivers/reSpring/disp.c kernel/drivers/reSpring/rtc.c kernel/drivers/reSpring/input.c
	SRCS		+= kernel/drivers/reSpring/vibAndLed.c kernel/drivers/reSpring/dockAndBattery.c
	SRCS		+= kernel/drivers/reSpring/audioOut.c kernel/drivers/reSpring/audioIn.c
	SRCS		+= DmaLib.S
	LKR			= kernel/hw/reSpring/dal.lkr
	
	#custom MMU fault handler
	CCFLAGS		+= -DCUSTOM_MMU_FAULT_HANDLER=dispMmuFaultHandler

	#overclock? (196 MHz vs 180)
	CCFLAGS		+= -DOVERCLOCK
	
	#pretend to be hi-res?
	#CCFLAGS		+= -DFAKE_HI_RES
	
	#force stacks into internal memory
	CCFLAGS		+= -DKAL_USE_STATIC_MEM_FOR_STACKS
	
	#use complex vibrate and LED driver (we offload that to the visor)

else ifeq ($(BUILD_TYPE),msio)
	CCFLAGS		+= -Ikernel/hw/msio
	SRCS		+= kernel/drivers/msio/entry.c kernel/drivers/msio/hwTimer.c kernel/drivers/msio/msioComms.c
	SRCS		+= kernel/drivers/msio/disp.c kernel/drivers/msio/rtc.c kernel/drivers/msio/input.c
	SRCS		+= kernel/drivers/msio/vibAndLed.c kernel/drivers/msio/dockAndBattery.c
	SRCS		+= kernel/drivers/msio/audioOut.c kernel/drivers/msio/audioIn.c kernel/drivers/msio/screenCompress.c
	
	#msio stuff
	SRCS		+= kernel/drivers/msio/msio.c kernel/drivers/msio/msioMemoryBacking.c kernel/drivers/msio/msioSimpleMemory.c
	
#	SRCS		+= DmaLib.S
	LKR			= kernel/hw/msio/dal.lkr
	
	#custom MMU fault handler
	CCFLAGS		+= -DCUSTOM_MMU_FAULT_HANDLER=dispMmuFaultHandler
	
	#we use complex vibrate and LED driver (we offload that to the host device)
	
	#force stacks into internal memory
	CCFLAGS		+= -DKAL_USE_STATIC_MEM_FOR_STACKS



else ifeq ($(BUILD_TYPE),t3)
	
	CCFLAGS		+= -Ikernel/hw/t3 -mtune=xscale
	SRCS		+= kernel/drivers/t3/entry.c kernel/drivers/t3/audioIn.c kernel/drivers/t3/audioOut.c
	SRCS		+= kernel/drivers/t3/dockAndBattery.c kernel/drivers/t3/vibAndLed.c kernel/drivers/t3/disp.c
	SRCS		+= kernel/drivers/t3/input.c kernel/drivers/t3/rtc.c
	LKR			= kernel/hw/t3/dal.lkr
	
	#platform
	CCFLAGS		+= -Ikernel/drivers/platforms/xscale
	SRCS		+= kernel/drivers/platforms/xscale/xscaleBase.c kernel/drivers/platforms/xscale/xscaleScreen.c

else ifeq ($(BUILD_TYPE),aximX3)
	
	CCFLAGS		+= -Ikernel/hw/aximX3 -mtune=xscale
	SRCS		+= kernel/drivers/aximX3/entry.c kernel/drivers/aximX3/audioIn.c kernel/drivers/aximX3/audioOut.c
	SRCS		+= kernel/drivers/aximX3/dockAndBattery.c kernel/drivers/aximX3/vibAndLed.c kernel/drivers/aximX3/disp.c
	SRCS		+= kernel/drivers/aximX3/input.c kernel/drivers/aximX3/rtc.c kernel/drivers/aximX3/aximCpld.c kernel/drivers/aximX3/aximSleep.c
	SRCS		+= DmaLib.S
	LKR			= kernel/hw/aximX3/dal.lkr
	
	LTO			= #nothing
	
	#Axim X3 comes in two versions so memory map is not constant
	CCFLAGS		+= -DCUSTOM_MEMORY_MAP
	
	#platform
	CCFLAGS		+= -Ikernel/drivers/platforms/xscale
	SRCS		+= kernel/drivers/platforms/xscale/xscaleBase.c
	SRCS		+= kernel/drivers/platforms/xscale/xscaleScreen.c
	SRCS		+= kernel/drivers/platforms/xscale/xscaleAC97.c
	SRCS		+= kernel/drivers/platforms/ac97codec.c
	SRCS		+= kernel/drivers/platforms/wm9705.c

endif

#add SDK
CCFLAGS		+=  -I../../SDK
CCFLAGS		+=  -I../../SDK/Core
CCFLAGS		+=  -I../../SDK/Core/System
CCFLAGS		+=  -I../../SDK/Core/Hardware
CCFLAGS		+=  -I../../SDK/Core/UI
CCFLAGS		+=  -I../../SDK/Dynamic
CCFLAGS		+=  -I../../SDK/libraries
CCFLAGS		+=  -I../../SDK/PalmSDK/Incs
CCFLAGS		+=  -I../../SDK/PalmSDK/Incs/Common/System/


#do not touch below
OBJS		= $(patsubst %.S,%.o,$(patsubst %.c,%.o,$(SRCS)))
OBJS_arm	= $(patsubst %.S,%.a.o,$(patsubst %.c,%.a.o,$(SRCS_arm)))
INCS		= $(wildcard *.h) $(wildcard kernel/*.h)


$(PRC): $(RSRC).bin $(OTHER_RSRCS) $(ERR)
	../../tools/mkrom/mkprc DAL rsrc pdal $^ > $@

$(RSRC).bin: $(RSRC).elf  Makefile
	$(OBJCOPY) -I elf32-littlearm -O binary $(RSRC).elf $(RSRC).bin -j.vec -j.text -j.rodata -j.data -j.ramcode

$(RSRC).elf: $(OBJS) $(OBJS_arm) $(LKR) Makefile $(SLIBS)
	$(LD) -o $(RSRC).elf $(LDFLAGS) $(OBJS) $(OBJS_arm) $(SLIBS)

%.o : %.c $(INCS) Makefile $(EXTRA_DEPS)
	$(CC) $(CCFLAGS) -c $< -o $@
	
%.o : %.S $(INCS) Makefile $(EXTRA_DEPS)
	$(CC) $(CCFLAGS) -c $< -o $@

pace.S: Makefile ../../tools/libtools/PACE.libdescr
	echo "#define _ASSEMBLY\n#define MY_LIB_ID 0\n#define LIB_SLOT_IN_GLOBALS 0x10" > pace.S
	../../tools/libtools/inclgen.sh $(CRTGENARCH) ../../tools/libtools/PACE.libdescr >> pace.S

DmaLib.S: Makefile ../dma_driver/DmaDriver.libdescr
	echo "#define _ASSEMBLY\n#define MY_LIB_ID 0\n#define LIB_SLOT_IN_GLOBALS 0x18" > DmaLib.S
	../../tools/libtools/inclgen.sh $(CRTGENARCH) ../dma_driver/DmaDriver.libdescr >> DmaLib.S


#extra deps for various targets

ifeq ($(BUILD_TYPE),RP2040)
ifeq ($(BUILD_VAR),PalmCard)

kernel/drivers/RP2040/palmcardComms.o: kernel/drivers/RP2040/remoteBootstrap.inc kernel/drivers/RP2040/remoteMain.inc

kernel/drivers/RP2040/remote%.inc: firmware/palmcard%
	make -C $< out.m68k.bin
	xxd -c2 $</out.m68k.bin | sed 's/[^:]*: \(....\).*/0x\1,/g' > $@

endif
endif


ifeq ($(BUILD_TYPE),reSpring)

EXTRA_DELETABLES += kernel/drivers/reSpring/firmware.inc kernel/drivers/reSpring/romimg.inc firmware/reSpringRom/crctool
EXTRA_DELETABLES += kernel/drivers/reSpring/romimg.tmp.elf kernel/drivers/reSpring/romimg.tmp.bin kernel/drivers/reSpring/romimg.tmp.crc

kernel/drivers/reSpring/remoteioComms.o: kernel/drivers/reSpring/firmware.inc kernel/drivers/reSpring/romimg.inc

kernel/drivers/reSpring/firmware.inc: firmware/reSpringDownloadableCode/Src/main.c firmware/reSpringDownloadableCode/Src/asm.S firmware/reSpringDownloadableCode/linker.lkr firmware/reSpringDownloadableCode/Makefile
	make -C firmware/reSpringDownloadableCode loadable.bin
	od -tx2 --endian=big -An -v < firmware/reSpringDownloadableCode/loadable.bin | sed 's/\([0-9a-f]\{4\}\)/0x\1,/g' > kernel/drivers/reSpring/firmware.inc

kernel/drivers/reSpring/romimg.inc: firmware/reSpringRom/rom.s firmware/reSpringRom/crctool
	m68k-none-elf-as -o kernel/drivers/reSpring/romimg.tmp.elf -c firmware/reSpringRom/rom.s -march=68000 -m68000 --pcrel
	m68k-none-elf-objcopy -O binary kernel/drivers/reSpring/romimg.tmp.elf kernel/drivers/reSpring/romimg.tmp.bin -j.text
	firmware/reSpringRom/crctool < kernel/drivers/reSpring/romimg.tmp.bin > kernel/drivers/reSpring/romimg.tmp.crc
	dd if=kernel/drivers/reSpring/romimg.tmp.crc of=kernel/drivers/reSpring/romimg.tmp.bin bs=16 seek=7 conv=notrunc
	od -tx2 --endian=big -An -v < kernel/drivers/reSpring/romimg.tmp.bin | sed 's/\([0-9a-f]\{4\}\)/0x\1,/g' > kernel/drivers/reSpring/romimg.inc
	rm -f kernel/drivers/reSpring/romimg.tmp.elf kernel/drivers/reSpring/romimg.tmp.bin kernel/drivers/reSpring/romimg.tmp.crc

firmware/reSpringRom/crctool: firmware/reSpringRom/crc.c
	gcc -o $@ $<


endif


ifeq ($(BUILD_TYPE),msio)

EXTRA_DELETABLES += kernel/drivers/msio/app.inc

kernel/drivers/msio/msioMemoryBacking.o: kernel/drivers/msio/app.inc

kernel/drivers/msio/app.inc: firmware/msioDriver/Start.prc
	make -C firmware/msioDriver
	echo -n "#define DRIVER_APP_SIZE   " > $@
	wc -c < $< >> $@
	echo -n "static const unsigned char mDriverApp[] = { " >>  $@
	xxd -i < $< >> $@
	echo -n "};" >> $@

endif


misc/tver03e8.bin:
	printf "%s\0" $(DAL_VER) > $@

clean:
	rm -f $(OBJS) $(OBJS_arm) $(RSRC).bin $(RSRC).elf $(PRC) pace.S Stm32DmaLib.S $(EXTRA_DELETABLES)

.PHONY: clean misc/tver03e8.bin
