7.9. Tiny Debugger

Z času načas každý programátor urobí chybu, ktorá sa pri ladení ťažko hľadá. Pokiaľ sa využíva emulátor, väčšina chýba sa dá nájsť cez sledovanie registrov, monitorovanie RAM alebo krokovaním programu. Ak sa však testuje program pre počítač alebo perifériu, ktorá nie je v emulátore, sú možnosti dosť limitované. Väčšinou sa programátor musí uchýliť k sledovaniu hodnôt registra výpisom na obrazovku, odvysielaním na perifériu (napr. sériovú linku), príp. zvukovým signálom.

Tiny Debugger je knižnica, ktorá sa prilinkuje k vyvíjanému programu a poskytuje programátorovi základný komfort na hľadanie chýb

- aktuálne hodnoty registrov

- obsah RAM

- hodnoty uložené na zásobníku*

- krokovanie inštrukcií*

* riešené v závislej časti, viď nižšie

V problematickej časti kódu potom stačí zavolať Tiny Debugger a zistiť stav registrov či RAM.

Tiny Debugger bol napísaný univerzálne pre všetky počíače s procesorom Z80. Jedna časť je nezávislá a druhá sa musí prispôsobiť konkrétnemu typu počítača.

V závislej časti je treba upraviť rutiny pre tieto činnosti

- inicializácia prostredia (uloženie prepisovanej časti VideoRAM, načítanie počiatku zobrazovanej RAM a pod.)

- nastavenie súradníc pre vypisovaný text

- výpis textu

- vstup z klávesnice

- finalizácia pred ukončením Tiny Debuggera (obnovenie prepísanej časti obrazu)

Závislú časť je potom možné doplniť o ďalšie "vychytávky".

Závislá časť pre počítač Ondra bola rozšírená o funkcionalitu duálneho zobrazenia RAM (prepnutie medzi RAM obsahujúcou zásobník a užívateľom definovanou oblasťou) a o krokovanie inštrukcií.

Ovládanie je pre jednoduchosť realizované jediným riadkom kláves H, J, K, L a Enter.

H          prepnutie medzi zobrazením užívateľom definovanej RAM a zásobníkom

J           posun zobrazovanej oblasti RAM smerom k nižšej adrese

L           posun zobrazovanej oblasti RAM smerom hore

K          krokovanie po inštrukciách

Enter    ukončenie debuggera 

Krokovanie je najzložitejšou časťou debuggera. Je riešené prerušením od VSYNC, po ktorom sa v slučke čaká na priblíženie k ďalšiemu prerušeniu tak, aby do ďalšieho prerušenia mohlo dôjsť k vykonaniu len jedinej inštrukcie. Keďže Ondra je prerušovaný aj generovaním obrazu cez DMA, najväčší dôraz treba venovať správnemu nastaveniu časovania pre daný zobrazovací režim. Časovanie je závislé na počte zobrazovaných riadkov - teda nastavení časovačov v počítači! Preto pri zmene počtu riadkov teda opäť prispôsobiť časovanie debuggera.

V závislej časti debuggera sa nachádza nasledovná časová slučka:

; +++ time adjusting +++

        LD      HL, (D1CDWN)   

D1FIN2: DEC     HL             

        LD      A, H

        OR      L

        JR      NZ, D1FIN2

        LD      A, R            ; 9T

;       LD      A, 1            ; 7T

;       NOP                     ; 4T

; ++++++++++++++

Prvotne treba nastaviť správne hodnotu D1CDWN, následne ešte jemne doladiť použitím vhodných inštrukcií, ktoré slúžia len na spotrebu príslušného množstva strojových cyklov, aby bol výsledok čo najpresnejší.

LD    A, R

LD    A, n

NOP

Ideálne ladenie by bolo pomocou sledovania signálu INT a M1 na zbernici procesora, čo je však náročná oparácia a nie každý má na ňu potrebné vybavenie. Alternatívne je možné túto hodnotu zistiť empricky postupnou aproximáciou v testovacom programe, napr.

        DI

        LD    BC, 0

        CALL  SDEBUG     

CYCLE:  INC   BC

;       LD    A, (IX+0)    ; instrukcia, ktora potrebuje vela cyklov, v zavere ladenia sa vypusti

        JR    CYCLE

        INC   DE

        CALL  SDEBUG   

kde krokovaním sledujeme nárast hodnoty v regitri BC, pričom zvyšovaním konštanty D1CDWN znižujeme prírastok v registri BC počas jedného kroku až na +1. Následne jemne doladíme časovú konštantu tak, aby sa PC menil po jednotlivých inštrukciách. V prípade prestrelenia správnej hodnoty D1CDWN as už bude debugger volať rekurzívne, čo sa prejaví tak, že hodnota PC bude ukazovať na samotný debugger.