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.