Předávání parametrů strojovým podprogramům z BASICu (TurboBASICu)

Radek Štěrba

Pokud jste se rozhodli, že budete ve svých BASICovských programech používat strojové podprogramy, které si sami napíšete, pak jsou následující řádky určeny právě Vám.

Pro správné pochopení dalších řádků je nutné uvědomit si, jak pracuje struktura zásobník (stack):

Nejjednodušší je představit si ho jako hromádku karet. Na tuto hromádku můžeme vždy nahoru položit další kartu nebo (opět pouze horní kartu) odebrat. Tato struktura se nazývá FILO - zkratka First In Last Out - neboli - První dovnitř poslední ven. Tímto je jasné, že číslo, které vložíme do zásobníku jako první bude postupně zaskládáváno dalšími čísly. Tato čísla budeme moci odebírat pouze postupně a v opačném pořadí, než jak byla vkládána.

Zásobník, který je implementován v počítačích Atari XE/XL umožňuje ukládat jednobytová čísla (tedy čísla rozsahu 0 až 255). Celkový počet čísel, která můžeme do zásobníku uložit je omezen na 256.

Pro uložení čísla do zásobníku je určena instrukce PHA - uloží se obsah akumulátoru na vrchol zásobníku.

Pro výběr čísla ze zásobníku používáme instrukci PLA - naplní akumulátor číslem z vrcholu zásobníku.

Jako příklad s využitím předávání parametrů jsem napsal strojový podprogram, který převezme dvě čísla a vrátí jejich součet.

Okomentovaný výpis tohoto podprogramu je součástí této výukové lekce.

Způsob volání:

SOUCET=USR(ZačátekStrPrg,CISLO1,CISLO2)

Až BASIC program dojde do místa, kde narazí na tento řádek, provede následující:

  1. Do zásobníku se uloží návratová adresa. (Bude využita pro návrat ze strojového podprogramu.)
    (Tato adresa nás nemusí vůbec zajímat.)
  2. Vezme CISLO1 (a to buď konkrétní číslo nebo obsah proměnné, která zde bude uvedena) a zaokrouhlí ho na celá čísla. Pokud bude získaná hodnota mimo povolený interval (0 až 65535), dojde k chybovému hlášení.
  3. Rozdělí CISLO1 na horní a dolní byte.
    HBYTE=INT(CISLO1/256)
    DBYTE=CISLO1-256*HBYTE
  4. Vloží DBYTE do zásobníku.
    Vloží HBYTE do zásobníku.
  5. Provede pro CISLO2 stejnou operaci (viz. body 2. , 3. a 4.)
  6. Do zásobníku se vloží počet parametrů (tz. počet dvojic (HBYTE,DBYTE)).
    (V našem případě by to bylo číslo 2, neboť jsme použili 2 parametry.)
  7. Provede se spuštění strojového podprogramu od adresy dané hodnotou ZačátekStrPrg.

Důležité upozornění:
Ve strojovém podprogramu musíme bezpodmínečně zajistit vybrání hodnot počtu parametrů a všech dvojic (HBYTE,DBYTE) až po návratovou adresu (ale tuto už tam necháme) ze zásobníku.

Nezapomeňte na to, že procesor si do zásobníku ukládá i další hodnoty - jako například při vykonání instrukce JSR bude do zásobníku uložen dolní a horní byte návratové adresy, nebo při vykonání RTS se 2 byte odeberou a použijí jako návratová adresa. Vybrání parametrů by proto mělo být hned na začátku podprogramu, aby se předešlo zbytečným problémům.

Pokud tedy použijete ve svém strojovém podprogramu instrukce PLA pro převzetí parametrů z BASICu (nebo TurboBASICu), budete dostávat tyto hodnoty:

PLA - Poprvé
  .. akumulátor bude naplněn počtem parametrů, které byly použity při volání z BASICu (jedná se o počet dvojic HBYTE,DBYTE !!!). Kontrolou této hodnoty můžeme ověřit, zda bylo užito správného počtu parametrů a vyhnout se zhroucení systému.
PLA - Podruhé
  .. akumulátor bude obsahovat HORNÍ byte prvního parametru.
PLA - Potřetí
  .. akumulátor bude obsahovat DOLNÍ byte prvního parametru.
PLA - Počtvrté
  .. HORNÍ byte druhého parametru.
PLA - Popáté
  .. DOLNÍ byte druhého parametru.
atd. atd. atd.

Obecně: Volání:

A=USR(RunAdr,PAR1,PAR2,..,PARn)

Stav zásobníku při zavolání str.podpr.:

Nahoře  PočetParametrů (=n)
        HorníBytePAR1 -PAR1
        DolníBytePAR1 /
        HorníBytePAR2 -PAR2
        DolníBytePAR2 /
        ...
        ...
        HorníBytePARn -PARn
        DolníBytePARn /
        HorníByteNávratovéAdresy
Dole    DolníByteNávratovéAdresy
Dno ---------------------------------