Skip to content

Backlog

Open work for System-5. Started 2026-10-07, gathered from CLAUDE.md, hardware/TIMING-REVIEW.md, hardware/memory/REVIEW.md, hardware/FABRICATED.md, the board READMEs and the export checklist. Details live in the files named; this is the list to check before starting something. When an item is done, delete it here and record the result where it belongs (a README, hardware/FABRICATED.md, CLAUDE.md).

Before ordering boards

  • New bus backplane Rev D (S5BUS-D), designed 2026-10-26: hardware/bus/kicad/rev-d/ (8 slots of 36 pins, screw terminal, pull-ups on D0-D7 and the open-collector lines; Ken's choices). Reviewed 2026-10-26 and fixed (hole keep-outs, 2.5 mm feeds from J9, card-window brackets); tools/preorder_check.py --layers 2 PASSES. Component-side arrows added 2026-10-27 (cards face the power connector). After the 2026-10-27 independent reviews: power switch SW1 (E-Switch 100-series right-angle toggle, 5 A), 4 A polyfuse F1, P-MOSFET Q1 (reverse polarity; laid flat 2026-10-28 so it clears the card in slot 1), 6.3 mm C1, 1.0 mm silkscreen, separate PTH/NPTH drills. Open: where the card supports go (the review: a support standing on the board at a card's top end would land on that slot's bypass cap; deferred by Ken 2026-10-27); check SW1's ON direction with a meter and measure the cards' total draw (F1 holds about 3.5 A at 40 °C). Ken: look at the pictures (check-s5bus-d-*.png, the render) and decide whether to order. Check the 36-pin sockets' height suits the card guides. 36-pin extension labels done (2026-10-30): positions 34-36 renamed -PAUSE, -DMAIN, SC0 (from the 2009 drawing's -INP, -OUT, EXP) in gen/ and as text in the board (nets, slot labels, the RN2 note moved 2.5 mm down to clear "J1 SLOT 1"); copper identical (97 tracks, vias, 349 pads); preorder_check PASS again with the new zip. Definition: docs/manual/bus.md, "The 36-pin extension". -DMAIN is LOAD mode only; the external clock is a CPU card header pin, not on the bus.

  • Memory Rev E (= Rev D's circuit): fit 74HCT151, not 74LS151 (all four muxes). Found 2026-10-08 in the loading check: each CD4042B output (IC9 Q0-Q2 = A12-A14) drives four LS151 select inputs, up to 1.6 mA, against a CD4042B rating of about 0.5 mA at a valid low. The 74HCT151 is pin-compatible: no board change. Still to do: change the schematic values and the BOM in hardware/memory/kicad/rev-d/ (the README already says so).

  • Memory, a later revision: a faster address latch. Timing finding C1: the card's chip enable settles late (CD4042B, up to 220 ns), so at the start of a read it can drive the bus while another card does, for up to about 230 ns worst case. Noise only, no wrong reads. Do not swap in a 74HC4050: it makes C1 worse (it speeds up -MRD to the output enables too). The fix is a faster latch in place of the CD4042B, which is a layout change.
  • Memory Rev D/E: rest of the loading check. Done for the CMOS outputs driving LS inputs (the item above). Not yet checked: bus-line loading across all cards together.
  • Boards on order (JLCPCB, ordered 2026-10-20): MEM3-E (2000765A-Y55, 4 layers); BUSDRV-B (Y56) arrived and works (2026-10-30), replacing the scrap 2026-10-09 boards (Y53 bus driver A, Y54 memory Rev D: routed on four copper layers, made from 2-layer zips; found 2026-10-19). When they arrive: record it in hardware/FABRICATED.md, build them (MEM3-E with 74HCT151 muxes), flash the bus driver firmware (banner io-2) and follow software/busdrv/BRINGUP.md. YACC1-D's memory v2.0 (Y52) was a real 4-layer board ordered as 4 layers.
  • 6845 Rev B: on hold (Ken, 2026-10-09). Its order files are ready (hardware/video-6845/kicad/rev-b/video-6845-rev-b-gerbers.zip, 2 layers; copper and holes = the 2005 Rev B board). Wait until the bus driver is built and has been used to check the current build's cards, then decide.
  • 6845 Rev B build notes: IC8 must be a 74LS163 (the drawn 74HC160 divides by 5; hardware/video-6845/BYTE-COMPARISON.md); burn firmware/char-rom-fonts/goodfont at 000h; fit the bypass caps (hardware/video-6845/kicad/rev-b/README.md).
  • 6845 Rev B (working card): no bypass capacitors fitted. None of C1-C7/C9-C15 (0.1 µF), nor C8 (10 µF), is on the card (photos 2026-10-08 check). It works, but it is a likely cause of any flaky display or bus errors; fit them (0.1 µF ceramic, 2.5 mm pitch). LED1/R1 are not fitted either (cosmetic).
  • MEM3-E build (reviews 2026-10-30 and 2026-10-31 independent, hardware/memory/kicad/rev-e/REVIEW-*.md): no blockers. Keep IC14 a 74LS32 with R2/R4 = 470 (an HCT32 would select chips when -VMA floats), 27C256 EPROMs (not NMOS 27256, not 28C256), 600 mil 62256, 10-pin bussed 4.7k RN1-RN4, slim 0.1 µF caps, no ZIF sockets; buy sockets, header, shunts (not on the BOM). Fit LEDs flat side left; check C8 (2 mm from the edge) clears the card guide.
  • Bus Rev D (not ordered): consider 10k pull-ups on -VMA, -MRD and -MRW (and a pull-down on TPA), so cards' CMOS inputs do not float with no bus master (MEM3-E review N7).
  • Housekeeping from the MEM3-E review: tidy hardware/memory/kicad/rev-e/README.md (still partly Rev D text); a 74HCT151 part in s5emu/timing.py; an "E" memory revision in s5emu/hw.py; preorder_check.py's schematic hint should say npm install in tools/kicad/sch/.
  • Bus driver card (BUSDRV-B): mechanical check. The Nano on headers stands about 15–20 mm tall: check it fits the card pitch in the cage, and that a USB cable reaches the card edge (hardware/bus-driver/kicad/rev-b/README.md).

Questions for Ken (from the boards)

To decide after the two-Mac merge (2026-11-04): the CPU Rev D, IO panel and Video Rev C work and VIDEO-G were designed on different Macs at the same time, so they clash: - Port 4: the IO panel uses it, and so does VIDEO-G (ports 1 and 4-7; the IDE card has 2-3), so no port is free for the panel. - Keyboard flag: VIDEO-G signals on bus -EF, which reaches EF3 through CPU Rev A's JP1. CPU Rev D has no such jumper and sends -EF to EF4, while HBIOS reads EF3. - Video Rev C: VIDEO-G replaces the 6845 card and the IO card's keyboard, so hardware/video-6845/kicad/rev-c/DESIGN.md and the matching backlog item look superseded. Retire them if Ken agrees. - Website: VIDEO-G and GBASIC are not in its menu yet.

  1. CPU boot flip-flop rework: which wire goes where. It is modelled as derived from the photos: PRE = D = VCC, CLK = ADDR15 (CPU rev A-built).
  2. CPU reset rework: IC5 pins 1/3 and U1 pin 7. Bench 2026-10-31: the card resets only at power-on; S1 and bus −RESET do nothing (hardware/cpu/eagle/rev-a/bringup/).
  3. Answered 2026-10-30: the CPU card's EPROM is HBIOS v1.0.4, byte for byte the emulator's hbios-1.0.4.rom (read on the T48; hardware/cpu/eagle/rev-a/rom/).
  4. Crystal frequency: from its marking, or a counter on TPA (TPA = clock ÷ 8). 1.76 MHz is assumed; T3 fails above about 1.9 MHz.
  5. R13's value on the CPU card (colour bands): the pull-up on the boot EPROM's chip enable. It sets finding C2; 1 kΩ or less keeps C2 to the EPROM's own float time.
  6. Answered 2026-10-31 (CPU trace): the 2009 backplane has no data-line pull-ups; a floating data bus holds its last byte (the emulator assumes FF). Bus Rev D has 10k pull-ups.
  7. Answered 2026-10-30 (bus driver): on the reworked Memory Rev B nothing answers at 7000–7FFF, so the RAM and the 6845 do not overlap; the rework keeps the jumper decode. Still to fix: the emulator's B-built model (it has RAM over all of 0000–7FFF): which IC14 pins do the red wires leave from? (hardware/memory/eagle/rev-b/bringup/README.md)
  8. Answered 2026-10-30 (bus driver): IDE card jumpers SV1 = port 2 (register select), SV2 = port 3 (data), confirmed on the card; the 2005 16 MB CF card still held ELF/OS that day (hardware/ide-cf/eagle/rev-a/bringup/README.md).
  9. Memory Rev B photos show more rework than the B-built model has (several IC14 pins lifted, a solder bridge). Historical only: Rev D is the card of record.

Measurements and references

  • Scope or logic analyser on TPA, the CPU card's 374 A15 output, -VMA, and the 6845's E and R/W during a CRTC write. That would confirm T1 and T2 directly.
  • Datasheets into reference/datasheets/ for the parts whose delays the timing review typed in, so they can be checked.
  • A CDP1852 datasheet: the polarity of its CS1 input is taken from Ken's k1_1852 symbol, unconfirmed.

Future designs (Ken, 2026-10-11)

Started 2026-10-30: CPU Rev D (hardware/cpu/kicad/rev-d/DESIGN.md), 6845 video Rev C (hardware/video-6845/kicad/rev-c/DESIGN.md) and the IO panel card (hardware/io-panel/kicad/rev-a/DESIGN.md), all on the 36-pin bus, all 2 layers if possible (Ken).

  • CPU card: a new standalone design (Ken, 2026-10-11; scope 2026-10-30): just the 1802 and its boot EPROM with the boot (EPROM-at-reset) circuit, plus what the CPU itself needs (clock, reset, bus interface). No 1861 video and no support for a second, connected IO card. It uses the expanded 36-pin bus of the bus Rev D (positions 1-3 -EF1..-EF3, 4-33 the 30-pin bus, 34-36 -PAUSE, -DMAIN (debug control) and EXP (reserved), docs/manual/bus.md draft). The board layout rules apply. Decided 2026-10-30 (Ken): CPU Rev D, hardware/cpu/kicad/rev-d/ (design notes in its DESIGN.md); clock = a 4 MHz canned oscillator divided by 2 (2 MHz at the 1802; the 1.79 MHz of the old cards was for the 1861), or an external clock on an EXT CLK header pin (a jumper wire from the debug board; not on the bus), chosen by an INT/EXT jumper, so a debug board (the bus driver) can run the static 1802 slowly or step it; boot EPROM = a 4K 2732, as today, at F000-FFFF (Ken corrected 2026-10-30: not a 27C256), so today's HBIOS 1.0.4 chip moves across; check that the T48 can program 2732/2732A parts (21 V VPP) before relying on new ones. Still to decide: the rest of the boot circuit (today's A-built rework, PRE = D = VCC, CLK = A15, is the reference) and where the run/reset controls go. Rerun python3 -m s5emu.timing 2 for the 2 MHz bus. 2026-10-30: netlist, redrawn schematic and a 2-layer board done (5.50 × 4.00 in; preorder_check PASS; not ordered). Modelled in s5emu (--cpu-rev D): HBIOS and ELF/OS boot on it, LOAD → RESET → RUN tested. Timing at 2 MHz done (hardware/TIMING-REVIEW.md): the CPU card is clean, but the 6845 card's 1 MHz-grade CRTC fails E high time above ~1.9 MHz (T3): decided (Ken, 2026-10-30): keep 2 MHz, fit a 2 MHz-grade CRTC on video Rev C (pick the part, put its data sheet timing into timing.py, rerun). Still to do: the card-guide fit of a 4.00 in card (DESIGN.md). The IO card's bring-up waits for it.
  • 6845 video card, next revision: move the IO card's PS/2 keyboard interface onto it, and apply the 2026-10-24 board layout rules (front-edge video jack, PS/2 and LED; labels; readable references). Ken, 2026-10-30: the keyboard path now on the IO card (the PAK-VI, the PIC16F84 and its PS/2 firmware in hardware/io-1861-keyboard/pic-ps2-firmware/, and the CDP1852 port it is read through) moves to the video card, so one card is the console (screen and keyboard). Keep the keyboard on port 1 and put its flag on -EF3 (the 36-pin straight-across EF mapping, Ken 2026-10-30: -EF3 reaches EF3, where HBIOS waits), so HBIOS's keyboard code needs no change; check that against HBIOS before the layout. Bus: probably the 36-pin interface too (Ken, 2026-10-30), like the new CPU card. It is not strictly needed (the 30-pin bus has N0-N2, -MRD and -EF, which the IO card's 1852 uses today), but positions 1-3 (-EF1..-EF3) give the keyboard flag an EF line of its own (-EF3); the port decode stays on the card (no bus -INP/-OUT). Rev B stays as the 2005 card (Ken, 2026-10-24).
  • IO card, next revision: simple front-panel I/O (Ken, 2026-10-30). Once the keyboard has moved to the video card and the new CPU card has dropped the 1861, the IO card becomes: 8 LEDs on an output port (OUT n latched, e.g. a CDP1852 in output mode or a 74HCT374) and the same byte on 2 TIL311 hex displays (Ken, 2026-10-30; each TIL311 has its own 4-bit latch, strobed with the port), 8 switches on an input port (INP n, e.g. a CDP1852 in input mode or a 74HCT244), a Q LED (Q is bus pin 10), and a switch on one of the EF lines (an INPUT button, as on the COSMAC ELF). Also the machine's hand controls (Ken, 2026-10-30, option B): LOAD and PAUSE switches on -RESET/-PAUSE, the INPUT button on -DMAIN, and the 8 switches driving D0-D7 in the DMA cycle (only for its own request, -MRD high), so a program can be toggled in by hand, ELF-style; it works with or without a debug board present (docs/manual/bus.md, 36-pin extension). No 1861, no ribbon to the CPU card. Bus: probably the 36-pin interface (Ken, 2026-10-30), like the new CPU and video cards, so the EF switch can have one of -EF1..-EF3 to itself; the port decode stays on the card (N0-N2 and -MRD). The board layout rules apply: switches and LEDs on the front edge, each labelled (bit 0-7, Q, the EF switch's name). To decide: the port number(s) (the ELF uses port 4 for both; ports 1-3 are taken by the keyboard and the IDE card), which of -EF1..-EF3 (the keyboard keeps -EF), debouncing for the EF switch, toggle or DIP switches. 2026-10-30: netlist done (hardware/io-panel/kicad/rev-a/: ERC 0, schematic MATCH 64/64, in the book). Data bits: eight vertical M9040P toggles as on the YACC1 IO card (Ken, 2026-10-30). Board done 2026-10-30 (2 layers, preorder_check PASS, not ordered; DESIGN.md). TIL311 pinout and footprint taken from the YACC1 IO card. Modelled in s5emu (--panel A): a program toggled in and run, ELF-style. Open: Ken's look at the pictures; M9040P availability and lever direction. Earlier open items: the TIL311 pinout and footprint against its data sheet, then the board (2 layers).
  • Bus driver, next revision (BUSDRV-C): reach all 36 bus positions (Ken, 2026-10-30). BUSDRV-B is a 30-pin card: today the 36-pin extension lines (-EF1..-EF3, -PAUSE, -DMAIN, SC0; draft in docs/manual/bus.md) are reached with jumper wires from its J2 spares. The new card plugs into all 36 positions: 34 signals (with EXP as SC0, read only) against BUSDRV-B's 32 MCP23017 pins (28 used + 4 spares), so a third MCP23017. EXT CLK is not on the bus: give the card an EXT CLK output pin from a Nano timer (it can run the 1802 at a set rate as well as step it, faster than through I2C), wired to the CPU card's EXT CLK header pin. Drive -EF1..-EF3 open collector; drive -PAUSE and -DMAIN open collector: with them the bus driver can pause, step and load memory (LOAD mode + DMA IN) with the CPU card in place, the main reason for this revision; firmware commands for the new lines and the clock (rate, stop, step), and bringup.py / fwsim.py / backplane.py to match. Follows the 36-pin definition, so it waits for that; the board layout rules apply (Nano at a non-bus edge, USB facing out).
  • Memory card, next revision: EEPROM (28C256) sockets (Ken, 2026-10-30), so the 1802 can rewrite its own ROM in place. Rev E (ordered, Y55) stays a 27C256 card: its IC3/IC5 pin 1 (VPP) is tied to VCC and pin 27 is A14, which on a 28C256 are A14 and !WE. Fitted there, a 28C256 reads only its top 16K and takes a write whenever the CPU writes to an EPROM block with A14 low. The new revision: pin 1 = buffered A14, pin 27 (!WE) = -MRW gated by a WRITE ENABLE jumper or switch (open = read-only, the default), so stray writes and f_freemem's probe cannot change the ROM; check the 28C256's write timing (tWP, tWC) against -MRW at the bus clock. To keep taking a 27C256 as well, a PART jumper per socket swaps the two pins: 27C256 = pin 1 to VCC and pin 27 to A14; 28C256 = pin 1 to A14 and pin 27 to the gated !WE. A 27C256 must never get A14 on pin 1: VPP low is Rev B's misread fault. Rev E today can use a flash 27C256 replacement (SST 27SF256, Winbond W27C257/W27E257: same pins, erased in the programmer, no UV; check the T48 supports it). The board layout rules apply (future work).
  • VIDEO-G 1.0, the next video card (Ken, 2026-11-01): design hardware/video-g/DESIGN.md, boards hardware/video-g/kicad/ (README, BOM.md per board). Two boards on the 30-pin bus joined by a 40-pin ribbon: TEXT (6845 on ports 5/6, IDT7134 text RAM at 7000, status on INP 4, PS/2 keyboard on INP 1 + -EF so HBIOS keeps working, RCA + DB9 with a MONITOR jumper: 64x25 NTSC or 64x32 on an IBM 5151; works alone) and GFX (62256, two pages of 512x200 / 512x256, Y register OUT 7 with the line at 7800-783F, control register OUT 4: TEXT-OFF / GFX-ON / XOR / pages / MOUSE-ON, PS/2 mouse on INP 7). 2026-11-01: netlists, schematics (in the book), boards placed, routed and checked by kicad/common/build.sh; character ROM firmware/video-g-chargen. 2026-11-02: TEXT re-planned (DB9 flange at the front edge) and re-routed; both boards pass tools/preorder_check.py --layers 4. Written and run in the emulator only: the ATmega keyboard/mouse firmware (embedded/video-g-ps2), HBIOS's VIDEO-G build (firmware/hbios/video-g: CRTC on ports 5/6, 25 rows, 47 ms scroll), the s5emu model (--video g), GBASIC (software/gbasic). Open for Ken: TEXT is 188 mm tall (standard 141; DESIGN.md section 9 has the ways down) and the boot loader's port 4 (below), then order. To do after: bring-up from the bus driver. Replaces the 6845 card and the IO card.

Hardware design findings

From hardware/TIMING-REVIEW.md unless noted.

  • T1 (High), CPU card: the 74LS374 (IC1) latches the high address on TPA's rising edge, with no guaranteed setup: −102 ns worst case. It works because a typical 1802 is early, but it is a race (intermittent boot failures or wrong reads). Suggested fix: clock the 374 from inverted TPA, using a spare 74LS05 inverter (IC6C or IC6E) with a stiff pull-up of about 1 kΩ. That gives about 471 ns of setup at 1.76 MHz. Apply it on the real card, or in a CPU Rev B redesign.
  • T2 (Medium), 6845 card: register writes end with R/W (= -MWR) rising while E (= TPB) is still high, at any clock speed. It works on the HD6845; confirm with a scope.
  • 6845 Rev B as fitted: IC4 is a 74LS85, not the drawn 74S85, in the address compare gated by -VMA; IC9 is a 74AS175. The timing review used the Rev A netlist; recheck the decode path with the LS85 when the 6845 model moves to Rev B.
  • T3–T5 (Low), 6845 card: E width against its 450 ns minimum (+18 ns), register-read data setup (−77 ns worst case) and hold (typical only). CRTC reads are rare.
  • T6 (Low), IDE card: INP 3 into RAM, with drive data held +49 ns past WE. It fails worst case from about 2.2 MHz.
  • C2 (Small), CPU card: after a boot-EPROM read, its output overlaps the next card by 28 ns plus R13's RC time. See question 5.
  • Not reviewed yet: the reset/run circuit (IC3/IC4/IC5/U1 and its rework), the 1861's DMA timing, and electrical loading (fan-out, CMOS levels from LS outputs, rise times on long lines).
  • IO card's 1861 has never been tested on real hardware (hardware/FABRICATED.md).

Software and firmware

  • HBIOS v1.0.5: burn it (made 2026-11-12, firmware/hbios/v1.0.5/): v1.0.4 plus the monitor commands H (list the commands), B (boot the OS), D (disassemble, pausing every screen) and Q1 / Q0 (Q on / off), and the IO panel demo at @F1C0. Tested in the emulator only; the machine's 2732 holds v1.0.4. Ken burns a second 2732A at the T48 (README there) and keeps the v1.0.4 chip.
  • VIDEO-G: the ELF/OS boot loader writes port 4 (found 2026-11-01 in the emulator). Sector 0's loader shows each kernel sector number on port 4 (OUT 4, the ELF hex-display habit), which leaves VIDEO-G's control register at 0Eh after @FF00: graphics on, XOR, page 1, i.e. noise over the text until a program writes OUT 4 (GBASIC does). Decide before VIDEO-G is built: patch the loader (byte 64h at offset 24h of sector 0 to 60h = IRX, in disktool's boot[], mkelfos.py and on the cards), or put the control register on another port (firmware/hbios/video-g/README.md).
  • GBASIC 1.0 (software/gbasic, 2026-11-01): done and tested in the emulator only. Open: run it on VIDEO-G when the boards exist (the timings are the emulated 1802's); string variables (not done: the code is 12,473 bytes and leaves 6,210 for programs); SAVE/LOAD at about 280 bytes a second, most of it the ELF/OS 0.2.6 kernel's byte-by-byte read/write (reading whole sectors through the lump chain would be much faster); the mouse is not used.
  • HBIOS for VIDEO-G: the IBM 5151 table (64 x 32) is not done (firmware/hbios/video-g). At 32 rows the text fills 7000-77FF, so HBIOS's cursor must move out of 77FE/77FF first (R14/R15 can be read back on port 6).

  • HBIOS 64-column line wrap: the first character after a wrap is lost, so ELF/OS DIR drops every 5th name. Found with the emulator; not fixed.

  • EDIT with no file name hangs ELF/OS (found 2026-10-07, same in the fast and --hw emulators). EDIT passes an empty name to the kernel's open (CALL 0306); the kernel returns the error, but its return chain pops 6413 instead of EDIT's 20E6, and the 1802 stops on IDL in empty RAM. Most likely kernel 0.2.6 build 135's empty-path handling. Workaround: always give a name (EDIT TEST.TXT). To do: trace the kernel's open error path, or check a later release in reference/mike-riley/elfos-releases/.
  • BIOS probes on ports 2/3: Mike Riley's BIOS probes for a UART and an RTC on ports 2/3, which on System-5 are the IDE registers. Check that those probes do no harm to the drive.
  • Memory Rev B: tie IC5's VPP to VCC. Its Microchip 27C256 reads wrong on the card because Rev B grounds VPP (pin 1); the chip itself is good (read on the T48, 2026-10-30). Lift pin 1 and wire it to pin 28, or use the card only until MEM3-E arrives (VPP = VCC). The chip holds an ELF/OS install ROM build not otherwise in the repo; the T48 read is filed (hardware/memory/eagle/rev-b/bringup/README.md).
  • Bring-up findings to settle on the real cards (software/busdrv/bringup.py): the all plan answers question 7 (the reworked Rev B's RAM and the 6845 card both decoding 7000-7FFF, as the netlist predicts); cf reads the IDE jumpers' ports (question 8); video V6 shows whether the crystal suits HBIOS's CRTC table.
  • Build the CF card on the Mac instead of from the install EPROM (Ken, 2026-10-30). Works on the real machine (2026-11-04): software/s5emu/tools/mkelfos.py ~/s5-cf.img --mb 15 for a 16 MB card (exactly 31,360 sectors) in a USB reader, written raw (diskutil unmountDisk /dev/diskN, sudo dd if=$HOME/s5-cf.img of=/dev/rdiskN bs=1m) and read back clean (sudo dd if=/dev/rdiskN bs=1m count=15 | cmp - ~/s5-cf.img). On System-5 at 500 kHz @FF00 boots to Elf/OS Ready, and FREE (3840 total AUs), DIR and MKDIR X all work (Ken): the first test of the 1802's own writes to the card. --mb counts MiB (2,048 sectors each), so use the largest that fits: --mb 16 is 32,768 sectors, too big for this card, so --mb 15 (30,720 sectors, 640 left unused); --mb 61 for a 64 MB card, whose 125,440 sectors are 61.25 MiB (tested in the emulator 2026-11-04). The image holds FSGEN, kernel 0.2.6 build 135 and Mike's programs in / and /BIN; edit it later with disktool. Before this the card read all zeros, 31,360 of 31,360 sectors with no size stored in sector 0 (backup ~/cf-card-backup-2026-11-04.img), left by the install ROM's format (below). If it is the 16MB CLS card of 2026-10-30 (the reader hides the model and serial; software/busdrv/bringup.py cf shows them), the 2005 install is gone, and the repo has only the first 64 bytes of its sector 0, in that bring-up report. To do: a manual section (docs/manual/programmers-guide.md, "The CF card"), and an mkelfos.py --card helper that checks the image and prints the dd line. Other cards must accept 8-bit mode (Set Features 01h; many modern CF cards don't: use small older ones). The install EPROM uses 8000-E32E (ELF/OS build in firmware/elfos-install-rom); without it the memory card's HI 32K can be RAM.
  • The install ROM's Full format cannot leave a usable disk (found 2026-11-04 reading the ROM; Ken's own run was on the IC5 ROM, next item). In firmware/elfos-install-rom/elfos.32k.rom.01, which asks <Q>uick or <F>ull ?, option 1 F writes zeros until a write fails, then stores that count in sector 0; but the failed write leaves ERR set, HBIOS's ready check (FB9A) then refuses both the reset (FB00) and the last write, nothing checks that, and it still prints Complete. In the emulator (ERR held until the next command, as in ATA) the stored size is 0 and option 2 builds a 0-sector filesystem. Quick (IDENTIFY) stores the right size, even straight after a Full. If the card never reports the error, Full never ends; FBED waits for DRQ with no timeout, so a card that gives neither hangs there. Use Quick or the Mac.
  • The IC5 install ROM misses the end of the card (found 2026-11-04). The ROM the repo records in MEM3-E's IC5 (hardware/memory/eagle/rev-b/bringup/2026-10-30-eprom-ic5-t48-read.bin, the base of firmware/elfos-install-rom/with-basic/) has no Quick/Full prompt: option 1 always makes the full pass. After each write it tests bit 0 of what HBIOS returns, the ATA error register (SHR at 9248), not DF. The usual end-of-card errors, IDNF 10h and ABRT 04h, leave bit 0 clear, so it carries on: HBIOS refuses every later write at FB9A, nothing more reaches the card, and the count climbs past the end and wraps at 65,535. It would stop with E after 2^29 turns, roughly a month at 500 kHz. Run in the emulator on a 300-sector card with past-the-end writes failing (a scratch test; machine.py unchanged): 10h and 04h never finish, 01h finishes. A pass takes about 40 minutes on the 16 MB card at 500 kHz (4,700 machine cycles a sector) plus the card's write time, so days of running was not writing. Every ending leaves all zeros and no size in sector 0, which is what Ken's card read: this is the ROM he ran on the 16 MB card for days (option 1 did not ask Quick or Full; Ken, 2026-11-04). Even when option 1 finishes (01h), option 2 then reports Total Sectors: 0, so this ROM cannot make a new card; on a Mac-built card option 2 is fine (30,720 sectors, 3840 AUs). Use the Mac (docs/manual/operators-guide.md section 3).
  • Move the 6845 video to E000-EFFF (Ken, 2026-10-30), with the CF card built on the Mac: RAM 0000-DFFF in one piece (RRRRRRRRRRRRRR--, 56K) instead of 0000-6FFF + 8000-EFFF. Needs: memory Rev E (the reworked Rev B ignores its jumpers); 6845 SV1 7-8 instead of 1-2 (RN1 pulls each compare bit high, a jumper grounds it: 7-8 = A12 low = block E); HBIOS rebuilt with vmem equ 0E000h, crtca equ 0E800h and the hard-coded first cursor ldi 073h in sec1.asm (store cursor position) changed to 0E3h, then the CPU EPROM reburned; check the cursor shows (update masks the cursor high byte with 3Fh: 73 -> 33 today, E3 -> 23); move every 7000/7800 in the manual, s5emu (--map, the 6845 model) and bringup.py (video_base). Installing from the OS EPROM after the move (RAM 0000-7FFF, EPROM 8000-DFFF): Ken's chip (hardware/memory/eagle/rev-b/bringup/2026-10-30-eprom-ic5-t48-read.bin) runs to E084, and E000-E084 would sit under the video. That piece is one program, STAT (133 bytes, loads at 2000): the table at 8000 lists each program as name, 0, ROM start, ROM end, load address, size, exec address, so STAT's entry at 8150 points to E000-E085. Fix: copy E000-E084 into the free gap B57E-BFFF (e.g. B600) and change 8151/8153 from E0 to B6 (two bytes), try the patched ROM's install in the emulator (later, Ken 2026-10-30), then burn a new 27C256. A rebuild from source is not possible today: the repo has the kernel's source (reference/mike-riley/elfos-kernel-135) and rcasm, but the utilities only as binaries (elfos-programs/bin) and no source for the installer's own code (9000-B57D, the part the table doesn't list). Shifting the whole image down to 7000 instead would mean patching every entry's addresses and any absolute addresses in the installer's own code (no source in the repo). Or install before the move (video at 7000, old HBIOS), or skip the EPROM (CF built on the Mac). Once a card holds ELF/OS the OS EPROM is not needed: HBIOS @FF00 boots from the card; keep the chip for rebuilding a card without a Mac. Note: f_freemem scans up from 0000 to the first byte that won't write, so it ends at the top of the video RAM (77FF today, E7FF then), where HBIOS keeps the cursor; ELF/OS kernel 135 doesn't use it, but programs that do would write over it either way.
  • IO card (1861 + keyboard) bring-up: later. It is tied to the CPU card, so it waits for the CPU card redesign below.
  • Fix EXEC in the ELF/OS install ROM (found 2026-11-01 in the emulator): the ROM's EXEC entry (C680-C69C) loads and runs at 7000, which is the 6845's video RAM on System-5 (the ROM was built for another memory map). Reassemble or patch it to load in RAM (for example 6000, like SAVE/DUMP/ASM), change its table entry at 80CF, and rebuild firmware/elfos-install-rom/with-basic/ (build.py). Until then don't run EXEC.
  • Rc/Basic Level 2 (reference/mike-riley/elfos-programs/rcbasicl2, 6,374 bytes, ELF/OS executable: load 2000, exec 2000): it has FOR/TO/STEP/NEXT, ON, DATA/READ/RESTORE, DIM and strings (its keyword table, read 2026-11-01; Level 1, now BASIC in firmware/elfos-install-rom/with-basic/, has none of them). Run it in the emulator first. It does not fit in any free gap of the install ROM (largest 3.9K at E085-EFFF), so either copy it onto the CF card as a file, or make room (a 27512 / dropping programs).
  • IO card keyboard path works (2026-11-01): the full system (CPU A from its crystal, MEM3-E, 6845 B, IO A with a PS/2 keyboard) boots HBIOS to test> and takes keys. Still untested on the IO card: the 1861.

Emulator (s5emu)

  • 6845 character generator from firmware/char-rom-fonts/goodfont (the Rev B EPROM image: ASCII × 8 + row, dots in bits 7-3), and the PIC keyboard path from hardware/io-1861-keyboard/pic-ps2-firmware/.
  • Timing analysis limits (s5emu/timing.py): gates have no minimum delay (hold checks are conservative), delays are per part not per edge or load, and contention is checked only between cards. Refine if a finding hinges on them.
  • IDE model: a write past the end of the disk should fail (found 2026-11-04). machine.py IDE ignores it, so the install ROM's Full format (it writes until the card reports an error, then stores that as the size) never ends in the emulator. Set ERR on the write command as the read command does.
  • Web emulator, step 2: run it in the browser with no server (Ken, 2026-11-12). Step 1 is done: the page (s5emu/web/index.html, Machine and Debugger tabs) over HTTP to s5emu/web.py, started by web-start.sh, and the GitHub Codespace (.devcontainer/, software/s5emu/CODESPACE.md). Step 2: run the same Python in the browser with Pyodide (WebAssembly CPython), calling web.App's methods (state, command, key, set_mem) through window.S5_EMU, with the emulator stepped from the page's timer instead of a thread. Then a static page could serve it, e.g. the System-5 website. Before any public page: HBIOS and ELF/OS are Mike Riley's (permission, or the visitor supplies the ROM and disk; see Repository's before-going-public checklist). To check first: the speed under Pyodide (CPython here does about 230,000 instructions a second, twice a 1.76 MHz 1802).

KiCad conversions (optional: history)

  • Redrawn schematics: done 2026-10-26 for CPU A, memory E, 6845 B, IO A, IDE A and bus driver B (tools/kicad/sch/README.md). Each card converted from a new Fusion export (below) can be redrawn the same way: a schematic/spec.py and one run.

Every card already has a KiCad version to work from: CPU A, memory B/C/D, 6845 B, IO A, IDE A and the bus driver. The breadboard card was never made. The bus PCB's only surviving board file, the 2009 backup, is exported and converted (bus/kicad/rev-2009, MATCH 36/36; schematic redrawn). The built bus PCB is the 2009 one (Ken, 2026-10-26). Its X1 power connector reaches GND on the copper (pin 2) but not +5V (pin 1: the 5V track stops short). Ken: check with a meter, and how +5V gets in (a wire to X1.1?). The remaining exports (14 of 33 done, hardware/check-exports.sh) only document the past, so do them only if wanted:

  • Maybe useful for a redesign: CPU Rev B or C (the unbuilt fixes to Rev A's mistakes). A CPU redesign can equally start from CPU A in KiCad.
  • History only: Memory Rev A (superseded by B/C/D), mem1, mem2, the cpu1 prototype, breadboard proto A, bus Rev A-C sheets, and the circuits sub-sheets.
  • IDE Rev A has no copper gerbers or order zip on file (searched elf-1, elf-2 and 1802), so only its drill tally could be checked against 2005.
  • Tool quirk: tools/eagle_to_kicad_all.py ignores --help and converts everything; use --only.

Repository

  • Public/private split: a public repo with Ken's own work, with the third-party PDFs and code in ~/Developer/private-resources/elf/. The old phone number and email were removed from every file and from the whole git history on 2026-11-04 (0 hits across 3,053 file versions, zips included). GitHub can keep old commits reachable by ID for a while, so ask GitHub Support to purge them before going public. The third-party files are still in the history. Start fresh or clean the history; never just make this repo public.
  • Before going public: checklist (Ken, 2026-11-03). The history clean removes the phone number but does not make the repo publishable; these do:
  • Where the private files go: ~/Developer/private-resources/elf/ (github.com/ksr/private-resources, private, set up 2026-11-03), at the same paths; elf finds them as ../private-resources/elf/.
  • [ ] reference/ (27 MB) to the private elf-reference repo: Mike Riley's ELF/OS and rcasm, the Spare Time Gizmos ELF2000, Tiny BASIC, the tools and their manuals, the datasheets and idt7134sa_idt7134la.pdf (link to the makers' copies instead).
  • [ ] Third-party code and binaries outside reference/: firmware/elfos-install-rom/ (ELF/OS ROM images and .intel files, Mike Riley); software/disktool/kernel.bin (the ELF/OS kernel); software/rcasm-mac-build/ (an rcasm build); firmware/system4-tiny-basic-rom/ (tbasic.hex, probably Tom Pittman's copyrighted 1802 Tiny BASIC); firmware/char-rom-fonts/ (2513 dumps, low risk). Move to elf-reference or get permission.
  • [ ] HBIOS (firmware/hbios/, software/s5emu/roms/hbios-1.0.4.*, orig_bios/bios.img): Ken's changes on Mike Riley's BIOS. Ask Mike Riley whether HBIOS and ELF/OS may be published (one answer covers most of this list); otherwise publish only Ken's changes, and s5emu users supply the ROM and disk image themselves.
  • [ ] software/disktool/: no author or copyright header; find out whose it is.
  • [ ] The old website copies (docs/website-2005/, docs/website-older/): check every image is Ken's, drop the Yahoo visitor-counter script, check the quotes and links.
  • [ ] Personal details sweep: a street address, other people's names, emails and phone numbers, in every file and zip (only the phone number and the old email were searched, 2026-11-03).
  • [ ] Claude's notes: decide whether CLAUDE.md goes public (the website already leaves it out).
  • [ ] Size: drop large files nobody needs (about 130 MB tracked).
  • [ ] Start the public repo fresh (the third-party files then never enter its history), with a licence for Ken's own work, and link elf-reference as a submodule.