Obsah
1. Programovací jazyky z vývojářského pekla: špagetový kód na programovatelných kalkulačkách
2. HP-9100: první stolní programovatelný kalkulátor společnosti HP
3. HP-65: první programovatelný kapesní kalkulátor
4. Programovatelné kalkulačky společnosti Texas Instruments
5. Další výrobci programovatelných kalkulaček
7. Programování na kalkulačkách série HP 10c
8. Základní příkazy zadávané z klávesnice
9. Jednoduchá nekonečná smyčka od 0 do (téměř) nekonečna
1. Programovací jazyky z vývojářského pekla: špagetový kód na programovatelných kalkulačkách
Ve čtyřdílném miniseriálu o programovacích jazycích pocházejících z programátorského pekla jsme se zabývali převážně různými esoterickými programovacími jazyky, které byly většinou schválně navrženy takovým způsobem, aby programy v nich byly nečitelné, popř. aby se využíval zcela minimální počet instrukcí či příkazů. Ovšem i některé komerčně prodávané výrobky jsou v některých případech vybaveny programovacím jazykem, který není přehledný a už vůbec ne elegantní. Příkladem mohou být některé programovatelné kalkulačky, zejména ty produkty, které obsahují pouze sedmisegmentový displej. A nemusí se přitom jednat pouze o muzeální kousky hardwaru, protože například kalkulačka HP 12c je stále velmi populární a společnost HP ji běžně prodává. A právě při programování těchto kalkulaček se setkáme se špagetovým kódem, v němž se to jen hemží instrukcemi GTO (goto) a absolutními indexy (adresami) příkazů (nehledě na to, že se může využívat RPN a tedy i zásobníkový kód). I přesto v těchto jazycích vzniklo mnoho úspěšných výpočetních subrutin i jednoduchých her.
2. HP-9100: první stolní programovatelný kalkulátor společnosti HP
Jedním z prvních stolních programovatelných kalkulátorů je model HP-9100, který byl vyráběn ve variantách A a B. Tento kalkulátor vůbec nebyl levný, protože byl prodáván za 5000 (tehdejších) dolarů, ovšem na rozdíl od konkurence, která většinou nabízela jednoduché kalkulačky se čtyřmi základními operacemi, byl model HP-9100 mnohem komplikovanější, protože například umožňoval výpočet logaritmů, druhé odmocniny, trigonometrických funkcí apod. K HP-9100 bylo možné připojit i tiskárnu či plotter, dodávána byla i čtečka magnetických karet (pro programy i data). Právě v HP-9100 se objevuje použití RPN (převrácené polské notace), ovšem zásobník zde měl pouze tři úrovně označované symboly X, Y a Z (později byla přidána poslední úroveň T – temporary či top). Kromě zásobníku bylo možné při programování použít šestnáct pracovních registrů, ovšem kvůli sdílení paměti mezi registry a programem se musel uživatel rozhodnout, jak program strukturovat (každý registr zabíral paměť odpovídající čtrnácti programovým krokům). Způsob programování je vysvětlen v sedmé kapitole.
Mimochodem: ke vzniku HP-9100 se váže pěkná historka. Spolumajitel firmy HP Bill Hewlett měl ve své kanceláři stůl, na němž bylo mj. i místo určené pro běžný psací stroj. Bill měl tento stůl rád, a tak po designérech požadoval, aby se právě vyvíjený model HP-9100 vešel do místa určeného pro psací stroj. Když byla navržena první verze tohoto modelu, přišli inženýři do Billovy kanceláře a s hrůzou zjistili, že se do místa určeného pro psací stroje jejich prototyp nevejde. Ovšem díky tomu, že pan spolumajitel byl zrovna na dovolené a po návratu mu bylo nutné ukázat prototyp, povolali designéři stolaře, který stůl trošičku poupravil, takže když se Bill Hewlett vrátil z dovolené a viděl prototyp kalkulátoru na svém stole přesně ležící na určeném místě, pouze prohlásil: „You see! I knew you could do it!“
3. HP-65: první programovatelný kapesní kalkulátor
Přelomovým a vlastně i revolučním kalkulátorem se stal model HP-65. Jednalo se o první programovatelný kapesní kalkulátor HP, jehož design byl odvozen od slavné HP-35, včetně použití červených LED pro sedmisegmentový displej. V HP-65 bylo možné vytvářet relativně rozsáhlé programy o délce až sta řádků, přičemž každá instrukce byla zakódována do šesti bitů (64 kombinací). V HP-65 se pro rozvětvení používaly čtyři typy testů: x!=y, x<=y, x==y a x>y, přičemž každý test porovnával prvky na zásobníku (první s druhým). Objevuje se zde i klávesa SST (single step), ovšem ne již klávesa BST (back step), což činilo editaci programů poněkud složitou. Podobně jako kalkulačka MK-52 zmíněná níže, se i HP-65 používal ve vesmírných misích, konkrétně v programu Sojuz-Apollo jako záloha pro případ, že by hlavní počítač nebyl funkční a spojení se Zemí přestalo fungovat (popř. by astronauti nebyli v dosahu pozemní stanice). Programy byly samozřejmě připraveny a otestovány dopředu a uloženy na magnetických kartách. Rychlost výpočtů nebyla kritická a přesnost naopak zcela dostatečná – na deset desetinných míst.

Obrázek 1: HP-65 i s vloženou magnetickou kartou.
Zdroj: Wikipedia.
4. Programovatelné kalkulačky společnosti Texas Instruments
Společnost HP samozřejmě nebyla jedinou firmou na světě, která dokázala navrhnout a vyrobit programovatelné kalkulačky. Jejím dlouholetým konkurentem s poněkud odlišným portfoliem je další slavná firma: Texas Instruments (TI).
Ve druhé polovině sedmdesátých let minulého století začala i společnost Texas Instruments prodávat programovatelné kalkulačky. Základem, od něhož byly odvozeny oblíbené kalkulátory řady TI-5×, je model SR-52, což byla první programovatelná kapesní kalkulačka firmy TI. V SR-52 se používal jednořádkový displej z červených LED a především se zde objevila možnost programování. Programy mohly mít délku až 224 kroků a kromě klasických instrukcí pro skok a podmínky se zde objevuje i možnost skoku do subrutiny (podprogramu) a definice návěští (label), což je lepší režim, než použití absolutních adres, s nímž se setkáme níže. Řada TI-5× převzala základní vlastnosti modelu SR-52, ovšem možnosti se rozšířily (například se zvětšila paměť pro programy 2× až 4×, byl přidán konektor pro připojení externího ROM modulu s téměř neuvěřitelnou kapacitou 5000 kroků apod.). Důležitým rozdílem od kalkulaček HP byl algebraický režim, který byl pro mnoho uživatelů jednodušší na používání (a právě rozdíl mezi HP s RPN a TI s algebraickým režimem vedl k rozdělení uživatelů na dvě téměř znepřátelené skupiny, podobně jako to známe dnes u uživatelů mobilů atd.)
Pravděpodobně nejpopulárnějšími programovatelnými kalkulátory Texas Instruments je řada TI-8× následovaná řadou TI-9×. Všechny kalkulačky z těchto dvou řad jsou grafické, tj. obsahují větší rastrový monochromatický displej (klasické LCD) s rozlišením původně 96×64 pixelů, na němž bylo možné zobrazit jak celé výrazy, které se měly vypočítat (v algebraické podobě), tak i průběhy 2D a 3D funkcí. Starší modely řady TI-8× byly založeny na populárním osmibitovém mikroprocesoru Zilog Z80, novější a výkonnější modely pak na jádře procesoru Motorola 68000. Ovšem z uživatelského hlediska byla důležitější podpora programování, která zahrnovala programovací jazyk odvozený od zjednodušeného BASICu.
Model TI-81 z roku 1990 zahájil celou sérii.
Příkladem může být například jednoduchá hra pro hádání čísel, kterou je možné naprogramovat v TI BASICu takto:
:ClrHome :randInt(1,1000)→N :Disp "Guess a number" :For(I,1,10) :Input "Guess?",G :If N=G:Then :Disp "You've got it!","Guesses:",I :Pause :Stop :Else :If N>G:Then :Disp "Higher..." :Else :Disp "Lower..." :End :End :End :Disp "You lose!","The number was:",N
Právě díky ucelené kombinaci grafického rastrového displeje a jednoduše pochopitelného TI BASICu se tyto kalkulačky staly velmi populární a vznikaly pro ně různé typy aplikací, včetně různých her. Později se dokonce (původně neoficiálně) objevila i možnost programování ve strojovém kódu a některé nejnovější modely (TI-Nspire) je možné programovat ve známém programovacím jazyce Lua.
Model TI-92 Plus vsadil na odlišný design s QWERTY klávesnicí.
5. Další výrobci programovatelných kalkulaček
Programovatelné kalkulačky vyrábělo i mnoho dalších společností. Nesmíme zapomenout na Casio, která vlastně stála na samotném začátku těchto produktů, protože její model stolního programovatelného kalkulátoru AL-1000 pochází z poloviny šedesátých let minulého století, tj. z období před vznikem mikroprocesorů a samozřejmě i mikropočítačů. Později tato společnost začala nabízet jak klasické programovatelné kalkulačky se sedmisegmentovým displejem, tak i kalkulačky se dvěma či více řádky textu (FX-850P) a samozřejmě i plnohodnotné grafické kalkulačky (FX-7000G, první grafická kalkulačka dostupná veřejnosti).
Ovšem programovatelné kalkulačky se vyráběly i v zemích RVHP. Příkladem je stolní programovatelný kalkulátor ISKRA 123 z počátku sedmdesátých let minulého století. Kapesní kalkulačky se začaly vyrábět o přibližně šest let později: Elektronika B3–21, Elektronika B3–34 a zejména pak Elektronika MK-52. Tento poslední model je zajímavý mj. i tím, že byl použit v kosmickém programu Sojuz (let TM-7, doba trvání celkem 151 dnů) jako záloha za hlavní řídicí počítač. Tento model byl, podobně jako kalkulačky TI na západě, velmi populární, a to i díky tomu, že vzniklo mnoho výukových programů, ale i her (ostatně pro mnoho uživatelů se programovatelné kalkulačky staly prvním „počítačem“, s nímž se kdy setkali). Mimochodem – tyto kalkulačky používaly RPN, podobně jako je tomu u mnoha modelů HP.
6. Série HP 10c
Popis způsobu programování si ukážeme na sérii HP 10c, která je dodnes populární, a to do té míry, že se vyrábí klony těchto kalkulaček, protože HP příliš nemá zájem o udržování svého portfolia (až na jednu výjimku). V sérii HP 10c vzniklo pět základních modelů:
Model | Popis |
---|---|
HP-10c | vědeckotechnická kalkulačka – základní model |
HP-11c | vědeckotechnická kalkulačka – střední model |
HP-12c | kalkulačka nabízející složitější algoritmy pro obchodníky, burzu, hypotéky atd. |
HP-15c | vědeckotechnická kalkulačka – nejvyšší model |
HP-16c | programátorská kalkulačka s převody mezi soustavami |
Zajímavé je, že model HP-12c se vyrábí dodnes – a to od roku 1981!
7. Programování na kalkulačkách série HP 10c
Programování se na všech kalkulačkách série HP 10c provádí stejným způsobem, ovšem možnosti jednotlivých modelů se od sebe odlišují, protože některé instrukce jsou dostupné jen v konkrétních modelech. Obecně platí, že HP-12c je vybavena nejméně instrukcemi a naopak HP-15c má instrukcí nejvíce. Všechny instrukce jsou zaznamenány formou kódu stisknuté klávesy popř. kombinací dvou či tří kláves. Kód klávesy se zjišťuje jednoduše – pro numerické klávesy se kód rovná přímo cifře (0==0 atd.), pro ostatní klávesy se její kód získá z pozice klávesy na klávesnici. Například klávesa RCL je ve čtvrté řadě na páté pozici, tudíž je její kód 45. Klávesy +, -, × a ÷ jsou v desáté řadě, která se kóduje jako 0, tj. ÷ má kód 10, × má kód 20, – má kód 30 a + má kód 40.

Obrázek 2: Rozmístění kláves na kalkulačce HP-12c: čtyři řady po deseti klávesách.
Samotný program se zaznamenává stiskem příslušných kláves, takže kalkulačky neobsahují žádný parser a vlastně ani žádnou kontrolu validity kódu. Při programování se využívá pět speciálních klávesových kombinací:
Klávesa | Význam |
---|---|
P/R | Program/Run – přepínání režimu programování/běhu |
R/S | Run/Stop – umožňuje kdykoli zastavit a znovuspustit program |
MEM | Memory – zobrazí využití paměti (počet zaznamenaných kroků) |
SST | Single Step – krokování popř. přechod na další příkaz |
BST | Back Step – přechod na předchozí příkaz |
8. Základní příkazy zadávané z klávesnice
Při programování lze využít dvacet registrů dostupných přes klávesy STO (store) a RCL (recall) a taktéž několik zásobníkových operací, především pak x<>y (swap), R↓ (roll down, funguje i jako drop) a samozřejmě Enter (dup).
Jak jsme si již řekli v předchozí kapitole, jsou programy přímo „ťukány“ na klávesnici, stejně jako běžné výpočty. Ovšem některé příkazy mají smysl jen při programování:
Příkaz | Význam |
---|---|
PSE | pozastaví program na jednu sekundu a zobrazí mezivýsledek (vrchol zásobníku) |
GTO | skok na příkaz xyz, kde xyz je trojmístné číslo různé od 000 |
GTO 000 | konec programu (END) |
x<=y | pokud je prvek na vrcholu zásobníku menší nebo roven druhému prvku, provede se další instrukce |
x=0 | pokud je prvek na vrcholu zásobníku nulový, provede se další instrukce, jinak se tato instrukce přeskočí |
S využitím kombinace GTO, x<=y a x=0 lze implementovat jak programové smyčky, tak i rozeskoky na základě podmínky.
A to je vše! Programátoři musí vystačit pouze se zásobníkem s hloubkou čtyř prvků, dvaceti pracovními registry, třemi operacemi nad zásobníkem, dvěma podmínkami a nepodmíněným skokem. To kupodivu stačí i na složitější programy a výpočty.
Složitější program naleznete zde: http://www.rskey.org/hp11c.
9. Jednoduchá nekonečná smyčka od 0 do (téměř) nekonečna
Podívejme se nyní na způsob naprogramování jednoduché nekonečné smyčky, která bude postupně s jednosekundovou pauzou zobrazovat číselnou řadu 0, 1, 2, … Samotný program je velmi jednoduchý a předpokládá, že na zásobníku bude na začátku uložena alespoň jedna nula (pokud tam bude jiné číslo, bude smyčka začínat na této hodnotě). Ve smyčce se postupně hodnota na zásobníku zvýší o jedničku operací 1 +, následně se výsledek zobrazí uživateli po dobu jedné sekundy příkazem PSE (pause) a posléze se příkazem GTO (goto) skočí zpět na první instrukci:
Návěští | Shift | Klávesa | Číslo | Cíl | Poznámka |
---|---|---|---|---|---|
001 | 1 | vložení konstanty 1 na zásobník | |||
002 | + | přičtení jedničky k předchozí hodnotě | |||
003 | g | PSE | pauza 1sec na zobrazení výsledků uživateli | ||
004 | g | GTO | 001 | skok na začátek smyčky |
Program uvedený v tabulce je relativně dobře čitelný, ovšem programátor na displeji uvidí pouze následující řádky odpovídající kódům kláves (43=čtvrtá řada, třetí klávesa zleva), zadaným číslům (1) a cílům skoku (001):
001, 1 002, 40 003, 43 31 004,43,33,001
Povšimněte si toho, že se všechny číslice bez problémů vejdou na LCD s deseti znaky, čárky jsou totiž umístěny mezi čísly, nejedná se o plnohodnotné znaky)
10. Počítaná smyčka od n do 0
Zkusme si napsat složitější program, který nyní bude obsahovat počítanou smyčku od n (tato hodnota bude uložena na zásobníku před spuštěním programu) do nuly. Zde již nevystačíme s pouhým příkazem GTO pro nepodmíněný skok, ale musíme provést test na nulu s tím, že se v případě rovnosti x==0 provede instrukce ihned za testem a v případě nerovnosti se tato instrukce přeskočí:
Návěští | Shift | Klávesa | Číslo | Cíl | Poznámka |
---|---|---|---|---|---|
001 | 1 | vložení jedničky na zásobník | |||
002 | – | odečtení této jedničky od původní hodnoty | |||
003 | g | PSE | pauza 1sec na zobrazení výsledků uživateli | ||
004 | g | x=0 | test, zda je výsledek nulový | ||
005 | g | GTO | 000 | podmínka splněna: cíl 000=konec programu | |
006 | g | GTO | 001 | skok na začátek smyčky |
Podobně jako v předchozím příkladu, i zde uživatel při editaci programu na displeji uvidí pouze následující sekvenci numerických hodnot:
001, 1 002, 30 003, 43 31 004, 43 35 005,43,33,000 006,43,33,001
11. Výpočet faktoriálu
Posledním příkladem, který si dnes ukážeme, je výpočet faktoriálu, a to opět na kalkulačce HP 12c vybavené RPN a jen základními programovacími schopnostmi (mimochodem – jedná se o nejdéle laděný výpočet faktoriálu, který jsem zatím vytvořil, i assembler je mnohem jednodušší :-).
Návěští | Shift | Klávesa | Číslo | Cíl | Poznámka |
---|---|---|---|---|---|
001 | STO | 0 | uložení n do registru číslo 0 | ||
002 | 1 | uložení jedničky (mezivýsledku) na zásobník | |||
003 | RCL | 0 | uložení n na zásobník z registru číslo 0 | ||
004 | × | výpočet: n×mezivýsledek | |||
005 | 1 | uložení jedničky na zásobník | |||
006 | STO – | 0 | odečtení této jedničky on n (to je v registru 0) | ||
007 | R↓ | odstranění pomocného mezivýsledku | |||
008 | g | PSE | pauza 1sec na zobrazení mezivýsledků uživateli | ||
009 | RCL | 0 | uložení n na zásobník z registru číslo 0 | ||
010 | g | x=0 | test, zda je n nulové | ||
011 | g | GTO | 000 | podmínka splněna: cíl 000=konec programu | |
012 | g | GTO | 004 | další výpočet, tentokrát n-1×mezivýsledek |
Po dokončení programu je možné si aktuální výsledek zobrazit klávesou R↓.
Poznámka: největší faktoriál, pro nějž dává výpočet smysl, je pro n=69. V tomto případě je vhodné vynechat osmou instrukci, jinak bude výpočet trvat poměrně dlouho (minutu a cca 20 sekund).
Stejně jako v obou předchozích příkladech se uživatel při programování musí smířit se zobrazením sekvence číslic:
001, 44 0 002, 1 003, 45 0 004, 20 005, 1 006,44 30 0 007, 33 008, 43 31 009, 45 0 010, 43 35 011,43,33,000 012,43,33,004
To už se pomalu blížíme i ke slavnému Brainfucku… :-)
12. Odkazy na Internetu
- Comparison of Texas Instruments graphing calculat
https://en.wikipedia.org/wiki/Comparison_of_Texas_Instruments_graphing_calculators - Keystroke Programming
https://en.wikipedia.org/wiki/Keystroke_programming - The Museum of HP Calculators
http://hpmuseum.org/ - HP 9100
http://www.hpmuseum.org/hp9100.htm - TI calculators
http://www.ticalc.org/ - Programmable calculator
https://en.wikipedia.org/wiki/Programmable_calculator - Elektronika MK-52
https://en.wikipedia.org/wiki/Elektronika_MK-52 - Casio FX-502P emulator
http://sim41.webcindario.com/sim502.htm - Casio FX-502P series
https://en.wikipedia.org/wiki/Casio_FX-502P_series - Elektronika MK-61
https://en.wikipedia.org/wiki/Elektronika_MK-61 - Chinese BASIC
https://en.wikipedia.org/wiki/Chinese_BASIC - Boolfuck
http://samuelhughes.com/boof/ - Smallfuck
http://esolangs.org/wiki/Smallfuck - BitChanger
http://esolangs.org/wiki/BitChanger - Programming Puzzles & Code Golf – Interpret ///
http://codegolf.stackexchange.com/questions/37014/interpret-pronounced-slashes - Reg Xy
http://c2.com/cgi/wiki?RegXy - Queue (abstract data type)
https://en.wikipedia.org/wiki/Queue_%28abstract_data_type%29 - Register Machine
https://en.wikipedia.org/wiki/Register_machine - Fueue
http://esolangs.org/wiki/Fueue - ///
http://esolangs.org/wiki//// - Esolang, the esoteric programming languages wiki
https://esolangs.org/wiki/Main_Page - Esoteric Topics in Computer Programming
http://web.archive.org/web/20020609152409/www.catseye.mb.ca/esoteric/index.html - Programming Languages designed by Wouter von Oortmerssen
http://strlen.com/programming-languages - Two-dimensional languages
https://esolangs.org/wiki/Category:Two-dimensional_languages - Piet (homepage)
http://www.dangermouse.net/esoteric/piet.html - Piet (na Esolang)
https://esolangs.org/wiki/Piet - Piet IDE
http://www.rapapaing.com/blog/?page_id=6 - JSFuck (homepage)
http://www.jsfuck.com/ - JSFuck (na Esolang)
https://esolangs.org/wiki/JSFuck - JSFuck (na Wikipedii)
https://en.wikipedia.org/wiki/JSFuck - Malbolge (na Esolang)
https://esolangs.org/wiki/Malbolge - Malbolge (na Wikipedii)
https://en.wikipedia.org/wiki/Malbolge - Befunge (na Esolang)
https://esolangs.org/wiki/Befunge - Befunge (na Wikipedii)
https://en.wikipedia.org/wiki/Befunge - Minifuck
https://esolangs.org/wiki/Minifuck - XMLfuck
https://esolangs.org/wiki/XMLfuck - The False Programming Language
http://strlen.com/false-language - The FALSE Programming Language Manual
http://strlen.com/false/false.txt - Wouter van Oortmerssen
http://esolangs.org/wiki/Wouter_van_Oortmerssen - dc (computer program)
https://en.wikipedia.org/wiki/Dc_%28computer_program%29 - dc (na Esolang)
http://esolangs.org/wiki/Dc - Whitespace – tutorial
http://compsoc.dur.ac.uk/whitespace/tutorial.html - Programovací jazyk Forth a zásobníkové procesory
http://www.root.cz/clanky/programovaci-jazyk-forth-a-zasobnikove-procesory/ - Seriál Programovací jazyk Forth
http://www.root.cz/serialy/programovaci-jazyk-forth/ - Programovací jazyk Factor
http://www.root.cz/clanky/programovaci-jazyk-factor/ - Grafický metaformát PostScript
http://www.root.cz/clanky/graficky-metaformat-postscript/