CERBERUS

> Hardware detection, diagnostic, and benchmark tool for vintage DOS PCs.

A DOS-native tool that detects, diagnoses, and benchmarks vintage PC hardware, then shows it working through a visual journey of six hardware demonstrations before cross-checking the results.

CERBERUS v0.4.0 three-pane UI on a 486 DX-2. Left pane DETECTION lists CPU as Intel i486DX2, FPU as Integrated i486DX FPU, 63,076 KB extended memory, S3 Trio64 video, AMI BIOS. Right pane BENCHMARKS shows 1.96M integer iterations per second, 31,862 Dhrystones, 1.12M FPU ops per second, memory throughput 15 MB per second. Bottom pane SYSTEM VERDICTS lists seven PASS rows and two WARN rows in green and yellow.
CERBERUS v0.4.0 on the BEK-V409 bench box. 486 DX-2-66, S3 Trio64, AMI BIOS 11/11/92, 63 MB extended. All diagnostics PASS. Two consistency WARNs on expected paths: the timing cross-check (issue #1) and the bench_cpu WARN correctly exonerated by the cache-diagnostic-aware Rule 4b narration.
Where things stand: v0.8.1 tagged 2026-04-22, same-day completion release on top of v0.8.0. Closes the IEEE-754 edge-case diagnostic, /CSV output mode, L1 pointer-chase latency probe, L2 reach via a 64 KB FAR buffer, DRAM ns derivation, Hercules variant discrimination (HGC/HGC+/InColor), IIT 3C87 DB row + routing, and Genoa ET4000 chip-level probe. 376 host-test assertions green. v0.8.0 tagged earlier the same day. Active development paused 2026-04-23 while I (Tony) focus on NetISA (all hardware delivered 2026-04-23: new, exciting, wants my attention). The v0.8.1 tag is production-ready and the v0.9.0 plan is fully scoped at docs/CERBERUS_0.9.0_PLAN.md whenever development resumes. Parking notes at PARKING.md. The trust-first release: every shipped number has been verified on real iron, captured from a BEK-V409 486 DX-2-66 and a 386 DX-40 + IIT 3C87. The release is deliberately smaller than the v0.7.1 envelope: Whetstone emit is suppressed in stock builds (kernel was 10-30x below the published reference band on real silicon), the runtime upload to barelybooting.com is compiled out of stock binaries (returning in 0.9.0 with a stack-safe offline fallback). What shipped is production-quality: CUA-lite UI (F1 help overlay, F3 exit, Norton-style F-key legend, /MONO flag, CGA snow-safety gate), 5-axis FPU behavioral fingerprint, 6-stride cache characterization including line=32/64 plateau detection for Pentium+, possible-causes narration on every FAIL/WARN consistency rule. 320 host-side assertions green across 9 test suites. Binary ~167 KB, DGROUP 59.5 KB / 64 KB. Four milestone commits on main (0.8.0-M1 through 0.8.0-M4) document the arc. Companion barelybooting-server still at v0.1.0: production-ready, awaiting the 0.9.0 CERBERUS upload-path revival to go live.

The visual journey (v0.6.0)

v0.6.0 turned CERBERUS from a tool that produces numbers into an experience that shows the hardware working. Eight title cards introduce eight demonstrations, each one genuine hardware computation made visible:

The journey ends with the scrollable summary: three directional Cerberus heads (facing left for Detection, forward for Benchmarks, right for Verdicts) guarding their domains. Every detected value, every benchmark number, every consistency verdict rendered in 80 columns of CP437 block art. No information truncated, no row budget cap.

Community upload (deferred to 0.9.0)

The upload path (POST CERBERUS.INI to barelybooting.com via mTCP HTGET) shipped in v0.7.x but is compiled out of stock v0.8.0 builds. The v0.7.1 real-iron validation surfaced a stack overflow when barelybooting.com was unreachable, and the trust-first cut for v0.8.0 was to remove the surface entirely rather than ship a partially-working feature. Rebuild with wmake UPLOAD=1 for research use; the full revival with a stack-safe offline fallback is the 0.9.0 work.

The server side is still there waiting: v0.1.0 shipped 2026-04-21 as a small Flask + SQLite app, deployable as a Docker image behind a Cloudflare Tunnel, red-teamed before first traffic. It enforces the upload contract strictly (ASCII only, 64 KB ceiling, 32/128 char caps on nickname/notes), rate-limits submissions by true client IP (CF-Connecting-IP, not edge IP), and ships with a CSP + frame-deny response header so a future markup slip cannot escalate to stored XSS. The container runs read-only, drops all Linux capabilities, and has no-new-privileges set. When the client path returns in 0.9.0 the server is ready.

The INI format stays frozen at ini_format=1 with a documented backward-compatibility commitment, see the server API contract. v0.8.0 captures are already format-compatible with the future upload endpoint; no data migration will be needed when the path re-opens.

What’s new in v0.8.0

Four milestones in a 36-hour arc:

Deferred to 0.8.1: IEEE-754 edge-case diagnostic (9 operand classes x 5 ops), /CSV output mode, L1 pointer-chase latency probe, L2 detection via larger sweeps, DRAM latency derivation, IIT 3C87 discrimination. Full list in the v0.8.0 release notes.

CERBERUS is named after the three-headed dog of Greek myth that guarded the gates of the underworld. Each head is one of the three analysis domains:

The three heads share a common body of timing, display, and reporting infrastructure. Their results feed a consistency engine that flags disagreements. This is the project's reason to exist.

The consistency engine

Most DOS diagnostic tools tell you what your hardware says it is. CERBERUS tells you when what your hardware says it is disagrees with how it behaves.

Eleven rules in force today, each emitting a consistency.* row in the INI with PASS, WARN, or FAIL:

Every rule documents what it catches AND what it structurally cannot. A rule that only catches asymmetric failures says so explicitly. Opacity is the anti-pattern.

Output

CERBERUS writes a machine-parseable INI file with every detected property, diagnostic verdict, benchmark result, and consistency-rule outcome. Each row carries a confidence indicator: HIGH when the probe is authoritative, MEDIUM when inferred, LOW when emulated or guessed. Running inside DOSBox-X automatically caps all confidence at MEDIUM because emulated hardware isn’t ground truth.

Two signatures land in every INI:

The benchmark as art

When bench_video runs, what you see on screen is the benchmark. The text-mode pass writes every CP437 glyph in every color-attribute combination to the 80×25 VRAM segment. The mode 13h pass writes horizontal stripes of palette data across the 320×200×256 framebuffer. Both passes are timed write-loops against memory-mapped hardware, and both are rendered live by the monitor that the memory is mapped to.

Photograph: 486 CRT monitor showing colorful chaotic patterns of CP437 characters during bench_video text-mode measurement. Open 486 case visible to the right.
bench_video text-mode, caught mid-run. Every cell gets a CP437 glyph and a color attribute in sequence, timed against a BIOS tick.
Photograph: 486 CRT monitor showing horizontal bands of blue, green, and red pixels during the bench_video mode 13h measurement.
bench_video mode 13h. 320×200×256 palette stripes rendered as the write loop walks VRAM. Mode exits cleanly back to mode 3 after measurement.

Target hardware

Floor 8088 + 256KB + MDA
Common 286 / 386 + CGA/EGA
Ceiling 486 + VGA + VLB/PCI
RAM 256KB min
OS MS-DOS 3.3+
License MIT

8088 support is a hard requirement, not an aspiration. Anything that breaks it is out.

Technical

Platform MS-DOS (real mode)
Model Medium (far code, near data)
EXE ~167 KB (v0.8.0)
DGROUP 59.5 / 64 KB
Toolchain OpenWatcom 2.0 + NASM
Host tests 320 assertions

128 seed entries across five identification databases (CPU 34, FPU 14, video 28, audio 31, BIOS 21). Every DB is a human-editable CSV with a Python build script that generates the C lookup tables. If CERBERUS can’t identify your chip, the raw probe data gets captured to CERBERUS.UNK and the summary tells you how to send the file in to grow the database.

Real-hardware validation

Photograph: CERBERUS v0.4.0 three-pane UI on a ViewSonic CRT monitor, with the open BEK-V409 486 case visible to the right. Red LED glows inside the case.
The BEK-V409 bench box. Intel i486DX-2-66, S3 Trio64 VLB, AMI BIOS 11/11/92, 64 MB RAM. Eight consecutive clean real-iron runs through the v0.4.0 capture.

The v0.4.0 validation capture archived at tests/captures/486-real-2026-04-19-v0.4.0 is a full CERBERUS.INI from one bench-box run. Every diagnostic PASS. Two consistency WARNs on expected paths. cpu.dhrystones = 31,862 lands within 5% of CheckIt 3.0's reported number on the same hardware (33,609), which is the empirical agreement target for 486-class boxes. Not an algorithmic equivalence: Phase 2 Homage research confirmed CheckIt's “Dhrystones” is a custom synthetic, not a Dhrystone port.

Compared to other DOS diagnostic tools

If you’ve run retro PCs for a while you’ve used CheckIt 3.0, SpeedSys, Norton SYSINFO, QA-Plus, CHKCPU, TOPBENCH, PCPBENCH, or 3DBENCH. They’re all still useful. CERBERUS is not a replacement for any of them; it focuses on a different question.

The Homage research directory documents what CERBERUS learned from each one, with honest credit and no code copying. Short version:

What CERBERUS adds: consistency cross-checking between what hardware claims and what it actually does (eleven rules today), dual signatures for counterfeit-CPU and remarked-chip detection, Mann-Kendall thermal trend analysis over calibrated-mode multi-pass runs, a visual journey of eight hardware demonstrations that make the tool’s work legible instead of just numeric, and community upload to a browsable results database at barelybooting.com/cerberus/. None of the other tools do all of that.

When to reach for each: if you need exhaustive peripheral diagnostics, QA-Plus or CheckIt. If you need authoritative CPU ID across the Cyrix / NEC / IIT landscape, CHKCPU. If you need community-reference benchmark numbers, TOPBENCH. If you need to know whether a dodgy eBay 486DX is actually a 486SX with a remark job, CERBERUS’s consistency engine + signature pair is what the other tools don’t have.

FAQ

Will it run on my 8088?
Yes. 8088 + 256 KB + MDA is the hard floor. VGA-only visuals (Mandelbrot, Lissajous) skip gracefully on lower adapters; text-mode visuals (bit parade, PIT metronome, cache waterfall, latency heat map, audio scale) run on every adapter including Hercules. No 386+ instructions leak into the 8088 code path.
Does it work in DOSBox-X, 86Box, PCem?
Yes. CERBERUS detects the emulator and automatically caps all confidence values at MEDIUM, since emulated hardware isn’t ground truth. Benchmarks still run; results are still reproducible same-machine; but cross-tool comparisons against real-iron numbers should be flagged.
My CPU / video card / sound card isn’t identified correctly.
The identification databases live as human-editable CSVs in hw_db/. 128 seed entries today across five databases (CPU, FPU, video chipset, audio chipset, BIOS family). When CERBERUS can’t identify your hardware, the raw probe data is captured to CERBERUS.UNK. Send that file in and it grows the database.
How is this different from CheckIt?
CheckIt tells you what your hardware says it is. CERBERUS also tells you when what your hardware says disagrees with how it behaves. The consistency engine (eleven rules) catches counterfeit CPUs, remarked chips, thermal throttling, cache disabled in BIOS, TSRs stealing cycles, timing-code bugs, and frankenboard builds where detection claims something the hardware physically cannot do.
What’s the community upload do?
It shipped in v0.7.x and is compiled out of v0.8.0 stock builds pending revival in 0.9.0 with a stack-safe offline fallback. Rebuild with wmake UPLOAD=1 for research use. The server side is production-ready and waiting. When the path returns, CERBERUS.INI posts via mTCP HTGET; you browse submissions, filter by CPU class, and compare runs from the same machine over time. Anonymous by default; nickname + note via /NICK: and /NOTE:.
What’s in a CERBERUS.INI?
Plain ASCII INI with every detected property, diagnostic verdict, benchmark number, and consistency-rule outcome. Two SHA-1 signatures (hardware identity + per-run). Full format spec at docs/ini-format.md. The format is frozen at ini_format=1 with a documented backward-compatibility commitment.
How does the results browser server work?
Small Flask + SQLite app, about 700 lines of Python. Deploys as a Docker container with a cloudflared sidecar: Cloudflare Tunnel is outbound-only, so there’s no port forwarding and no public IP exposed. Runs happily on a Home Assistant OS mini PC. The intake endpoint is rate-limited (per-client, via CF-Connecting-IP), enforces the INI contract strictly (ASCII only, 64 KB ceiling, length caps on user-supplied fields), and the whole container runs read-only with all Linux capabilities dropped. Source and deploy guide: BarelyBooting/barelybooting-server.
Will it damage my machine?
No destructive operations. No low-level format, no disk writes outside the user’s working directory (CERBERUS.INI and sometimes CERBERUS.UNK), no port writes outside documented probe targets with safety gates on the DMA refresh / cascade channels. This is a deliberate design choice; QA-Plus and similar tools bundled low-level format utilities which CERBERUS specifically rejects.
Is there a Windows version?
No. CERBERUS is DOS real-mode only. The scrollable UI uses direct VRAM writes at B800:0000 (color) or B000:0000 (mono), which is not a thing on Windows. Run it under DOSBox-X if you don’t have real iron.
License?
MIT. Hardware databases are CC0. Contributions welcome.

Download

CERBERUS.EXE is attached to the v0.8.1 release at dl.barelybooting.com. Single-file DOS real-mode executable, ~171 KB. Drop it on a FAT16 volume, run from the DOS prompt, read the resulting CERBERUS.INI. Full release notes at the release page.

Known issues are tracked internally; the source archive includes the latest status in its docs.

Links