HART v0.0.1-alpha
Pre-release
Pre-release
The first public alpha of HART, a desktop IDE and time-travel debugger for RV32IM assembly. Write RISC-V assembly, run it, and step forwards and backwards while watching every register, CSR, and byte of memory change.
⚠️ This is an early alpha; expect rough edges. Bug reports are very welcome.
What's included
- RV32IM assembler & emulator: a from-scratch Haskell implementation of the base integer ISA, the M (multiply/divide) and Zicsr (control/status register) extensions, the common pseudo-instructions (
li,la,mv,j,call,ret,csrr,csrw, ...), and directives (.text,.data,.string,.word,.space,.align). - Toggleable ISA extensions: enable/disable M and Zicsr from the toolbar; a disabled extension no longer parses, assembles, or runs. The base
Iset is mandatory. - Time-travel debugging: step forward, step back, and rewind to the start. Every CPU state is recorded, so reverse stepping is instant and exact.
- Breakpoints: click the editor gutter to set them;
ebreakinstructions are recognized as breakpoints too. - Live machine state: the PC, all 32 registers (ABI or numeric names), CSRs, and a hex memory view that flashes on writes, with HEX/DEC and signed toggles.
- Source-mapped execution: the current instruction is highlighted in your source as the CPU advances; a disassembly/text-segment view is available.
- Interactive I/O: programs that read stdin pause for input in an embedded terminal. Common
ecallsyscalls are supported (print/read int & string, print char,sbrk, file open/close/read/write, exit). - Built in RISC-V reference: a help window containing the RISC-V reference built into the app.
- Editor & UX: Monaco-based editor with RISC-V highlighting, multiple file tabs, keyboard shortcuts, a resizable panel layout, light/dark themes, session persistence, and a searchable settings panel.
Downloads
| Platform | Files |
|---|---|
| macOS | .dmg / .app |
| Linux | .AppImage, .deb, .rpm |
| Windows | .exe (NSIS installer) |
The emulator is bundled inside the app; there's nothing else to install.
Running an unsigned build
HART isn't code-signed yet, so your OS will flag it as unrecognized. It's safe;
you just need to bypass the warning:
- Windows: SmartScreen shows a blue popup -> More info -> Run anyway.
- macOS: if it says the app is "damaged", move
HART.appto Applications
and runxattr -cr /Applications/HART.appin Terminal, then open it normally.
Full changelog
Bug Fixes
- Parser correctly treats \r\n as newlines (
ec6a6e5) - Renaming of files actually renames now and hovering an open file shows the path (
8f59e13) - Formatting in editor, linter in about panel and wrong repo url in cargo.toml (
6e145f3) - Panel controls beign inconsistent when closing both register and memory panels (
5e3d4cf) - Pipeline (
74bdf24) - Caret in terminal not showing up (
3d890d3) linot sign extending the lower part when value is too large for a single li instruction (f792cb0)- Pretest for svelte unit test workflow (
3681709) - Typo and linter error (
fb69125) - CompileAndLoad checks instructions and sourcemap match length and yields an error instead of truncating if the check fails (
f06d082) - Exit syscall is now POSIX compliant (
ba2a5fc) - Read_int and print_int now work with signed integers (
3be8a7c) - Kernel now does not set break to below the heap base (
402d0ae) - Linear search over opcode (
7245176) - Breakpoints in source viewer (
9b161ef) - CLI also handles breakpoints properly like RPC (
328fd5d) - Memory view couldn't scroll past stack top (
af432f7) - Disable compile button while running (
caf29b2) - Status dot only pulses on running/paused state (
911bea0) - Mutating state inside effect (
641577a) - Properly persist user settings (
ea6402d) - Layout stored incorrectly (
599b028) - Clear terminal now only clears active terminal (
39678a4) - Typing for files in Monaco (
0b1055c) - Layout component is now typed (
1a0b408) - Range check on immediates when linking (
55d8be8) - Syscall not clearing CSR registers (
c95a626) - Breakpoint stepping too far and next instruction being executed eagerly (
64f425e) - Step overriding Pause state (
2d1373d) - Jump instruction not being parsed and formatting (
0ba28cb) - Boundcheck and lazyness in Kernel and Machine (
2f8b1c8) - Release workflows not having write perms (
667e790) - Linker not lowering
licorrectly for large values (7cfbe3a) - CI/CD pipeline and type error (
1cafc43) - Build sidecar building wrong (
f91d0c8) - Shadow warning in linker (
b368207) - Shadow warning in linker (
b799245) - Abi names for registers not being parsed correctly (
54329ad) - Fix cabal file for test-suite (
0ea73df) - Fix immediate for utype instruction (
de78d7b) - Add BLT and BGE to assembler (
958860b) - Fix branches jumping one instruction too far back (
ce2be34) - Remove subi from parser (
4e38e6d) - Remove subbi as it's not a valid riscv instruction (
fcfd537)
Features
- Move CSR instructions to Zicsr extension, added CSR pseudo instructions, proper syntax highlighting and help for it. Also fix an issue where writing numbers too large would hang the program (
2dae289) - Add file associations (
fb10ae9) - Add app icons (
ba757c7) - Add about panel to settings, split up settings into category and fix searching (
2651540) - Make file bar scrollable and add renaming of files in the editor (
5511715) - Add keybinds to create new files or close files (
3657516) - Add integration tests (
385ae52) - Add way to clear all open files and add some extra onboarding files (
fa4d434) - Dynamic syntax highlighting based on enabled extensions (
a7b8cfa) - Improve system logs and program logs (
6fd065c) - Added support for block comments and C-style comments as well as auto closing pairs in Monaco (
d2d2a7a) - Added documentation for instruction, directives and registers on hover (
ffad1d7) - Add directive, CSR and number converter to refernce (
012092d) - Add CSR and directive docs (
ff30700) - Unify scrollbar to no longer rely on webkit/native scrollbars (
cee18c5) - Add signed mode setting and move hex/dec mode to displaystore (
dfb208e) - Add register calling conventions to reference (
83fb8ec) - Add ascii table to reference (
675b8e8) - Add riscv reference panel (
9318f8b) - Hook up all new settings panel to the settings menu (
b5af93c) - Add settings for the terminal (
83adf01) - Add settings panel for keybindings (
8592e99) - Add panel to change display settings for debug pane (
4776e2e) - Add settings for the Monaco editor (
831c6ef) - Add settings for the display of the debug panel (
a364c04) - Add proper settings panel to the UI (
063aa0d) - Split system into extensions allowing you to disable the M extension (
a391d33) - Add max cycle cap to emulator CLI (
ec55654) - RPC only sends over memory delta's instead of the full memory space (
444b711) - Add source viewer (
910379e) - UI properly displays errors now and some minor fixes (
48c4022) - Emulator now uses proper ADT for errors (
6483d84) - Add light mode (
fc93f61) - Made scrollbar in memoryview keyboard controllable (
31dc366) - Implement Monaco breakpoints (
90fb29e) - Bundle fonts with app (
1bffac6) - Add popover component (
246d240) - Add IconButton component (
8a6cf9f) - Add segmented control component (
fc32b1c) - Add pane resizer component (
d23eb24) - Added keybindings, confirmation on quit wiht unsaved changes and fix some codesmells (
efba9f5) - Program now recompiles if dirty and you click run (
ac65539) - Implement new UI designed by claude design (
096054f) - RPC also returns the disassembled map of instructions (
0e1d7f0) - Clean up UI more (
b909a9f) - Use Seq. instead of list and limit history size (
fe1b01d) - Add release workflow (
548a1d8) - Hide cursor on certain terminals (
8d69960) - Added highlight to executed instruction (
0044008) - Added resizing of panes (
8c00716) - Split up into components and add memory view (
a23ce14) - Add way to view canonical register names and decimal values (
ecebeee) - Add lots of UI improvements (
e34cc43) - Add line numbers for source map and better parser errors (
cb404ad) - Add tauri frontend (
6abaaa1) - Split main into RPC and CLI (
1be39fc) - Add file support with open and close syscalls (
5676bdb) - Implement set brk system call (
2590921) - Add RV32IM extension (
1d9731a) - Add hardware interrupts for misaligned addresses (
c3a7ad5) - Add hexdump for memory (
1cfe9c6) - Add sections and directives (
67a27c6) - Add read syscall (
8f39ee3) - Add instruction disassembly to debugger (
b4e599c) - Centralized hardcoded ISA specs (
46294bb) - Add syscalls (
5fd88c6) - Add call and tail pseudo instructions (
b7b295d) - Added remaining branch pseudo instructions (
4710ee7) - Add seqz, snez, sltz, sgtz pseudoinstructions (
7b5c46d) - Add la, global load and global store instructions (
ace2cc4) - Add remaining B and load type instructions and fix parser not correctly parsing jump operands (
c72f310) - Add remaining I type instructions (
f485445) - Add remaining R type instructions (
80a0621) - Add lots of jump pseudo instructions (
efb03c0) - Seperate library files to seperate folder and implement jump instructions (
e30f21f) - Add CI/CD for automated tests (
3fc2046) - Add unit tests (
89c0790) - Add pseudoinstructions and made it impossible for pseudoinstructions to reach assembler/emulator (
75fd8fa) - Add debugger (
30090be) - Add clock cycle count and speed (
f3e016f) - Add more branch instructions (
5697d69) - Add load instructions (
7bda1fe) - Add S intructions and clean up assembler (
d5c70a5) - Remove runtime check of labels by using more GADTs (
2b53168) - Add labels (
f8f0b7a) - Add more B type instructions R- and I- type operators (
8d05110) - Made Register type safe and clean up main (
931a583) - Add CPU (
cc5ad4b) - Add basic decoder (
ee3f952) - Add assemble to main (
100ab11) - Implement assembleIType (
a1f4e45)
Other
- T add bit encoding to the format table of instructions (
9579910) - Added upper type instructions (
81bd616)
Downloads
| Platform | Files |
|---|---|
| macOS | .dmg / .app |
| Linux | .AppImage, .deb, .rpm |
| Windows | .exe (NSIS installer) |
The emulator is bundled inside the app; there's nothing else to install.
Running an unsigned build
HART isn't code-signed yet, so your OS will flag it as unrecognized. It's safe;
you just need to bypass the warning:
- Windows: SmartScreen shows a blue popup → More info → Run anyway.
- macOS: if it says the app is "damaged", move
HART.appto Applications
and runxattr -cr /Applications/HART.appin Terminal, then open it normally.