diff --git a/emulators/lexaloffle.yml b/emulators/lexaloffle.yml index bf9e01264..2a61c6bf0 100644 --- a/emulators/lexaloffle.yml +++ b/emulators/lexaloffle.yml @@ -1,11 +1,16 @@ emulator: Lexaloffle type: standalone upstream: "https://www.lexaloffle.com/" -profiled_date: "2026-03-26" -core_version: null +profiled_date: "2026-11-09" +core_version: "0.2.7" version_basis: - kind: unverified - why: no_artifact + kind: package + url: "https://web.archive.org/web/20260105092803id_/https://www.lexaloffle.com/dl/7wdekp/pico-8_0.2.7_raspi.zip" + pattern: 'pico-8_([0-9.]+[a-z]?)_raspi\.zip' + artifact: "pico-8_0.2.7_raspi.zip and pico-8_0.2.7_amd64.zip, version string pico-8 0.2.7 in every binary" +version_source: + url: "https://www.lexaloffle.com/dl/docs/pico-8_changelog.txt" + pattern: '^\s*v(0\.\d+\.\d+[a-z]?)\s*$' display_name: "Lexaloffle - PICO-8 / Voxatron" cores: - lexaloffle @@ -20,48 +25,158 @@ systems: - voxatron notes: | - Commercial fantasy consoles by Lexaloffle Games LLP. Closed-source binaries - distributed as ZIP archives from lexaloffle.com (requires purchase). + Commercial fantasy consoles by Lexaloffle Games LLP, sold as ZIP archives + per platform. Nothing in either program checks a hash of its own files: + the hashes below are those of the files in the official 0.2.7 archives. - Batocera configgen (lexaloffleGenerator.py) handles both systems via a single - generator. PICO-8: binary at bios/pico-8/pico8. Voxatron: binary at - bios/voxatron/vox. Generator checks binary existence and executable permission, - raises BatoceraException if missing. LD_LIBRARY_PATH set to the BIOS directory - for shared library resolution. + PICO-8 0.2.7 ships five archives. pico-8_0.2.7_amd64.zip holds pico8 + (x86_64, SDL2 linked in) and pico8_dyn (x86_64, system libSDL2). + pico-8_0.2.7_raspi.zip holds pico8 (armhf, SDL2 linked in, needs the + Raspberry Pi libbcm_host.so), pico8_dyn (armhf, system libSDL2), pico8_gpio + (armhf, needs libbcm_host.so and libwiringPi.so) and pico8_64 (aarch64, + system libSDL2). pico-8_0.2.7_i386.zip holds pico8_32bit and + pico8_32bit_dyn, pico-8_0.2.7_windows.zip holds pico8.exe and + pico-8_0.2.7_osx.zip holds PICO-8.app. Each binary opens pico8.dat from its + own folder, and pico8.dat is the same file in every archive of one version. + The amd64 and raspi archives carry pico8.dat 10b39730, byte for byte. - Each distribution ships a statically linked binary (pico8/vox) and a dynamically - linked variant (pico8_dyn/vox_dyn). Batocera uses the static binary. The .dat - file is loaded at startup and contains boot sequence, themes, and internal data. + Launchers by platform, each read at the revision the platform file pins: + - Batocera lexaloffleGenerator.py runs bios/pico-8/pico8 and raises when it + is missing or not executable, with LD_LIBRARY_PATH set to bios/pico-8. + The name is fixed for every board: an x86_64 board needs the amd64 pico8, + a Raspberry Pi 32-bit board the raspi pico8, an aarch64 board pico8_64 + renamed. + - KNULLI knulli-install-pico8 unzips the raspi archive from roms/pico8, + stops when pico8_64, pico8_dyn, pico8_gpio or pico8.dat is missing, moves + pico8_64 to bios/pico-8/pico8 and the other three beside it. Its + lexaloffleGenerator.py runs bios/pico-8/pico8 with no LD_LIBRARY_PATH. + The RG35XX simplermenu launcher runs pico8_dyn. + - Recalbox pico8Generator.py moves bios/pico-8 to /overlay/emulator/pico-8 + and renames pico8_64 to pico8 there, then runs it. + - ROCKNIX start_pico8.sh runs roms/pico-8/pico8_64 on aarch64 and + roms/pico-8/pico8_dyn on any other HW_ARCH, from roms/pico-8// + when that folder exists. ROCKNIX reads nothing from bios/. + - AmberELEC pico-8.sh runs roms/pico-8/pico8_64 and shows "Missing Pico-8 + binaries!" when pico8_64 or pico8.dat is absent. + - EmuELEC pico8.sh copies roms/bios/pico-8/* to /emuelec/bin/pico-8 on the + next start and runs pico8_dyn from there, with no existence check. + - RetroDECK component_launcher.sh executes bios/pico-8/pico8, and its + component_manifest.json lists pico8, pico8.dat and pico8_dyn as required. + - RetroBat Pico8.Generator.cs runs pico8.exe from the folder its config + names pico8 and returns nothing when pico8.exe is absent. That folder is + an emulator install, outside the BIOS tree, so no entry below targets it. + - ArkOS (dArkOS pico8/pico8.sh) prefers roms/pico-8/pico8_64, then + roms/pico-8/pico8_dyn, then extracts pico8_64 and pico8.dat from a + *raspi.zip in that folder, and starts Fake08 when the binary or + pico8.dat is still missing. + - ES-DE es_find_rules.xml looks for pico8_64 under ~/Applications/pico-8 + and three other home folders on linuxarm, pico8 on linux and unix, and + pico8.exe on Windows. - PICO-8 supports x86_64 and ARM (Raspberry Pi). Voxatron x86_64 only. - Voxatron depends on libHoloPlayCore.so (Looking Glass SDK), compile-time linked. + Voxatron: Batocera's generator runs bios/voxatron/vox with + LD_LIBRARY_PATH set to bios/voxatron. x86_64 only. vox_dyn is the + variant linked against the system SDL2. libHoloPlayCore.so is the Looking + Glass SDK the binary links against. files: # ------------------------------------------------------- - # PICO-8 + # PICO-8 0.2.7 # ------------------------------------------------------- - name: pico8 path: pico-8/pico8 system: pico8 required: true - description: "PICO-8 main executable (statically linked)" - source_ref: "lexaloffleGenerator.py:17,36,48-49" - note: "Configgen checks existence and executable permission" + unread_on: [amberelec, emuelec, knulli, recalbox, retrobat, rocknix] + size: 9425408 + md5: 0d127838e79459da4ae36bb8b2e576ca + sha1: 1843e82abc1d068d7602d3ac135b6ad72aaf6c0a + description: "PICO-8 0.2.7 x86_64 executable, SDL2 linked in" + note: "The pico8 of pico-8_0.2.7_amd64.zip, an x86_64 ELF that loads no libSDL2. Batocera runs it on x86_64 boards and raises when it is missing or not executable. RetroDECK executes the same path." + source_ref: "batocera lexaloffleGenerator.py:17, 37, 48-52, 87-90, RetroDECK pico-8/component_launcher.sh:3, RetroDECK pico-8/component_manifest.json:12-17" + + - name: pico8 + path: pico-8/pico8 + system: pico8 + required: true + unread_on: [amberelec, emuelec, knulli, recalbox, retrobat, retrodeck, rocknix] + size: 7895320 + md5: 21d4c4c6d9da8fc2c81aa7a844edee96 + sha1: 946db0633966afecf81d2b33957c7db8fb3a2356 + description: "PICO-8 0.2.7 armhf executable, SDL2 linked in" + note: "The pico8 of pico-8_0.2.7_raspi.zip, a 32-bit ARM ELF that needs libbcm_host.so, so it runs on Raspberry Pi firmware only. Batocera's fixed path is the one a 32-bit Raspberry Pi board (bcm2835, bcm2836) can run." + source_ref: "batocera lexaloffleGenerator.py:17, 48-52" + + - name: pico8 + path: pico-8/pico8 + system: pico8 + required: true + unread_on: [amberelec, emuelec, recalbox, retrobat, retrodeck, rocknix] + size: 1640888 + md5: 70ab37eab4e7d162d36d9b2d91b84867 + sha1: 4ed23b6578a2d93d67aa856791dc70e95d68a3f4 + description: "PICO-8 0.2.7 aarch64 executable (pico8_64) under the name pico8" + note: "The pico8_64 of pico-8_0.2.7_raspi.zip, at the pico8 path. KNULLI's installer moves pico8_64 there and its generator runs it, with no check of the bytes. An aarch64 Batocera board needs the same file at the same path." + source_ref: "knulli board/fsoverlay/usr/bin/knulli-install-pico8:8, 33-36, 66, 73, knulli lexaloffleGenerator.py:20, 54-59, batocera lexaloffleGenerator.py:17" + + - name: pico8_64 + path: pico-8/pico8_64 + system: pico8 + required: true + unread_on: [batocera, emuelec, knulli, retrobat, retrodeck] + size: 1640888 + md5: 70ab37eab4e7d162d36d9b2d91b84867 + sha1: 4ed23b6578a2d93d67aa856791dc70e95d68a3f4 + description: "PICO-8 0.2.7 aarch64 executable, system libSDL2" + note: "Only in pico-8_0.2.7_raspi.zip. AmberELEC and ROCKNIX run it from roms/pico-8/, not from bios/. AmberELEC stops with a message when it is missing. ROCKNIX picks it when HW_ARCH is aarch64. Recalbox renames bios/pico-8/pico8_64 to pico8 before the first run, and a missing file fails the rename." + source_ref: "amberelec packages/amberelec/sources/pico-8.sh:51-54, amberelec packages/amberelec/sources/scripts/runemu.py:123, rocknix projects/ROCKNIX/packages/emulators/standalone/pico-8/scripts/start_pico8.sh:8-17, 35-40, 46-47, recalbox projects/configgen/configgen/generators/pico8/pico8Generator.py:14-19, dArkOS pico8/pico8.sh:47-60, 128-135" - name: pico8_dyn path: pico-8/pico8_dyn system: pico8 required: false - description: "PICO-8 dynamically linked executable" - source_ref: "lexaloffleGenerator.py:17,36" - note: "Alternative to pico8. Requires system SDL2. Some platforms prefer this variant." + unread_on: [amberelec, emuelec, knulli, recalbox, retrobat, rocknix] + size: 1805928 + md5: 724435a9e6f3ef8a55c648fc88651826 + sha1: 9b2e573250c70382b4071709a85c8d56c0371d59 + description: "PICO-8 0.2.7 x86_64 executable, system libSDL2" + note: "The pico8_dyn of pico-8_0.2.7_amd64.zip. RetroDECK lists it as required in its manifest, but its launcher executes pico8 only. Batocera never runs it." + source_ref: "RetroDECK pico-8/component_manifest.json:26-32, RetroDECK pico-8/component_launcher.sh:3" + + - name: pico8_dyn + path: pico-8/pico8_dyn + system: pico8 + required: true + unread_on: [amberelec, batocera, recalbox, retrobat, retrodeck, rocknix] + size: 1452936 + md5: 867701eff7e82a91985ae1fbe90dbc4a + sha1: 87ef68e70c53ba209e697bb51de45826e982d92d + description: "PICO-8 0.2.7 armhf executable, system libSDL2" + note: "The pico8_dyn of pico-8_0.2.7_raspi.zip. EmuELEC copies bios/pico-8 to /emuelec/bin/pico-8 and runs pico8_dyn with no existence check. KNULLI's installer stops when the archive lacks it and moves it to bios/pico-8, and the RG35XX simplermenu launcher runs it. ROCKNIX runs a pico8_dyn from roms/pico-8/ on a HW_ARCH other than aarch64, and ArkOS falls back to it when pico8_64 is absent." + source_ref: "emuelec packages/sx05re/emuelec/bin/pico8.sh:9-14, 39-43, knulli board/fsoverlay/usr/bin/knulli-install-pico8:9, 38-41, 67, knulli board/actions/atm7039/rg35xx/fsoverlay/usr/share/knulli/datainit/system/configs/simplermenu_plus/launchers/pico8_sa:3, rocknix projects/ROCKNIX/packages/emulators/standalone/pico-8/scripts/start_pico8.sh:14-16, dArkOS pico8/pico8.sh:49-50" + + - name: pico8_gpio + path: pico-8/pico8_gpio + system: pico8 + required: false + unread_on: [amberelec, batocera, emuelec, recalbox, retrobat, retrodeck, rocknix] + size: 7898704 + md5: 286ab30756dfc40749ecd72221f0d063 + sha1: df77c64c95695710d23b451277325e0c37e7416e + description: "PICO-8 0.2.7 armhf executable with GPIO access (wiringPi)" + note: "Only in pico-8_0.2.7_raspi.zip. KNULLI's installer stops when the archive lacks it and moves it to bios/pico-8, but no launcher runs it." + source_ref: "knulli board/fsoverlay/usr/bin/knulli-install-pico8:10, 43-46, 68" - name: pico8.dat path: pico-8/pico8.dat system: pico8 required: true - description: "PICO-8 data file (boot sequence, themes, demo carts)" - note: "POD format. Loaded by pico8/pico8_dyn from same directory at startup." + unread_on: [retrobat] + size: 11243101 + md5: 10b397305093c80109096319a538ba56 + sha1: 0f92093752bddb12210c7db6d93af3ba2413cfce + description: "PICO-8 0.2.7 data file (boot sequence, themes, demo carts)" + note: "Opened from the folder of the binary that runs, and paired with the binary's own version. Identical in pico-8_0.2.7_amd64.zip and pico-8_0.2.7_raspi.zip. AmberELEC and ArkOS refuse to start PICO-8 without it. KNULLI's installer stops when the archive lacks it." + source_ref: "amberelec packages/amberelec/sources/pico-8.sh:51-52, dArkOS pico8/pico8.sh:136-142, knulli board/fsoverlay/usr/bin/knulli-install-pico8:11, 48-51, 69" # ------------------------------------------------------- # Voxatron @@ -71,7 +186,7 @@ files: system: voxatron required: true description: "Voxatron main executable" - source_ref: "lexaloffleGenerator.py:20,42,48-49" + source_ref: "batocera lexaloffleGenerator.py:20, 42, 48-52" note: "Configgen checks existence and executable permission. x86_64 only." - name: vox_dyn @@ -79,7 +194,7 @@ files: system: voxatron required: false description: "Voxatron dynamically linked executable" - source_ref: "lexaloffleGenerator.py:20,42" + source_ref: "batocera lexaloffleGenerator.py:20, 42" note: "Alternative to vox. Requires system SDL2." - name: vox.dat @@ -94,5 +209,5 @@ files: system: voxatron required: true description: "Looking Glass holographic display support library" - source_ref: "lexaloffleGenerator.py:89" + source_ref: "batocera lexaloffleGenerator.py:41, 87-90" note: "Compile-time linked dependency. LD_LIBRARY_PATH set to bios/voxatron/ by configgen."