velxio/test/test_intel/test_8080/README.md

89 lines
3.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# test_8080 — Intel 8080 as a velxio custom chip
See [../autosearch/02_intel_chips_overview.md](../autosearch/02_intel_chips_overview.md#intel-8080-1974)
for the spec.
## Status
**Implemented.** 18/20 tests passing. ~470 LOC clean-room C in
`8080.c` compiled to `fixtures/8080.wasm`.
Validated against:
- Intel 8080 Microcomputer Systems User's Manual (Sept 1975, doc 98-153B)
- Intel 8080/8085 Assembly Language Programming Manual (May 1981, doc 9800301D)
- Cross-checked AC flag rules, DAA, status bytes, and CALL/RST stack
ordering against `superzazu/8080` (MIT, passes 8080EXM) and
`mayawarrier/intel8080-emulator` (MIT). No code was copied — only
authoritative spec consultation.
The 2 remaining `it.todo` tests are integration milestones (hand-built
loop, CPUDIAG ROM run) deferred until a generic `rom-32k` chip exists.
## Pin contract (40-pin DIP)
Power simplified: real 8080 needed +12 V / +5 V / 5 V; we collapse to
single `VCC` / `GND`. Documented under
[../autosearch/05_open_questions.md](../autosearch/05_open_questions.md#q6-power-pins--collapse-or-model).
| Group | Pins | Dir |
| ------------ | ----------------------------------- | --- |
| Address bus | `A0..A15` | out |
| Data bus | `D0..D7` | I/O |
| Status/ctl | `SYNC`, `DBIN`, `WR̅`, `INTE` | out |
| Inputs | `RESET`, `READY`, `HOLD`, `INT` | in |
| Outputs | `WAIT`, `HLDA` | out |
| Clock | `φ1`, `φ2` | in |
| Power | `VCC`, `GND` | power |
Total registered pins: 16 (addr) + 8 (data) + 4 (status) + 4 (inputs) +
2 (outputs) + 2 (clock) + 2 (power) = **38**. Two real-silicon pins
(`+12`, `5`) are dropped.
## Bus cycle reference
For each machine cycle:
```
T1: drive A0..A15 with target address.
Drive D0..D7 with status byte (memory read = 0x82, etc.).
Pulse SYNC high.
T2: deassert SYNC. Switch D0..D7 to input (for reads) or hold them
as data output (for writes). Assert DBIN (read) or WR̅ (write).
T3: sample D0..D7 (read) or hold (write).
TW: optional, while READY is low.
T4..T5: instruction-internal work, no bus activity.
```
In the timer-driven model we collapse all five T-states into a single
"step one instruction" callback that internally walks T1→T3 and emits
the pin events in order. A faithful single-step mode driven by an
external clock chip is a follow-up.
## Target demo sketch
CP/M-style "hello world" via memory-mapped UART: 8080 wired to a
ROM chip (program), a RAM chip (stack/heap), and a UART chip
(velxio's `uart-rot13.c` example shows that custom UARTs work).
Program prints to UART; user sees output in the velxio serial monitor.
This is a real, recognisable retro-computing demo.
## Implementation plan
1. Spike a minimal 8080 chip that runs MOV / ADD / JMP only,
driving an LED off `D0` of a memory-mapped output port. Confirms
the bus state machine works.
2. Port the full ISA from a permissively-licensed reference (see
`autosearch/04`) into `8080.c`.
3. Run CPUDIAG (the standard 8080 self-test program) — load it as
ROM, verify it prints "CPU IS OPERATIONAL" via the UART.
4. Add interrupt support (8259-style PIC is out of scope; just `INT`
pin → fixed RST vector for the first cut).
## Files to create later
- `8080.chip.json`
- `8080.c` (or split into `8080.c` + `8080_decode.h` if it gets large)
- `roms/cpudiag.bin` (public-domain test ROM)
- `8080.test.ts`