# FOL 2026-10-12: PSP platform target for UAE4ALL2-HD.
# FOL 2026-11-09: Prefer PSPSDK's standard environment aliases; psp-config is only an optional PATH convenience.
PSP_CONFIG := $(shell command -v psp-config 2>/dev/null)
PSPDEV ?= $(if $(PSP_CONFIG),$(shell $(PSP_CONFIG) --pspdev-path))
PSPSDK ?= $(if $(PSP_CONFIG),$(shell $(PSP_CONFIG) --pspsdk-path),$(if $(PSPDEV),$(PSPDEV)/psp/sdk))
ifeq ($(strip $(PSPSDK)),)
$(error PSPSDK is not set. Source your PSPSDK environment, or export PSPDEV and PSPSDK before running make)
endif

TARGET := pspuae-v2
BUILD_PRX := 1
PSP_FW_VERSION := 660
# FOL 2026-10-12: Request the expanded PSP-2000/3000/Go user partition explicitly; never use MEMSIZE=2.
PSP_LARGE_MEMORY := 1
# FOL 2026-11-06: Beta 12 retains the 3 MiB user heap valid for PSP-1000.
PSP_NEWLIB_HEAP_KB ?= 3072

# Current production features — these are the only release feature switches enabled here.
# FOL 2026-10-31: MIST/KCall is production infrastructure.
PSP_ME_SUPPORT ?= 1
# FOL 2026-10-18: Full-ME Paula is the active PSP audio backend; set 0 only for SC fallback.
PSP_ME_PAULA ?= 1
# FOL 2026-10-24: The validated VME-authoritative Paula mixer is active on supported hardware.
PSP_VME_PAULA_POC ?= 1

# FOL 2026-10-18: Native GU display is the normal renderer; SDL video remains a build fallback.
PSP_NATIVE_VIDEO ?= 1
PSP_VIDEO_ASPECT ?= 1
PSP_VIDEO_AUTOZOOM ?= 1
PSP_VIDEO_FILTER ?= 1
PSP_VIDEO_EFFECT ?= 0
PSP_VIDEO_HIRES ?= 0
# FOL 2026-11-07: This is the active CD32 full-beam crop that removes the boot/free-animation right-edge overrun.
PSP_VIDEO_BEAM_TEST ?= 1

PSP_FRAMESKIP ?= 2
# FOL 2026-11-01: The native GUI is a normal PSP feature, not a diagnostic.
PSP_GUI_TEST ?= 1
# FOL 2026-10-20: These legacy-named switches enable the production Akiko and ISO/CUE/CHD CD32 backend.
PSP_CD32_AKIKO_TEST ?= 1
PSP_CD32_CDROM_TEST ?= 1

ifeq ($(PSP_ME_PAULA)$(PSP_ME_SUPPORT),10)
$(error PSP_ME_PAULA requires PSP_ME_SUPPORT)
endif

# FOL 2026-10-12: Ordinary source files use the established Allegrex baseline flags.
COMMON_FLAGS := -G0 -march=allegrex -mabi=eabi -fomit-frame-pointer -fno-strict-aliasing
COMMON_FLAGS += -ffunction-sections -fdata-sections -Wall -Wno-write-strings -Wno-unused-variable
COMMON_FLAGS += -DPSP_USERMODE -DGP2X -DPANDORA -DNO_MAIN_IN_MAIN_C
# FOL 2026-10-18: Select the Allegrex-safe FAME operand-memory bridge on PSP.
COMMON_FLAGS += -DUSE_SDL -DUSE_FAME_CORE -DUSE_MIPSMEM -DUSE_AUTOCONFIG -DUSE_ZFILE
COMMON_FLAGS += -DUNALIGNED_PROFITABLE -DOPTIMIZED_FLAGS -DOS_WITHOUT_MEMORY_MANAGEMENT
# FOL 2026-10-29: Legacy relative prefixes follow the EBOOT working directory.
COMMON_FLAGS += -DSHM_SUPPORT_LINKS=0 -DROM_PATH_PREFIX=\"./DISKS/\"
COMMON_FLAGS += -DDATA_PREFIX=\"./\" -DSAVE_PREFIX=\"./\"
COMMON_FLAGS += -include src/psp/psp_platform_compat.h
COMMON_FLAGS += -DPSP_FRAMESKIP=$(PSP_FRAMESKIP)
COMMON_FLAGS += -DPSP_NEWLIB_HEAP_KB=$(PSP_NEWLIB_HEAP_KB)

CXXFLAGS := -fno-exceptions -fno-rtti

INCDIR := src src/include src/gp2x src/gp2x/menu src/psp $(PSPDEV)/psp/include/SDL
INCDIR += src/libchdr/include src/libchdr/src
INCDIR += src/libchdr/deps/lzma-26.02/include src/libchdr/deps/zstd-1.5.7
LIBDIR := $(PSPDEV)/psp/lib

# FOL 2026-10-14: Use mcidclan's installed PRX-backed MIST library; it embeds KCall.prx and its import stubs.
PSP_ME_OBJS :=
PSP_ME_PAULA_OBJS :=
PSP_ME_LIBS :=
ifeq ($(PSP_ME_SUPPORT),1)
COMMON_FLAGS += -DPSP_ME_SUPPORT=1
PSP_ME_LIBS += -Wl,--start-group -lme-core-mapper -lme-mist -Wl,--end-group -lpspkubridge
endif
ifeq ($(PSP_ME_PAULA),1)
COMMON_FLAGS += -DPSP_ME_PAULA=1
PSP_ME_PAULA_OBJS += src/psp/psp_me_paula.o
endif
ifeq ($(PSP_VME_PAULA_POC),1)
ifeq ($(PSP_ME_PAULA),0)
$(error PSP_VME_PAULA_POC requires the existing ME Paula worker)
endif
COMMON_FLAGS += -DPSP_VME_PAULA_POC=1
# FOL 2026-10-24: Link mcidclan's MIT VME library for the ME-local Paula volume/routing pipeline.
PSP_ME_LIBS += -lvme-lib
endif
ifeq ($(PSP_NATIVE_VIDEO),1)
COMMON_FLAGS += -DPSP_NATIVE_VIDEO=1
COMMON_FLAGS += -DPSP_VIDEO_ASPECT=$(PSP_VIDEO_ASPECT)
COMMON_FLAGS += -DPSP_VIDEO_AUTOZOOM=$(PSP_VIDEO_AUTOZOOM)
COMMON_FLAGS += -DPSP_VIDEO_FILTER=$(PSP_VIDEO_FILTER)
COMMON_FLAGS += -DPSP_VIDEO_EFFECT=$(PSP_VIDEO_EFFECT)
COMMON_FLAGS += -DPSP_VIDEO_HIRES=$(PSP_VIDEO_HIRES)
ifeq ($(PSP_VIDEO_BEAM_TEST),1)
COMMON_FLAGS += -DPSP_VIDEO_BEAM_TEST=1
endif
endif
ifeq ($(PSP_GUI_TEST),1)
COMMON_FLAGS += -DPSP_GUI_TEST=1
endif
ifeq ($(PSP_CD32_AKIKO_TEST),1)
COMMON_FLAGS += -DPSP_CD32_AKIKO_TEST=1
endif
ifeq ($(PSP_CD32_CDROM_TEST),1)
COMMON_FLAGS += -DPSP_CD32_CDROM_TEST=1
endif
# FOL 2026-10-18: Keep the FAME memory bridge in the PSP platform object set.
PSP_OBJS = \
 src/psp/psp_platform.o src/psp/psp_clock.o src/psp/psp_config.o src/psp/psp_video.o \
 src/psp/psp_audio.o src/psp/psp_input.o src/psp/psp_filesystem.o src/psp/psp_music.o src/psp/psp_gui_theme.o src/psp/psp_gui_navigation.o src/psp/psp_vkbd.o src/psp/psp_gui_menu.o src/psp/psp_startup.o \
 src/psp/psp_optional.o src/psp/psp_fame_memory.o src/psp/psp_mapped_memory.o $(PSP_ME_OBJS)

CORE_OBJS := \
 src/audio.o src/autoconf.o src/blitfunc.o src/blittable.o src/blitter.o \
 src/cfgfile.o src/cia.o src/savedisk.o src/savestate.o src/custom.o \
 src/disk.o src/dms.o src/drawing.o src/ersatz.o src/expansion.o \
 src/filesys.o src/fsdb.o src/fsdb_unix.o \
 src/gfxutil.o src/hardfile.o src/rdb.o src/keybuf.o src/main.o src/memory.o \
 src/missing.o src/native2amiga.o src/scsi-none.o src/sdlgfx.o \
 src/sound_sdl_new.o src/writelog.o src/zfile.o \
 src/m68k/fame/famec.o src/m68k/fame/m68k_intrf.o src/m68k/m68k_cmn_intrf.o

ifeq ($(PSP_CD32_AKIKO_TEST),1)
CORE_OBJS += src/akiko.o
endif

# FOL 2026-10-20: Keep the Vita source's full ISO/CUE/CHD backend self-contained in the PSP target.
PSP_CHDR_OBJS :=
ifeq ($(PSP_CD32_CDROM_TEST),1)
CORE_OBJS += src/cdrom.o
PSP_CHDR_OBJS += \
 src/libchdr/src/libchdr_bitstream.o src/libchdr/src/libchdr_cdrom.o \
 src/libchdr/src/libchdr_chd.o src/libchdr/src/libchdr_codec_avhuff.o \
 src/libchdr/src/libchdr_codec_cdfl.o src/libchdr/src/libchdr_codec_cdlz.o \
 src/libchdr/src/libchdr_codec_cdzl.o src/libchdr/src/libchdr_codec_cdzs.o \
 src/libchdr/src/libchdr_codec_flac.o src/libchdr/src/libchdr_codec_huff.o \
 src/libchdr/src/libchdr_codec_lzma.o src/libchdr/src/libchdr_codec_zlib.o \
 src/libchdr/src/libchdr_codec_zstd.o src/libchdr/src/libchdr_flac.o \
 src/libchdr/src/libchdr_huffman.o \
 src/libchdr/deps/lzma-26.02/src/LzmaDec.o \
 src/libchdr/deps/zstd-1.5.7/zstddeclib.o
endif

###############################################################################
# Opt-in diagnostics and experimental paths — disabled in the normal build
###############################################################################

# FOL 2026-10-31: Every investigation feature is independently opt-in and off in normal builds.
PSP_MEMORY_AUDIT ?= 0
PSP_AUDIO_AUDIT ?= 0
PSP_AUDIO_MODE ?= 2
PSP_AUDIO_WORKLOAD ?= 0
PSP_MEMORY_ACCESS_SELFTEST ?= 0
PSP_RESET_DIAG ?= 0
PSP_GPROF ?= 0
PSP_PERF_COUNTER_AUDIT ?= 0
PSP_020_AUDIT ?= 0
PSP_020_TRACE ?= 0
PSP_A1200_HDF_TEST ?= 0

PSP_ME_POC ?= 0
PSP_ME_TRANSPORT ?= 0
PSP_VME_PAULA_DIAGNOSTICS ?= 0
PSP_ME_PAULA_BENCH_DIAG ?= 0
# FOL 2026-11-07: Keep the experimental Slim/Go ME/VME CDDA path off; normal CDDA retains the SC mixer.
PSP_ME_CDDA ?= 0
PSP_ME_BLITTER_POC ?= 0
PSP_ME_BLITTER_LIVE_POC ?= 0

PSP_VIDEO_SOURCE_DIAG ?= 0
PSP_IMPROVED_BLITTER ?= 0
PSP_CD32_BOOT_TEST ?= 0

ifeq ($(PSP_MEMORY_AUDIT)$(PSP_AUDIO_AUDIT),11)
$(error PSP_MEMORY_AUDIT and PSP_AUDIO_AUDIT wrap the same benchmark hooks and cannot be enabled together)
endif
ifeq ($(PSP_ME_TRANSPORT)$(PSP_ME_SUPPORT),10)
$(error PSP_ME_TRANSPORT requires PSP_ME_SUPPORT)
endif
ifeq ($(PSP_ME_TRANSPORT)$(PSP_AUDIO_AUDIT),11)
$(error PSP_ME_TRANSPORT and PSP_AUDIO_AUDIT are separate candidates and cannot be enabled together)
endif
ifeq ($(PSP_ME_PAULA)$(PSP_ME_TRANSPORT),11)
$(error PSP_ME_PAULA must not be combined with the rejected runtime command transport)
endif
ifeq ($(PSP_ME_BLITTER_POC)$(PSP_ME_PAULA),10)
$(error PSP_ME_BLITTER_POC requires the persistent ME Paula worker)
endif
ifeq ($(PSP_ME_BLITTER_LIVE_POC),1)
ifeq ($(PSP_ME_BLITTER_POC),0)
$(error PSP_ME_BLITTER_LIVE_POC requires PSP_ME_BLITTER_POC)
endif
endif
ifeq ($(PSP_ME_CDDA),1)
ifeq ($(PSP_VME_PAULA_POC),0)
$(error PSP_ME_CDDA requires the VME-authoritative Paula mixer)
endif
endif

# FOL 2026-10-12: Optional staged memory audit stays out of the normal binary.
PSP_MEMORY_OBJS :=
PSP_MEMORY_LDFLAGS :=
ifeq ($(PSP_MEMORY_AUDIT),1)
COMMON_FLAGS += -DPSP_SFO_MEMSIZE=$(PSP_LARGE_MEMORY) -DPSP_MEMORY_AUDIT=1
PSP_MEMORY_OBJS += src/psp/psp_memory.o
PSP_MEMORY_LDFLAGS += -Wl,--wrap=main -Wl,--wrap=SDL_Init -Wl,--wrap=SDL_SetVideoMode
PSP_MEMORY_LDFLAGS += -Wl,--wrap=_Z11memory_initv -Wl,--wrap=_Z10gui_updatev
PSP_MEMORY_LDFLAGS += -Wl,--wrap=_Z29psp_platform_enable_benchmarkv
PSP_MEMORY_LDFLAGS += -Wl,--wrap=_Z28psp_platform_presented_framev
endif

# FOL 2026-10-12: Temporary Paula/host-output measurement remains isolated here.
PSP_AUDIO_AUDIT_OBJS :=
PSP_AUDIO_AUDIT_LDFLAGS :=
ifeq ($(PSP_AUDIO_AUDIT),1)
COMMON_FLAGS += -DPSP_AUDIO_AUDIT=1 -DPSP_AUDIO_MODE=$(PSP_AUDIO_MODE) -DPSP_AUDIO_WORKLOAD=$(PSP_AUDIO_WORKLOAD)
PSP_AUDIO_AUDIT_OBJS += src/psp/psp_audio_audit.o
PSP_AUDIO_AUDIT_LDFLAGS += -Wl,--wrap=_Z19finish_sound_bufferv
PSP_AUDIO_AUDIT_LDFLAGS += -Wl,--wrap=_Z15audio_evhandlerv -Wl,--wrap=_Z15check_dma_audiov
PSP_AUDIO_AUDIT_LDFLAGS += -Wl,--wrap=_Z11fetch_audiov -Wl,--wrap=_Z15update_adkmasksv
PSP_AUDIO_AUDIT_LDFLAGS += -Wl,--wrap=_Z7AUDxDATit -Wl,--wrap=_Z7AUDxLCHit
PSP_AUDIO_AUDIT_LDFLAGS += -Wl,--wrap=_Z7AUDxLCLit -Wl,--wrap=_Z7AUDxPERit
PSP_AUDIO_AUDIT_LDFLAGS += -Wl,--wrap=_Z7AUDxLENit -Wl,--wrap=_Z7AUDxVOLit
PSP_AUDIO_AUDIT_LDFLAGS += -Wl,--wrap=_Z29psp_platform_enable_benchmarkv
PSP_AUDIO_AUDIT_LDFLAGS += -Wl,--wrap=_Z28psp_platform_presented_framev
endif

ifeq ($(PSP_ME_POC),1)
COMMON_FLAGS += -DPSP_ME_POC=1
PSP_ME_POC_OBJS += src/psp/psp_me_poc.o
endif
ifeq ($(PSP_ME_TRANSPORT),1)
COMMON_FLAGS += -DPSP_ME_TRANSPORT=1
PSP_ME_TRANSPORT_OBJS += src/psp/psp_me_transport.o
endif
ifeq ($(PSP_VME_PAULA_DIAGNOSTICS),1)
COMMON_FLAGS += -DPSP_VME_PAULA_DIAGNOSTICS=1
endif
ifeq ($(PSP_ME_PAULA_BENCH_DIAG),1)
COMMON_FLAGS += -DPSP_ME_PAULA_BENCH_DIAG=1
endif
ifeq ($(PSP_ME_CDDA),1)
COMMON_FLAGS += -DPSP_ME_CDDA=1
endif
ifeq ($(PSP_ME_BLITTER_POC),1)
COMMON_FLAGS += -DPSP_ME_BLITTER_POC=1
endif
ifeq ($(PSP_ME_BLITTER_LIVE_POC),1)
COMMON_FLAGS += -DPSP_ME_BLITTER_LIVE_POC=1
endif
ifeq ($(PSP_VIDEO_SOURCE_DIAG),1)
ifeq ($(PSP_NATIVE_VIDEO),1)
COMMON_FLAGS += -DPSP_VIDEO_SOURCE_DIAG=1
endif
endif
ifeq ($(PSP_IMPROVED_BLITTER),1)
COMMON_FLAGS += -DPSP_IMPROVED_BLITTER=1
endif
ifeq ($(PSP_020_AUDIT),1)
COMMON_FLAGS += -DPSP_020_AUDIT=1
PSP_OBJS += src/psp/psp_020_audit.o
endif
ifeq ($(PSP_020_TRACE),1)
COMMON_FLAGS += -DPSP_020_TRACE=1
endif
ifeq ($(PSP_A1200_HDF_TEST),1)
COMMON_FLAGS += -DPSP_A1200_HDF_TEST=1
endif
ifeq ($(PSP_PERF_COUNTER_AUDIT),1)
COMMON_FLAGS += -DPSP_PERF_COUNTER_AUDIT=1
PSP_OBJS += src/psp/psp_perf_counter_audit.o
endif
ifeq ($(PSP_CD32_BOOT_TEST),1)
COMMON_FLAGS += -DPSP_CD32_BOOT_TEST=1
endif
ifeq ($(PSP_MEMORY_ACCESS_SELFTEST),1)
COMMON_FLAGS += -DPSP_MEMORY_ACCESS_SELFTEST=1
endif
ifeq ($(PSP_RESET_DIAG),1)
COMMON_FLAGS += -DPSP_RESET_DIAG=1
endif
ifeq ($(PSP_GPROF),1)
# FOL 2026-10-31: PSP GCC's mcount prologue requires a frame pointer; preserve FAME's O1/no-unroll/no-inline policy otherwise.
COMMON_FLAGS := $(filter-out -fomit-frame-pointer,$(COMMON_FLAGS))
COMMON_FLAGS += -DPSP_GPROF=1 -g -pg
endif

# FOL 2026-11-08: Preserve the original diagnostic ME object order while keeping the normal Paula object visible in the release section above.
PSP_ME_OBJS := $(PSP_ME_POC_OBJS) $(PSP_ME_TRANSPORT_OBJS) $(PSP_ME_PAULA_OBJS)

# FOL 2026-11-08: Freeze the fully resolved release-plus-opt-in build configuration only after all switches above have been processed.
CFLAGS := $(COMMON_FLAGS) -O3
ASFLAGS := $(COMMON_FLAGS) -O3

# FOL 2026-10-12: Link memory diagnostics after the core to minimise layout disturbance.
OBJS := $(PSP_OBJS) $(CORE_OBJS) $(PSP_CHDR_OBJS) $(PSP_MEMORY_OBJS) $(PSP_AUDIO_AUDIT_OBJS)

# FOL 2026-10-20: Match the bundled libchdr configuration used by UAE4ALL2 while using the PSP SDK zlib.
$(PSP_CHDR_OBJS): CFLAGS += -DCHDR_SYSTEM_ZLIB=1 -DWANT_RAW_DATA_SECTOR=1 -DWANT_SUBCODE=1
$(PSP_CHDR_OBJS): CFLAGS += -DVERIFY_BLOCK_CRC=1 -DLOWRAM_TARGET=1

LIBS := $(PSP_ME_LIBS) -lSDL -lpspirkeyb -lpsphprm -lz -lmad -lm -lstdc++ -lpsppower -lpspctrl -lpspaudio -lpsprtc -lpsputility \
        -lpspdisplay -lpspge -lpspgu -lpspsdk
# FOL 2026-10-13: PSP input wraps SDL_Init so video/audio remain SDL while joystick initialisation is removed.
LDFLAGS := -Wl,--gc-sections
LDFLAGS += -Wl,--wrap=SDL_Flip -Wl,--wrap=SDL_Init
LDFLAGS += $(PSP_MEMORY_LDFLAGS)
LDFLAGS += $(PSP_AUDIO_AUDIT_LDFLAGS)
ifeq ($(PSP_GPROF),1)
# FOL 2026-10-31: PSPSDK gprof needs the profiling runtime linked into the temporary PRX.
LDFLAGS += -pg -g
endif

EXTRA_TARGETS := EBOOT.PBP
PSP_EBOOT_TITLE := PSPUAE v2 Beta 12
# FOL 2026-11-08: Package PSP-native launch artwork; ICON0 retains alpha while PIC1 is the 480x272 backdrop.
PSP_EBOOT_ICON := src/psp/assets/eboot/ICON0.PNG
PSP_EBOOT_PIC1 := src/psp/assets/eboot/PIC1.PNG

include $(PSPSDK)/lib/build.mak

# FOL 2026-10-14: Preserve official PSP import records while keeping UAE4ALL2's dead-code elimination.
# The stock PSPSDK script keeps stub code/NIDs but not .lib.stub or .rodata.sceResident.
PSP_MIST_LINKFILE := .psp-build/linkfile-mist.prx
$(PSP_MIST_LINKFILE): $(PSPSDK)/lib/linkfile.prx
	mkdir -p .psp-build
	sed -e 's/\.lib\.stub       : { \*(\.lib\.stub) }/.lib.stub       : { KEEP (*(.lib.stub)) }/' \
	    -e 's/\.rodata\.sceResident      : { \*(\.rodata\.sceResident) }/.rodata.sceResident      : { KEEP (*(.rodata.sceResident)) }/' $< > $@

LDFLAGS := $(subst -T$(PSPSDK)/lib/linkfile.prx,-T$(PSP_MIST_LINKFILE),$(LDFLAGS))
$(TARGET).elf: | $(PSP_MIST_LINKFILE)

.PHONY: clean-psp-mist-linkfile
clean: clean-psp-mist-linkfile
clean-psp-mist-linkfile:
	rm -f $(PSP_MIST_LINKFILE)

# FOL 2026-10-12: Preserve FAME's deliberate per-file optimisation contract.
src/m68k/fame/famec.o: src/m68k/fame/famec.cpp
	$(CXX) $(filter-out -O3,$(CXXFLAGS)) -O1 -fno-unroll-loops -fno-inline -c -o $@ $<

PSP_HOSTFS ?= /mnt/c/psplinkusb/hostfs
.PHONY: deploy
deploy: $(TARGET).prx
	cp $(TARGET).prx $(PSP_HOSTFS)/pspuae-v2.prx
