Changelog
0.1.1-experimental — 2026-05-02
First end-to-end release-tarball flow: download tmc-usa-{linux,windows}-0.1.1-experimental.tar.gz, drop a baserom.gba next to it, run ./asset_extractor once, then ./tmc_pc. Works on Linux and Windows (real and via wine). Tarball ships only tmc_pc[.exe], asset_extractor[.exe], and sounds.json (104 KB metadata).
Fixed
- Title-screen sword + hilltop BG render correctly on Windows. Mingw's static-CRT heap allocates inside the simulated GBA address window (0x02000000-0x0A000000), so
port_resolve_addrmistranslated heap pointers to&gEwram[N]and the title-scene palette load read zeros from EWRAM. Fixed by reserving the GBA address window withVirtualAlloc(MEM_RESERVE)before any heap is opened on Windows. Linux glibc keeps malloc above 0x55... so it was never affected. (port_main.c) - Title sword routing restored. The
matheo/mastermerge regressedad9b4d94's GBA-mode-1 → VirtuaPPU-mode-2 routing via a "case handling" cleanup. BG2 affine was reading text-BG indexing and the title sword came out as garbage tiles. (port_ppu.cpp) asset_extractorworks from a release tarball. Old logic required walking up to find anxmake.luaand bailed otherwise; new logic always writesassets/andassets_src/next to the executable, which is the same pathtmc_pclooks under, in both dev and release layouts. (tools/src/assets_extractor/assets_extractor_main.cpp)tmc_pcfinds assets and ROM next to the binary on Linux/macOS too. Replaced the cwd-only lookup withreadlink(/proc/self/exe)/_NSGetExecutablePath, mirroring the WindowsGetModuleFileNameWpath. Double-clickingtmc_pcfrom a file manager now works. (port/port_asset_loader.cpp,port/port_rom.c)sounds.jsondiscovered next to the binary. Audio backend now probes<exe_dir>/sounds.jsonand<exe_dir>/assets/sounds.jsonbefore the cwd-relative dev paths. Release tarballs shipsounds.jsonat the top level. (port/port_m4a_backend.cpp)- ViruaPPU patches re-apply automatically every build.
xmake.lua'sbefore_buildcallback was disabled in a stash; re-enabled withgit apply -3so partial-upstream drift no longer aborts the patch step. The mosaic patch (drifted, has known issues) is removed from the auto-apply list —TMC_NO_MOSAIC(ea33eb71) covers the gameplay paths.
Added
- Merged
matheo/master:build.pyend-to-end build helper and.github/workflows/{_build,ci,release}.yamlrelease workflow. Taggingv*on a fork withASSETS_REPO/ASSETS_TOKENconfigured will producetmc-{usa,eur}-{linux,windows}-<tag>.tar.gzartifacts.
Known issues
~900animations (Gyorg, Vaati cutscene, MazaalHand, etc.) are skipped during extraction withAnimation loop byte missing/Animation data has trailing bytes. Bug ininfer_asset_size/WriteEditableAnimation's end-of-stream detection — affects both platforms identically. Animations not used by the title or early gameplay; will surface during specific cutscenes.- Mosaic effect on title fade and certain spell charges is disabled (kill-switched). Patch needs re-porting against current ViruaPPU
mode1.c.
0.1.0-experimental — earlier
Initial PC port snapshot.