* * Z S I D * * ============================ ZSID je symbolický ladící prostředek,který umožňuje ladění a testování programů běžících pod operačním systémem CP/M. ZSID ob- sahuje symbolický assembler a zpětný assembler, zobrazování pamě- ZSID především umožňuje řízené vykonávání programů napsaných nebo kompilovaných do mnemotechniky Z80. 1. INICIALIZACE PROGRAMU ZSID Program ZSID je inicializován některým z následujících příkazů: a) ZSID b) ZSID fn.COM c) ZSID fn.COM fn.SYM kde: fn = jméno programu fn.com = zkompilovaná verze programu fn fn.SYM = tabulka symbolů pro program fn Tvar a) umístí do operační paměti program ZSID. Tento pří- kaz je vhodný, pokud chceme prohlížet pamět nebo napsat jednodu- chý program v assembleru. Po zadání příkazu na konzolu se ZSID ohlásí znakem #. Od této chvíle je možno zadávat příkazy popsané v další části tohoto popisu. Poznámka: Pokud bychom zadali následující posloupnost příkazů: ZSID #Ifn.COM nebo fn.com. fn.SYM #R je účinek stejný jako v případech b) a c). Příkazy I a R jsou vysvětleny dále. Tvar b) umístí do operační paměti program ZSID a zkompilova- nou verzi laděného programu. Po zadání příkazu se ZSID ohlásí touto zprávou: ZSID VERS 1.4 NEXT PC END nnnn pppp eeee # kde: nnnn = konec zavedeného laděného programu pppp = počáteční hodnota čítače instrukcí PC eeee = konec pracovní oblasti a tím i počáteční hodnota vrcholu zásobníku SP. Od okamžiku, kdy se vypsal znak #, je možné zadávat příkazy po- psané v další části textu. Tvar c) umístí do operační paměti program ZSID, zkompilova- nou verzi laděného programu a tabulku symbolů. Po zadání příkazu se ZSID ohlásí zprávou : ZSID VERS 1,4 SYMBOLS NEXT PC END nnnn pppp eeee # Význam jednotlivých adres je stejný jako v případě b) Poznámka: Pokud se při provádění příkazu c) vypíše po zprávě Symbols pouze znak ?., bude závada pravděpodobně v tom, že v katalogu není přítomen program fn.SYM (tabulka symbolů). 2. UKONČENÍ ZKOMPILOVANÉHO PROGRAMU Další tabulka ukazuje, jakým způsobem je v operační paměti uložen zkompilovaný program, jehož zdrojový tvar byl napsán v C jazyku. Adresa: Název bloku: 0000 0103 CCSTAR 0117 program MAIN Externí funkce Data Knihovní funkce Volný prostor Externí funkce jsou funkce, které, byly napsány aplikacnim programátorem a jsou ve zdrojovém tvaru umístěny za blokem MAIN. Oblast operační paměti označená jako Data obsahuje textové řetězce a globální proměnné, které byly definovány v programu. Volný prostor je využíván při dynamickém alokování paměti funkce- mi typu MALLOC,ALLOC apod. Zásobník je v C jazyku využíván pro ukládání parametrů vola- né funkce, návratové adresy funkce, lokálních proměnných funkce a mezivýsledku. Organizaci zásobníku při vykonávání jedné funkce ukazuje následující tabulka: Rostoucí adresy ------ ------------ Plnění zásobníku PO atd. 2.LP. 1.LP. NA PP PPP atd. PO Lokální proměnné Parametry funkce Kde: PO = pracovní oblast (mezivýsledky) 2.LP = druhá lokální proměnná 1.LP = první lokální proměnná NA = návratová adresa volané funkce PP = poslední parametr funkce PPP = předposlední parametr funkce 3. PŘÍKAZY ZSID Příkazy  ZSIDu  umožňují vykonávat program, zobrazovat a zaplňovat paměť, assemblovat, dissasemblovat a nastavovat body přerušení. Přikazy je možné zadávat z konzoly vždy po vypsání znaku #. Příkaz se skládá z jednoho písmene, za nímž následuje žádné, jedno, dvě nebo tři hexadecimální čísla. Tato hexadeci- mální čísla jsou od sebe oddělena čárkou, tečkou, rovnítkem, zavináčem nebo operátory + a -. Hexadecimální číslo může mít maximálně čtyři hexadecimální čís- lice 0 až F. Vstup hexadecimálních čísel je možné nahradit sym- bolickými výrazy. Tyto výrazy jsou popsány v kapitole 3. [1]. Naproti tomu numerické výstupy jsou vždy v hexadecimální formě. Dlouhé výpisy některých příkazů je možné přerušit použi- tím klávesy SPEC-S. Program ZSID se ukončuje stlačením kláves nebo GO. Příkaz A Příkaz A umožňuje operátorovi vložit strojový kod do paměti pomocí standartních instrukcí assembleru Z80. Příkaz má tvar: a) As b) A c)- A Příkaz As umožní ukládat instrukce od adresy s. Po každě zadané instrukci se stlačí klávesa ,přičemž se obje- ví následující adresa. Ukládání instrukcí končí prázdným příkazem. Příkaz A si vezme počáteční adresu podle adresy posledního assemblovaní, disasemblování nebo trasování. Příkaz - A se používá na vymazání modulu assembler/disassem- bler. Příkazy A a L pak ztrácejí účinnost. Příklad: #A103 0103 INC A 0104 PUSH DE 0105 INC HL 0106 # Příkaz C Příkaz C slouží k volání podprogramů. Příkaz C má tvar: Cs Příkaz provede podprogram, který začíná na adrese s a předá ří- zení zpátky do ZSID. Příklad: #C117 Příkaz D Příkaz D umožňuje operátorovi zobrazit obsah paměti v hexa- decimálním tvaru a ASCII tvaru. Příkaz D má tvar : a) Ds e) DWs b) Ds, f f) DW,f c) D g) DW d) D, f h) DW,f Ds - zobrazuje obsah paměti počínaje adresou s, dokud se nena- plní 6 řádků. Ds, f - zobrazuje obsah paměti od adresy s po adresu f. D - u tvarů D se počáteční adresa vezme z poslední zobrazované adresy. Zobrazí se 6 řádků. D, f - zobrazuje obsah paměti od poslední zobrazené adresy po ad- resu f. Poznámka: Příkazy a) až d) zobrazují pamět v jednobytovém tvaru: aaaa: bb bb bb bb bb .........................bb c c c c c c kde: aaaa = počáteční adresa řádku bb = hexadecimální obsah paměti c = ASCII obsah paměti Příkazy e) až h) jsou ekvivalentní příkazům a) až d), ale zobra- zují paměť ve dvoubytovém tvaru: aaaa: wwww wwww wwww .........................wwww c c c c c c c c kde: aaaa = počáteční adresa řádku wwww = hexadecimální obsah paměti c = ASCCI obsah paměti Příklad: #D100,10f 0100: C3 03 01 3C 07 36 00 3E 02 3C EA OF 01 34 2A . . . . 6 . > . < . . . 4 * #DW,11F 0110: 0006 CDF9 0162 C5C7 C5C5 2311 2100 0004 . . . . b . . . . . . . . ! . . Příkaz F Příkaz F zaplní pamět konstantní bytovou hodnotou. Příkaz ma tvar: Fs,f,d kde: s = počáteční adresa f = koncová adresa d = hexadecimální konstanta, která se má zapsat na adresy s až f. Příklad: #F101,1CD,AD # Příkaz G Příkaz G slouží k odstartování programu, přičemž v příkazu mohou být zadány až dvě adresy přerušení. Příkaz G má tvar: a) G g) -G b) Gp h) -Gp c) G,a i) -G,a d) Gp,a j) -Gp,a e) G,a,b k) -G,a,b f) Gp,a,b l) -Gp,a,b G - startuje program od adresy, která je uložena v čitači instrukcí PC. Není nastaven žádný bod přerušení. Gp - startuje program od adresy p. Není nastaven bod přerušení. G,a - startuje program od adresy v PC a nastavuje bod přerušení na adresu a. Program běží v reálném čase, dokud nenarazí na adre- su a. V tomto okamžiku se zastaví vykonávání programu, vypíše se informace o adrese přerušení a předá se řízení zpátky ZSID. aaaa kde: aaaa je adresa přerušení. Gp,a - startuje program od adresy p a nastavuje bod přerušení na adresu a. G,a,b - startuje program od adresy v PC a nastavuje dva body přerušení na adresách a a b. Gp,a,b -startuje program od adresy p a nastavuje dva body přeru- šeni na adresách a a b. Tvary příkazů g) až l) jsou ekvivalentní, ale nezobrazují prů- chody aktivním bodem přerušení (viz příkaz P). Příklad: #G117,250,3AC *250 #G *3AC # Příkaz H Příkaz H slouží k hexadecimálním operacím, konverzím a výpi- su symbolů. Příkaz H má tvar : a) Ha,b b) Ha c) H Ha,b - vypíše součet a rozdíl operandu a a b ve tvaru: ssss dddd kde: ssss = součet a a b dddd = rozdíl a a b. Ha - provede konverzi operandu a. Konverze se vypisuje v tvaru: hhhh =dddd 'c'.s kde: hhhh = hexadecimální hodnota operandu a dddd = dekadická hodnota operandu a c = ASCII hodnota operandu a, pokud existuje s = symbol, který odpovídá adrese a, pokud existuje H - vypisuje tabulku symbolů ve tvaru : aaaa s kde: aaaa = adresa synbolu s = jméno symbolu Příklad: #HA1,56 00F7 0048 #HA1 00A1 #161 '!' #H 0117 MAIN A12C PUDEC 0CD1 LOADAR # Příkaz I Příkaz I slouží k zavedení laděného programu v případě, že jsme tak neučinili již při volání ZSIDu, nebo pokud chceme zavést nový program. Příkaz I ma tvar: Id1:fn1.ft1 d2:fn2.ft2 kde: d1 a d2 jsou označení mechanik (A nebo B) fn1 a fn2 jsou jména programu ft1 a ft2 jsou verze programu Označení mechanik může být vynecháno. Potom se předpokládá, že laděné programy jsou na disketě, se kterou právě pracujeme. Za příkazem I musí vždy následovat příkaz R. Příklad: #IA:DADLA.COM B:DADLA.SYM #R # Příkaz L Příkaz L slouží k disassemblování strojového kódu uloženého v paměti: Příkaz L má tvar: a) Ls d) -Ls b) Ls,f e) -Ls,f c) L f) -L Ls - vypisuje disassembler strojového kódu od adresy s. Příkaz vypíše na obrazovku 12 řádků. Disassembler se vypisuje ve tvaru: sssss: aaaa instr.tttttt bbbb kde: sssss = symbol, který označuje adresu aaaa, pokud existuje aaaa = adresa disassemblované instrukce instr. = disassemblovaná instrukce ttttt = symbol, v případě, že instrukce volá adresu a tato adresa má přidělený symbol bbbb = adresa následující instrukce Ls,f - vypisuje disassembler strojového kódu od adresy s po ad- resu f. L - vezme si počáteční adresu z posledního disassemblovaní/ assemblovaní, trasování nebo adresy přerušení. Na obra- zovku se vypíše 12 řádků. Příklad: #L100,106 0110 JP 0103 .CCSTAR CCSTAR: 0103 LD HL,07DA .CCCPU 0106 INC A 0107 # Příkaz M Příkaz M slouží k přesunu bloku dat z jedné oblasti paměti do jiné oblasti paměti. Příkaz M má tvar: Ms,h,d kde: s = počáteční adresa bloku dat h = koncová adresa bloku dat d = cílová adresa, kde se má blok dat uložit Příklad: #M117,800,801 # Příkaz P Příkaz P umožňuje operátorovi nastartovat a mazat body pře- rušení. Příkaz P má tvar: a) Pp b) Pp,c c) P d) -Pp e) -P Pp - nastaví trvalý bod prerušení na adresu p. Pokud prováděný program narazí na adresu p, provede se instrukce na této adrese, vypíše se adresa následující instrukce ve tvaru: *aaaa a předá se řízení zpět do ZSIDu. Pp,c - nastavuje aktivní bod přerušení na adresu p. Zároveň se nastavuje čítač přechodu na hodnotu c. V okamžiku, kdy program narazí na adresu p, se vypíše informace o stavu aktivního bodu přerušení a stavu CPU ve tvaru: cc PASS pppp (stav registru) instr kde: cc = současná hodnota v čitači přechodu pppp = adresa aktivního bodu přerušení instr = instrukce na adrese pppp (stav registru) je vysvětlen v příkazu X Po vypsání informace se sníží o jedničku čitač přechodu a pokračuje vykonávání programu, dokud program opět nenarazí na adresu p. V okamžiku, kdy bude v čitači přechodu 1, se vypíše navíc adresa následující instrukce, skončí vykonávání programu a předá se řízení zpět do ZSIDu. Na adrese p zůstane bod přerušení. P - vypíše informaci o nastavených bodech přerušení ve tvaru: cc pppp kde: cc = hodnota čitače přechodu pppp = adresa bodu přerušení -Pp - zruší trvalý bod přerušení na adrese p. -P - zruší v programu všechny body přerušení. Příklad: #P132,6 #PABC,7 #P 06 0132 07 0ABC # Příkaz R Příkaz R slouží k přečtení příkazového řádku zadaného příka- zem I. Příkaz R má tvar : a) R b) Rd R - přečte program a tabulku symbolů a zavede je do pracovní oblasti beze změny adres. Rd - přečte program a tabulku symbolů, přičte hodnotu d ke všem zavedeným adresám a zavede program a tabulku do pracovní oblasti. Příklad: #IDADLA.COM DADLA.SYM #R800 # Příkaz S Příkaz S umožňuje programátorovi ukládat do paměti jednoby- tová nebo dvoubytová data. Příkaz S má tvar : a) Ss b) SWs Ss - ukládá jednobytová data do paměti od adresy s. Po zadání příkazu se na obrazovce vypíše informace ve tvaru : aaaa cc kde: aaaa = adresa zadaná příkazem cc = položka na adrese aaaa Pokud operátor stlačí , zůstane v paměti původní hod- nota, pokud zadá jednobytovou položku a stlačí , zapíše se na adresu s tato nová položka. Vždy po stlačení se objeví následující adresa a postup se opakuje. Ukládání dat do paměti končí zadáním znaku . a stlačením . SWs - je ekvivalentní, ale na příslušné adresy ukládá dvou- bytová data. Příklad: #S117 0117 05 1 0118 C5 2 0119 C5 011A 23 4 011B 21 . # Příkaz T Příkaz T slouží programátorovi k provedení jednoho nebo více programových kroků, přičemž před každým krokem se zobrazí stav registru CPU. Trasování se začne od adresy uložené v čitači instrukcí PC. Příkaz má tvar: a) T e) -T b) Tn f) -Tn c) TW g) -TW d) TWn h) -TWn T - provede jeden krok a zobrazí stav CPU ve tvaru: /stav registru/ op.kod *bbbb kde: /stav registru/ je vysvětlen u příkazu X. op. kod = provedená instrukce bbbb = adresa následující instrukce Tn - provede n kroků, zobrazí stav CPU před každým krokem, vy- píše operační kód každé instrukce a na závěr vypíše adresu, která je uložena v PC. TW - se používá v případě, kdy potřebujeme sledovat pouze hlav- ní posloupnost instrukcí a není zapotřebí trasovat podprogram. TWn - provede n kroků, přičemž podprogram nechá proběhnout v reálném čase. Tvary e) až h) jsou ekvivalentní tvarům a) až d), ale nedovolují používat symbolických možností ZSIDu. Příkaz U Příkaz U slouží operátorovi k provedení jednoho nebo více programových kroků, přičemž stav CPU se zobrazí až před provede- ním poslední instrukce. Trasování začne od adresy uložené v PC. Příkaz U má tvar: a) U e) -U b) Un f) -Un c) UW g) -UW d) UWn h) -UWn Tvary a) až d) jsou ekvivalentní tvarům a) až d) příkazu T. Zobrazují ale stav CPU pouze před provedením poslední instrukce. Tvary e) až h) jsou ekvivalentní tvarůn e) až h) příkazu T. Zobrazují ale stav CPU pouze před provedením poslední instrukce a na místo zakázání symbolických možností, nedovolují zobrazovat průchody aktivním bodem přerušení (viz říikaz P). Příkaz X Příkaz X slouží k prohlížení nebo změně obsahu registru CPU. Příkaz X má tvar : a) X b) Xr X - zobrazí stav registrů CPU ve tvaru: CZMEI A=bb B=dddd D=dddd H=dddd S=dddd P=dddd CZMEI A'bb B'dddd D'dddd H'dddd X=dddd Y=dddd instr kde: C = příznak přenosu (0/1) Z = příznak nuly (0/1) M = příznak minusu (0/1) E = příznak sudé parity (0/1) I = příznak pomocného přenosu (0/1) A = střadač (0-FF) B = registrový pár BC (0-FFFF) D = registrový pár DE (0-FFFF) H = registrový pár HL (0-FFFF) S = adresa vrcholu zásobníku (0-FFFF) P = čitač instrukcí (0-FFFF) X = index registr X (0-FFFF) Y = index registr Y (0-FFFF) instr= disassemblovaná instrukce na adrese uložené v PC A',B',D',H', jsou náhradní registry Xr - umožňuje změnit obsah jednotlivých registrů CPU. Za r se dosadí jméno registru a stiskne . Program ZSID vypíše informaci o současném stavu registrů. Pokud se opět stlačí , zůstane stav registrů nezměněn!!! Literatura CPM - základní programy vydalo JZD Slušovice, 1986 Podklady: Ing. Ivo Machačka, CSc. Zpracovala: Marcela Klásková Počeštil: M. Urbánek