RPN32 - Funkce API



Instrukční sada  •  Seznam instrukcí  •  Funkce API  •  Header  •  Příklady  •  Download



Seznam funkcí

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()



Popisy funkcí


Funkce rpn32_init()

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:

  1. RPN32_INIT_CB_TYPE_MEMORY  - Pro inicializační proceduru je třeba (další) příděl paměti.
  2. RPN32_INIT_CB_TYPE_LINE    - Žádost o další RPN instrukci v textové podobě (programová řádka).
  3. RPN32_INIT_CB_TYPE_UNKNOWN - Oznámení o neúspěšném pokusu o převod instrukce (z předchozího bodu) do binární formy.

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.


Funkce rpn32_view()

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:

  1. Zástupné. Jak už název napovídá, jde o znaky, které zastupují nějaké složky výpisu.
  2. Řídicí. Tyto znaky ovlivňují konkrétní podobu (některých) číselných hodnot výpisu.
Znaky formátovacího řetězce jsou v následujících tabulkách s vysvětlivkami psány velkými i malými písmeny. Při použití funkcí rpn32_view() a rpn32_list() lze používat znaky bez ohledu na toto rozlišení.

» Znaky zástupné

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.

» Znaky řídicí

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.


Funkce rpn32_list()

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í.


Funkce rpn32_mem()

Poslední ze skupiny funkcí druhu INFO je tato. Prostřednictvím opakovaně volaného callbacku zveřejňuje informace o

Jednotlivé řádky výpisu vzniklé opakovaným voláním callbacku jsou uvozeny příslušnými identifikátory.


Funkce rpn32_enter()

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í.


Funkce rpn32_tenter()

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.


Funkce rpn32_rdn()

Činnost této funkce lze popsat třemi elementárními kroky:

  1. Vyzvednutí hodnoty z X-registru RPN stacku,
  2. Roll Down RPN stacku,
  3. Návrat s vyzvednutou hodnotou.
Je vrcholně jednoduchá, ale také vrcholně užitečná. Ideálně se hodí k předání více (návratových) hodnot z vrstvy RPN32 do uživatelského kódu/programu.


Funkce rpn32_regx()

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.


Funkce rpn32_run()

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

Důvod volání callbacku je rozlišen hodnotou v argumentu __type funkce rpn32_run(). Výběr hodnot RPN32_RUN_CB_TYPE_TRACE nebo RPN32_RUN_CB_TYPE_PSE je exkluzivní: v režimu TRACE není třeba zvlášť volat callback pro instrukci PSE, když je tak jako tak volán pro každou prováděnou instrukci.

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á

Pozn.: Typickým obsahem těla callbacku bude volání funkce rpn32_view().


Funkce rpn32_gto()

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.


Funkce rpn32_now()

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í.