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.