digital equipment corporation • maynard, massachusetts
ADDRESS  
USER I
SUPER I
KERNEL I
PROG PHY
USER D
SUPER D
KERNEL D
CONS PHY
POWER
LOCK
OFF
DATA  
DATA PATHS
µ ADRS FPP/CPU
BUS REGISTER
DISPLAY REGISTER
pdp11-45
ADRS ERR
RUN
PAUSE
MASTER
USER
SUPER
KERNEL
DATA

17

16

15

14

13

12

11

10

9

8

7

6

5

4

3

2

1

0

LOAD
ADRS

EXAM

CONT

ENABLE
HALT

S INST
S BUS

START

DEP

REG
EXAM

REG
DEP







Hrátky s emulací PDP11.

Opět nastala doba dlouhých zimních večerů a s nimi přichází i naprosto neužitečné experimenty spolu se vzpomínkami na staré zašlé časy. Začínal jsem v 80. létech 20. století jako technik na počítačích SMEP, konkrétně na stroji SM52/11. Byl to Československý socialistický klon PDP11/40 fy. DEC, na ten se dá i dnes najít na webu spousta software. A nemusíte mít tu obludu v obýváku, lze jí emulovat v normálním PC nebo třeba i v Raspberry Pi pomocí SIMH (4.). Na této stránce je emulátor převzatý z (1.), je psán v javascriptu a jeho různé verze jsou poházeny na webu leckde. Není tak komplexní jako SIMH, ale celkem obstojně funguje. V podstatě jsou zachovány původní javascripty, upravil jsem jen boot kód, který byl napsán v assembleru DEC. Zde je skriptem v pythonu převeden do formátu GNU as, který je pak možné snadno přeložit standardními nástroji binutils (viz dále). Nejsou zde původní obrazy disků, ty jde dohledat (1.), jsou velké a celkem zbytečné, v prohlížeči je to jen takové hraní, co uděláte se zpět na server nepřenese, změny se zahodí. Je tedy lépe použít lokální simulátor SIMH.

Bare metal.

V současnosti se zabývám spíš programováním jednočipů, takže programování přímo na železo je mi celkem blízké. Pro PDP11 existuje sada standardních GNU nástrojů binutils a gcc (3.), lze použít i g++, pak je nutné v konfiguraci vypnout libstdc++ (--disable-libstdc++-v3). Funguje to podobně jako pro ARM nebo AVR. Jen není podpora sekcí (nevím proč, původní DEC už pojmenované sekce používá), jediný výstupní formát je aout, linkování pomocí linker skriptu je divné, ale dá se zvládnout. Výstup aout se dá načíst pomocí python skriptu ptap a vytvořit soubor děrné pásky v zaveditelném formátu (popsán ve skriptu).

Na této stránce jsou vytvořeny tři pásky: HELLO, FACTORIAL a BANNER. Je možné si jednu z nich vybrat a spustit příkazem boot pr.

HELLO

Obvykle se píše jako příklad jednoduchý Hello world. Zde jsem ho dost rozšířil, ukazuje možnosti GNU toolchainu včetně výpočtů v double aritmetice. Není to úplně triviální, je použíta jednotka FPU, formát double není v PDP11 podle standardu IEEE 754, má vlastní, toolchain nemá vlastně žádné knihovní funkce (např. pro formátovaný výstup), takže vše je nutné dopsat. Za pozornost stojí i endianita - je divná ani big ani little.

FACTORIAL

Počítá faktoriál čísel 1 až 70 na zhruba 100 desetinných míst. Je to také jen ukázka možností GNU toolchainu pro PDP11, spojuje assembler, čisté C a C++ včetně šablon. Velká celá čísla bez znaménka jsou v little endian, počítat s nimi není úplně průhledné, zde je to zjednodušeno na součet (v assembleru), rozdíl je převeden na součet, násobení a dělení se dělá tak, jako by se to dělalo tužkou na papíře pod sebe, jak se to učí na základní škole. Jen je to děláno ve dvojkové soustavě.

Mimochodem, kdyby se tohle vyděrovalo na skutečnou 8-stopou děrnou pásku, pak by měla délku asi 14m.

BANNER

Tohle je příklad z webu, napsaný v čistém ANSI C, jednoduchý, ale poměrně efektní. Protože v tom nejsou žádné složitější aritmetické operace, které si tahají funkce z libc, je možné s tím dělat i další pokusy. Nemusí to tedy být jen bare metal, ale zkusíme použít i nějaký OS.

RT11

Operační systém DEC, který se používal na SMEP pod názvem FOBOS. Je dost jednoduchý, používal se spíš na testování hardware, ale je na něm možné ukázat jak je možné kód, napsaný v C, pro které nemá RT11 překladač, dostat i do tohoto systému.

Princip je jednoduchý - C kód se zkompiluje do GNU assembleru (přepínač -S), to se zase převede python skriptem do formátu DEC MACRO, výsledek je v textovém tvaru a ten pak nějak dostaneme do systému (je popsáno ve zdrojácích). Jen je nutné přidat soubor se systémovými utilitami, které zajistí start, vstup z konzole, výstup na konzoli a ukončení programu. To už je možné pod RT11 přeložit a slinkovat, výsledek funguje.

RSX11M

Tohle byl v éře SMEP hojně používaný operační systém, ať už někde ukradený původní DEC nebo to co Kancelářské Stroje distribuovaly pod názvem DOS RV (což mělo s legalitou také málo společného). Byl to multitask, multiuser systém, dokázal obsloužit desítky terminálů, na svou dobu velmi dobrý. Neměl stromovou strukturu adresářů, ale existovaly pro něj překladače FORTRAN (F77), COBOL, PASCAL, BASIC (překladač i interpretr). Dneska se dá pro verzi RSX11M Plus najít i překladač ANSI C. Podle (2.) se dá poměrně rychle vygenerovat vlastní systém RSX11M Plus na míru. V éře SMEP tahle procedura trvala celou směnu, dneska to simulátor zvládne za půl hodiny.

A protože máme C překladač, lze ho použít i když to není zase tak snadné, je potřeba použít i knihovny a překrývání (soubory *.ODL). Asi by šla použít i metoda pro RT11, ale nechtělo se mi čarovat s těmi makry QIO$.

Závěr.

Zdrojáky připojuji pod licencí MIT (s restrikcí převzatých materiálů tam, kde je to uvedeno). Ono je to sice úplně k ničemu, ale občas je dobré se přenést do doby začátků IT éry a vzpomenout si s jakými problémy se musel tehdy programátor potýkat. Od primitivity textového editoru po nespolehlivost socialistického hardware - průměrná doba mezi poruchami SM52/11 v základní sestavě byla udávána výrobcem 56 hodin.

To co s tím dokázali tehdejší experti dělat zaslouží obdiv.

Odkazy.

Doplněno.

Přidána páska CALC, což je upravený kód pro RPN kalkulátor. Nějak to funguje, ale moc bych na to nespoléhal, převod z 32. bitové verze na 16. bitovou bude způsobovat, že někde něco přeteče a zkontrolovat co a kde by bylo pro takovou hračku moc práce. Matematické funkce jako je sin, cos, log, exp trvají několik sekund, přece jen simulace v JS je pomalá.