Malá, ale užitočná pomôcka pre vývoj softvéru pre procesory Z80 na reálnom hardvéri.
V dnešnej dobe, na rozdiel od 8-bitovej minulosti, väčšina aktívnych programátorov píše kód na moderných počítačoch a na testovanie a ladenie používa emulátor. Má to svoje výhody, ako takmer prázdny stôl, možnosť písať kód kdekoľvek či kedykoľvek a využívať moderné prvky ladenia. Netreba vyskladať celý ekosystém historického počítača a náročne zaznamenávať kód na magnetofónovú pásku či disketovú mechaniku pri každej zmene kódu, ako to bolo bežné v minulosti.
Ja sám síce píšem väčšinu kódu na PC, ale testujem ho na reálnych počítačoch. Z môjho pohľadu je to rýchlejšie ako v emulátore, na “dva kliky” mám zkompilovaný kód v počítači prenesený cez sériovú linku a ihneď vidím výsledok svojho programátorského umenia. Ale keďže nie som génius ako Barnaby (autor Wordstar, napísal 137000 riadkov perfektného kódu v asembleri za 4 mesiace), a chybičky v kóde často skúšajú moju trpezlivosť, tých iterácií k dosiahnutiu požadovaného výsledku býva veľké množstvo. Niektoré chyby sa však hľadajú dosť ťažko a ladenie tak zaberá priveľa drahocenného času. Preto som sa už dávno rozhodol uľahčiť si tento proces nejakou jednoduchou pomôckou, a tak vznikol Tiny Debugger.
Prvá verzia zobrazovala registre a obsah pamäte na obrazovke počítača. Problémom bolo, že sa vždy časť obrazovky premazala zobrazovanými údajmi, a tak ju bolo potrebné vopred uschovať. Aj tak mi neuveriteľne pomohla s dokončením jednej hry, ktorú som vtedy písal. Kód debuggera sa prilinkoval k projektu a vo vhodných miestach kódu sa doplnilo volanie debuggera ako break-point.
Druhá verzia bola doplnená o možnosť zasiahnuť do bežiaceho programu, teda zmeniť registre, upraviť miesta v pamäti a nastaviť vybraný port. Aby to bolo užívateľsky jednoduché, bol debugger rozdelený na dve časti: klientská bežala na testovanom systéme, zatiaľ čo riadiaca na PC, navzájom komunikujúc cez sériové rozhranie. Na tento účel som vytvoril program pre OS Windows s užívateľsky prívetivým prostredím pre zobrazenie a zmenu registrov či obsahu pamäte.
Na stretnutiach Forever som túto utilitu predvádzal Pavlovi, ktorému sa hneď zapáčila. Tento spôsob ladenia programov je totiž jedna z mála možností, ktorú máte, ak robíte programy pre nový hardvér, alebo chcete ovládať periférie, ktoré emulátory (zatiaľ) nepodporujú. Pavel však používa na vývoj Linux, takže môj debugger by nemohol priamo použiť. Po posúdení možností som preto navrhol tretiu verziu, ktorá je nezávislá na vývojovom systéme. Na klientskej strane muselo dôjsť k rozšíreniu kódu, ktorý zahŕňa jednoduchý interpreter príkazov.
Na PC postačí spustený ľubovoľný terminálový program. Z ladeného kódu sa potom len zavolá vstupný bod debuggera, ktorý na základe príkazov obsluhy zobrazuje požadované údaje. Vytvoril som dve verzie, v jednej sa využíva existujúci zásobník, a je preto vhodnejší pre prácu v ROM, ale je potrebné počítať s veľkosťou dát, ktoré si debugger odkladá na zásobník. Druhá verzia si vytvára vlastný zásobník a pôvodný zásobník sa snaží nevyužívať. Inak je správanie oboch verzií rovnaké. Veľkosť skompilovaného kódu je menej ako 2kB.
Debugger reaguje na tucet príkazov s parametrami. Na základe toho poskytuje relevatné informácie alebo vykonáva zmeny. Za niektorými príkazmi sú povinné jeden alebo dva parametre, väčšinou adresa a dáta. Oddeľovače medzi príkazom a parametrami nie sú povinné, až na prípady, kedy by došlo k nesprávnej interpretácii dát.
R - výpis registrov
A - zmena hodnoty registra alebo registrového páru
F - výpis stavového registra F
M - výpis pamäte
W - zápis do pamäte
O - zmena portu
I - zistenie stavu portu
J - ukončenie debuggera a skok na definovanú adresu
C - zavolanie podprogramu a návrat do debuggera
B - reset
Q - ukončenie debuggera a pokračovanie v programe
H - zobrazenie nápovedy
Kód obsahuje dve časti, jednu všeobecnú a druhú závislú na hardvéri. V druhej treba prispôsobiť rutiny na príjem a odoslanie znaku cez sériovú linku. V prípade, že sa používa bitbanging, treba dať pozor na časovanie. Pri písaní príkazu na klávesnici to nevadí, ale ak by sa použila nejaká forma odosielania preddefinovaných príkazov z terminálového programu, spracovanie prijatých dát by mohlo zlyhať. Vtedy treba použiť nižšiu rýchlosť prenosu alebo pridať stop-bit.
Zdrojové kódy sú dostupné na mojom blogu.
Mimochodom, aj hra Nodes of Yesod pre ZX Spectrum bola písaná na počítači s CP/M a testovaná na ZX prenášaním dát cez sériový port na Interface 1.
Martin M1