Jednoduchý debugger pre procesory Z80. TDebugger (T ako Tiny alebo Terminal) je kus kódu, ktorý sa prilinkuje k vyvýjanému programu a na potrebných miestach sa vložia tzv. break-pointy, ktoré vyvolajú TDebugger,
Debugger umožňuje prezeranie registrov, zmenu registrov, prezeranie obsahu pamäte, ako aj zmenu v pamäti, prezeranie obsahu zásobníka, zistenie stavu portu a nastavenie portu, spúšťanie podprogramov alebo reštart systému.
Debugger komunikuje s počítačom, na ktorom sa realizuje vývoj SW, pomocou sériovej linky, na použitie stačí aj najjednoduchší terminálový program.
TDebugger obsahuje dve časti, závislú na cieľovom hardvéri, a nezávislú. V tej závislej treba doplniť volania na rutiny odosielania a príjmu znakov cez sériový port. V prípade, že sa na príjem používa softvérový prevod sériových dát na paralelné (bitbanging), treba dať pozor na časovanie pri ukladaní prijatého bajtu do pamäte.
Tiež je možné prispôsobiť výpis obsahu pamäte pre daný terminál, je možné nastaviť počet bajtov na riadok a počet riadkov. Podľa potreby je možné zmeniť znaky nového riadku z CRLF na CR.
Zdrojový kód nájdete tu (heslo je ZX123):
https://drive.google.com/drive/folders/1NflXR3bAFJF7aPHJnMvn41KWs7Lfrzqd
V balíku sú dve verzie debuggera, jedna využíva existujúci zásobník (pozor na dostatočný priestor), a druhá ukladá dáta do oddeleného zásobníka a pôvodný zásobník až na dve výnimky nepoužíva. Použitie oboch verzií je rovnaké, prvá verzia sa navyše dá volať aj rekurzívne.
V prípade, že nájdete v kóde nejakú chybu či spozorujete nesprávnu činnosť, dajte vedieť na adresu uvedenú na úvodnej stránke.
Debugger komunikuje pomocou jednoznakových príkazov s parametrami. Medzi príkazom a parametrom, alebo medzi parametrami nemusí byť žiadny oddeľovač, okrem prípadov, keď by bez oddeľovača došlo k pomýleniu parametrov. Ako oddeľovače sú prípustné znaky medzery, čiarka, alebo =.
Parametrami sú adresa, dáta, alebo názov registra/registrového páru. Príklady sú uvedené v textovom súbore v balíku.
Pre jednoduchosť a krátkosť kódu nie sú vykonávané syntaxové kontroly, debugger teda akceptuje aj niektoré preklepy.
Samozrejme, zoznam príkazov nemusí byť konečný, kedže je zdrojový kód prístupný, je možné pridávať ďalšie príkazy, napr. na výpis hodnôt niektorých premenných programu, či viacbajtových parametrov. K dispozícii zostalo ešte asi 10 neobsadených písmen príkazov.
Príkazy debuggera:
H - Help - zobrazí nápovedu
R - Registers - zobrazí všetky registre procesora
A - Alter register - umožní zmeniť hodnotu registra alebo registrového páru (okrem PC, SP a tieňových registrov)
S - Show Stack - zobrazí zásobník
M, D - Memory dump - vypíše časť pamäte od zadanej adresy
W - Write to memory - zmení obsah pamäťovej bunky na určenej adrese
O, P - Port Output - nastaví výstupný port
I - Port Input - vypíše hodnotu vstupného portu
J - Jump to address - ukončí debugger a pokračuje vo vykonávaní programu od zadanej adresy
C - Call subroutine - volá podprogram a vráti sa späť do debuggera
Q - Quit , X - Exit - ukončí debugger a program pokračuje od break-pointu ďalej
B - Reboot - reštartuje systém
Príklad testu
Ďalším rozšíreniam sa medze nekladú. Napr, pre počítač Ondra som pridal funkcionalitu SINGLE-STEP. Na dresu 0038 (vektor prerušenia) sa vloží príkaz RET. Po ukončení debuggera sa počká na prvé vyvolanie prerušenia (EI+HALT), potom sa prerušenie presmeruje na vstupný bod debuggera (JP TDEBUG) a vo vyčkávacej slučke sa čaká na priblíženie k ďalšiemu prerušeniu tak, aby pred prerušením zostal čas na vykonanie práve jedného príkazu z kódu, a hneď po ňom sa cez prerušenie aktivuje debugger. Tím je umožnené krokovanie programu po jednej inštrukcii. Obdobne by to šlo aj na ZX Spectre, bolo by však potrebné spraviť tabuľku vektorov prerušení pre mód IM2. Nie je to nemožné, len to zaberie viac miesta v pamäti.