************** H I S O F T ************** GENS 3 assembler MONS 3 disassembler ************** H I S O F T ************** Manual prevzaty z osobniho pocitace ZX Spectrum GENS + MONS - 2 - @@@@@@@ @@@@@@@@@ @@@ @@@ @@@@@@@ @@@@@@@ @@@@@@@@@ @@@@@@@@@ @@@ @@@ @@@@@@@@@ @@@@@@@@@ @@@ @@@ @@@@ @@@ @@@ @@@ @@@ @@@ @@@ @@@ @@@@@ @@@ @@@ @@@ @@@ @@@@@ @@@@@@@ @@@@@@@@@ @@@@@@@@ @@@@@@@ @@@ @@@@@ @@@@@@@ @@@@@@@@@ @@@@@@@@ @@@@@@@ @@@ @@@ @@@ @@@ @@@@@ @@@ @@@ @@@ @@@ @@@ @@@ @@@@ @@@ @@@ @@@ @@@ @@@@@@@@@ @@@@@@@@@ @@@ @@@ @@@@@@@@@ @@@@@@@@@ @@@@@@@ @@@@@@@@@ @@@ @@@ @@@@@@@ @@@@@@@ GENS + MONS - 4 - Spustite-li assembler (prikazem 'A' - viz kap. 3) jste nejprve dotazan na velikost tabulky 'Table size:' (dekadicky). Je to prostor pameti, ktery bude vyhrazen tabulce symbolu v prubehu cinnosti. Pri pouhem stisknuti ENTER si GENS 3 zvoli standardni velikost, kterou povazuje za primerenou velikosti textu - zpravidla uplne postaci. Uvedomte si, ze pri vkladani je treba zvolit vetsi prostor pro tabulku symbolu nez je normalni velikost; assembler nemuze predvidat objem souboru, ktery bude vlozen. Po textu 'Table size:' se vas program dotaze, jakou cinnost 'Options:' pozadujete. Vlozte dekadicky soucet indexu cinnosti v pripade, ze pozadujete vice nez jeden typ podle nasledujici tabulky: Cinnost 1 Tvorba seznamu pouzitych symbolu na konci druhe- ho prubehu assembleru Cinnost 2 Zabraneni generace strojniho kodu Cinnost 4 Zabraneni vypisu vysledku kompilace Cinnost 8 Nasmerovani vypisu kompilace na tiskarnu Cinnost 16 Umisteni strojniho kodu za tabulku symbolu. Citac adresy je stale aktualizovan pomoci ORG, takze strojni kod muze byt umisten v jedne casti pameti, ale pracovat muze jinde Cinnost 32 Vypnuti kontroly umisteni strojniho kodu - uzi- tecne pro zrychleni kompilace Priklad: Cinnost 36 provede rychlou kompilaci- bez vypisu a bez kontroly, kam bude strojni kod umisten. Pri pouziti cinnosti 16 nelze pouzit prikaz assembleru ENT. Muzete vsak zjistit umisteni strojniho kodu pouzitim prikazu 'X', ktery nalezne konec textu (druhe zobrazene cislo) a k nemu pricteme velikost tabulky symbolu +2. Kompilace se provadi ve dvou prubezich; behem prvniho prubehu GENS 3 hleda chyby a kompiluje tabulku symbolu, pri druhem prubehu se vytvori strojni kod (pokud neni zvolena cinnost 2). Behem prvniho prubehu se na obrazovce ani na tiskarne nic nezobrazi pokud neni objevena chyba. V pripade chyby se zobrazi chybny radek a pod nim pocet chyb (viz priloha 1). Kompilace je prerusena - stisknutim 'E' se provede navrat do editoru nebo libovolnym jinym tlacitkem se pokracuje od nasledujiciho radku. Na konci prvniho prubehu se objevi zprava: Pass 1 errors: nn V pripade chyby se assembler zastavi a neprovede 2. prubeh. Uzije-li se symbolu v poli opeandu, ktery neni definovan v tabulce, objevi se zprava '*WARNING* label absent' pro kazdou chybejici definici. Ve druhem prubehu se vytvori strojni kod (pokud tvorbe neni zamezeno - cinnost 2). V tomto prubehu se rovnez vytvori vypis vysledku kompilace pokud nebyla zvolena cinnost 4 nebo prikaz assembleru *L-. Vypis ma tvar: C000 210100 25 label LD HL,1 0 1 2 3 12345678901234567890123456789012 Na prvnim miste je hodnota citace adres, ktera udava zacatek zpracovani tohoto radku, pokud nejsou pouzity pseudoinstrukce jako ORG, EQU nebo ENT (viz kapitola 2.6). Zpravidla je udan GENS + MONS - 6 - Zprava na konci druheho prubehu: Pass 2 errors: nn se zobrazi nejdrive a po ni nasleduje pripadne upozorneni na chybejici navesti - viz vyse. Nyni se zobrazi nasledujici zprava: Table used: xxxxx from yyyyy ktera nas informuje o tom jaka cast tabulky symbolu byla vyuzita ve srovnani s rezervovanym mistem. V tomto miste, byl-li spravne pouzit prikaz ENT, se objevi zprava 'Executes nnnnn'. Ta udava pocatecni adresu strojniho kodu, ktery muzete spustit prikazem 'R'. Pozor na pouziti tohoto prikazu pred uspesnym ukoncenim cele kompilace, ktera je zrejma ze zpravy: 'Executes nnnnn'. Byla-li zvolena cinnost 1, vytvori se abecedni seznam pouzitych symbolu s prislusnymi hodnotami. Pocet vstupu zobrazenych na jedne radce muze byt zmenen pomoci POKE 'Start GENS 3 + 50' s prislusnou hodnotou; standardni hodnota je 2. Rizeni se nyni vrati do editoru. 2.1 Format assembleru Kazdy radek textu generovany GENS 3 ma nasledujici format, kde jsou uvedena prislusna pole: NAVESTI MNEMONIKA OPERANDY POZNAMKA Start LD HL,label ;cteni 'label' do HL Mezerniky a znaky pro tabelaci (vlozene editorem) jsou obecne ignorovany. Radek je zpracovan nasledujicim zpusobem: Je vyhodnocen prvni znak radku a nasledujici cinnost je zavisla na tomto znaku jak je uvedeno dale: ';' cely radek je povazovan za poznamku (komentar) t.j. je ignorovan '*' ocekava, ze dalsi znak(y) budou tvorit prikaz assembleru. (viz kapitola 2.8). Povazuje vsechny znaky nasledujici za prikazem jako komentar 'CR' (znak konce radku) jednoduse ignoruje radek ' ' (mezera nebo znak tabelace) je-li prvni znak mezera nebo znak tabelace pak GENS 3 predpoklada, ze prvni znak, ktery neni mezera nebo tab, bude zacatek Z80 mnemoniky Je-li prvni znak jiny nez je vyse uvedeno, pak assembler predpoklada symbol - viz kap. 2.2. Po zpracovani platneho navesti nebo je-li prvni znak mezera/tab, pak assembler hleda dalsi znak ktery neni mezera/tab a ocekava, ze to bude bud konec radku nebo zacatek Z80 mnemoniky (viz priloha 2), ktera ma az 4 znaky a je ukoncena mezerou/tab nebo znakem konce radku. Je-li mnemonika platna a vyzaduje jeden nebo vice operandu, pak jsou mezery/tab vynechany a je zpracovano pole operandu. Navesti mohou tvorit samostatny radek; uzitecne pro zvyseni prehlednosti. Komentare mohou byt umisteny kdekoliv za polem operandu nebo nema-li mnemonika argument, pak za polem mnemoniky. GENS + MONS - 8 - 2.5 Vyrazy Vyrazem je vstup operandu, ktery se sklada bud z jednoduche konstanty nebo z nekolika konstant oddelenych operatory. Definice konstant a operatoru je nasledujici: KONSTANTA dekadicka konstanta napr. 1029 hexadecimalni konstanta napr. #405 binarni konstanta napr. %10001011 znakova konstanta napr. "a" navesti napr. L1029 rovnez '$' muze byt pouzit jako konstanta k urceni hodnoty citace adres. OPERATOR '+' soucet '-' rozdil '&' logicka funkce AND '@' logicka funkce OR '!' logicka funkce XOR '*' soucin celych cisel '/' podil celych cisel '?' funkce MOD (a?b=a-(a/b)*b) Poznamka: '#' oznacuje zacatek hexadecimalniho cisla, '%' bi- narniho cisla a '"' znakovou konstantu. Pri cteni cisel ( deka- dickych, hexadecimalnich nebo binarnich ) GENS 3 uvazuje 16 bitu od nejnizsi hodnoty (tj. MOD 65536) napr.: 70016 ma hodnotu 4480 a #5A2C4 ma hodnotu #A2C4. Siroky sortiment operatoru vsak neumoznuje zavorkovani za ucelem volby priority vypoctu - vyrazy jsou provadeny vzdy zleva doprava. Operatory '*', '/' a '?' jsou provadeny samostatne pro zjednoduseni a ne jako soucast celeho vyrazu, coz by zvetsilo rozsah GENS 3. Je-li vyraz vlozen v zavorkach, pak predstavuje neprime adresovani napr. v instrukci LD HL,(loc +5) se naplni registrovy par HL,16 bitovou hodnotou zapsanou na adrese 'loc +5'. Urcite instrukce Z80 ( JR a DJNZ ) predpokladaji 8 bitovou hodnotu - toto se nazyva relativni adresovani. Pri pouziti relativniho adresovani GENS 3 automaticky odecte hodnotu citace adres nastaveneho na nasledujici instrukci od hodnoty dane polem operandu uvazovane instrukce a tak ziska relativni adresu pro danou instrukci. Rozsah pripustnych hodnot pro relativni adresu je -128 az +127. V pripade, ze si prejete namisto toho vlozit primo relativni vzdalenost od citace adres, musite pouzit znaku '$' nasledovane- ho pozadovanou hodnotou. Nyni se relativni adresa vztahuje primo k hodnote citace adres a tak se hodnota relativni adresy pohybu- je v rozmezi -126 az +129 vcetne. Priklady platnych vyrazu #5000-label %1001101 ! %1011 da %1000110 #3456 ? #1000 da #456 4 + 5 * 3 - 8 da 19 $-label+8 2345/7-1 da 334 "A"+128 "y"-";"+7 (5 * label - #1000 & %1111) 17 @ %1000 da 25 Mezery mohou byt vlozeny mezi konstanty a operatory, nikoli vsak uvnitr konstanty. GENS + MONS - 10 - 2.7 Podminene pseudoinstrukce Podminene pseudoinstrukce umoznuji programatorovi vlozit nebo vynechat urcite casti zdrojoveho textu v ramci kompilace.To se provadi pouzitim IF,ELSE a END. IF vyraz vyhodnoti 'vyraz'. Je-li vysledek nula, pak se neprovede preklad nasledujicich radku dokud assembler nenarazi na 'ELSE' nebo 'END'. Je-li hodnota 'vyraz' nenulova, pak pokracuje kompilace normalne. ELSE Tato pseudoinstrukce spousti a ukoncuje kompilaci. Je-li kompilace spustena pred 'ELSE', pak nasleduje ukonceni a naopak. END END jednoduse spousti kompilaci. Poznamka: Podminene pseudoinstrukce se nesmeji pouzivat ve vicenasobnych cyklech; neprovadi se kontrola a pouziti vede k neurcitemu vysledku. 2.8 Prikazy assembleru Prikazy assembleru, stejne jako ridici povely, neovlivnuji procesor Z80 pri cinnosti, nebot nejsou prelozeny do strojniho kodu. Prikazy assembleru zkratka upravuji format. Prikaz assembleru je textovy radek, ktery zacina hvezdickou '*'. Pismeno nasledujici za hvezdickou urcuje druh prikazu a musi byt uvedeno velkym pismenem. Zbytek radku muze byt libovolny text s vyjimkou prikazu 'L' a 'D', ktere ocekavaji '+' a '-' za prikazem. Existuji nasledujici prikazy: *E (eject) vytvori tri prazdne radky na obrazovce nebo na tiskarne - uzitecne k oddelovani modulu. *Hs zpusobi, ze retezec s se bere jako zahlavi a vytiskne se za kazdym prikazem (*E). *H vytvori automaticky i *E. *S zastavi listovani na tomto radku. Pokracovani nasleduje stisknutim libovolneho tlacitka. Uzitecne pro cteni ad- res ve stredni casti vypisu. Poznamka: *S je vyhodnocen i po *L-, *S nezastavi vypis na tiskarne. *L- zastavi listovani i tisk, pocinaje timto radkem. *L+ obnovi listovani i tisk, pocinaje timto radkem. *D+ zpusobi, ze hodnota citace adres je uvedena dekadicky na zacatku kazdeho radku. Vhodne pro uzivatele SPECTRA. *D- vrati se k pouziti hexadecimalnich cisel. *C- zkrati radek assembleru pocinaje nasledujicim radkem. Ke zkraceni dojde vypustenim vypisu strojniho kodu,cimz se usetri 9 znaku a tim se radek vejde na jeden radek obrazovky (32 znaku) a zvysi se citelnost. *C+ vrati se na uplny radek jak je popsan v kapitole 2.0. GENS + MONS - 12 - (ENTER) ukonci se presun a program se vrati do editoru. Uzivatel muze jednoduse pouzit znaky pro tabelaci (CI - viz nize) k vytvoreni tabelovaneho textoveho souboru, ktery se soucasne usporne vklada do pameti. Vsimnete si, ze mezery se nepotlacuji v komentari a nemaji byt uvnitr navesti, pole mnemoniky a operandu. V prubehu teto kapitoly se pouzivaji urcite zkratky k oznaceni prislusnych ridicich kodu: ENTER ENTER na SPECTRU CC CAPS SHIFT a 1. Pro preruseni vstupu. CM DELETE nebo CAPS SHIFT a 0. Posun kurzoru zpet s vymazanim znaku. CI CAPS SHIFT a 8. Posun na dalsi tabelacni pozici. CX CAPS SHIFT a 5. Vymazani vkladaneho radku. Pri spusteni GENS 3 se automaticky vstoupi do editoru a zobrazi se zprava: Copyright Hisoft 1983 All rights reserved nasledovana kurzorem editoru '>'. Za kurzorem muzete vlozit prikazovy radek nasledujiciho formatu: C N1,N2,S1,S2 ENTER C je prikaz k provedeni (viz kapitola 3.2 nize) N1 je cislo 1 - 32767 vcetne N2 je cislo 1 - 32767 vcetne S1 je retezec znaku delky max. 20 S2 je retezec znaku delky max. 20 Carka je pouzita k oddeleni jednotlivych argumentu (muze se take zmenit - viz prikaz 'S') a mezery se ignoruji s vyjimkou retezcu. Zadny z prikazu neni povinny, ale nektere prikazy (mapr. 'D') se neprovedou bez urceni N1 a N2. Editor si pamatuje vlozena cisla a retezce a v pripade, ze je nektera hodnota vynechana, pak se bere pro N1 a N2 hodnota 10 a retezce jsou prazdne. V pripade vlozeni neplatneho prikazu jako F-1,100,HELLO je tento prikaz ignorovan a zobrazi se zprava 'Pardon?' - je treba radek prepsat spravne tj. F1,100,HELLO. Tato chybova zprava se objevi rovnez v pripade, ze retezec S2 prekroci 20 znaku; pri prekroceni delky u S1 se dalsi znaky ignoruji. Prikazy se mohou vkladat velkymi nebo malymi pismeny. Pri vkladani prikazoveho radku mohou byt pouzity ridici funkce popsane vyse jako: CX k vymazani zacatku radku, CI k posunuti kurzoru na nasledujici tabelacni pozici a pod. Nasledujici kapitola popisuje podrobne prikazy editoru - v pripade, ze argument prikazu je vlozen do symbolu '<>', pak je nutne jej pouzit. 3.2 Prikazy editoru 3.2.1 Vkladani textu Text muze byt vlozen do textoveho souboru bud napsanim cisla radku, mezery a pozadovaneho textu nebo uzitim prikazu 'I'. Vsimnete si, ze napisete-li cislo radku nasledovane ENTER (bez textu) pak je tento radek vymazan, pokud existuje. Pri vkladani textu lze pouzit ridici funkce CX, CI a CC. DELETE (CH) zpusobi posun kurzoru zpet (nikoliv vsak na zacatku radku). Text se GENS + MONS - 14 - Prikaz: M n,m (MOVE) Premisti text z radku n na radek m, kde nahradi stary text, pokud tam je. Radek n se zrusi. Tento prikaz umozni presunout radek textu na jinou pozici v ramci textoveho souboru. Pokud radek s cislem n neexistuje, prikaz se neprovede. Prikaz: N Precisluje textovy soubor s prvnim radkem n a cislovani dalsich radku ma krok m. Musi byt uvedeno n i m a v pripade, ze by cislovani prekrocilo hodnotu 32767, zustane puvodni cislovani. Prikaz: F n,m,f,s (FIND) Hleda v rozmezi radku n' - jste v editoru pripraveni vytvorit program. Cast 1 - napsani rutiny pro nasobeni. Pouzijeme prikazu editoru 'I' k vlozeni textu uzitim CI (znak tabelace) k ziskani tabelovaneho zobrazeni. Nemusime pouzit CI a ziskame vzdy vypis tabelovany. Neni oznaceno kde je pouzit CI, ale predpokladame, ze pred mnemonikou a mezi mnemonikou a oprandem. Uvedomte si, ze adresy uvedene ve vypisu assembleru, ktery nasleduje, nemusi odpovidat adresam vytvorenym na vasem pocitaci; jsou uvedeny pouze pro ilustraci. 110,10 ENTER 10 ;A fast integer multiply ENTER 20 ;routine. Multiplies HL ENTER 30 ;by DE. Return the result ENTER 40 ;in HL. C flag set on an ENTER 50 ;overflow. ENTER 60 ENTER 70 ORG #7F00 ENTER 80 ENTER 90 Mult OR A ENTER 100 SBC HL,DE ;HL>DE ENTER 110 ADD HL,DE ENTER 120 JR NC,Mu1 ;yes ENTER 130 EX DE,HL ENTER 140 Mu1 OR D ENTER 150 SCF ;overflow if ENTER 160 RET NZ ;DE>255 ENTER 170 OR E ;times 0?ENTER 180 LD E,D ENTER 190 JR NZ,MU4 ;no ENTER 200 EX DE,HL ;0 ENTER 210 RET ENTER 220 ENTER GENS + MONS - 22 - 130 ;Routine to o/p A in hex ENTER 140 ENTER 150 Aout PUSH AF ENTER 160 RRCA ENTER 170 RRCA ENTER 180 RRCA ENTER 190 RECA ENTER 200 CALL Nibble ENTER 210 POP AF ENTER 220 Nibble AND %1111 ENTER 230 ADD A,#90 ENTER 240 DAA ENTER 250 ADC A,#40 ENTER 260 DAA ENTER 270 LD IY,#5C3A ;for ROM ENTER 280 RST #10 ;ROM call ENTER 290 RET ENTER 300 CC > Nyni zkompilujte zkusebni rutinu spolu s rutinou pro nasobeni. >A Table size: ENTER Options: 6 ENTER *HISOFT GENS3 ASSEMBLER* Copyright HISOFT 1983 All rights reserved 7EAC 190 RECA *ERROR* 02 (hit any key to continue) Pass 1 errors: 01 Table used: 88 from 210 Mame chybu v teto rutine; RECA ma byt RRCA v radku 190. Tedy: >E190 190 RECA 190 C(enter change mode)R ENTER ENTER Nyni provedte kompilaci znovu pomoci cinnosti 4 (bez vypisu) a text bude kompilovan bezchybne. Nyni jsme pripraveni vyzkouset cinnost programu pro masobeni a je treba sdelit editoru odkud se ma spustit program. To provedeme pseudoinstrukci ENT: >35 ENT $ ENTER Nyni provedeme kompilaci jeste jednou a mela by byt ukoncena zpravou: Table used: 88 from 211 Executes: 32416 > nebo podobnou. Nyni muzeme spustit program prikazem editoru 'R'. Ocekavame nasobeni 50 krat 20 coz je 1000 nebo #3E8 hex. >R ENTER 0032> Nepracuje! Proc? Vypiste radky 380 az 500 (L380,500). Uvidite na radku 430 instrukci OR D nasledovanou RET NZ. To zpusobi logickou operaci OR mezi registrem D a akumulatorem A a navrat s chybou (stavovy registr C nataven) v pripade nenuloveho GENS + MONS - 24 - @@@ @@@ @@@@@@@ @@@ @@@ @@@@@@@ @@@@@@@ @@@ @@@ @@@@@@@@@ @@@ @@@ @@@@@@@@@ @@@@@@@@@ @@@@ @@@@ @@@ @@@ @@@@ @@@ @@@ @@@ @@@ @@@ @@@@@@@@@ @@@ @@@ @@@@@ @@@ @@@ @@@ @@@@@@@@@ @@@ @@@ @@@@@@@@@ @@@@@@@@ @@@@@@@ @@@ @ @@@ @@@ @@@ @@@@@@@@@ @@@@@@@@ @@@@@@@ @@@ @@@ @@@ @@@ @@@ @@@@@ @@@ @@@ @@@ @@@ @@@ @@@ @@@ @@@@ @@@ @@@ @@@ @@@ @@@ @@@ @@@@@@@@@ @@@ @@@ @@@@@@@@@ @@@@@@@@@ @@@ @@@ @@@@@@@ @@@ @@@ @@@@@@@ @@@@@@@ GENS + MONS - 26 - KAPITOLA 2 POUZIVANE PRIKAZY V ramci MONS 3 jsou k dispozici prikazy, uvedene dale. Kdekoliv se v teto casti pouziva klavesa ENTER k ukonceni hexadecimalniho cisla lze defacto pouzit libovolny nehexadecimalni znak (viz kapitola 1 ). Take "-" se pouziva k vyznaceni mezery. SYMBOL SHIFT 3 Meni zaklad ciselne soustavy,ve ktere jsou zobrazeny adresy,mezi 16 a 10.Pri vstupu do MONS 3 jsou adresy zobrazeny hexadecimalne. Pouzijte ^3 ke zmene na dekadicke zobrazeni a opet ^3 k navratu k hexadecimalnimu formatu. Tento postup ovlivni vsechny adresy, zobrazeni MONS 3 vcetne adres generovanych disassemblerem, ale nezmeni zobrazeni obsahu pameti - to je vzdy udano hexadecimalne. SYMBOL SHIFT 4 NEBO "$" Zobrazi jednu dekompilovanou stranu od adresy obsazene v pameto- vem ukazateli. Uziva se ke zjisteni, jake instrukce v programu nasleduji. Opakovanym stisknutim ^4 se vratime k zobrazeni "Cel- niho panelu" nebo si stiskem jine klavesy vyzadame dalsi stranku. ENTER Picita jednicku k pametovemu ukazateli.24 bytove zobrazeni obsa- hu pameti se soustredi kolem nasledujici adresy. CAPS SHIFT 7 Odecita jednicku od pametoveho ukazatele. CAPS SHIFT 5 Odecita osm od pametoveho ukazatele - pouziva se k rychlemu kro- kovani vzad. CAPS SHIFT 8 Pricita osm k pametovemu ukazateli - pouziva se k rychlemu kro- kovani vpred. "," (carka) Aktualizuje pametovy ukazatel tak, ze obsahuje beznou adresu v zasobniku (indikovanou v SP). To je uzitecne, chceme-li si prohlednout okoli navratove adresy volaneho programu atd. "G" Vyhledani daneho retezce v pameti ("G" a retezec). Po systemovem naznaku ":" vlozite prvni byte ukonceny ENTER - pokracujete ve vkladani dalsich bytu dokud nezadate cely retezec. Pak v odpoved na ":" stisknete ENTER;tim je ukonceno definovani retezce a hle- da se od bezne adresy v pametovem ukazateli zadany retezec. Pri jeho nalezeni se aktualizuje obsah "Celniho panelu" tak,ze pame- tovy ukazatel obsahuje adresu prvniho znaku retezce. Priklad: Chceme-li v pameti zjistit vyskyt vzorku #3E #FF (2 byty) pocinaje adresou #8000 postupujeme takto: M:8000 ENTER nastaveni pametoveho ukazatele na #8000 G G:3E ENTER urceni 1. bytu retezce FF ENTER urceni 2. bytu retezce ENTER ukonceni retezce Po zaverecnem ENTER (nebo nekterem nehexadec. znaku) prikaz "G" zacina v pameti hledat od adresy #8000 prvni vyskyt #3E #FF. V okamziku nalezeni se aktualizuje zobrazeni - dalsi vyskyty retezce se hledaji prikazem "N". GENS + MONS - 28 - programu pokracuje od adresy ulozene v citaci instrukci (PC), ktery ma v tomto pripade hodnotu #8920. Program probiha az k adrese, na ktere je zadan bod preruseni (#892D); v tomto okamziku se aktualizuje obsah obrazovky a muzete zkoumat stavy indikatoru atd. pro volani podprogramu na adrese #8800. Pak muzete znovu pokracovat v krokovani programem. Takze prikaz 'K' je uzitecny pro provadeni programu bez vynulovani zasobnikove pameti a zniceni obsahu registru, tak jak to dela prikaz 'J'. 'L' Tabelace nebo vypis bloku pameti od adresy uvedene v pametovem ukazateli. Prikaz 'L' vymaze obrazovku a zobrazi prvnich 80 bytu od adresy v pametovem ukazateli hexadecimalne vcetne ekvivalentu v ASCII. Adresy budou vyjadreny bud hexadecimalne nebo dekadicky v zavislosti na okamzitem stavu celniho panelu (viz ^3 vyse). Zobrazeni se sklada z 20 radku; kazdy radek obsahuje 4 byty a ekvivalenty ASCII jsou na konci kazdeho radku. Pro ucely zobrazeni jsou vsechny hodnoty nad 127 zmenseny o 128 a hodnoty v rozmezi 0 - 31 vcetne se zobrazi jako '.'. Na konci stranky vypisu mate moznost se bud vratit k zobrazeni celniho panelu stisknutim CAPS SHIFT 5 nebo pokracovat dalsi stranou vypisu (opet 80 bytu) stisknutim libovolne klavesy (krome CAPS SHIFT 1). 'M' Nastavi pametovy ukazatel (MP) na danou adresu. Po naznaku ':' vlozite hexadecimalni adresu (viz kapitola 1). Obsah pametoveho ukazatele je pak aktualizovan danou adresou; zobrazeni pameti na celnim panelu se odpovidajicim zpusobem zmeni. Prikaz 'M' je nezbytny jako priprava pro vkladani strojoveho kodu, tabelaci pameti atd. 'N' Hleda dalsi vyskyt hex. retezce naposledy zadaneho prikazem 'G'. 'G' vam umozni definovat retezec a hleda jeho prvni vyskyt v pameti. Chcete-li znat dalsi misto vyskytu, pouzijte prikaz 'N'. 'N' zacina hledani od okamzite hodnoty pametoveho ukazatele a pri nalezeni dalsiho retezce aktualizuje zobrazeni pameti. 'O' Prechod na misto urceni relativni adresy. Prikaz cte byte adresovany pametovym ukazatelem, zachazi s nim jako s relativni adresou a aktualizuje odpovidajicim zpusobem zobarzeni pameti. Priklad: Pametovy ukazatel je nastaven na #6800, obsah adres #67FF a #6800 je #20 a #16. To by mohlo byt interpretovano jako instrukce JR NZ,$+24. Abychom zjistili, kam tato vetev povede pri nenulove podmince, jednoduse zadame 'O', kdyz pametovy ukazatel adresuje byte #16. Zobrazeni bude aktualizovano a soustredeno kolem adresy #6817, coz je pozadovane misto urceni teto vetve. Nezapomente, ze s relativni adresou vetsi nez #7F (127) zachazi procesor Z80 jako se zapornou hodnotou; prikaz 'O' toto respektuje. Ve spojeni s 'O' viz tez prikaz 'U'. GENS + MONS - 30 - textovy soubor konci. To provedeme tak, ze adresu v 'End of text' udanou dekompilatorem (viz dale) vlozime do mista TEXTEND V GENS 3 - viz prirucka GENS 3 kapitola 3.2. Pak musite vstoupit do GENS 3 vstupem pro teply start, abyste zachovali text. Kdyz zacne text pri generovani textoveho souboru prepisovat MONS 3, dekompilace se prerusi - stisknutim libovolne klavesy se vratime k celnimu panelu. Jestlize jste zadali adresu textoveho souboru, budete pozadani o adresu pracovni oblasti ('Workspace:') - to by mela byt adresa volne oblasti pameti, ktera se vyuziva jako primitivni tabulka symbolu pro veskera navesti generovana dekompilatorem. Pozadovany objem pameti je 2 byty na kazde generovane navesti. Pouzijete-li standardni hodnotu tim, ze stisknete ENTER, pak system predpoklada adresu #6000. Pote budete opakovane zadani o prvni ('First:') a posledni ('Last:') - vcetne - adresu jakychkoliv datovych oblasti v ramci bloku, ktery chcete dekompilovat. Datove oblasti jsou oblasti - napr. textu, u kterych nechcete, aby byly interpretovany jako instrukce Z80. Misto toho tyto datove oblasti vyvolaji generovani assemblerovych prikazu DEFB. Je-li hodnota datoveho bytu mezi 32 a 127 (#20 az #7F) vcetne, pak je udana interpretace ASCII tohoto bytu, ktere nasleduji za DEFB, napr. #41 se zmeni na "A". Kdyz jste ukoncili specifikovani datovych oblasti nebo nechcete-li je specifikovat, stisknete proste ENTER jako odezvu na oba naznaky. Prikaz 'T' vyuziva oblast na konci MONS 3 k ukladani adres datovych oblasti, a tak muzete urcit tolik oblasti, kolik je dostupne pameti; kazda datova oblast vyzaduje 4 byty pameti. Mejte na zreteli, ze pouziti 'T' rusi veskere body preruseni, ktere byly predtim nastaveny viz prikaz 'V'. Nyni se vymaze obsah obrazovky. Jestlize jste si vyzadali tvorbu textoveho souboru, bude nasledovat kratka pauza (zavisi na velikosti vyseku pameti, ktery chceme dekompilovat), behem ktere se konstruuje tabulka symbolu. Jakmile je konstrukce skoncena, objevi se vypis dekompilace na obrazovce nebo na tiskarne - vypis muzete zastavit stisknutim ENTER nebo SPACE na konci radku a opet pokracovat stisknutim libovolne klavesy (krome ^1). Pri zastavenem vypisu se lze stisknutim ^5 vratit k zobrazeni celniho panelu. Neplatny operacni kod je dekompilovan jako NOP a indikovan * za vypisem operacniho kodu. Na konci dekompilace se zobrazeni zastavi a pokud jste zadali vytvoreni textoveho souboru, zobrazi se zprava 'End of text xxxxx'; xxxxx je adresa (hexadecimalni nebo dekadicka), ktera ma byt zapsana (POKE) na pozici TEXTEND v GENS 3, aby si assembler mohl vybrat dekompilovany textovy soubor pri teplem startu. Kdyz je dekompilace ukoncena, stisknete libovolnou klavesu k navratu na celni panel, krome ^1, kterou se provadi navrat do BASICu. Navesti se generuji vsude, kde jsou na miste (napr. C30078) ve formatu Lxxxx, kde xxxx je absolutni adresa (hex) navesti, ale pouze v tom pripade, ze adresa je v ramci hranic dekompilace. Je-li adresa mimo tento rozsah, navesti se negeneruje a uda se pouze adresa (hexadecimalni nebo dekadicka). Napr. pri zpracovami oblasti #7000 - #8000 bude instrukce C30078 dekompilovana jako JP #7800 nebo JP 37720, podle zadani ciselne soustavy. Jestlize je v instrukci reference na urcitou adresu v ramci dekompilace, pak jeji navesti se objevi v poli navesti (pred mnemonickou zkratkou) dekompilovane instrukce na teto adrese - pouze vsak kdyz je vypis smerovan do textoveho souboru. GENS + MONS - 32 - 'W' Nastavi bod preruseni do pametoveho ukazatele.Bod preruseni je, pokud se tyka MONS 3, prosta instrukce volani (CALL) programu v MONS 3,ktery zobrazi celni panel a tak umozni programatorovi zastavit provadeni programu a zkoumat obsah registru a indikatoru Z80,jakoz i prislusne oblasti pameti. Takze chcete-li napr. zastavit provadeni programu na adrese #9876, pak pouzijete prikaz 'M' k nastaveni pametoveho ukazatele na #9876 a prikaz 'W' k nastaveni bodu preruseni na teto adrese. Tri byty kodu, ktere byly puvodne na adrese #9876 se uchovaji a nahradi instrukci CALL, ktera zastavi beh programu. Pri dosazeni instrukce CALL se puvodni tri byty vrati na sve misto a zobrazi se celni panel se vsemi registry a indikatory ve stavu tesne pred bodem preruseni. Ted muzete pouzit vsechny moznosti MONS 3 obvyklym zpusobem. Poznamky: MONS 3 vyuziva oblast na svem konci, ktera puvodne obsahuje adresy premisteni, pro ulozeni informace o bodech preruseni. Tzn., ze muzete nastavit tolik bodu preruseni, kolik je pameti k dispozici; kazdy bod preruseni vyzaduje 5 bytu. Po vykonani bodu preruseni obnovi MONS 3 obsah pameti tak, jak byl pred nastavenim bodu preruseni. Vsimnete si, ze vsechny body preruseni se zrusi, kdyz pouzijete prikaz 'T', protoze rovnez vyuziva tuto oblast. Body preruseni lze nastavit pouze v RAM. Jelikoz bod preruseni je tvoren tribytovou instrukci CALL je treba venovat trochu pozornosti urcitym pripadum. Priklad: 8000 3E 8008 00 8001 01 8009 00 8002 18 800A 06 8003 06 800B 02 >U004 AF < 800C 18 8005 0E 800D F7 8006 FF 800E 06 8007 01 800F 44 Kdyz nastavite bod preruseni na #8004 a zacnete provadet program od #8000, pak do registru A se vlozi hodnota 1, program prejde na #800A, do registru B se vlozi hodnota 2 a program prejde na #8005. Ale adresa #8005 byla prepsana spodnim bytem bodu preruseni a tim jsme zkomolili instrukci, ktera da nepredpokladane vysledky. Tato situace je spise neobvykla, ale musite se snazit ji zamezit - v tomto pripade vyhovi krokovani; viz prikaz '^ Z' dale. 'X' Aktualizuje pametovy ukazatel hodnotou absolutni adresy mista urceni instrukce CALL nebo JP. 'X' bere 16 bitovou adresu, urcenou bytem v pametovem ukazateli a bytem v pametovem ukazateli + 1 a pote aktualizuje zobrazeni pameti tak, ze je soustredeno kolem teto adresy. Pmatujte, ze spodni polovina adresy je dana prvnim bytem a horni polovina adresy druhym bytem - format INTEL. Priklad: Chceme se podivat na podprogram, ktery vola kod CD0563; nastavime ukazatel pameti ('M') tak, aby adresoval 05 v ramci instrukce CALL a stiskneme 'X'. Zobrazeni pameti se soustredi kolem adresy #6305. Viz tez prikaz 'V' v souvislosti s prikazem 'X'. GENS + MONS - 34 - 711D F5 Aout PUSH AF ;CAST 3 711E 0F RRCA 711F 0F RRCA 7120 0F RRCA 7121 0F RRCA 7122 CD2671 CALL Nibble 7125 F1 POP AF 7126 E60F Nibble AND %1111 7128 C690 ADD A,#90 712A 27 DAA 712B CE40 ADC A,#40 712D 27 DAA 712E FD213A5C LD IY,#5C3A 7132 D7 RST #10 7133 C9 RET . . 7200 1B2A DEFW 10779 7202 0300 DEFW 3 Chceme prosetrit vyseuvedeny program,abychom zjistili jak pracu- je, nebo zda vubec pracuje. To muzeme provest nasledujici radou prikazu-nezapomente,ze je to pouze jeden zpusob krokovani v pro- gramu a nemusi byt vzdy ucinny,ale slouzi jako ukazka krokovani. M:7080 ENTER Nastavi pametovy ukazatel na #7080 7080 nastavi citac instrukci na #7080 ^Z krok ^Z krok ^Z sledujeme volani (CALL) M:7115 ENTER vynechame pripravu cisel W nastavi bod preruseni (BP) ^K pokracuje provadeni od #7100 do BP ^Z krok ^Z krok ^Z krok ^Z krok ^Z krok ^Z krok ^Z krok ^Z navrat z podprogramu pro nasobeni ^Z krok ^Z sledujeme volani (CALL) M:7128 ENTER nastavi pametovy ukazatel na zajimavou cast W nastavi bod preruseni (BP) ^K pokracuje v provadeni od #711D do BP ^Z krok ^Z krok ^Z krok ^Z krok ; podivame se na adresu navratu W nastavime na ni bod preruseni ^K a pokracujeme ^Z krok ; navrat z podprogramu Aout W ^K ^Z krok ^T provedeni CALL na Aout Projdete si uvedeny priklad. Nejdrive zapiste instrukce programu (viz 'zmeny obsahu pameti')nebo pouzijte GENS 3 a pak provadejte vyse uvedene prikazy.Zjistite,ze priklad je neobycejne cenny pro porozumeni, jak zjistovat chod programu. GENS + MONS - 36 - PRILOHA PRIKLAD ZOBRAZENI CELNIHO PANELU 710C 2007 JR NZ,`7115 --> PC 710C 20 07 EB C9 EB 19 EB SP D0AF 8A 70 06 03 0A 03 0D IY CF6A 0D 11 0C 0F 09 18 18 IX D09F 04 03 04 00 00 00 1B HL 2A1B 0F FE 29 28 02 CF 02 DE 0000 F3 AF 11 FF FF C3 CB BC 0004 FF C3 CB 11 2A 5D 5C AF 0304 V IR 3F7C 7100 AF 7108 37 7110 EB 7101 ED 7109 C0 7111 19 7102 52 710A B3 7112 EB 7103 19 710B 5A 7113 29 7104 30 >710C 20< 7114 D8 7105 01 710D 07 7115 1F 7106 EB 710E EB 7116 30 7107 B2 710F C9 7117 FB > Zde je uvedeno pomerne typicke zobrazeni celniho panelu - toto zobrazeni ziskate pri krokovani v podprogramu Mult (viz rozsireny priklad na prikaz 'SYMBOL SHIFT Z'). Prvnich devet radku zobrazuje registry Z80; nejprve je ueden nazev registru, pak (pro PC - BC) okamzita hodnota registru a konecne obsah sedmi pametovych mist pameti pocinaje adresou ulozenou v registru. Registr indikatoru je dekodovan, aby ukazal okamzite nastaveni indikaoru v poradi jak jsou usporadany v re- gistru - ma-li registr indikatoru hodnotu #FF,pak bude zobrazeni vypadat takto: 00FF SZ HVNC Coz znamena, ze jsou nastaveny indikatory SIGN, ZERO,H ALFCARRY, PARITY/OWERFLOW, ADD/SUBTRACT A CARRY. Ukazatel --> oznacuje bezne adresovany registr; viz kapitola 2 - Zmeny obsahu registru. Pod zobrazenim registru nasleduje zobrazeni 24 bytu pameti a je usporadano takto: adresa obsah adresa obsah . . . 2 byty 1 byte 2 byty 1 byte tj.4 znaky 2 znaky 4 znaky 2 znaky Zobrazeni je vystredeno kolem pozice pametoveho ukazatele, ozna- ceneho '> <'.Prikaz se zapisuje na spodni radek obrazovky za sys- temovy naznak '>'. Zobrazeni se aktualizuje po provedeni kazdeho prikazu.