9.1 

A K(1)-K(8) tömb minden eleme 0 vagy 1. Jelentsék ezek helyi-
érték szerint indexelve egy bájt bitjeit! Készítsünk  progra-
mot, ami előállítja a bájt értékét!


 9.2 

Adott egy bájt. Állapítsuk meg a 32-es  helyiértékű  bitjének
értékét!


 9.3 

Adott egy bájt, bitjeinek értékét válogassuk szét  helyiérték
szerint növekvő indexekkel a B(1)-B(8) változókba!


 9.4 

Adott egy ismeretlen értékű bájt. A legkisebb helyiértékű két
bitjét állítsuk 1-re! (A többi bit maradjon változatlan!)


 9.5 

Adott egy ismeretlen értékű bájt. A legkisebb helyiértékű két
bitjét állítsuk 0-ra! (Ne  használjunk  bitenkénti  művelete-
ket!)








 9.6 

Az előző két feladatot oldjuk meg úgy is, hogy nem vizsgáljuk
meg a kérdéses bitek értékét!


 9.7 

Az X változó értéke 2 vagy 3 lehet. Írjunk olyan eljárásokat,
amelyek a két értéket éppen felcserélik!


 9.8 

Az X változó értéke egész szám 0-tól 3-ig. írjunk olyan eljá-
rást, amelyik a  következő  függvényt  állítja  elő:  f(0)=0,
f(1)=1, f(2)=3 és f(3)=2!


 9.9 

Készítsünk modulo 4 számláló programot! (Néggyel osztva a le-
hetséges maradékokat állítsa elő sorra!)


 9.10 

A legegyszerűbb léptetőmotorokat (pl. egyes  TESLA  lemezját-
szók M303 típusú motorja ilyen) úgy lehet vezérelni,  hogy  a
két tekercs polaritását felváltva változtatjuk. Minden válto-
zás egy lépéssel (pl. 9 fokkal) fordítja a tengelyt. A  kime-
neti szubrutin K(1) és K(2) változókkal állítja be  a  teker-
csek polaritását: ha K(1)=1, akkor pozitív  feszültséget  kap
az 1. tekercs, ha K(1)=0, akkor negatívat. Írjunk olyan prog-
ramot, amelyik a  léptetéshez  szükséges  kimeneti  értékeket
előállítja, és a kimeneti alprogrammal  kiküldi  a  motornak!
[(0,0),(0,1),(1,1), (1,0),(0,0) stb.]


 9.11 

Az előző feladatot oldjuk meg úgy, hogy visszafelé forogjon a
motor!


 9.12 

Változtassuk meg az előző programokat úgy, hogy  adott  számú
lépést tegyen meg a motor!


 9.13 

Az előző két feladatot  vonjuk  össze  úgy,  hogy  előjelesen
lehessen megadni a lépések számát!


 9.14 

A számítógép két jelfogó közbeiktatásával egy egyenáramú  mo-
tort vezérel. Ha a kimeneti alprogram meghívásakor  K(1)  ér-
téke 1, akkor bekapcsolja, ha 0, kikapcsolja.  K(2)=1  esetén
előre, K(2)=0 esetén hátrafelé forog (csak, ha  be  van  kap-
csolva). Írjunk programot, ami a  három  lehetséges  bemeneti
szót (előre, hátra, ki) feldolgozza, és végrehajtatja  a  mo-
torral!


 9.15 

A legegyszerűbb útkereszteződésben a jelzőlámpának négy álla-
pota lehet: piros, piros-sárga, zöld, sárga. Tervezzük meg  a
lámpák vezérlését és írjuk fel az egyes lámpák logikai  függ-
vényét, ha három kimeneti bit (K(1), K(2), K(3)) áll  rendel-
kezésünkre! (Például az első útvonal zöld lámpája  a  Z1=K(3)
ÉS NEM K(2) szerint működhet.)


 9.16 

Oldjuk meg az előző feladatot két bittel is!


 9.17 

Írjunk programot a közlekedési lámpák irányítására!  A  prog-
ram először kérdezze meg a lámpa egyes állapotainak időtarta-
mát, majd eszerint az időterv szerint állítsa be  a  kimeneti
biteket, és hívja meg a kimeneti alprogramot!


 9.18 *

Az előző programban lehessen  a  lámpát  sárga  villogóra  és
vissza is kapcsolni! Tegyük lehetővé az időtartamok változta-
tását a lámpák működése közben is! Ügyeljünk arra, hogy a be-
menet feldolgozása ne változtassa meg az éppen  mért  időtar-
tamot!


 9.19 

A számítógép egy fotoellenállás állapotát olvassa be. Ha  vi-
lágos van, B(1) értéke 1, különben 0. Írjunk programot a  sö-
tét állapotok megszámlálására! Az aktuális  értéket  lehessen
mindig leolvasni a képernyőről!


 9.20 

Módosítsuk az előző programot úgy, hogy (átlag) sebesség  mé-
résére legyen alkalmas! Mérjük például egy 1 cm  széles  test
áthaladásának idejét!


 9.21 

Az előző test közepére vágjunk egy nyílást!  A  fotokapu  két
sebességet tud így mérni. Számítsuk ki  a  mért  adatokból  a
test (átlagos) gyorsulását!


 9.22 

A sebességmérő programból  készítsünk  fordulatszám-mérőt!  A
mérendő tengelyre szereljünk egy hasítékkal  ellátott  koron-
got! Ennek áthaladási gyakoriságát kell mérni a fotokapuval.


 9.23 

Az előző két feladat összekapcsolásával  mérjük  meg,  hogyan
függ az inga lengésideje a kitéréstől!  A  kitérést  az  alsó
helyzetben mérhető sebességből számíthatjuk ki. (Erre a célra
kiváló ingát készíthetünk az iskola forgómozgást vizsgáló ké-
szülékéből, ha a tengelyét vízszintesre állítjuk.)


 9.24 

Az egyenáramú motor vezérlését kapcsoljuk össze  a  fordulat-
szám-mérésnél használt ötlettel, és modellezzük a  léptetőmo-
tort! Kapcsoljuk be a motort, és addig hagyjuk  forogni,  míg
adott számú fordulatot meg nem tesz! A korongon több  bevágás
is készíthető, így törtfordulatokat is tudunk számlálni.


 9.25 

Bővítsük a fotokaput úgy, hogy két egymás utáni érzékelő adja
a jeleket, és a program azt állapítsa meg, hogy melyik irány-
ba ment pl. a múzeum látogatója!


 9.26 

Az előző feladatot módosítsuk úgy, hogy a gép mindig a  múze-
umban lévő személyek számát írja ki! (Más kijárat  nincs,  az
emberek nem takarhatják egymást, mert keskeny a kapu.)


 9.27 

B(1) és B(2) állapotát megint a fény határozza meg, de  ahogy
nő a megvilágítás erőssége, először B(1), később  B(2)  válik
eggyé. Írjuk ki a képernyőre, hogy világos, sötét vagy félho-
mály van-e!


 9.28 

A bemeneti alprogramban a B(1) értékét egy mikrofon  határoz-
za meg, de soha nem tudhatjuk,  hogy  mi  B(1)  alapállapota,
csak azt, hogy ha tapsolunk, legalább egyszer  változik.  Ír-
junk programot, amelyik tapsra kiírja, hogy 'Ne zajongj!'!


 9.29 

Írjunk programot, amelyik megméri, hogy mennyi ideig volt le-
nyomva egy billentyű, és később  ugyanennyi  időre  bekapcsol
egy hangot!


 9.30 

Egy lánctalpas jármű két lánctalpát egy-egy nyomógombbal tud-
juk működtetni. A nyomógombok állapota a bemeneti  alprogram-
ban B(1) és B(2) állapotát is beállítja. Készítsünk tanulóro-
botot, amelyik a nyomógombok egymás után következő állapotait
és az állapotváltozások közötti időtartamokat megjegyzi, és a
sorvég-billentyű lenyomására megismétli a mozgássorozatot!  A
K(1) és K(2) a kimeneti  alprogramban  ugyanúgy  kapcsolja  a
motorokat, mint a két nyomógomb.


 9.31 

Irányítsuk az előző járművet a  billentyűzetről  az  'EL§RE',
'HÁTRA', 'JOBBRA' és 'BALRA' (90 fokos fordulat) szavakkal!


 9.32 

Egy lánctalpas jármű két lánctalpát a  kimeneti  alprogram  a
K(1), illetve a K(2) értékétől függően ki- vagy bekapcsolja.







A bemeneti alprogram B(3) értékét aszerint állítja 0-ra  vagy
1-re, hogy balról vagy jobbról  jön-e  erősebb  fény.  Írjunk
olyan programot, amelyik a járművet a fényforrás felé vezeti!


 9.33 

Írjuk át az előző programot fényforrástól való menekülésre!


 9.34 

Egy motor függőleges tengely körül tud forgatni két fényérzé-
kelőt. Ezek kis szöggel különböző irányba néznek. Ha a balol-
dali 'lát' több fényt, akkor a bemeneti alprogramban  B(3)=1,
különben B(3)=0. A kimeneti alprogram  K(1)=1  esetén  bekap-
csolja a motort, K(2)=1 esetén jobbra,  K(2)=0  esetén  balra
forgatja. Írjunk programot, amely követi a fényforrást!


 9.35 

A számítógéphez egy soros  analóg-digitális  átalakítót  kap-
csoltunk. A kimeneti eljárás számára megadott K(1)...K(8) bi-
náris számjegyeknek megfelelő  számmal  arányos  feszültséget
állít elő és ezt hasonlítja össze a mérendő feszültséggel. Ha
a mérendő feszültség nagyobb, a bemeneti eljárásban B(1)  ér-
téke 0 lesz, különben 1. Írjunk programot, amely 0-tól növel-
ve a feszültséget megállapítja a mérendő feszültség értékét!


 9.36 

Írjuk át az előző programot úgy, hogy az  első  mérést  0-ról
kezdje, de minden továbbit az előző mérés eredményétől  szük-
ség szerint felfelé vagy lefelé lépkedve végezzen el!


 9.37 

Az előző programot írjuk át úgy, hogy  az  intervallumfelezés
módszerével keresse meg a mérendő feszültséget!


 9.38 

Egy potenciométer (fél botkormány) állapotát úgy is  beolvas-
hatja a számítógép, hogy a potenciométer egy időzítő  áramkör
időtartamát állítja be, és a gép ezt az időtartamot méri.


 9.39 

Írjuk tele a képernyőt A betűkkel!


 9.40 

Húzzunk a képernyő bal  alsó  sarkából  átlósan  egy  vonalat
csillagokból!


 9.41 

Írjunk programot, amely a táblázatrajzoló karakterek felhasz-
nálásával egy téglalapot állít elő a képernyőn! A  méretet  a
billentyűzetről adjuk meg!


 9.42 

Készítsünk olyan szubrutint, amely a számítógép képernyőjének
bal- és jobboldalát megcseréli (tükrözi a képfelező  egyenes-
re)!


 9.43 *

Készítsünk szubrutint, amely a számítógép képernyőjének  bal-
vagy jobboldalát törli le! Bővítsük úgy a feladatot,  hogy  a
szubrutin a képernyő tetszőleges téglalapját tudja törölni!


 9.44 

Készítsünk olyan szubrutint, amely a  számítógép  képernyőjét
inverzre változtatja (mintha fénykép negatív lenne)!


 9.45 

Írjunk szubrutint, amely 32 bites sorozatot léptet körbe bal-
ra bitenként!


 9.46 

Írjunk programot egy bájt bitsorrendjének megfordítására!


 9.47 

Készítsünk programot a képernyő függőleges oldalfelező  merő-
legesére való grafikus tükrözésre!


 9.48 

Készítsünk szubrutint, amely a képernyőt

   1. egy karakteres oszloppal balra lépteti,
   2. egy karakteres oszloppal jobbra lépteti,
   3. egy karakteres sorral felfelé lépteti,
   4. egy karakteres sorral lefelé lépteti!


 9.49 

Készítsünk szubrutint, amely a képernyőt ciklikusan

   1. egy karakteres oszloppal balra lépteti,
   2. egy karakteres oszloppal jobbra lépteti,
   3. egy karakteres sorral felfelé lépteti,
   4. egy karakteres sorral lefelé lépteti!


 9.50 *

Készítsünk szubrutinokat a képernyő és egy háttértár  (kazet-
ta, lemez) közötti képátvitelre!

   1. Képernyő kimentése háttértárra.
   2. Kép beolvasása háttértárról.


 9.51 

Készítsünk szubrutint,amely a képernyő tartalmát elmenti  egy
megadott területre, illetve onnan vissza tudja hozni!


 9.52 

Készítsünk szubrutint, amely a képernyőt

   1. egy grafikus oszloppal balra lépteti,
   2. egy grafikus oszloppal jobbra lépteti,
   3. egy grafikus sorral felfelé lépteti,
   4. egy grafikus sorral lefelé lépteti!


 9.53 

Készítsünk szubrutint, amely a képernyőt ciklikusan

   1. egy grafikus oszloppal balra lépteti,
   2. egy grafikus oszloppal jobbra lépteti,
   3. egy grafikus sorral felfelé lépteti,
   4. egy grafikus sorral lefelé lépteti!


 9.54 

Töröljük le a grafikus képernyő adott színnel befestett pont-
jait!


 9.55 

Másoljunk a képernyőre egy elmentett képet úgy,  hogy  a  két
kép között AND, OR, XOR műveletet végzünk.


 9.56 

Írjunk szubrutint a képernyő négy irányú grafikus  léptetésé-
re! Az irányt a billentyűzetről adhatjuk meg, és minden  bil-
lentyűleütés egy ponttal léptesse a képernyőt!


 9.57 

Mozgassunk egy pontot a képen úgy, hogy

   1. a képernyő szélén álljon meg,
   2. a képernyő széléről verődjön vissza,
   3. a képernyőn lefelé gyorsuljon (hajítások),
   4. egy adott pont felé gyorsuljon (bolygómozgás),
   5. lefelé gyorsuljon,  visszaverődésnél sebessége csökken-
      jen,
   6. a képernyőn levő tetszőleges ábráról verődjön vissza,
   7. folyamatosan lassuljon (közegellenállás)!


 9.58 **

Írjunk függvényábrázoló programot! Ha az  értelmezési  tarto-
mány nem fér a képernyőre, lehessen a grafikont  jobbra-balra
tologatni! Egy billentyű lenyomására a képernyő  középpontjá-
ból nagyítsa kétszeresére a grafikont, egy másikra pedig  ki-
csinyítse a felére!


 9.59 *

Írjunk szubrutint két képpont egyenessel való összekötésére!


 9.60 **

A két pontot összekötő egyenesnek keressük meg  a  képernyőre
eső szakaszát, és csak azt rajzoljuk fel!


 9.61 **

Írjunk szubrutint adott sugarú és adott középpontú  kör  meg-
rajzolására!


 9.62 

Írjunk szubrutint adott méretű és helyzetű téglalap  rajzolá-
sára!


 9.63 *

Írjunk szubrutint a képernyő egy zárt görbével határolt  kon-
vex részének beszínezésére! (Tegyük fel, hogy a konvex,  zárt
görbét a program egy másik, már létező szubrutinjával  hozzuk
létre!)


 9.64 **

Próbáljuk módosítani az előző programot  bármilyen  tartomány
befestésére!


 9.65 **

Készítsünk szubrutinokat mozgó képernyőalakzatok  kezelésére!
Az egyik az alakzat leendő helyéről  egy  téglalapot  elment,
majd rárajzolja az alakzatot. A másik az előző téglalap  tar-
talmát visszaállítja, és az alakzatot elmozdítja a  paraméte-
reknek megfelelően. Ügyeljünk a mozgó alakzat határára!


 9.66 

A képernyő egy területének gyors váltogatásával állítsunk elő
egyszerű mozgásokat! Néhány  ötlet:  repülő  madár,  araszoló
hernyó, integető vagy lépegető ember.


 9.67 **

Többfázisú animációval mutassuk be egy húr vagy hártya  álló-
hullámainak mozgását!


 9.68 

Írjunk programot billentyűvezérelt rajzolásra! A pont  elmoz-
dulásának irányát a kurzormozgató billentyűkkel adjuk meg! Ha
a shift billentyűt is lenyomjuk, töröljön!


 9.69 *

Az előző programot írjuk át úgy, hogy a billentyűkkel  mindig
egy szakasz  végpontját  mozgassuk!  Ha  lenyomjuk  a  RETURN
billentyűt, az rögzíti a pontot, és ez lesz az újabb  szakasz
kezdőpontja. Az egész legyen  olyan,  mintha  egy  helyenként
leszögezett gumival alakítanánk az ábrát!


 9.70 

Írjunk programot billentyűvezérelt rajzolásra! A pont  előre,
illetve hátra mozdulását a kurzor fel, illetve kurzor le bil-
lentyűvel adjuk meg, a 90 fokos elfordulásokat a kurzor jobb-
ra, illetve kurzor balra billentyűvel!


 9.71 

Írjunk programot, amely a bal felső sarokból kezdve a  lenyo-
mott billentyűk jelét sorban a képernyőre írja!


 9.72 

Készítsünk programot, amely egy speciális billentyűre törli a
képernyőt, egy másikra a bal felső sarokba megy, a  képernyőn
a kurzor helyére kiírja a lenyomott billentyű betűjét, a kur-
zor a kurzormozgató billentyűk  hatására  pedig  elmozdul!  A
program tudja kinyomtatni a képernyő tartalmát!


 9.73 

Cseréljük egy szöveg kisbetűit nagybetűre! A többi jel marad-
jon változatlan!


 9.74 

Készítsünk video-feliratozó programot! Tervezzünk  nagyméretű
karaktereket vonalakból vagy pontokból, és ezeket írja  ki  a
számítógép a megfelelő billentyű lenyomására!


 9.75 

Készítsünk fényújságot! A memória egy területén tárolt szöve-
get nagyméretű karakterekkel írjuk ki a képernyőre, és a szo-
kásos módon forgassuk! (Grafikus pontonkénti léptetéssel  nem
villog bántóan a szöveg.)


 9.76 *

Készítsünk képújságot! A memória egy területén tárolt  szöve-
geket és ábrákat ciklikusan cserélgesse a program! Az oldala-
kat a képernyőn készítsük el, és blokkátvitellel tegyük a me-
móriába, és ugyanígy vigyük vissza a képernyőre, amikor éppen
kell! A lapváltást a felhasználó billentyűlenyomással  kérje,
ezzel esetleg befolyásolhatja azt is, hogy  melyik  legyen  a
következő lap!


 9.77 

Írjunk ki egy memóriatartományt oktálisan a képernyőre!



 9.78 

Írjunk ki egy memóriatartományt binárisan a képernyőre!


 9.79 

Írjunk ki egy memóriatartományt hexadecimálisan a képernyőre!


 9.80 

Írjunk ki egy memóriatartományt karakteres formában a  képer-
nyőre! A nem kiírható karakterek helyére tegyünk pontot!


 9.81 

Írjunk programot, amely egy  memóriatartományt  hexadecimális
és karakteres formában is kiír!


 9.82 

Készítsünk programot, amely a HL regiszterpárban lévő bináris
egész számot hexadecimális formában a képernyőre írja!


 9.83 

Készítsünk programot, amely a binárisan beírt számokat  hexa-
decimálisan írja ki!


 9.84 

Írjunk szubrutint, amely 128 biten  ábrázolt  előjeles  egész
számokat ad össze!


 9.85 

Írjunk szubrutint, amely 80  biten  ábrázolt  előjeles  egész
számokat von ki!


 9.86 *

Számítsuk ki két hexadecimális szám összegét és különbségét!


 9.87 

Írjunk programot kétbájtos számok kettővel való szorzására!


 9.88 

Írjunk programot kétbájtos számok tízzel való szorzására!


 9.89 *

Írjunk szubrutint kétbájtos számok tízzel osztására!


 9.90 

Készítsünk morzejelekre fordító programot! A morzejelek a kö-
vetkezők:

         A .-    K -.-   U     ..-
         B -...  L .-..  V     ...-
         C -.-.  M --    W     .--
         D -..   N -.    X     -..-
         E .     O ---   Y     -.--
         F ..-.  P .--.  Z     --..
         G --.   Q --.-  Á     .--.-
         H ....  R .-.   É     ..-..
         I ..    S ...   Ö     ---.
         J .---  T -     Ü     ..--
         1 .---- 6 -.... Pont  .-.-.-
         2 ..--- 7 --... Hiba  ........
         3 ...-- 8 ---.. SOS   ...---...
         4 ....- 9 ----.
         5 ..... 0 -----

              Üzenet kezdete -.-.-
              Üzenet vége    .-.-.

A jelek között szünetet, a szavak között háromszoros szünetet
kell tartani. A program egysoros  üzenet  fordítását  végezze
el! A szüneteket jelöljük / (törtvonal)-lal!


 9.91 

Készítsünk programot, amely  a  billentyűzetről  morzejeleket
kér, és az így beadott szöveget megfejti!


 9.92 

Kísérletileg határozzuk meg a számítógépünkben még ábrázolha-
tó legkisebb és legnagyobb abszolútértékű számokat!


 9.93 

Határozzuk meg a számítógépünkben az egyes  változótípusokkal
(ha vannak) végzett  aritmetikai  műveletek  időszükségletét!
Figyeljünk a változók számának, elnevezésének állandóságára!


 9.94 

A, B, C és X jelentsen 16 bites egész számot! Kódoljuk a  kö-
vetkező algoritmust! Mi lesz a változók értéke a ciklus lefu-
tása után?

   A:=0 : B:=1 : C:=1
   CIKLUS AMÍG B<=X
      A:=A+1
      C:=C+2
      B:=B+C
   CIKLUS VÉGE

A kódolás elején döntsük el azt, hogy melyik  változónak  me-
lyik regiszterpár felel meg!


 9.95 

Az A és a B szám egybájtos egész. Szorzatuk a kétbájtos Z-ben
keletkezik. Kódoljuk az algoritmust!

    X:=A : Y:=B : Z:=0
    CIKLUS AMÍG Y<>0
       HA Y PÁROS
            AKKOR X:=2*X : Y:=Y/2
            KÜLÖNBEN Z:=Z+X : Y:=Y-1
       ELÁGAZÁS VÉGE
    CIKLUS VÉGE

Ha A és B kétbájtos egész is lehet,  akkor  egészítsük  ki  a
megoldást túlcsordulás figyelésével!


 9.96 

Írjunk olyan szubrutint gépünk BASIC értelmezőjéhez,  amelyik
minden BASIC sor értelmezésének kezdetén hangjelzést ad!


 9.97 

Gépi kódú szubrutinnal kezelünk egy egeret. Az IN A,(34) uta-
sítás olvassa be az egér pillanatnyi állapotát. Az A  regisz-
ter felső négy bitje mindig 1, a  következő  kettő  az  előre
mozgás miatt a 00,01,11,10,00 sorozatot adja, hátrafelé éppen
fordítva. Az utolsó kettő a balra, illetve  jobbra  mozgásnál
ugyanígy viselkedik. Írjuk meg a hiányzó programrészletet! Mi
a szerepe a B,C,D,E regiszternek?

           LD    IX,10  ;képkoordináták, ahova az egér
           LD    IY,10  ;nyomát rajzolni kell
           LD    B,0
           LD    C,0
   CIKLUS:
           IN    A,(34) ;az egér állapota
           PUSH  AF
           AND   3
           LD    D,A
           POP   AF
           AND   12
           RRC   A
           RRC   A
           LD    E,A
        ;Vizsgáljuk meg, hogy az egér elmozdult-e,
        ;és ha igen,
        ;módosítsuk IX és IY értékét! Tegyük fel, hogy a
        ;rajzolást a RAJZOL nevű szubrutinban már megírták
           LD    B,D
           LD    C,E
           CALL  RAJZOL ;IX,IY koordinátájú pont kirajzolása
           JP    CIKLUS


 9.98 

Elemezzük a következő Z80-as programot!

   PR:
            LD   B,01H
            OR   80H
   HU:
            RLC  A
            XOR  B
   KI:
            RLC  B
            JP   NC,HU
   VE: ...

   1. Mit csinál a program?
   2. Mikor jut el a vezérlés a VE címkére? Mi lesz ekkor  az
      A és a B regiszterben, illetve a C jelzőbitben?
   3. Mi történik, ha az OR 80H helyére AND 7FH-t  írunk?  És
      ha nem írunk a helyére semmit?
   4. Mi történik, ha a JP NC,HU helyére JP C,HU-t írunk?


 9.99 

Mit csinál az alábbi Z80-as program? Mi lesz a regiszterek és
a jelzőbitek értéke, ha P1, P2, illetve P3-nál lépünk be?

   P1:
           LD    HL,PUFF1
           CALL  MITESZ
   VEGE1:
           NOP
   PUFF1:
           DB    'O','1','4','0','7',0 ;FIGYELEM! 'O'<>'0'
   P2:
           LD    HL,PUFF2
           CALL  MITESZ
   VEGE2:
           NOP
   PUFF2:
           DB    'D','1','4','0','7',0
   MITESZ:
           LD    IX,0
           LD    A,(HL)
           CP    'O'                   ;FIGYELEM! 'O'<>'0'
           JR    NZ,TALAND
           LD    B,4-1
           JR    ATALAK
   TALAND:
           CP    'D'
           JR    NZ,LEPJKI
           LD    B,5-1
   ATALAK:
           LD    C,B
   CIKLUS:
           INC   HL
           LD    A,(HL)
           SUB   '0'
           JP    M,LEPJKI
           LD    B,C
           ADD   IX,IX
           PUSH  IX
           POP   DE
   BELCIK:
           ADD   IX,DE
           DJNZ  BELCIK
           LD    E,A
           LD    D,0
           ADD   IX,DE
           JR    CIKLUS
   LEPJKI:
           RET

A DB direktíva az assemblernek szól, azt jelenti, hogy fordí-
tás közben a program adott helyén a DB után következő  számo-
kat vagy karakterek kódjait kell a memóriába lerakni, és utá-
na folytatni a fordítást.


 9.100 

Mit csinál a következő szubrutin? Mikor áll le,  és  mi  lesz
ekkor HL értéke?

          LD   HL,0
   CIK:
          DEC  HL
          LD   A,(HL)
          CPL
          LD   (HL),A
          XOR  (HL)
          JP   Z,CIK


 9.101 

Mit csinál az alábbi szubrutin? Bemenete D és E.

   CIK:
           LD     A,D
           CP     E
           JP     M,NEM
           JP     Z,IGEN
           BIT    0,D
           JP     Z,NULLD
           BIT    0,E
           JP     Z,NEM
           LD     A,D
           SUB    E
           LD     D,A
           JP     CIK
   NULLD:
           BIT    0,E
           JP     Z,NULLE
           SRL    D
           JP     CIK
   NULLE:
           SRL    D
           SRL    E
           JP     CIK
   NEM:
           SCF
           RET
   IGEN:
           OR     A
           RET


 9.102 

Milyen hibák vannak a következő programban?

           LD     HL,68000
           LD     A,(HL)
   CIK:
           DEC    A
           LD     DE,0-10
           ADD    HL,DE
           LD     A,5
           OR     A
           JP     NZ,CIK
           CALL   SZUB
           RET
   SZUB:
           LD     (HL),A
           DEC    HL
           JP     CIK


 9.103 

Mi a következő program hibája? (A BC/DE hányadost IX-be  kel-
lene tennie, a maradékot pedig HL-be.)

           LD     IX,0FFFFH
           LD     H,C
           LD     L,B
   CIK:
           INC    IX
           SBC    HL,DE
           JP     P,CIK


 9.104 

Soros vonalon ASCII-kódú karakterek érkeznek n  bit/s  sebes-
séggel.

 "1" ....                             -- -- ...
              0  1  2  3  4  5  6  7
 "0"      --
      startbit,     információ,      2 stopbit

Egy mikroszámÍtógép az IN A,(3AH) utasítással  olvassa  be  a
soros vonal állapotát. Itt van egy kiszolgáló szubrutin, ame-
lyet 2 MHz-es processzorra írtak.

   1. Mit kell változtatni, hogy 3 MHz-es  processzoron  fus-
      son?
   2. Milyen hibákat jelez a szubrutin az L  regiszter  egyes
      bitjein?
   3. Mitől kerülhet végtelen ciklusba a szubrutin, és hogyan
      lehet ezt kiküszöbölni?
   4. Hogyan lehetne gyorsítani a rutin működését?
   5. Milyen sebességű adást vesz jól a szubrutin?

   ;SOROS VEV§: elrontott regiszterek: A,B,D,E
   ;visszatéréskor a H-ban a vett karakter kódja
   ;L-ben a hibakód
   SVEVO:
            LD    L,0     ;hibakód
            IN    A,(3AH) ;mintavétel
            BIT   0,A     ;A 0. bitje a soros vonal állapota
            JR    NZ,STRT1
            SET   0,L
   STRT1:
            IN    A,(3AH) ;1->0 átmenetre vár
            BIT   0,A
            JR    NZ,STRT1
            LD    DE,20H
            CALL  SUBR
            LD    B,9     ;B bitszámláló
   KOVBIT:
            SRL   H       ;H vett bitek
            IN    A,(3AH)
            BIT   0,A
            JR    Z,BIT0
            SET   7,H
   BIT0:
            LD    DE,40H
            CALL  SUBR
            DJNZ  KOVBIT
            IN    A,(3AH) ;1. stopbit
            BIT   0,A
            JR    NZ,STOP2
            SET   1,L
   STOP2:
            LD    DE,64D
            CALL  SUBR
            IN    A,(3AH) ;2. stopbit
            BIT   0,A
            JR    NZ,VEGE
            SET   2,L
   VEGE:
            LD    DE,01000000B
   SUBR:
            DEC   DE
            LD    A,D
            OR    E
            JR    NZ,SUBR
            RET


 9.105 

A számítógéphez egy 8 nyomógombos billentyűzetet  illesztünk.
Ha nincs lenyomva billentyű, az IN  A,(3AH)  eredménye  csupa
egyes bit. Egy billentyű lenyomását a 0.  bit  1->0  átmenete
jelzi, utána 8 biten a leütött  billentyű  kódja  következik,
majd legalább két 1-es bit.  Az  adatátvitel  sebessége  1200
bit/s, a mikroprocesszor órajelének frekvenciája 2 MHz.

   1. Mit kell kijavítani, hogy 3 MHz-es órajellel működjék?
   2. Előfordulhat-e, hogy a program  végtelen  ciklusba  ke-
      rül? Ha igen, akkor hol és miért?
   3. Milyen hibákat jelez L-ben?

   VEVO:
           LD     HL,0
           IN     A,(3AH)
           BIT    0,A
           JP     NZ,INDUL
           SET    0,L
           RET
   INDUL:
           IN     A,(3AH)   ;1->0 átmenetre vár
           BIT    0,A
           JP     NZ,INDUL
           LD     DE,2EH
           CALL   SZUB
           LD     B,8
   KOVBIT:
           SRL    H
           IN     A,(3AH)
           BIT    0,A
           JP     Z,NULLAS
           SET    7,H
   NULLAS:
           LD     DE,5CH
           CALL   SZUB
           DJNZ   KOVBIT
           IN     A,(3AH)    ;1. stopbit
           JP     NZ,STOP
           SET    1,L
           RET
   STOP:
           LD     DE,5CH
           CALL   SZUB
           IN     A,(3AH)    ;2. stopbit
           BIT    0,A
           JP     NZ,VEGE
           SET    2,L
   VEGE:
           RET
   SZUB:
           DEC    DE
           LD     A,D
           OR     E
           JP     NZ,SZUB
           RET


 9.106 

Mit csinál a következő (veszélyes) Z80-as szubrutin.

   HOSSZ:
   
EQU    SEMMI-ELEJE
   ELEJE:
   
CALL   SEMMI

   VALAMI:
   
POP    HL
                                                                               
DEC    HL
                                                                     
DEC    HL
                                                                     
DEC    HL
                                                                     
LD     D,H
                                                                    
LD     E,L
                                                                    
INC    D
                                                                              
PUSH   DE
                                                                                     
LD     BC,HOSSZ
                                                                    
LDIR
                                                                    
RET
   SEMMI:
   
POP    HL
                                                                               
PUSH   HL
                                                                                     
PUSH   HL
                                                                                     
RET


 9.107 

Mit csinál a következő Z80-as szubrutin? (HL a bemenet)

            EX     DE,HL
            LD     B,16
            LD     HL,KEP
   CIK:
            LD     A,'0'
            SLA    E
            RL     D
            ADC    A,0
            LD     (HL),A
            INC    HL
            DJNZ   CIK


 9.108 

Mit csinál a következő Z80-as szubrutin? Mi lesz HL értéke  a
VEGE illetve a HIBA cimke után?

   INCH1:   EQU    49H     ;49H-nál a billentyűzetbeolvasó
                           ;szubrutin kezdődik, a billentyű
                           ;kódja A-ba kerül
            LD     HL,0
   CIK:
            CALL   INCH1
            CP     0DH     ; sor vége karakter
            JP     Z,VEGE
            CP     '0'
            JP     M,HIBA
            CP     '9'
            JP     P,HIBA
            SLA    L
            RL     H
            LD     D,H
            LD     E,L
            LD     B,2
   CIK1:
            OR     A
            RL     L
            RL     H
            DJNZ   CIK1
            ADD    HL,DE
            LD     B,0
            SBC    A,'0'
            LD     C,A
            ADD    HL,BC
            JP     CIK
   HIBA:
                           ; hibaüzenet kiírása
            RET
   VEGE:
            RET


 9.109 

Mi lesz a HL regiszterpár értéke?

   CIM:     EQU    XXXXH
            LD     HL,CIM
            LD     (HL),0C9H
            CALL   CIM
            INC    SP
            INC    SP
            POP    HL

Megjegyzés: A 0C9H kód a Z80 mikroprocesszor RET utasításának
kódja.