Skip to content

v0.1.0 — VM manager UI + per-platform installers

Choose a tag to compare

@jroark jroark released this 23 May 05:42
· 132 commits to main since this release

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 holds config.json + nand.bin + optional cf*.bin + a
    screenshots/ folder.
  • .be300vm file association. On macOS the bundles register as a
    com.apple.package UTI 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.sh on a Linux host with linuxdeploy.
  • 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

  1. Install the package for your platform.
  2. Launch BE-300 from Launchpad / Start Menu. The manager window opens.
  3. Click + New VM, name it, pick your All_nand_300.bin NAND image
    (the binary is not redistributed — supply your own dump), accept the
    defaults, click Create.
  4. 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.
  5. Close the emulator window to return to the manager. Run it again to
    resume — NAND writes persist back to the bundle's nand.bin.

Source-side highlights

  • Dear ImGui (via third_party/cimgui + its imgui/ submodule) with
    the SDL2 + SDL_Renderer backend, wrapped in a small C++ shim
    (src/launcher/ui_imgui_backend.cpp); the rest of src/launcher/ is C.
  • Native file picker via nativefiledialog-extended
    (third_party/nfde).
  • JSON via vendored cJSON (third_party/cjson, MIT).
  • src/main.c filters macOS -psn_* LaunchServices args and dispatches
    to launcher_main() when argv is empty or carries a single
    .be300vm path.
  • src/ui.c no longer owns SDL_INIT_VIDEO unconditionally — 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.in
    • packaging/macos/icon.iconset/. Build with
      cmake --build build-host --target package_macos,
      then wrap into a .pkg via tools/build_macos_installer.sh.
  • Windows installer: packaging/windows/be300.nsi, called automatically
    by tools/build_windows.sh when makensis is on PATH.
    tools/cmake/windows-mingw-x86_64.cmake now discovers
    x86_64-w64-mingw32-g++ for the launcher's C++ deps.
  • New CTest target test_vm_config round-trips machine_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 PATH

Known limitations

  • macOS .pkg and 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 disable BUILD_LAUNCHER since they
    have their own frontends. Use the desktop binary for the VM manager.