VBI (pro začátečníky)

Radek Štěrba, RASTER

VBI je jedno z nejčastěji používaných přerušení. Umožňuje totiž pseudo souběžné vykonávání dvou procesů - tj. je možné mít spuštěné dva procesy, kdy jeden probíhá v normálním čase a druhý během vertikálního přerušení.

O přesných principech se teď už nebudu zmiňovat, neboť ty lze najít v mnoha příručkách. Nyní Vám chci prakticky ukázat, jak lze použít VBI ve vlastním programu.

Pro vertikální přerušení jsou zapotřebí dvě rutiny:
První rutina je vlastní program, který má být prováděn během VBI. Musíte si uvědomit, že tato rutina je volána 50 krát za sekundu, takže je doba jejího provádění omezena na cca 20000 strojových cyklů. Dalším omezením je, že tato rutina musí po vykonaní své činnosti skočit na danou adresu (vektor).

Druhá rutina je inicializační. Provádí spuštění rutiny pro VBI. Protože při spouštění je bezpodmínečně nutné znát přesnou adresu začátku rutiny pro VBI, bývají tyto rutiny umístěny napevno v paměti (a nejsou relokatibilní - tj. nefungují při umístění jinam). Inicializační rutina:

Hlavní částí této rutiny je sekvence, která spustí vlastní rutinu pro VBI:

     LDY #START   ;Horní byte
     LDA #07       ;Konstanta
     JSR $E45C     ;SETVBV
                   ;Program pro nastavování vektorů přerušení
     RTS           ;Konec inicializace
Rutina pro VBI (vlastní program):
START
     ...
     ...
     vlastní činnost rutiny
     (maximálně cca 20000 str.cyklů)
     ...
     ...
     JMP $E462     ;XITVBV
                   ;Vektor ukončení VBI

Při používání VBI si dejte pozor na následující problémy:

  1. Pozor na zásobník.
    Pokud v rutině VBI používáte jakýmkoli způsobem zásobník (a to nejen instrukcemi PHA,PLA - i JSR a RTS používá zásobník!), dbejte na to, aby na konci byl přesně ve stavu, v jakém byl v okamžiku začáku rutiny.
  2. Změna obsahu proměnných.
    Pokud v rutině VBI měníte obsah nějakého místa v RAM (a to určitě děláte), dejte si pozor, aby tato paměťová buňka nebyla používána v hlavním programu. Pokud si nejste jisti, uveďte na konci rutiny VBI její obsah do původního stavu.
    Příklad:
    V hlavním programu provádíte přesun paměti - berete odněkud z paměti byte a dáváte ho STA(206),Y. Nyní si představte, že ve VBI běží špatně napsaná rutina, která používá buňku 207 a neobnovuje její původní obsah. K čemu dojde? Hlavní program si nastaví adresy 206 a 207 tak, aby ukazovaly na cílové místo. Během další činnosti hlavního programu se ale vyvolá přerušení a rutina VBI buňku 207 změní. Pak vrátí činnost do hlavního programu. Ten pokračuje ve své činnosti a ukládá na STA(206),Y. Protože buňka 207 byla změněna a v tomto případě ji hlavní program používá jako horní byte pro určení cílového místa, uloží se příslušný byte na úplně jiné místo, než původně měl. Ve většině případů to způsobí havárii systému, protože dojde např. k přepsaní byte v nějaké strojové rutině.
  3. Nekonečné smyčky.
    Ve VBI nesmíte mít žádnou činnost trvající déle než 20000 cyklů - tj. pro představu doba menší než 1/50 sekundy.
    V žádném případě tedy nesmíte mít ve VBI rutině nekonečnou smyčku nebo její obdoby.
    Jednou z nejčastějších chyb začátečníků bývá např. smyčka s čekáním na stisk klávesy umístěná v rutině VBI. Toto čekání bude totiž bezpochyby trvat déle než 1/50 sekundy a systém tedy zhavaruje naprosto spolehlivě.
  4. Mylná úvaha.
    Dost ataristů se domnívá, že přemístěním části práce do rutiny VBI odlehčí činnost hlavnímu programu, a tím zrychlí běh celého programu. Chybná informace ve stylu, že hudba, která hraje na pozadí (ve VBI), nezpomaluje běh hlavního programu, se dokonce objevuje i v některých příručkách.
    Není problém napsat rutinu pro VBI, která bude tak náročná, že běh hlavního programu zpomalí viditelně.
    Základní omyl je totiž v tom, že pokud ve VBI neběží žádná rutina, že je nějaký strojový čas nevyužíván. Pravdou ale je, že rutina ve VBI pracuje vždy na úkor hlavního programu.