Debugger


» Debug mód
» Trap mód
» DisAsm+
» Seznam příkazů CLI




Debug mód


Zastavit při průchodu adresy $0000

Debugger zastaví emulaci před vykonáním instrukce na adrese 0000 (Reset).
Pomocí příkazu Navigace/Poslední provedená instrukce lze najít kód, který reset vyvolal.
Technicky jde o breakpoint 0.


Zastavit při zahájení provádění kódu v prostoru BASICu

Debugger zastaví provádění kódu při vstupu do paměťového prostoru BASICu, typicky kódu umístěného v BASIC programu za příkazem REM.


Logovat HW I/O data transfer

Do logu budou vypisovány operace prováděné hardwarem (BetaDisk,...)


[TRD] Vkládat spuštěný BASIC program do projektu

Po načtení BASIC programu TR-DOSem je BASIC kód vložen do projektu jako samostatný blok.


[TRD] Vkládat data služby READ SECTOR do projektu

Po načtení sektoru TR-DOSem je obsah načteného sektoru vložen do projektu jako samostatný blok.


[TRD] Vkládat data HW čtení sektoru

Po načtení sektoru HW mikrokontrolérem je obsah načteného sektoru vložen do projektu jako samostatný blok.


Zastavit po načtení posledního bitu .TAP/.TZX nebo snapshotu

Debugger zastaví provádění kódu bezprostředně po načení posledího bitu ještě před návratem z loaderu.



Trap mód


Pasti (Traps) slouží k ladění, trasování a testování prováděného programu bez nutnosti modifikace laděného kódu.
V okamžiku průchodu adresy definované pastí je vykonán uživatelem definovaná procedura v Trap RAM.
Tyto procedury jsou před spuštěním debuggeru zkompilovány do paměťového prostoru 0-3FFF Trap RAM,
která je v okamžiku provádění namapována místo vlastní ROM.

Zdrojový text Trap RAM je možno upravit v panelu Definice-> Zdrojový text Trap RAM resp MemoryTool->
Zdrojový text Trap RAM

Během provádění Trapu je zakázáno přerušení, nedocházi ani k inkrementaci registru R či navyšování T-States
ani není jinak ovlivněn průběh laděného programu.

Při provádění Trapu je nastaven SP na hodnotu 3FF0, kde je také uložena návratová adresa do programu.
Velikost kompilovaného souboru Trap RAM je max $3F00 při zachování $F0 bytes pro zásobník.
Trap je ukončen vyzvednutím této hodnoty skrze instrukci RET,  kdy je namapována zpět původní ROM, obnoven SP a procesor pokračuje v provádění hlavního programu.
Během provádění Trapu nelze logicky volat ROM rutiny, jelikož ROM je nahrazena Trap RAM.
Samotný Trap však může být definován v celém adresovém prostoru 0-FFFF.

Během provádění Trapu dochází ke změně efektu instrukce HALT. Tato instrukce nepozastavuje běh procesoru (jelikož je zakázano přerušení), ale provedení této instrukce
způsobí, že po dokončení provádění Trapu je vyvolán breakpoint a otevřen debugger.

Při definici Trapu je možno definovat, zda má dojít k provedení Trapu před nebo po provedení instrukce pomocí klíčovych slov PREPROC či POSTPROC.
Pro jednu adresu může být definována pouze jedna Trap!
 
Syntaxe definice Traps

<název>:    preproc   <adresa>

resp.

<název>:
    postproc   <adresa>

kde:     <název>       standartního návěstí, které definuje název trapu (co taky jiného :-))
           preproc       deklaruje, že trap bude vyvolána před zpracováním instrukce na adrese <adresa>
           postproc     deklaruje, že trap bude vyvolána po zpracování instrukce na adrese <adresa>
           <adresa>     adresa v rozsahu 0-FFFF, při jejímž průchodu bude vyvolán trap
           

Aktivace Traps

Aby bylo možno užívat Traps, je třeba je nejdříve při spuštěném  debuggeru zkompilovat assemblerem zdrojový text Traps RAM v panelu Definice (resp. v Memory Tool) a aktivovat Trap mód.
V případě, že je nastavena položka Nastavení->Emulace->Aktivovat Trap mód je toto provedeno automaticky po spuštění debuggeru.
V panelu Memory Tool lze libovolně aktivovat/deaktivovat zkompilované Traps.

Příklady užití Traps


Následující kód demonstruje použití Trapu jako aktivního breakpointu.  Tento kód způsobí, že při pokusu o tisk písmene A skrze standardní systémovou rutinu tisku znaku
na adrese $0010 (RST 10) vyvolá breakpoint a otevře okno debuggeru.

Trap:         preproc $0010        ;vyvolej Trap před zpracováním instrukce na adrese $0010 (PRINT-A-1)
              push    af           ;ulož F reg, jelikož bude pozměněn       
              cp      'A'          ;je to písmeno A ?
              jr      nz, done     ;ne - pokračuj dál
              halt                                  ;vyvolej breakpoint a otevři debugger (po ukončení trapu)
done:         pop    af            ;obnov F
              ret                  ;ukonči trap a pokračuj ve vykonávání programu

Demonstrace Trapu jako modifikátoru. Všechny tištěné znaky A budou vytištěny jako *

Trap:         preproc $0010        ;vyvolej Trap před zpracováním instrukce na adrese $0010 (PRINT-A-1)
              push    bc           ;ulož původní BC
              push    af           ;ulož F reg, jelikož bude pozměněn       
              ld      b,a
              cp      'A'          ;je to písmeno A ?

              jr      nz, done     ;ne - pokračuj dál
              ld      b,'*'                 ;nahrad A jako *
done:         pop    af            ;obnov F
              ld     a,b           ;tištěný znak
              pop    bc            ;obnov BC
              ret                  ;ukonči trap a pokračuj ve vykonávání programu



Popis Traps RAM

0000 - 3F00 prostor pro vlastní kód Traps
3F00 - 3FF0 prostor pro zásobník

Při vyvolání Trapu jsou nastaveny interní systémové proměnné, které mohou být užity kódem Trapu:

3FF0        TRPV_RET    návratová adresa do hlavního kódu
3FF2   
           TRPV_SP     hodnota SP v okamžiku vyvolání Trapu
3FF4        TRPV_ROM    index ROM v okamžiku vyvolání Trapu (0-3)

3FF5        TRPV_PAGE   hodnota portu 7FFE (7F pro DG80) v okamžiku vyvoláni Trapu

3FF6 - 3FFF             rezervováno pro vyšší verze




DisAsm+

Aktivní funkce DisAsm+ umožnuje zjednodušit zobrazení disassemblovaného kódu.
Obsah adresy, na které byla již provedena instrukce CPU je zobrazena jako disassemblovaný výpis instrukce,
v případě že z adresy byla čtena nebo na zapsána data je zobrazena jako DEFB.

Adresy, ke kterých  CPU nepraváděl žádný kód, čtení či zápis jsou nevýrazně zobrazeny dle výběru položky  DisAsm+ ->Zobrazovat jako
,  resp. nejsou zobrazeny vůbez v závislosti na položce DisAsm+ ->Skrýt nepoužívané adresy.

Příkazem DisAsm+ ->Reset se všechny fyzické adresy nastaví jako nepoužité.



Příkazy CLI

Do příkazového řádku lze vložit instrukci, kterou chcete vykonat nebo jeden z následujících příkazů:

*
Přesune kursor k aktualnímu PC

.run
Spustí provádění kódu a uzavře okno debuggeru

.snap
Vytvoří snapshot

.snap save
Vytvoří snapshot a uloží jej do souboru

.snap load
Načte snapshot ze souboru

.poke addr val
Vloží na adresu addr 8 bitovou hodnotu val

.poke addr word val
Vloží na adresu addr 16 bitovou hodnotu val

?peek addr
Vypíše obsah byte na adrese addr

?peek word addr
Vypíše obash 16-bitové hodnoty na adrese addr

.rom n
Nastaví ROM n jako aktivní (0-3)

!rom
Nastavení původní aktivní ROM 

?rom
Vypíše index aktivní ROM

?cpu
Vypíše info o CPU

?ports
Vypíše informace o portech

!halt
Uvolnění CPU z HALT módu

.af value
Nastaví registr AF na hodnotu value.
(Stejný syntax platí i pro .bc .de .hl .ix .iy .sp .pc)

.save addr bytes
Uloží obsah paměti od adresy addr o velikosti bytes

.watch addr
Vloží sledování na adresu addr

?watch
Vypíše seznam aktivních sledování

.match addr
Nastaví příznak shody na adresu addr (pro MemoryTool)

.break addr type
Vloží breakpoint na adresu addr dle type.

Type:
pc při průchodu adresy
rd při čtení z adresy
wr při zápisu na adresu
cng při změně obsahu adresy
in8 při čtení z 8-bitového poru
out8 při zápisu na 8-bitový port
in16 při čtení z 16-bitového portu
out16 při zápisu na 16-bitový port


Příkazy nastavení příznaků stavového registru
Set flag Clear flag Flag name
.sf !sf Sign flag
.zf !zf Zero flag
.hf !hf Half-carry flag
.pf !pf Parity/overflow flag
.nf !nf Add/subtract
.cf !cf Carry/ling flag


  reSpectrum ©2019-2023 Milan "mYdloch" Kremel  respectrum@email.cz, aktualizace 18.12.2023