reSpectrum Traps
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
RESPECTRUM, reEditor
©2019-2023
Milan "mYdloch" Kremel respectrum@email.cz