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