105 lines
6.1 KiB
Markdown
105 lines
6.1 KiB
Markdown
|
|
# Intel 4040 — Delta Spec vs 4004
|
|||
|
|
|
|||
|
|
Source (in `autosearch/pdfs/`):
|
|||
|
|
|
|||
|
|
- **[M40]** *MCS-40 User's Manual for Logic Designers*, Intel, **Nov 1974**. Page numbers below are the printed Ch. 1 footers ("1‑5", etc.).
|
|||
|
|
|
|||
|
|
The 4040 (1974) is binary-compatible with the 4004 — the 46 original opcodes execute identically — and adds 14 new opcodes plus interrupt, single-step, extended ROM/register banks ([M40] §1 p. 1‑1, summary p. 1‑22).
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 1. Pin contract — 24-pin DIP ([M40] Pin Description table pp. 1‑5/1‑6, Fig. 1‑5)
|
|||
|
|
|
|||
|
|
Vss = GND; Vdd = Vss − 15.0 V ±5%; PMOS, two-phase clock.
|
|||
|
|
|
|||
|
|
| Pin | Name | Description ([M40] verbatim where quoted) |
|
|||
|
|
|---|---|---|
|
|||
|
|
| 1–4 | D0..D3 | Bidirectional 4-bit data/address bus |
|
|||
|
|
| 5 | STPA | "STOP ACKNOWLEDGE output … open drain" |
|
|||
|
|
| 6 | STP | "STOP input … logic 1 causes the processor to enter the STOP mode" |
|
|||
|
|
| 7 | INT | "INTERRUPT input signal" |
|
|||
|
|
| 8 | INTA | "INTERRUPT ACKNOWLEDGE output … remains active until cleared by the new BRANCH BACK and SRC (BBS) instruction"; open drain |
|
|||
|
|
| 9 | Vss | GND (most positive) |
|
|||
|
|
| 10, 11 | Φ1, Φ2 | Non-overlapping clocks |
|
|||
|
|
| 12 | RESET | "A 1 level … forces the program counter to 0. To completely clear … RESET must be applied for **96 clock cycles (12 machine cycles)**" |
|
|||
|
|
| 13 | TEST | sampled by JCN |
|
|||
|
|
| 14 | Vdd | Main supply, Vss − 15 V |
|
|||
|
|
| 15 | Vdd2 | Output-buffer supply (may be reduced) |
|
|||
|
|
| 16 | SYNC | Marks start of instruction cycle |
|
|||
|
|
| 17–20 | CM-RAM0..3 | RAM bank select |
|
|||
|
|
| 21 | Vdd1 | Timing-circuit supply; "only SYNC will be generated when this pin is the only active Vdd" — standby |
|
|||
|
|
| 22 | CM-ROM0 | ROM bank-0 select |
|
|||
|
|
| 23 | CM-ROM1 | ROM bank-1 select (NEW vs 4004) |
|
|||
|
|
| 24 | CY | "CARRY output buffer … updated at X1"; open drain (NEW) |
|
|||
|
|
|
|||
|
|
vs the 4004 the 4040 adds: STP, STPA, INT, INTA, a second CM-ROM line, a CY pin, and dual standby supplies. INT/STP/STPA/INTA are active-high logic-1 (negative voltage).
|
|||
|
|
|
|||
|
|
## 2. New instructions — 14 total ([M40] p. 1‑22 summary)
|
|||
|
|
|
|||
|
|
All 14 use OPR=`0000` and live in OPA `0001..1110` of the 4004 (NOP `0000 0000` is preserved).
|
|||
|
|
|
|||
|
|
| Mnemonic | Opcode | Effect |
|
|||
|
|
|---|---|---|
|
|||
|
|
| HLT | `01` | Halt; HALT and STOP FFs set at X3 |
|
|||
|
|
| BBS | `02` | Branch back from interrupt: restore PC, SRC reg, index-bank FF |
|
|||
|
|
| LCR | `03` | ACC ← Command Register |
|
|||
|
|
| OR4 | `04` | ACC ← ACC OR R4 |
|
|||
|
|
| OR5 | `05` | ACC ← ACC OR R5 |
|
|||
|
|
| AN6 | `06` | ACC ← ACC AND R6 |
|
|||
|
|
| AN7 | `07` | ACC ← ACC AND R7 |
|
|||
|
|
| DB0 | `08` | Designate ROM bank 0 (CM-ROM0); takes effect 3 cycles later |
|
|||
|
|
| DB1 | `09` | Designate ROM bank 1 (CM-ROM1) |
|
|||
|
|
| SB0 | `0A` | Select index-register bank 0 |
|
|||
|
|
| SB1 | `0B` | Select index-register bank 1 |
|
|||
|
|
| EIN | `0C` | Enable interrupt |
|
|||
|
|
| DIN | `0D` | Disable interrupt |
|
|||
|
|
| RPM | `0E` | Read program memory (via 4289 device) |
|
|||
|
|
|
|||
|
|
`0F` is unused. The brief asked about a "JNT" — there is none; "jump on no test" is just JCN with C1=1, C4=1 (same as on 4004).
|
|||
|
|
|
|||
|
|
## 3. Interrupt sequence ([M40] §"INTERRUPT and STOP Control Logic" pp. 1‑11..1‑13, Fig. 1‑11)
|
|||
|
|
|
|||
|
|
When INT is sampled high at M2 and EIN is in effect:
|
|||
|
|
1. Current instruction completes.
|
|||
|
|
2. The next cycle becomes a forced JMS to **page 0, location 3** ([M40] p. 1‑12 verbatim: *"The subroutine address is forced to be page 0, location 3"*) — i.e. PC ← `0x003`. The pre-interrupt PC (NOT incremented) is pushed.
|
|||
|
|
3. At **X3** of that cycle the **INTA flip-flop is set** and the INTA pin asserts.
|
|||
|
|
4. The index-register bank FF and the SRC register are saved automatically; bank FF resets to 0.
|
|||
|
|
5. Handler runs from `0x003`. INTA stays asserted (blocking further interrupts) until the handler executes **BBS**, which pops the stack, restores PC, re-emits the saved SRC at X2/X3 with CM-ROM/CM-RAM at X2 (re-arming the previously selected ROM/RAM), restores the bank FF, and clears INTA.
|
|||
|
|
|
|||
|
|
There is no vector table — INT always lands at `0x003`.
|
|||
|
|
|
|||
|
|
## 4. STOP / STOP-ACK protocol ([M40] §"STOP/HALT Mode Operation" pp. 1‑10..1‑11, Fig. 1‑9, 1‑10)
|
|||
|
|
|
|||
|
|
- STP=1 latched at M2 → internal STOP FF set at X3 → CPU executes NOPs in a loop (clock keeps running) and STPA asserts.
|
|||
|
|
- Resume: STP=0 latched at M2 of cycle N → STOP FF reset at X3 → "Normal processor operation resumes at instruction cycle N+1" ([M40] p. 1‑10).
|
|||
|
|
- HLT sets STOP and HALT FFs at X3; exit via STP pulse OR INT (Fig. 1‑13 shows INT-exit forcing HALT FF reset, then taking the interrupt at `0x003`).
|
|||
|
|
- INT and STP latched together: **STP wins** ([M40] p. 1‑13).
|
|||
|
|
|
|||
|
|
## 5. Extended index-register file — 24 × 4 bits ([M40] p. 1‑11)
|
|||
|
|
|
|||
|
|
Three banks of 8 registers (R0..R7):
|
|||
|
|
- **Bank 0** (default after RESET, SB0): low 8 registers.
|
|||
|
|
- **Bank 1** (SB1): mirror low 8.
|
|||
|
|
- **Upper bank R8..R15**: shared, always visible.
|
|||
|
|
|
|||
|
|
R16..R23 are **not directly named** — they are Bank-1's incarnation of R0..R7. SB0/SB1 FF auto-saved/restored across interrupt.
|
|||
|
|
|
|||
|
|
## 6. PC stack — 8 × 12 bits = **7-deep** subroutine nesting ([M40] §"Extended Address Register Stack" p. 1‑12; bullet on p. 1‑1)
|
|||
|
|
|
|||
|
|
One slot holds the live PC, the other 7 are return addresses; on overflow the deepest is lost (same behaviour as 4004).
|
|||
|
|
|
|||
|
|
## 7. Other deltas
|
|||
|
|
|
|||
|
|
- **Two CM-ROM lines** (DB0/DB1 select) → 8 K × 8 ROM addressable ([M40] p. 1‑12). DB0/DB1 take effect on the **3rd cycle after execution**, and INT/STOP/HALT are internally inhibited during those 3 cycles ([M40] p. 1‑13).
|
|||
|
|
- **CY exposed on pin 24**, updated at X1 ([M40] p. 1‑6).
|
|||
|
|
- RESET clears interrupt enable; an EIN must be re-issued before INT is honored ([M40] p. 1‑13).
|
|||
|
|
- Cycle time same as 4004: 8 clock periods per machine cycle.
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## Open questions
|
|||
|
|
|
|||
|
|
- Exact phase relationships of **STPA** and **INTA** open-drain transitions — [M40] Fig. 1‑9 implies STPA goes active the cycle after STP is latched, but the scan is hard to read. Verify against silicon or markablov/i40xx source.
|
|||
|
|
- Behaviour when INT arrives during a 2-byte instruction (JMS, FIM, JCN, JUN, ISZ): [M40] says the current instruction "completes" before the forced JMS, but doesn't tabulate the cycle accounting.
|
|||
|
|
- Whether DB0/DB1's 3-cycle inhibit also blocks WRR/RDR to the previously-selected bank during the transition — [M40] is silent.
|