Krolyxon
Tag v0.2.0

Branches

Tags

Refs →

bench51README.md

288 lines · 13.2 KB

bench51 — an 8051 assembler, simulator & debugger

CI Release Downloads Top language Lines of code unsafe forbidden License Platforms Target egui ratatui Last commit

A small, Keil µVision-style IDE for the Intel 8051. Write assembly in the editor, build it, inspect the listing and Intel HEX output, then run, pause and single-step the program while watching registers, SFRs, memory, ports, timers, interrupts and the serial port, all in a window laid out like µVision.

Like Emacs, it also runs in a terminal: the same assembler and simulator come with a TUI (bench51) for SSH sessions and terminal setups.

Built in Rust with egui and ratatui. It is a learning tool, not a cycle-exact replacement for a vendor simulator.

Debug session: registers, source with the PC, disassembly, memory and UART #1

Editor and Keil-style build output Stopped at a breakpoint in a timer ISR, light theme
Editor + build output Breakpoint in a timer ISR, light theme
Ports, timers and interrupts windows docked side by side Assembler errors in the gutter and Build Output
Peripheral windows, rearranged Assembler errors

Why this exists

I had microcontroller practicals to get through, and the course expects you to use Keil µVision. Keil µVision doesn't run on Linux. Rather than fight with Wine or a Windows VM every lab session, I wrote my own: bench51 does the parts of µVision those practicals actually need (write the code, assemble it, look at the listing and HEX, step through it and watch the registers) natively on Linux, in a window or right in the terminal.


Features

Install

Linux and macOS:

curl -fsSL https://raw.githubusercontent.com/krolyxon/bench51/master/install.sh | sh

Windows (PowerShell):

irm https://raw.githubusercontent.com/krolyxon/bench51/master/install.ps1 | iex

Both install bench51-gui and bench51 from the latest release and verify the download against its SHA-256 checksum:

Prebuilt binaries cover Linux (x86_64, aarch64), Windows (x86_64) and macOS (Apple silicon, Intel). To build from source instead, with a Rust toolchain:

cargo install --locked --git https://github.com/krolyxon/bench51 bench51-gui   # the desktop app
cargo install --locked --git https://github.com/krolyxon/bench51 bench51       # the terminal app

Usage

bench51-gui                          # welcome screen
bench51-gui examples/*.asm           # open several files
bench51-gui firmware.hex             # disassemble & debug a HEX file
bench51-gui --theme light

--theme system|dark|light overrides the theme chosen in View → Theme, and --clock <MHz> the Xtal set in Project → Options for Target (default 11.0592), which is used for the elapsed-time display.

On Linux it runs on Wayland and X11 and uses the XDG desktop portal for file dialogs. Building it from source on Debian or Ubuntu needs the packages egui links against: libxcb-render0-dev libxcb-shape0-dev libxcb-xfixes0-dev libxkbcommon-dev libssl-dev.

Keys

The keys are µVision's, with the TUI's as aliases:

Key Action
F7 build target (also writes .lst and .hex next to a saved file)
Ctrl-F5 / F4 start / stop the debug session
F5 run / stop
F11 / F10 step into / step over
Ctrl-F11 / F12 step out
Ctrl-F10 / F8 run to the cursor line
F9 / Ctrl-Shift-F9 toggle breakpoint / remove all breakpoints
F6 reset the CPU
Ctrl-N / Ctrl-O / Ctrl-S / Ctrl-W new / open / save / close
Ctrl-F find
F1 all shortcuts

Click the gutter to toggle a breakpoint, double-click a byte in Memory to change it, click a pin in Ports to hold it low from outside, and click the bit chips in Registers, Timers and Interrupts to flip SFR bits. Files can be dropped onto the window.

Terminal version

bench51 is the same IDE in a terminal, the way emacs -nw is Emacs without a window. It has the editor, listing, HEX and error views, and a debug screen with registers, peripherals, memory, ports and the UART. The same binary also assembles headlessly, which is handy in scripts and Makefiles.

The TUI debugging serial_hello.asm: source, registers, peripherals, IRAM and the UART console

Editor with the assembled Keil-style listing Stopped at a breakpoint inside the timer 0 ISR, SFR view
Editor + assembled listing Breakpoint inside a timer ISR, SFR view
Assembler errors marked in the gutter and listed in the Errors tab Intel HEX output tab
Assembler errors in the gutter and Errors tab Intel HEX output
bench51 examples/serial_hello.asm     # open in the TUI
bench51                               # start with a template
bench51 firmware.hex                  # disassemble & debug a HEX file

# Headless assembly: writes prog.hex and prog.lst
bench51 --assemble prog.asm
bench51 --assemble prog.asm -o out.hex --lst out.lst

--clock <MHz> sets the oscillator frequency used for the elapsed-time display (default 11.0592).

Terminal keys

Key Action
F1 help
F2 / Ctrl-S save (assembling a saved file also writes .lst and .hex next to it)
F3 / Ctrl-O open .asm or .hex
Ctrl-G edit in $EDITOR; on save & exit the buffer reloads and reassembles
F4 switch Edit ⇄ Debug
F7 assemble, reset and load
F5 run / pause (assembles first if the source changed)
F11 / F10 / F12 step into / step over / step out
F8 run to cursor
F9 toggle breakpoint on the cursor line
F6 reset
Ctrl-Q quit

Edit mode: Alt-1/2/3 switch between Listing, HEX and Errors; Alt-↑/↓, Alt-PgUp/PgDn scroll them. The editor uses Emacs-style keys (Ctrl-U undo, Ctrl-R redo, Ctrl-Y paste), or press Ctrl-G to edit in your own $EDITOR (vim, nvim, nano, …).

Debug mode: Tab cycles focus between Source, Memory, Ports and Serial. Letter shortcuts work too, for terminals that swallow function keys: r run/pause, s step, n step over, o step out, g run to cursor, b breakpoint, x reset, i/f/d/c show IRAM/SFR/XRAM/CODE, p poke memory, +/- speed, . jump to PC, Esc pause / back to editor.

Examples

File Shows
examples/blink.asm port toggling, delay loops, ACALL/RET
examples/timer_irq.asm timer 0 mode 1 interrupt
examples/serial_hello.asm UART setup, string output with MOVC, echo
examples/button_int0.asm edge-triggered INT0, idle mode
examples/bcd_add.asm ADDC and DA A with packed BCD
examples/lookup_movc.asm 7-segment table lookup

Notes and limitations

Development

cargo run --release -p bench51-gui     # the desktop app
cargo run --release -p bench51         # the terminal app
cargo test --workspace                 # assembler, CPU, peripheral, session and example-program tests
cargo clippy --workspace --all-targets

Releasing: bump version in Cargo.toml, add a section to CHANGELOG.md, merge, then tag and push:

git tag v0.3.0 && git push origin v0.3.0

The release workflow checks that the tag matches Cargo.toml and builds every target. It publishes the archives and SHA256SUMS with that changelog section as the release notes, then installs the result with the one-liners on Linux, macOS and Windows.

Code layout: