Instrukce 6502 – skoky a podprogramy

V minulé lekci jsem použil v kódu instrukci skoku a popisoval jsem návrat z přerušení. Pojďme si tedy doplnit sérii a probrat zbývající instrukce skoků.

Nepodmíněný skok – JMP

Instrukce nepodmíněného skoku děljá přesně to, co u jiných procesorů – tedy to, co se označuje známým „GOTO“. Skočí se na jinou adresu a pokračuje se odtamtud. Pokud pracujete s assemblerem, nemáte žádné programátorské struktury, žádné smyčky ani bloky IF-ELSE-ENDIF, všechno musíte řešit pomocí skoků a podmíněných skoků.

Instrukce JMP používá dva adresní módy – buď absolutní adresování, nebo nepřímé. Absolutní znamená, že se skáče přímo na zadanou adresu:

Nepřímé adresování (viz díl o adresních módech) pracuje tak, že ze zadané adresy (a z adresy o 1 vyšší) se načtou dva bajty, které dohromady dají dvoubajtovou efektivní adresu a skáče se na ni.


Všimněte si, že v tomto druhém případě neskáče JMP přímo na adresu LOOP, ale na (ind). ind je návěští, na kterém jsou uložené dva bajty (viz výpis přeloženého programu).

Podmíněné skoky – Bxx

Podmíněných skoků je osm pro osm různých podmínek – podle čtyř příznakových bitů, vždy 0 nebo 1. Zde jsou v přehledné tabulce:

Příznak Stav
0 1
N BPL BMI
V BVC BVS
C BCC BCS
Z BNE BEQ

Mnemotechnika těchto názvů je prostá. Instrukce jsou skoky (Branch), z toho je písmeno B. Další dvě písmena jsou název podmínky – u příznaku N (Negative), který říká, jestli je číslo kladné nebo záporné, je to BPL (Branch if PLus) a BMI (Branch if MInus). U příznaku Z, který udává, jestli je číslo nula, to není Zero-Nonzero, ale využívá se toho, že tento skok bývá často prováděn po testu na rovnost (který interně probíhá jako odčítání). Při nerovnosti, nenulovém výsledku (Z=0) se skáče instrukcí BNE (Branch if Not Equal), analogicky při rovnosti, a tedy Z=1, se skáče instrukcí BEQ (Branch if EQual).

U příznaků C a V, které nemají takhle jednoznačné „vysvětlení“, se používá mnemotechnika „Branch if V is Clear“ (BVC), „Branch if C is Set“ (BCS) apod.

Adresní mód těchto instrukcí je vždy relativní. To znamená, že se skáče v rozmezí -128..+127. Využívá se toho, že podobné podmíněné skoky jsou většinou součástí krátkých smyček. Pokud tomu tak není, musíte použít „náhražkovou“ konstrukci:

Překladač naštěstí za vás spočítá správnou hodnotu odskoku z aktuální adresy návěští a cílové adresy. Hodnota 0 znamená následující adresu (tj. žádný efekt), hodnota 0FEh skáče o dvě místa zpátky, tj. na tu samou adresu, kde je instrukce (je to hodnota -2, a Bxx jsou dvoubajtové).

BRK, RTI

Tyto instrukce jsme probrali v minulém díle – slouží pro vyvolání přerušení a pro návrat z obslužné rutiny přerušení.

Podprogramy – JSR, RTS

To, k čemu u 8080 sloužily instrukce CALL a RET, zajišťují u 6502 instrukce JSR a RTS (Jump to Subroutine / Return from Subroutine). JSR používá pouze absolutní adresní mód, tj. za instrukcí jsou nižší a vyšší bajty cílové adresy. JSR uloží na zásobník vyšší a nižší bajt návratové adresy, a pak do PC nahraje přečtenou adresu. Čímž se vlastně provede skok na nějakou adresu (jako u JMP), s tím rozdílem, že na zásobníku je adresa, kam se má program vrátit (ve skutečnosti je o 1 menší, s čímž počítá instrukce RTS).

K návratu slouží instrukce RTS. Ta přečte ze zásobníku dva bajty, z nich složí adresu, přičte 1 (viz výše) a na ni skočí. Pokud podprogram zanechal zásobník v takovém stavu, v jakém ho našel, tak se skočí na instrukci, následující za příslušnou instrukcí JSR.

Rozdíl mezi RTS a RTI je v tom, že RTI načítá ze zásobníku i uloženou hodnotu příznakového registru P a k návratové adrese nepřičítá 1 (instrukce BRK i přerušení ukládají pravou návratovou adresu).

Úhrnem lze o instrukční sadě procesoru 6502 v souvislosti se skoky říct, že je hodně omezená. Podmíněné skoky pouze relativní, skoky do podprogramu a návraty pouze nepodmíněné a s absolutní adresou, jen nepodmíněný skok lze adresovat i nepřímou adresou (ale nelze relativně).

Líbil se vám článek? Podpořte autora na Patreonu
Příspěvek byl publikován v rubrice 6502. Můžete si uložit jeho odkaz mezi své oblíbené záložky.

Napsat komentář

Vaše emailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *