Repository navigation
v0.1.0 — VM manager UI + per-platform installers
BE-300 Emulator v0.1.0
First release with a graphical VM manager and per-platform installers.
What's new
- VMware/UTM-style launcher opens when you double-click the app with no
arguments. Lists saved VMs, creates new ones via a wizard, edits them in
Settings, and runs them in-process by reusing the same SDL window. - VM bundles persist at
~/Library/Application Support/BE300/VMs/<name>.be300vm/on macOS,
$XDG_DATA_HOME/BE300/VMs/on Linux,%APPDATA%\BE300\VMs\on Windows.
Each bundle holdsconfig.json+nand.bin+ optionalcf*.bin+ a
screenshots/ folder. .be300vmfile association. On macOS the bundles register as a
com.apple.packageUTI so Finder shows them as single icons;
double-click runs that VM. On Windows the installer registers the same
thing in the registry.- Per-platform packaging: macOS
.pkg, Windows NSIS.exe. A Linux
AppImage script is in the tree but not built here — run
tools/build_linux_appimage.shon a Linux host withlinuxdeploy. - CLI behavior is unchanged. Every documented
--nand/--cf/
--ppsh/--rtc-host-time/--pcconnect-bridge/--serial?-bridge
/--stowaway-keyboard/--ne2000/--mmio-coverage/--detect-stall
flag still works exactly as before; the launcher is purely additive.
Downloads
| File | Platform | Notes |
|---|---|---|
BE300.pkg |
macOS (Apple Silicon) | Installs to /Applications/BE300.app. Unsigned — first launch: right-click the app → Open to dismiss the Gatekeeper warning. Tested on macOS 14 (Sonoma). |
be300-setup.exe |
Windows x86_64 | NSIS installer. Installs to Program Files\BE300, drops a Start Menu shortcut, registers .be300vm association. Cross-built with MinGW-w64; not yet tested on a clean Windows host. |
Quickstart
- Install the package for your platform.
- Launch BE-300 from Launchpad / Start Menu. The manager window opens.
- Click + New VM, name it, pick your
All_nand_300.binNAND image
(the binary is not redistributed — supply your own dump), accept the
defaults, click Create. - Click Run. The emulator window opens and boots WinCE 3.0 from the
ROM reset vector through SPL → NK decompression → into the GUI. The
first boot prompts for touchscreen calibration; tap each crosshair to
complete it. - Close the emulator window to return to the manager. Run it again to
resume — NAND writes persist back to the bundle'snand.bin.
Source-side highlights
- Dear ImGui (via
third_party/cimgui+ itsimgui/submodule) with
the SDL2 + SDL_Renderer backend, wrapped in a small C++ shim
(src/launcher/ui_imgui_backend.cpp); the rest ofsrc/launcher/is C. - Native file picker via
nativefiledialog-extended
(third_party/nfde). - JSON via vendored cJSON (
third_party/cjson, MIT). src/main.cfilters macOS-psn_*LaunchServices args and dispatches
tolauncher_main()when argv is empty or carries a single
.be300vmpath.src/ui.cno longer ownsSDL_INIT_VIDEOunconditionally — it only
tears down the subsystem if it was the one that initialized it,
so the launcher's session survives across emulator runs.- macOS bundling:
cmake/macos_bundle.cmake+packaging/macos/Info.plist.inpackaging/macos/icon.iconset/. Build with
cmake --build build-host --target package_macos,
then wrap into a.pkgviatools/build_macos_installer.sh.
- Windows installer:
packaging/windows/be300.nsi, called automatically
bytools/build_windows.shwhenmakensisis on PATH.
tools/cmake/windows-mingw-x86_64.cmakenow discovers
x86_64-w64-mingw32-g++for the launcher's C++ deps. - New CTest target
test_vm_configround-tripsmachine_config_t
through the on-disk JSON format and exercises bundle create/list/delete.
Build from source
git clone --recursive git@github.com:jroark/be300.git
cd be300
cmake -S . -B build-host
cmake --build build-host -j
# macOS installer
cmake --build build-host --target package_macos
./tools/build_macos_installer.sh # produces dist/BE300.pkg
# Windows installer (cross-build from macOS / Linux)
./tools/build_windows.sh # produces dist/be300-setup.exe
# dist/be300-windows-amd64.zip
# Linux AppImage
./tools/build_linux_appimage.sh # needs linuxdeploy on PATHKnown limitations
- macOS
.pkgand Windows installer are unsigned. Gatekeeper / SmartScreen
will warn on first launch. - Linux AppImage script is in-tree but not built/uploaded here.
- The web build (
tools/build_web.sh) and Android JNI library
(-DBUILD_ANDROID=ON) deliberately disableBUILD_LAUNCHERsince they
have their own frontends. Use the desktop binary for the VM manager.