Intel 4004 slaví padesátiny!


46. díl – OctopusLAB
Intel 4004 slaví padesátiny!

Čtyřbitový mikroprocesor Intel4004 byl prvním komerčně dostupným procesorem a předchůdcem osmibitové řady 8080. A jelikož spatřil světlo světa v roce 1971, slaví letos kulaté výročí. Rozhodli jsme se proto vytvořit speciální emulátor na EDU_KIT1 (ESP32 + Micropython), který můžete naživo vidět na letošním Maker Faire Prague 21.

Tento velmi „primitivní“ procesor se používal v jednoduchých kalkulačkách, pro řízení tiskáren a v dalších (dnes již mnohdy zapomenutých) projektech. Princip mikroprocesoru však v základu zůstává stejný. Proto by si vážní zájemci o číslicovou techniku měli alespoň na chvíli pohrát s tímto úžasným kouskem z historie. Sehnat a zprovoznit originál nemusíte, protože základ emulátoru už máme skoro rok v provozu:
https://github.com/octopusengine/micropython_4004-emul

První verze měla čtyřbitový vstup (páčkové přepínače) a čtyřbitový výstup (Ledky, na kterých jsme zobrazovali obsah střadače).

Není snadné popsat fungování celého procesoru v krátkém odstavci. Ale zjednodušeně: Program tvoří posloupnost instrukcí. Prováděná instrukce se načte do Instrukčního registru a je dekódována na sled dílčích kroků, které se mají vykonat.

Základem bývá práce aritmeticko-logické jednotky (ALU), ve které provádíme operace se střadačem (A – Accumulator) a vybraným registrem (R0-R15). Registry jsou čtyřbitové a složení osmibitového „Byte“ se provádí jejich sdružováním do dvojic (register pair). Práce s externí pamětí je složitější, musíme vždy nastavit adresu a až pak číst nebo zapisovat data.

Strojový kód

V následujícím odstavci můžete vidět fragment přesného souboru instrukcí přímo určený pro procesor i4004. Na prvních mikropočítačích jsme takovéto bloky natvrdo přepisovali do stroje (například PMI80). Je to hexadecimální zápis (šestnáctková soustava 0-F), kde 0 = 00 a 255 = FF).

[000] 20 00 22 00 DC B2 21 E0 
[008] F2 71 06 60 72 06 20 00 
[010] 22 00 DC B2 21 E4 F2 E5 
... 

I pro zkušeného programátora je strojový kód obtížně čitelný a ani bezchybně ho přepsat nemusí být úplně snadné. Proto se používá takzvaný Assembler, kterému je rozumět podstatně lépe. Jedná se o nízkoúrovňový programovací jazyk symbolických instrukcí. Jeho základ tvoří symbolické reprezentace jednotlivých strojových instrukcí a konstant potřebných pro vytvoření strojového kódu programu pro určitý procesor.
První řádek výše uvedeného strojového kódu přepsaný do assembleru pak může vypadat takto:

20 00 22 00 DC B2 21 E0 
-------------------------
[000] 20 00   FIM P0, $00 ; (Fetch Immediate reg, data) P0:=0
[002] 22 00   FIM P1, $00 ;  P1:=0
[004] DC 12   LDM 12   ;    (Load Immediate data) A:=12 
[005] B2      XCH R2   ;    (Exchange reg) R2:=A
[006] 21      SRC P0   ;    (Send Register Control)
[007] E0      WRM      ;    (Write Main Memory)
...  

Celý článek (odkazy i instrukční sada) je na stránkách OctopusLAB: octopuslab.cz/intel-4004-slavi-padesatiny. Pokud si chcete vyzkoušet jednoduché základy, existuje i on-line simulátor: http://e4004.szyc.org/emu/. Principy, které si osvojíte, se jen v malých obměnách používají i v dnešních procesorech.


Co se asi už do papírové verze nevejde >


Instrukční sada

Mnemonic   Instruction              MODIFIERS
   NOP     No Operation             none
   JCN     Jump Conditional         condition, address   
   FIM     Fetch Immediate          register pair, data        
   SRC     Send Register Control    register pair
   FIN     Fetch Indirect           register pair         
   JIN     Jump Indirect            register pair        
   JUN     Jump Uncoditional        address    
   JMS     Jump to Subroutine       address    
   INC     Increment                register     
   ISZ     Increment and Skip       register, address
   ADD     Add                      register
   SUB     Subtract                 register
   LD      Load                     register
   XCH     Exchange                 register
   BBL     Branch Back and Load     data
   LDM     Load Immediate           data
   WRM     Write Main Memory  
   WMP     Write RAM Port     
   WRR     Write ROM Port     
   WR0     Write Status Char 0    
   WR1     Write Status Char 1    
   WR2     Write Status Char 2    
   WR3     Write Status Char 3    
   SBM     Subtract Main Memory   
   RDM     Read Main Memory   
   RDR     Read ROM Port      
   ADM     Add Main Memory        
   RD0     Read Status Char 0 
   RD1     Read Status Char 1 
   RD2     Read Status Char 2 
   RD3     Read Status Char 3 
   CLB     Clear Both     
   CLC     Clear Carry        
   IAC     Increment Accumulator  
   CMC     Complement Carry   
   CMA     Complement     
   RAL     Rotate Left        
   RAR     Rotate Right       
   TCC     Transfer Carry and Clear   
   DAC     Decrement Accumulator  
   TCS     Transfer Carry Subtract    
   STC     Set Carry    
   DAA     Decimal Adjust Accumulator 
   KBP     Keybord Process    
   DCL     Designate Command Line

[000] 20 00 22 00 DC B2 21 E0 
[008] F2 71 06 60 72 06 20 00 
[010] 22 00 DC B2 21 E4 F2 E5 
...  

Celý výše uvedený kód:

000 20 00 FIM P0,$00
002 22 00 FIM P1,$00
004 DC    LDM 12
005 B2    XCH R2
006 21    SRC P0
007 E0    WRM
008 F2    IAC
009 71 06 ISZ R1,$06
00B 60    INC R0
00C 72 06 ISZ R2,$06
00E 20 00 FIM P0,$00
010 22 00 FIM P1,$00
012 DC    LDM 12
013 B2    XCH R2
014 21    SRC P0
015 E4    WR0
016 F2    IAC
017 E5    WR1
018 F2    IAC
019 E6    WR2
01A F2    IAC
01B E7    WR3
01C F2    IAC
01D 60    INC R0
01E 72 14 ISZ R2,$14
020 40 20 JUN $020

Další odkazy

https://dbpedia.org/page/Intel_4004 (HW replika)
https://thehistoryofhowweplay.wordpress.com/2018/09/11/microprocessors/
https://www.4004.com/mcs4-masks-schematics-sim.html (kompletní souhrn)
http://www.vintagecalculators.com/html/busicom_141-pf_and_intel_4004.html (historické kalkulátory)
https://cs.wikipedia.org/wiki/Von_Neumannova_architektura


Další stavebnice jsou trochu pokročilejší:
EK1 roboti
EDU_KIT2
EDU_KIT3



Průběžně doplňujeme on-line dokumentaci pro projekty s ESP32. S popisem knihoven, ukázkami kódu a tutoriály.
Můžeme se domluvit na individuálním workshopu nebo konzultaci. V našem labu máme i většinu modulů, co používáme v ukázkách. Ozvěte se nám na info@octopuslab.cz.