The 63F09: a 6809-derived 8/16/32-bit CPU

Wednesday 23 September 2026, by 63F09 // CPU 63F09

The 63F09 is a custom processor, designed from scratch in VHDL by its author (running on real FPGA hardware), that extends the classic Motorola 6809 8-bit CPU into a three-level family: the base 6809 instruction set, a superset compatible with the Hitachi HD6309 (“6309 native mode”), and the 63F09 itself, which adds a 32-bit addressing/register mode and an optional hardware floating-point unit (63F09HF). Unlike the original 6809, which was strictly an 8/16-bit microcontroller-class chip, the 63F09 in its 32-bit mode addresses up to 64 GB of memory — the design target is a real, general-purpose CPU, not a microcontroller.

Register file

The 63F09 keeps the 6809’s original registers (PC, S, U, X, Y, DP, CC, A, B) and layers new ones on top as each mode is unlocked:

 E, F, V become available from 6309-native mode onward;
 DS, a second direct-page selector, is 63F09-only;
 composite pseudo-registers combine the raw ones: D = A:B (always available), W = E:F (6309+), Q = D:W (6309+, always 32 bits — available in both 16-bit and 32-bit CPU modes, unlike X/Y/U/S/V which only widen to 32 bits in 63F09 32-bit mode), and O = Q:V, a 64-bit “octo” register available in 63F09 32-bit mode only.

A notable ABI property: on this port’s calling convention, every general-purpose register is caller-saved. There is no callee-saved register set to spill in a prologue, which simplifies function entry/exit code generation considerably.

Direct-page addressing

Like the original 6809, the 63F09 keeps a fast “direct page” addressing mode selected by the DP register (and, in 32-bit mode, an additional DS register selecting a 16 MB window). A GCC backend pass on this port automatically detects small static/global variables accessed repeatedly inside a loop, forces them into a 256-byte-aligned page, and rewrites in-loop accesses to use this one-byte-shorter, faster addressing form — entirely automatically, with no source-level annotation required.

Hardware floating point

The optional 63F09HF variant adds a real hardware FPU: a 16-deep stack of FP0-FP15 registers (single and double precision), fused multiply-add, square root, and the usual arithmetic/comparison/conversion set. Comparisons report their result through the CPU’s own condition-code register rather than the FP stack, which turned out to be exactly the contract GCC’s stack-register allocator (originally written for the x87) expects.

Toolchain and software support

The 63F09 is backed by a genuinely working, from-scratch GNU toolchain port: binutils (assembler, linker, disassembler), GDB, and a GCC backend supporting C and Fortran, all built up and verified against real compiled and linked output rather than assumed correct. A newlib C library port covers four distinct hosting environments — bare metal, two vintage 6809 operating systems (FLEX9 and UniFLEX), and a simulated development SoC with a real UART console — selected at link time via dedicated crt0 startup files and linker emulations.

Advantages

 A simple, well-understood 8-bit instruction set as its foundation, extended rather than replaced — 6809 and 6309 object code and assembly-level habits remain directly relevant.
 Genuine 32-bit addressing and a real hardware FPU bolted onto that familiar base, without abandoning its register model or addressing-mode philosophy.
 Automatic direct-page optimization gives small, loop-hot data a real, compiler-managed speed win with zero source changes.
 An entirely caller-saved register convention keeps function prologues/epilogues trivially cheap.
 A complete, real GCC/binutils/newlib toolchain exists today: C and Fortran programs can actually be compiled, assembled, linked, and (statically) inspected, not just theorized about.
 Being an open, from-scratch VHDL design that runs on FPGA, the whole system — CPU, ISA, and toolchain — is fully inspectable and modifiable, which has made it practical to find and fix real bugs by cross-checking compiler output against the hardware description directly.

Limitations and open issues

 Some hardware-backed arithmetic (64x64 multiply, 8x8 multiply) is not yet exposed as GCC instruction patterns, so the compiler still emits slower software fallbacks for cases the CPU could handle directly.
 libgfortran, GCC’s Fortran runtime, is too large to fit in the 64 KB address space of the 16-bit submodes once anything beyond trivial I/O is linked in — full-featured Fortran I/O is presently a 32-bit-mode-only proposition.

In short

The 63F09 is best understood as “what if the 6809 had kept growing” rather than a clean-sheet modern design: it trades the novelty of a from-scratch ISA for the comfort of a genuinely simple, fully understood 8-bit ancestor, extended just enough — 32-bit addressing, a real FPU, automatic direct-page optimization — to make real systems.