diff --git a/emulators/81.yml b/emulators/81.yml index ca923ee7..7860258d 100644 --- a/emulators/81.yml +++ b/emulators/81.yml @@ -5,6 +5,7 @@ source: "https://github.com/libretro/81-libretro" upstream: "https://github.com/charlierobson/EightyOne" profiled_date: "2026-03-22" source_commit: "fa7094910d040baa5fd8b11dbf6a1a618330ecd9" +upstream_commit: "4de3cdb8cff0060ad03e43ae2681b0628a9c5f5d" core_version: "1.0a" display_name: "Sinclair - ZX 81 (EightyOne)" cores: ["81"] @@ -23,10 +24,10 @@ systems: notes: | Libretro port embeds zx81.rom and dkchr.rom as C arrays (xxd -i). Core never accesses filesystem for ROMs. Hardcodes MACHINEZX81. - ref: 81-libretro/81/zx81/snap.c:487-508, src/libretro.cpp:393 + ref: source 81/zx81/snap.c:487-508, source src/libretro.cpp:393 Original EightyOne supports 15+ machines, loads ROMs from ROM/ directory. - ref: EightyOne/Source/zx81/zx81.cpp:309, EightyOne/Source/HW_.cpp:2734 + ref: upstream Source/zx81/zx81.cpp:309, upstream Source/HW_.cpp:2734 .info has no firmware declarations (firmware_count absent). @@ -270,7 +271,7 @@ files: mode: standalone size: 8192 md5: 5c11c61a2dd2ca4bf39328d9ff42d289 - source_ref: "upstream EightyOne/Source/ROMs/FDCs/interface1.edition1.rom" + source_ref: "upstream Source/ROMs/FDCs/interface1.edition1.rom" - name: "+d.g+dos.v1-a.rom" system: sinclair-zx-spectrum required: false @@ -482,7 +483,7 @@ files: mode: standalone size: 16384 md5: 9f6f56003307b9d55be96f406fdbf2b1 - source_ref: "upstream EightyOne/Source/ROMs/spectrum48.arabic.rom" + source_ref: "upstream Source/ROMs/spectrum48.arabic.rom" - name: spectrum48.arabic.version1.rom system: sinclair-zx-spectrum required: false @@ -599,7 +600,7 @@ files: size: 16384 md5: b7893ad25728fbf6410f08eddd4a1cad note: "Microdigital TK90X (Spectrum clone)." - source_ref: "upstream EightyOne/Source/ROMs/tk90.rom" + source_ref: "upstream Source/ROMs/tk90.rom" - name: tk95.rom system: sinclair-zx-spectrum required: false @@ -608,4 +609,4 @@ files: size: 16384 md5: b7893ad25728fbf6410f08eddd4a1cad note: "Microdigital TK95 (Spectrum clone)." - source_ref: "upstream EightyOne/Source/ROMs/tk95.rom" + source_ref: "upstream Source/ROMs/tk95.rom" diff --git a/emulators/armsx2.yml b/emulators/armsx2.yml index da416bae..b9f3c099 100644 --- a/emulators/armsx2.yml +++ b/emulators/armsx2.yml @@ -6,6 +6,7 @@ source: "https://github.com/ARMSX2/ARMSX2" upstream: "https://github.com/PCSX2/pcsx2" profiled_date: "2026-10-04" source_commit: "d383b3636947565d9201f81e32178d0288623d8d" +upstream_commit: "36907f4b70d149b05c2700acae687bedb720a7af" core_version: "2.8" display_name: "Sony - PlayStation 2 (ARMSX2)" cores: diff --git a/emulators/azahar.yml b/emulators/azahar.yml index aed198ab..270b1eac 100644 --- a/emulators/azahar.yml +++ b/emulators/azahar.yml @@ -5,6 +5,7 @@ source: "https://github.com/johndoe6345789/azahar_libretro" upstream: "https://github.com/azahar-emu/azahar" profiled_date: "2026-03-23" source_commit: "9dd12da328c753806cbd4f2b0e048fced97ae97d" +upstream_commit: "9b045bf8370d035cacd99e5ad19a082df9e3b262" core_version: "Git" display_name: "Nintendo - 3DS (Azahar)" cores: [azahar] diff --git a/emulators/cannonball.yml b/emulators/cannonball.yml index 621b7496..9e0a1ebf 100644 --- a/emulators/cannonball.yml +++ b/emulators/cannonball.yml @@ -5,6 +5,7 @@ source: "https://github.com/libretro/cannonball" upstream: "https://github.com/djyt/cannonball" profiled_date: "2026-03-23" source_commit: "0d83575d920ea4c0a280847a19d7802f673e6a68" +upstream_commit: "27493ebf62be3498dff93ed6a45e8e2db819bae1" core_version: "1.0" display_name: "Cannonball" cores: diff --git a/emulators/cdi2015.yml b/emulators/cdi2015.yml index 02fde949..e703ab99 100644 --- a/emulators/cdi2015.yml +++ b/emulators/cdi2015.yml @@ -5,6 +5,7 @@ source: "https://github.com/libretro/mame2015-libretro" upstream: "https://github.com/mamedev/mame/tree/mame0160" profiled_date: "2026-03-23" source_commit: "7adbf440d5f554097f58f8c6ebb673adc4320a31" +upstream_commit: "0147bb4cc82e642cf75151f039f240eb20989fbc" core_version: "0.160" display_name: "Philips CDi (CDi 2015)" cores: [cdi2015] diff --git a/emulators/dolphin-mmjr.yml b/emulators/dolphin-mmjr.yml index d9c5a874..30434848 100644 --- a/emulators/dolphin-mmjr.yml +++ b/emulators/dolphin-mmjr.yml @@ -5,6 +5,7 @@ source: "https://github.com/acidtech/Dolphin-MMJR" upstream: "https://github.com/weihuoya/dolphin" profiled_date: "2026-08-11" source_commit: "1b095b64857c2eabb49a42cc56ffd9d7881bc263" +upstream_commit: "0f4c971326ae9389b3ad55b0fefacb708d148f4d" core_version: "11460 - bankaimaster999" display_name: "Nintendo - GameCube / Wii (Dolphin MMJR)" cores: diff --git a/emulators/dolphin-mmjr2.yml b/emulators/dolphin-mmjr2.yml index fcce0ee4..d5161f8a 100644 --- a/emulators/dolphin-mmjr2.yml +++ b/emulators/dolphin-mmjr2.yml @@ -5,6 +5,7 @@ source: "https://github.com/nachoverdon/Dolphin-MMJR2" upstream: "https://github.com/dolphin-emu/dolphin" profiled_date: "2026-08-11" source_commit: "4d0fdb8eea616320e967408cf5547c72a95196f3" +upstream_commit: "4ff214cdd26f135251d2266d676ed72dc1c2f8c9" core_version: "2.0-18025" display_name: "Nintendo - GameCube / Wii (Dolphin MMJR2)" cores: @@ -22,7 +23,8 @@ notes: | selective merge of Dolphin Official carrying that label rather than a checkout of it: at Dolphin 5.0-18025 the memory subsystem has already moved behind Core::System, and here it has not, so no single Dolphin revision - matches and no upstream pin is declared. + matches the tree. upstream_commit is the Dolphin revision the upstream + citations were read at, not a base of this tree. ref: Source/Android/app/build.gradle:32, Source/Android/app/build.gradle:135 Two roots. The user directory is mmjr-revamp at the root of external storage. diff --git a/emulators/dolphin.yml b/emulators/dolphin.yml index f7a1a468..3f520166 100644 --- a/emulators/dolphin.yml +++ b/emulators/dolphin.yml @@ -6,6 +6,7 @@ upstream: "https://github.com/dolphin-emu/dolphin" logo: "https://raw.githubusercontent.com/dolphin-emu/dolphin/master/Data/dolphin-emu.svg" profiled_date: "2026-03-23" source_commit: "4d23cf151640eb810cb1b8e9d9fc922cf59c0b87" +upstream_commit: "f5dfb7e3d36ce24551ed0bb886b79f3f192dac9d" core_version: "Git" display_name: "Nintendo - GameCube / Wii (Dolphin)" cores: diff --git a/emulators/dosbox_pure.yml b/emulators/dosbox_pure.yml index eeaa8c51..528f0b63 100644 --- a/emulators/dosbox_pure.yml +++ b/emulators/dosbox_pure.yml @@ -6,6 +6,7 @@ upstream: "https://codeberg.org/schelling/dosbox-pure" logo: "https://raw.githubusercontent.com/schellingb/dosbox-pure/main/images/logo.png" profiled_date: "2026-03-23" source_commit: "cdaea10ce8cac231bc341ca05d4c5e4e5fe0fbd5" +upstream_commit: "cdaea10ce8cac231bc341ca05d4c5e4e5fe0fbd5" core_version: "1.0-preview7" display_name: "DOS (DOSBox-Pure)" cores: [dosbox_pure] diff --git a/emulators/easyrpg.yml b/emulators/easyrpg.yml index 4d5482fa..9a4231f8 100644 --- a/emulators/easyrpg.yml +++ b/emulators/easyrpg.yml @@ -5,6 +5,7 @@ source: "https://github.com/libretro/easyrpg-libretro" upstream: "https://github.com/EasyRPG/Player" profiled_date: "2026-03-23" source_commit: "a3fbb7c24fd5a39fd95388d09135256a6b19f1e4" +upstream_commit: "8acd2e17c6a8a0a75cb7ce95625c6bdc89aebe1a" core_version: "0.8.1.0" display_name: "RPG Maker 2000/2003 (EasyRPG)" cores: diff --git a/emulators/fbalpha2019.yml b/emulators/fbalpha2019.yml index b385302e..2f64305e 100644 --- a/emulators/fbalpha2019.yml +++ b/emulators/fbalpha2019.yml @@ -5,6 +5,7 @@ source: "https://github.com/libretro/fbalpha" upstream: "https://github.com/barry65536/FBAlpha" profiled_date: "2026-10-17" source_commit: "0581797db6fdffd826086b053ced4b6b29bb6678" +upstream_commit: "416948158d88ba17f87813419ddc3c1209ef68c0" pin_frozen: "ROCKNIX 20261001 builds this revision as fbalpha2019. Later commits on libretro/fbalpha are not part of that build." core_version: "v0.2.97.44" display_name: "Arcade (FB Alpha 2019)" diff --git a/emulators/fbneo.yml b/emulators/fbneo.yml index 77a8c3a0..9028f2c7 100644 --- a/emulators/fbneo.yml +++ b/emulators/fbneo.yml @@ -6,6 +6,7 @@ upstream: "https://github.com/finalburnneo/FBNeo" logo: "https://raw.githubusercontent.com/finalburnneo/FBNeo/master/projectfiles/xcode/Emulator/Assets.xcassets/AppIcon.appiconset/icon_512.png" profiled_date: "2026-03-23" source_commit: "63c4190785cadd5ff84483399375871ed6e98754" +upstream_commit: "8d47450deff3802a61559108f12bb0c846c98e36" core_version: "v1.0.0.2" display_name: "Arcade (FinalBurn Neo)" cores: diff --git a/emulators/flycast.yml b/emulators/flycast.yml index c1abd8ac..a764465a 100644 --- a/emulators/flycast.yml +++ b/emulators/flycast.yml @@ -68,7 +68,7 @@ files: hle_fallback: true size: 2097152 note: "Dreamcast boot ROM. HLE BIOS (reios) used as fallback. Code searches prefix + boot.bin, boot.bin.bin, bios.bin, bios.bin.bin sequentially." - source_ref: "upstream core/hw/holly/sb_mem.cpp:219, 55-57" + source_ref: "source core/hw/holly/sb_mem.cpp:219, 55-57" - name: "dc_nvmem.bin" path: "dc/dc_nvmem.bin" @@ -78,14 +78,14 @@ files: hle_fallback: true size: 131072 note: "Dreamcast flash memory / NVRAM. Created if not found. Code searches prefix + nvmem.bin, flash_wb.bin, flash.bin, flash.bin.bin sequentially." - source_ref: "upstream core/hw/holly/sb_mem.cpp:231, 196-213" + source_ref: "source core/hw/holly/sb_mem.cpp:231, 196-213" - name: "font.bin" path: "dc/font.bin" system: sega-dreamcast required: false note: "Dreamcast system font for HLE BIOS text rendering. Built-in font used as fallback." - source_ref: "upstream core/reios/reios.cpp:737-753" + source_ref: "source core/reios/reios.cpp:737-753" # ------------------------------------------------------- # Sega NAOMI @@ -97,7 +97,7 @@ files: required: false size: 2097152 note: "NAOMI boot ROM (flat binary). Alternative to naomi.zip. epr-21576d.bin is searched without prefix." - source_ref: "upstream core/hw/holly/sb_mem.cpp:219, 58-59" + source_ref: "source core/hw/holly/sb_mem.cpp:219, 58-59" - name: "naomi.zip" path: "dc/naomi.zip" @@ -169,7 +169,7 @@ files: system: sega-atomiswave required: true note: "Atomiswave system BIOS archive (MAME format). Contains bios0.ic23 (Sammy, 128 KB)." - source_ref: "upstream core/hw/naomi/naomi_roms.h:87-94" + source_ref: "source core/hw/naomi/naomi_roms.h:87-94" contents: - name: "bios0.ic23" size: 131072 diff --git a/emulators/fsuae.yml b/emulators/fsuae.yml index 2e4ab2db..a5fd235f 100644 --- a/emulators/fsuae.yml +++ b/emulators/fsuae.yml @@ -5,6 +5,7 @@ source: "https://github.com/libretro/libretro-fsuae" upstream: "https://github.com/FrodeSolheim/fs-uae" profiled_date: "2026-03-26" source_commit: "089bb69207fe8fa5eec0006d1d759fb6426f4027" +upstream_commit: "f362278ccd4c60991caac3b4d240d4a3f751bea2" core_version: "v5.0.7" display_name: "Commodore - Amiga (FS-UAE)" cores: diff --git a/emulators/groovymame.yml b/emulators/groovymame.yml index 187622a6..b650160c 100644 --- a/emulators/groovymame.yml +++ b/emulators/groovymame.yml @@ -4,9 +4,10 @@ core_classification: enhanced_fork source: "https://github.com/antonioginer/GroovyMAME" upstream: "https://github.com/mamedev/mame" source_commit: "953db38f4aaab1d75faa4ac79e1b45686214f987" +upstream_commit: "f34f02505e32c1993c6a782b6814232cbfc74e36" logo: "https://raw.githubusercontent.com/mamedev/mame/master/docs/source/images/MAMElogo.svg" profiled_date: "2026-08-08" -core_version: "0.288" +core_version: "0.289" display_name: "Arcade (GroovyMAME)" cores: @@ -122,13 +123,14 @@ systems: notes: | MAME fork adding Switchres 2.2.2 for CRT modeline generation, frame delay - and low latency vsync. Branch groovymame0288, BARE_BUILD_VERSION 0.288 - (makefile:1508). TARGET := mame with no SUBTARGET override (makefile:274-282), + and low latency vsync. Branch groovymame0289, BARE_BUILD_VERSION 0.289 + (makefile:1513). TARGET := mame with no SUBTARGET override (makefile:274-282), so the build carries the full machine set. - src/mame and src/devices are byte identical to mamedev/mame tag mame0288, - so ROM requirements are MAME 0.288's. The fork's changes sit in src/osd and - 3rdparty/switchres and pull in no external data file: monitor presets are + src/mame and src/devices are byte identical to mamedev/mame tag mame0289, + so ROM requirements are MAME 0.289's. The fork's changes sit in src/osd, + src/emu, src/frontend, 3rdparty/switchres, 3rdparty/emusync and + 3rdparty/lz4, and pull in no external data file: monitor presets are compiled in (3rdparty/switchres/monitor.cpp:124-145), and switchres.ini plus display#.ini are optional user configuration read only when the switchres_ini option is set (src/osd/modules/switchres/switchres_module.cpp:166,173). diff --git a/emulators/holani.yml b/emulators/holani.yml index b85d17c1..ef05f37b 100644 --- a/emulators/holani.yml +++ b/emulators/holani.yml @@ -5,6 +5,7 @@ source: "https://github.com/LLeny/holani-retro" upstream: "https://github.com/LLeny/holani" profiled_date: "2026-03-24" source_commit: "19b974f77247a937369adf48280d2b34a5a66245" +upstream_commit: "4fa0ee920c63a9cf8d07b974ae77fb15161ff967" core_version: "0.9.9" display_name: "Atari - Lynx (Holani)" cores: [holani] diff --git a/emulators/hypseus-singe.yml b/emulators/hypseus-singe.yml index 792b2947..eb611232 100644 --- a/emulators/hypseus-singe.yml +++ b/emulators/hypseus-singe.yml @@ -4,6 +4,7 @@ core_classification: enhanced_fork source: "https://github.com/DirtBagXon/hypseus-singe" upstream: "https://github.com/mirror/daphne-emu" source_commit: "cda87965fe0a031d027b2253c6715d37cca6b56a" +upstream_commit: "cd214c6046365047704f8a0563928970b30444e6" profiled_date: "2026-08-08" core_version: "v3.0.0" display_name: "Arcade (Hypseus Singe)" diff --git a/emulators/ishiiruka.yml b/emulators/ishiiruka.yml index fed1148c..9dbe31c7 100644 --- a/emulators/ishiiruka.yml +++ b/emulators/ishiiruka.yml @@ -5,6 +5,7 @@ source: "https://github.com/libretro/ishiiruka" upstream: "https://github.com/Tinob/Ishiiruka" profiled_date: "2026-03-24" source_commit: "f228bde5fbf4861ba749a229803addcd6238663f" +upstream_commit: "cba6d7279b44894297d8c1dde1effdbba3605c32" core_version: "Git" display_name: "Nintendo - GameCube / Wii (Ishiiruka)" cores: diff --git a/emulators/jl-mod.yml b/emulators/jl-mod.yml index ee2c5f5f..c1775e76 100644 --- a/emulators/jl-mod.yml +++ b/emulators/jl-mod.yml @@ -6,6 +6,7 @@ upstream: "https://github.com/nikita36078/J2ME-Loader" author: "Yury Kharchenko" profiled_date: "2026-08-11" source_commit: "f723a190c0bdb44b31c3bc0ead6f8665c7ea517d" +upstream_commit: "c2fdac77edba94709796b67ed5493915f31d620f" core_version: "0.87.1" display_name: "Mobile - J2ME (JL-Mod)" cores: diff --git a/emulators/kronos.yml b/emulators/kronos.yml index 9f0a90e9..4f55dc45 100644 --- a/emulators/kronos.yml +++ b/emulators/kronos.yml @@ -6,6 +6,7 @@ source_branch: kronos upstream: "https://github.com/FCare/Kronos" profiled_date: "2026-03-24" source_commit: "3791ffb2221fda61d70aec5cca376418caf05669" +upstream_commit: "d0384bc33aad06bfa9cf5cd308c4bd7ae6cfc814" core_version: "v2.6.0" display_name: "Sega - Saturn/ST-V (Kronos)" cores: diff --git a/emulators/lrps2.yml b/emulators/lrps2.yml index facc380a..8aad8b6b 100644 --- a/emulators/lrps2.yml +++ b/emulators/lrps2.yml @@ -57,7 +57,7 @@ files: required: false max_size: 4194304 description: "DVD player ROM" - source_ref: "upstream pcsx2/ps2/BiosTools.cpp:189-229, 339" + source_ref: "source pcsx2/ps2/BiosTools.cpp:189-229, 339" note: > DVD player ROM. Tries .rom1 (appended) then .rom1 (extension replaced). Silently skipped if not found. @@ -67,7 +67,7 @@ files: required: false max_size: 524288 description: "Chinese ROM extension" - source_ref: "upstream pcsx2/ps2/BiosTools.cpp:189-229, 340" + source_ref: "source pcsx2/ps2/BiosTools.cpp:189-229, 340" note: > Chinese region ROM extension. Same naming convention as rom1. Only present on Chinese region consoles. @@ -78,7 +78,7 @@ files: hle_fallback: true size: 1024 description: "NVRAM / EEPROM data" - source_ref: "upstream pcsx2/CDVD/CDVD.cpp:196-227" + source_ref: "source pcsx2/CDVD/CDVD.cpp:196-227" note: > Console EEPROM data (language, timezone, region, iLink ID, OSD settings). Path derived from BIOS path with extension replaced to .nvm. @@ -90,7 +90,7 @@ files: hle_fallback: true size: 4 description: "Mechacon version" - source_ref: "upstream pcsx2/CDVD/CDVD.cpp:229-245" + source_ref: "source pcsx2/CDVD/CDVD.cpp:229-245" note: > Mechacon (disc drive controller) version as u32. Auto-created with default 0x00020603 if missing. diff --git a/emulators/mame2009.yml b/emulators/mame2009.yml index 8d62395d..f78a0c27 100644 --- a/emulators/mame2009.yml +++ b/emulators/mame2009.yml @@ -5,6 +5,7 @@ source: "https://github.com/r-type/mame2009-libretro" upstream: "https://github.com/mamedev/mame/tree/mame0135u4" profiled_date: "2026-03-24" source_commit: "45048806fbc0fea82709a75a523f2eda945e0a47" +upstream_commit: "c285eb9bcd3505c14a338e29f251ba00776cc75c" core_version: "0.135u4" display_name: "Arcade (MAME 2009)" diff --git a/emulators/mame2010.yml b/emulators/mame2010.yml index 20edf39d..26b15b78 100644 --- a/emulators/mame2010.yml +++ b/emulators/mame2010.yml @@ -6,6 +6,7 @@ upstream: "https://github.com/mamedev/mame/tree/mame0139" logo: "https://raw.githubusercontent.com/mamedev/mame/master/docs/source/images/MAMElogo.svg" profiled_date: "2026-03-22" source_commit: "dff8aadd1c3f38215af3955746d6e19abe0ddcea" +upstream_commit: "f4f24ba7274010fb8ccb84548b5ca95c2be2f85b" core_version: "0.139" display_name: "Arcade (MAME 2010)" mame_version: "0.139" diff --git a/emulators/mame2014.yml b/emulators/mame2014.yml index 835cee5b..de767d40 100644 --- a/emulators/mame2014.yml +++ b/emulators/mame2014.yml @@ -6,6 +6,7 @@ upstream: "https://github.com/mamedev/mame/tree/mame0160" logo: "https://raw.githubusercontent.com/mamedev/mame/master/docs/source/images/MAMElogo.svg" profiled_date: "2026-10-20" source_commit: "c8fe6c7399f24466808b67933b2b96feea188e0b" +upstream_commit: "0147bb4cc82e642cf75151f039f240eb20989fbc" core_version: "0.160" display_name: "Arcade (MAME 2014)" mame_version: "0.160" diff --git a/emulators/mame2015.yml b/emulators/mame2015.yml index 816735dc..cd7ca70f 100644 --- a/emulators/mame2015.yml +++ b/emulators/mame2015.yml @@ -6,6 +6,7 @@ upstream: "https://github.com/mamedev/mame/tree/mame0160" logo: "https://raw.githubusercontent.com/mamedev/mame/master/docs/source/images/MAMElogo.svg" profiled_date: "2026-03-24" source_commit: "7adbf440d5f554097f58f8c6ebb673adc4320a31" +upstream_commit: "0147bb4cc82e642cf75151f039f240eb20989fbc" core_version: "0.160" display_name: "Arcade (MAME 2015)" mame_version: "0.160" diff --git a/emulators/mame2016.yml b/emulators/mame2016.yml index b6d30f1b..ae67052e 100644 --- a/emulators/mame2016.yml +++ b/emulators/mame2016.yml @@ -6,6 +6,7 @@ upstream: "https://github.com/mamedev/mame/tree/mame0174" logo: "https://raw.githubusercontent.com/mamedev/mame/master/docs/source/images/MAMElogo.svg" profiled_date: "2026-03-22" source_commit: "ae07c2f88ff2482ba9f50ffc8c9e7e6fbfe97d0a" +upstream_commit: "68785dccfee3208163c8169abc5c6d01becf36d4" core_version: "0.174" cores: diff --git a/emulators/melonds_ds.yml b/emulators/melonds_ds.yml index 64fcd777..066fd054 100644 --- a/emulators/melonds_ds.yml +++ b/emulators/melonds_ds.yml @@ -6,6 +6,7 @@ source: "https://github.com/JesseTG/melonds-ds" upstream: "https://github.com/melonDS-emu/melonDS" profiled_date: "2026-10-04" source_commit: "f394adbacb5722ee97c1b37c8064da9a25818310" +upstream_commit: "906e9ebb27da8c6a715cd7abab4abfe8a8d29427" core_version: "1.4.0" display_name: "Nintendo - DS (melonDS DS)" systems: diff --git a/emulators/mesen-s.yml b/emulators/mesen-s.yml index f23f5035..6bec6c52 100644 --- a/emulators/mesen-s.yml +++ b/emulators/mesen-s.yml @@ -9,6 +9,7 @@ source: "https://github.com/libretro/Mesen-S" upstream: "https://github.com/SourMesen/Mesen-S" profiled_date: "2026-03-24" source_commit: "9e4fdeb9b336470bc96beb8765b2e79c86a2da1e" +upstream_commit: "89199f298a95345a893d814525b6668567a6d490" core_version: "0.4.0" cores: [mesen-s, mesen_s] systems: [nintendo-snes, nintendo-gb, nintendo-gbc, nintendo-super-game-boy, nintendo-satellaview] diff --git a/emulators/mesence.yml b/emulators/mesence.yml index c31bbf94..0ea80bc6 100644 --- a/emulators/mesence.yml +++ b/emulators/mesence.yml @@ -9,6 +9,7 @@ profiled_date: "2026-09-17" source_commit: standalone: "20f497c9620a7f4e55b7752e1d22734f9d7492fa" libretro: "4c4e069f16a8ad6ed79e046046c56d51558c7daf" +upstream_commit: "fabc9a62174f8734a113df6d244f5539ef6b8fcf" core_version: standalone: "2.2.1" libretro: "2.0.0" @@ -620,7 +621,7 @@ files: validation: [size] sha256: "990bf1956f10207d8781b619eb74f89b00d921c8d45c95c334c16c8cceca09ad,fb4a898eb93b19b36773d87a6c70eb28f981b2686bebdd2d431b05dcdf9cffd4" note: "ColecoVision BIOS, NTSC or PAL console dump. The system boots through it, and games cannot start without it." - source_ref: "source Core/SMS/SmsConsole.cpp:71-74, source Core/Shared/FirmwareHelper.h:381-398, upstream UI/Interop/FirmwareTypeExtensions.cs:70" + source_ref: "source Core/SMS/SmsConsole.cpp:71-74, source Core/Shared/FirmwareHelper.h:381-398, source UI/Interop/FirmwareTypeExtensions.cs:70" # ------------------------------------------------------- # WonderSwan (standalone only: UseBootRom is never set by the libretro port) diff --git a/emulators/np2kai.yml b/emulators/np2kai.yml index e86f43d0..1f2214ab 100644 --- a/emulators/np2kai.yml +++ b/emulators/np2kai.yml @@ -5,6 +5,7 @@ source: "https://github.com/libretro/NP2kai" upstream: "https://github.com/AZO234/NP2kai" profiled_date: "2026-03-24" source_commit: "1ea561cd7fd62b33f4e7b3f1c2e30fc3e6089f28" +upstream_commit: "5d47f3a04b0b8ea78f625eeec354ac132c80df06" core_version: "0.86" display_name: "NEC - PC-98 (Neko Project II Kai)" cores: [np2kai] diff --git a/emulators/primehack.yml b/emulators/primehack.yml index 7fe78122..860c93f6 100644 --- a/emulators/primehack.yml +++ b/emulators/primehack.yml @@ -5,6 +5,7 @@ source: "https://github.com/shiiion/dolphin" upstream: "https://github.com/dolphin-emu/dolphin" profiled_date: "2026-03-26" source_commit: "53f53e0f5bad27ad62a807cb93b136d84f68777f" +upstream_commit: "d8558142ead21b3fa39809c4aedb982fbfc85feb" core_version: "1.0.8" display_name: "PrimeHack (Dolphin fork for Metroid Prime)" cores: @@ -41,7 +42,7 @@ files: required: false hle_fallback: true note: "GameCube NTSC-U boot ROM. HLE available but real IPL needed for GC menu boot and accurate fonts" - source_ref: "upstream Source/Core/Common/CommonPaths.h:138, source Source/Core/Core/HW/EXI/EXI_DeviceIPL.cpp:109-110" + source_ref: "upstream Source/Core/Common/CommonPaths.h:139, source Source/Core/Core/HW/EXI/EXI_DeviceIPL.cpp:109-110" - name: "IPL.bin" path: "GC/EUR/IPL.bin" @@ -78,7 +79,7 @@ files: adler32_pairs_with: "dsp_coef.bin" adler32_pairs: [["0x66f334fe", "0xf3b93527"], ["0xe789b5a5", "0xa4a575f5"]] note: "DSP instruction ROM for LLE audio. Free replacement (v0.4) included" - source_ref: "upstream Source/Core/Common/CommonPaths.h:135, source Source/Core/Core/HW/DSPLLE/DSPLLE.cpp:87-117, source Source/Core/Core/DSP/DSPCore.cpp:28-102" + source_ref: "upstream Source/Core/Common/CommonPaths.h:136, source Source/Core/Core/HW/DSPLLE/DSPLLE.cpp:87-117, source Source/Core/Core/DSP/DSPCore.cpp:28-102" - name: "dsp_coef.bin" path: "GC/dsp_coef.bin" @@ -106,7 +107,7 @@ files: sha1: "483a17ff25b68a8f18cae691da99f16beefbe370" md5: "9bef639b7426ef6948602a12b33522a8" note: "Windows-1252 font for GC/Wii text rendering. The free alternative ships in Sys/GC/ of the 1.0.8 Windows and macOS releases, and the real one from an IPL dump is preferred" - source_ref: "upstream Source/Core/Common/CommonPaths.h:132, source Source/Core/Core/HW/EXI/EXI_DeviceIPL.cpp:131, 203-218" + source_ref: "upstream Source/Core/Common/CommonPaths.h:133, source Source/Core/Core/HW/EXI/EXI_DeviceIPL.cpp:131, 203-218" - name: "font_japanese.bin" path: "GC/font_japanese.bin" @@ -127,7 +128,7 @@ files: required: false hle_fallback: true note: "GBA BIOS for GC-GBA link feature (uses integrated mGBA). Path configurable in settings" - source_ref: "upstream Source/Core/Common/CommonPaths.h:144, source Source/Core/Core/HW/GBACore.cpp:344-361" + source_ref: "upstream Source/Core/Common/CommonPaths.h:145, source Source/Core/Core/HW/GBACore.cpp:344-361" # -- Wii System Files -- - name: "SYSCONF" @@ -143,7 +144,7 @@ files: required: false hle_fallback: true note: "Wii region/language settings. Auto-generated during Wii boot emulation" - source_ref: "upstream Source/Core/Common/CommonPaths.h:152, source Source/Core/Core/Boot/Boot_BS2Emu.cpp:377-454" + source_ref: "upstream Source/Core/Common/CommonPaths.h:153, source Source/Core/Core/Boot/Boot_BS2Emu.cpp:377-454" # -- Wii NAND Backup (BootMii) -- - name: "nand.bin" @@ -167,7 +168,7 @@ files: required: false hle_fallback: true note: "Virtual SD card image for Wii homebrew. Auto-created, supports SD/SDHC up to 4GB" - source_ref: "upstream Source/Core/Common/CommonPaths.h:149" + source_ref: "upstream Source/Core/Common/CommonPaths.h:150" # -- Gecko Code Handler -- - name: "codehandler.bin" @@ -179,7 +180,7 @@ files: sha1: "e6c0050b3c67ee26198488fbbe4a5d019c15b628" md5: "1f118b8735fcf40c20b38c3184eebfd9" note: "Gecko/Ocarina cheat code handler. Shipped in Sys/ of the 1.0.8 Windows and macOS releases" - source_ref: "upstream Source/Core/Common/CommonPaths.h:154, source Source/Core/Core/GeckoCode.cpp:121" + source_ref: "upstream Source/Core/Common/CommonPaths.h:155, source Source/Core/Core/GeckoCode.cpp:121" # -- Wii System Menu (WAD) -- - name: "Wii System Menu" diff --git a/emulators/scummvm.yml b/emulators/scummvm.yml index b8ce7478..3d166653 100644 --- a/emulators/scummvm.yml +++ b/emulators/scummvm.yml @@ -6,6 +6,7 @@ upstream: "https://github.com/scummvm/scummvm" logo: "https://raw.githubusercontent.com/scummvm/scummvm/master/icons/scummvm.svg" profiled_date: "2026-03-25" source_commit: "fcbce3ae815269dacdc309092bc92ccc6d3e13bb" +upstream_commit: "fcbce3ae815269dacdc309092bc92ccc6d3e13bb" core_version: "2.8.0git" display_name: "ScummVM" cores: [scummvm] diff --git a/emulators/snes9x.yml b/emulators/snes9x.yml index b488d503..d1dcc1b3 100644 --- a/emulators/snes9x.yml +++ b/emulators/snes9x.yml @@ -6,6 +6,7 @@ upstream: "https://github.com/snes9xgit/snes9x" logo: "https://raw.githubusercontent.com/snes9xgit/snes9x/master/gtk/data/snes9x.svg" profiled_date: "2026-03-25" source_commit: "fae2fea08f74180759ef540ee94259213f503480" +upstream_commit: "85591435763dede7ef111aab8070cdf2d5a7da49" core_version: "1.61" display_name: "Nintendo - SNES / SFC (Snes9x)" systems: [nintendo-snes, nintendo-satellaview, nintendo-sufami-turbo] diff --git a/emulators/syobonaction.yml b/emulators/syobonaction.yml index 9200ffed..5b64195e 100644 --- a/emulators/syobonaction.yml +++ b/emulators/syobonaction.yml @@ -5,6 +5,7 @@ source: "https://github.com/iyzsong/syobonaction-libretro" upstream: "https://github.com/akemin-dayo/OpenSyobonAction" profiled_date: "2026-03-25" source_commit: "792c40cb590bcc7286cf720b5fb85807082b534e" +upstream_commit: "77ca2c128784512eca10e24a453ca19c270a8af4" core_version: "0.3" display_name: "Syobon Action" cores: [syobonaction] diff --git a/emulators/triforce.yml b/emulators/triforce.yml index 675a5b44..eab95ad9 100644 --- a/emulators/triforce.yml +++ b/emulators/triforce.yml @@ -5,6 +5,7 @@ source: "https://github.com/REG-Linux/dolphin-triforce" upstream: "https://github.com/dolphin-emu/dolphin" profiled_date: "2026-08-08" source_commit: "5c456e8ff0da0235be2cf1d55ba7bb2115b0cae2" +upstream_commit: "b92e354389bb7c0bd114a8631b8af110d3cb3a14" core_version: "2407" display_name: "Namco / Sega / Nintendo - Triforce (Dolphin Triforce)" cores: diff --git a/emulators/uae4arm.yml b/emulators/uae4arm.yml index a2561b38..cbd2b97d 100644 --- a/emulators/uae4arm.yml +++ b/emulators/uae4arm.yml @@ -6,6 +6,7 @@ source: "https://github.com/libretro/uae4arm-libretro" upstream: "https://github.com/PandTomB/uae4arm" profiled_date: "2026-03-25" source_commit: "26f444f01771f0dfa2fa652906ff8222e92e476e" +upstream_commit: "161ddbaafe90a9747e9fb9c65ee4f38c163f335e" core_version: "v0.5" display_name: "Commodore - Amiga (UAE4ARM)" systems: diff --git a/emulators/ume2015.yml b/emulators/ume2015.yml index 71eea26e..8a94a11f 100644 --- a/emulators/ume2015.yml +++ b/emulators/ume2015.yml @@ -6,6 +6,7 @@ upstream: "https://github.com/mamedev/mame/tree/mame0159" logo: "https://raw.githubusercontent.com/mamedev/mame/master/docs/source/images/MAMElogo.svg" profiled_date: "2026-03-25" source_commit: "7adbf440d5f554097f58f8c6ebb673adc4320a31" +upstream_commit: "6ae44e46f91aa2bd74d9895e6bfd345baebd3d22" core_version: "0.159" display_name: "Multi (UME 2015)" mame_version: "0.159" diff --git a/scripts/profile_sync.py b/scripts/profile_sync.py index b91627d1..743829d4 100644 --- a/scripts/profile_sync.py +++ b/scripts/profile_sync.py @@ -936,6 +936,9 @@ class ProfileReport: upstream_pin: str | None = None upstream_head: str | None = None upstream_origin: str | None = None + # The release tag the upstream view is pinned on, when it is one. That + # view is read at its tag, and a bump leaves upstream_commit there. + upstream_tag: str | None = None # Repositories whose pin is no ancestor of the branch the profile # tracks: history was rewritten, or the pin lies on another branch. orphaned: list[str] = field(default_factory=list) @@ -1291,7 +1294,23 @@ def detect_pinned_tag( The declared `core_version` names the tag, which is looked up by name so that a repository publishing nightly tags cannot hide an old release behind pagination. + + Only the repository of the documented build freezes the profile. An + `upstream` a port was cut from sits on a release tag as its base + (GroovyMAME on mame0289, triforce on Dolphin 2407) while the port itself + keeps moving: that view is judged against its tag by `tag_pinned_views`, + and the port is still compared with its HEAD and still bumped. """ + documented = [view for view in views if view.field != "upstream"] or views + tagged = tag_pinned_views(profile, documented, cache_dir, offline) + return next(iter(tagged.values()), None) + + +def tag_pinned_views( + profile: dict, views: list[RepoView], cache_dir: str, offline: bool +) -> dict[tuple[str, str], str]: + """Views whose pin is the tag `core_version` names, keyed by repository.""" + tagged: dict[tuple[str, str], str] = {} for view in views: if view.pin == view.head: continue @@ -1299,8 +1318,9 @@ def detect_pinned_tag( profile.get("core_version"), view.repo.name ): if upstream.tag_commit(view.repo, tag, cache_dir, offline) == view.pin: - return tag - return None + tagged[(view.repo.host, view.repo.slug)] = tag + break + return tagged def _resolve_project_words( @@ -1484,12 +1504,27 @@ def build_report( report.pinned_tag = frozen or detect_pinned_tag( profile, views, cache_dir, offline ) + # A repository pinned on its release tag is read at that tag, whichever + # role it plays: comparing mame0174 refs with mamedev HEAD says nothing. + tagged = tag_pinned_views(profile, views, cache_dir, offline) + report.upstream_tag = next( + ( + tagged[(view.repo.host, view.repo.slug)] + for view in views + if view.field == "upstream" and (view.repo.host, view.repo.slug) in tagged + ), + None, + ) + + def on_own_revision(view: RepoView) -> bool: + return view.pin == view.head or (view.repo.host, view.repo.slug) in tagged + if not report.pinned_tag: # A tag or a held pin is off the tracked branch by design. report.orphaned = [ f"{view.repo.slug}: pin {view.pin[:8]} is no ancestor of {view.head[:8]}" for view in views - if view.pin != view.head + if not on_own_revision(view) and upstream.compare( view.repo, view.pin, view.head, cache_dir, offline ).diverged @@ -1842,9 +1877,9 @@ def build_report( if report.pinned_tag: return True if not part.role and len(path_roles.get(part.path, ())) > 1: - return all(view.pin == view.head for view in views) + return all(on_own_revision(view) for view in views) view, _ = resolve_path(part.path, part.start, tuple(tokens), role_of(part)) - return view.pin == view.head + return on_own_revision(view) def judge( part: RefPart, flag: bool, tokens: Sequence[str], hashes: Sequence[str] @@ -1877,7 +1912,7 @@ def build_report( # port's 305-356 read past the end of the upstream's 345 # lines. As in a comparison, a ref fails only everywhere. for view in views: - if view is owner or view.pin != view.head: + if view is owner or not on_own_revision(view): continue lines = fetch_from(view.repo, view.pin, part.path) if lines is None: @@ -1994,6 +2029,11 @@ def format_report(report: ProfileReport, changed_only: bool = False) -> str: ) elif report.pin and report.pin == report.head: lines.append(" pin is HEAD: checked for self-consistency") + if report.upstream_tag and not report.pinned_tag: + lines.append( + f" upstream pinned to tag {report.upstream_tag}: checked against " + "its own revision, not against HEAD" + ) for url in report.unread or []: lines.append(f" not read (unsupported host): {url}") for line in report.orphaned: @@ -2837,8 +2877,12 @@ def bump_commit( file=sys.stderr, ) return False + # An upstream pinned on a release tag is the base the port was cut from: + # its HEAD is another program, so the bump leaves it on the tag. upstream_moves = bool( - report.upstream_head and report.upstream_pin != report.upstream_head + report.upstream_head + and report.upstream_pin != report.upstream_head + and not report.upstream_tag ) if document.get("source_commit") == report.head and not upstream_moves: # Rewriting the pin to the value it already holds is not a bump, and diff --git a/tests/test_profile_sync.py b/tests/test_profile_sync.py index dd69ddb3..d1be83f8 100644 --- a/tests/test_profile_sync.py +++ b/tests/test_profile_sync.py @@ -1691,6 +1691,49 @@ class TestBuildReport(unittest.TestCase): report = build_report("test", self._versioned("v0.78"), self.dir) self.assertEqual(report.pinned_tag, "0.78") + def test_an_upstream_on_its_release_tag_does_not_freeze_the_port(self): + """GroovyMAME declares 0.289 and its upstream_commit is the mame0289 + tag. Reading that as a frozen profile stopped every comparison and + bump of the port, which keeps moving. The upstream is read at its tag, + the port against its HEAD.""" + self.files[("portpin", "src/p.c")] = ["x", "load p.bin", "y"] + self.files[("porthead", "src/p.c")] = ["x", "load p.bin", "y"] + self.files[("uppin", "src/u.c")] = ["x", "ROM_LOAD(u.bin)", "y"] + self.files[("uphead", "src/u.c")] = ["x", "", "", "", "y"] + heads = {"o/port": "porthead", "o/up": "uphead"} + profile_sync.upstream.resolve_head = ( + lambda repo, cache, offline=False, branch=None: heads[repo.slug] + ) + # A tag off the tracked branch is not an orphaned pin. + profile_sync.upstream.compare = ( + lambda repo, base, head, cache_dir, offline=False: CompareResult( + [], False, repo.slug == "o/up" + ) + ) + self.tag_commits = {"0.289": "uppin"} + profile = { + "emulator": "Port", + "source": "https://github.com/o/port", + "upstream": "https://github.com/o/up", + "source_commit": "portpin", + "upstream_commit": "uppin", + "core_version": "0.289", + "files": [ + {"name": "p.bin", "source_ref": "source src/p.c:2"}, + {"name": "u.bin", "source_ref": "upstream src/u.c:2"}, + ], + } + report = build_report("port", profile, self.dir) + self.assertIsNone(report.pinned_tag) + self.assertEqual(report.upstream_tag, "0.289") + self.assertEqual(report.orphaned, []) + self.assertEqual( + [entry.status for entry in report.entries], ["ANCHORED", "ANCHORED"] + ) + self.assertIn( + "upstream pinned to tag 0.289", profile_sync.format_report(report) + ) + def test_a_tag_pointing_elsewhere_is_not_flagged(self): self.files[("pinsha", "a.c")] = ["x", "hit"] self.files[("headsha", "a.c")] = ["x", "hit"] @@ -2943,6 +2986,24 @@ class TestBumpCommit(unittest.TestCase): self.assertEqual(rebase_refs(self.path, report), ["a.c:10-12 -> a.c:30-32"]) self.assertTrue(bump_commit(self.path, report)) + def test_an_upstream_on_its_release_tag_stays_there(self): + """GroovyMAME's upstream_commit is the mame0289 tag it merged: a bump + of the port must not carry it to mamedev HEAD, another program.""" + part = PartResult( + RefPart("a.c", 10, 12, "a.c:10-12"), "ANCHORED", None, 10, 12, [] + ) + report = ProfileReport( + name="p", repo="o/n", pin="pin", head="newhead", + entries=[EntryReport("a.bin", "a.c:10-12", "ANCHORED", [part])], + counts={"ANCHORED": 1}, + upstream_pin="uptag", upstream_head="uphead", + upstream_origin="upstream_commit", upstream_tag="mame0289", + ) + self.assertTrue(bump_commit(self.path, report)) + written = yaml.safe_load(self.path.read_text()) + self.assertEqual(written["source_commit"], "newhead") + self.assertNotIn("upstream_commit", written) + def test_upstream_pin_moves_with_source_pin(self): """A recale onto upstream HEAD lines must advance upstream_commit too.""" part = PartResult( diff --git a/wiki/profiling.md b/wiki/profiling.md index 6684eb45..809d79f3 100644 --- a/wiki/profiling.md +++ b/wiki/profiling.md @@ -301,7 +301,10 @@ only hold at one revision, so a few rules keep them checkable. it. - **A frozen line is pinned to its tag.** A profile documenting a release that lives as a tag in a still active repository (`pcsx2-legacy` at PCSX2 v1.6.0) - is checked against its own revision and never rebased onto the head. + is checked against its own revision and never rebased onto the head. An + `upstream` whose pin is the tag `core_version` names (GroovyMAME's base, + `mame0289`) is read at that tag the same way, while the port itself is still + compared with its head, and a bump leaves `upstream_commit` on the tag. - **A fork's base comes from the forge.** `upstream_commit` of a fork is the merge base the compare API returns. A vendored `version.h` can name the project the fork once came from. When a package ships prebuilt binaries