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.
- Základem je deska ROBOTboard: vyvojove-desky/robot-board
- Samostatná stránka projektu: octopuslab.cz/edu-kit1
- Základní 3D modely, umožňující mechanické propojování dalších modulů thingiverse/…/esp32_EDU_KIT1