This is a GUI for https://github.com/cdhooper/mx29f1615_programmer, a hardware/software solution to programm mx29f1615 flash. See the project description for details.
Those flash can be utilized in Amiga Computers and can easily hold 4 different Amiga ROM Images typically provided as .bin binaries.
The GUI allows for either .rom or .bin files which are correctly byte swapped given a .rom file. For composed banks: payloads up to 256kB are padded to 256kB and mirrored to 512kB; payloads above 256kB are padded with 0xFF up to 512kB. For Kickstart-like payloads, the ROM checksum longword is recalculated automatically (sum of 32-bit big-endian words over effective image equals 0xFFFFFFFF).
Empty Banks are filled with ff.
In each bank meter, a center marker indicates 256 KiB. Up to 256 KiB the mirrored area (256..512 KiB) is highlighted; above 256 KiB the consumed upper-half area is hatched as overflow/linear region.
Checksum handling while composing a bank follows the additive-complement method: checksum longword is zeroed for calculation and then set so the 32-bit BE sum over the effective image equals 0xFFFFFFFF.
Before writing, Kickstart-like images now also run a RomTag plausibility validation pass (rt_MatchTag self-pointer, rt_EndSkip forward/in-range, rt_Name pointer in-range) and log issues that would typically cause red-screen/HALT.
Preflight plausibility now also evaluates each loaded part against its current placement in the composed image (reacts to composition/order changes) and auto-moves __rom_header to the first position before writing.
Each programming step saves the current buffer with a timestamp. Images can also be read from a flash and saved to disk.
A new Import/Analyze ROM action can inspect a ROM, run sanity checks (including 2 MiB normalization/padding), compute SHA256 checksums, split it into 4 bank files, and additionally try to extract Kickstart-style functional components (RomTag scan, e.g. exec.library) into a components/ folder plus catalog.json for verification/reassembly workflows.
Component catalogs now also include a __rom_header block (bytes before first RomTag) to keep ROM vectors/startup prelude available for reassembly.
File names are not written to flash; only raw bytes are programmed.
ROM analysis/cataloging does not auto-populate GUI banks. Extracted component files are saved as .bin in canonical (non-swapped) byte order. For manual bank composition, .bin is kept as-is, while all non-.bin inputs (.rom, .library, .device, extensionless files, etc.) are byte-swapped on-the-fly before being placed in a bank.
A new Rebuild ROM from Catalog… action can rebuild a canonical ROM image from catalog.json + extracted component files and writes a fresh checksum for the rebuilt image.
Rebuild-from-catalog checksum finalization now follows effective Kickstart size semantics: mirrored 512 KiB images are finalized as 256 KiB (then mirrored), while linear 512 KiB images are finalized over full 512 KiB.
Component catalogs now also include a __rom_header block (bytes before first RomTag) to keep ROM vectors/startup prelude available for reassembly.
Component extraction now separates a valid trailing checksum longword into a dedicated __rom_checksum metadata component; this file is skipped during bank assembly because checksum is always recomputed for the final composed image.
File names are not written to flash; only raw bytes are programmed.
ROM analysis/cataloging does not auto-populate GUI banks. Extracted component files are saved as .bin in canonical (non-swapped) byte order. For manual bank composition, .rom is swapped and .bin is kept canonical (no heuristics).
The GUI includes most or all functions available in command line.
- mxprog installed (see above)
- CMake ≥ 3.21
- C++17-Compiler (GCC ≥ 9 oder Clang ≥ 10)
- Qt 6: Module Widgets und SerialPort
- (Ninja)
- (usbipd for WSL)
sudo apt update
sudo apt install -y build-essential cmake ninja-build qt6-base-dev qt6-base-dev-tools qt6-serialport-dev
(For wsl usbipd is needed for USB discovery, see https://learn.microsoft.com/en-us/windows/wsl/connect-usb)
sudo dnf install -y gcc-c++ cmake ninja-build qt6-qtbase-devel qt6-qtserialport-devel
sudo pacman -S --needed base-devel cmake ninja qt6-base qt6-serialport
sudo zypper install -y gcc-c++ cmake ninja libqt6-qtbase-devel libqt6-qtserialport-devel
xcode-select --install
brew install qt ninja cmake
cd /path/to/mxprog-gui
cmake -S . -B build -G Ninja
cmake --build build -j
./build/mxprog_qt
cd /path/to/mxprog-gui
QP="$(brew --prefix qt)"
cmake -S . -B build -G Ninja -DCMAKE_PREFIX_PATH="$QP"
cmake --build build -j
open build/mxprog_qt.app
./build/mxprog_qt
Deployment (macOS App-Bundle, included QT6):
QP="$(brew --prefix qt)" "$QP/bin/macdeployqt" build/mxprog_qt.app
