Skip to content

HART v0.0.1-alpha

Pre-release
Pre-release

Choose a tag to compare

@github-actions github-actions released this 07 Jun 16:30

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 I set 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; ebreak instructions 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 ecall syscalls 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.app to Applications
    and run xattr -cr /Applications/HART.app in 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)
  • li not 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 li correctly 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 infoRun anyway.
  • macOS: if it says the app is "damaged", move HART.app to Applications
    and run xattr -cr /Applications/HART.app in Terminal, then open it normally.