RPN procesor pojmenovaný RPN32 je výsledkem repase předchozího řešení nazývaného RPNPROC. Původní řešení je nadále funkční a veškerá dokumentace k němu zůstává v platnosti. Přestože má tato kapitola název Pár slov úvodem, skutečná úvodní slova zdůvodňující vznik interpreteru RPN instrukcí obsahuje popis starého řešení. Čtenář, který je touto problematikou nedotčen, by měl začít právě tam. Po seznámení se s úvodní kapitolou může pokračovat následujícími řádky tohoto popisu.
Počátečním impulzem pro repasi stávajícího řešení byla snaha o zefektivnění provádění RPN kódu programovou vrstvou RPNPROC. To vše při zachování sady RPN instrukcí i programového interface, tedy prototypů funkcí i složení jimi použitých struktur, zkrátka API. Výsledná úspěšnost prací je proti plánu dvoutřetinová. Zjednodušení a zefektivnění dosaženo bylo, sortiment RPN instrukcí zůstal nedotčen (a navíc rozšířen), ale programový interface je úplně nový. Samozřejmě bylo možné ponechat API bez jakýchkoliv změn. Při celkové kvalitě provedené repase by to však bylo spíš ke škodě věci.
Nově vzniklá programová vrstva RPN32 nabízí v porovnání s RPNPROC výrazně jednodušší použití. Ale největší „haubt-trefa“ nového řešení interpreteru je Interaktivní provádění RPN instrukcí. Instrukce lze vykonávat nejen sekvenčně, tedy z předem vytvořeného RPN programu, ale také zcela mimo tento programový tok.
Předně, jinak se to jmenuje. Nápadná je číslovka 32 v názvu. Znamená počet bitů ve významu bitové šířky slova, která se prolíná celým řešením. Znamená (1) maximální bitovou šířku hodnot, se kterými pracují RPN instrukce, a také (2) bitovou šířku slov operačního kódu všech RPN instrukcí. Bod (2) sice v novém řešení ztrácí pro uživatele význam (viz následující kapitola), ale zdůvodňuje jednu ze zásadních změn.
Původní řešení RPNPROC pracovalo s instrukcemi proměnné délky (1, 3 nebo 5 byte). Inspirací pro to bylo řešení procesorů typu CISC (neboli Complex Instruction Set Computer), jehož známými představiteli jsou procesory firmy Intel, zejména řada 80x86. Nové řešení RPN32 se zhlédlo v koncepci procesorů RISC (tedy Reduced Instruction Set Computer), kterou používají např. procesory ARM. Pamětníci si možná vzpomenou na počítač Hewlett-Packard 2116. Ten byl vzorem pro počítače řady ADT 4000, kterou od roku 1973 vyráběly Závody průmyslové automatizace Trutnov. Ne, že by „ádétéčko“ bylo zrovna RISC, ale v mnohém se mu nápadně podobalo: všechny instrukce mají stejnou délku, některé instrukce přímo v sobě obsahují operand, ... Podobně je tomu u RPN32.
Pokud chce někdo namítat, že paušální délka 4 byte na jednu instrukci je rozmařilost hraničící se špatným hospodařením, bude mít bez pochyby pravdu. Vždyť u řady instrukcí (ne-li u většiny) se jedná o čtyřnásobek! To je naprosto nezpochybnitelný argument. Druhým nezpochybnitelným argumentem je však tvrzení, že programová vrstva RPN32 nikdy nebude provozována na 16-bitovém (nebo nedej bože 8-bitovém) počítači s operační pamětí zvící 32KB. Naopak. Počítač, na kterém bude spouštěn program využívající knihovnu RPN32 pro provádění RPN instrukcí, bude zcela jistě 32-bitový (jaká nečekaná shoda s údajem v názvu :-) a vybaven bude operační pamětí v řádu (minimálně) desítek MB. Ztráta v podobě nevyužitých několika stovek bajtů je minimální daní za nativní velikost operandů a přístupu do paměti.
Pozn.: V dokumentaci pro RPNPROC je používán termín proměnná souvislostech s RPN instrukcemi. Například hned na úvodní stránce v tabulce parametrů se tento výraz vyskytuje, stránka popisující instrukční sadu se jím jen hemží. Popis nově vzniklé programové vrstvy RPN32 se nese ve znamení návratu k tradičnímu označení paměťový registr. (Výraz proměnná v tomto kontextu užívaný v původním řešení byl výsledkem chvilkového poblouznění kalkulátory HP-32sII a HP-35s, které ve svých dokumentacích tento název používají.)
Pohled do headeru rpn32.h nabízí zcela jiný „zážitek“ v porovnání s pohledem do původního rpnproc.h. Více než 800 řádků rpnproc.h se v případě rpn32.h snížil na 600. Stejně tak počet nově vytvářených typů (skalární typy, struktury, uniony). Jejich počet je poloviční (sedm z původních čtrnácti). Je to tím, že byly vypuštěny veškeré náležitosti (konstanty, typy, prototypy funkcí, ...) pro sestavení binární formy RPN programu (výsledek překladu/kompilace z formy textové). Několik let užívání knihovny/vrstvy RPNPROC jasně ukázalo na zbytečnost tohoto meziproduktu. Zjednodušení avizované v úvodu celé kapitoly je tedy velmi dramatické. Inicializační funkce je pouze jedna:
rpn32_init()
místo předchozí sekvence
rpnproc_makejob() → rpnproc_memsize() → rpnproc_initial() → rpnproc_setjob().
Je pravdou, že vyřazením funkcí rpnproc_setjob() a rpnproc_getjob() ze sortimentu se ztrácí možnost přiřazení různého RPN kódu pro aktuální stav RPN stacku, paměťových registrů, ... Je však na zvážení, jde-li skutečně o ztrátu. Každá samostatná sekvence RPN instrukci k sobě obvykle potřebuje odpovídající sadu paměťových registrů. Potřeba střídat různé části RPN programu s různě velkými sety paměťových registrů s různými obsahy nemusí být potřebou zcela všední, ba co víc, legitimní. Neschopnost přiřazení různého RPN kódu tedy může být i určitou výhodou (pokud takový výrok příliš nepřipomíná řeči politiků :-). Ať tak či onak, v celkové koncepci se jedná o nepřehlédnutelné zjednodušení. A o to (v souladu s úvodními slovy) šlo především.
Ani funkce rpnproc_variable() nemá v novém konceptu ekvivalent. Pro zjišťování obsahu paměťových registrů v případě ladění jsou k mání zcela jiné prostředky. Případné naplnění paměťových registrů před prováděním RPN programu (nebo dokonce v průběhu provádění) se zdá být legitimním požadavkem, ale je to obvyklý postup? Kdo ví... Každopádně, tato funkce nebyla nikdy použita.
Schází také možnost uživatelské změny různých oddělovacích znaků (symboly v headeru rpnproc.h obsahující podřetězec DELIM resp. delim) ve výpisech RPN instrukcí. Důvod je stejný - naprosto zbytečná komplikace bez zjevného přínosu.
Jsou to jednobitové hodnoty, příznaky. V řadě článků v časopisu Amatérské rádio z konce sedmdesátých let dr. Mrázek (an popisuje kalkulátory značek HP a TI) nazývá tyto paměťové objekty termínem vlajky. U vědomí nedostatku vlastenectví autor tohoto textu z důvodů čistě estetických pro tyto objekty ponechává původní název flags.
Celkový počet flags, jak deklaruje tabulka parametrů, je - jak jinak - 32. Všech těchto 32 binárních hodnot lze nastavit, shodit (což je u všech výchozí stav), změnit stav na opačný, ale hlavně testovat a podle jejich okamžitých hodnot větvit program. Pro všeobecné/uživatelské využití je jich z tohoto počtu k dispozici 27 (čísla 0 až 26). Ty s nejvyššími čísly (27 až 31) mají zároveň vnitřní použití:
Paměťové registry (v terminologii vrstvy RPNPROC jsou to již zmíněné proměnné) jsou datové objekty sdílené všemi částmi RPN programu po celou dobu jeho životního cyklu. Lokální registry vznikají a zanikají dynamicky vlivem činnosti RPN programu, typicky na začátku podprogramu. Analogie s automatickými (lokálními) proměnnými funkcí psaných v jazyku C je více než zřejmá.
Lokální registry vzniknou v zásobníku návratových adres bezprostředně po provedení instrukce PUSH resp. IPUSH n. Je-li nastaven flag č. 27, dojde k jejich vynulování. Operand instrukce (obsah X-registru resp. přímý operand n) udává požadovaný počet vzniknuvších registrů. Je-li taková instrukce použita opakovaně, výsledný počet je dán součtem hodnot operandů. Mezi položkami zásobníku návratových adres (rtn) a zásobníku lokálních registrů (loc) platí následující vztah: rtn = 4 loc. Příklad: Obsahuje-li zásobník návratových adres aktuálně 7 volných položek, znamená to, že do doby volání další úrovně podprogramu lze alokovat 28 lokálních registrů.
Zánik sady lokálních registrů lze způsobit dvěma instrukcemi: POP nebo RTN. Druhá jmenovaná dokládá záměr implementace lokálních registrů: jsou lokálními pouze v rámci aktuální úrovně vnoření podprogramů. Prostředek pro zrušení/uvolnění všech lokálních registrů (pro všechny úrovně vnoření podprogramů) neexistuje.
Inspirací pro zařazení lokálních registrů do sortimentu schopností programové vrstvy RPN32 byl kalkulátor WP-34s. Odtud je převzata i indetifikace lokálních registrů. Aby se rozlišila od identifikace obecných paměťových registrů, je číslu registru předřazena tečka. Např.: RCL+ .12.
V souvislosti se zavedením lokálních registrů přistupuje ještě jedna nová vlastnost. Nepřináší nové instrukce ani novou/jinou notaci jejich operandů, přesto je důležitá. V názvosloví instrukční sady je (kromě seznamu názvů registrů RPN stacku a operandů různých instrukcí) ilustrován mechanismus indirekce. Ten je se svojí obdobou ve vrstvě RPNPROC naprosto totožný. Nové možnosti jsou v interpretaci hodnoty, kterou je nepřímo adresovaný registr identifikován. Aby bylo možno nepřímo adresovat stejnými instrukcemi také lokální registry, hodnota/index lokálního registru musí být záporná. Operací pro výpočet adresy lokálního registru je bitová negace jeho čísla. Zde je „osmibitový“ příklad: Číslo lokálního registru je 27, binárně 00011011B. Bitovou negací této hodnoty dostaneme 11100100B, což v dekadickém znaménkovém vyjádření dává číslo -28.
Nových instrukcí není mnoho, ale určitě pomohou zvýšit komfort při vytváření RPN programů.
I když to ve světle předchozích řádků (hlásajících různá zjednodušení, redukce, vypuštění, ...) bude znít absurdně, je třeba vyjít s pravdou ven: počet funkcí API se z původních 10 rozrostl na 11! Důvodů je více:
Výstup/výpis je v principu řešen obdobně jako ve vrstvě RPNPROC. Funkce rpn32_view() je jakýmsi ekvivalentem funkce rpnproc_listone(). V obou případech je funkci předán pointer na uživatelskou funkci, která ve formě argumentů obdrží požadované informace.
Zde však podobnost končí. Mezi funkcí novou a předchozí jsou dva zcela zásadní rozdíly:
Operandem RPN instrukcí specifikujícím paměťový registr může kromě obecných (číslovaných) registrů (jak jsou definovány vrstvou RPNPROC) být i libovolný registr RPN stacku včetně registru LASTx a registru flags (jejich symbolická jména jsou k nalezení v názvosloví instrukční sady). Proto se nově mohou vyskytovat instrukce STO+ T, XEQ @Z, DSE X, RCL F.
Zajímavost: V notaci HP-41C mají tyto instrukce (kromě RCL F, která ve výbavě HP-41C není) takřka stejnou syntaxi: ST+ T, XEQ IND Z, DSE X.
Dosavadní text je veden v „konfrontačním“ duchu RPNPROC vs. RPN32. Aby zůstal v tomto směru zcela konzistentní až do konce, má obsah tabulky parametrů nové knihovny RPN32 formu srovnání s řešením předchozím.
Název parametru, problematika | Hodnota parametru, vysvětlení, popis, ... | ||
---|---|---|---|
RPNPROC | RPN32 | ||
RPN stack | 4 úrovně (registry X, Y, Z, T + registr LASTx) | ||
Maximální počet | paměťových registrů | 1000 | 32768 resp. 536 miliónů ¹) |
lokálních registrů | — | ||
návěští (label) | 1000 | 32768 | |
flags | — | 32/27 ²) | |
Paměťový registr pro nepřímou adresaci | kterýkoliv... | ... + X, Y, Z, T + LASTx | |
Objekty pro nepřímou adresaci | paměťové registry, návěští... | ... + flags | |
Aritmetika s paměťovými registry | + − × ÷ pro STO i RCL | ||
Větvení programu | Skoky | Instrukce LBL, GTO, XEQ, RTN | |
Podmínky |
x=τ x≠τ x<τ x≤τ x>τ x≥τ
kde τ je 0 nebo y ... |
... + testy bitů a flags | |
Programová smyčka | instrukce ISG, DSE... | ... + ISZ, DSZ | |
Počet úrovní podprogramu | 32 | 134 miliónů ³) | |
Maximální délka programu | omezena pouze kapacitou operační paměti počítače |
¹) Pouze prvních 32768 (rozsah 0..32767) je adresovatelných přímo. Zbývající pouze indirekcí. (Samozřejmě, že hodnota 536 miliónů je pouze teoretická. Těžko si lze představit, že několik GB operační paměti počítače bude určeno pouze pro oblast paměťových registrů interpreteru RPN instrukcí. Nesmyslně velká hodnota v tabulce parametrů pouze naznačuje, že desítky tisíc předpočítaných hodnot nepředstavuje žádný problém.)
²) Flags s čísly 27 až 31 slouží k vnitřnímu použití.
³) Stejná situace, jako v bodě ¹). 134 miliónů nevyřízených návratových adres je pouze ilustrací toho, že reálně nelze tuto kapacitu vyčerpat.