6502 – přerušovací systém

Nejen o přerušení, ale také o tom, co se děje, když zapnete napájení.

Napětí je připojeno, hodinový takt běží, procesor 6502 začíná pracovat. Co udělá ze všeho nejdřív? Správnou odpověď do vzkazů, pokud neuhodnete, musíte si dát tuto hádanku na svůj Facebook!

Promiňte, samozřejmě to není hádanka a nic si na Facebook dávat nemusíte. Řekneme si to hned teď. Ale začneme přerušením.

Procesor 6502 má, stejně jako jiné procesory, k dispozici přerušovací systém. Princip přerušení jsme si už popisovali u procesoru 8080: v situaci, kdy je potřeba zareagovat (např. přišel kompletní načtený znak z terminálu) si vyžádají okolní obvody pozornost procesoru přerušovacím signálem. Procesor k takovému účelu má extra přerušovací vstup (někdy víc), a zareaguje tak, že uloží svůj stav na zásobník a provede určitou instrukci, která většinou způsobí skok do podprogramu.

Přerušení u 8080 je maskovatelné, to znamená, že pomocí instrukce může programátor zakázat, aby procesor na přerušení reagoval (obvykle v časově kritických místech).

U 6502 jsou dva přerušovací vstupy. Jeden z nich je maskovatelný (IRQ) – signál na tomto vstupu vyvolá přerušení pouze v případě, že není nastaven příznak I. Druhý přerušovací vstup je nemaskovatelný (NMI, Non-Maskable Interrupt). Signál na tomto vstupu vyvolá přerušení vždy.

Co se stane, když systém vyvolá přerušení? Procesor v tu chvíli uloží na zásobník hodnotu registru PC (nejprve vyšší, potom nižší bajt), pak uloží rovněž na zásobník hodnotu příznakového registru P a pak skočí na adresu obsluhy přerušení.

A tu zjistí kde přesně? Správná otázka. Pokud šlo o maskovatelné přerušení IRQ, tak si ji přečte na adresách FFFEh a FFFFh, tedy na posledních dvou adresách adresního prostoru. Pokud vás trápí otázka „a jak se tam ta adresa dostane?“, odpověď zní: To záleží na návrháři systému. Pokud je tam pevná paměť (ROM/PROM/EPROM/atd.), je v ní adresa obsluhy přerušení („přerušovací vektor“) uložená napevno. Když je tam RAM, zapsal si ji tam programátor.

Pokud šlo o nemaskovatelné přerušení NMI, přečte si adresu obslužné rutiny na adresách FFFAh a FFFBh.

Zajímá vás, co je mezi tím? Na FFFAh a FFFBh je adresa obsluhy NMI, adresa obsluhy IRQ je na FFFEh a FFFFh, zbývá volný prostor FFFCh a FFFDh… Tam je adresa RESETu.

Ano, čtete dobře. Po zapnutí napájení nebo po přivedení signálu RESET se procesor nenastavuje do nějakého definovaného stavu, on prostě jen skočí na adresu, která je zapsaná v buňkách FFFCh a FFFDh. Jediný rozdíl proti přerušení (viz výše) je v tom, že RESET neukládá PC a P na zásobník.

Vzhledem k tomu je potřeba, aby na těchto adresách byla při startu systému smysluplná adresa. Nemůžeme spoléhat na to, že ji tam zapíše programátor, takže je to potřeba buď vyřešit tím, že na konci paměťového rozsahu je paměť ROM, nebo nějakým obvodovým hackem, který po startu „podvrhne“ procesoru tu správnou adresu.

Instrukce RTI

Instrukce RTI – Return from Interrupt doplňuje přerušení, jak jsme si popsali výše. Provádí přesně opačné kroky, tj. ze zásobníku načte obsah registru P, pak nižší a vyšší bajt registru PC. Postará se tedy o správný návrat z rutiny přerušení.

Jednoduchý příklad v assembleru: program uloží do registru A hodnotu 3 a tu pak zapíše do nulté stránky na adresu 0. Zápis pak probíhá stále dokola – můžete si ověřit pomocí krokování. Pokud kliknete na IRQ, procesor si odskočí do obsluhy přerušení, která změní obsah registru A. Po návratu do nekonečné zapisovací smyčky se už tedy bude zapisovat jiná hodnota.


Všimněte si, že tentokrát program začíná na adrese 0200h a od adresy FFFCh jsou zadány hodnoty startovací adresy a přerušovací rutiny.

Při krokování si všimněte, že při provádění obsluhy přerušení je nastaven příznak I.

Instrukce BRK

Co se stane, když procesor provede instrukci BRK? Uloží na zásobník hodnotu registru PC (nejprve vyšší, potom nižší bajt), pak uloží na zásobník hodnotu příznakového registru P a pak skočí na adresu obsluhy přerušení IRQ, kterou si přečte na adresách FFFEh a FFFFh.

Možná vám to připadá povědomé… Ano, přesně totéž se děje při maskovatelném přerušení IRQ! Není to náhoda.

Ve skutečnosti je procesor 6502 zapojen tak, že přerušovací požadavek po kontrole příznaku I uloží do registru, kam si načítá kód další instrukce, operační kód instrukce BRK (který je, čistě pro zajímavost, roven 00h). Takže se opravdu provádí to samé – s jedinou výjimkou: instrukce BRK před skokem na obsluhu ještě nastaví příznakový bit B. Podle něj lze poznat, jestli obsluhu přerušení vyvolal vnější systém (B=0) nebo instrukce BRK (B=1).

Pro zájemce jen dodám, že stejně funguje i obsluha NMI, která rovněž podvrhne BRK, ale změní i adresy vektoru, a v zásadě i signál RESET, který ale místo „ukládání do paměti“ při práci se zásobníkem aktivuje signál „čtení z paměti“ – více o těchto vnitřních zajímavostech naleznete v článku . Z tohoto článku ocituju i souhrnnou tabulku, co se děje v procesoru 6502 při přerušení a instrukci BRK:

Příčina Vektor Ukládá PC a P na zásobník? Nastavuje příznak B?
signál NMI $FFFA/$FFFB ano ne
signál RESET $FFFC/$FFFD ne ne
signál IRQ $FFFE/$FFFF ano ne
instrukce BRK $FFFE/$FFFF ano ano

(K dalšímu studiu: 6502 interrupts)

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.

4 komentáře u 6502 – přerušovací systém

  1. odpad napsal:

    Díky za pokračování série.
    Pod příspěvky moc komentářů není a bylo by škoda se domnívat, že to nikdo nečte – čte!
    Až to bude celé po hromadě, tak z toho udělej brožuru – příručku pro 6502. Asi nejlíp to klasicky zalomit a spáchat třeba PDF. Abych jen neházel na hrb jiným, tak s tím případným zlomem ti můžu pomoct – tedy můžu to udělat já. Ale je to jen námět 😉 Samozřejmě chápu, že interaktivita webu s tvým embedovaným ASM80 by na papíře chyběla, ale sám mám radši určité texty na papíře. Tak nějak si raděj zalistuju, než dohledám v dalším okně, kterých mám beztak otevřených stovky 😉

    • Martin Malý napsal:

      To je v pořádku, ty komentáře tu jsou hlavně proto, aby šlo lehce nahlásit chybu nebo nepřesnost a já to mohl opravit. Viz „motivační článek“ na http://retrocip.cz/chcete-se-naucit-assembler/

      Ta interaktivita je tam důležitá, ale myslím si, že jako e-book by to určitě časem vydat šlo.

      • odpad napsal:

        OK, pasáž o čisté účelnosti komentářů jsem nejspíš přehlédl a omlouvám se tedy za komentáře mimo oblast určení. Já se spíš trošku obával, aby to tady časem taky neskončilo jako u Dexe, který na jeden (byť asi ne první) nemístný a hloupý příspěvek zareagoval dost přehnaně. Tedy obával jsem se stavu, kdy je komentářů pomálu (nebo jsou mezi nimi i hloupé – což tady naštěstí není), což na motivaci pokračovat nepřidá.

        • Martin Malý napsal:

          Vzhledem k tomu, že mám se psaním na internety a s komentátory zkušenost od roku 2001, tak se nebojím. 🙂 Já se nebráním komentářům „neúčelným“, to je, myslím, v pohodě, a když sem někdo napíše nostalgickou historku, nevadí mi to.

Napsat komentář

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