A single-board computer with a 7-bit data bus and 14-bit address bus.
  • Rust 37%
  • Assembly 24.8%
  • SystemVerilog 14.8%
  • Verilog 13%
  • VHDL 4.9%
  • Other 5.4%
Find a file
2026-04-14 23:16:18 +00:00
.cargo Add emu7 GUI emulator with VGA display and UART0 serial I/O 2026-03-20 01:30:04 -04:00
.claude Switch builds, packaging, and tooling to PR7 as default output format 2026-04-12 23:04:49 -04:00
.forgejo/workflows Fix pr workflow 2026-04-12 10:45:02 -04:00
.vscode Switch builds, packaging, and tooling to PR7 as default output format 2026-04-12 23:04:49 -04:00
android Replace remaining 'just' references with 'make' 2026-04-12 12:04:20 -04:00
assets Switch builds, packaging, and tooling to PR7 as default output format 2026-04-12 23:04:49 -04:00
docs Add PR7 hardware loader for MiSTer FPGA core 2026-04-12 21:50:32 -04:00
editors/vscode-sbc7 Switch builds, packaging, and tooling to PR7 as default output format 2026-04-12 23:04:49 -04:00
keys Replace all non-ASCII characters with plain ASCII equivalents 2026-04-05 07:59:49 -04:00
mister Add PR7 hardware loader for MiSTer FPGA core 2026-04-12 21:50:32 -04:00
pkg Switch builds, packaging, and tooling to PR7 as default output format 2026-04-12 23:04:49 -04:00
rtl Fix disk BPTR auto-increment; add mister-clean recipe and examples to zip 2026-04-11 12:19:44 -04:00
scripts Pin wasm-bindgen and js-sys to exact lockfile versions; fix mister-zip make invocation 2026-04-12 15:38:43 -04:00
src Fix PR7 loader slot 2 overflow corrupting FS scratch bank 2026-04-13 08:18:03 -04:00
tools Fix SBC7 font: set Panose monospace classification 2026-04-04 22:24:32 -04:00
web Switch builds, packaging, and tooling to PR7 as default output format 2026-04-12 23:04:49 -04:00
.editorconfig Add fmt7 assembly formatter, apply canonical formatting, and add conventions doc 2026-03-23 18:17:53 -04:00
.envrc Add clap CLI parsing, release automation, and Docker packaging 2026-03-22 16:36:18 -04:00
.gitignore Switch builds, packaging, and tooling to PR7 as default output format 2026-04-12 23:04:49 -04:00
.markdownlint.jsonc Add fmt7 assembly formatter, apply canonical formatting, and add conventions doc 2026-03-23 18:17:53 -04:00
CLAUDE.md Replace justfile with unified Makefile 2026-04-11 20:05:45 -04:00
INSTALL.md Apply CC0-1.0 license, add INSTALL.md, update permissions 2026-03-23 20:29:23 -04:00
LICENSE Apply CC0-1.0 license, add INSTALL.md, update permissions 2026-03-23 20:29:23 -04:00
Makefile Switch builds, packaging, and tooling to PR7 as default output format 2026-04-12 23:04:49 -04:00
README.md Replace justfile with unified Makefile 2026-04-11 20:05:45 -04:00
RELEASE_NOTES.md Update release notes for v1.2.0 2026-03-28 21:55:55 -04:00

SBC7

SBC7 Logo

Most computers went from 4 to 8 bits and kept growing. SBC7 stopped off to smell the clover and decided Lucky 7 was plenty.

SBC Screenshot

Every data path in this machine -- the bus, the registers, the instruction words, the memory cells -- is exactly 7 bits wide. Not because it's practical (it mostly isn't), but because interesting constraints produce interesting designs. The address bus is 14 bits (two 7-bit halves, notated &HH:LL), giving the CPU a 16 KB logical address space. Bank switching extends this to 80 KB of physical memory (64 KB RAM + 16 KB ROM) by paging 2 KB banks into eight independently controlled slots.

The ISA fills all 128 possible opcodes with zero waste: 14 general registers arranged as 7 named pairs (AB, CD, EF, GH, PC, FL, SP), an accumulator-centric ALU with 8 operations x 4 source modes, a 14-bit pair ALU, conditional branches (relative and absolute), stack operations, block copy (LDIR), and a VGA text display. It's a complete little computer -- just one bit short of conventional.

Documentation

See the docs directory.

Collaboration

See here for details. tl;dr: This is a hobby project that I host here and mirror to Codeberg. You can file issues or PRs either place. Ask me if you want an account here for that purpose.

Block Diagram

flowchart TD
    clk([clk])
    rst_n([rst_n])
    io(["I/O bus\nio_addr . io_req\nio_we . io_din . io_dout"])

    subgraph top["sbc7_top.sv"]
        cpu["cpu.sv\n14-bit addr . 7-bit data . I/O bus"]
        bankregs["bank_regs.sv\nI/O ports 0-7 . 8 x 7-bit"]
        ram["ram.sv\nPort A: CPU . Port B: VGA\n32 banks x 2 KB (64 KB)"]
        rom["rom.sv\n8 banks x 2 KB (16 KB)"]
        vga["vga.sv\n640x480 @ 60 Hz . 64x24 chars"]
    end

    hsync([hsync])
    vsync([vsync])
    pixel([pixel])

    clk & rst_n --> cpu
    cpu <-->|io_*| bankregs
    bankregs -->|"bank[0:7]"| ram & rom
    cpu <-->|"addr / data / we"| ram
    cpu -->|addr| rom
    ram -->|"vram (port B)"| vga
    rom -->|"char data (port B)"| vga
    vga --> hsync & vsync & pixel
    cpu <-->|io_*| io

Memory Map

The 14-bit logical address space is divided into eight 2 KB slots. Bank registers on I/O ports 0-7 select which physical bank appears in each slot. Default mapping (after reset) reproduces a flat layout:

Range Slot Contents
&00:00-&00:3F 0 RST/interrupt vectors (slot 0 is fixed to RAM bank 0)
&00:40-&00:7F 0 ROM working variables
&01:00-&5F:7E 0-5 General-purpose RAM; default program load address
&5F:7F 5 Initial stack pointer (SP grows downward)
&60:00-&63:7F 6 Memory-mapped I/O (MMIO bypass -- always accessible)
&64:00-&6F:7F 6 Screen RAM (1536 bytes, 64x24 characters; VGA display bank set by port 37)
&70:00-&7F:7F 7 ROM (2 KB, reset vector at &70:00)

Physical memory: 64 KB RAM (32 banks) + 16 KB ROM (8 banks) = 80 KB total. See docs/banking.md for the full specification.

Toolkit

asm7 is a two-pass assembler. Its default output format is H7X, a checksummed ASCII object format designed for the SBC7; flat binary output is available via --bin.

disasm7 is a disassembler that auto-detects H7X or binary input and produces annotated assembly listings with hex offsets.

emu7 is a GUI emulator with VGA character display, UART0 wired to stdin/stdout, and timer emulation. Pass --no-gui for terminal-only operation.

TinyFORTH is a minimal Forth interpreter written in SBC7 assembly, inspired by jonesforth. It uses 14-bit cells (two 7-bit halves) and provides 30+ built-in words covering stack manipulation, arithmetic, memory access, and I/O. Run it with make forth.

TinyBASIC is a line-numbered integer BASIC interpreter inspired by Li-Chen Wang's Palo Alto Tiny BASIC (1976). Run it with make basic.

TinyLisp is a minimal Lisp interpreter with tagged 14-bit values, a mark-and-sweep garbage collector, and a built-in standard library. Run it with make lisp.

fmt7 is an opinionated assembly formatter for SBC7 source files.

lsp7 is a language server providing editor support (completions, diagnostics, hover) for SBC7 assembly.

dap7 is a Debug Adapter Protocol server for step-debugging SBC7 programs.

For the full story -- ISA reference, assembler manual, ROM walkthrough, language interpreter guides, and more -- see the docs/ directory.

Building

SBC7 uses make as its build tool.

Command What it does
make Build ROM image (default)
make run Build and launch the emulator
make forth Build and run TinyFORTH
make basic Build and run TinyBASIC
make lisp Build and run TinyLisp
make example NAME=typewriter Assemble an example program
make run-example NAME=typewriter Build and run an example in the emulator

Process

SBC7 is a collaboration between a human designer and Claude Code. The ISA was shaped by cross-analysis of the 6502 and Z80 instruction sets, with the goal of maximising code density within the 7-bit constraint -- squeezing every last microjoule of utility out of 128 opcodes. The working method is straightforward: agree on a design decision in plain language, plan the changes, implement and commit. All decisions -- memory map layout, mnemonic naming, notation conventions -- are recorded in commit history and the documentation, because future-you deserves to know what past-you was thinking.

At boot, a custom glyph at position $20 in the character ROM greets you on screen -- the Lucky 7 glyph, a stylized 7 that serves as the machine's quiet little signature.

Font

The SBC7 character ROM is available as a webfont in tools/sbc7.woff2 (TTF also available). It's a monospace bitmap font covering printable ASCII, generated from the VGA character ROM glyphs.

Acknowledgements

The MiSTer FPGA core was built with the help of Alan Steremberg's MiSTer tutorials.