Popis funkcí se v souladu s novým řešením nese v duchu úspor a zjednodušení. Chybí zde samostatné stránky věnované každé funkci API, jak tomu bylo v případě RPNPROC. Všechno (konstanty, typy, prototypy funkcí a jejich návratové hodnoty) je srozumitelně popsáno v headeru rpn32.h a pouhý přepis náležitostí se sofistikovanější grafickou úpravou by byl nošením dříví do lesa. Obsahem této kapitoly proto bude slovní popis činností funkcí a zdůraznění rozdílů mezi API předchozího a současného provedení (tedy opět duel RPN32 vs. RPNPROC).
Následující tabulka sumarizuje funkce obou vrstev s přihlédnutím na jejich určení. Ve sloupci DRUH jsou zkratková slova členící celý sortiment. Jejich významy jsou jasné, přesto: STK je RPN stack, DBG znamená debug. (Za povšimnutí stojí fakt, že sufixy názvů funkcí se ve většině případů shodují s nápisy na/okolo tlačítek skutečných kalkulátorů.)
Druh | Činnost | Funkce | |
---|---|---|---|
RPN32 | RPNPROC | ||
I N I T |
Inicializace, převod textové formy RPN programu na binární | rpn32_init() | rpnproc_makejob() |
rpnproc_memsize() | |||
rpnproc_initial() | |||
rpnproc_setjob() | |||
Zjištění pointeru na úsek RPN programu | — | rpnproc_getjob() | |
Zjištění pointeru na obsah paměťového registru | — | rpnproc_variable() | |
I N F O |
Výpis obsahu paměťových registrů, registrů RPN stacku, flags | rpn32_view() | — |
Výpis instrukcí RPN programu | rpnproc_listone() | ||
rpn32_list() | rpnproc_listjob() | ||
Informace o alokaci paměťových registrů a návěští | rpn32_mem() | — | |
S T K |
Vložení hodnoty na RPN stack | rpn32_enter() | rpnproc_enter() |
rpn32_tenter() | |||
Vyjmutí/vyčtení hodnoty z RPN stacku | rpn32_rdn() | rpnproc_execute() | |
rpn32_regx() | |||
R U N |
Spuštění/pokračování RPN programu | rpn32_run() | |
Skok na adresu danou návěštím (před spuštěním RPN programu) | rpn32_gto() | ||
D B G |
Okamžité provádění RPN instrukcí (tzv. Interaktivní provádění) | rpn32_now() | — |
Jediným zástupcem druhu INIT je právě tato inicializační funkce. Samotné její použití není třeba nijak zvlášť rozebírat. Co funkci prostřednictvím argumentů dát a co od ní v podobě návratové hodnoty očekávat, je jasné z headeru rpn32.h. Daleko zajímavější bude seznámení se s posláním uživatelské funkce, jejíž adresou je naplněn argument __fncp této funkce. Tento callback volá vrstva RPN32 ze tří různých důvodů rozlišených hodnotou argumentu __type:
V případě žádosti o paměť (argument __type == RPN32_INIT_CB_TYPE_MEMORY) je při vstupu do callbacku platný pouze člen __iap->memoryv.size. Obsahuje doporučené množství paměťového prostoru. Při výstupu tato hodnota může být aktualizována (je-li množství alokované paměti jiné než doporučené) a člen __iap->memoryv.memp musí ukazovat na začátek bloku přidělené paměti.
V ostatních případech je používán pouze člen __iap->linep. Rozlišení jeho role (vstup nebo výstup) je dané kontextem.
Tato funkce „nabídne“ callbacku formou argumentu __linep řádku textu, který popisuje okamžitý stav interpreteru. Maximální délka řádky textu je 240 znaků. Je-li tento počet vlivem složení formátovacího řetězce překročen, neúplná řádka končí sekvencí ">>>".
Ve sloupci RPN32 souhrnné tabulky zasahuje buňka s názvem této funkce přes dva řádky sloupce Činnost. První obsahuje text Výpis obsahu paměťových registrů, ..., ve druhém je napsáno Výpis instrukcí RPN programu. A právě to jsou ty stavové informace. Instrukce RPN programu je vypsána (není-li tato část výpisu záměrně potlačena) aktuální, tedy ta na kterou právě „míří“ vnitřní ukazatel.
Že je činnost, jakou jsou informace pro výstup/výpis požadovány a následně poskytovány, řízena formátovacím řetězcem, naznačuje už úvodní odstavec Nové řízení výpisu. Zde je prostor pro detaily.
Znaky, ze kterých je formátovací řetězec složen, lze rozdělit do dvou skupin:
Znak | Význam | |
---|---|---|
X Y Z T | Registry RPN stacku | |
k | Whole stack | Všechny registry RPN stacku |
L | Last X | Registr LASTx |
f | Flags | Flags v podobě 32-bitového hexadecimálního čísla |
r | Return | Nejvyšší úroveň zásobníku návratových adres (tj. aktuální návratová adresa) |
g | local reGisters | Aktuání a celkový počet lokálních registrů |
a | Address | Adresa aktuální instrukce (programové řádky). Je to číslo aktuálního/posledního návěští doplněné číslem programové řádky (číslováno počínaje místem prvního výskytu návěští) |
c | Code | Binární kód instrukce (naprosto nepoužitelné, pouhý relikt vývojových etap :-) |
= | Kombinace všech důležitých částí: kLa | |
i | Instruction | Potlačení výpisu instrukce (programové řádky) v mnemonickém tvaru |
číslo | number | Dekadické (i víceciferné) číslo identifikuje kterýkoliv paměťový registr |
@ | indirect | Prefix nepřímé adresace (lze kombinovat s jakýmkoliv registrem) |
. | local | Prefix lokálního registru |
, | separator | Oddělovač čísel paměťových registrů |
\ | escape | Prefix předznamenávající znak, který je bezprostředně vložen do výstupního bufferu |
znak | character | Jakýkoliv znak mimo sortiment zástupných nebo řídicích je bezprostředně vložen do výstuního bufferu (i bez Escape prefixu) |
Pozn.: Mnemonický tvar instrukce je vždy poslední částí/složkou vypisované řádky. Pořadí ostatních znaků ve formátovacím řetězci určuje i pořadí ve výpisu.
Znak | Význam | |
---|---|---|
s | Signed | Znaménkové vyjádření |
u | Unsigned | Bezznaménkové vyjádření |
d | radix DEC | V desítkové soustavě |
o | radix OCT | V osmičkové soustavě |
h | radix HEX | V šestnáctkové soustavě |
p | Previous | Kompatibilita s RPNPROC ve výpisu instrukcí porovnání obsahu X-registru (viz poznámky za tabulkou seznamu instrukcí) |
Pozn.: Znaky signed, unsigned a radix mají trvalou platnost až do dalšího výskytu.
Tato funkce poskytuje výpis celého RPN programu. Téměř vše, co bylo obsaženo v popisu funkce rpn32_view() platí i pro ni. Rozdíl je pouze v jednom detailu. Funkce rpn32_view() proběhne „jednorázově“, tj. způsobí pouze jednu jedinou řádku výpisu. Funkce rpn32_list() volá svůj callback opakovaně, od první po poslední RPN instrukci (nebo také ani jednou, není-li žádná, viz interaktivní provádění). Návratová hodnota callbacku RPN32_RTNVAL_STOP celou sekvenci (předčasně) zastaví.
Poslední ze skupiny funkcí druhu INFO je tato. Prostřednictvím opakovaně volaného callbacku zveřejňuje informace o
Funkce vloží hodnotu danou jejím argumentem __value do X-registru RPN stacku. Ještě předtím provede posun celého RPN stacku směrem vzhůru (v originále lifting of the stack's contents). Nelze však říci, že tato funkce je přímým ekvivalentem stejnojmenné instrukce ENTER obsažené v instrukční sadě. Tato funkce (na rozdíl od instrukce) nastaví příznak pro právě zmíněný „zdvih“ celého RPN stacku při jeho následném použití.
Tahle funkce dělá naprosto to samé, co předchozí rpn32_enter(). Rozdíl je pouze v tom, že argument nesoucí hodnotu vkládanou na RPN stack je typu (char const *) místo předchozího (rpn32value_t). Výhoda je zřejmá: pokud je vstupem do programu využívajícího knihovnu RPN32 text, není třeba ho převádět na binární hodnotu. Funkce převod zajistí sama. Příjemným návdavkem je možnost zadat vícesložkovou hodnotu Loop Control-number.
Činnost této funkce lze popsat třemi elementárními kroky:
Je to skoro trapné, ale tahle funkce je ještě jednodušší, než ta předchozí. Ze tří uvedených elementárních kroků dělá pouze dva! Ten prostřední (Roll Down) je v tomto případě vynechán. Jinak řečeno - funkce pouze vrátí hodnotu X-registru RPN stacku. Vypadá to sice banálně, ale existence této funkce je velice důležitá. Bez ní by nebylo možné zjistit výsledek výpočtu bez zásahu do „vnitřností“ interpreteru.
Když už je konečně RPN program napsán, úspěšně přeložen/zkompilován do binární formy, která je uložena do paměti počítače, zbývá poslední krůček. K jeho uskutečnění slouží funkce, která je de facto základním kamenem celé této stavby: spuštění vytvořeného RPN programu. Funkce má (podobně jako některé předchozí: rpn32_init(), rpn32_view(), rpn32_list(), rpn32_mem()) argument - callback. Ten však není volán za všech okolností, jako u funkcí předchozích. Co je míněno těmi okolnostmi?
U předchozích případů lze prohlásit, že callback plní úlohu funkční nebo provozní, chcete-li. Bez callbacku by daná funkce neplnila svůj účel. Jinak je tomu v případě funkce rpn32_run(). Zde je callback volán
RPN program se rozeběhne od aktuální instrukce. Tou může být nejen ta úplně první v pořadí, ale třeba i ta, která
Funkce nastaví aktuální pozici pro spuštění v RPN programu podle argumentu __lblno ve významu číslo návěští (label). Provede vlastně totéž, co instrukce GTO. Navíc vyprázdní zásobník návratových adres.
Poslední funkce ze seznamu provede jednu instrukci a svoji činnost tím ukončí. Prováděná instrukce však není z programového toku, ale je v mnemonickém tvaru zadána přímo jako její argument __linep. Více v kapitole interaktivního provádění.