ZXDebugGUI – debugger pro ZX Spectrum
Ten kdo mne zná, ví, že často programuji pro ZX Spectrum na PeCi (samozřejmě rád programuji i na realném Speccym a až dokončím NextForge, tak asi nic jiného používat nebudu, ale používání PeCe se prostě nevyhnu). K ladění používám velmi často debuger daného emulátoru, ve kterém zrovna můj program spouštím. Ale popravdě tyto debugery mi prostě nesedí a vadí mi... highend vlastnost těchto debugerů je mnohdy pouze breakpoint a tím to hasne. Nevím jak vy, ale já jsem odkojený Prometheem a ten měl výborný debuger a tak jsem si někdy minulý rok řekl, že si udělám debuger nad nějakým emulátorem. Dostal jsme to do stádia, že to nějak fungovalo, občas jsem to použil, ale ve výsledku to nebylo něco čím, bych se chtěl pochlubit - nevypadalo to hezky a občas to nefungovalo. V poslední době jsem si tento program vzal trošku do parády... abych se mohl pochlubit. :)
Program je postavený jako desktopová aplikace v Avalonia/.NET (takže by to mělo jít zkompilovat pro vícero systémů - ale k tomu jsem se zatím, neboť nemám důvod, nedostal...). Jako backend používám Fuse, upravený tak, aby mohl běžet jako řiditelný ladicí backend místo klasického samostatného GUI emulátoru. Ptáte se proč jsem použil .NET? Spoustu let mne .NET živí a tak jsem šel cestou pro někoho nepochopitelnou, ale pro mne cestou, kterou tak trošku znám, tedy cestou prošlapanou.
K čemu ZXDebugGUI slouží
ZXDebugGUI slouží hlavně vývojářům (teda popravdě v současné době a stavu pouze mé osobě :) ). Umí to samé co klasické debugery - umožňuje dívat se dovnitř běžícího programu: sledovat registry procesoru Z80, procházet disassemblovaný kód, kontrolovat obsah paměti, nastavovat breakpointy, upravovat hodnoty registrů. Narozdíl od debugeru v emulátoru Fuse umí nahrát LST soubor (jak z AS tak z sjasmplus) a zobrazovat návěstí přímo v debugeru a vy tak můžete zadávat adresu jako návěstí. Umí již také podmíněný breakpoint - např. podle hodnoty nějakého registeru (A == 128). Umí i graficky znázornit paměť, listovat paměťovými bankami atd...
Zde je stručný výpis co tento debuger umí:
- zobrazení registrů procesoru Z80,
- editaci registrů přímo z jejich seznamu,
- disassembly view s adresním polem, stránkováním a symbolickými labely,
- klikací gutter pro zapínání a vypínání breakpointů,
- memory view s adresním polem, stránkováním a prohlížením RAM bank,
- zápis jednoho bajtu do paměti,
- kompaktní grafický/tile náhled obsahu paměti,
- seznam aktuálních breakpointů,
- podporu obyčejných i jednoduchých podmíněných breakpointů,
- panel obrazovky ZX Spectra z framebuffer snapshotu Fuse,
- výběr modelu stroje pro běžné varianty Spectrum, Timex a Pentagon,
- nastavitelný scale obrazovky v debugger UI,
- explicitní zachytávání klávesnice pro předávání kláves do emulovaného stroje,
- ovládání pásky – play, stop, rewind a zobrazení aktuálního stavu,
- načítání Spectrum souborů podporovaných Fuse, například TAP, TZX, PZX, Z80, SNA nebo SZX,
- import symbolů z běžných assemblerových listingů a map souborů.
Debugger UI
Hlavní toolbar obsahuje ovládání připojení, spuštění, načítání souborů, import symbolů, přepínač zachytávání klávesnice a zadávání breakpointů. Zachytávání klávesnice je záměrně explicitní, aby bylo možné normálně pracovat s textovými poli v UI. Teprve po zapnutí jsou klávesy z PC předávány do emulovaného ZX Spectra.
Levý panel zobrazuje výběr stroje, aktuální stav emulace, počet framů, registry, editor registrů, funkci run-to-address a ovládání pro zápis bajtu do paměti. Dvojklikem na řádek registru lze hodnotu přenést do editoru a upravit ji.
Adresní pole přijímají šestnáctibitové hexadecimální hodnoty, například
$4000, ale také importované symboly, například MainLoop.
Hodnoty pro poke zůstávají bajtové, například $2A. Časem samozřejmě přidám možnost zadávat i desítkové číslice, nebo dvojkové (i to se někdy hodí).
Disassembly panel
Disassembly panel umožňuje přesouvat aktuální pozici pomocí tlačítek
-, Go a +. Adresní pole podporuje také symboly
importované ze symbolických souborů. Kliknutím do gutteru na začátku řádku lze přepnout execute breakpoint. Aktivní breakpoint
je označen červenou tečkou a dalším kliknutím jej lze odstranit. Importované labely
zůstávají zarovnané k odpovídajícím adresám a nově importované symboly se v aktuálním
disassembly pohledu projeví okamžitě.
Memory panel
Memory panel zobrazuje 12 řádků po 16 bajtech bez vertikálního scrollbaru. Vedle bajtového výpisu je k dispozici kompaktní 1bpp grafický nebo tile náhled stejných dat.
U 128K strojů lze pomocí ovládání Bank vybrat konkrétní RAM stránku pro
přímou inspekci. Stavový řádek ukazuje aktuální stránkování emulátoru: aktivní RAM stránku,
ROM, screen page, paging lock i právě prohlíženou RAM banku.
Breakpointy a ladicí příkazy
Debugger podporuje běžné breakpointy i jednoduché podmíněné breakpointy typu register-equals-value. To znamená, že lze například zastavit emulaci ve chvíli, kdy konkrétní registr dosáhne zadané hodnoty.
Aktuálně jsou podporované jednoduché výrazy, například:
BC=$1234
K dispozici je také run-to-address, tedy spuštění programu do zadané adresy, typicky do konkrétní rutiny nebo labelu importovaného z assembleru.
Import symbolů
Podporované vstupy zahrnují například:
- sjasmplus
LABELSLIST, například00:8000 Start, - sjasmplus
CSPECTMAP, například8000 00008000 00 Start, - sjasmplus SLD label records typu
L, - sjasmplus listing rows,
- AS/ASW listing rows,
Podporované příkazy protokolu
Aktuální ladicí protokol pokrývá základní operace potřebné pro řízení emulace:
- connect a reset stroje,
- pause, continue a step,
- výběr modelu stroje,
- načtení Spectrum souborů přes Fuse,
- odesílání stisku a uvolnění kláves,
- ovládání přehrávání pásky,
- nastavení adresy memory vieweru,
- výběr RAM banky u 128K strojů,
- zápis jednoho bajtu do paměti,
- nastavení adresy disassembly vieweru,
- čtení a zápis běžných Z80 registrů,
- run-to-address přes dočasný breakpoint,
- přidávání a odebírání obyčejných i podmíněných breakpointů,
- full, lightweight a partial snapshoty podle stavu emulace,
- framebuffer snapshoty pro panel obrazovky.
Program si zatím nemůžete nikde stáhnout a sami vyzkoušet - myslím si, že nemá smysl pro 99 procent vývojářů - celý projekt byl dělaný výhradně pro mé potřeby, ale jelikož teď mimo jiné finišuji hru Voltix (ano, nezapomněl jsem na ni...) začal jsem tento program občas používat... a ano sem tam přidám nějakou novou funkci, která se mi zrovna hodí.... takže třeba časem vše doladím a funkcí bude tolik, že to vše bude publikovatelné.

