


                *  *   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 <SPEC><C> 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 <CR>,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čí <CR>, zůstane v paměti původní hod-
nota, pokud zadá jednobytovou položku a stlačí <CR>, zapíše se
na adresu s tato nová položka. Vždy po stlačení <CR> 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 <CR>.


 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 <CR>.
        Program ZSID vypíše informaci o současném stavu registrů.
        Pokud  se   opět  stlačí  <CR>,  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
