Releases: axgdev/UniFrog
Release list
v0.5.2
v0.5.1
What's Changed
Fix heavy auto-save feature
Fix media sometimes not having progress bar
Fix media seeking algorithm
Playing audio displays current play time and total audio time
Remove PMP player, native player plays many formats including MP4, and many audio formats
Remove stale JS frontend code
Quick menu is native, remove js implementation
Add new option for media player as the top app
There are many improvements that need to be done for file navigation.
Full Changelog: v0.5.0...v0.5.1
v0.5.0
Unifrog v0.5.0
Release notes for changes since v0.4.4.
Highlights
- More reliable media playback and seeking, especially when skipping through videos.
- Major GB300 audio routing repairs with fewer playback stalls and fallback failures.
- Better frontend, theme, and media-browsing behavior across the native UI.
User Notes
- Install common MuOS
.muxthmtheme archives through the frontend theme menu; UniFrog includes fallback launcher icons when a theme omits them. - For simple color tweaks, place
/unifrog/theme.inion the SD card with the same keys as the default theme. - To play a video, browse to the file in Explore and open it. Supported video types include
avi,mp4,mov,mkv,ts,m2ts,mpg,mpeg,h264, and264. - The same media browser also opens audio and image files, including
mp3,wav,flac,ogg,opus,aac,adts,m4a,jpg,jpeg,png,gif, andbmp. - Video seeking is now much steadier and less likely to lose the current frame.
- Audio playback on GB300 is significantly more dependable.
- The native frontend loads, navigates, and recovers more cleanly.
- Media browsing and theme handling are smoother and more consistent.
Technical Notes
- Updated the
unifrog-hcrtos-sdksubmodule onmain. - Media playback and seek handling were reworked across the stack:
- gated seeks on keyframes,
- preserved the current frame during fast seeks,
- stabilized repeated seek recovery and catch-up timing,
- restored the legacy SF2000 hardware seek path,
- recovered SF2000 video after
auddecconflicts, - tuned feed lead, pacing, buffering, and cache behavior,
- suspended disk logging during media reads,
- routed software video through
vidsink, - avoided
hcplayervideo paths where needed, - restored media routing and handoff stability,
- hardened H264 hardware decode, parser, init, and packet timing paths,
- aligned HCRTOS FFmpeg ABI and allocation assumptions with the native media code.
- GB300 audio routing was repaired and instrumented:
- restored direct SND, I2SO, audsink, and release audio paths,
- restored hardware
auddecplayback and AAC clock handling, - stabilized fallback behavior when
auddecstalls, - gated audio handling on real PCM,
- fixed frame routing and mono output behavior,
- kept fastboot off speaker pins,
- coalesced PCM writes,
- added stronger diagnostics and build-identity tracking for audio control flow.
- Frontend and theme handling were tightened:
- recovered the native frontend baseline and launch settings,
- restored open-with flow, loading feedback, refresh behavior, and pause menu sections,
- improved launcher and theme layout handling,
- fixed fullscreen themes, audio fallbacks, row rendering, and value contrast,
- improved theme extraction, install pressure, font spacing, and navigation diagnostics,
- refined ROM root and system mapping logic,
- improved media fallback, ROM core selection, and media diagnostics.
- Native media startup and diagnostics were made more predictable:
- stabilized startup and handoff ordering,
- fixed FFmpeg header and ABI integration,
- improved media object ordering,
- reduced warning noise in FFmpeg dependency integration,
- expanded decode diagnostics and storage-suspend handling,
- restored KSHM viddec init and extradata paths,
- fixed native video decoder startup ordering and frame progression.
This release is focused on making playback, seeking, and audio routing dependable for daily use while keeping the native frontend and theme stack usable across SF2000 and GB300 targets
Full Changelog: v0.4.4...v0.5.0
Unifrog v0.4.4
For Users
Faster Startup and Easier Game Browsing
UniFrog no longer scans the whole SD card before the menu appears. The menu should become usable much sooner, especially on cards with large ROM collections.
Games are now discovered when you open a system instead of during boot. The default search roots are /ROMS and the SD-card root, so both layouts work:
/ROMS/gba/Game.gba
/gba/Game.gba
If you want to scan the whole card and build a saved library index, run Developer -> Index Library manually.
Default Firmware Boot Selection
The Firmware screen can now choose which firmware boots by default. Use SELECT on a firmware entry to make it the default boot target. Select the default row again to return the default to UniFrog.
Hold B during power-on to override the configured default and boot UniFrog. This override is filtered more carefully now, so accidental forced-UniFrog boots should be less likely on SF2000 and GB300-style input wiring.
Better In-Game Fast-Forward
The in-game quick menu now has fast-forward speed controls. Open the quick menu with SELECT+START, then use FF speed to cycle:
Off -> 2x -> 4x -> 8x -> 16x
For GBA cores, the quick menu can also adjust frameskip. Fast-forward now keeps the display responsive instead of leaving stale quick-menu pixels on screen.
New GBA Core Option
GBA launches now include gpsp-gbac-prosty, a packaged gpSP multicore fork for Game Boy Advance games. If a GBA game has problems or performance differences with the regular gpSP core, try this alternate core from the launch options.
Audio Improvements
Audio output is quieter and more predictable. UniFrog now uses the confirmed SF2000 mono audio route, hardware mute/volume controls, and fixed 1x software gain. Old saved gain settings are ignored, and the user-facing gain option has been removed.
Video and Media Playback Fixes
MP4 playback has been hardened around loading, display setup, and failure handling. Firmware-linked media playback is the default path. SD-loaded media module builds still package the media module for diagnostics, but they now refuse unsafe MP4 playback instead of entering a known black-screen path.
License Notices Included
The SD-card package now includes:
/unifrog/LICENSE.txt
/unifrog/THIRD_PARTY.md
These files document UniFrog's license and the third-party components included in the distributed package.
For Technical Maintainers
Build and Packaging
- Added
THIRD_PARTY.mdwith the third-party source, binary, SDK, asset, and core-module inventory. frontend-packagenow treatsLICENSEandTHIRD_PARTY.mdas inputs and installs them as/unifrog/LICENSE.txtand/unifrog/THIRD_PARTY.md.checkandfastboot-checkassert that the packaged notice files exist.- Ignored local SD-card package, release zip, and toolchain artifacts.
- The SD-card zip workflow now checks out the triggering ref and verifies
HEAD == GITHUB_SHAbefore building release artifacts.
Fastboot and Firmware Selection
- Added
firmware/boot_asd.cfghandling in fastboot stage-1 for a validated default ASD boot target. - Added frontend firmware-list actions for viewing, setting, and clearing the default firmware.
- Added one-shot handoff priority over button override so menu-launched stock firmware is not cancelled by a still-held input.
- Tightened boot override to B only, with separate SF2000 and GB300 scan paths, saturated-read filtering, stable-poll checks, and trace codes for default config failures.
Frontend Library Discovery
- Removed boot-time and delayed automatic index loading from the normal startup path.
- Added lazy ROM and media folder discovery using configurable
rom_roots. - Added packaged
frontend/defaults/frontend.opt, includingrom_roots,auto_index=0, andfast_sd=uhs25. - System entries avoid stale zero counts when startup indexing is intentionally skipped.
- The visible Auto index setting was removed from the normal settings list.
Libretro Cores and Fast-Forward
- Added the pinned
gpsp_multicorecheckout and build wrapper. - Applied SF2000 gpSP safety hooks to
gpsp_multicore: in-memory content loading, ROM-buffer loading, long-load progress, reset progress, and MIPS dynarec guards. - Renamed the packaged multicore GBA module to
gpsp-gbac-prostyand updated frontend catalog, smoke checks, host option handling, docs, and notices. - Reworked fast-forward host behavior:
- advertises skippable A/V while fast-forward is active,
- bypasses frame pacing,
- suppresses audio status during fast-forward,
- throttles presentation instead of dropping every presented frame,
- exposes speed and frameskip through quick-menu actions,
- maps gpSP fast-forward speed to temporary frameskip intervals.
Audio Runtime
- Added hardware SND volume/mute control before opening the external speaker gate.
- Restored the confirmed one-channel SF2000 mono route and removed user-facing software gain.
- Libretro host now clamps stale launch gain to 1x.
- Media and libretro audio paths refresh the audio platform and I2SO route before enabling output.
- Core-reported sample rates in the safe 8-48 kHz range are used directly instead of forcing all cores through a fixed 32 kHz resampler.
Media Playback
- Default
HCRTOS_MEDIAis firmware-linked again; module mode remains for loader diagnostics becausehcplayer_create()can stall from the SD-loaded module path. - Unsafe media-module playback is blocked with a visible failure path and log entry.
- Media startup now keeps a loading screen visible, closes the frontend framebuffer only at the controlled handoff point, and avoids redrawing the boot logo on return.
- Restored the confirmed SF2000 media geometry: LCD is 320x240, while HCRTOS video output uses the HD plane with a 1920x1080 display rectangle.
- Added on-demand media driver initialization, URI playback fallback, cached read/seek callbacks with
AVSEEK_SIZE, and more detailedhcplayer_*boundary logging.
Diagnostics and Crash Handling
- Added retained exception records in the fastboot handoff memory area for cause, EPC, BADV, and RA.
- Panic paths now log exception details before drawing the panic screen and arm the watchdog before reset.
- Boot logs report and clear retained exception records after log reset.
- JS2300 allocation and runtime alignment diagnostics were added for future MIPS alignment-fault analysis.
Documentation
- Updated README, AGENTS notes, architecture docs, performance notes, hardware findings, frontend docs, libretro core quirks, and cores README for the new boot, discovery, media, audio, fast-forward, and license behaviors.
Verification Noted During Development
The range includes commits verified with combinations of:
make
make quick-check
make verify
make layout-check
make -C cores gpsp_multicore
make -C cores update-core CORE=gpsp_multicore
make HCRTOS_MEDIA=module
make clean && make verifyFull Changelog: v0.4.3...v0.4.4
Unifrog v0.4.3-fixes-defaultboot
Same as v0.4.3-fixes plus:
Added a default firmware boot option: UniFrog now uses firmware/boot_asd.cfg to boot a selected .asd firmware by default. Hold any button during power-on to skip that default and boot UniFrog instead.
In UniFrog’s Firmware menu, press SELECT on a firmware to make it the default, or choose the UniFrog default row to clear it.
Full Changelog: v0.4.3-fixes...v0.4.3-fixes-defaultboot
Unifrog v0.4.3-fixes
Same as v0.4.3 plus:
- Add fast forward menu item to pause quick menu
- Safe 1-bit mode for loading frontend. Quick SD mode for loading ROMs and Media.
Full Changelog: v0.4.3...v0.4.3-fixes
Unifrog v0.4.3
Highlights
- Reworked the frontend into a JavaScript-first app with split modules for navigation, catalog handling, actions, settings, text, views, and theme data.
- Added the JavaScript quick menu and moved gameplay return flow into the JS frontend.
- Added native JS2300 frontend support, bytecode warmup/cache paths, and faster ZIP/catalog loading for quicker startup and relaunch.
- Added a full-screen UniFrog boot logo path, fast early display handoff, and stamped boot logo generation using the current tag or revision.
- Kept the boot logo visible until the first frontend frame to reduce blank screen time during startup.
- Added fastboot and early boot tracing for display, payload loading, and handoff diagnostics.
- Added guarded SD read windows, UHS profile testing, runtime SD diagnostics, full storage sweeps, and safer recovery for experimental SD modes.
- Moved HCRTOS media support to a native module by default and updated SD-card packaging to include the complete release layout.
- Improved libretro/core build handling with direct manifests, slimmer sparse checkouts, self-contained patches, dependency pin status/upgrade workflows, and a core smoke check in
make quick-check. - Tightened CI and local build entry points, including fresh dependency setup, toolchain caching, Alpine/tcc host checks, repository hygiene, and release zip packaging.
- Removed the normal build dependency on ImageMagick by teaching the boot logo tool to consume the committed PNG directly.
Build And Packaging
make quick-checknow includes repository hygiene, doctor, core smoke, JS2300, frontend, and boot logo checks.make verifyand release SD-card zip generation now exercise the complete firmware, module, frontend, layout, and packaging flow.- Dependency pins and upgrade policy are documented and exposed through Makefile targets.
- The SD-card package now installs firmware, modules, frontend assets, cores, and support files into the release layout.
Notes
- Default SDK media packaging keeps HCRTOS media as
/unifrog/modules/hcrtos-media.bin; useHCRTOS_MEDIA=firmwareonly for
fully linked diagnostics. - Default SD behavior keeps safe boot settings while allowing guarded faster read windows for frontend startup and runtime ROM reads.
- The boot logo is generated from
assets/boot/unifrog-logo.pngand stamped at build time, without requiringmagickin CI or local doctor checks.
Full Changelog: https://github.com/axgdev/UniFrog/commits/v0.4.3
v0.4.2
Users
Faster game library browsing
- Indexing large SD cards is much faster. The frontend now scans the card from native code and writes the game and media indexes directly, instead of doing the recursive scan in JavaScript.
- Opening a system with many games should be almost instant after the library has been indexed.
- The file browser is faster in large folders because directory listings avoid extra filesystem lookups when the device already reports whether an entry is a file or folder.
- The file browser can return more items per folder before hitting the frontend list cap.
More predictable large-library behavior
- Very large indexes are now capped deliberately and reported as truncated instead of silently producing index files the frontend cannot fully load.
- PlayStation track
.binfiles and legacy stub names continue to be hidden from the game list.
Build quality fixes
- The bundled libretro core build is quieter and cleaner, with warning fixes applied through local patches where needed.
Developers
Build workflow
- The main workflow is now:
make setupmakemake quick-checkmake verify
make helpandmake print-configare available at the root and in major components, so new developers can discover commands and resolved paths without reading the Makefiles.make quick-checkis the fast local gate. It runs repository hygiene checks,doctor, JS2300 checks, and frontend checks before the slower full firmware/core verification.make verifyremains the handoff gate.make ci-commit-checknow goes through the same early checks so CI fails quickly on cheap mistakes.
Repository and docs
- Stale planning and split-repository docs were removed.
- Root and component READMEs now focus on the current SDK, JS2300, frontend, and core layout.
AGENTS.mdnow matches the actual build contract and avoids obsolete instructions.docs/README.mdandcores/README.mdprovide lean maps for retained architecture notes and core workflow details.
Runtime and frontend internals
- JS2300 API version moved from
0.5.0to0.6.0. - Added
JS2300.fs.index(root, gameIndexPath, mediaIndexPath). - Native indexing streams directly to temporary index files and atomically renames them on success.
- Index scan limits are explicit:
- max depth: 12
- max files: 65535
- max dirs: 4096
- per-index text cap: just under 2 MiB
- The native scanner mirrors the frontend catalog order and keeps the JS fallback scanner in place.
JS2300.fs.list()now allocates its entry buffer on the heap, allowing the list cap to increase from 256 to 1024 without growing runtime stack usage.- Directory listing now uses
dirent.d_typewhen available and falls back tostat()only when needed. - The frontend builds per-system item arrays while parsing indexes, avoiding a full index walk every time a system is opened.
- Browser sorting now caches lowercase names and uses a shell sort instead of repeatedly lowercasing inside a quadratic compare loop.
Core warning cleanup
- External core warning suppressions were narrowed to the cores that need them.
- Added local patch coverage for Snes9x 2005, FCEUmm, and PMP video warning fixes.
- Added a zlib deflate compatibility include to avoid the HCRTOS/newlib
MINmacro collision without editing fetched dependency sources.
Verification
These checks passed for this release-note scope:
make quick-check
make verifyFull Changelog: v0.4.1...v0.4.2
Unifrog v0.4.1
UniFrog
UniFrog is a custom frontend/firmware environment for SF2000-family handhelds, with support for SF2000 and GB300 from the same SD card.
This release is still early. Expect bugs, crashes, and rough edges. Do not rely on it for long playthroughs or important saves yet. It is already useful, fast,
Thanks to all of the developers that made this possible: @bnister, @kobilutil, @feuerball11, @madcock, @Trademarked69, @tzubertowski, @angree, and many others that have pushed the limits of what's possible in the SF2000/GB300 devices family.
Installation
-
Download the UniFrog SD card zip from this release.
-
Extract the contents directly to the root of your SD card.
-
If you already have another
bisrv.asdon your card, back it up first. -
To make another firmware bootable from UniFrog, place its
bisrv.asdinside:/firmware/ -
Boot the device.
On first boot, open Index Library. UniFrog will scan the SD card, find supported games/media, and classify them by system.
Supported Devices
Tested:
- SF2000
- GB300
Possibly compatible but untested:
- DY19
- DY12
- Other SF2000-family devices
If you test one of these devices, please report whether it boots and whether display, audio, controls, and backlight work correctly.
Emulation Cores
UniFrog loads emulator cores from the SD card instead of baking them all into the main firmware binary.
Included cores:
- gpSP: Game Boy Advance
- Gambatte: Game Boy / Game Boy Color
- Gearboy: Game Boy / Game Boy Color
- Snes9x 2002: Super Nintendo
- Snes9x 2005: Super Nintendo
- QPSX: PlayStation
- FCEUmm: NES / Famicom
- QuickNES: NES / Famicom
- Beetle PCE Fast: PC Engine / TurboGrafx-16
- PicoDrive: Sega Genesis / Mega Drive / Master System / Game Gear
When opening a ROM, UniFrog can ask which compatible core to use. This is useful for systems with multiple emulator options, such as Game Boy or NES.
Game Library
UniFrog includes an indexed game library.
Use Index Library to scan the SD card. The indexer will classify games by system so you can browse them more easily instead of manually navigating folders
The scan is manual by default so the SD card is not stressed on every boot.
File Browser
A traditional file browser is still included.
You can open supported files directly, and UniFrog will suggest compatible cores or players.
Save Support
UniFrog supports:
- Save states
- Multiple save slots
- In-game saves, such as normal
.sav-style saves used by games like Pokemon - Pause menu actions for saving and loading
This is still experimental. Back up your saves.
Pause Menu
Press the configured pause combo during gameplay to open the quick menu.
From there you can:
- Resume the game
- Save state
- Load state
- Change save slot
- Return to the frontend
- Adjust display mode
- Toggle fast-forward
- Change performance/audio options
- Adjust backlight and other runtime settings
Display Options
Available display modes:
- Fit
- Original
- Stretch
These can be changed from the core options menu.
Performance Options
UniFrog exposes several runtime performance settings.
You can adjust:
- CPU frequency
- Graphical Engine frequency
- Audio on/off
- Frame skip mode
- Fast-forward
- Backlight brightness
Notes:
- Auto frameskip is available for all cores.
- Manual frameskip can be set to
0,1, or2. - Turning audio off can improve performance in heavier games.
- CPU speed can be adjusted at runtime.
- The Graphical Engine clock can also be changed, but higher is not always better. In testing,
198 MHzor even148 MHzcan perform better than higher setti - gpSP with auto frameskip can run games like Pokemon FireRed reasonably well even at lower CPU frequencies such as
198 MHz.
Backlight Control
Backlight adjustment is supported.
You can lower brightness all the way down to level 1, which makes the device much more comfortable to use at night.
Audio Options
Audio can be disabled for better performance.
Audio gain can also be adjusted, though most users should leave it low or at the default value.
Media Playback
UniFrog can play MP4 videos.
Video playback options include audio control, so videos without audio or videos played silently should avoid unnecessary speaker noise.
Firmware Booting
UniFrog can boot other compatible firmware releases.
Place another firmware file here:
/firmware/bisrv.asd
You can then launch it from the firmware menu.
This is useful if you want to keep stock firmware, multicore, or another setup available on the same SD card.
JavaScript Frontend
The frontend is written in JavaScript.
That means users can modify the interface, create themes, and experiment without rebuilding the whole firmware.
UniFrog also supports running JavaScript scripts from the developer/script menu, though this feature has not been heavily tested yet.
Themeability
The UI is designed to be hackable and themeable.
The goal is to make it possible for users to customize the frontend without needing to understand the lower-level firmware or emulator code.
Compressed ROMs
UniFrog includes support for loading compressed ROMs.
Supported compression/container formats include:
.zip.lz4.zstd
Performance varies depending on the core, ROM size, SD card, and compression format.
Known Issues
This is an early release and will have bugs.
Known rough areas:
- Some cores are still experimental.
- Some games may crash or hang.
- PlayStation support is early and may be unstable.
- JavaScript script support needs more testing.
- The UI is functional but still evolving.
- Save states and in-game saves should be backed up regularly.
- Some performance settings may help one core but hurt another.
Full Changelog: https://github.com/axgdev/UniFrog/commits/v0.4.1