velxio/test/test_intel/test_4004/README.md

85 lines
3.1 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_4004 — Intel 4004 as a velxio custom chip
See [../autosearch/02_intel_chips_overview.md](../autosearch/02_intel_chips_overview.md#intel-4004-1971)
for the chip's specs and [../autosearch/03_emulation_strategy.md](../autosearch/03_emulation_strategy.md)
for how the bus phases map onto velxio's reactive callbacks.
## Status
📋 **Spec only.** No `.c` source yet.
## Pin contract (16-pin DIP, real silicon)
| Pin | Name | Dir | Notes |
| --- | --------- | ----- | ----- |
| 1 | D0 | I/O | Multiplexed nibble bus |
| 2 | D1 | I/O | |
| 3 | D2 | I/O | |
| 4 | D3 | I/O | |
| 5 | VSS | power | GND |
| 6 | CLK1 | in | Phase 1 clock |
| 7 | CLK2 | in | Phase 2 clock |
| 8 | SYNC | out | Cycle marker |
| 9 | RESET | in | |
| 10 | TEST | in | Conditional-jump input |
| 11 | CM-RAM3 | out | RAM bank select |
| 12 | CM-RAM2 | out | |
| 13 | CM-RAM1 | out | |
| 14 | CM-RAM0 | out | |
| 15 | CM-ROM | out | ROM strobe |
| 16 | VDD | power | +5 V (real chip wanted +5/-10 V split — collapsed for digital sim) |
**Pin-numbering note:** the table above orders pins logically, not in
the physical 116 DIP layout. Cross-check against an Intel 4004
datasheet before finalising the `.chip.json`. Logged in
[../autosearch/05_open_questions.md](../autosearch/05_open_questions.md).
## Bus model summary
8-cycle instruction frame. Each CLK1+CLK2 pair = one cycle. Within an
8-cycle frame the chip drives:
| Cycle | What's on D0..D3 | Direction |
| ----- | ---------------- | --------- |
| A1 | addr nibble 0 | output |
| A2 | addr nibble 1 | output |
| A3 | addr nibble 2 | output |
| M1 | opcode hi nibble | input (read from ROM) |
| M2 | opcode lo nibble | input |
| X1 | data / operand | varies |
| X2 | data / operand | varies |
| X3 | data / operand | varies |
`SYNC` rises at the start of A1 to mark the cycle frame to external
ROM/RAM chips.
## Target demo sketch
A 4004 running the classic `Busicom 141-PF` 4-instruction blink loop
that decrements a register and writes its low bit to a CM-RAM line
driving an LED. Smallest possible "I see CPU activity" demo.
## Implementation outline
1. `4004.chip.json` — declare 16 pins above, plus a `program_rom`
property (hex string, max 4 KB).
2. `4004.c`:
- `chip_setup()`: register pins, allocate `cpu_state_t`, load ROM
from property, start a repeating timer at the instruction-cycle
period.
- `on_cycle_tick()`: walk the 8-phase state machine, drive pins
accordingly. For ROM reads this is internal (we hold the ROM in
chip memory for the first cut); for RAM reads we'll route through
external RAM chips on the canvas.
3. Test with a hand-assembled ROM that lights an LED via CM-RAM0 →
external 4002-equivalent RAM (or, simpler, drive an LED directly
off CM-RAM0 since it's a real output pin).
## Files to create later
- `4004.chip.json`
- `4004.c`
- `sketch.asm` (hand-assembled demo) and `rom.hex` (assembled bytes)
- `test_4004.test.ts` mirroring the style of
`test/test_custom_chips/test/`