6.4 KiB
Intel 4004 Authoritative Specification
Sources (in autosearch/pdfs/):
- [M4] MCS-4 Micro Computer Set Users Manual, Intel, Feb 1973 (175 pp). Page numbers below are the printed body footers.
- [M40] MCS-40 User's Manual, Intel, Nov 1974 — Ch. 1 also describes the 4004; used as cross-check.
- [I] olbits MCS-4 instruction reference (e4004.szyc.org/iset.html) — used only to cross-check opcode hex against [M4] Table V.
1. Pin contract — 16-pin DIP ([M4] §III, pp. 7–9; supplies p. 102)
The 4004 (Nov 1971) is the first commercial single-chip microprocessor. PMOS, two-phase dynamic clock; Vss = GND, Vdd = −15 V ±5%. Logic 1 = low (negative) voltage; logic 0 = Vss ([M4] p. 6).
| Pin | Name | Dir |
|---|---|---|
| 1–4 | D0..D3 | I/O — multiplexed 4-bit data/address bus (D3 = MSB) |
| 5 | Vss | GND |
| 6, 7 | Φ1, Φ2 | In — non-overlapping clocks |
| 8 | SYNC | Out |
| 9 | RESET | In |
| 10 | TEST | In |
| 11 | CM-ROM | Out |
| 12 | Vdd | −15 V |
| 13–16 | CM-RAM3..CM-RAM0 | Out (CM-RAM0 = pin 16) |
[M4] p. 14 confirms pin 9 = RESET, pin 10 = TEST. CM-RAM0 auto-selected after RESET ([M4] pp. 6, 14).
2. The 8-phase instruction cycle ([M4] Fig. 2 p. 6, text pp. 5–6)
One cycle = 8 clock periods = 10.8 µs at 750 kHz. Phases in order: A1, A2, A3, M1, M2, X1, X2, X3. Verbatim p. 5: "the CPU sends 12 bits of address (in three 4-bit bytes on the data bus) … in the first three cycles (A1, A2, A3). … The selected ROM chip sends back 8 bits of instruction (OPR, OPA) to the CPU in the next two cycles (M1, M2)."
| Phase | Driver | Contents |
|---|---|---|
| A1 | CPU | PC[3:0] — low nibble first (Fig. 2: "Lower 4-bit Address") |
| A2 | CPU | PC[7:4] |
| A3 | CPU | PC[11:8] (high 4 bits = chip select 1-of-16) |
| M1 | ROM | OPR (high nibble of opcode) |
| M2 | ROM | OPA (low nibble) |
| X1 | CPU | execute (idle on bus for most ops) |
| X2 | CPU/ROM | SRC: chip-select addr; I/O read: ROM/RAM drives ACC data |
| X3 | CPU | SRC: char addr; otherwise idle |
Endianness on the bus: PC low-nibble first, chip-select last.
3. SYNC ([M4] p. 6, Fig. 2)
Generated once every 8 clocks; one clock wide; asserted during phase X3 to mark end-of-cycle / beginning of A1 of the next. 4001/4002 derive their internal phase counters from SYNC + Φ2.
4. CM-ROM / CM-RAM strobes ([M4] pp. 13–14, Fig. 4)
- SRC: at X2, CM-ROM and the selected CM-RAMᵢ go true together while the bus carries the 4 high bits of the SRC address (chip select). At X3 the bus carries char address.
- I/O & RAM instruction (WRM/RDM/WRR/...): at M2 of that instruction's cycle, CM-ROM + selected CM-RAMᵢ are re-asserted so the latched chip executes OPA (which is on the bus at M2) ([M4] p. 14, step 4).
5. Register file ([M4] §III.A pp. 7–10, Tables III–IV)
- Program counter & stack: 4 × 12 bits — one is the live PC, three form the push-down stack ⇒ 3-deep subroutine stack ([M4] p. 7).
- Index registers: 16 × 4 bits, also addressable as 8 × 8-bit pairs R0R1…R14R15 ([M4] §III.B.2 p. 12).
- Accumulator 4 bits + carry/link flip-flop CY ([M4] p. 8).
- Command-control register (3 bits, latched by DCL).
6. Instruction set — 46 opcodes ([M4] Table V pp. 15–16, cross-checked with [I])
* = 2-byte. First byte shown.
| Opcode | Mnemonic | Notes |
|---|---|---|
00 |
NOP | |
1C (10..1F) |
*JCN cccc | + addr byte; in-page branch |
20,22,…,2E |
*FIM Pn | + imm8 → reg pair |
21,23,…,2F |
SRC Pn | send pair as RAM/ROM addr at X2/X3 |
30…3E |
FIN Pn | indirect ROM fetch via P0 |
31…3F |
JIN Pn | jump to (PC.high : Pn) |
40..4F |
*JUN | + addr byte; 12-bit jump |
50..5F |
*JMS | + addr byte; push PC+2; jump |
60..6F |
INC Rn | |
70..7F |
*ISZ Rn | + addr; in-page branch if ≠0 |
80..8F |
ADD Rn | A ← A + Rn + CY |
90..9F |
SUB Rn | A ← A + ~Rn + ~CY |
A0..AF |
LD Rn | |
B0..BF |
XCH Rn | CY unaffected |
C0..CF |
BBL d | pop; A ← d |
D0..DF |
LDM d | |
E0..EF |
I/O+RAM grp | WRM(E0) WMP(E1) WRR(E2) WPM(E3) WR0..3(E4..E7) SBM(E8) RDM(E9) RDR(EA) ADM(EB) RD0..3(EC..EF) |
F0..FD |
ACC group | CLB(F0) CLC(F1) IAC(F2) CMC(F3) CMA(F4) RAL(F5) RAR(F6) TCC(F7) DAC(F8) TCS(F9) STC(FA) DAA(FB) KBP(FC) DCL(FD); FE/FF unused |
7. JCN condition encoding ([M4] p. 27 + p. 16 footnote (1))
OPA bits C1 C2 C3 C4 (D3..D0): C1=1 → invert sense; C2=1 → ACC==0; C3=1 → CY==1; C4=1 → TEST pin == 0 (high voltage, i.e. logic-0). Logic ([M4] p. 28):
JUMP = C1·((ACC=0)·C2 + (CY=1)·C3 + TEST·C4) + ~C1·~(…). Page-wrap exception: if JCN sits at words 254/255, the taken target lands on the next page ([M4] p. 28).
8. JMS / BBL ([M4] §III.B.3 pp. 12–13, Table IV; JMS p. 28)
JMS is 2 bytes; the return address pushed = PC+2 ([M4] p. 12 footnote (3)). Push moves PC up one stack level; depth = 3. Verbatim [M4] p. 13: "If a fourth JMS occurs, the deepest return address (the first one stored) is lost." BBL pops + ACC ← D.
9. TEST pin ([M4] p. 14 + p. 28)
Asynchronous; sampled by condition logic only when JCN is being executed. "Jump if test = logic 0" means the pin is at the high (Vss) level — i.e. active-low in conventional polarity.
10. Reset state ([M4] §III.A.5 p. 9)
Verbatim: "During reset … all RAM's and static FF's are cleared, and the data bus is set to 0. After reset, program control will start from 0 step and CM-RAM0 is selected. To completely clear all registers and RAM locations in the CPU the reset signal must be applied for at least 8 full instruction cycles (64 clock cycles) … (256 clock cycles for the 4002 RAM)."
→ After RESET held ≥ 64 CPU clocks: PC=0, ACC=0, CY=0, all 16 index regs = 0, all 3 stack words = 0, CM-RAM0 selected, condition FF = 0.
Open questions
- SYNC pulse exact polarity / phase boundary — [M4] Fig. 2 is a poor scan; the pulse sits on X3 but the rising-vs-falling edge isn't recoverable from the OCR. Cross-validate against the 4004.com redrawn schematics.
- CM-ROM during a normal opcode fetch — [M4] Fig. 4 details only SRC and the I/O instruction; for a plain fetch CM-ROM is asserted A3→M2 in every emulator surveyed but the manual does not say so explicitly.
- What X1 is used for on most instructions — Table V doesn't tabulate per-phase activity; reference emulators treat X1 as a no-op cycle for fetch+execute.