<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="hu">
	<id>https://vik.wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Prisonerhu</id>
	<title>VIK Wiki - Felhasználó közreműködései [hu]</title>
	<link rel="self" type="application/atom+xml" href="https://vik.wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Prisonerhu"/>
	<link rel="alternate" type="text/html" href="https://vik.wiki/Speci%C3%A1lis:Szerkeszt%C5%91_k%C3%B6zrem%C5%B1k%C3%B6d%C3%A9sei/Prisonerhu"/>
	<updated>2026-05-08T12:58:54Z</updated>
	<subtitle>Felhasználó közreműködései</subtitle>
	<generator>MediaWiki 1.43.8</generator>
	<entry>
		<id>https://vik.wiki/index.php?title=Digit%C3%A1lis_technika_2_-_Megold%C3%A1sok_a_V2-es_ellen%C5%91rz%C5%91_feladatsorhoz&amp;diff=166250</id>
		<title>Digitális technika 2 - Megoldások a V2-es ellenőrző feladatsorhoz</title>
		<link rel="alternate" type="text/html" href="https://vik.wiki/index.php?title=Digit%C3%A1lis_technika_2_-_Megold%C3%A1sok_a_V2-es_ellen%C5%91rz%C5%91_feladatsorhoz&amp;diff=166250"/>
		<updated>2013-05-23T15:51:02Z</updated>

		<summary type="html">&lt;p&gt;Prisonerhu: /* 6. m.) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Vissza|Digitális technika 2}}&lt;br /&gt;
[[Category:Digitális technika 2]]&lt;br /&gt;
&lt;br /&gt;
Ezen az oldalon a [[Digitális technika 2#Régi és új Digit2|régi ötkredites]] Digit2 ellenőrző kérdéseihez összegyűjtött megoldások vannak. A megoldások nem mindenhol teljesek vagy jók. Az új Digit2-höz már más ellenőrző feladatsort adott ki a tanszék.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:right;margin:0.5em;&amp;quot; class=&amp;quot;noautonum&amp;quot;&amp;gt;__TOC__&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Media:Digit2_ef_V2.pdf|A V2-es feladatsor itt érhető el.]]&lt;br /&gt;
&lt;br /&gt;
== 1. feladat ==&lt;br /&gt;
&lt;br /&gt;
* [[Media:Digit2_ef_V2_megold_1_a_ell.pdf‎|PDF az 1/a) feladathoz]]&lt;br /&gt;
&lt;br /&gt;
== 2. feladat ==&lt;br /&gt;
&lt;br /&gt;
by Lacee&lt;br /&gt;
(a hibákat jelezni kérem a prisonerhu{{kukac}}freemail.hu címen)&lt;br /&gt;
&lt;br /&gt;
=== 2. a) ===&lt;br /&gt;
&lt;br /&gt;
Készítsen megszakítási vonalakat kezelő áramkört, amely egy 8085-ös processzoron alapuló sín RST 5.5-ös és RST 6.5-ös megszakítási vonalaira csatlakozva2 db külsô megszakítás (IT1 és IT2) fogadására alkalmas.&lt;br /&gt;
&lt;br /&gt;
A külső megszakítások kezelését külön-külön áramkörök végzik, amelyek a külső megszakítás felfutó élére kérnek megszakítást és alaphelyzetbe OUT utasítással állíthatók (vagy a ResetOut jel hatására). Egy megszakítási impulzus csak egyszer kérjen megszakítást. Az IT1 megszakítás hatására a C regiszter 55h, IT2 hatására a C regiszter AAh értéket vesz fel. A megszakítási flip-flopok 11h (IT1) és 17h (IT2) címen érhetők el.&lt;br /&gt;
&lt;br /&gt;
* Készítse el a rendszer inicializálását végző főprogramot (40h címtől kezdődően)!&lt;br /&gt;
* Készítse el a megszakítási szubrutinokat! &lt;br /&gt;
&lt;br /&gt;
        RST55 EQU 2CH&lt;br /&gt;
        RST65 EQU 34H&lt;br /&gt;
        C1 EQU 55H  &lt;br /&gt;
        C2 EQU AAH&lt;br /&gt;
        IT1 11H&lt;br /&gt;
        IT2 17H&lt;br /&gt;
 &lt;br /&gt;
        JMP INIC&lt;br /&gt;
        ORG 0040H&lt;br /&gt;
    INIC:&lt;br /&gt;
        MVI A,00001100B ;RST 7.5-T LETILTJUK, A TÖBBIT ENGEDÉLYEZZÜK&lt;br /&gt;
        SIM     ;MASZK BEÁLLÍTÁSA&lt;br /&gt;
        EI      ;MEGSZAKÍTÁS ENG&lt;br /&gt;
        &lt;br /&gt;
    VAR:    JMP VAR     ;VÉGTELEN CIKLUS, AZ RST-KRE VÁR, AZOK MEGSZAKÍTJÁK&lt;br /&gt;
 &lt;br /&gt;
        ORG RST55   ;RST55 CÍMÉN VAN,ÍGY HA MEGSZAKÍTÁS TÖRTÉNIK, AKKOR IDE UGRIK A PROGI&lt;br /&gt;
    MEGSZ1: MVI C,C1        ;BEÁLLÍTJUK A KÍVÁNT ÉRTÉKET    &lt;br /&gt;
        OUT IT1     ;VISSZAÁLLÍTJUK AZ IO-T&lt;br /&gt;
        EI      ;MEGSZAKÍTÁS ÉRVÉNYRE JUTTATÁSA&lt;br /&gt;
        RET&lt;br /&gt;
 &lt;br /&gt;
        ORG RST65   ;AZ ELÕBBI MINTÁJÁRA...&lt;br /&gt;
    MEGSZ2: &lt;br /&gt;
        MVI C,C2    &lt;br /&gt;
        OUT IT2&lt;br /&gt;
        EI&lt;br /&gt;
        RET&lt;br /&gt;
&lt;br /&gt;
=== 2. b) ===&lt;br /&gt;
&lt;br /&gt;
Írjon assembly szubrutint (KONV), amely az A regiszterben megkapott byte-ot átírja a 74LS374-es regiszter bekötésének megfelelően. A szubrutin kimenete az átkonvertált byte az A regiszterben. (A szubrutin más regiszterek tartalmát nem ronthatja el!)&lt;br /&gt;
&lt;br /&gt;
Írjon ellenőrző 8085-ös assembly szubrutint (ELO), amely az összes lehetséges kombinációval ellenőrzi a kimeneti regiszter bekötését. A szubrutin lefutása után a D,E regiszterpárban legyen a felismert hibák száma! (A szubrutin a D,E regiszterpár kivételével a regiszterek tartalmát nem ronthatja el!) A megoldásban használja az előző feladatban definiált KONV szubrutint! A kimeneti regiszter 0FFh I/O címen írható és 01Fh címen olvasható.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    PÉLDA1 A MÛKÖDÉSRE&lt;br /&gt;
        10101111    ;A BEJÖVÕ ADAT -&amp;gt; EZT KELL KAPNUNK A PÉLDA1-BEN: 01011111&lt;br /&gt;
    RRC 11010111    ;JOBBRA FORGATJUK&lt;br /&gt;
    AND 01010101    ;ÖSSZEÉSELJÜK  55H-VAL (MÁSNÉVEN MASZKOLÁS)&lt;br /&gt;
        ----------&lt;br /&gt;
    =   01010101 -&amp;gt; D   ;AZ EREDMÉNYT BEÍRJUK A (D) REG-BE&lt;br /&gt;
&lt;br /&gt;
    RLC 01011111    ;AZ EREDETI ADATOT FORGATJUK BALRA&lt;br /&gt;
    AND 10101010    ;ÉSELJÜK AAH-VAL&lt;br /&gt;
        ----------&lt;br /&gt;
    =   00001010 -&amp;gt; H   ;KIMENTJÜK H-BA, A PROGIBAN NEM KELL H-BA MENTENI,MERT AZ UTANA LEVÕ PARANCS A&lt;br /&gt;
          VAGYOLÁS ÉS AHHOZ AZ A- TARTALMA KELL, AMI MOST PONT A H-BA RAKOTTAL EGYEZIK MEG&lt;br /&gt;
&lt;br /&gt;
    H OR D&lt;br /&gt;
        01010101    &lt;br /&gt;
        00001010    &lt;br /&gt;
        ----------  &lt;br /&gt;
        01011111    ;AZ EREDMÉNY!&lt;br /&gt;
&lt;br /&gt;
    PÉLDA2:&lt;br /&gt;
        10101110 -&amp;gt;EBBÕL EZT:01011101&lt;br /&gt;
    RRC 01010111&lt;br /&gt;
    AND 01010101&lt;br /&gt;
        ----------&lt;br /&gt;
    =   01010101 -&amp;gt; D&lt;br /&gt;
&lt;br /&gt;
    RLC 01011101&lt;br /&gt;
    AND 10101010&lt;br /&gt;
        -----------&lt;br /&gt;
    =   00001000 -&amp;gt; H&lt;br /&gt;
&lt;br /&gt;
    H OR D&lt;br /&gt;
        01010101&lt;br /&gt;
        00001000&lt;br /&gt;
        -----------&lt;br /&gt;
        01011101&lt;br /&gt;
&lt;br /&gt;
    ;NA ÉS VÉGRE A PROGI&lt;br /&gt;
    KONV:   PUSH H&lt;br /&gt;
        PUSH D&lt;br /&gt;
        PUSH PSW    ;kimentjük A-t&lt;br /&gt;
        RRC     ;jobbra forgatunk&lt;br /&gt;
        ANI 01010101B   ;maszkoljuk 55H-val&lt;br /&gt;
        MOV D,A     ;a maszkolt byte-ot kimentjük D-be&lt;br /&gt;
        POP PSW     ;vissza az A-t&lt;br /&gt;
        RLC         ;balra forgatjuk&lt;br /&gt;
        ANI 10101010B   ;maszkoljuk AAH-val&lt;br /&gt;
        ORA D       ;összevagyoljuk D-vel&lt;br /&gt;
        POP D       ;POPpolgatunk&lt;br /&gt;
        POP H&lt;br /&gt;
        RET&lt;br /&gt;
        &lt;br /&gt;
    ELO:    &lt;br /&gt;
        PUSH PSW&lt;br /&gt;
        PUSH H&lt;br /&gt;
        PUSH B&lt;br /&gt;
        PUSH A  &lt;br /&gt;
        MVI B,0H&lt;br /&gt;
        LXI D,0H&lt;br /&gt;
    FUT:&lt;br /&gt;
        MOV A,B&lt;br /&gt;
        OUT 0FFH    ;a B 0-tól FF-ig megy, ez az összes lehetséges kombináció&lt;br /&gt;
        CALL KONV   ;az A-ban a B-nek megfelelő beolvasott (átkonvertált) adat lesz&lt;br /&gt;
        MOV C,A     &lt;br /&gt;
        IN  01FH        ;beolvassuk a reg tartalmát&lt;br /&gt;
        CMP C       ;ha A=C akkor jó (C:a B konvertált alakja, A:a közvetlenül visszaolvasott alak&lt;br /&gt;
        &lt;br /&gt;
        JZ TOVABB   ;ha B=C -&amp;gt; Z=1, tehát nem kell növelni a DE-t&lt;br /&gt;
        INX D       ;ha azonban Z=0, növeljük DE-t&lt;br /&gt;
    TOVABB: INR B       &lt;br /&gt;
        MOV A,FF&lt;br /&gt;
        CMP B   &lt;br /&gt;
        JNZ FUT     ;ha B végigpörgött, tehát elérte az FF-t, akkor kilépünk&lt;br /&gt;
        POP A&lt;br /&gt;
        POP B&lt;br /&gt;
        POP H&lt;br /&gt;
        POP PSW&lt;br /&gt;
&lt;br /&gt;
=== 2. c) ===&lt;br /&gt;
&lt;br /&gt;
Írja meg a VIZS 8085 assembly szubrutint, amely az A regiszterben kapott értéket beírja a kimeneti regiszterbe, majd a kimenet értékét visszaolvassa és ellenőrzi, hogy a beérkezett karakter helyes-e? Hiba esetén a szubrutinból való visszatéréskor Z=1, különben Z=0 legyen!&lt;br /&gt;
&lt;br /&gt;
* A kimeneti egység K1…K8 jelei a 0ACh IO címen olvashatók vissza.&lt;br /&gt;
* a kimeneti regiszter (74374) a 0AAh IO címen írható&lt;br /&gt;
* A kimeneti regiszter minden második bitje (K0,K2,K4,K6) negáltan legyen kivezetve.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    VIZS:   OUT 0AAH    ;BEÍRJUK AZ A REG TARTALMÁT A KIMENETI REG-BE&lt;br /&gt;
        AND 55H     ;A KIMENET ÉRTÉKE NEM A BEÍRT A-VAL LESZ EGYENLÕ&lt;br /&gt;
        XRA FFH     ;EZÉRT MEGCSINÁLJUK SZOFTVERESEN A BYTE MINDEN MÁSODIK BITJÉNEK NEGÁLÁSÁT&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    ;példa 1:a fenti műveltre (AND 55H;XRA FFH)&lt;br /&gt;
    kiírt adat: &lt;br /&gt;
        11111111  -&amp;gt; ebből ezt kell kapnunk: 10101010&lt;br /&gt;
    AND 01010101&lt;br /&gt;
        -----------&lt;br /&gt;
        01010101&lt;br /&gt;
    XRA 11111111&lt;br /&gt;
        -----------&lt;br /&gt;
        10101010  -&amp;gt;és kész!&lt;br /&gt;
&lt;br /&gt;
    ;példa 2:&lt;br /&gt;
    kiírt adat:&lt;br /&gt;
        10111011  -&amp;gt;ez lesz belőle: 11101110&lt;br /&gt;
    AND 01010101&lt;br /&gt;
        -----------&lt;br /&gt;
        00010001&lt;br /&gt;
    XRA 11111111&lt;br /&gt;
        -----------&lt;br /&gt;
        11101110  -&amp;gt; ready!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    ;és a progi folytatása&lt;br /&gt;
        MOV B,A     ;elmentjük B-be, mert később a visszaolvasott adat alapból az A-ba kerül és felülírja ezt&lt;br /&gt;
        IN 0ACH     ;visszaolvasás&lt;br /&gt;
        CMP B       ;a szokásos vizsgálat, A-ból kivonjuk a B-t(az ellenőrző byte-ot)&lt;br /&gt;
        JNZ Z1      ;és ha az eredmény nem 0 (akkor Z=0,és hiba van), a feladata pont az ellentetjét kéri&lt;br /&gt;
        XRA A       ;ezért a Z flaget megnegáljuk az alábbi paranccsal&lt;br /&gt;
        JMP VEGE&lt;br /&gt;
    Z1: MOV A,1H&lt;br /&gt;
        ORA A       &lt;br /&gt;
    VEGE:   RET&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 2. d) ===&lt;br /&gt;
&lt;br /&gt;
Illesszen i8085-ös mikroprocesszoros rendszersínre két 8251-es soros periféria illesztő áramkört. Az „A” áramkör csak kimenetre, a „B” áramkör csak bemenetre van felprogramozva. Az „A” áramkör TxD kimenetét a „B” áramkör RxD bemenetére kell kötni. Mindkét áramkör TxC és RxC órajel bemeneteire CLK96 órajel van kötve. Inicializáláskor mindkét áramkör programozása: aszinkron üzemmód, 8 bites karakter, páros paritás és 2 stop bit. A „B” áramkör az /RST 5,5 sínen kér megszakítást. Az „A” áramkör báziscíme 0AAh, a „B” áramkör báziscíme 0AEh.&lt;br /&gt;
&lt;br /&gt;
Írja meg azt a két assembly programrészletet, amely a két 8251-est felprogramozza a fenti konfigurációnak megfelelően!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    AFELPROG:&lt;br /&gt;
        ;először a MODE INSTRUCTION-t kell kiküldeni&lt;br /&gt;
        ;kódszó: 11111101B - a alsó 2 bit értéke elvileg úgy jön ki, hogy a TxC és RxC órajeleknek 1-szeres arány kell legyen&lt;br /&gt;
        MOV A,FDH&lt;br /&gt;
        OUT 0AAH&lt;br /&gt;
        MOV A,00    000001B     ;Command Instruction&lt;br /&gt;
        OUT 0AAH        &lt;br /&gt;
        RET&lt;br /&gt;
        &lt;br /&gt;
&lt;br /&gt;
    BFELPROG:&lt;br /&gt;
        ;kódszó: ugyanaz,mint az előbb&lt;br /&gt;
        MOV A,FDH&lt;br /&gt;
        OUT 0AEH&lt;br /&gt;
        MOV A,00000000B     ;Command Instruction, B lesz a vevő&lt;br /&gt;
        OUT 0AEH    &lt;br /&gt;
        JMP 002CH&lt;br /&gt;
        RET&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 2. e) NR! ===&lt;br /&gt;
&lt;br /&gt;
Illesszen a 8085 mikroprocesszor sínrendszerére 8255-ös típusúPPIO áramkört, amely a 94H, 95H, 96H, 97H portcímeket foglalja el. A PPIO áramkör B portjára egy 8 bites párhuzamos adat kimenettel rendelkező periféria csatlakozik, (tehát a B portot bemenetként kell felprogramozni) amely hand-shaking (kézfogásosos) jelekkel ütemezi az adatátvitelt. Adat beolvasása esetén az áramkör kérjen megszakítást a CPU RST5.5 bemenetén. A periféria 8 adatvezetéken kívül az adattal egyidőben megjeleníti a PEVEN páros paritás jelet is. A PEVEN jel csak a hand-shaking folyamat közben áll rendelkezésre.&lt;br /&gt;
&lt;br /&gt;
Vegye figyelembe, hogy a megszakítási szubrutinban megvalósított adatbeolvasás időpontjában nem biztos, hogy a PEVEN paritás rendelkezésre áll, viszont a feladathoz feltétlen szükséges. Ezért javasolt a paritás jel mintavételezése (a megfelelő hand-shaking jellel) és letárolása a PPIO áramkörön kívül, majd beolvasása az A porton keresztül (pl. PA0 bemeneten) a megszakítási szubrutinban.&lt;br /&gt;
&lt;br /&gt;
* Írjon INIC55 szubrutint, amely elvégzi a PPIO áramkör fentiek szerinti inicializálást, és az SP beállítását, ha a STACK 8F00h és 8FFFh memóriatartományban van&lt;br /&gt;
* Írjon RST5.5 megszakítási szubrutint, amely beolvassa az adatot és a paritást PPIO áramkörről, ellenőrzi paritást, majd azadatot elhelyezi a 3456H című memória byte-ban, illetve paritáshiba esetén megnöveli a 3457H című memória byte tartalmát.&lt;br /&gt;
&lt;br /&gt;
    INIC55: ORG 8F00H   &lt;br /&gt;
        TER DS FF   ;STACK helyfoglalás&lt;br /&gt;
        &lt;br /&gt;
        ORG 0H&lt;br /&gt;
        ;STÁTUSZ szó: 10111111  - segédlet 95-97.oldala alapján&lt;br /&gt;
        MOV A,DFH&lt;br /&gt;
        OUT 97H&lt;br /&gt;
        &lt;br /&gt;
        IN 95H&lt;br /&gt;
        JMP 2CH &lt;br /&gt;
&lt;br /&gt;
        ORG 2CH&lt;br /&gt;
        IN 94H      ;ez itt a PEVEN jel beolvasása &lt;br /&gt;
        ANI 01H     ;a PA0 bitjét veszem a PEVEN paritás bitnek&lt;br /&gt;
        MOV D,A     ;és elmentem a D-be;ha D=0, akkor páratlan paritás,  D=1, akkor páros paritás van&lt;br /&gt;
        MVI B,0&lt;br /&gt;
        MVI C,8 &lt;br /&gt;
    PARIT:  RLC&lt;br /&gt;
        JNC TOV&lt;br /&gt;
        INR B       ;az utolsó ciklusba bekerül a beolvasott byte-ban lévő 1-esek száma&lt;br /&gt;
    TOV:    DCR C&lt;br /&gt;
        JNZ PARIT&lt;br /&gt;
        MOV A,B&lt;br /&gt;
        ANI 01H&lt;br /&gt;
        &lt;br /&gt;
        LXI H,3456H&lt;br /&gt;
        MOV M,A&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
=== 2. f.) ===&lt;br /&gt;
&lt;br /&gt;
Illesszen i8085-ös mikroprocesszoros rendszersínre egy visszaolvasható 8 bites kimeneti regisztert, mely az alábbi ábrán látható lámpa vezérlő egységet képes működtetni.&lt;br /&gt;
* a kimeneti regisztert (74374) a 20h IO címen írható és a kimeneti egység L1…L8 jelei a 20H IO címen visszaolvashatók&lt;br /&gt;
* Írja meg a CHECK 8085 assembly szubrutint, amely az A regiszterben kapott értéket beírja az előző feladatban kialakított kimeneti regiszterbe, majd a kimenet értékét visszaolvassa és ellenőrzi. Hiba esetén visszatéréskor CY=1, különben CY=0 legyen.&lt;br /&gt;
&lt;br /&gt;
    CHECK:  OUT 20H     ;kiírás a reg-be&lt;br /&gt;
        CMA     ;bitenként negálja az A-t&lt;br /&gt;
        MOV B,A     ;ezt a negált értéket beírjuk a B reg-be&lt;br /&gt;
        IN 20H      ;20H címről beolvasunk&lt;br /&gt;
        CMP B       ;szokásos ellenőrzés&lt;br /&gt;
        JZ CY0      ;ha egyenlő a B és a visszaolvasott érték, akkor Z=1 és akkor ugrunk arra a részre ahol CY:=0&lt;br /&gt;
        STC     ;ha Z=0 akkor CY-t 1-be állitjuk&lt;br /&gt;
        JMP VEGE        ;és ugrunk a végére&lt;br /&gt;
    CY0:    STC     ;CY=1&lt;br /&gt;
        CMC     ;CY-t negálja&lt;br /&gt;
    VEGE:   RET&lt;br /&gt;
&lt;br /&gt;
== 3. feladat ==&lt;br /&gt;
&lt;br /&gt;
=== 3. a) ===&lt;br /&gt;
&lt;br /&gt;
            LXI D,X     ; X ms-ban&lt;br /&gt;
            LXI B,R     ; R-ratio, szazalekban&lt;br /&gt;
        ELEJE:  LXI H,X*1000000*R/100/7040&lt;br /&gt;
            MVI A,C8H   ; 11001000B&lt;br /&gt;
            SIM&lt;br /&gt;
            CALL HUROK&lt;br /&gt;
            MVI A,48H   ; 01001000B&lt;br /&gt;
            SIM&lt;br /&gt;
            LXI H,X*1000000*(100-R)/100/7040&lt;br /&gt;
            CALL HUROK&lt;br /&gt;
            JMP ELEJE&lt;br /&gt;
&lt;br /&gt;
        HUROK:  DCX H       ; 4 fazis&lt;br /&gt;
            MOV A,H     ; 4 fazis&lt;br /&gt;
            ORA L       ; 4 fazis&lt;br /&gt;
            JNZ HUROK   ; 10 fazis, 7040 nsec&lt;br /&gt;
            RET&lt;br /&gt;
&lt;br /&gt;
=== 3. b.) === &lt;br /&gt;
&lt;br /&gt;
Írjon 8085 assembly szubrutint, amely a következő specifikáció szerint működik:&lt;br /&gt;
* A szubrutin a SID jel felfutó élére egy adatkivitelt, a lefutó élére egy adatbeolvasást végezzen a következők szerint:&lt;br /&gt;
* a szubrutin induláskor megvárja a SID jel 0=&amp;gt;1 átmenetét és a B regiszter tartalmát kiírja a 70h-es port címre,&lt;br /&gt;
* majd a SID jel 1=&amp;gt;0 átmenetére 71h port címről beolvas egy adatbájtot, amit a C regiszterbe tesz, ezután kilép a szubrutinból.&lt;br /&gt;
* A szubrutin bemenete: a kiírandó adat a B regiszterben.&lt;br /&gt;
* A szubrutin kimenete: a beolvasott adat a C regiszterben&lt;br /&gt;
* A megoldás során ügyeljen arra, hogy a szubrutin a C regiszter kivételével a regiszterek és a flag-ek értékét ne változtassa meg!&lt;br /&gt;
&lt;br /&gt;
    RUTIN:  MVI C,0H        ;ezzel a reg-gel ellenőrizzük azt, hogy a SID jel milyen értékű, az 1. részben 0-1 átmenet kell&lt;br /&gt;
        PUSH PSW    ;kimentések&lt;br /&gt;
        PUSH A&lt;br /&gt;
        PUSH B&lt;br /&gt;
    VAR1:   RIM     ;a beolvasott byte felső bitje a SID jel értékét mutatja &lt;br /&gt;
        MVI A,80H   ;maszkolás  &lt;br /&gt;
        ORA C       ;megnézzük, hogy a SID=0-e ha nem akkor ugárs VAR1-re / SID=1-re várunk&lt;br /&gt;
        JNZ VAR1&lt;br /&gt;
    VAR2:   RIM     ;itt gyakorlatilag ugyanaz van, mint az előbb, csak SID-1-re várunk&lt;br /&gt;
        MVI A,80H&lt;br /&gt;
        ORA C&lt;br /&gt;
        JZ VAR2     ;tehát ha SID=0 marad, akkor ugrunk VAR2-re / ha SID=1, akkor várunk még&lt;br /&gt;
        MOV A,0     ;itt azt nézzük, hogy az 1. részben vagyunk-e &lt;br /&gt;
        CMP C       ;ha a kivonás eredménye 0, akkor az 1. részben vagyunk és ekkor írjuk ki a B-t a 70H-ra&lt;br /&gt;
        JZ B70H     &lt;br /&gt;
        JMP C71H        ;ha a 2. részben vagyunk, akkor az előző ugró utasítás nem teljesül és ide kell ugrani&lt;br /&gt;
    CIMKE:  MOV C,01H   ;ha az 1. részben vagyunk, akkor C reg-t 1-be kell állítani, a 2. részben már nem fogunk ide ugrani&lt;br /&gt;
        JMP VAR1&lt;br /&gt;
    B70H:   MOV A,B&lt;br /&gt;
        OUT 70H&lt;br /&gt;
        JMP CIMKE&lt;br /&gt;
    C71H:   IN 71H&lt;br /&gt;
        MOV C,A &lt;br /&gt;
        POP B&lt;br /&gt;
        POP A&lt;br /&gt;
        POP PSW&lt;br /&gt;
        END&lt;br /&gt;
&lt;br /&gt;
Egy másik megoldás:&lt;br /&gt;
&lt;br /&gt;
        NULLBEOLV:  PUSH PSW&lt;br /&gt;
                RIM&lt;br /&gt;
                ANI 80H     ;10000000B&lt;br /&gt;
                JZ NULLBEOLV&lt;br /&gt;
                MOV A,B&lt;br /&gt;
                OUT 70H&lt;br /&gt;
        EGYBEOLV:   RIM&lt;br /&gt;
                ANI 80H&lt;br /&gt;
                JNZ EGYBEOLV&lt;br /&gt;
                IN 71H&lt;br /&gt;
                MOV C,A&lt;br /&gt;
                POP PSW&lt;br /&gt;
                JMP NULLBEOLV&lt;br /&gt;
&lt;br /&gt;
=== 3. c.) ===&lt;br /&gt;
Írjon 8085 assembly szubrutint, amely megvárja a SID jel változását (felfutó és lefutó él). A szubrutin kimenete:&lt;br /&gt;
* Z=1 felfutó él volt,&lt;br /&gt;
* Z=0 lefutó él volt!&lt;br /&gt;
* A szubrutin ne változtassa meg a regiszterpárok értékét!&lt;br /&gt;
&lt;br /&gt;
    RUTIN:  RIM&lt;br /&gt;
        ANI 80H     ;maszkolás, az SID értéke az A-ban lesz&lt;br /&gt;
        JZ FELFUT   ;ha az előbbi &amp;quot;és&amp;quot;-elés eredménye 0 (tehát a SID 0), akkor Z=1 -&amp;gt; ugrás a felfutójelhez&lt;br /&gt;
        JMP LEFUT   ;különben lefutó jelre várunk&lt;br /&gt;
    FELFUT: RIM&lt;br /&gt;
        ANI 80H     ;maszkolás&lt;br /&gt;
        JZ FELFUT   ;addig csináljuk amíg az eredmény 1 lesz (tehát a SID=1-re), Z=0-ra várunk&lt;br /&gt;
        XRA A       ;beállítjuk a Z-t 1-re&lt;br /&gt;
        JMP VEGE        ;ugrás végére&lt;br /&gt;
    LEFUT:  RIM&lt;br /&gt;
        ANI 80H&lt;br /&gt;
        JNZ FELFUT  ;ha Z=1, akkor az &amp;quot;és&amp;quot;-elés eredménye:0, tehát tovább kell várni a SID= 1 -&amp;gt; 0 átmenetre&lt;br /&gt;
        MOV A,FFH   &lt;br /&gt;
        ORA A       ;Z:=0&lt;br /&gt;
    VEGE:   RET&lt;br /&gt;
&lt;br /&gt;
Egy másik megoldás:&lt;br /&gt;
&lt;br /&gt;
                MVI A,0&lt;br /&gt;
                RIM&lt;br /&gt;
                ANI 80H&lt;br /&gt;
                JZ IDE&lt;br /&gt;
                MVI A,1&lt;br /&gt;
        IDE:        CALL IDERUTIN&lt;br /&gt;
                HALT&lt;br /&gt;
        IDERUTIN:   ANI FF&lt;br /&gt;
                JZ VAREGYRE&lt;br /&gt;
        VARNULLRA:  RIM&lt;br /&gt;
                ANI 80H&lt;br /&gt;
                JNZ VARNULLRA&lt;br /&gt;
                RZ&lt;br /&gt;
        VAREGYRE:   RIM&lt;br /&gt;
                ANI 80H&lt;br /&gt;
                JZ VAREGYRE&lt;br /&gt;
                RNZ&lt;br /&gt;
&lt;br /&gt;
=== 3. d.) ===&lt;br /&gt;
Írjon 8085 assembly szubrutint, amely a HL regiszterpárban kapott kezdőcímű és 32 byte hosszúságú adatblokkhoz 1 byte-os ellenőrző összeget számol ki, és elhelyezi a blokkot követő rekeszben. A szubrutin végén az akkumulátor az ellenőrző összeget tartalmazza! (A rutin bármely regiszter értékét elronthatja)!&lt;br /&gt;
&lt;br /&gt;
Az ellenőrző összeg számítási algoritmusa: X(i) mod 256   0&amp;lt;i&amp;lt;32&lt;br /&gt;
&lt;br /&gt;
    RUTIN:  MVI C,32        ;32 byte hosszúságú adatblokk&lt;br /&gt;
        XRA A       ;A:=0&lt;br /&gt;
    CIKLUS: ADD M       ;A+HL-&amp;gt; A&lt;br /&gt;
        INX H       ;forrásmutató növelése&lt;br /&gt;
        DCR C       &lt;br /&gt;
        JNZ CIKLUS  ;ha végigértünk akkor Z=1&lt;br /&gt;
        MOV M,A     ;a blokkot követő részen az ellenőrző összeg&lt;br /&gt;
        RET&lt;br /&gt;
&lt;br /&gt;
Egy másik megoldás:&lt;br /&gt;
                LXI D,0     ;reszosszeg kinullazasa&lt;br /&gt;
                LXI H, KC   ;kezdocim&lt;br /&gt;
                LXI B, 32   ;db&lt;br /&gt;
            HUROK:  MOV A,M&lt;br /&gt;
                CALL OSSZEGZO&lt;br /&gt;
                INX H&lt;br /&gt;
                DCX B&lt;br /&gt;
                MOV A,C&lt;br /&gt;
                ORA B&lt;br /&gt;
                JNZ HUROK&lt;br /&gt;
                MOV M,E     ;E-ben van a mod256 reszosszeg&lt;br /&gt;
            &lt;br /&gt;
            OSSZEGZO:&lt;br /&gt;
                PUSH H&lt;br /&gt;
                MOV L,A&lt;br /&gt;
                MVI H,0&lt;br /&gt;
                DAD D&lt;br /&gt;
                XCHG&lt;br /&gt;
                POP H&lt;br /&gt;
                RET&lt;br /&gt;
&lt;br /&gt;
=== 3. e.) ===&lt;br /&gt;
Írjon assembly programot amely kivonja két memóriában elhelyezkedő 32 szavas memóriatömbök egyes szavait és az eredményeket visszahelyezi egy újabb memóriaterületre! A 2 byte-os szavak felső 8 bitjét a kisebb című (páros) byte, az alsó 8 bitet a következő (páratlan) cím tárolja!&lt;br /&gt;
    (9000H,9001H) = (9100H,9101H) - (9200H,9201H) ... stb.&lt;br /&gt;
* Írja meg a kivonó programot!&lt;br /&gt;
* A kivonások elvégzése után a 9000H-n kezdődő 32 szavas memória terület után helyezzen el egy olyan byte-ot, amely megadja, hogy a 32 eredmény szó közül mennyi a pozitív szám feltételezve, hogy az operandusok (és az eredmény) 16 bites kettes komplemens kódban van ábrázolva. &lt;br /&gt;
&lt;br /&gt;
        LXI B,9000H&lt;br /&gt;
        LXI D,9101H&lt;br /&gt;
        LXI H,9201H&lt;br /&gt;
        MVI E,32H   ;2*32 szót vonunk ki egymásból  &lt;br /&gt;
    KIVON:  STC     ;CY:=1&lt;br /&gt;
        CMC     ;CY:=/CY -&amp;gt; CY:=0&lt;br /&gt;
        LDAX A,D        ;9101H-n található adatot betölti az A-ba&lt;br /&gt;
        SBB M       ;A-(HL által mutatott címen levő adat)-CY , ha van átvitel akkor CY=1 lesz&lt;br /&gt;
        STAX B      ;B által mutatott címre A tartalmát helyezi&lt;br /&gt;
        DCX B       &lt;br /&gt;
        DCX D&lt;br /&gt;
        DCX H&lt;br /&gt;
        LDAX A,D        ;9100H-n található adat megy az A-ba&lt;br /&gt;
        SBB M       ;A-M-CY&lt;br /&gt;
        STAX B      ;9000H-n a kivonás eredménye (2 byte-on)&lt;br /&gt;
        INX H&lt;br /&gt;
        INX H&lt;br /&gt;
        INX D&lt;br /&gt;
        INX D&lt;br /&gt;
        INX B&lt;br /&gt;
        INX B&lt;br /&gt;
        DCR E&lt;br /&gt;
        JNZ KIVON&lt;br /&gt;
        MVI E,32H   ;32 szavat vizsgálunk meg&lt;br /&gt;
        MVI D,0H        ;a pozitív számok számát ebben tároljuk &lt;br /&gt;
    SZAMOL: LXI B,9000H &lt;br /&gt;
        ANI 80H     ;ha a MSB (legfelső bit)=1 akkor a szám negatív&lt;br /&gt;
        JZ TOVABB   ;ha szám negatív, akkor Z=1 és nem kell növelni&lt;br /&gt;
        INR D   &lt;br /&gt;
    TOVABB: INX H       &lt;br /&gt;
        INX H&lt;br /&gt;
        DCR E       &lt;br /&gt;
        JNZ SZAMOL&lt;br /&gt;
        END&lt;br /&gt;
&lt;br /&gt;
Egy másik megoldás:&lt;br /&gt;
            XPOINTER EQU 9080H&lt;br /&gt;
            YPOINTER EQU 9082H&lt;br /&gt;
            ZPOINTER EQU 9084H  ;ideiglenes regiszterpárok, KIHASZNÁLATLAn ramterület, senkit nem zavar&lt;br /&gt;
            X EQU 9100H&lt;br /&gt;
            Y EQU 9200H&lt;br /&gt;
            Z EQU 9000H&lt;br /&gt;
 &lt;br /&gt;
            LXI H,X         ;ebbol&lt;br /&gt;
            SHLD XPOINTER&lt;br /&gt;
            LXI H,Y         ;ezt&lt;br /&gt;
            SHLD YPOINTER&lt;br /&gt;
            LXI H,Z         ;ide(eredmény)&lt;br /&gt;
            SHLD ZPOINTER&lt;br /&gt;
             &lt;br /&gt;
        CIKLUS: CALL CIKLUSMAG&lt;br /&gt;
            LXI B, X+32*2&lt;br /&gt;
            LHLD XPOINTER&lt;br /&gt;
            MOV A,H&lt;br /&gt;
            CMP B&lt;br /&gt;
            JNZ CIKLUS&lt;br /&gt;
            MOV A,L&lt;br /&gt;
            CMP C&lt;br /&gt;
            JNZ CIKLUS&lt;br /&gt;
            HALT&lt;br /&gt;
 &lt;br /&gt;
        CIKLUSMAG:&lt;br /&gt;
            LHLD XPOINTER       ;H=91,L=00&lt;br /&gt;
            MOV D,M&lt;br /&gt;
            INX H&lt;br /&gt;
            MOV E,M         ;DE=ebbol&lt;br /&gt;
            INX H&lt;br /&gt;
            SHLD XPOINTER&lt;br /&gt;
            LHLD YPOINTER&lt;br /&gt;
            MOV A,M&lt;br /&gt;
            CMA&lt;br /&gt;
            MOV B,A&lt;br /&gt;
            INX H&lt;br /&gt;
            MOV A,M&lt;br /&gt;
            CMA&lt;br /&gt;
            MOV C,A&lt;br /&gt;
            INX B           ;BC-ben kivonando kettes komplemense(-1szerese)         &lt;br /&gt;
            INX H           &lt;br /&gt;
            SHLD YPOINTER&lt;br /&gt;
            XCHG            ;HL-ben ebbol&lt;br /&gt;
            DAD B&lt;br /&gt;
            XCHG            ;DE-ben eredmeny&lt;br /&gt;
            LHLD ZPOINTER&lt;br /&gt;
            MOV M,D&lt;br /&gt;
            INX H&lt;br /&gt;
            MOV M,E&lt;br /&gt;
            INX H&lt;br /&gt;
            SHLD ZPOINTER&lt;br /&gt;
            RET&lt;br /&gt;
&lt;br /&gt;
=== 3. f.) ===&lt;br /&gt;
Írjon assembly szubrutint amely kivonja két, a memóriában elhelyezkedő 64 byte-os memóriatömb egyes byte-jait és az eredményeket visszahelyezi az első operandus helyére! Az operandusok kezdőcímeit a szubrutin a HL és DE regiszterpárokban kapja. A kivonások elvégzése után a rutin az BC regiszter-párban kapott címtől kezdődően helyezzen el egy olyan byte-ot, amely megadja, hogy a 64 eredmény byte közül mennyi a pozitív szám (&amp;gt;0), egy másik byte-ot, hogy mennyi a negatív szám (&amp;lt;0), és egy harmadik byte-ot, hogy hány érték volt 0 (=0). (Az operandusok és az eredmény 8 bites kettes komplemens kódban vannak ábrázolva.)&lt;br /&gt;
* Írja meg a szubrutint!&lt;br /&gt;
* Írja meg azt a programrészletet, amely meghívja a szubrutint a HL=8000h, DE=8800h és BC=9000h paraméterekkel, majd ellenőrzi, hogy a 9000h címtől kezdődő 3 byte összege valóban 64.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    RUTIN:  PUSH B      ;kimentjük BC-t,mert a számlálónak a B-t használjuk fel&lt;br /&gt;
        PUSH H      ;a későbbi vizsgálat során az eredeti címtől indulunk, így ezt is kimentjük&lt;br /&gt;
        MVI B,64        &lt;br /&gt;
        XCHG        ;HL és DE felcserélése&lt;br /&gt;
    KIVON:  LDAX D      ;az A-ba betölti a DE (eredetileg HL) által mutatott címen lévő adatot&lt;br /&gt;
        SUB M       ;így DE-ből kivonjuk a HL-t&lt;br /&gt;
        STAX D      ;DE által mutatott címre visszahelyezzük az eredményt&lt;br /&gt;
        INX D       &lt;br /&gt;
        INX H&lt;br /&gt;
        DCR B       &lt;br /&gt;
        JNZ KIVON   ;ha végigértünk a 64 byte-on, akkor Z=1 lesz&lt;br /&gt;
        XCHG        ;HL és DE visszacserélése&lt;br /&gt;
        &lt;br /&gt;
        POP B&lt;br /&gt;
        POP H&lt;br /&gt;
        PUSH H      &lt;br /&gt;
        MVI D,0     &lt;br /&gt;
        MVI E,64&lt;br /&gt;
    POZ:    MOV A,M     ;A-ban a HL által mutatott címen lévő byte&lt;br /&gt;
        ANI 80H     ;maszkolás az előjel bitre&lt;br /&gt;
        JNZ PT      ;ha az előjel bit=1, akkor Z=0 és akkor negatív, így kihagyjuk a D növelését&lt;br /&gt;
        INR D       ;ha Z=1, akkor a szám pozitív és növeljük D-t&lt;br /&gt;
    PT: DCR E       &lt;br /&gt;
        JNZ POZ     ;amíg végig nem értünk Z=0&lt;br /&gt;
        MOV A,D     ;D-ben van a pozitív számok darabszáma&lt;br /&gt;
        STAX B      ;B címére elhelyezzük a darabszámot&lt;br /&gt;
        INX B       ;a B következő címére kerül a negatív számok darabszáma&lt;br /&gt;
&lt;br /&gt;
    ;pepita...&lt;br /&gt;
        POP H       &lt;br /&gt;
        PUSH H&lt;br /&gt;
        MVI D,0&lt;br /&gt;
        MVI E,64    &lt;br /&gt;
    NEG:    MOV A,M&lt;br /&gt;
        ANI 80H&lt;br /&gt;
        JZ NT&lt;br /&gt;
        INR D&lt;br /&gt;
    NT: DCR E&lt;br /&gt;
        JNZ NEG&lt;br /&gt;
        MOV A,D&lt;br /&gt;
        STAX B&lt;br /&gt;
        INX B       ;a B következő címére kerül a 0 értékű számok darabszáma&lt;br /&gt;
        &lt;br /&gt;
    ;0-k száma, pepita&lt;br /&gt;
        POP H&lt;br /&gt;
        MVI D,0&lt;br /&gt;
        MVI E,64&lt;br /&gt;
    NULL:   MOV A,M&lt;br /&gt;
        ORA 00H     ;egyedül itt van különbség, ha byte csupa 0, csak akkor lesz ORA 0H = 0-val és ezzel együtt Z=1&lt;br /&gt;
        JNZ NULT&lt;br /&gt;
        INR D&lt;br /&gt;
    NULT:   DCR E&lt;br /&gt;
        JNZ NEG&lt;br /&gt;
        MOV A,D&lt;br /&gt;
        STAX B&lt;br /&gt;
        RET&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Írja meg azt a programrészletet, amely meghívja a szubrutint a HL=8000h, DE=8800h és BC=9000h paraméterekkel, majd ellenőrzi, hogy a 9000h címtől kezdődő 3 byte összege valóban 64.  &lt;br /&gt;
        &lt;br /&gt;
        LXI H,8000H&lt;br /&gt;
        LXI D,8800H&lt;br /&gt;
        LXI B,9000H&lt;br /&gt;
        CALL RUTIN&lt;br /&gt;
        MOV C,0&lt;br /&gt;
        MOV D,3&lt;br /&gt;
        STC&lt;br /&gt;
        CMC&lt;br /&gt;
    ELL:    LDAX B&lt;br /&gt;
        ADC C&lt;br /&gt;
        MOV C,A&lt;br /&gt;
        DCR D&lt;br /&gt;
        JNZ ELL&lt;br /&gt;
        MOV A,64&lt;br /&gt;
        CMP C&lt;br /&gt;
        JZ JO&lt;br /&gt;
        STC     ;ezt itt a feladat nem kéri, de utólag vhogy el kell tudni dönteni, hogy az összeg valóban 64-e&lt;br /&gt;
        CMC     ;ezért ha nem jó akkor CY flag értéke 0 lesz, jó összeg esetén 1&lt;br /&gt;
        JMP VEGE        &lt;br /&gt;
    JO:     STC&lt;br /&gt;
    VEGE:   END&lt;br /&gt;
&lt;br /&gt;
Egy másik megoldás:&lt;br /&gt;
&lt;br /&gt;
        KISERED EQU 8000H&lt;br /&gt;
        KIVONANDO EQU 8800H&lt;br /&gt;
        ELOJEL EQU 9000H            &lt;br /&gt;
 &lt;br /&gt;
        LXI H,KISERED&lt;br /&gt;
        LXI D,KIVONANDO&lt;br /&gt;
                    ;LXI B,ELOJEL ;ELOJEL=POZITÍVAK, ELOJEL+1=negatívak, ELOJEL+2=nullák&lt;br /&gt;
        &lt;br /&gt;
    CIKLUS: MOV A,M&lt;br /&gt;
        PUSH PSW&lt;br /&gt;
        LDAX D&lt;br /&gt;
        MOV B,A&lt;br /&gt;
        POP PSW&lt;br /&gt;
        SUB B           ;AKKUMULÁTORBAN EREDMÉNY&lt;br /&gt;
        MOV M,A&lt;br /&gt;
        JZ NULL&lt;br /&gt;
        JP POZ&lt;br /&gt;
        PUSH H          ;(NEGATÍV ÁG)   &lt;br /&gt;
        LHLD ELOJEL+1&lt;br /&gt;
        INX H&lt;br /&gt;
        SHLD ELOJEL+1&lt;br /&gt;
        POP H&lt;br /&gt;
        JMP ELLEN&lt;br /&gt;
    NULL:   PUSH H          ;(0 ÁG) &lt;br /&gt;
        LHLD ELOJEL+2&lt;br /&gt;
        INX H&lt;br /&gt;
        SHLD ELOJEL+2&lt;br /&gt;
        POP H&lt;br /&gt;
        JMP ELLEN       &lt;br /&gt;
    POZ:    PUSH H          ;(POZITÍV ÁG)   &lt;br /&gt;
        LHLD ELOJEL&lt;br /&gt;
        INX H&lt;br /&gt;
        SHLD ELOJEL&lt;br /&gt;
        POP H&lt;br /&gt;
    ELLEN:  INX H&lt;br /&gt;
        INX D&lt;br /&gt;
        LXI B,KISERED+64&lt;br /&gt;
        MOV A,H&lt;br /&gt;
        CMP B&lt;br /&gt;
        JNZ CIKLUS&lt;br /&gt;
        MOV A,L&lt;br /&gt;
        CMP C&lt;br /&gt;
        JNZ CIKLUS&lt;br /&gt;
        LXI B,ELOJEL&lt;br /&gt;
 &lt;br /&gt;
        LXI H,ELOJEL&lt;br /&gt;
        MOV A,M&lt;br /&gt;
        INX H&lt;br /&gt;
        ADD M&lt;br /&gt;
        INX H&lt;br /&gt;
        ADD M&lt;br /&gt;
        CPI 64&lt;br /&gt;
        JZ JO&lt;br /&gt;
    NEMJO:  NOP         ;NEM JO!!!!!!!!!!&lt;br /&gt;
    JO: HALT&lt;br /&gt;
&lt;br /&gt;
=== 3. g.) ===&lt;br /&gt;
Írjon assembly szubrutint, amely a HL regiszterpárban kapott címen elhelyezkedő 00h végjelre végződő&lt;br /&gt;
karakterstringben megkeresi az első &#039;1&#039; számjegyet. (az ’1’ számjegy ASCII kódja 31h). Találat esetén a szubrutinból visszatéréskor a HL regiszterpár mutasson a megtalált karakter címére és CY = 0 legyen. Ha a keresett karakter nem található, akkor a szubrutin CY=1 értékkel térjen vissza. (Ilyenkor a HL regiszterpár a 00h végjelre mutasson.&lt;br /&gt;
&lt;br /&gt;
    RUTIN:  MVI B,00H&lt;br /&gt;
    KERES:  MVI A,31H&lt;br /&gt;
        CMP M       ;megnézzük, hogy a HL által mutatott címen lévő adat 31H-e&lt;br /&gt;
        JNZ TOV     &lt;br /&gt;
        JMP VEGT        ;ha megtaláltuk az &#039;1&#039; számjegyet, akkor Z=1 és ugrunk a VEGT (VÉGe és Találtunk)&lt;br /&gt;
 &lt;br /&gt;
    TOV:    MOV A,B     ;00 végjel figyelésére szolgál&lt;br /&gt;
        CMP M       ;ha HL által mutatott címen 00H található, akkor és csak akkor a kivonás eredménye 0 (Z=1)&lt;br /&gt;
        JZ VEGNT        ;ugrás a VÉGe és Nem Találtunk részre&lt;br /&gt;
        INX H       ;mutató növelése&lt;br /&gt;
        JMP KERES   &lt;br /&gt;
 &lt;br /&gt;
    VEGT:   STC     ;a HL címe ekkor automatikusan a keresett karakterre mutat, így csak a CY flaget kell állítani&lt;br /&gt;
        CMC     &lt;br /&gt;
        JMP VEGE&lt;br /&gt;
 &lt;br /&gt;
    VEGNT:  STC     ;itt is a megfelelő helyre mutat a HL, így csak CY:=1-t állítunk&lt;br /&gt;
         &lt;br /&gt;
    VEGE:   RET&lt;br /&gt;
&lt;br /&gt;
Egy másik megoldás:&lt;br /&gt;
        KC EQU 9100H        ;egyéni&lt;br /&gt;
        &lt;br /&gt;
    CIKLUS: MOV A,M&lt;br /&gt;
        CPI 31H&lt;br /&gt;
        JZ TALALT&lt;br /&gt;
        CPI 0&lt;br /&gt;
        JZ NULLTALALT           &lt;br /&gt;
        INX H&lt;br /&gt;
        JMP CIKLUS&lt;br /&gt;
    TALALT: STC&lt;br /&gt;
        CMC&lt;br /&gt;
        JMP VEGE&lt;br /&gt;
    NULLTALALT: STC&lt;br /&gt;
    VEGE:   HALT&lt;br /&gt;
&lt;br /&gt;
=== 3. h.) ===&lt;br /&gt;
Írjon assembly szubrutint, amely a HL regiszterpárban kapott címtől kezdődően átmásol 32 bájtot a DE regiszterpárban megadott kezdőcímen kezdődő memóriaterületre. A megoldás során ügyeljen arra, hogy a rutin ne változtassa meg a flag-ek állapotát és a BC regiszterpár értékét!&lt;br /&gt;
&lt;br /&gt;
Írjon assembly programrészletet, amely SID=1 esetén várakozzon SID=0-ra, majd SID=0 esetén a fenti szubrutin&lt;br /&gt;
meghívásával másoljon át 32 bájtot a 9000h memóriacímről a 9150h címre.&lt;br /&gt;
&lt;br /&gt;
    RUTIN:  PUSH PSW&lt;br /&gt;
        PUSH B&lt;br /&gt;
        &lt;br /&gt;
        MVI B,32&lt;br /&gt;
    MASOL:  XCHG        ;DE felcserélése HL-lel&lt;br /&gt;
        LDAX D      ;DE (=eredetileg HL) beírása az A-ba&lt;br /&gt;
        XCHG        ;visszacsere&lt;br /&gt;
        STAX D      ;beírjuk A-t az eredeti DE által mutatott címre&lt;br /&gt;
        INX H&lt;br /&gt;
        INX D&lt;br /&gt;
        DCR B   &lt;br /&gt;
        JNZ MASOL&lt;br /&gt;
        POP PSW&lt;br /&gt;
        POP B&lt;br /&gt;
        RET&lt;br /&gt;
&lt;br /&gt;
    ;programrészlet:&lt;br /&gt;
    VAR:    RIM&lt;br /&gt;
        ANI 80H&lt;br /&gt;
        JNZ VAR&lt;br /&gt;
        LXI H,9000H&lt;br /&gt;
        LXI D,9150H&lt;br /&gt;
        CALL RUTIN&lt;br /&gt;
        END&lt;br /&gt;
&lt;br /&gt;
Egy másik megoldás:&lt;br /&gt;
     VAR:    RIM&lt;br /&gt;
        ANI 80H     ;10000000B&lt;br /&gt;
        JNZ VAR&lt;br /&gt;
        LXI H,9000H&lt;br /&gt;
        LXI D,9150H&lt;br /&gt;
        CALL MASOL&lt;br /&gt;
        HALT&lt;br /&gt;
&lt;br /&gt;
            ;HL-ben és DE-ben már megvan a kezdõcímünk..&lt;br /&gt;
    &lt;br /&gt;
    MASOL:  PUSH PSW&lt;br /&gt;
        PUSH B&lt;br /&gt;
        LXI B,32&lt;br /&gt;
    CIKLUS: MOV A,M&lt;br /&gt;
        STAX D&lt;br /&gt;
        INX H&lt;br /&gt;
        INX D   &lt;br /&gt;
        DCX B&lt;br /&gt;
        MOV A,C&lt;br /&gt;
        ORA B&lt;br /&gt;
        JNZ CIKLUS&lt;br /&gt;
        POP B&lt;br /&gt;
        POP PSW&lt;br /&gt;
        RET&lt;br /&gt;
&lt;br /&gt;
=== 3. i.) ===&lt;br /&gt;
&lt;br /&gt;
Írjon assembly szubrutint, amely a DE regiszterpárban kapott címtől kezdődő 16 bájtot a blokk végétől kezdve visszafelé átmásol a HL regiszterpárban megadott címen kezdődő memóriaterületre (A forrás-blokk utolsó byte-ja van a cél-blokk első helyén). A megoldás során ügyeljen arra, hogy a rutin ne változtassa meg a flag-ek állapotát és a regiszterpárok értékét!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    RUTIN:  PUSH PSW&lt;br /&gt;
        PUSH B&lt;br /&gt;
        PUSH D&lt;br /&gt;
        PUSH H&lt;br /&gt;
        MVI B,16&lt;br /&gt;
    ;a DE-t megnöveljük 16-tal&lt;br /&gt;
    DENOV:  INX D&lt;br /&gt;
        DCR B&lt;br /&gt;
        JNZ DENOV   &lt;br /&gt;
        MVI B,16&lt;br /&gt;
    MASOL:  LDAX D&lt;br /&gt;
        XCHG&lt;br /&gt;
        STAX D&lt;br /&gt;
        XCHG&lt;br /&gt;
        INX H&lt;br /&gt;
        DCX D&lt;br /&gt;
        DCR B&lt;br /&gt;
        JNZ MASOL&lt;br /&gt;
        POP H&lt;br /&gt;
        POP D&lt;br /&gt;
        POP B&lt;br /&gt;
        POP PSW&lt;br /&gt;
        RET&lt;br /&gt;
&lt;br /&gt;
Egy másik megoldás:&lt;br /&gt;
        PUSH PSW&lt;br /&gt;
        PUSH B&lt;br /&gt;
        PUSH D&lt;br /&gt;
        PUSH H&lt;br /&gt;
        &lt;br /&gt;
        PUSH H&lt;br /&gt;
        LXI B,16&lt;br /&gt;
        DAD B&lt;br /&gt;
        MOV B,H&lt;br /&gt;
        MOV C,L&lt;br /&gt;
        XCHG&lt;br /&gt;
        LXI D,15&lt;br /&gt;
        DAD D&lt;br /&gt;
        XCHG&lt;br /&gt;
        POP H&lt;br /&gt;
        &lt;br /&gt;
    CIKLUS: LDAX D&lt;br /&gt;
        MOV M,A&lt;br /&gt;
        INX H&lt;br /&gt;
        DCX D&lt;br /&gt;
        MOV A,H&lt;br /&gt;
        CMP B&lt;br /&gt;
        JNZ CIKLUS&lt;br /&gt;
        MOV A,L&lt;br /&gt;
        CMP C&lt;br /&gt;
        JNZ CIKLUS&lt;br /&gt;
        &lt;br /&gt;
        POP H&lt;br /&gt;
        POP D&lt;br /&gt;
        POP B&lt;br /&gt;
        POP PSW&lt;br /&gt;
&lt;br /&gt;
=== 3. j.) ===&lt;br /&gt;
Írjon assembly szubrutint, amely a DE regiszterpárban kapott címtől kezdődő 16 bájtban megszámolja a negatív&lt;br /&gt;
számokat (feltételezve, hogy az adatok 8 bites kettes komplemensben ábrázolt előjeles számok), és a kapott eredményt elhelyezi a 8000h memória rekeszbe. A megoldás során ügyeljen arra, hogy a rutin ne változtassa meg a flag-ek állapotát és a regiszterpárok értékét!   &lt;br /&gt;
&lt;br /&gt;
    RUTIN:  PUSH PSW&lt;br /&gt;
        PUSH B&lt;br /&gt;
        PUSH D&lt;br /&gt;
        MVI B,16&lt;br /&gt;
        MVI C,0 &lt;br /&gt;
    SZAMOL: LDAX D&lt;br /&gt;
        ANI 80H&lt;br /&gt;
        JZ NEMNEG&lt;br /&gt;
        INR C       ;ha Z=0, akkor negatív a számunk, ekkor növelünk&lt;br /&gt;
    NEMNEG: DCR B&lt;br /&gt;
        JNZ SZAMOL&lt;br /&gt;
        MOV A,C&lt;br /&gt;
        STA 8000H&lt;br /&gt;
        POP D&lt;br /&gt;
        POP B&lt;br /&gt;
        POP PSW&lt;br /&gt;
        RET&lt;br /&gt;
&lt;br /&gt;
Egy másik megoldás:&lt;br /&gt;
&lt;br /&gt;
        PUSH PSW&lt;br /&gt;
        PUSH B&lt;br /&gt;
        PUSH D&lt;br /&gt;
        PUSH H&lt;br /&gt;
 &lt;br /&gt;
        LXI H,8000H&lt;br /&gt;
        MVI M,0&lt;br /&gt;
        MVI B,0&lt;br /&gt;
    CIKLUS: LDAX D&lt;br /&gt;
        ANI 80H&lt;br /&gt;
        CMP D       ;FELESLEGES&lt;br /&gt;
        JZ POZITIV&lt;br /&gt;
        INR M&lt;br /&gt;
    POZITIV:INX D&lt;br /&gt;
        INR B&lt;br /&gt;
        MOV A,B&lt;br /&gt;
        CPI 16&lt;br /&gt;
        JNZ CIKLUS&lt;br /&gt;
 &lt;br /&gt;
        POP H&lt;br /&gt;
        POP D&lt;br /&gt;
        POP B&lt;br /&gt;
        POP PSW&lt;br /&gt;
        HALT&lt;br /&gt;
&lt;br /&gt;
=== 3. k.) ===&lt;br /&gt;
Írjon assembly szubrutint, amely a HL regiszterpárban kapott címtől kezdődő 254 byte-os adatblokk végére kiszámít egy 2 byte-os ellenőrző szót (a blokk byte-jainak összeadásával), és elhelyezi az adatokat követően. A megoldás során ügyeljen arra, hogy a rutin ne változtassa meg a flag-ek állapotát és a regiszterpárok értékét!&lt;br /&gt;
&lt;br /&gt;
    RUTIN:  PUSH PSW&lt;br /&gt;
        PUSH B&lt;br /&gt;
        PUSH H&lt;br /&gt;
        PUSH D&lt;br /&gt;
        &lt;br /&gt;
        MVI B,254&lt;br /&gt;
        LXI D,0&lt;br /&gt;
        MVI A,0&lt;br /&gt;
    ELL:    PUSH H  &lt;br /&gt;
        MOV A,M     ;HL által mutatott címen lévő adat betöltése A-ba&lt;br /&gt;
        MOV L,A     ;a címen lévő adat, így már a címmutató regiszter alsó részén van (itt elfér nem kell hozzá a H reg)&lt;br /&gt;
        DAD D       ;HL+D -&amp;gt; HL&lt;br /&gt;
        XCHG        ;HL cseréje DE-vel (így DE-ben van az ellenőrző összeg)&lt;br /&gt;
        POP H       &lt;br /&gt;
        INX H       ;cím növelése&lt;br /&gt;
        DCR B&lt;br /&gt;
        JNZ ELL     ;amíg végig nem értünk&lt;br /&gt;
        MOV M,D     ;D betöltése a HL címre&lt;br /&gt;
        INX H&lt;br /&gt;
        MOV M,E     ;a következő byte-ra pedig az E kerül&lt;br /&gt;
            &lt;br /&gt;
        POP D&lt;br /&gt;
        POP H&lt;br /&gt;
        POP B&lt;br /&gt;
        POP PSW&lt;br /&gt;
        RET&lt;br /&gt;
&lt;br /&gt;
Egy másik megoldás:&lt;br /&gt;
&lt;br /&gt;
     PUSH PSW&lt;br /&gt;
     PUSH B&lt;br /&gt;
     PUSH D&lt;br /&gt;
     PUSH H&lt;br /&gt;
     &lt;br /&gt;
     XCHG            ;DE-ben kezdocim&lt;br /&gt;
     LXI H,0         ;reszosszeg HL-ben&lt;br /&gt;
     MVI A,0         ;itt számoljuk a 254 db-ot&lt;br /&gt;
 CIKLUS: PUSH PSW&lt;br /&gt;
     LDAX D&lt;br /&gt;
     MVI B,0&lt;br /&gt;
     MOV C,A&lt;br /&gt;
     DAD B&lt;br /&gt;
     INX D&lt;br /&gt;
     POP PSW&lt;br /&gt;
     INR A&lt;br /&gt;
     CPI 254&lt;br /&gt;
     JNZ CIKLUS&lt;br /&gt;
     MOV A,L&lt;br /&gt;
     STAX D&lt;br /&gt;
     INX D&lt;br /&gt;
     MOV A,H&lt;br /&gt;
     STAX D&lt;br /&gt;
     &lt;br /&gt;
     POP H&lt;br /&gt;
     POP D&lt;br /&gt;
     POP B&lt;br /&gt;
     POP PSW&lt;br /&gt;
&lt;br /&gt;
=== 3. l.) ===&lt;br /&gt;
Írjon assembly szubrutint, amely 15 byte adatot és egy byte ellenőrző karaktert tartalmazó üzenet átvitelét ellenőrzi. A szubrutin bemenete az üzenet kezdőcíme (HL-ben), kimenete legyen hibátlan átvitel esetén Z=1, hibás átvitelkor Z=0. A megoldás során ügyeljen arra, hogy a rutin ne változtassa meg a regiszterpárok (BC,DE,HL) értékét!&lt;br /&gt;
&lt;br /&gt;
    RUTIN:  PUSH B&lt;br /&gt;
        PUSH H&lt;br /&gt;
        PUSH D&lt;br /&gt;
        PUSH H&lt;br /&gt;
        XCHG        ;HL és DE cseréje&lt;br /&gt;
        MVI H,16        ;16 byte másolására fog sorra kerülni&lt;br /&gt;
        LXI B,0     ;ahova másolunk, az a 0-s címen található (feltesszük, hogy a HL címe és ez nem lapolódik össze)&lt;br /&gt;
        PUSH B&lt;br /&gt;
    MASOL:  LDAX D      ;DE által mutatot cím tartalma az A-ban lesz&lt;br /&gt;
        STAX B      ;az A tartalma a BC címre kiíródik&lt;br /&gt;
        INX D&lt;br /&gt;
        INX B&lt;br /&gt;
        DCR H&lt;br /&gt;
        JNZ MASOL&lt;br /&gt;
        &lt;br /&gt;
        POP B       ;a BC-t visszacsökkentjük az eredetire&lt;br /&gt;
        MVI D,16&lt;br /&gt;
    ELL:    LDAX B      ;a BC-n és HL-n található byte-okat kivonogatjuk egymásból&lt;br /&gt;
        SUB M&lt;br /&gt;
        JZ HIBA     ;ha a kivonás eredménye 1, akkor hiba van&lt;br /&gt;
        DCR D   &lt;br /&gt;
        JNZ ELL &lt;br /&gt;
    NOHIBA: XRA A       ;Z-t 1-be állítjuk&lt;br /&gt;
        JMP VEGE        ;és átugorjuk a HIBA részt&lt;br /&gt;
    HIBA:   MOV A,FFH&lt;br /&gt;
        ORA A       ;ezzel a Z-t 0-ba állítottuk&lt;br /&gt;
    VEGE:   POP D&lt;br /&gt;
        POP H&lt;br /&gt;
        POP B&lt;br /&gt;
        RET&lt;br /&gt;
&lt;br /&gt;
Egy másik megoldás:&lt;br /&gt;
&lt;br /&gt;
 RUTIN:&lt;br /&gt;
     PUSH B&lt;br /&gt;
     PUSH D&lt;br /&gt;
     PUSH H          &lt;br /&gt;
     &lt;br /&gt;
     XCHG&lt;br /&gt;
     LXI H,0&lt;br /&gt;
     MVI A,0&lt;br /&gt;
 CIKLUS: PUSH PSW&lt;br /&gt;
     LDAX D&lt;br /&gt;
     MVI B,0 &lt;br /&gt;
     MOV C,A&lt;br /&gt;
     DAD B&lt;br /&gt;
     INX D&lt;br /&gt;
     POP PSW&lt;br /&gt;
     INR A&lt;br /&gt;
     CPI 15&lt;br /&gt;
     JNZ CIKLUS&lt;br /&gt;
     LDAX D&lt;br /&gt;
     CMP L       ;BE VAN ALLITVA A Z FLAG&lt;br /&gt;
 &lt;br /&gt;
     POP H&lt;br /&gt;
     POP D&lt;br /&gt;
     POP B&lt;br /&gt;
 &lt;br /&gt;
     RET&lt;br /&gt;
&lt;br /&gt;
=== 3. m.) ===&lt;br /&gt;
&lt;br /&gt;
Írjon Intel 8085 mikroprocesszor assembly nyelvén a PORTOLV szubrutint, amely a a CPU SID jelének 0 -&amp;gt; 1 átmenetére beolvassa 64H I/O című portot és az adatot az akkumulátorban adja vissza a szubrutint meghívó&lt;br /&gt;
programrésznek.&lt;br /&gt;
&lt;br /&gt;
Írjon a OLV32 szubrutint, amely a PORTOLV szubrutin felhasználásával beolvas 32 byte-ot és elhelyezi a memória 2000H-201FH memóriatartományában. Az OLV32 szubrutin változatlan tartalommal adja vissza a meghívó&lt;br /&gt;
programnak a CPU regisztereket.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    PORTOLV:&lt;br /&gt;
    VAR1:   RIM&lt;br /&gt;
        ANI 80H&lt;br /&gt;
        JNZ VAR1        ;ha SID=0, akkor Z=1 lesz és akkor mehetünk tovább&lt;br /&gt;
    VAR2:   RIM&lt;br /&gt;
        ANI 80H&lt;br /&gt;
        JZ VAR2     ;megvárjuk, míg SID=1 lesz  &lt;br /&gt;
        IN 64H&lt;br /&gt;
        RET&lt;br /&gt;
&lt;br /&gt;
    OLV32:  PUSH PSW&lt;br /&gt;
        PUSH B&lt;br /&gt;
        PUSH D&lt;br /&gt;
        LXI B,2000H&lt;br /&gt;
        MVI D,32&lt;br /&gt;
    MASOL:  CALL PORTOLV&lt;br /&gt;
        STAX B&lt;br /&gt;
        INX B&lt;br /&gt;
        DCR D&lt;br /&gt;
        JNZ MASOL&lt;br /&gt;
        &lt;br /&gt;
        POP D&lt;br /&gt;
        POP B&lt;br /&gt;
        POP PSW&lt;br /&gt;
        RET&lt;br /&gt;
&lt;br /&gt;
Egy másik megoldás:&lt;br /&gt;
     &lt;br /&gt;
 PORTOLV:&lt;br /&gt;
     RIM&lt;br /&gt;
     ANI 80H&lt;br /&gt;
     JZ PORTOLV&lt;br /&gt;
     IN 64H&lt;br /&gt;
     RET&lt;br /&gt;
 &lt;br /&gt;
 OLV32:&lt;br /&gt;
     PUSH PSW&lt;br /&gt;
     PUSH B&lt;br /&gt;
     PUSH D&lt;br /&gt;
     PUSH H&lt;br /&gt;
     &lt;br /&gt;
     KC EQU 2000H&lt;br /&gt;
     VC EQU 201FH&lt;br /&gt;
     LXI H,KC&lt;br /&gt;
     LXI D,VC+1&lt;br /&gt;
 CIKLUS: &lt;br /&gt;
     CALL PORTOLV&lt;br /&gt;
     MOV M,A&lt;br /&gt;
     INX H&lt;br /&gt;
     MOV A,L&lt;br /&gt;
     CMP E&lt;br /&gt;
     JNZ CIKLUS&lt;br /&gt;
     MOV A,H&lt;br /&gt;
     CMP D&lt;br /&gt;
     JNZ CIKLUS&lt;br /&gt;
     &lt;br /&gt;
     POP H&lt;br /&gt;
     POP D&lt;br /&gt;
     POP B&lt;br /&gt;
     POP PSW&lt;br /&gt;
     RET&lt;br /&gt;
&lt;br /&gt;
=== 3. n.) ===&lt;br /&gt;
Írja meg a SENDBYTE 8085 assembly szubrutint, amely a következő specifikáció szerint működik:&lt;br /&gt;
A szubrutin feladata a mellékelt ábrán specifikált hand-shake szekvencia alapján a B regiszterben kapott adat byte továbbítása a 20H I/O címre. A megoldás során ügyeljen arra, hogy a szubrutin a flag-ek értékét ne változtassa meg! Rajzolja fel a szubrutin mellé a rutin folyamatábráját is!&lt;br /&gt;
&lt;br /&gt;
Hand-shake: rajz&lt;br /&gt;
* először megjelenik az érvényes adat a porton&lt;br /&gt;
* majd a SOD jel 0 -&amp;gt; 1 átmenete után (némi várakozás után min kb. 320 ns) a SID jel is 0 -&amp;gt; 1-be váltjuk&lt;br /&gt;
* utána a SOD 0-ba vált (ekkor a porton az adatvezeték nagyimpedanciás lesz/nem lesz adat), ezután a SID is 0-ba váltjuk&lt;br /&gt;
* a lényeg, hogy a SOD 1-be váltását követően de még a 0-ba váltását megelőzően ki kell olvasni az adatot és be kell állítani a megfelelő állapotba a SID-et&lt;br /&gt;
&lt;br /&gt;
Írjon 8085 assembly kódrészletet, mely a 2345h címtől kezdődő 34 byte adatot a SENDBYTE szubrutin segítségével továbbítja.&lt;br /&gt;
&lt;br /&gt;
    SENDBYTE:       ;ez túl sok karakternek tűnik :)&lt;br /&gt;
        PUSH PSW&lt;br /&gt;
    VAR:    RIM&lt;br /&gt;
        ANI 80H&lt;br /&gt;
        JNZ VAR&lt;br /&gt;
        MOV A,B&lt;br /&gt;
        OUT 20H&lt;br /&gt;
        RIM&lt;br /&gt;
        MVI A,0C0H  ;11000000B&lt;br /&gt;
        SIM&lt;br /&gt;
    WSID0:  RIM     &lt;br /&gt;
        ANI 80H&lt;br /&gt;
        JZ WSID0&lt;br /&gt;
        RET&lt;br /&gt;
&lt;br /&gt;
    ;programrészlet&lt;br /&gt;
        LXI D,2345H&lt;br /&gt;
        MVI H,34&lt;br /&gt;
    MASOL:  LDAX D&lt;br /&gt;
        MOV B,A&lt;br /&gt;
        CALL SENDBYTE&lt;br /&gt;
        DCR H&lt;br /&gt;
        JNZ MASOL&lt;br /&gt;
&lt;br /&gt;
Egy másik megoldás:&lt;br /&gt;
 SENDBYTE:&lt;br /&gt;
     RIM&lt;br /&gt;
     ANI 80H&lt;br /&gt;
     JNZ SENDBYTE&lt;br /&gt;
     MOV A,B&lt;br /&gt;
     OUT 20H&lt;br /&gt;
     RIM&lt;br /&gt;
     ORI C0H     ;11000000B&lt;br /&gt;
     SIM&lt;br /&gt;
 VARSID1:RIM&lt;br /&gt;
     ANI 80H&lt;br /&gt;
     JZ VARSID1&lt;br /&gt;
     RIM&lt;br /&gt;
     ANI 7FH     ;01111111B&lt;br /&gt;
     ORI 40H     ;01000000B&lt;br /&gt;
     RET&lt;br /&gt;
&lt;br /&gt;
=== 3. o.) ===&lt;br /&gt;
Írjon 8085 assembly szubrutint, amely a következő specifikáció szerint működik:&lt;br /&gt;
* A szubrutin (GETBLOCK) feladata a 80H I/O címen elhelyezkedő 8255 párhuzamos periféria illesztő A portján 1-es üzemmódban az RST 5.5 IT-vel érkező 32 byte-os adatblokk és a hozzá tartozó 1 byte-os ellenőrző összeg beolvasása. A rutin a beolvasott adatokat a 9000h címtől kezdődően helyezze el. Az ellenőrző összeg számítási algoritmusa:&lt;br /&gt;
* Ai mod 256  1=&amp;lt;i=&amp;lt;32&lt;br /&gt;
* A rutin Z=1-gyel jelezze, ha az ellenőrző összeg helyes, Z=0-val, ha hibás volt. Mindkét esetben az&lt;br /&gt;
akkumulátor a helyes (a számított) ellenőrző összeget tartalmazza! (A rutin bármely regiszter értékét elronthatja!)&lt;br /&gt;
&lt;br /&gt;
* Írja meg a 8255-öst felprogramozó szubrutint (A port: 1-es üzemmód, bemenet; B port: 0-ás üzemmód, kimenet; C port:&lt;br /&gt;
bemenet)&lt;br /&gt;
&lt;br /&gt;
    FELPROG:    &lt;br /&gt;
        MOV A,10111001B&lt;br /&gt;
        OUT 83H&lt;br /&gt;
        RET&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Írja meg azt az RST 5.5-ös IT rutint, amely a 8001h címen elhelyezkedő byte legmagasabb helyértékű bitjének&lt;br /&gt;
bebillentésével jelzi, ha beolvasott egy adatot. Az adat ilyenkor a 8000h memória címen található.  &lt;br /&gt;
&lt;br /&gt;
        ORG 2CH&lt;br /&gt;
    RST55:  LXI D,8001H&lt;br /&gt;
        LDAX D&lt;br /&gt;
        XRI 01H&lt;br /&gt;
        STAX D  &lt;br /&gt;
        RET&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Írja meg a GETBLK szubrutint, az RST 5.5-ös IT rutin használatával Feltételezheti, hogy a rutin hívásakor az RST5.5 IT már engedélyezve van, de ne feledkezzen meg arról, hogy inicializáláskor a megszakítást a 8255-ösben letiltottuk!&lt;br /&gt;
&lt;br /&gt;
    GETBLK: EI&lt;br /&gt;
        MVI B,32        ;32 byte beolvasása&lt;br /&gt;
        MVI C,0     ;az ellenőrző összeg számításához&lt;br /&gt;
        LXI D,9000H &lt;br /&gt;
    BEOLV:  IN 80H&lt;br /&gt;
        CALL RST55&lt;br /&gt;
        STAX D&lt;br /&gt;
        ADD C&lt;br /&gt;
        INX D&lt;br /&gt;
        DCR B&lt;br /&gt;
        JNZ BEOLV&lt;br /&gt;
        LDAX D      ;az ellenőrző összeg beolvasása, a 32 byte-os adatblokk után következik&lt;br /&gt;
        CMP C&lt;br /&gt;
        MOV A,C&lt;br /&gt;
        DI  &lt;br /&gt;
        RET&lt;br /&gt;
&lt;br /&gt;
Egy másik megoldás:&lt;br /&gt;
&lt;br /&gt;
 ORG 2CH:JMP 1000H&lt;br /&gt;
 ORG 1000H:&lt;br /&gt;
     IN 80H&lt;br /&gt;
     MOV M,A&lt;br /&gt;
     PUSH H&lt;br /&gt;
     XCHG        ;HL-ben RESZOSSZEG&lt;br /&gt;
     MOV E,A&lt;br /&gt;
     MVI D,0&lt;br /&gt;
     DAD D       ;HL-ben uj reszosszeg       &lt;br /&gt;
     XCHG        ;DE-ben .............&lt;br /&gt;
     POP H       ;HL-ben cim (9000H)&lt;br /&gt;
     INX H&lt;br /&gt;
     DCR C&lt;br /&gt;
     EI&lt;br /&gt;
     RET&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 RUTIN:  MVI A,B9H   ;10111001B&lt;br /&gt;
     OUT 83H&lt;br /&gt;
     LXI H,9000H&lt;br /&gt;
     LXI D,0&lt;br /&gt;
     MVI C,32&lt;br /&gt;
 KORBE:  MVI A,0&lt;br /&gt;
     CMP C&lt;br /&gt;
     JNZ KORBE&lt;br /&gt;
     MOV A,M&lt;br /&gt;
     CMP E&lt;br /&gt;
     MOV A,E         &lt;br /&gt;
     RET&lt;br /&gt;
&lt;br /&gt;
 ORG 2CH:JMP1000H&lt;br /&gt;
 ORG 1000H:&lt;br /&gt;
     LXI H,8001H&lt;br /&gt;
     MOV A,M&lt;br /&gt;
     ANI 01111111B&lt;br /&gt;
     MOV M,A&lt;br /&gt;
     IN 80H&lt;br /&gt;
     LXI H,8000H&lt;br /&gt;
     MOV M,A&lt;br /&gt;
     LXI H,8001H&lt;br /&gt;
     MOV A,M&lt;br /&gt;
     ORI 10000000B&lt;br /&gt;
     MOV M,A&lt;br /&gt;
     EI&lt;br /&gt;
     RET&lt;br /&gt;
&lt;br /&gt;
=== 3. p.) ===&lt;br /&gt;
&lt;br /&gt;
Készítse el egy 8251 típusú USART-ot tartalmazó soros adó/vevő áramkör terveit és az aszinkron vételi folyamatot megvalósító szubrutin programját.Az USART áramkör a 80h és 81h port címterületet foglalja el.&lt;br /&gt;
Írja meg az áramkört inicializáló és a vételi folyamatot engedélyező programrészt! Az átvitel paraméterei:&lt;br /&gt;
* aszinkron adás és vétel&lt;br /&gt;
* egyszeres Baud-rate&lt;br /&gt;
* 8 adatbit, páros paritás, 1 STOP bit&lt;br /&gt;
* adás letiltva, vétel engedélyezve&lt;br /&gt;
&lt;br /&gt;
    ;programrész&lt;br /&gt;
        MOV A,01111101B     ;119.o./ aszinkron átvitelre vonatkozó Mode Instruction&lt;br /&gt;
        OUT 80H&lt;br /&gt;
        MOV A,11100110B     ;121.o./ Command Instruciton&lt;br /&gt;
        OUT 80H         ;elvileg ugyanarra a címre kell küldeni, mint a Mode Instr.-t&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
Írja meg a 8251-es áramkörön keresztül 32 adatbyte-ot ciklikus lekérdezéssel beolvasó szubrutint, amely az adatot a memória 8000h - 801Fh tartományába írja be! A szubrutinban feltételezheti, hogy a vétel során nem lép fel hiba!&lt;br /&gt;
* a 116.o. alján találhatók szerint a 8251-esen keresztüli adatbeolvasáshoz a C/D(negált)-nak 0-nak kell lennie&lt;br /&gt;
* arra nem jöttem rá, hogy hogyan lehet ezt állítani, lehet, hogy a feladat szerint feltesszük azt, hogy a megfelelő állapotban van&lt;br /&gt;
&lt;br /&gt;
    BEOLV:  LXI D,8000H&lt;br /&gt;
        MVI C,32&lt;br /&gt;
    OLV:    IN 80H&lt;br /&gt;
        STAX D&lt;br /&gt;
        INX D&lt;br /&gt;
        DCR C&lt;br /&gt;
        JNZ OLV&lt;br /&gt;
&lt;br /&gt;
== 4. feladat ==&lt;br /&gt;
&lt;br /&gt;
=== 4. a.) ===&lt;br /&gt;
&lt;br /&gt;
    ;kód            ;PC    ;adatsín ;/RD v. /WR   ;megjegyzés&lt;br /&gt;
    -----------------------------------------------------------------------------------&lt;br /&gt;
    ORG 0000h                                  direktíva&lt;br /&gt;
    LXI SP,0h       0000   31H      /RD&lt;br /&gt;
                    0001   00       /RD&lt;br /&gt;
                    0002   00       /RD        SP=0000H&lt;br /&gt;
    RST 7           0003   FFH      /RD        itt ugrik a 0038H-ra    &lt;br /&gt;
                    FFFF   00       /WR&lt;br /&gt;
                    FFFD   04       /WR        ;SP=FFFD&lt;br /&gt;
    HLT                                        hát ez most kimarad!&lt;br /&gt;
    ORG 38h                                    direktíva&lt;br /&gt;
    XRA A           0038   AEH      /RD        kinullázza A-t, így Z flag=1 lesz&lt;br /&gt;
    LXI H,0F000h    0039   3AH      /RD&lt;br /&gt;
                    0040   00H      /RD&lt;br /&gt;
                    0041   F0H      /RD        HL=F000H&lt;br /&gt;
    MOV M,A         0042   77H      /RD        az F000H címre 0-t tölt be&lt;br /&gt;
    ORA M           0043   B6H      /RD        0 OR 0=0 -&amp;gt; Z=1&lt;br /&gt;
    JNZ 38h         0044   C2H      /RD        feltétel nem teljesül így csak 1 byte-os az ut.&lt;br /&gt;
    RET             0045   C9H      /RD        PC=0000 , SP=0002&lt;br /&gt;
&lt;br /&gt;
=== 4. f.) ===&lt;br /&gt;
&lt;br /&gt;
    ;kód            ;PC    ;adatsín ;/RD vagy /WR   ;megjegyzés&lt;br /&gt;
    --------------------------------------------------------------------&lt;br /&gt;
    ORG 0000h                             direktíva                                      &lt;br /&gt;
    LXI H,9000h     0000   21H     /RD&lt;br /&gt;
                    0001   00H     /RD&lt;br /&gt;
                    0002   90H     /RD    HL=9000H&lt;br /&gt;
    SPHL            0003   F9H     /RD    SP=HL=9000H&lt;br /&gt;
    LXI H,0100h     0004   21H     /RD    &lt;br /&gt;
                    0005   00H     /RD&lt;br /&gt;
                    0006   01H     /RD    HL=0100H&lt;br /&gt;
    PCHL            0007   E9H     /RD    PC=0100H&lt;br /&gt;
    HLT                                   ez most kimarad! (de később idejutunk)&lt;br /&gt;
    CALL 0102h                            ez is! (de ide később se jutunk el)&lt;br /&gt;
    ORG 0100h                             direktíva&lt;br /&gt;
    MVI A,45h       0100   3EH     /RD&lt;br /&gt;
                    0101   45H     /RD    A=45H&lt;br /&gt;
    LXI B,1234h     0102   01H     /RD    &lt;br /&gt;
                    0103   34H     /RD&lt;br /&gt;
                    0104   12H     /RD    BC=1234H&lt;br /&gt;
    XRA C           0105   A9H     /RD    A=34 XOR 45 =   00110100&lt;br /&gt;
                                                  XOR     01000101        &lt;br /&gt;
                                                          -----------&lt;br /&gt;
                                                          01110001= 71H =A, Z flag=0&lt;br /&gt;
    PUSH B          0106   C5H     /RD    &lt;br /&gt;
                    8FFF   34H     /WR&lt;br /&gt;
                    8FFE   12H     /WR    SP=8FFE&lt;br /&gt;
    XRA B           0107   A8H     /RD    A=01100010B= 62H ,  Z flag=0&lt;br /&gt;
    POP D           0108   D1H     /RD&lt;br /&gt;
                    8FFE   12H     /RD&lt;br /&gt;
                    8FFF   34H     /RD    D=1234H&lt;br /&gt;
    HLT             0109   76H     /RD    &lt;br /&gt;
    JMP 0008h       010A   C3H     /RD&lt;br /&gt;
                    010B   08H     /RD&lt;br /&gt;
                    010C   00H     /RD&lt;br /&gt;
    HLT:  ez kimarad mert előtte ugrunk az 1. HLT-re (PC=0008), ahol a progi befagy&lt;br /&gt;
&lt;br /&gt;
== 5. feladat ==&lt;br /&gt;
&lt;br /&gt;
=== 5. a.) ===&lt;br /&gt;
&lt;br /&gt;
Az alábbi kódrészlettel a 8000h címen elhelyezkedő 500 byte-os memóriaterület modulo 256-os ellenőrző&lt;br /&gt;
összegét szeretnénk kiszámolni, és a memória területet követő byte-ban eltárolni. A program hibásan működik.&lt;br /&gt;
Miért? &lt;br /&gt;
&lt;br /&gt;
        LXI H,8000h&lt;br /&gt;
        LXI D,500&lt;br /&gt;
        XRA A&lt;br /&gt;
    ciklus:     &lt;br /&gt;
        ADD M&lt;br /&gt;
        INX H&lt;br /&gt;
        DCX D&lt;br /&gt;
        JNZ ciklus&lt;br /&gt;
        MOV M,A&lt;br /&gt;
&lt;br /&gt;
Válasz: a DCX utasítás nem állítja a Z flaget, így a JNZ utasítás nem működik&lt;br /&gt;
&lt;br /&gt;
=== 5. b.) ===&lt;br /&gt;
Egy i8085-ös mikroszámítógép megszakítási rendszerének megvalósításakor i8259A megszakításvezérlőt&lt;br /&gt;
alkalmaztunk, amely báziscíme 20h. Az alábbi megszakítást úgy szeretnénk megvalósítani, hogy&lt;br /&gt;
bármelyik másik megszakítás-bemenetre érkező kérés azonnal érvényre juthasson mielőtt maga az IRUT rutin&lt;br /&gt;
befejeződik. A program hibásan van megírva. Miért? Mit kellene kijavítani?&lt;br /&gt;
&lt;br /&gt;
    IRUT:   PUSH PSW&lt;br /&gt;
        PUSH B&lt;br /&gt;
        EI&lt;br /&gt;
        OUT 41h&lt;br /&gt;
        IN 40h&lt;br /&gt;
        ADI 1&lt;br /&gt;
        OUT 40h&lt;br /&gt;
        MVI B,3&lt;br /&gt;
    CIKL:   IN 40h&lt;br /&gt;
        ACI 0&lt;br /&gt;
        OUT 40h&lt;br /&gt;
        DCR B&lt;br /&gt;
        JNZ CIKL&lt;br /&gt;
        POP B&lt;br /&gt;
        MVI A,20h&lt;br /&gt;
        OUT 20h&lt;br /&gt;
        POP PSW&lt;br /&gt;
        RET&lt;br /&gt;
&lt;br /&gt;
Az a hiba, hogy a megszakítás vezérlőben az IT nyugtázása (EOI) csak az IT rutin végén történik meg (MVI A,20h; OUT 20h), ezért az alacsonyabb prioritású interruptok csak ez után jutnának érvényre.&lt;br /&gt;
&lt;br /&gt;
=== 5. c.) ===&lt;br /&gt;
&lt;br /&gt;
Ugyanaz mint az [[#5. a.)]]&lt;br /&gt;
&lt;br /&gt;
=== 5. d.) ===&lt;br /&gt;
&lt;br /&gt;
Az alábbi kódrészlettel a 8000h címen elhelyezkedő szót (16bit) szeretnénk hozzáadni a 8150h címen&lt;br /&gt;
elhelyezkedő szóhoz úgy, hogy az eredmény a 8000h címre kerüljön (A szó alacsonyabb helyértékű bájtja&lt;br /&gt;
(LSB) mindig a kisebb címen helyezkedik el.). A program hibásan működik. Miért? Mit kellene kijavítani?&lt;br /&gt;
&lt;br /&gt;
    Osszead:    LXI H,8000h&lt;br /&gt;
        LDA 8150h&lt;br /&gt;
        ADD M       &lt;br /&gt;
        MOV M,A&lt;br /&gt;
        INX H&lt;br /&gt;
        LDA 8151h&lt;br /&gt;
        ADD M       ;itt ADC M kell, mert lehet átvitel a előző byte-ok összadása során&lt;br /&gt;
        MOV M,A&lt;br /&gt;
        RET&lt;br /&gt;
    &lt;br /&gt;
== 6. feladat ==&lt;br /&gt;
&lt;br /&gt;
Ehhez létezik egy javításokat tartalmazó PDF. [[Media:Digit2_ef_V2_megold_6-7-javitott.pdf|Megtekintés.]]&lt;br /&gt;
&lt;br /&gt;
=== 6. a.) ===&lt;br /&gt;
&lt;br /&gt;
;Egy kaszkádosított megszakításkezelő rendszerben, milyen esetben kell parancsbyte-ban megadni a SLAVE megszakításkezelőknek, hogy slave áramkörök? &lt;br /&gt;
:Kaszkádosítás esetén, bufferelt kapcsolás esetén (62.o./3.5. , 63.o./3.6.3.)&lt;br /&gt;
&lt;br /&gt;
;Ebben az esetben hány ICW parancsbyte-ot kell kiadni és miért? &lt;br /&gt;
:4, ICW1-4 (66.o./ 3.6.2. - 3.6.3.) ICW3 a kaszkádosítás miatt kell, az ICW4 pedig a bufferelt kapcsolás miatt (M/S bit)&lt;br /&gt;
&lt;br /&gt;
;Miért van szükség ICW3 parancsbyte-ra? &lt;br /&gt;
:Mert kaszkádosott megszakításkezelő rendszert használunk&lt;br /&gt;
&lt;br /&gt;
;Miért van szükség ICW4 parancsbyte-ra?&lt;br /&gt;
:A master-slave pozíciókat az ICW-4-el lehet beállítani (bufferelt üzemmód esetén szükséges) (M/S bit)&lt;br /&gt;
&lt;br /&gt;
=== 6. b.) === &lt;br /&gt;
Inicializáljon egy 90h báziscímű i8255-ös párhuzamos periféria áramkör: A portját 1-es üzemmódban kimenetre, B portját szintén 1 üzemmódban bemenetre, C port alsó és felső felét bemenetre kell állítani. Adja meg a vezérlő szó értékét! Állítsa be a 8255 INTE ff-jainak értékét is!&lt;br /&gt;
&lt;br /&gt;
    MOV A,10101111B     ;95.o./5.1 táblázat&lt;br /&gt;
    OUT 93H             ;94.o./működési tábla&lt;br /&gt;
    DI&lt;br /&gt;
&lt;br /&gt;
:gondolom az INTE ff-kat mind 0-ra kell állítani, mert ha 1 lenne, akkor az üzembe helyezést követően már kérne megszakítást&lt;br /&gt;
:de az üzemmód megváltoztatásakor a f/f-k törlődnek,így ehhez sztem külön parancs nem szükséges&lt;br /&gt;
&lt;br /&gt;
=== 6. c.) ===&lt;br /&gt;
Egy vegyesen kaszkádosított 8259-es megszakítási rendszerben a MASTER egység IR2 bemenetére SLAVE áramkör&lt;br /&gt;
kapcsolódik. A MASTER egység ugrási táblájának kezdőcíme 8000h, a SLAVE ugrási táblájának kezdőcíme 9000h,&lt;br /&gt;
mindkettő nyolcas osztásban.&lt;br /&gt;
&lt;br /&gt;
Adja meg, hogy milyen ICW3 parancsot kell küldeni a MASTER illetve a SLAVE egységeknek!&lt;br /&gt;
&lt;br /&gt;
    LXI D,8000H ;MASTER&lt;br /&gt;
    MOV A,0000100B&lt;br /&gt;
    INX D&lt;br /&gt;
    STAX D&lt;br /&gt;
&lt;br /&gt;
    LXI H,9001H ;SLAVE, másik módszerrel&lt;br /&gt;
    MOV A,0000010B&lt;br /&gt;
    MOV M,A&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
; Adja meg, mennyi lesz a MASTER IR6 bemenetére érkező megszakítás szubrutinjának kezdőcíme!&lt;br /&gt;
: 802CH (65.o. ADI=0 esetén táblázat)&lt;br /&gt;
&lt;br /&gt;
Adja meg, mennyi lesz a SLAVE IR6 bemenetére érkező megszakítás szubrutinjának kezdőcíme!&lt;br /&gt;
-902CH (65.o. ADI=0 esetén táblázat)&lt;br /&gt;
&lt;br /&gt;
=== 6. d.)===&lt;br /&gt;
Egy aszinkron üzemmódba felprogramozott 8251-es soros áramkör hibásan működik. A program státusz beolvasáskor olyan hibákat olvas, amelyek adat fogadásakor lépnek fel. Melyek lehetnek ezek, mi lehet a hibák oka ?&lt;br /&gt;
&lt;br /&gt;
# OVERRUN ERROR (=túlfutási hiba), akkor ha a puffer-regiszter megelőző tartalmát a CPU még nem olvasta ki és ezt a 8251 felülírja&lt;br /&gt;
# FRAMING ERROR (=kerethiba): 0 színtű STOP bitek érkeznek&lt;br /&gt;
# PARITY ERROR (=paritás hiba): rossz paritás&lt;br /&gt;
&lt;br /&gt;
===6. e.)===&lt;br /&gt;
Mit jelent a BREAK üzemmód a 8251-es áramkörnél? &lt;br /&gt;
* aszinkron üzemmódban folyamatos kiküldhetők a vonalra, ha nincs folyamatban adatkivitel, állapotjelzésre is szolgálhat&lt;br /&gt;
&lt;br /&gt;
Mire alkalmazható? &lt;br /&gt;
* felhasználható megszakításkérés jelzésére&lt;br /&gt;
&lt;br /&gt;
Hogyan lehet beállítani?&lt;br /&gt;
* beállítása: a Command Instruction 3. bitje, a SBRK =1 esetén a TXD=0 lesz (Break karakter)&lt;br /&gt;
&lt;br /&gt;
=== 6. f.)===&lt;br /&gt;
Rajzolja fel egy aszinkron üzemmódban felprogramozott USART kimeneti jelalakját (TxD) 8 bites, 0Fh értékű adat elküldésekor, ha páros paritást és 1 stop bitet alkalmazunk.&lt;br /&gt;
&lt;br /&gt;
    0   1   1   1   1   0   0   1&lt;br /&gt;
       ___ ___ ___ ___         ___&lt;br /&gt;
   ___|               |___ ___|&lt;br /&gt;
&lt;br /&gt;
=== 6. g.)===&lt;br /&gt;
Egy i8085-ös mikroprocesszoros rendszerben az A, B, C jelek külön kártyákon állnak elő, változásuk egymástól független, de mindannyian szeretnének időszakosan megszakítást kérni a processzor RST5.5 vonalán. Milyen kimenetű kapukat kell a szaggatottal jelölt dobozokba tervezni, hogy a rendszer helyesen működjön, miért?&lt;br /&gt;
* Open collector, mivel a kimeneteket összekötöttük, és a rendszer tartalmazott közvetlen felhúzó ellenállást&lt;br /&gt;
&lt;br /&gt;
=== 6. h.) ===&lt;br /&gt;
Egy i8085-ös mikroprocesszoros rendszerben az A, B, C jelek külön kártyákon állnak elő, változásuk egymástól független, de mindegyiket szeretnénk időszakosan címezhetően külön-külön beolvasni a processzor D0 adatvonalán. Milyen kimenetű kapukat kell a szaggatottal jelölt dobozokba tervezni, hogy a rendszer helyesen működjön, miért?&lt;br /&gt;
* Tristate,  mivel a kimenetek összekötöttük és a rendszer nem tartalmazott közvetlen felhúzó ellenállást&lt;br /&gt;
&lt;br /&gt;
===6. i.)===&lt;br /&gt;
Egy 8085 mikroprocesszoros rendszerben 1 master és 4 slave 8259-es IT vezérlőt használunk. Hány megszakítást tudunk összesen lekezelni a 8259-esekkel?&lt;br /&gt;
* 4*8+(8-4)=36&lt;br /&gt;
* A 4 Slave 8 megszakítást tud kezelni + a Master maradék IR bemenetei felhasználhatók megszakításkérés céljára (60.o./3.4.)&lt;br /&gt;
&lt;br /&gt;
A fenti konfigurációt úgy kötötték be, hogy a slave egységek a master 0,2,4 és 6 sorszámú bemenetére kapcsolódnak. A rendszer hibásan működik. Miért? Indokolja a választ!&lt;br /&gt;
* ha a Masternek egyedi megszakításkérő vezetékei is vannak, akkor a IR0 bemenetre nem szabadna az egyik Slave-t sem rákötni, ugyanis a CAS vezetékek 0 állapota egyszerre jelentené a Master és az egyik Slave megszakításkérését (62.o./3.4.)&lt;br /&gt;
&lt;br /&gt;
A fenti konfigurációban az összes vezérlő egy közös meghajtón (74LS245) keresztül csatlakozik a rendszersínre. Hogyan lehet ilyen esetben az egyes vezérlőknek megmondani, hogy master vagy slave szerepet játszanak?&lt;br /&gt;
* az ICW 4 parancsbyte 2. bitjével (=M/S) (66.o./3.6.3.)&lt;br /&gt;
&lt;br /&gt;
=== 6. j.)===&lt;br /&gt;
Egy DMA vezérlő mind a 4 csatornájára egy-egy periféria csatlakozik. Használható-e ilyenkor az 1-es csatorna&lt;br /&gt;
AUTOLOAD üzemmódban? Indokolja a választ!&lt;br /&gt;
*Nem, csak a CH2 és CH3 használható (81.o./4.6.4.)&lt;br /&gt;
&lt;br /&gt;
Programozza fel a DMA vezérlőt AUTOLOAD üzemmódba úgy, hogy a 9000h memóriacímtől kezdődő címre&lt;br /&gt;
periódikusan 128 byte adatot legyen képes betölteni a perifériából. A 8257-es báziscíme: 70H.&lt;br /&gt;
&lt;br /&gt;
        LXI D,9000H&lt;br /&gt;
        MVI B,128&lt;br /&gt;
        MOV A,10101111B&lt;br /&gt;
        OUT 78H         ;beírás A3=1, A2=A1=A0=0&lt;br /&gt;
    TOLT:   IN 78H      ;kiolvasás is A3=1, A2=A1=A0=0&lt;br /&gt;
        STAX D&lt;br /&gt;
        INX D&lt;br /&gt;
        DCR B&lt;br /&gt;
        JNZ TOLT&lt;br /&gt;
        END&lt;br /&gt;
&lt;br /&gt;
=== 6. k.) ===&lt;br /&gt;
Mi különbség adatátvitel szinkronizálása szempontjából a 8251-es soros áramkör aszinkron és szinkron soros adatátvitele között?&lt;br /&gt;
* az aszinkron átvitel esetén a start és stop bitek segítségével szinkronizájla az átvitelt, a start bit megérkezésést az RXD 1 -&amp;gt; 0 átmenet jelzi&lt;br /&gt;
* a szinkron átvitel esetén a szinkronizálást külső, vagy belső eljárással kell megoldani, SYNC karakter érkezésére várunk (belső) vagy a SYNDET-et bemenetként programozzuk fel&lt;br /&gt;
&lt;br /&gt;
=== 6. l.) ===&lt;br /&gt;
Programozzon fel egy 8253-as timer áramkört, amely 3,072MHz-ről 4800Hz frekvenciára osztja le jelet, 50-50%-os kitöltésűre! A 8253-as áramkör binárisan számol, és 90h báziscíme van. Használja a 0-s számlálót!&lt;br /&gt;
&lt;br /&gt;
    ;3,072 Mhz=4800*640&lt;br /&gt;
    ;640= 0000 0001 | 0100 0000&lt;br /&gt;
&lt;br /&gt;
    MOV A,00111110B&lt;br /&gt;
    OUT 93H&lt;br /&gt;
    MOV A,01H&lt;br /&gt;
    OUT 90H&lt;br /&gt;
    MOV A,80H&lt;br /&gt;
    OUT 91H&lt;br /&gt;
&lt;br /&gt;
=== 6. m.) === &lt;br /&gt;
Egy kaszkádosított 8259-es rendszerben a MASTER egység IR7 és IR6 bemenetére SLAVE áramkörök kapcsolódnak.&lt;br /&gt;
Adja meg, hogy milyen ICW3 parancsot kell küldeni a Master egységnek!&lt;br /&gt;
* 11000000 (66.o./3.6.2.)&lt;br /&gt;
&lt;br /&gt;
Adja meg, hogy milyen ICW3 parancsot kell küldeni Az IR6-ra csatlakozó SLAVE egységnek&lt;br /&gt;
* 00000110 (66.o./3.6.2.)&lt;br /&gt;
&lt;br /&gt;
Hogyan tudjuk kijelölni, hogy lesz ICW3 parancs?&lt;br /&gt;
*az ICW1 SNGL bitjének 0 állapotba állításával, az ICW1 1. bitje (D1)  (63.o. táblázat, 64.o. ICW1 - SNGL)&lt;br /&gt;
&lt;br /&gt;
== 7. feladat ==&lt;br /&gt;
&lt;br /&gt;
Ehhez létezik egy javításokat tartalmazó PDF. [[Media:Digit2_ef_V2_megold_6-7-javitott.pdf|Megtekintés.]]&lt;br /&gt;
&lt;br /&gt;
===7. a.)===&lt;br /&gt;
Sorolja fel az i8085 állapotait!&lt;br /&gt;
* RUN, WAIT, HALT, HOLD&lt;br /&gt;
&lt;br /&gt;
===7. b.)===&lt;br /&gt;
Szerkesszen gráfot, amely az i8085-ös állapotainak kapcsolatát ábrázolja! A nyilazott ágakra az állapot-változások okait kell felírni.&lt;br /&gt;
&lt;br /&gt;
* RUN -&amp;gt; WAIT:  Ready jel 0 szintre vált&lt;br /&gt;
* WAIT -&amp;gt; RUN:  Ready jel 1-re vált&lt;br /&gt;
* RUN -&amp;gt; HALT:  HLT parancs kiadásakor&lt;br /&gt;
* HALT -&amp;gt; RUN: megszakításkérés érkezésekor&lt;br /&gt;
* RUN -&amp;gt; HOLD: HOLD 1-be vált&lt;br /&gt;
* HOLD -&amp;gt; RUN:  a HOLD jel megszűnése után&lt;br /&gt;
* HALT -&amp;gt; HOLD: HOLD igény érkezésekor (HOLD=1)&lt;br /&gt;
* HOLD -&amp;gt; HALT: HOLD megszűnése (HOLD=0)&lt;br /&gt;
&lt;br /&gt;
=== 7. c.) ===&lt;br /&gt;
Milyen esetekben kerül a 8085-ös mikroprocesszor HALT állapotból RUN állapotba?&lt;br /&gt;
* HALT -&amp;gt; RUN: megszakításkérés érkezésekor, illetve reset hatására&lt;br /&gt;
&lt;br /&gt;
===7. d.)===&lt;br /&gt;
Sorolja fel azokat az eseteket, amikor az INTE FF = 0 értékű lesz!&lt;br /&gt;
* DI parancs kiadásakor, reset, megszakítás érvényre jutása után&lt;br /&gt;
&lt;br /&gt;
===7. e.) ===&lt;br /&gt;
Sorolja fel azokat az eseteket, amikor az RST7.5 FF = 0 értékű lesz!&lt;br /&gt;
* SIM utasítás esetén,ha a 4. bittel töröljük az RST7.5-t (A4=1), illetve RESET után&lt;br /&gt;
&lt;br /&gt;
===7. f.)===&lt;br /&gt;
Az i8085-ös processzor reszetelésekor milyen értékű lesz az INTEFF, és mi lesz a PC tartalma?&lt;br /&gt;
* az INTEFF-kat törli, tehát 0 lesz , PC:0000H&lt;br /&gt;
&lt;br /&gt;
===7. g.)===&lt;br /&gt;
Milyen kezdőcímeken kezdődnek az RST 2 és RST 5 utasításokkal meghívott szubrutinok, illetve az RST 5.5 és az RST 7.5 megszakítási szubrutinok?&lt;br /&gt;
* RST 2: 10H&lt;br /&gt;
* RST 5: 28H&lt;br /&gt;
* RST 5.5: 2CH&lt;br /&gt;
* RST 7.5: 3CH&lt;br /&gt;
&lt;br /&gt;
=== 7. h.)===&lt;br /&gt;
Mit kell kezdőértéknek az SP-be betölteni ha a programozó úgy kívánja beállítani a STACK tárat, hogy az első értékes beírt bájt 8FFFh-ra íródjon? Miért?&lt;br /&gt;
* 9000H, mert &#039;&#039;először&#039;&#039; csökkenti az SP értékét a processzor, és csak utána ír a stackre.&lt;br /&gt;
&lt;br /&gt;
===7. i.)===&lt;br /&gt;
Hogyan jelezzük a fordítóprogramnak, hogy a generált kódot az 1698h címtől kezdődően helyezze el?&lt;br /&gt;
* ORG 1698H&lt;br /&gt;
&lt;br /&gt;
===7. j.)===&lt;br /&gt;
Hogyan jelezzük a fordítóprogramnak, hogy az 1712h címtől kezdődően helyezze el a „digit” stringet?&lt;br /&gt;
&lt;br /&gt;
    ORG 1712H&lt;br /&gt;
    KAR DB &amp;quot;digit&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===7. k.)===&lt;br /&gt;
Hogyan jelezzük a fordítóprogramnak, hogy inicializált vagy inicializálatlan helyfoglalás történik?&lt;br /&gt;
* inicializált: DB vagy DW,&lt;br /&gt;
* inicializálatlan: DS direktívát használunk&lt;br /&gt;
&lt;br /&gt;
===7. l.)===&lt;br /&gt;
Mi a különbség az EQU 1200h és a DW 1200h direktívák között?&lt;br /&gt;
* CIMKE EQU 1200H: értékadás, hivatkozás a CIMKE-vel&lt;br /&gt;
* DW 1200H:  inicializált helyfoglalás&lt;br /&gt;
&lt;br /&gt;
===7. m.)===&lt;br /&gt;
Sorolja fel az i8085 mikroprocesszor megszakítással kapcsolatos jeleit!&lt;br /&gt;
* TRAP, RST 5.5,6.5,7.5, INTR&lt;br /&gt;
&lt;br /&gt;
===7. n.)===&lt;br /&gt;
Milyen típusú kimenettel rendelkező áramkörökkel lehet busz rendszerű vezetékeket meghajtani? Húzza alá, hogy melyik típusú kimenet alkalmas arra, hogy egy vezetéket (busz) több kimenet egyidejűleg is meghajthasson?&lt;br /&gt;
* tristate, &amp;lt;u&amp;gt;open collector&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===7. o.)===&lt;br /&gt;
Miért nem lehet két totem-pole kimenetű áramkör kimeneteit összekötni? Indokolja a választ? (sztem érdemes indokolni:))&lt;br /&gt;
* mert az ellenáláskon túl nagy teljesítmény disszipálódna, és ennek eredménye a tönkremenetel&lt;br /&gt;
&lt;br /&gt;
===7. p.)===&lt;br /&gt;
i8255-ös párhuzamos periféria áramkör A portját 1-es üzemmódban kimenetre, B-portját 0 üzemmódban bemenetre, C port alsó felét bemenetre, felső felét kimenetre kell állítani. Adja meg a vezérlő szó értékét!&lt;br /&gt;
* 10100011&lt;br /&gt;
&lt;br /&gt;
Adja meg, melyik regiszterbe és milyen értéket kell írni, hogy a fenti üzemmód esetén a PC4 portbit 0 , illetve 1 értékű legyen!&lt;br /&gt;
* Bit Set/Reset művelettel: (a 8255-ös címe+3) címre kell kiküldeni a 00001000 byte-ot a 0-ba állításhoz, 00001001 byte-ot az 1-be állításhoz&lt;br /&gt;
&lt;br /&gt;
===7. q.)===&lt;br /&gt;
Egy 3 gépi ciklusból álló utasítás (pl.: IN 83h) végrehajtása során az első gépi ciklus T1 fázisában egyidőben High (1) értékűek lesznek az INT és a HOLD bemenetek.&lt;br /&gt;
&lt;br /&gt;
;Mikor adja át a DMA vezérlőnek a 8085-ös a busz vezérlési jogot? Indokolja a válaszát!&lt;br /&gt;
:a HOLD bemenet 1-be váltásakor&lt;br /&gt;
&lt;br /&gt;
;Mikor jut érvényre a megszakítás (megszakításkérés engedélyezett állapotban van és nincs más kérés) Indokolja a válaszát!&lt;br /&gt;
:a HOLD jel megszűnését követően, hiszen a 7. b.) feladatban leírtak szerint működik a 8085, HOLD állapotból HALT-ba a HOLD=0-t követően, a HALT-ból a RUN-ba a megszakításkérést követően jut&lt;/div&gt;</summary>
		<author><name>Prisonerhu</name></author>
	</entry>
	<entry>
		<id>https://vik.wiki/index.php?title=Digit%C3%A1lis_technika_2_-_Megold%C3%A1sok_a_V2-es_ellen%C5%91rz%C5%91_feladatsorhoz&amp;diff=166249</id>
		<title>Digitális technika 2 - Megoldások a V2-es ellenőrző feladatsorhoz</title>
		<link rel="alternate" type="text/html" href="https://vik.wiki/index.php?title=Digit%C3%A1lis_technika_2_-_Megold%C3%A1sok_a_V2-es_ellen%C5%91rz%C5%91_feladatsorhoz&amp;diff=166249"/>
		<updated>2013-05-23T15:50:08Z</updated>

		<summary type="html">&lt;p&gt;Prisonerhu: /* 6. k.) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Vissza|Digitális technika 2}}&lt;br /&gt;
[[Category:Digitális technika 2]]&lt;br /&gt;
&lt;br /&gt;
Ezen az oldalon a [[Digitális technika 2#Régi és új Digit2|régi ötkredites]] Digit2 ellenőrző kérdéseihez összegyűjtött megoldások vannak. A megoldások nem mindenhol teljesek vagy jók. Az új Digit2-höz már más ellenőrző feladatsort adott ki a tanszék.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:right;margin:0.5em;&amp;quot; class=&amp;quot;noautonum&amp;quot;&amp;gt;__TOC__&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Media:Digit2_ef_V2.pdf|A V2-es feladatsor itt érhető el.]]&lt;br /&gt;
&lt;br /&gt;
== 1. feladat ==&lt;br /&gt;
&lt;br /&gt;
* [[Media:Digit2_ef_V2_megold_1_a_ell.pdf‎|PDF az 1/a) feladathoz]]&lt;br /&gt;
&lt;br /&gt;
== 2. feladat ==&lt;br /&gt;
&lt;br /&gt;
by Lacee&lt;br /&gt;
(a hibákat jelezni kérem a prisonerhu{{kukac}}freemail.hu címen)&lt;br /&gt;
&lt;br /&gt;
=== 2. a) ===&lt;br /&gt;
&lt;br /&gt;
Készítsen megszakítási vonalakat kezelő áramkört, amely egy 8085-ös processzoron alapuló sín RST 5.5-ös és RST 6.5-ös megszakítási vonalaira csatlakozva2 db külsô megszakítás (IT1 és IT2) fogadására alkalmas.&lt;br /&gt;
&lt;br /&gt;
A külső megszakítások kezelését külön-külön áramkörök végzik, amelyek a külső megszakítás felfutó élére kérnek megszakítást és alaphelyzetbe OUT utasítással állíthatók (vagy a ResetOut jel hatására). Egy megszakítási impulzus csak egyszer kérjen megszakítást. Az IT1 megszakítás hatására a C regiszter 55h, IT2 hatására a C regiszter AAh értéket vesz fel. A megszakítási flip-flopok 11h (IT1) és 17h (IT2) címen érhetők el.&lt;br /&gt;
&lt;br /&gt;
* Készítse el a rendszer inicializálását végző főprogramot (40h címtől kezdődően)!&lt;br /&gt;
* Készítse el a megszakítási szubrutinokat! &lt;br /&gt;
&lt;br /&gt;
        RST55 EQU 2CH&lt;br /&gt;
        RST65 EQU 34H&lt;br /&gt;
        C1 EQU 55H  &lt;br /&gt;
        C2 EQU AAH&lt;br /&gt;
        IT1 11H&lt;br /&gt;
        IT2 17H&lt;br /&gt;
 &lt;br /&gt;
        JMP INIC&lt;br /&gt;
        ORG 0040H&lt;br /&gt;
    INIC:&lt;br /&gt;
        MVI A,00001100B ;RST 7.5-T LETILTJUK, A TÖBBIT ENGEDÉLYEZZÜK&lt;br /&gt;
        SIM     ;MASZK BEÁLLÍTÁSA&lt;br /&gt;
        EI      ;MEGSZAKÍTÁS ENG&lt;br /&gt;
        &lt;br /&gt;
    VAR:    JMP VAR     ;VÉGTELEN CIKLUS, AZ RST-KRE VÁR, AZOK MEGSZAKÍTJÁK&lt;br /&gt;
 &lt;br /&gt;
        ORG RST55   ;RST55 CÍMÉN VAN,ÍGY HA MEGSZAKÍTÁS TÖRTÉNIK, AKKOR IDE UGRIK A PROGI&lt;br /&gt;
    MEGSZ1: MVI C,C1        ;BEÁLLÍTJUK A KÍVÁNT ÉRTÉKET    &lt;br /&gt;
        OUT IT1     ;VISSZAÁLLÍTJUK AZ IO-T&lt;br /&gt;
        EI      ;MEGSZAKÍTÁS ÉRVÉNYRE JUTTATÁSA&lt;br /&gt;
        RET&lt;br /&gt;
 &lt;br /&gt;
        ORG RST65   ;AZ ELÕBBI MINTÁJÁRA...&lt;br /&gt;
    MEGSZ2: &lt;br /&gt;
        MVI C,C2    &lt;br /&gt;
        OUT IT2&lt;br /&gt;
        EI&lt;br /&gt;
        RET&lt;br /&gt;
&lt;br /&gt;
=== 2. b) ===&lt;br /&gt;
&lt;br /&gt;
Írjon assembly szubrutint (KONV), amely az A regiszterben megkapott byte-ot átírja a 74LS374-es regiszter bekötésének megfelelően. A szubrutin kimenete az átkonvertált byte az A regiszterben. (A szubrutin más regiszterek tartalmát nem ronthatja el!)&lt;br /&gt;
&lt;br /&gt;
Írjon ellenőrző 8085-ös assembly szubrutint (ELO), amely az összes lehetséges kombinációval ellenőrzi a kimeneti regiszter bekötését. A szubrutin lefutása után a D,E regiszterpárban legyen a felismert hibák száma! (A szubrutin a D,E regiszterpár kivételével a regiszterek tartalmát nem ronthatja el!) A megoldásban használja az előző feladatban definiált KONV szubrutint! A kimeneti regiszter 0FFh I/O címen írható és 01Fh címen olvasható.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    PÉLDA1 A MÛKÖDÉSRE&lt;br /&gt;
        10101111    ;A BEJÖVÕ ADAT -&amp;gt; EZT KELL KAPNUNK A PÉLDA1-BEN: 01011111&lt;br /&gt;
    RRC 11010111    ;JOBBRA FORGATJUK&lt;br /&gt;
    AND 01010101    ;ÖSSZEÉSELJÜK  55H-VAL (MÁSNÉVEN MASZKOLÁS)&lt;br /&gt;
        ----------&lt;br /&gt;
    =   01010101 -&amp;gt; D   ;AZ EREDMÉNYT BEÍRJUK A (D) REG-BE&lt;br /&gt;
&lt;br /&gt;
    RLC 01011111    ;AZ EREDETI ADATOT FORGATJUK BALRA&lt;br /&gt;
    AND 10101010    ;ÉSELJÜK AAH-VAL&lt;br /&gt;
        ----------&lt;br /&gt;
    =   00001010 -&amp;gt; H   ;KIMENTJÜK H-BA, A PROGIBAN NEM KELL H-BA MENTENI,MERT AZ UTANA LEVÕ PARANCS A&lt;br /&gt;
          VAGYOLÁS ÉS AHHOZ AZ A- TARTALMA KELL, AMI MOST PONT A H-BA RAKOTTAL EGYEZIK MEG&lt;br /&gt;
&lt;br /&gt;
    H OR D&lt;br /&gt;
        01010101    &lt;br /&gt;
        00001010    &lt;br /&gt;
        ----------  &lt;br /&gt;
        01011111    ;AZ EREDMÉNY!&lt;br /&gt;
&lt;br /&gt;
    PÉLDA2:&lt;br /&gt;
        10101110 -&amp;gt;EBBÕL EZT:01011101&lt;br /&gt;
    RRC 01010111&lt;br /&gt;
    AND 01010101&lt;br /&gt;
        ----------&lt;br /&gt;
    =   01010101 -&amp;gt; D&lt;br /&gt;
&lt;br /&gt;
    RLC 01011101&lt;br /&gt;
    AND 10101010&lt;br /&gt;
        -----------&lt;br /&gt;
    =   00001000 -&amp;gt; H&lt;br /&gt;
&lt;br /&gt;
    H OR D&lt;br /&gt;
        01010101&lt;br /&gt;
        00001000&lt;br /&gt;
        -----------&lt;br /&gt;
        01011101&lt;br /&gt;
&lt;br /&gt;
    ;NA ÉS VÉGRE A PROGI&lt;br /&gt;
    KONV:   PUSH H&lt;br /&gt;
        PUSH D&lt;br /&gt;
        PUSH PSW    ;kimentjük A-t&lt;br /&gt;
        RRC     ;jobbra forgatunk&lt;br /&gt;
        ANI 01010101B   ;maszkoljuk 55H-val&lt;br /&gt;
        MOV D,A     ;a maszkolt byte-ot kimentjük D-be&lt;br /&gt;
        POP PSW     ;vissza az A-t&lt;br /&gt;
        RLC         ;balra forgatjuk&lt;br /&gt;
        ANI 10101010B   ;maszkoljuk AAH-val&lt;br /&gt;
        ORA D       ;összevagyoljuk D-vel&lt;br /&gt;
        POP D       ;POPpolgatunk&lt;br /&gt;
        POP H&lt;br /&gt;
        RET&lt;br /&gt;
        &lt;br /&gt;
    ELO:    &lt;br /&gt;
        PUSH PSW&lt;br /&gt;
        PUSH H&lt;br /&gt;
        PUSH B&lt;br /&gt;
        PUSH A  &lt;br /&gt;
        MVI B,0H&lt;br /&gt;
        LXI D,0H&lt;br /&gt;
    FUT:&lt;br /&gt;
        MOV A,B&lt;br /&gt;
        OUT 0FFH    ;a B 0-tól FF-ig megy, ez az összes lehetséges kombináció&lt;br /&gt;
        CALL KONV   ;az A-ban a B-nek megfelelő beolvasott (átkonvertált) adat lesz&lt;br /&gt;
        MOV C,A     &lt;br /&gt;
        IN  01FH        ;beolvassuk a reg tartalmát&lt;br /&gt;
        CMP C       ;ha A=C akkor jó (C:a B konvertált alakja, A:a közvetlenül visszaolvasott alak&lt;br /&gt;
        &lt;br /&gt;
        JZ TOVABB   ;ha B=C -&amp;gt; Z=1, tehát nem kell növelni a DE-t&lt;br /&gt;
        INX D       ;ha azonban Z=0, növeljük DE-t&lt;br /&gt;
    TOVABB: INR B       &lt;br /&gt;
        MOV A,FF&lt;br /&gt;
        CMP B   &lt;br /&gt;
        JNZ FUT     ;ha B végigpörgött, tehát elérte az FF-t, akkor kilépünk&lt;br /&gt;
        POP A&lt;br /&gt;
        POP B&lt;br /&gt;
        POP H&lt;br /&gt;
        POP PSW&lt;br /&gt;
&lt;br /&gt;
=== 2. c) ===&lt;br /&gt;
&lt;br /&gt;
Írja meg a VIZS 8085 assembly szubrutint, amely az A regiszterben kapott értéket beírja a kimeneti regiszterbe, majd a kimenet értékét visszaolvassa és ellenőrzi, hogy a beérkezett karakter helyes-e? Hiba esetén a szubrutinból való visszatéréskor Z=1, különben Z=0 legyen!&lt;br /&gt;
&lt;br /&gt;
* A kimeneti egység K1…K8 jelei a 0ACh IO címen olvashatók vissza.&lt;br /&gt;
* a kimeneti regiszter (74374) a 0AAh IO címen írható&lt;br /&gt;
* A kimeneti regiszter minden második bitje (K0,K2,K4,K6) negáltan legyen kivezetve.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    VIZS:   OUT 0AAH    ;BEÍRJUK AZ A REG TARTALMÁT A KIMENETI REG-BE&lt;br /&gt;
        AND 55H     ;A KIMENET ÉRTÉKE NEM A BEÍRT A-VAL LESZ EGYENLÕ&lt;br /&gt;
        XRA FFH     ;EZÉRT MEGCSINÁLJUK SZOFTVERESEN A BYTE MINDEN MÁSODIK BITJÉNEK NEGÁLÁSÁT&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    ;példa 1:a fenti műveltre (AND 55H;XRA FFH)&lt;br /&gt;
    kiírt adat: &lt;br /&gt;
        11111111  -&amp;gt; ebből ezt kell kapnunk: 10101010&lt;br /&gt;
    AND 01010101&lt;br /&gt;
        -----------&lt;br /&gt;
        01010101&lt;br /&gt;
    XRA 11111111&lt;br /&gt;
        -----------&lt;br /&gt;
        10101010  -&amp;gt;és kész!&lt;br /&gt;
&lt;br /&gt;
    ;példa 2:&lt;br /&gt;
    kiírt adat:&lt;br /&gt;
        10111011  -&amp;gt;ez lesz belőle: 11101110&lt;br /&gt;
    AND 01010101&lt;br /&gt;
        -----------&lt;br /&gt;
        00010001&lt;br /&gt;
    XRA 11111111&lt;br /&gt;
        -----------&lt;br /&gt;
        11101110  -&amp;gt; ready!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    ;és a progi folytatása&lt;br /&gt;
        MOV B,A     ;elmentjük B-be, mert később a visszaolvasott adat alapból az A-ba kerül és felülírja ezt&lt;br /&gt;
        IN 0ACH     ;visszaolvasás&lt;br /&gt;
        CMP B       ;a szokásos vizsgálat, A-ból kivonjuk a B-t(az ellenőrző byte-ot)&lt;br /&gt;
        JNZ Z1      ;és ha az eredmény nem 0 (akkor Z=0,és hiba van), a feladata pont az ellentetjét kéri&lt;br /&gt;
        XRA A       ;ezért a Z flaget megnegáljuk az alábbi paranccsal&lt;br /&gt;
        JMP VEGE&lt;br /&gt;
    Z1: MOV A,1H&lt;br /&gt;
        ORA A       &lt;br /&gt;
    VEGE:   RET&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 2. d) ===&lt;br /&gt;
&lt;br /&gt;
Illesszen i8085-ös mikroprocesszoros rendszersínre két 8251-es soros periféria illesztő áramkört. Az „A” áramkör csak kimenetre, a „B” áramkör csak bemenetre van felprogramozva. Az „A” áramkör TxD kimenetét a „B” áramkör RxD bemenetére kell kötni. Mindkét áramkör TxC és RxC órajel bemeneteire CLK96 órajel van kötve. Inicializáláskor mindkét áramkör programozása: aszinkron üzemmód, 8 bites karakter, páros paritás és 2 stop bit. A „B” áramkör az /RST 5,5 sínen kér megszakítást. Az „A” áramkör báziscíme 0AAh, a „B” áramkör báziscíme 0AEh.&lt;br /&gt;
&lt;br /&gt;
Írja meg azt a két assembly programrészletet, amely a két 8251-est felprogramozza a fenti konfigurációnak megfelelően!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    AFELPROG:&lt;br /&gt;
        ;először a MODE INSTRUCTION-t kell kiküldeni&lt;br /&gt;
        ;kódszó: 11111101B - a alsó 2 bit értéke elvileg úgy jön ki, hogy a TxC és RxC órajeleknek 1-szeres arány kell legyen&lt;br /&gt;
        MOV A,FDH&lt;br /&gt;
        OUT 0AAH&lt;br /&gt;
        MOV A,00    000001B     ;Command Instruction&lt;br /&gt;
        OUT 0AAH        &lt;br /&gt;
        RET&lt;br /&gt;
        &lt;br /&gt;
&lt;br /&gt;
    BFELPROG:&lt;br /&gt;
        ;kódszó: ugyanaz,mint az előbb&lt;br /&gt;
        MOV A,FDH&lt;br /&gt;
        OUT 0AEH&lt;br /&gt;
        MOV A,00000000B     ;Command Instruction, B lesz a vevő&lt;br /&gt;
        OUT 0AEH    &lt;br /&gt;
        JMP 002CH&lt;br /&gt;
        RET&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 2. e) NR! ===&lt;br /&gt;
&lt;br /&gt;
Illesszen a 8085 mikroprocesszor sínrendszerére 8255-ös típusúPPIO áramkört, amely a 94H, 95H, 96H, 97H portcímeket foglalja el. A PPIO áramkör B portjára egy 8 bites párhuzamos adat kimenettel rendelkező periféria csatlakozik, (tehát a B portot bemenetként kell felprogramozni) amely hand-shaking (kézfogásosos) jelekkel ütemezi az adatátvitelt. Adat beolvasása esetén az áramkör kérjen megszakítást a CPU RST5.5 bemenetén. A periféria 8 adatvezetéken kívül az adattal egyidőben megjeleníti a PEVEN páros paritás jelet is. A PEVEN jel csak a hand-shaking folyamat közben áll rendelkezésre.&lt;br /&gt;
&lt;br /&gt;
Vegye figyelembe, hogy a megszakítási szubrutinban megvalósított adatbeolvasás időpontjában nem biztos, hogy a PEVEN paritás rendelkezésre áll, viszont a feladathoz feltétlen szükséges. Ezért javasolt a paritás jel mintavételezése (a megfelelő hand-shaking jellel) és letárolása a PPIO áramkörön kívül, majd beolvasása az A porton keresztül (pl. PA0 bemeneten) a megszakítási szubrutinban.&lt;br /&gt;
&lt;br /&gt;
* Írjon INIC55 szubrutint, amely elvégzi a PPIO áramkör fentiek szerinti inicializálást, és az SP beállítását, ha a STACK 8F00h és 8FFFh memóriatartományban van&lt;br /&gt;
* Írjon RST5.5 megszakítási szubrutint, amely beolvassa az adatot és a paritást PPIO áramkörről, ellenőrzi paritást, majd azadatot elhelyezi a 3456H című memória byte-ban, illetve paritáshiba esetén megnöveli a 3457H című memória byte tartalmát.&lt;br /&gt;
&lt;br /&gt;
    INIC55: ORG 8F00H   &lt;br /&gt;
        TER DS FF   ;STACK helyfoglalás&lt;br /&gt;
        &lt;br /&gt;
        ORG 0H&lt;br /&gt;
        ;STÁTUSZ szó: 10111111  - segédlet 95-97.oldala alapján&lt;br /&gt;
        MOV A,DFH&lt;br /&gt;
        OUT 97H&lt;br /&gt;
        &lt;br /&gt;
        IN 95H&lt;br /&gt;
        JMP 2CH &lt;br /&gt;
&lt;br /&gt;
        ORG 2CH&lt;br /&gt;
        IN 94H      ;ez itt a PEVEN jel beolvasása &lt;br /&gt;
        ANI 01H     ;a PA0 bitjét veszem a PEVEN paritás bitnek&lt;br /&gt;
        MOV D,A     ;és elmentem a D-be;ha D=0, akkor páratlan paritás,  D=1, akkor páros paritás van&lt;br /&gt;
        MVI B,0&lt;br /&gt;
        MVI C,8 &lt;br /&gt;
    PARIT:  RLC&lt;br /&gt;
        JNC TOV&lt;br /&gt;
        INR B       ;az utolsó ciklusba bekerül a beolvasott byte-ban lévő 1-esek száma&lt;br /&gt;
    TOV:    DCR C&lt;br /&gt;
        JNZ PARIT&lt;br /&gt;
        MOV A,B&lt;br /&gt;
        ANI 01H&lt;br /&gt;
        &lt;br /&gt;
        LXI H,3456H&lt;br /&gt;
        MOV M,A&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
=== 2. f.) ===&lt;br /&gt;
&lt;br /&gt;
Illesszen i8085-ös mikroprocesszoros rendszersínre egy visszaolvasható 8 bites kimeneti regisztert, mely az alábbi ábrán látható lámpa vezérlő egységet képes működtetni.&lt;br /&gt;
* a kimeneti regisztert (74374) a 20h IO címen írható és a kimeneti egység L1…L8 jelei a 20H IO címen visszaolvashatók&lt;br /&gt;
* Írja meg a CHECK 8085 assembly szubrutint, amely az A regiszterben kapott értéket beírja az előző feladatban kialakított kimeneti regiszterbe, majd a kimenet értékét visszaolvassa és ellenőrzi. Hiba esetén visszatéréskor CY=1, különben CY=0 legyen.&lt;br /&gt;
&lt;br /&gt;
    CHECK:  OUT 20H     ;kiírás a reg-be&lt;br /&gt;
        CMA     ;bitenként negálja az A-t&lt;br /&gt;
        MOV B,A     ;ezt a negált értéket beírjuk a B reg-be&lt;br /&gt;
        IN 20H      ;20H címről beolvasunk&lt;br /&gt;
        CMP B       ;szokásos ellenőrzés&lt;br /&gt;
        JZ CY0      ;ha egyenlő a B és a visszaolvasott érték, akkor Z=1 és akkor ugrunk arra a részre ahol CY:=0&lt;br /&gt;
        STC     ;ha Z=0 akkor CY-t 1-be állitjuk&lt;br /&gt;
        JMP VEGE        ;és ugrunk a végére&lt;br /&gt;
    CY0:    STC     ;CY=1&lt;br /&gt;
        CMC     ;CY-t negálja&lt;br /&gt;
    VEGE:   RET&lt;br /&gt;
&lt;br /&gt;
== 3. feladat ==&lt;br /&gt;
&lt;br /&gt;
=== 3. a) ===&lt;br /&gt;
&lt;br /&gt;
            LXI D,X     ; X ms-ban&lt;br /&gt;
            LXI B,R     ; R-ratio, szazalekban&lt;br /&gt;
        ELEJE:  LXI H,X*1000000*R/100/7040&lt;br /&gt;
            MVI A,C8H   ; 11001000B&lt;br /&gt;
            SIM&lt;br /&gt;
            CALL HUROK&lt;br /&gt;
            MVI A,48H   ; 01001000B&lt;br /&gt;
            SIM&lt;br /&gt;
            LXI H,X*1000000*(100-R)/100/7040&lt;br /&gt;
            CALL HUROK&lt;br /&gt;
            JMP ELEJE&lt;br /&gt;
&lt;br /&gt;
        HUROK:  DCX H       ; 4 fazis&lt;br /&gt;
            MOV A,H     ; 4 fazis&lt;br /&gt;
            ORA L       ; 4 fazis&lt;br /&gt;
            JNZ HUROK   ; 10 fazis, 7040 nsec&lt;br /&gt;
            RET&lt;br /&gt;
&lt;br /&gt;
=== 3. b.) === &lt;br /&gt;
&lt;br /&gt;
Írjon 8085 assembly szubrutint, amely a következő specifikáció szerint működik:&lt;br /&gt;
* A szubrutin a SID jel felfutó élére egy adatkivitelt, a lefutó élére egy adatbeolvasást végezzen a következők szerint:&lt;br /&gt;
* a szubrutin induláskor megvárja a SID jel 0=&amp;gt;1 átmenetét és a B regiszter tartalmát kiírja a 70h-es port címre,&lt;br /&gt;
* majd a SID jel 1=&amp;gt;0 átmenetére 71h port címről beolvas egy adatbájtot, amit a C regiszterbe tesz, ezután kilép a szubrutinból.&lt;br /&gt;
* A szubrutin bemenete: a kiírandó adat a B regiszterben.&lt;br /&gt;
* A szubrutin kimenete: a beolvasott adat a C regiszterben&lt;br /&gt;
* A megoldás során ügyeljen arra, hogy a szubrutin a C regiszter kivételével a regiszterek és a flag-ek értékét ne változtassa meg!&lt;br /&gt;
&lt;br /&gt;
    RUTIN:  MVI C,0H        ;ezzel a reg-gel ellenőrizzük azt, hogy a SID jel milyen értékű, az 1. részben 0-1 átmenet kell&lt;br /&gt;
        PUSH PSW    ;kimentések&lt;br /&gt;
        PUSH A&lt;br /&gt;
        PUSH B&lt;br /&gt;
    VAR1:   RIM     ;a beolvasott byte felső bitje a SID jel értékét mutatja &lt;br /&gt;
        MVI A,80H   ;maszkolás  &lt;br /&gt;
        ORA C       ;megnézzük, hogy a SID=0-e ha nem akkor ugárs VAR1-re / SID=1-re várunk&lt;br /&gt;
        JNZ VAR1&lt;br /&gt;
    VAR2:   RIM     ;itt gyakorlatilag ugyanaz van, mint az előbb, csak SID-1-re várunk&lt;br /&gt;
        MVI A,80H&lt;br /&gt;
        ORA C&lt;br /&gt;
        JZ VAR2     ;tehát ha SID=0 marad, akkor ugrunk VAR2-re / ha SID=1, akkor várunk még&lt;br /&gt;
        MOV A,0     ;itt azt nézzük, hogy az 1. részben vagyunk-e &lt;br /&gt;
        CMP C       ;ha a kivonás eredménye 0, akkor az 1. részben vagyunk és ekkor írjuk ki a B-t a 70H-ra&lt;br /&gt;
        JZ B70H     &lt;br /&gt;
        JMP C71H        ;ha a 2. részben vagyunk, akkor az előző ugró utasítás nem teljesül és ide kell ugrani&lt;br /&gt;
    CIMKE:  MOV C,01H   ;ha az 1. részben vagyunk, akkor C reg-t 1-be kell állítani, a 2. részben már nem fogunk ide ugrani&lt;br /&gt;
        JMP VAR1&lt;br /&gt;
    B70H:   MOV A,B&lt;br /&gt;
        OUT 70H&lt;br /&gt;
        JMP CIMKE&lt;br /&gt;
    C71H:   IN 71H&lt;br /&gt;
        MOV C,A &lt;br /&gt;
        POP B&lt;br /&gt;
        POP A&lt;br /&gt;
        POP PSW&lt;br /&gt;
        END&lt;br /&gt;
&lt;br /&gt;
Egy másik megoldás:&lt;br /&gt;
&lt;br /&gt;
        NULLBEOLV:  PUSH PSW&lt;br /&gt;
                RIM&lt;br /&gt;
                ANI 80H     ;10000000B&lt;br /&gt;
                JZ NULLBEOLV&lt;br /&gt;
                MOV A,B&lt;br /&gt;
                OUT 70H&lt;br /&gt;
        EGYBEOLV:   RIM&lt;br /&gt;
                ANI 80H&lt;br /&gt;
                JNZ EGYBEOLV&lt;br /&gt;
                IN 71H&lt;br /&gt;
                MOV C,A&lt;br /&gt;
                POP PSW&lt;br /&gt;
                JMP NULLBEOLV&lt;br /&gt;
&lt;br /&gt;
=== 3. c.) ===&lt;br /&gt;
Írjon 8085 assembly szubrutint, amely megvárja a SID jel változását (felfutó és lefutó él). A szubrutin kimenete:&lt;br /&gt;
* Z=1 felfutó él volt,&lt;br /&gt;
* Z=0 lefutó él volt!&lt;br /&gt;
* A szubrutin ne változtassa meg a regiszterpárok értékét!&lt;br /&gt;
&lt;br /&gt;
    RUTIN:  RIM&lt;br /&gt;
        ANI 80H     ;maszkolás, az SID értéke az A-ban lesz&lt;br /&gt;
        JZ FELFUT   ;ha az előbbi &amp;quot;és&amp;quot;-elés eredménye 0 (tehát a SID 0), akkor Z=1 -&amp;gt; ugrás a felfutójelhez&lt;br /&gt;
        JMP LEFUT   ;különben lefutó jelre várunk&lt;br /&gt;
    FELFUT: RIM&lt;br /&gt;
        ANI 80H     ;maszkolás&lt;br /&gt;
        JZ FELFUT   ;addig csináljuk amíg az eredmény 1 lesz (tehát a SID=1-re), Z=0-ra várunk&lt;br /&gt;
        XRA A       ;beállítjuk a Z-t 1-re&lt;br /&gt;
        JMP VEGE        ;ugrás végére&lt;br /&gt;
    LEFUT:  RIM&lt;br /&gt;
        ANI 80H&lt;br /&gt;
        JNZ FELFUT  ;ha Z=1, akkor az &amp;quot;és&amp;quot;-elés eredménye:0, tehát tovább kell várni a SID= 1 -&amp;gt; 0 átmenetre&lt;br /&gt;
        MOV A,FFH   &lt;br /&gt;
        ORA A       ;Z:=0&lt;br /&gt;
    VEGE:   RET&lt;br /&gt;
&lt;br /&gt;
Egy másik megoldás:&lt;br /&gt;
&lt;br /&gt;
                MVI A,0&lt;br /&gt;
                RIM&lt;br /&gt;
                ANI 80H&lt;br /&gt;
                JZ IDE&lt;br /&gt;
                MVI A,1&lt;br /&gt;
        IDE:        CALL IDERUTIN&lt;br /&gt;
                HALT&lt;br /&gt;
        IDERUTIN:   ANI FF&lt;br /&gt;
                JZ VAREGYRE&lt;br /&gt;
        VARNULLRA:  RIM&lt;br /&gt;
                ANI 80H&lt;br /&gt;
                JNZ VARNULLRA&lt;br /&gt;
                RZ&lt;br /&gt;
        VAREGYRE:   RIM&lt;br /&gt;
                ANI 80H&lt;br /&gt;
                JZ VAREGYRE&lt;br /&gt;
                RNZ&lt;br /&gt;
&lt;br /&gt;
=== 3. d.) ===&lt;br /&gt;
Írjon 8085 assembly szubrutint, amely a HL regiszterpárban kapott kezdőcímű és 32 byte hosszúságú adatblokkhoz 1 byte-os ellenőrző összeget számol ki, és elhelyezi a blokkot követő rekeszben. A szubrutin végén az akkumulátor az ellenőrző összeget tartalmazza! (A rutin bármely regiszter értékét elronthatja)!&lt;br /&gt;
&lt;br /&gt;
Az ellenőrző összeg számítási algoritmusa: X(i) mod 256   0&amp;lt;i&amp;lt;32&lt;br /&gt;
&lt;br /&gt;
    RUTIN:  MVI C,32        ;32 byte hosszúságú adatblokk&lt;br /&gt;
        XRA A       ;A:=0&lt;br /&gt;
    CIKLUS: ADD M       ;A+HL-&amp;gt; A&lt;br /&gt;
        INX H       ;forrásmutató növelése&lt;br /&gt;
        DCR C       &lt;br /&gt;
        JNZ CIKLUS  ;ha végigértünk akkor Z=1&lt;br /&gt;
        MOV M,A     ;a blokkot követő részen az ellenőrző összeg&lt;br /&gt;
        RET&lt;br /&gt;
&lt;br /&gt;
Egy másik megoldás:&lt;br /&gt;
                LXI D,0     ;reszosszeg kinullazasa&lt;br /&gt;
                LXI H, KC   ;kezdocim&lt;br /&gt;
                LXI B, 32   ;db&lt;br /&gt;
            HUROK:  MOV A,M&lt;br /&gt;
                CALL OSSZEGZO&lt;br /&gt;
                INX H&lt;br /&gt;
                DCX B&lt;br /&gt;
                MOV A,C&lt;br /&gt;
                ORA B&lt;br /&gt;
                JNZ HUROK&lt;br /&gt;
                MOV M,E     ;E-ben van a mod256 reszosszeg&lt;br /&gt;
            &lt;br /&gt;
            OSSZEGZO:&lt;br /&gt;
                PUSH H&lt;br /&gt;
                MOV L,A&lt;br /&gt;
                MVI H,0&lt;br /&gt;
                DAD D&lt;br /&gt;
                XCHG&lt;br /&gt;
                POP H&lt;br /&gt;
                RET&lt;br /&gt;
&lt;br /&gt;
=== 3. e.) ===&lt;br /&gt;
Írjon assembly programot amely kivonja két memóriában elhelyezkedő 32 szavas memóriatömbök egyes szavait és az eredményeket visszahelyezi egy újabb memóriaterületre! A 2 byte-os szavak felső 8 bitjét a kisebb című (páros) byte, az alsó 8 bitet a következő (páratlan) cím tárolja!&lt;br /&gt;
    (9000H,9001H) = (9100H,9101H) - (9200H,9201H) ... stb.&lt;br /&gt;
* Írja meg a kivonó programot!&lt;br /&gt;
* A kivonások elvégzése után a 9000H-n kezdődő 32 szavas memória terület után helyezzen el egy olyan byte-ot, amely megadja, hogy a 32 eredmény szó közül mennyi a pozitív szám feltételezve, hogy az operandusok (és az eredmény) 16 bites kettes komplemens kódban van ábrázolva. &lt;br /&gt;
&lt;br /&gt;
        LXI B,9000H&lt;br /&gt;
        LXI D,9101H&lt;br /&gt;
        LXI H,9201H&lt;br /&gt;
        MVI E,32H   ;2*32 szót vonunk ki egymásból  &lt;br /&gt;
    KIVON:  STC     ;CY:=1&lt;br /&gt;
        CMC     ;CY:=/CY -&amp;gt; CY:=0&lt;br /&gt;
        LDAX A,D        ;9101H-n található adatot betölti az A-ba&lt;br /&gt;
        SBB M       ;A-(HL által mutatott címen levő adat)-CY , ha van átvitel akkor CY=1 lesz&lt;br /&gt;
        STAX B      ;B által mutatott címre A tartalmát helyezi&lt;br /&gt;
        DCX B       &lt;br /&gt;
        DCX D&lt;br /&gt;
        DCX H&lt;br /&gt;
        LDAX A,D        ;9100H-n található adat megy az A-ba&lt;br /&gt;
        SBB M       ;A-M-CY&lt;br /&gt;
        STAX B      ;9000H-n a kivonás eredménye (2 byte-on)&lt;br /&gt;
        INX H&lt;br /&gt;
        INX H&lt;br /&gt;
        INX D&lt;br /&gt;
        INX D&lt;br /&gt;
        INX B&lt;br /&gt;
        INX B&lt;br /&gt;
        DCR E&lt;br /&gt;
        JNZ KIVON&lt;br /&gt;
        MVI E,32H   ;32 szavat vizsgálunk meg&lt;br /&gt;
        MVI D,0H        ;a pozitív számok számát ebben tároljuk &lt;br /&gt;
    SZAMOL: LXI B,9000H &lt;br /&gt;
        ANI 80H     ;ha a MSB (legfelső bit)=1 akkor a szám negatív&lt;br /&gt;
        JZ TOVABB   ;ha szám negatív, akkor Z=1 és nem kell növelni&lt;br /&gt;
        INR D   &lt;br /&gt;
    TOVABB: INX H       &lt;br /&gt;
        INX H&lt;br /&gt;
        DCR E       &lt;br /&gt;
        JNZ SZAMOL&lt;br /&gt;
        END&lt;br /&gt;
&lt;br /&gt;
Egy másik megoldás:&lt;br /&gt;
            XPOINTER EQU 9080H&lt;br /&gt;
            YPOINTER EQU 9082H&lt;br /&gt;
            ZPOINTER EQU 9084H  ;ideiglenes regiszterpárok, KIHASZNÁLATLAn ramterület, senkit nem zavar&lt;br /&gt;
            X EQU 9100H&lt;br /&gt;
            Y EQU 9200H&lt;br /&gt;
            Z EQU 9000H&lt;br /&gt;
 &lt;br /&gt;
            LXI H,X         ;ebbol&lt;br /&gt;
            SHLD XPOINTER&lt;br /&gt;
            LXI H,Y         ;ezt&lt;br /&gt;
            SHLD YPOINTER&lt;br /&gt;
            LXI H,Z         ;ide(eredmény)&lt;br /&gt;
            SHLD ZPOINTER&lt;br /&gt;
             &lt;br /&gt;
        CIKLUS: CALL CIKLUSMAG&lt;br /&gt;
            LXI B, X+32*2&lt;br /&gt;
            LHLD XPOINTER&lt;br /&gt;
            MOV A,H&lt;br /&gt;
            CMP B&lt;br /&gt;
            JNZ CIKLUS&lt;br /&gt;
            MOV A,L&lt;br /&gt;
            CMP C&lt;br /&gt;
            JNZ CIKLUS&lt;br /&gt;
            HALT&lt;br /&gt;
 &lt;br /&gt;
        CIKLUSMAG:&lt;br /&gt;
            LHLD XPOINTER       ;H=91,L=00&lt;br /&gt;
            MOV D,M&lt;br /&gt;
            INX H&lt;br /&gt;
            MOV E,M         ;DE=ebbol&lt;br /&gt;
            INX H&lt;br /&gt;
            SHLD XPOINTER&lt;br /&gt;
            LHLD YPOINTER&lt;br /&gt;
            MOV A,M&lt;br /&gt;
            CMA&lt;br /&gt;
            MOV B,A&lt;br /&gt;
            INX H&lt;br /&gt;
            MOV A,M&lt;br /&gt;
            CMA&lt;br /&gt;
            MOV C,A&lt;br /&gt;
            INX B           ;BC-ben kivonando kettes komplemense(-1szerese)         &lt;br /&gt;
            INX H           &lt;br /&gt;
            SHLD YPOINTER&lt;br /&gt;
            XCHG            ;HL-ben ebbol&lt;br /&gt;
            DAD B&lt;br /&gt;
            XCHG            ;DE-ben eredmeny&lt;br /&gt;
            LHLD ZPOINTER&lt;br /&gt;
            MOV M,D&lt;br /&gt;
            INX H&lt;br /&gt;
            MOV M,E&lt;br /&gt;
            INX H&lt;br /&gt;
            SHLD ZPOINTER&lt;br /&gt;
            RET&lt;br /&gt;
&lt;br /&gt;
=== 3. f.) ===&lt;br /&gt;
Írjon assembly szubrutint amely kivonja két, a memóriában elhelyezkedő 64 byte-os memóriatömb egyes byte-jait és az eredményeket visszahelyezi az első operandus helyére! Az operandusok kezdőcímeit a szubrutin a HL és DE regiszterpárokban kapja. A kivonások elvégzése után a rutin az BC regiszter-párban kapott címtől kezdődően helyezzen el egy olyan byte-ot, amely megadja, hogy a 64 eredmény byte közül mennyi a pozitív szám (&amp;gt;0), egy másik byte-ot, hogy mennyi a negatív szám (&amp;lt;0), és egy harmadik byte-ot, hogy hány érték volt 0 (=0). (Az operandusok és az eredmény 8 bites kettes komplemens kódban vannak ábrázolva.)&lt;br /&gt;
* Írja meg a szubrutint!&lt;br /&gt;
* Írja meg azt a programrészletet, amely meghívja a szubrutint a HL=8000h, DE=8800h és BC=9000h paraméterekkel, majd ellenőrzi, hogy a 9000h címtől kezdődő 3 byte összege valóban 64.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    RUTIN:  PUSH B      ;kimentjük BC-t,mert a számlálónak a B-t használjuk fel&lt;br /&gt;
        PUSH H      ;a későbbi vizsgálat során az eredeti címtől indulunk, így ezt is kimentjük&lt;br /&gt;
        MVI B,64        &lt;br /&gt;
        XCHG        ;HL és DE felcserélése&lt;br /&gt;
    KIVON:  LDAX D      ;az A-ba betölti a DE (eredetileg HL) által mutatott címen lévő adatot&lt;br /&gt;
        SUB M       ;így DE-ből kivonjuk a HL-t&lt;br /&gt;
        STAX D      ;DE által mutatott címre visszahelyezzük az eredményt&lt;br /&gt;
        INX D       &lt;br /&gt;
        INX H&lt;br /&gt;
        DCR B       &lt;br /&gt;
        JNZ KIVON   ;ha végigértünk a 64 byte-on, akkor Z=1 lesz&lt;br /&gt;
        XCHG        ;HL és DE visszacserélése&lt;br /&gt;
        &lt;br /&gt;
        POP B&lt;br /&gt;
        POP H&lt;br /&gt;
        PUSH H      &lt;br /&gt;
        MVI D,0     &lt;br /&gt;
        MVI E,64&lt;br /&gt;
    POZ:    MOV A,M     ;A-ban a HL által mutatott címen lévő byte&lt;br /&gt;
        ANI 80H     ;maszkolás az előjel bitre&lt;br /&gt;
        JNZ PT      ;ha az előjel bit=1, akkor Z=0 és akkor negatív, így kihagyjuk a D növelését&lt;br /&gt;
        INR D       ;ha Z=1, akkor a szám pozitív és növeljük D-t&lt;br /&gt;
    PT: DCR E       &lt;br /&gt;
        JNZ POZ     ;amíg végig nem értünk Z=0&lt;br /&gt;
        MOV A,D     ;D-ben van a pozitív számok darabszáma&lt;br /&gt;
        STAX B      ;B címére elhelyezzük a darabszámot&lt;br /&gt;
        INX B       ;a B következő címére kerül a negatív számok darabszáma&lt;br /&gt;
&lt;br /&gt;
    ;pepita...&lt;br /&gt;
        POP H       &lt;br /&gt;
        PUSH H&lt;br /&gt;
        MVI D,0&lt;br /&gt;
        MVI E,64    &lt;br /&gt;
    NEG:    MOV A,M&lt;br /&gt;
        ANI 80H&lt;br /&gt;
        JZ NT&lt;br /&gt;
        INR D&lt;br /&gt;
    NT: DCR E&lt;br /&gt;
        JNZ NEG&lt;br /&gt;
        MOV A,D&lt;br /&gt;
        STAX B&lt;br /&gt;
        INX B       ;a B következő címére kerül a 0 értékű számok darabszáma&lt;br /&gt;
        &lt;br /&gt;
    ;0-k száma, pepita&lt;br /&gt;
        POP H&lt;br /&gt;
        MVI D,0&lt;br /&gt;
        MVI E,64&lt;br /&gt;
    NULL:   MOV A,M&lt;br /&gt;
        ORA 00H     ;egyedül itt van különbség, ha byte csupa 0, csak akkor lesz ORA 0H = 0-val és ezzel együtt Z=1&lt;br /&gt;
        JNZ NULT&lt;br /&gt;
        INR D&lt;br /&gt;
    NULT:   DCR E&lt;br /&gt;
        JNZ NEG&lt;br /&gt;
        MOV A,D&lt;br /&gt;
        STAX B&lt;br /&gt;
        RET&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Írja meg azt a programrészletet, amely meghívja a szubrutint a HL=8000h, DE=8800h és BC=9000h paraméterekkel, majd ellenőrzi, hogy a 9000h címtől kezdődő 3 byte összege valóban 64.  &lt;br /&gt;
        &lt;br /&gt;
        LXI H,8000H&lt;br /&gt;
        LXI D,8800H&lt;br /&gt;
        LXI B,9000H&lt;br /&gt;
        CALL RUTIN&lt;br /&gt;
        MOV C,0&lt;br /&gt;
        MOV D,3&lt;br /&gt;
        STC&lt;br /&gt;
        CMC&lt;br /&gt;
    ELL:    LDAX B&lt;br /&gt;
        ADC C&lt;br /&gt;
        MOV C,A&lt;br /&gt;
        DCR D&lt;br /&gt;
        JNZ ELL&lt;br /&gt;
        MOV A,64&lt;br /&gt;
        CMP C&lt;br /&gt;
        JZ JO&lt;br /&gt;
        STC     ;ezt itt a feladat nem kéri, de utólag vhogy el kell tudni dönteni, hogy az összeg valóban 64-e&lt;br /&gt;
        CMC     ;ezért ha nem jó akkor CY flag értéke 0 lesz, jó összeg esetén 1&lt;br /&gt;
        JMP VEGE        &lt;br /&gt;
    JO:     STC&lt;br /&gt;
    VEGE:   END&lt;br /&gt;
&lt;br /&gt;
Egy másik megoldás:&lt;br /&gt;
&lt;br /&gt;
        KISERED EQU 8000H&lt;br /&gt;
        KIVONANDO EQU 8800H&lt;br /&gt;
        ELOJEL EQU 9000H            &lt;br /&gt;
 &lt;br /&gt;
        LXI H,KISERED&lt;br /&gt;
        LXI D,KIVONANDO&lt;br /&gt;
                    ;LXI B,ELOJEL ;ELOJEL=POZITÍVAK, ELOJEL+1=negatívak, ELOJEL+2=nullák&lt;br /&gt;
        &lt;br /&gt;
    CIKLUS: MOV A,M&lt;br /&gt;
        PUSH PSW&lt;br /&gt;
        LDAX D&lt;br /&gt;
        MOV B,A&lt;br /&gt;
        POP PSW&lt;br /&gt;
        SUB B           ;AKKUMULÁTORBAN EREDMÉNY&lt;br /&gt;
        MOV M,A&lt;br /&gt;
        JZ NULL&lt;br /&gt;
        JP POZ&lt;br /&gt;
        PUSH H          ;(NEGATÍV ÁG)   &lt;br /&gt;
        LHLD ELOJEL+1&lt;br /&gt;
        INX H&lt;br /&gt;
        SHLD ELOJEL+1&lt;br /&gt;
        POP H&lt;br /&gt;
        JMP ELLEN&lt;br /&gt;
    NULL:   PUSH H          ;(0 ÁG) &lt;br /&gt;
        LHLD ELOJEL+2&lt;br /&gt;
        INX H&lt;br /&gt;
        SHLD ELOJEL+2&lt;br /&gt;
        POP H&lt;br /&gt;
        JMP ELLEN       &lt;br /&gt;
    POZ:    PUSH H          ;(POZITÍV ÁG)   &lt;br /&gt;
        LHLD ELOJEL&lt;br /&gt;
        INX H&lt;br /&gt;
        SHLD ELOJEL&lt;br /&gt;
        POP H&lt;br /&gt;
    ELLEN:  INX H&lt;br /&gt;
        INX D&lt;br /&gt;
        LXI B,KISERED+64&lt;br /&gt;
        MOV A,H&lt;br /&gt;
        CMP B&lt;br /&gt;
        JNZ CIKLUS&lt;br /&gt;
        MOV A,L&lt;br /&gt;
        CMP C&lt;br /&gt;
        JNZ CIKLUS&lt;br /&gt;
        LXI B,ELOJEL&lt;br /&gt;
 &lt;br /&gt;
        LXI H,ELOJEL&lt;br /&gt;
        MOV A,M&lt;br /&gt;
        INX H&lt;br /&gt;
        ADD M&lt;br /&gt;
        INX H&lt;br /&gt;
        ADD M&lt;br /&gt;
        CPI 64&lt;br /&gt;
        JZ JO&lt;br /&gt;
    NEMJO:  NOP         ;NEM JO!!!!!!!!!!&lt;br /&gt;
    JO: HALT&lt;br /&gt;
&lt;br /&gt;
=== 3. g.) ===&lt;br /&gt;
Írjon assembly szubrutint, amely a HL regiszterpárban kapott címen elhelyezkedő 00h végjelre végződő&lt;br /&gt;
karakterstringben megkeresi az első &#039;1&#039; számjegyet. (az ’1’ számjegy ASCII kódja 31h). Találat esetén a szubrutinból visszatéréskor a HL regiszterpár mutasson a megtalált karakter címére és CY = 0 legyen. Ha a keresett karakter nem található, akkor a szubrutin CY=1 értékkel térjen vissza. (Ilyenkor a HL regiszterpár a 00h végjelre mutasson.&lt;br /&gt;
&lt;br /&gt;
    RUTIN:  MVI B,00H&lt;br /&gt;
    KERES:  MVI A,31H&lt;br /&gt;
        CMP M       ;megnézzük, hogy a HL által mutatott címen lévő adat 31H-e&lt;br /&gt;
        JNZ TOV     &lt;br /&gt;
        JMP VEGT        ;ha megtaláltuk az &#039;1&#039; számjegyet, akkor Z=1 és ugrunk a VEGT (VÉGe és Találtunk)&lt;br /&gt;
 &lt;br /&gt;
    TOV:    MOV A,B     ;00 végjel figyelésére szolgál&lt;br /&gt;
        CMP M       ;ha HL által mutatott címen 00H található, akkor és csak akkor a kivonás eredménye 0 (Z=1)&lt;br /&gt;
        JZ VEGNT        ;ugrás a VÉGe és Nem Találtunk részre&lt;br /&gt;
        INX H       ;mutató növelése&lt;br /&gt;
        JMP KERES   &lt;br /&gt;
 &lt;br /&gt;
    VEGT:   STC     ;a HL címe ekkor automatikusan a keresett karakterre mutat, így csak a CY flaget kell állítani&lt;br /&gt;
        CMC     &lt;br /&gt;
        JMP VEGE&lt;br /&gt;
 &lt;br /&gt;
    VEGNT:  STC     ;itt is a megfelelő helyre mutat a HL, így csak CY:=1-t állítunk&lt;br /&gt;
         &lt;br /&gt;
    VEGE:   RET&lt;br /&gt;
&lt;br /&gt;
Egy másik megoldás:&lt;br /&gt;
        KC EQU 9100H        ;egyéni&lt;br /&gt;
        &lt;br /&gt;
    CIKLUS: MOV A,M&lt;br /&gt;
        CPI 31H&lt;br /&gt;
        JZ TALALT&lt;br /&gt;
        CPI 0&lt;br /&gt;
        JZ NULLTALALT           &lt;br /&gt;
        INX H&lt;br /&gt;
        JMP CIKLUS&lt;br /&gt;
    TALALT: STC&lt;br /&gt;
        CMC&lt;br /&gt;
        JMP VEGE&lt;br /&gt;
    NULLTALALT: STC&lt;br /&gt;
    VEGE:   HALT&lt;br /&gt;
&lt;br /&gt;
=== 3. h.) ===&lt;br /&gt;
Írjon assembly szubrutint, amely a HL regiszterpárban kapott címtől kezdődően átmásol 32 bájtot a DE regiszterpárban megadott kezdőcímen kezdődő memóriaterületre. A megoldás során ügyeljen arra, hogy a rutin ne változtassa meg a flag-ek állapotát és a BC regiszterpár értékét!&lt;br /&gt;
&lt;br /&gt;
Írjon assembly programrészletet, amely SID=1 esetén várakozzon SID=0-ra, majd SID=0 esetén a fenti szubrutin&lt;br /&gt;
meghívásával másoljon át 32 bájtot a 9000h memóriacímről a 9150h címre.&lt;br /&gt;
&lt;br /&gt;
    RUTIN:  PUSH PSW&lt;br /&gt;
        PUSH B&lt;br /&gt;
        &lt;br /&gt;
        MVI B,32&lt;br /&gt;
    MASOL:  XCHG        ;DE felcserélése HL-lel&lt;br /&gt;
        LDAX D      ;DE (=eredetileg HL) beírása az A-ba&lt;br /&gt;
        XCHG        ;visszacsere&lt;br /&gt;
        STAX D      ;beírjuk A-t az eredeti DE által mutatott címre&lt;br /&gt;
        INX H&lt;br /&gt;
        INX D&lt;br /&gt;
        DCR B   &lt;br /&gt;
        JNZ MASOL&lt;br /&gt;
        POP PSW&lt;br /&gt;
        POP B&lt;br /&gt;
        RET&lt;br /&gt;
&lt;br /&gt;
    ;programrészlet:&lt;br /&gt;
    VAR:    RIM&lt;br /&gt;
        ANI 80H&lt;br /&gt;
        JNZ VAR&lt;br /&gt;
        LXI H,9000H&lt;br /&gt;
        LXI D,9150H&lt;br /&gt;
        CALL RUTIN&lt;br /&gt;
        END&lt;br /&gt;
&lt;br /&gt;
Egy másik megoldás:&lt;br /&gt;
     VAR:    RIM&lt;br /&gt;
        ANI 80H     ;10000000B&lt;br /&gt;
        JNZ VAR&lt;br /&gt;
        LXI H,9000H&lt;br /&gt;
        LXI D,9150H&lt;br /&gt;
        CALL MASOL&lt;br /&gt;
        HALT&lt;br /&gt;
&lt;br /&gt;
            ;HL-ben és DE-ben már megvan a kezdõcímünk..&lt;br /&gt;
    &lt;br /&gt;
    MASOL:  PUSH PSW&lt;br /&gt;
        PUSH B&lt;br /&gt;
        LXI B,32&lt;br /&gt;
    CIKLUS: MOV A,M&lt;br /&gt;
        STAX D&lt;br /&gt;
        INX H&lt;br /&gt;
        INX D   &lt;br /&gt;
        DCX B&lt;br /&gt;
        MOV A,C&lt;br /&gt;
        ORA B&lt;br /&gt;
        JNZ CIKLUS&lt;br /&gt;
        POP B&lt;br /&gt;
        POP PSW&lt;br /&gt;
        RET&lt;br /&gt;
&lt;br /&gt;
=== 3. i.) ===&lt;br /&gt;
&lt;br /&gt;
Írjon assembly szubrutint, amely a DE regiszterpárban kapott címtől kezdődő 16 bájtot a blokk végétől kezdve visszafelé átmásol a HL regiszterpárban megadott címen kezdődő memóriaterületre (A forrás-blokk utolsó byte-ja van a cél-blokk első helyén). A megoldás során ügyeljen arra, hogy a rutin ne változtassa meg a flag-ek állapotát és a regiszterpárok értékét!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    RUTIN:  PUSH PSW&lt;br /&gt;
        PUSH B&lt;br /&gt;
        PUSH D&lt;br /&gt;
        PUSH H&lt;br /&gt;
        MVI B,16&lt;br /&gt;
    ;a DE-t megnöveljük 16-tal&lt;br /&gt;
    DENOV:  INX D&lt;br /&gt;
        DCR B&lt;br /&gt;
        JNZ DENOV   &lt;br /&gt;
        MVI B,16&lt;br /&gt;
    MASOL:  LDAX D&lt;br /&gt;
        XCHG&lt;br /&gt;
        STAX D&lt;br /&gt;
        XCHG&lt;br /&gt;
        INX H&lt;br /&gt;
        DCX D&lt;br /&gt;
        DCR B&lt;br /&gt;
        JNZ MASOL&lt;br /&gt;
        POP H&lt;br /&gt;
        POP D&lt;br /&gt;
        POP B&lt;br /&gt;
        POP PSW&lt;br /&gt;
        RET&lt;br /&gt;
&lt;br /&gt;
Egy másik megoldás:&lt;br /&gt;
        PUSH PSW&lt;br /&gt;
        PUSH B&lt;br /&gt;
        PUSH D&lt;br /&gt;
        PUSH H&lt;br /&gt;
        &lt;br /&gt;
        PUSH H&lt;br /&gt;
        LXI B,16&lt;br /&gt;
        DAD B&lt;br /&gt;
        MOV B,H&lt;br /&gt;
        MOV C,L&lt;br /&gt;
        XCHG&lt;br /&gt;
        LXI D,15&lt;br /&gt;
        DAD D&lt;br /&gt;
        XCHG&lt;br /&gt;
        POP H&lt;br /&gt;
        &lt;br /&gt;
    CIKLUS: LDAX D&lt;br /&gt;
        MOV M,A&lt;br /&gt;
        INX H&lt;br /&gt;
        DCX D&lt;br /&gt;
        MOV A,H&lt;br /&gt;
        CMP B&lt;br /&gt;
        JNZ CIKLUS&lt;br /&gt;
        MOV A,L&lt;br /&gt;
        CMP C&lt;br /&gt;
        JNZ CIKLUS&lt;br /&gt;
        &lt;br /&gt;
        POP H&lt;br /&gt;
        POP D&lt;br /&gt;
        POP B&lt;br /&gt;
        POP PSW&lt;br /&gt;
&lt;br /&gt;
=== 3. j.) ===&lt;br /&gt;
Írjon assembly szubrutint, amely a DE regiszterpárban kapott címtől kezdődő 16 bájtban megszámolja a negatív&lt;br /&gt;
számokat (feltételezve, hogy az adatok 8 bites kettes komplemensben ábrázolt előjeles számok), és a kapott eredményt elhelyezi a 8000h memória rekeszbe. A megoldás során ügyeljen arra, hogy a rutin ne változtassa meg a flag-ek állapotát és a regiszterpárok értékét!   &lt;br /&gt;
&lt;br /&gt;
    RUTIN:  PUSH PSW&lt;br /&gt;
        PUSH B&lt;br /&gt;
        PUSH D&lt;br /&gt;
        MVI B,16&lt;br /&gt;
        MVI C,0 &lt;br /&gt;
    SZAMOL: LDAX D&lt;br /&gt;
        ANI 80H&lt;br /&gt;
        JZ NEMNEG&lt;br /&gt;
        INR C       ;ha Z=0, akkor negatív a számunk, ekkor növelünk&lt;br /&gt;
    NEMNEG: DCR B&lt;br /&gt;
        JNZ SZAMOL&lt;br /&gt;
        MOV A,C&lt;br /&gt;
        STA 8000H&lt;br /&gt;
        POP D&lt;br /&gt;
        POP B&lt;br /&gt;
        POP PSW&lt;br /&gt;
        RET&lt;br /&gt;
&lt;br /&gt;
Egy másik megoldás:&lt;br /&gt;
&lt;br /&gt;
        PUSH PSW&lt;br /&gt;
        PUSH B&lt;br /&gt;
        PUSH D&lt;br /&gt;
        PUSH H&lt;br /&gt;
 &lt;br /&gt;
        LXI H,8000H&lt;br /&gt;
        MVI M,0&lt;br /&gt;
        MVI B,0&lt;br /&gt;
    CIKLUS: LDAX D&lt;br /&gt;
        ANI 80H&lt;br /&gt;
        CMP D       ;FELESLEGES&lt;br /&gt;
        JZ POZITIV&lt;br /&gt;
        INR M&lt;br /&gt;
    POZITIV:INX D&lt;br /&gt;
        INR B&lt;br /&gt;
        MOV A,B&lt;br /&gt;
        CPI 16&lt;br /&gt;
        JNZ CIKLUS&lt;br /&gt;
 &lt;br /&gt;
        POP H&lt;br /&gt;
        POP D&lt;br /&gt;
        POP B&lt;br /&gt;
        POP PSW&lt;br /&gt;
        HALT&lt;br /&gt;
&lt;br /&gt;
=== 3. k.) ===&lt;br /&gt;
Írjon assembly szubrutint, amely a HL regiszterpárban kapott címtől kezdődő 254 byte-os adatblokk végére kiszámít egy 2 byte-os ellenőrző szót (a blokk byte-jainak összeadásával), és elhelyezi az adatokat követően. A megoldás során ügyeljen arra, hogy a rutin ne változtassa meg a flag-ek állapotát és a regiszterpárok értékét!&lt;br /&gt;
&lt;br /&gt;
    RUTIN:  PUSH PSW&lt;br /&gt;
        PUSH B&lt;br /&gt;
        PUSH H&lt;br /&gt;
        PUSH D&lt;br /&gt;
        &lt;br /&gt;
        MVI B,254&lt;br /&gt;
        LXI D,0&lt;br /&gt;
        MVI A,0&lt;br /&gt;
    ELL:    PUSH H  &lt;br /&gt;
        MOV A,M     ;HL által mutatott címen lévő adat betöltése A-ba&lt;br /&gt;
        MOV L,A     ;a címen lévő adat, így már a címmutató regiszter alsó részén van (itt elfér nem kell hozzá a H reg)&lt;br /&gt;
        DAD D       ;HL+D -&amp;gt; HL&lt;br /&gt;
        XCHG        ;HL cseréje DE-vel (így DE-ben van az ellenőrző összeg)&lt;br /&gt;
        POP H       &lt;br /&gt;
        INX H       ;cím növelése&lt;br /&gt;
        DCR B&lt;br /&gt;
        JNZ ELL     ;amíg végig nem értünk&lt;br /&gt;
        MOV M,D     ;D betöltése a HL címre&lt;br /&gt;
        INX H&lt;br /&gt;
        MOV M,E     ;a következő byte-ra pedig az E kerül&lt;br /&gt;
            &lt;br /&gt;
        POP D&lt;br /&gt;
        POP H&lt;br /&gt;
        POP B&lt;br /&gt;
        POP PSW&lt;br /&gt;
        RET&lt;br /&gt;
&lt;br /&gt;
Egy másik megoldás:&lt;br /&gt;
&lt;br /&gt;
     PUSH PSW&lt;br /&gt;
     PUSH B&lt;br /&gt;
     PUSH D&lt;br /&gt;
     PUSH H&lt;br /&gt;
     &lt;br /&gt;
     XCHG            ;DE-ben kezdocim&lt;br /&gt;
     LXI H,0         ;reszosszeg HL-ben&lt;br /&gt;
     MVI A,0         ;itt számoljuk a 254 db-ot&lt;br /&gt;
 CIKLUS: PUSH PSW&lt;br /&gt;
     LDAX D&lt;br /&gt;
     MVI B,0&lt;br /&gt;
     MOV C,A&lt;br /&gt;
     DAD B&lt;br /&gt;
     INX D&lt;br /&gt;
     POP PSW&lt;br /&gt;
     INR A&lt;br /&gt;
     CPI 254&lt;br /&gt;
     JNZ CIKLUS&lt;br /&gt;
     MOV A,L&lt;br /&gt;
     STAX D&lt;br /&gt;
     INX D&lt;br /&gt;
     MOV A,H&lt;br /&gt;
     STAX D&lt;br /&gt;
     &lt;br /&gt;
     POP H&lt;br /&gt;
     POP D&lt;br /&gt;
     POP B&lt;br /&gt;
     POP PSW&lt;br /&gt;
&lt;br /&gt;
=== 3. l.) ===&lt;br /&gt;
Írjon assembly szubrutint, amely 15 byte adatot és egy byte ellenőrző karaktert tartalmazó üzenet átvitelét ellenőrzi. A szubrutin bemenete az üzenet kezdőcíme (HL-ben), kimenete legyen hibátlan átvitel esetén Z=1, hibás átvitelkor Z=0. A megoldás során ügyeljen arra, hogy a rutin ne változtassa meg a regiszterpárok (BC,DE,HL) értékét!&lt;br /&gt;
&lt;br /&gt;
    RUTIN:  PUSH B&lt;br /&gt;
        PUSH H&lt;br /&gt;
        PUSH D&lt;br /&gt;
        PUSH H&lt;br /&gt;
        XCHG        ;HL és DE cseréje&lt;br /&gt;
        MVI H,16        ;16 byte másolására fog sorra kerülni&lt;br /&gt;
        LXI B,0     ;ahova másolunk, az a 0-s címen található (feltesszük, hogy a HL címe és ez nem lapolódik össze)&lt;br /&gt;
        PUSH B&lt;br /&gt;
    MASOL:  LDAX D      ;DE által mutatot cím tartalma az A-ban lesz&lt;br /&gt;
        STAX B      ;az A tartalma a BC címre kiíródik&lt;br /&gt;
        INX D&lt;br /&gt;
        INX B&lt;br /&gt;
        DCR H&lt;br /&gt;
        JNZ MASOL&lt;br /&gt;
        &lt;br /&gt;
        POP B       ;a BC-t visszacsökkentjük az eredetire&lt;br /&gt;
        MVI D,16&lt;br /&gt;
    ELL:    LDAX B      ;a BC-n és HL-n található byte-okat kivonogatjuk egymásból&lt;br /&gt;
        SUB M&lt;br /&gt;
        JZ HIBA     ;ha a kivonás eredménye 1, akkor hiba van&lt;br /&gt;
        DCR D   &lt;br /&gt;
        JNZ ELL &lt;br /&gt;
    NOHIBA: XRA A       ;Z-t 1-be állítjuk&lt;br /&gt;
        JMP VEGE        ;és átugorjuk a HIBA részt&lt;br /&gt;
    HIBA:   MOV A,FFH&lt;br /&gt;
        ORA A       ;ezzel a Z-t 0-ba állítottuk&lt;br /&gt;
    VEGE:   POP D&lt;br /&gt;
        POP H&lt;br /&gt;
        POP B&lt;br /&gt;
        RET&lt;br /&gt;
&lt;br /&gt;
Egy másik megoldás:&lt;br /&gt;
&lt;br /&gt;
 RUTIN:&lt;br /&gt;
     PUSH B&lt;br /&gt;
     PUSH D&lt;br /&gt;
     PUSH H          &lt;br /&gt;
     &lt;br /&gt;
     XCHG&lt;br /&gt;
     LXI H,0&lt;br /&gt;
     MVI A,0&lt;br /&gt;
 CIKLUS: PUSH PSW&lt;br /&gt;
     LDAX D&lt;br /&gt;
     MVI B,0 &lt;br /&gt;
     MOV C,A&lt;br /&gt;
     DAD B&lt;br /&gt;
     INX D&lt;br /&gt;
     POP PSW&lt;br /&gt;
     INR A&lt;br /&gt;
     CPI 15&lt;br /&gt;
     JNZ CIKLUS&lt;br /&gt;
     LDAX D&lt;br /&gt;
     CMP L       ;BE VAN ALLITVA A Z FLAG&lt;br /&gt;
 &lt;br /&gt;
     POP H&lt;br /&gt;
     POP D&lt;br /&gt;
     POP B&lt;br /&gt;
 &lt;br /&gt;
     RET&lt;br /&gt;
&lt;br /&gt;
=== 3. m.) ===&lt;br /&gt;
&lt;br /&gt;
Írjon Intel 8085 mikroprocesszor assembly nyelvén a PORTOLV szubrutint, amely a a CPU SID jelének 0 -&amp;gt; 1 átmenetére beolvassa 64H I/O című portot és az adatot az akkumulátorban adja vissza a szubrutint meghívó&lt;br /&gt;
programrésznek.&lt;br /&gt;
&lt;br /&gt;
Írjon a OLV32 szubrutint, amely a PORTOLV szubrutin felhasználásával beolvas 32 byte-ot és elhelyezi a memória 2000H-201FH memóriatartományában. Az OLV32 szubrutin változatlan tartalommal adja vissza a meghívó&lt;br /&gt;
programnak a CPU regisztereket.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    PORTOLV:&lt;br /&gt;
    VAR1:   RIM&lt;br /&gt;
        ANI 80H&lt;br /&gt;
        JNZ VAR1        ;ha SID=0, akkor Z=1 lesz és akkor mehetünk tovább&lt;br /&gt;
    VAR2:   RIM&lt;br /&gt;
        ANI 80H&lt;br /&gt;
        JZ VAR2     ;megvárjuk, míg SID=1 lesz  &lt;br /&gt;
        IN 64H&lt;br /&gt;
        RET&lt;br /&gt;
&lt;br /&gt;
    OLV32:  PUSH PSW&lt;br /&gt;
        PUSH B&lt;br /&gt;
        PUSH D&lt;br /&gt;
        LXI B,2000H&lt;br /&gt;
        MVI D,32&lt;br /&gt;
    MASOL:  CALL PORTOLV&lt;br /&gt;
        STAX B&lt;br /&gt;
        INX B&lt;br /&gt;
        DCR D&lt;br /&gt;
        JNZ MASOL&lt;br /&gt;
        &lt;br /&gt;
        POP D&lt;br /&gt;
        POP B&lt;br /&gt;
        POP PSW&lt;br /&gt;
        RET&lt;br /&gt;
&lt;br /&gt;
Egy másik megoldás:&lt;br /&gt;
     &lt;br /&gt;
 PORTOLV:&lt;br /&gt;
     RIM&lt;br /&gt;
     ANI 80H&lt;br /&gt;
     JZ PORTOLV&lt;br /&gt;
     IN 64H&lt;br /&gt;
     RET&lt;br /&gt;
 &lt;br /&gt;
 OLV32:&lt;br /&gt;
     PUSH PSW&lt;br /&gt;
     PUSH B&lt;br /&gt;
     PUSH D&lt;br /&gt;
     PUSH H&lt;br /&gt;
     &lt;br /&gt;
     KC EQU 2000H&lt;br /&gt;
     VC EQU 201FH&lt;br /&gt;
     LXI H,KC&lt;br /&gt;
     LXI D,VC+1&lt;br /&gt;
 CIKLUS: &lt;br /&gt;
     CALL PORTOLV&lt;br /&gt;
     MOV M,A&lt;br /&gt;
     INX H&lt;br /&gt;
     MOV A,L&lt;br /&gt;
     CMP E&lt;br /&gt;
     JNZ CIKLUS&lt;br /&gt;
     MOV A,H&lt;br /&gt;
     CMP D&lt;br /&gt;
     JNZ CIKLUS&lt;br /&gt;
     &lt;br /&gt;
     POP H&lt;br /&gt;
     POP D&lt;br /&gt;
     POP B&lt;br /&gt;
     POP PSW&lt;br /&gt;
     RET&lt;br /&gt;
&lt;br /&gt;
=== 3. n.) ===&lt;br /&gt;
Írja meg a SENDBYTE 8085 assembly szubrutint, amely a következő specifikáció szerint működik:&lt;br /&gt;
A szubrutin feladata a mellékelt ábrán specifikált hand-shake szekvencia alapján a B regiszterben kapott adat byte továbbítása a 20H I/O címre. A megoldás során ügyeljen arra, hogy a szubrutin a flag-ek értékét ne változtassa meg! Rajzolja fel a szubrutin mellé a rutin folyamatábráját is!&lt;br /&gt;
&lt;br /&gt;
Hand-shake: rajz&lt;br /&gt;
* először megjelenik az érvényes adat a porton&lt;br /&gt;
* majd a SOD jel 0 -&amp;gt; 1 átmenete után (némi várakozás után min kb. 320 ns) a SID jel is 0 -&amp;gt; 1-be váltjuk&lt;br /&gt;
* utána a SOD 0-ba vált (ekkor a porton az adatvezeték nagyimpedanciás lesz/nem lesz adat), ezután a SID is 0-ba váltjuk&lt;br /&gt;
* a lényeg, hogy a SOD 1-be váltását követően de még a 0-ba váltását megelőzően ki kell olvasni az adatot és be kell állítani a megfelelő állapotba a SID-et&lt;br /&gt;
&lt;br /&gt;
Írjon 8085 assembly kódrészletet, mely a 2345h címtől kezdődő 34 byte adatot a SENDBYTE szubrutin segítségével továbbítja.&lt;br /&gt;
&lt;br /&gt;
    SENDBYTE:       ;ez túl sok karakternek tűnik :)&lt;br /&gt;
        PUSH PSW&lt;br /&gt;
    VAR:    RIM&lt;br /&gt;
        ANI 80H&lt;br /&gt;
        JNZ VAR&lt;br /&gt;
        MOV A,B&lt;br /&gt;
        OUT 20H&lt;br /&gt;
        RIM&lt;br /&gt;
        MVI A,0C0H  ;11000000B&lt;br /&gt;
        SIM&lt;br /&gt;
    WSID0:  RIM     &lt;br /&gt;
        ANI 80H&lt;br /&gt;
        JZ WSID0&lt;br /&gt;
        RET&lt;br /&gt;
&lt;br /&gt;
    ;programrészlet&lt;br /&gt;
        LXI D,2345H&lt;br /&gt;
        MVI H,34&lt;br /&gt;
    MASOL:  LDAX D&lt;br /&gt;
        MOV B,A&lt;br /&gt;
        CALL SENDBYTE&lt;br /&gt;
        DCR H&lt;br /&gt;
        JNZ MASOL&lt;br /&gt;
&lt;br /&gt;
Egy másik megoldás:&lt;br /&gt;
 SENDBYTE:&lt;br /&gt;
     RIM&lt;br /&gt;
     ANI 80H&lt;br /&gt;
     JNZ SENDBYTE&lt;br /&gt;
     MOV A,B&lt;br /&gt;
     OUT 20H&lt;br /&gt;
     RIM&lt;br /&gt;
     ORI C0H     ;11000000B&lt;br /&gt;
     SIM&lt;br /&gt;
 VARSID1:RIM&lt;br /&gt;
     ANI 80H&lt;br /&gt;
     JZ VARSID1&lt;br /&gt;
     RIM&lt;br /&gt;
     ANI 7FH     ;01111111B&lt;br /&gt;
     ORI 40H     ;01000000B&lt;br /&gt;
     RET&lt;br /&gt;
&lt;br /&gt;
=== 3. o.) ===&lt;br /&gt;
Írjon 8085 assembly szubrutint, amely a következő specifikáció szerint működik:&lt;br /&gt;
* A szubrutin (GETBLOCK) feladata a 80H I/O címen elhelyezkedő 8255 párhuzamos periféria illesztő A portján 1-es üzemmódban az RST 5.5 IT-vel érkező 32 byte-os adatblokk és a hozzá tartozó 1 byte-os ellenőrző összeg beolvasása. A rutin a beolvasott adatokat a 9000h címtől kezdődően helyezze el. Az ellenőrző összeg számítási algoritmusa:&lt;br /&gt;
* Ai mod 256  1=&amp;lt;i=&amp;lt;32&lt;br /&gt;
* A rutin Z=1-gyel jelezze, ha az ellenőrző összeg helyes, Z=0-val, ha hibás volt. Mindkét esetben az&lt;br /&gt;
akkumulátor a helyes (a számított) ellenőrző összeget tartalmazza! (A rutin bármely regiszter értékét elronthatja!)&lt;br /&gt;
&lt;br /&gt;
* Írja meg a 8255-öst felprogramozó szubrutint (A port: 1-es üzemmód, bemenet; B port: 0-ás üzemmód, kimenet; C port:&lt;br /&gt;
bemenet)&lt;br /&gt;
&lt;br /&gt;
    FELPROG:    &lt;br /&gt;
        MOV A,10111001B&lt;br /&gt;
        OUT 83H&lt;br /&gt;
        RET&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Írja meg azt az RST 5.5-ös IT rutint, amely a 8001h címen elhelyezkedő byte legmagasabb helyértékű bitjének&lt;br /&gt;
bebillentésével jelzi, ha beolvasott egy adatot. Az adat ilyenkor a 8000h memória címen található.  &lt;br /&gt;
&lt;br /&gt;
        ORG 2CH&lt;br /&gt;
    RST55:  LXI D,8001H&lt;br /&gt;
        LDAX D&lt;br /&gt;
        XRI 01H&lt;br /&gt;
        STAX D  &lt;br /&gt;
        RET&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Írja meg a GETBLK szubrutint, az RST 5.5-ös IT rutin használatával Feltételezheti, hogy a rutin hívásakor az RST5.5 IT már engedélyezve van, de ne feledkezzen meg arról, hogy inicializáláskor a megszakítást a 8255-ösben letiltottuk!&lt;br /&gt;
&lt;br /&gt;
    GETBLK: EI&lt;br /&gt;
        MVI B,32        ;32 byte beolvasása&lt;br /&gt;
        MVI C,0     ;az ellenőrző összeg számításához&lt;br /&gt;
        LXI D,9000H &lt;br /&gt;
    BEOLV:  IN 80H&lt;br /&gt;
        CALL RST55&lt;br /&gt;
        STAX D&lt;br /&gt;
        ADD C&lt;br /&gt;
        INX D&lt;br /&gt;
        DCR B&lt;br /&gt;
        JNZ BEOLV&lt;br /&gt;
        LDAX D      ;az ellenőrző összeg beolvasása, a 32 byte-os adatblokk után következik&lt;br /&gt;
        CMP C&lt;br /&gt;
        MOV A,C&lt;br /&gt;
        DI  &lt;br /&gt;
        RET&lt;br /&gt;
&lt;br /&gt;
Egy másik megoldás:&lt;br /&gt;
&lt;br /&gt;
 ORG 2CH:JMP 1000H&lt;br /&gt;
 ORG 1000H:&lt;br /&gt;
     IN 80H&lt;br /&gt;
     MOV M,A&lt;br /&gt;
     PUSH H&lt;br /&gt;
     XCHG        ;HL-ben RESZOSSZEG&lt;br /&gt;
     MOV E,A&lt;br /&gt;
     MVI D,0&lt;br /&gt;
     DAD D       ;HL-ben uj reszosszeg       &lt;br /&gt;
     XCHG        ;DE-ben .............&lt;br /&gt;
     POP H       ;HL-ben cim (9000H)&lt;br /&gt;
     INX H&lt;br /&gt;
     DCR C&lt;br /&gt;
     EI&lt;br /&gt;
     RET&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 RUTIN:  MVI A,B9H   ;10111001B&lt;br /&gt;
     OUT 83H&lt;br /&gt;
     LXI H,9000H&lt;br /&gt;
     LXI D,0&lt;br /&gt;
     MVI C,32&lt;br /&gt;
 KORBE:  MVI A,0&lt;br /&gt;
     CMP C&lt;br /&gt;
     JNZ KORBE&lt;br /&gt;
     MOV A,M&lt;br /&gt;
     CMP E&lt;br /&gt;
     MOV A,E         &lt;br /&gt;
     RET&lt;br /&gt;
&lt;br /&gt;
 ORG 2CH:JMP1000H&lt;br /&gt;
 ORG 1000H:&lt;br /&gt;
     LXI H,8001H&lt;br /&gt;
     MOV A,M&lt;br /&gt;
     ANI 01111111B&lt;br /&gt;
     MOV M,A&lt;br /&gt;
     IN 80H&lt;br /&gt;
     LXI H,8000H&lt;br /&gt;
     MOV M,A&lt;br /&gt;
     LXI H,8001H&lt;br /&gt;
     MOV A,M&lt;br /&gt;
     ORI 10000000B&lt;br /&gt;
     MOV M,A&lt;br /&gt;
     EI&lt;br /&gt;
     RET&lt;br /&gt;
&lt;br /&gt;
=== 3. p.) ===&lt;br /&gt;
&lt;br /&gt;
Készítse el egy 8251 típusú USART-ot tartalmazó soros adó/vevő áramkör terveit és az aszinkron vételi folyamatot megvalósító szubrutin programját.Az USART áramkör a 80h és 81h port címterületet foglalja el.&lt;br /&gt;
Írja meg az áramkört inicializáló és a vételi folyamatot engedélyező programrészt! Az átvitel paraméterei:&lt;br /&gt;
* aszinkron adás és vétel&lt;br /&gt;
* egyszeres Baud-rate&lt;br /&gt;
* 8 adatbit, páros paritás, 1 STOP bit&lt;br /&gt;
* adás letiltva, vétel engedélyezve&lt;br /&gt;
&lt;br /&gt;
    ;programrész&lt;br /&gt;
        MOV A,01111101B     ;119.o./ aszinkron átvitelre vonatkozó Mode Instruction&lt;br /&gt;
        OUT 80H&lt;br /&gt;
        MOV A,11100110B     ;121.o./ Command Instruciton&lt;br /&gt;
        OUT 80H         ;elvileg ugyanarra a címre kell küldeni, mint a Mode Instr.-t&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
Írja meg a 8251-es áramkörön keresztül 32 adatbyte-ot ciklikus lekérdezéssel beolvasó szubrutint, amely az adatot a memória 8000h - 801Fh tartományába írja be! A szubrutinban feltételezheti, hogy a vétel során nem lép fel hiba!&lt;br /&gt;
* a 116.o. alján találhatók szerint a 8251-esen keresztüli adatbeolvasáshoz a C/D(negált)-nak 0-nak kell lennie&lt;br /&gt;
* arra nem jöttem rá, hogy hogyan lehet ezt állítani, lehet, hogy a feladat szerint feltesszük azt, hogy a megfelelő állapotban van&lt;br /&gt;
&lt;br /&gt;
    BEOLV:  LXI D,8000H&lt;br /&gt;
        MVI C,32&lt;br /&gt;
    OLV:    IN 80H&lt;br /&gt;
        STAX D&lt;br /&gt;
        INX D&lt;br /&gt;
        DCR C&lt;br /&gt;
        JNZ OLV&lt;br /&gt;
&lt;br /&gt;
== 4. feladat ==&lt;br /&gt;
&lt;br /&gt;
=== 4. a.) ===&lt;br /&gt;
&lt;br /&gt;
    ;kód            ;PC    ;adatsín ;/RD v. /WR   ;megjegyzés&lt;br /&gt;
    -----------------------------------------------------------------------------------&lt;br /&gt;
    ORG 0000h                                  direktíva&lt;br /&gt;
    LXI SP,0h       0000   31H      /RD&lt;br /&gt;
                    0001   00       /RD&lt;br /&gt;
                    0002   00       /RD        SP=0000H&lt;br /&gt;
    RST 7           0003   FFH      /RD        itt ugrik a 0038H-ra    &lt;br /&gt;
                    FFFF   00       /WR&lt;br /&gt;
                    FFFD   04       /WR        ;SP=FFFD&lt;br /&gt;
    HLT                                        hát ez most kimarad!&lt;br /&gt;
    ORG 38h                                    direktíva&lt;br /&gt;
    XRA A           0038   AEH      /RD        kinullázza A-t, így Z flag=1 lesz&lt;br /&gt;
    LXI H,0F000h    0039   3AH      /RD&lt;br /&gt;
                    0040   00H      /RD&lt;br /&gt;
                    0041   F0H      /RD        HL=F000H&lt;br /&gt;
    MOV M,A         0042   77H      /RD        az F000H címre 0-t tölt be&lt;br /&gt;
    ORA M           0043   B6H      /RD        0 OR 0=0 -&amp;gt; Z=1&lt;br /&gt;
    JNZ 38h         0044   C2H      /RD        feltétel nem teljesül így csak 1 byte-os az ut.&lt;br /&gt;
    RET             0045   C9H      /RD        PC=0000 , SP=0002&lt;br /&gt;
&lt;br /&gt;
=== 4. f.) ===&lt;br /&gt;
&lt;br /&gt;
    ;kód            ;PC    ;adatsín ;/RD vagy /WR   ;megjegyzés&lt;br /&gt;
    --------------------------------------------------------------------&lt;br /&gt;
    ORG 0000h                             direktíva                                      &lt;br /&gt;
    LXI H,9000h     0000   21H     /RD&lt;br /&gt;
                    0001   00H     /RD&lt;br /&gt;
                    0002   90H     /RD    HL=9000H&lt;br /&gt;
    SPHL            0003   F9H     /RD    SP=HL=9000H&lt;br /&gt;
    LXI H,0100h     0004   21H     /RD    &lt;br /&gt;
                    0005   00H     /RD&lt;br /&gt;
                    0006   01H     /RD    HL=0100H&lt;br /&gt;
    PCHL            0007   E9H     /RD    PC=0100H&lt;br /&gt;
    HLT                                   ez most kimarad! (de később idejutunk)&lt;br /&gt;
    CALL 0102h                            ez is! (de ide később se jutunk el)&lt;br /&gt;
    ORG 0100h                             direktíva&lt;br /&gt;
    MVI A,45h       0100   3EH     /RD&lt;br /&gt;
                    0101   45H     /RD    A=45H&lt;br /&gt;
    LXI B,1234h     0102   01H     /RD    &lt;br /&gt;
                    0103   34H     /RD&lt;br /&gt;
                    0104   12H     /RD    BC=1234H&lt;br /&gt;
    XRA C           0105   A9H     /RD    A=34 XOR 45 =   00110100&lt;br /&gt;
                                                  XOR     01000101        &lt;br /&gt;
                                                          -----------&lt;br /&gt;
                                                          01110001= 71H =A, Z flag=0&lt;br /&gt;
    PUSH B          0106   C5H     /RD    &lt;br /&gt;
                    8FFF   34H     /WR&lt;br /&gt;
                    8FFE   12H     /WR    SP=8FFE&lt;br /&gt;
    XRA B           0107   A8H     /RD    A=01100010B= 62H ,  Z flag=0&lt;br /&gt;
    POP D           0108   D1H     /RD&lt;br /&gt;
                    8FFE   12H     /RD&lt;br /&gt;
                    8FFF   34H     /RD    D=1234H&lt;br /&gt;
    HLT             0109   76H     /RD    &lt;br /&gt;
    JMP 0008h       010A   C3H     /RD&lt;br /&gt;
                    010B   08H     /RD&lt;br /&gt;
                    010C   00H     /RD&lt;br /&gt;
    HLT:  ez kimarad mert előtte ugrunk az 1. HLT-re (PC=0008), ahol a progi befagy&lt;br /&gt;
&lt;br /&gt;
== 5. feladat ==&lt;br /&gt;
&lt;br /&gt;
=== 5. a.) ===&lt;br /&gt;
&lt;br /&gt;
Az alábbi kódrészlettel a 8000h címen elhelyezkedő 500 byte-os memóriaterület modulo 256-os ellenőrző&lt;br /&gt;
összegét szeretnénk kiszámolni, és a memória területet követő byte-ban eltárolni. A program hibásan működik.&lt;br /&gt;
Miért? &lt;br /&gt;
&lt;br /&gt;
        LXI H,8000h&lt;br /&gt;
        LXI D,500&lt;br /&gt;
        XRA A&lt;br /&gt;
    ciklus:     &lt;br /&gt;
        ADD M&lt;br /&gt;
        INX H&lt;br /&gt;
        DCX D&lt;br /&gt;
        JNZ ciklus&lt;br /&gt;
        MOV M,A&lt;br /&gt;
&lt;br /&gt;
Válasz: a DCX utasítás nem állítja a Z flaget, így a JNZ utasítás nem működik&lt;br /&gt;
&lt;br /&gt;
=== 5. b.) ===&lt;br /&gt;
Egy i8085-ös mikroszámítógép megszakítási rendszerének megvalósításakor i8259A megszakításvezérlőt&lt;br /&gt;
alkalmaztunk, amely báziscíme 20h. Az alábbi megszakítást úgy szeretnénk megvalósítani, hogy&lt;br /&gt;
bármelyik másik megszakítás-bemenetre érkező kérés azonnal érvényre juthasson mielőtt maga az IRUT rutin&lt;br /&gt;
befejeződik. A program hibásan van megírva. Miért? Mit kellene kijavítani?&lt;br /&gt;
&lt;br /&gt;
    IRUT:   PUSH PSW&lt;br /&gt;
        PUSH B&lt;br /&gt;
        EI&lt;br /&gt;
        OUT 41h&lt;br /&gt;
        IN 40h&lt;br /&gt;
        ADI 1&lt;br /&gt;
        OUT 40h&lt;br /&gt;
        MVI B,3&lt;br /&gt;
    CIKL:   IN 40h&lt;br /&gt;
        ACI 0&lt;br /&gt;
        OUT 40h&lt;br /&gt;
        DCR B&lt;br /&gt;
        JNZ CIKL&lt;br /&gt;
        POP B&lt;br /&gt;
        MVI A,20h&lt;br /&gt;
        OUT 20h&lt;br /&gt;
        POP PSW&lt;br /&gt;
        RET&lt;br /&gt;
&lt;br /&gt;
Az a hiba, hogy a megszakítás vezérlőben az IT nyugtázása (EOI) csak az IT rutin végén történik meg (MVI A,20h; OUT 20h), ezért az alacsonyabb prioritású interruptok csak ez után jutnának érvényre.&lt;br /&gt;
&lt;br /&gt;
=== 5. c.) ===&lt;br /&gt;
&lt;br /&gt;
Ugyanaz mint az [[#5. a.)]]&lt;br /&gt;
&lt;br /&gt;
=== 5. d.) ===&lt;br /&gt;
&lt;br /&gt;
Az alábbi kódrészlettel a 8000h címen elhelyezkedő szót (16bit) szeretnénk hozzáadni a 8150h címen&lt;br /&gt;
elhelyezkedő szóhoz úgy, hogy az eredmény a 8000h címre kerüljön (A szó alacsonyabb helyértékű bájtja&lt;br /&gt;
(LSB) mindig a kisebb címen helyezkedik el.). A program hibásan működik. Miért? Mit kellene kijavítani?&lt;br /&gt;
&lt;br /&gt;
    Osszead:    LXI H,8000h&lt;br /&gt;
        LDA 8150h&lt;br /&gt;
        ADD M       &lt;br /&gt;
        MOV M,A&lt;br /&gt;
        INX H&lt;br /&gt;
        LDA 8151h&lt;br /&gt;
        ADD M       ;itt ADC M kell, mert lehet átvitel a előző byte-ok összadása során&lt;br /&gt;
        MOV M,A&lt;br /&gt;
        RET&lt;br /&gt;
    &lt;br /&gt;
== 6. feladat ==&lt;br /&gt;
&lt;br /&gt;
Ehhez létezik egy javításokat tartalmazó PDF. [[Media:Digit2_ef_V2_megold_6-7-javitott.pdf|Megtekintés.]]&lt;br /&gt;
&lt;br /&gt;
=== 6. a.) ===&lt;br /&gt;
&lt;br /&gt;
;Egy kaszkádosított megszakításkezelő rendszerben, milyen esetben kell parancsbyte-ban megadni a SLAVE megszakításkezelőknek, hogy slave áramkörök? &lt;br /&gt;
:Kaszkádosítás esetén, bufferelt kapcsolás esetén (62.o./3.5. , 63.o./3.6.3.)&lt;br /&gt;
&lt;br /&gt;
;Ebben az esetben hány ICW parancsbyte-ot kell kiadni és miért? &lt;br /&gt;
:4, ICW1-4 (66.o./ 3.6.2. - 3.6.3.) ICW3 a kaszkádosítás miatt kell, az ICW4 pedig a bufferelt kapcsolás miatt (M/S bit)&lt;br /&gt;
&lt;br /&gt;
;Miért van szükség ICW3 parancsbyte-ra? &lt;br /&gt;
:Mert kaszkádosott megszakításkezelő rendszert használunk&lt;br /&gt;
&lt;br /&gt;
;Miért van szükség ICW4 parancsbyte-ra?&lt;br /&gt;
:A master-slave pozíciókat az ICW-4-el lehet beállítani (bufferelt üzemmód esetén szükséges) (M/S bit)&lt;br /&gt;
&lt;br /&gt;
=== 6. b.) === &lt;br /&gt;
Inicializáljon egy 90h báziscímű i8255-ös párhuzamos periféria áramkör: A portját 1-es üzemmódban kimenetre, B portját szintén 1 üzemmódban bemenetre, C port alsó és felső felét bemenetre kell állítani. Adja meg a vezérlő szó értékét! Állítsa be a 8255 INTE ff-jainak értékét is!&lt;br /&gt;
&lt;br /&gt;
    MOV A,10101111B     ;95.o./5.1 táblázat&lt;br /&gt;
    OUT 93H             ;94.o./működési tábla&lt;br /&gt;
    DI&lt;br /&gt;
&lt;br /&gt;
:gondolom az INTE ff-kat mind 0-ra kell állítani, mert ha 1 lenne, akkor az üzembe helyezést követően már kérne megszakítást&lt;br /&gt;
:de az üzemmód megváltoztatásakor a f/f-k törlődnek,így ehhez sztem külön parancs nem szükséges&lt;br /&gt;
&lt;br /&gt;
=== 6. c.) ===&lt;br /&gt;
Egy vegyesen kaszkádosított 8259-es megszakítási rendszerben a MASTER egység IR2 bemenetére SLAVE áramkör&lt;br /&gt;
kapcsolódik. A MASTER egység ugrási táblájának kezdőcíme 8000h, a SLAVE ugrási táblájának kezdőcíme 9000h,&lt;br /&gt;
mindkettő nyolcas osztásban.&lt;br /&gt;
&lt;br /&gt;
Adja meg, hogy milyen ICW3 parancsot kell küldeni a MASTER illetve a SLAVE egységeknek!&lt;br /&gt;
&lt;br /&gt;
    LXI D,8000H ;MASTER&lt;br /&gt;
    MOV A,0000100B&lt;br /&gt;
    INX D&lt;br /&gt;
    STAX D&lt;br /&gt;
&lt;br /&gt;
    LXI H,9001H ;SLAVE, másik módszerrel&lt;br /&gt;
    MOV A,0000010B&lt;br /&gt;
    MOV M,A&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
; Adja meg, mennyi lesz a MASTER IR6 bemenetére érkező megszakítás szubrutinjának kezdőcíme!&lt;br /&gt;
: 802CH (65.o. ADI=0 esetén táblázat)&lt;br /&gt;
&lt;br /&gt;
Adja meg, mennyi lesz a SLAVE IR6 bemenetére érkező megszakítás szubrutinjának kezdőcíme!&lt;br /&gt;
-902CH (65.o. ADI=0 esetén táblázat)&lt;br /&gt;
&lt;br /&gt;
=== 6. d.)===&lt;br /&gt;
Egy aszinkron üzemmódba felprogramozott 8251-es soros áramkör hibásan működik. A program státusz beolvasáskor olyan hibákat olvas, amelyek adat fogadásakor lépnek fel. Melyek lehetnek ezek, mi lehet a hibák oka ?&lt;br /&gt;
&lt;br /&gt;
# OVERRUN ERROR (=túlfutási hiba), akkor ha a puffer-regiszter megelőző tartalmát a CPU még nem olvasta ki és ezt a 8251 felülírja&lt;br /&gt;
# FRAMING ERROR (=kerethiba): 0 színtű STOP bitek érkeznek&lt;br /&gt;
# PARITY ERROR (=paritás hiba): rossz paritás&lt;br /&gt;
&lt;br /&gt;
===6. e.)===&lt;br /&gt;
Mit jelent a BREAK üzemmód a 8251-es áramkörnél? &lt;br /&gt;
* aszinkron üzemmódban folyamatos kiküldhetők a vonalra, ha nincs folyamatban adatkivitel, állapotjelzésre is szolgálhat&lt;br /&gt;
&lt;br /&gt;
Mire alkalmazható? &lt;br /&gt;
* felhasználható megszakításkérés jelzésére&lt;br /&gt;
&lt;br /&gt;
Hogyan lehet beállítani?&lt;br /&gt;
* beállítása: a Command Instruction 3. bitje, a SBRK =1 esetén a TXD=0 lesz (Break karakter)&lt;br /&gt;
&lt;br /&gt;
=== 6. f.)===&lt;br /&gt;
Rajzolja fel egy aszinkron üzemmódban felprogramozott USART kimeneti jelalakját (TxD) 8 bites, 0Fh értékű adat elküldésekor, ha páros paritást és 1 stop bitet alkalmazunk.&lt;br /&gt;
&lt;br /&gt;
    0   1   1   1   1   0   0   1&lt;br /&gt;
       ___ ___ ___ ___         ___&lt;br /&gt;
   ___|               |___ ___|&lt;br /&gt;
&lt;br /&gt;
=== 6. g.)===&lt;br /&gt;
Egy i8085-ös mikroprocesszoros rendszerben az A, B, C jelek külön kártyákon állnak elő, változásuk egymástól független, de mindannyian szeretnének időszakosan megszakítást kérni a processzor RST5.5 vonalán. Milyen kimenetű kapukat kell a szaggatottal jelölt dobozokba tervezni, hogy a rendszer helyesen működjön, miért?&lt;br /&gt;
* Open collector, mivel a kimeneteket összekötöttük, és a rendszer tartalmazott közvetlen felhúzó ellenállást&lt;br /&gt;
&lt;br /&gt;
=== 6. h.) ===&lt;br /&gt;
Egy i8085-ös mikroprocesszoros rendszerben az A, B, C jelek külön kártyákon állnak elő, változásuk egymástól független, de mindegyiket szeretnénk időszakosan címezhetően külön-külön beolvasni a processzor D0 adatvonalán. Milyen kimenetű kapukat kell a szaggatottal jelölt dobozokba tervezni, hogy a rendszer helyesen működjön, miért?&lt;br /&gt;
* Tristate,  mivel a kimenetek összekötöttük és a rendszer nem tartalmazott közvetlen felhúzó ellenállást&lt;br /&gt;
&lt;br /&gt;
===6. i.)===&lt;br /&gt;
Egy 8085 mikroprocesszoros rendszerben 1 master és 4 slave 8259-es IT vezérlőt használunk. Hány megszakítást tudunk összesen lekezelni a 8259-esekkel?&lt;br /&gt;
* 4*8+(8-4)=36&lt;br /&gt;
* A 4 Slave 8 megszakítást tud kezelni + a Master maradék IR bemenetei felhasználhatók megszakításkérés céljára (60.o./3.4.)&lt;br /&gt;
&lt;br /&gt;
A fenti konfigurációt úgy kötötték be, hogy a slave egységek a master 0,2,4 és 6 sorszámú bemenetére kapcsolódnak. A rendszer hibásan működik. Miért? Indokolja a választ!&lt;br /&gt;
* ha a Masternek egyedi megszakításkérő vezetékei is vannak, akkor a IR0 bemenetre nem szabadna az egyik Slave-t sem rákötni, ugyanis a CAS vezetékek 0 állapota egyszerre jelentené a Master és az egyik Slave megszakításkérését (62.o./3.4.)&lt;br /&gt;
&lt;br /&gt;
A fenti konfigurációban az összes vezérlő egy közös meghajtón (74LS245) keresztül csatlakozik a rendszersínre. Hogyan lehet ilyen esetben az egyes vezérlőknek megmondani, hogy master vagy slave szerepet játszanak?&lt;br /&gt;
* az ICW 4 parancsbyte 2. bitjével (=M/S) (66.o./3.6.3.)&lt;br /&gt;
&lt;br /&gt;
=== 6. j.)===&lt;br /&gt;
Egy DMA vezérlő mind a 4 csatornájára egy-egy periféria csatlakozik. Használható-e ilyenkor az 1-es csatorna&lt;br /&gt;
AUTOLOAD üzemmódban? Indokolja a választ!&lt;br /&gt;
*Nem, csak a CH2 és CH3 használható (81.o./4.6.4.)&lt;br /&gt;
&lt;br /&gt;
Programozza fel a DMA vezérlőt AUTOLOAD üzemmódba úgy, hogy a 9000h memóriacímtől kezdődő címre&lt;br /&gt;
periódikusan 128 byte adatot legyen képes betölteni a perifériából. A 8257-es báziscíme: 70H.&lt;br /&gt;
&lt;br /&gt;
        LXI D,9000H&lt;br /&gt;
        MVI B,128&lt;br /&gt;
        MOV A,10101111B&lt;br /&gt;
        OUT 78H         ;beírás A3=1, A2=A1=A0=0&lt;br /&gt;
    TOLT:   IN 78H      ;kiolvasás is A3=1, A2=A1=A0=0&lt;br /&gt;
        STAX D&lt;br /&gt;
        INX D&lt;br /&gt;
        DCR B&lt;br /&gt;
        JNZ TOLT&lt;br /&gt;
        END&lt;br /&gt;
&lt;br /&gt;
=== 6. k.) ===&lt;br /&gt;
Mi különbség adatátvitel szinkronizálása szempontjából a 8251-es soros áramkör aszinkron és szinkron soros adatátvitele között?&lt;br /&gt;
* az aszinkron átvitel esetén a start és stop bitek segítségével szinkronizájla az átvitelt, a start bit megérkezésést az RXD 1 -&amp;gt; 0 átmenet jelzi&lt;br /&gt;
* a szinkron átvitel esetén a szinkronizálást külső, vagy belső eljárással kell megoldani, SYNC karakter érkezésére várunk (belső) vagy a SYNDET-et bemenetként programozzuk fel&lt;br /&gt;
&lt;br /&gt;
=== 6. l.) ===&lt;br /&gt;
Programozzon fel egy 8253-as timer áramkört, amely 3,072MHz-ről 4800Hz frekvenciára osztja le jelet, 50-50%-os kitöltésűre! A 8253-as áramkör binárisan számol, és 90h báziscíme van. Használja a 0-s számlálót!&lt;br /&gt;
&lt;br /&gt;
    ;3,072 Mhz=4800*640&lt;br /&gt;
    ;640= 0000 0001 | 0100 0000&lt;br /&gt;
&lt;br /&gt;
    MOV A,00111110B&lt;br /&gt;
    OUT 93H&lt;br /&gt;
    MOV A,01H&lt;br /&gt;
    OUT 90H&lt;br /&gt;
    MOV A,80H&lt;br /&gt;
    OUT 91H&lt;br /&gt;
&lt;br /&gt;
=== 6. m.) === &lt;br /&gt;
Egy kaszkádosított 8259-es rendszerben a MASTER egység IR7 és IR6 bemenetére SLAVE áramkörök kapcsolódnak.&lt;br /&gt;
Adja meg, hogy milyen ICW3 parancsot kell küldeni a Master egységnek!&lt;br /&gt;
* 11000000 (66.o./3.6.2.)&lt;br /&gt;
&lt;br /&gt;
Adja meg, hogy milyen ICW3 parancsot kell küldeni Az IR6-ra csatlakozó SLAVE egységnek&lt;br /&gt;
* 01000000 (66.o./3.6.2.)&lt;br /&gt;
&lt;br /&gt;
Hogyan tudjuk kijelölni, hogy lesz ICW3 parancs?&lt;br /&gt;
*az ICW1 SNGL bitjének 0 állapotba állításával, az ICW1 1. bitje (D1)  (63.o. táblázat, 64.o. ICW1 - SNGL)&lt;br /&gt;
&lt;br /&gt;
== 7. feladat ==&lt;br /&gt;
&lt;br /&gt;
Ehhez létezik egy javításokat tartalmazó PDF. [[Media:Digit2_ef_V2_megold_6-7-javitott.pdf|Megtekintés.]]&lt;br /&gt;
&lt;br /&gt;
===7. a.)===&lt;br /&gt;
Sorolja fel az i8085 állapotait!&lt;br /&gt;
* RUN, WAIT, HALT, HOLD&lt;br /&gt;
&lt;br /&gt;
===7. b.)===&lt;br /&gt;
Szerkesszen gráfot, amely az i8085-ös állapotainak kapcsolatát ábrázolja! A nyilazott ágakra az állapot-változások okait kell felírni.&lt;br /&gt;
&lt;br /&gt;
* RUN -&amp;gt; WAIT:  Ready jel 0 szintre vált&lt;br /&gt;
* WAIT -&amp;gt; RUN:  Ready jel 1-re vált&lt;br /&gt;
* RUN -&amp;gt; HALT:  HLT parancs kiadásakor&lt;br /&gt;
* HALT -&amp;gt; RUN: megszakításkérés érkezésekor&lt;br /&gt;
* RUN -&amp;gt; HOLD: HOLD 1-be vált&lt;br /&gt;
* HOLD -&amp;gt; RUN:  a HOLD jel megszűnése után&lt;br /&gt;
* HALT -&amp;gt; HOLD: HOLD igény érkezésekor (HOLD=1)&lt;br /&gt;
* HOLD -&amp;gt; HALT: HOLD megszűnése (HOLD=0)&lt;br /&gt;
&lt;br /&gt;
=== 7. c.) ===&lt;br /&gt;
Milyen esetekben kerül a 8085-ös mikroprocesszor HALT állapotból RUN állapotba?&lt;br /&gt;
* HALT -&amp;gt; RUN: megszakításkérés érkezésekor, illetve reset hatására&lt;br /&gt;
&lt;br /&gt;
===7. d.)===&lt;br /&gt;
Sorolja fel azokat az eseteket, amikor az INTE FF = 0 értékű lesz!&lt;br /&gt;
* DI parancs kiadásakor, reset, megszakítás érvényre jutása után&lt;br /&gt;
&lt;br /&gt;
===7. e.) ===&lt;br /&gt;
Sorolja fel azokat az eseteket, amikor az RST7.5 FF = 0 értékű lesz!&lt;br /&gt;
* SIM utasítás esetén,ha a 4. bittel töröljük az RST7.5-t (A4=1), illetve RESET után&lt;br /&gt;
&lt;br /&gt;
===7. f.)===&lt;br /&gt;
Az i8085-ös processzor reszetelésekor milyen értékű lesz az INTEFF, és mi lesz a PC tartalma?&lt;br /&gt;
* az INTEFF-kat törli, tehát 0 lesz , PC:0000H&lt;br /&gt;
&lt;br /&gt;
===7. g.)===&lt;br /&gt;
Milyen kezdőcímeken kezdődnek az RST 2 és RST 5 utasításokkal meghívott szubrutinok, illetve az RST 5.5 és az RST 7.5 megszakítási szubrutinok?&lt;br /&gt;
* RST 2: 10H&lt;br /&gt;
* RST 5: 28H&lt;br /&gt;
* RST 5.5: 2CH&lt;br /&gt;
* RST 7.5: 3CH&lt;br /&gt;
&lt;br /&gt;
=== 7. h.)===&lt;br /&gt;
Mit kell kezdőértéknek az SP-be betölteni ha a programozó úgy kívánja beállítani a STACK tárat, hogy az első értékes beírt bájt 8FFFh-ra íródjon? Miért?&lt;br /&gt;
* 9000H, mert &#039;&#039;először&#039;&#039; csökkenti az SP értékét a processzor, és csak utána ír a stackre.&lt;br /&gt;
&lt;br /&gt;
===7. i.)===&lt;br /&gt;
Hogyan jelezzük a fordítóprogramnak, hogy a generált kódot az 1698h címtől kezdődően helyezze el?&lt;br /&gt;
* ORG 1698H&lt;br /&gt;
&lt;br /&gt;
===7. j.)===&lt;br /&gt;
Hogyan jelezzük a fordítóprogramnak, hogy az 1712h címtől kezdődően helyezze el a „digit” stringet?&lt;br /&gt;
&lt;br /&gt;
    ORG 1712H&lt;br /&gt;
    KAR DB &amp;quot;digit&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===7. k.)===&lt;br /&gt;
Hogyan jelezzük a fordítóprogramnak, hogy inicializált vagy inicializálatlan helyfoglalás történik?&lt;br /&gt;
* inicializált: DB vagy DW,&lt;br /&gt;
* inicializálatlan: DS direktívát használunk&lt;br /&gt;
&lt;br /&gt;
===7. l.)===&lt;br /&gt;
Mi a különbség az EQU 1200h és a DW 1200h direktívák között?&lt;br /&gt;
* CIMKE EQU 1200H: értékadás, hivatkozás a CIMKE-vel&lt;br /&gt;
* DW 1200H:  inicializált helyfoglalás&lt;br /&gt;
&lt;br /&gt;
===7. m.)===&lt;br /&gt;
Sorolja fel az i8085 mikroprocesszor megszakítással kapcsolatos jeleit!&lt;br /&gt;
* TRAP, RST 5.5,6.5,7.5, INTR&lt;br /&gt;
&lt;br /&gt;
===7. n.)===&lt;br /&gt;
Milyen típusú kimenettel rendelkező áramkörökkel lehet busz rendszerű vezetékeket meghajtani? Húzza alá, hogy melyik típusú kimenet alkalmas arra, hogy egy vezetéket (busz) több kimenet egyidejűleg is meghajthasson?&lt;br /&gt;
* tristate, &amp;lt;u&amp;gt;open collector&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===7. o.)===&lt;br /&gt;
Miért nem lehet két totem-pole kimenetű áramkör kimeneteit összekötni? Indokolja a választ? (sztem érdemes indokolni:))&lt;br /&gt;
* mert az ellenáláskon túl nagy teljesítmény disszipálódna, és ennek eredménye a tönkremenetel&lt;br /&gt;
&lt;br /&gt;
===7. p.)===&lt;br /&gt;
i8255-ös párhuzamos periféria áramkör A portját 1-es üzemmódban kimenetre, B-portját 0 üzemmódban bemenetre, C port alsó felét bemenetre, felső felét kimenetre kell állítani. Adja meg a vezérlő szó értékét!&lt;br /&gt;
* 10100011&lt;br /&gt;
&lt;br /&gt;
Adja meg, melyik regiszterbe és milyen értéket kell írni, hogy a fenti üzemmód esetén a PC4 portbit 0 , illetve 1 értékű legyen!&lt;br /&gt;
* Bit Set/Reset művelettel: (a 8255-ös címe+3) címre kell kiküldeni a 00001000 byte-ot a 0-ba állításhoz, 00001001 byte-ot az 1-be állításhoz&lt;br /&gt;
&lt;br /&gt;
===7. q.)===&lt;br /&gt;
Egy 3 gépi ciklusból álló utasítás (pl.: IN 83h) végrehajtása során az első gépi ciklus T1 fázisában egyidőben High (1) értékűek lesznek az INT és a HOLD bemenetek.&lt;br /&gt;
&lt;br /&gt;
;Mikor adja át a DMA vezérlőnek a 8085-ös a busz vezérlési jogot? Indokolja a válaszát!&lt;br /&gt;
:a HOLD bemenet 1-be váltásakor&lt;br /&gt;
&lt;br /&gt;
;Mikor jut érvényre a megszakítás (megszakításkérés engedélyezett állapotban van és nincs más kérés) Indokolja a válaszát!&lt;br /&gt;
:a HOLD jel megszűnését követően, hiszen a 7. b.) feladatban leírtak szerint működik a 8085, HOLD állapotból HALT-ba a HOLD=0-t követően, a HALT-ból a RUN-ba a megszakításkérést követően jut&lt;/div&gt;</summary>
		<author><name>Prisonerhu</name></author>
	</entry>
	<entry>
		<id>https://vik.wiki/index.php?title=Digit%C3%A1lis_technika_2_-_Megold%C3%A1sok_a_V2-es_ellen%C5%91rz%C5%91_feladatsorhoz&amp;diff=166248</id>
		<title>Digitális technika 2 - Megoldások a V2-es ellenőrző feladatsorhoz</title>
		<link rel="alternate" type="text/html" href="https://vik.wiki/index.php?title=Digit%C3%A1lis_technika_2_-_Megold%C3%A1sok_a_V2-es_ellen%C5%91rz%C5%91_feladatsorhoz&amp;diff=166248"/>
		<updated>2013-05-23T15:48:14Z</updated>

		<summary type="html">&lt;p&gt;Prisonerhu: /* 3. n.) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Vissza|Digitális technika 2}}&lt;br /&gt;
[[Category:Digitális technika 2]]&lt;br /&gt;
&lt;br /&gt;
Ezen az oldalon a [[Digitális technika 2#Régi és új Digit2|régi ötkredites]] Digit2 ellenőrző kérdéseihez összegyűjtött megoldások vannak. A megoldások nem mindenhol teljesek vagy jók. Az új Digit2-höz már más ellenőrző feladatsort adott ki a tanszék.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:right;margin:0.5em;&amp;quot; class=&amp;quot;noautonum&amp;quot;&amp;gt;__TOC__&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Media:Digit2_ef_V2.pdf|A V2-es feladatsor itt érhető el.]]&lt;br /&gt;
&lt;br /&gt;
== 1. feladat ==&lt;br /&gt;
&lt;br /&gt;
* [[Media:Digit2_ef_V2_megold_1_a_ell.pdf‎|PDF az 1/a) feladathoz]]&lt;br /&gt;
&lt;br /&gt;
== 2. feladat ==&lt;br /&gt;
&lt;br /&gt;
by Lacee&lt;br /&gt;
(a hibákat jelezni kérem a prisonerhu{{kukac}}freemail.hu címen)&lt;br /&gt;
&lt;br /&gt;
=== 2. a) ===&lt;br /&gt;
&lt;br /&gt;
Készítsen megszakítási vonalakat kezelő áramkört, amely egy 8085-ös processzoron alapuló sín RST 5.5-ös és RST 6.5-ös megszakítási vonalaira csatlakozva2 db külsô megszakítás (IT1 és IT2) fogadására alkalmas.&lt;br /&gt;
&lt;br /&gt;
A külső megszakítások kezelését külön-külön áramkörök végzik, amelyek a külső megszakítás felfutó élére kérnek megszakítást és alaphelyzetbe OUT utasítással állíthatók (vagy a ResetOut jel hatására). Egy megszakítási impulzus csak egyszer kérjen megszakítást. Az IT1 megszakítás hatására a C regiszter 55h, IT2 hatására a C regiszter AAh értéket vesz fel. A megszakítási flip-flopok 11h (IT1) és 17h (IT2) címen érhetők el.&lt;br /&gt;
&lt;br /&gt;
* Készítse el a rendszer inicializálását végző főprogramot (40h címtől kezdődően)!&lt;br /&gt;
* Készítse el a megszakítási szubrutinokat! &lt;br /&gt;
&lt;br /&gt;
        RST55 EQU 2CH&lt;br /&gt;
        RST65 EQU 34H&lt;br /&gt;
        C1 EQU 55H  &lt;br /&gt;
        C2 EQU AAH&lt;br /&gt;
        IT1 11H&lt;br /&gt;
        IT2 17H&lt;br /&gt;
 &lt;br /&gt;
        JMP INIC&lt;br /&gt;
        ORG 0040H&lt;br /&gt;
    INIC:&lt;br /&gt;
        MVI A,00001100B ;RST 7.5-T LETILTJUK, A TÖBBIT ENGEDÉLYEZZÜK&lt;br /&gt;
        SIM     ;MASZK BEÁLLÍTÁSA&lt;br /&gt;
        EI      ;MEGSZAKÍTÁS ENG&lt;br /&gt;
        &lt;br /&gt;
    VAR:    JMP VAR     ;VÉGTELEN CIKLUS, AZ RST-KRE VÁR, AZOK MEGSZAKÍTJÁK&lt;br /&gt;
 &lt;br /&gt;
        ORG RST55   ;RST55 CÍMÉN VAN,ÍGY HA MEGSZAKÍTÁS TÖRTÉNIK, AKKOR IDE UGRIK A PROGI&lt;br /&gt;
    MEGSZ1: MVI C,C1        ;BEÁLLÍTJUK A KÍVÁNT ÉRTÉKET    &lt;br /&gt;
        OUT IT1     ;VISSZAÁLLÍTJUK AZ IO-T&lt;br /&gt;
        EI      ;MEGSZAKÍTÁS ÉRVÉNYRE JUTTATÁSA&lt;br /&gt;
        RET&lt;br /&gt;
 &lt;br /&gt;
        ORG RST65   ;AZ ELÕBBI MINTÁJÁRA...&lt;br /&gt;
    MEGSZ2: &lt;br /&gt;
        MVI C,C2    &lt;br /&gt;
        OUT IT2&lt;br /&gt;
        EI&lt;br /&gt;
        RET&lt;br /&gt;
&lt;br /&gt;
=== 2. b) ===&lt;br /&gt;
&lt;br /&gt;
Írjon assembly szubrutint (KONV), amely az A regiszterben megkapott byte-ot átírja a 74LS374-es regiszter bekötésének megfelelően. A szubrutin kimenete az átkonvertált byte az A regiszterben. (A szubrutin más regiszterek tartalmát nem ronthatja el!)&lt;br /&gt;
&lt;br /&gt;
Írjon ellenőrző 8085-ös assembly szubrutint (ELO), amely az összes lehetséges kombinációval ellenőrzi a kimeneti regiszter bekötését. A szubrutin lefutása után a D,E regiszterpárban legyen a felismert hibák száma! (A szubrutin a D,E regiszterpár kivételével a regiszterek tartalmát nem ronthatja el!) A megoldásban használja az előző feladatban definiált KONV szubrutint! A kimeneti regiszter 0FFh I/O címen írható és 01Fh címen olvasható.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    PÉLDA1 A MÛKÖDÉSRE&lt;br /&gt;
        10101111    ;A BEJÖVÕ ADAT -&amp;gt; EZT KELL KAPNUNK A PÉLDA1-BEN: 01011111&lt;br /&gt;
    RRC 11010111    ;JOBBRA FORGATJUK&lt;br /&gt;
    AND 01010101    ;ÖSSZEÉSELJÜK  55H-VAL (MÁSNÉVEN MASZKOLÁS)&lt;br /&gt;
        ----------&lt;br /&gt;
    =   01010101 -&amp;gt; D   ;AZ EREDMÉNYT BEÍRJUK A (D) REG-BE&lt;br /&gt;
&lt;br /&gt;
    RLC 01011111    ;AZ EREDETI ADATOT FORGATJUK BALRA&lt;br /&gt;
    AND 10101010    ;ÉSELJÜK AAH-VAL&lt;br /&gt;
        ----------&lt;br /&gt;
    =   00001010 -&amp;gt; H   ;KIMENTJÜK H-BA, A PROGIBAN NEM KELL H-BA MENTENI,MERT AZ UTANA LEVÕ PARANCS A&lt;br /&gt;
          VAGYOLÁS ÉS AHHOZ AZ A- TARTALMA KELL, AMI MOST PONT A H-BA RAKOTTAL EGYEZIK MEG&lt;br /&gt;
&lt;br /&gt;
    H OR D&lt;br /&gt;
        01010101    &lt;br /&gt;
        00001010    &lt;br /&gt;
        ----------  &lt;br /&gt;
        01011111    ;AZ EREDMÉNY!&lt;br /&gt;
&lt;br /&gt;
    PÉLDA2:&lt;br /&gt;
        10101110 -&amp;gt;EBBÕL EZT:01011101&lt;br /&gt;
    RRC 01010111&lt;br /&gt;
    AND 01010101&lt;br /&gt;
        ----------&lt;br /&gt;
    =   01010101 -&amp;gt; D&lt;br /&gt;
&lt;br /&gt;
    RLC 01011101&lt;br /&gt;
    AND 10101010&lt;br /&gt;
        -----------&lt;br /&gt;
    =   00001000 -&amp;gt; H&lt;br /&gt;
&lt;br /&gt;
    H OR D&lt;br /&gt;
        01010101&lt;br /&gt;
        00001000&lt;br /&gt;
        -----------&lt;br /&gt;
        01011101&lt;br /&gt;
&lt;br /&gt;
    ;NA ÉS VÉGRE A PROGI&lt;br /&gt;
    KONV:   PUSH H&lt;br /&gt;
        PUSH D&lt;br /&gt;
        PUSH PSW    ;kimentjük A-t&lt;br /&gt;
        RRC     ;jobbra forgatunk&lt;br /&gt;
        ANI 01010101B   ;maszkoljuk 55H-val&lt;br /&gt;
        MOV D,A     ;a maszkolt byte-ot kimentjük D-be&lt;br /&gt;
        POP PSW     ;vissza az A-t&lt;br /&gt;
        RLC         ;balra forgatjuk&lt;br /&gt;
        ANI 10101010B   ;maszkoljuk AAH-val&lt;br /&gt;
        ORA D       ;összevagyoljuk D-vel&lt;br /&gt;
        POP D       ;POPpolgatunk&lt;br /&gt;
        POP H&lt;br /&gt;
        RET&lt;br /&gt;
        &lt;br /&gt;
    ELO:    &lt;br /&gt;
        PUSH PSW&lt;br /&gt;
        PUSH H&lt;br /&gt;
        PUSH B&lt;br /&gt;
        PUSH A  &lt;br /&gt;
        MVI B,0H&lt;br /&gt;
        LXI D,0H&lt;br /&gt;
    FUT:&lt;br /&gt;
        MOV A,B&lt;br /&gt;
        OUT 0FFH    ;a B 0-tól FF-ig megy, ez az összes lehetséges kombináció&lt;br /&gt;
        CALL KONV   ;az A-ban a B-nek megfelelő beolvasott (átkonvertált) adat lesz&lt;br /&gt;
        MOV C,A     &lt;br /&gt;
        IN  01FH        ;beolvassuk a reg tartalmát&lt;br /&gt;
        CMP C       ;ha A=C akkor jó (C:a B konvertált alakja, A:a közvetlenül visszaolvasott alak&lt;br /&gt;
        &lt;br /&gt;
        JZ TOVABB   ;ha B=C -&amp;gt; Z=1, tehát nem kell növelni a DE-t&lt;br /&gt;
        INX D       ;ha azonban Z=0, növeljük DE-t&lt;br /&gt;
    TOVABB: INR B       &lt;br /&gt;
        MOV A,FF&lt;br /&gt;
        CMP B   &lt;br /&gt;
        JNZ FUT     ;ha B végigpörgött, tehát elérte az FF-t, akkor kilépünk&lt;br /&gt;
        POP A&lt;br /&gt;
        POP B&lt;br /&gt;
        POP H&lt;br /&gt;
        POP PSW&lt;br /&gt;
&lt;br /&gt;
=== 2. c) ===&lt;br /&gt;
&lt;br /&gt;
Írja meg a VIZS 8085 assembly szubrutint, amely az A regiszterben kapott értéket beírja a kimeneti regiszterbe, majd a kimenet értékét visszaolvassa és ellenőrzi, hogy a beérkezett karakter helyes-e? Hiba esetén a szubrutinból való visszatéréskor Z=1, különben Z=0 legyen!&lt;br /&gt;
&lt;br /&gt;
* A kimeneti egység K1…K8 jelei a 0ACh IO címen olvashatók vissza.&lt;br /&gt;
* a kimeneti regiszter (74374) a 0AAh IO címen írható&lt;br /&gt;
* A kimeneti regiszter minden második bitje (K0,K2,K4,K6) negáltan legyen kivezetve.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    VIZS:   OUT 0AAH    ;BEÍRJUK AZ A REG TARTALMÁT A KIMENETI REG-BE&lt;br /&gt;
        AND 55H     ;A KIMENET ÉRTÉKE NEM A BEÍRT A-VAL LESZ EGYENLÕ&lt;br /&gt;
        XRA FFH     ;EZÉRT MEGCSINÁLJUK SZOFTVERESEN A BYTE MINDEN MÁSODIK BITJÉNEK NEGÁLÁSÁT&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    ;példa 1:a fenti műveltre (AND 55H;XRA FFH)&lt;br /&gt;
    kiírt adat: &lt;br /&gt;
        11111111  -&amp;gt; ebből ezt kell kapnunk: 10101010&lt;br /&gt;
    AND 01010101&lt;br /&gt;
        -----------&lt;br /&gt;
        01010101&lt;br /&gt;
    XRA 11111111&lt;br /&gt;
        -----------&lt;br /&gt;
        10101010  -&amp;gt;és kész!&lt;br /&gt;
&lt;br /&gt;
    ;példa 2:&lt;br /&gt;
    kiírt adat:&lt;br /&gt;
        10111011  -&amp;gt;ez lesz belőle: 11101110&lt;br /&gt;
    AND 01010101&lt;br /&gt;
        -----------&lt;br /&gt;
        00010001&lt;br /&gt;
    XRA 11111111&lt;br /&gt;
        -----------&lt;br /&gt;
        11101110  -&amp;gt; ready!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    ;és a progi folytatása&lt;br /&gt;
        MOV B,A     ;elmentjük B-be, mert később a visszaolvasott adat alapból az A-ba kerül és felülírja ezt&lt;br /&gt;
        IN 0ACH     ;visszaolvasás&lt;br /&gt;
        CMP B       ;a szokásos vizsgálat, A-ból kivonjuk a B-t(az ellenőrző byte-ot)&lt;br /&gt;
        JNZ Z1      ;és ha az eredmény nem 0 (akkor Z=0,és hiba van), a feladata pont az ellentetjét kéri&lt;br /&gt;
        XRA A       ;ezért a Z flaget megnegáljuk az alábbi paranccsal&lt;br /&gt;
        JMP VEGE&lt;br /&gt;
    Z1: MOV A,1H&lt;br /&gt;
        ORA A       &lt;br /&gt;
    VEGE:   RET&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 2. d) ===&lt;br /&gt;
&lt;br /&gt;
Illesszen i8085-ös mikroprocesszoros rendszersínre két 8251-es soros periféria illesztő áramkört. Az „A” áramkör csak kimenetre, a „B” áramkör csak bemenetre van felprogramozva. Az „A” áramkör TxD kimenetét a „B” áramkör RxD bemenetére kell kötni. Mindkét áramkör TxC és RxC órajel bemeneteire CLK96 órajel van kötve. Inicializáláskor mindkét áramkör programozása: aszinkron üzemmód, 8 bites karakter, páros paritás és 2 stop bit. A „B” áramkör az /RST 5,5 sínen kér megszakítást. Az „A” áramkör báziscíme 0AAh, a „B” áramkör báziscíme 0AEh.&lt;br /&gt;
&lt;br /&gt;
Írja meg azt a két assembly programrészletet, amely a két 8251-est felprogramozza a fenti konfigurációnak megfelelően!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    AFELPROG:&lt;br /&gt;
        ;először a MODE INSTRUCTION-t kell kiküldeni&lt;br /&gt;
        ;kódszó: 11111101B - a alsó 2 bit értéke elvileg úgy jön ki, hogy a TxC és RxC órajeleknek 1-szeres arány kell legyen&lt;br /&gt;
        MOV A,FDH&lt;br /&gt;
        OUT 0AAH&lt;br /&gt;
        MOV A,00    000001B     ;Command Instruction&lt;br /&gt;
        OUT 0AAH        &lt;br /&gt;
        RET&lt;br /&gt;
        &lt;br /&gt;
&lt;br /&gt;
    BFELPROG:&lt;br /&gt;
        ;kódszó: ugyanaz,mint az előbb&lt;br /&gt;
        MOV A,FDH&lt;br /&gt;
        OUT 0AEH&lt;br /&gt;
        MOV A,00000000B     ;Command Instruction, B lesz a vevő&lt;br /&gt;
        OUT 0AEH    &lt;br /&gt;
        JMP 002CH&lt;br /&gt;
        RET&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 2. e) NR! ===&lt;br /&gt;
&lt;br /&gt;
Illesszen a 8085 mikroprocesszor sínrendszerére 8255-ös típusúPPIO áramkört, amely a 94H, 95H, 96H, 97H portcímeket foglalja el. A PPIO áramkör B portjára egy 8 bites párhuzamos adat kimenettel rendelkező periféria csatlakozik, (tehát a B portot bemenetként kell felprogramozni) amely hand-shaking (kézfogásosos) jelekkel ütemezi az adatátvitelt. Adat beolvasása esetén az áramkör kérjen megszakítást a CPU RST5.5 bemenetén. A periféria 8 adatvezetéken kívül az adattal egyidőben megjeleníti a PEVEN páros paritás jelet is. A PEVEN jel csak a hand-shaking folyamat közben áll rendelkezésre.&lt;br /&gt;
&lt;br /&gt;
Vegye figyelembe, hogy a megszakítási szubrutinban megvalósított adatbeolvasás időpontjában nem biztos, hogy a PEVEN paritás rendelkezésre áll, viszont a feladathoz feltétlen szükséges. Ezért javasolt a paritás jel mintavételezése (a megfelelő hand-shaking jellel) és letárolása a PPIO áramkörön kívül, majd beolvasása az A porton keresztül (pl. PA0 bemeneten) a megszakítási szubrutinban.&lt;br /&gt;
&lt;br /&gt;
* Írjon INIC55 szubrutint, amely elvégzi a PPIO áramkör fentiek szerinti inicializálást, és az SP beállítását, ha a STACK 8F00h és 8FFFh memóriatartományban van&lt;br /&gt;
* Írjon RST5.5 megszakítási szubrutint, amely beolvassa az adatot és a paritást PPIO áramkörről, ellenőrzi paritást, majd azadatot elhelyezi a 3456H című memória byte-ban, illetve paritáshiba esetén megnöveli a 3457H című memória byte tartalmát.&lt;br /&gt;
&lt;br /&gt;
    INIC55: ORG 8F00H   &lt;br /&gt;
        TER DS FF   ;STACK helyfoglalás&lt;br /&gt;
        &lt;br /&gt;
        ORG 0H&lt;br /&gt;
        ;STÁTUSZ szó: 10111111  - segédlet 95-97.oldala alapján&lt;br /&gt;
        MOV A,DFH&lt;br /&gt;
        OUT 97H&lt;br /&gt;
        &lt;br /&gt;
        IN 95H&lt;br /&gt;
        JMP 2CH &lt;br /&gt;
&lt;br /&gt;
        ORG 2CH&lt;br /&gt;
        IN 94H      ;ez itt a PEVEN jel beolvasása &lt;br /&gt;
        ANI 01H     ;a PA0 bitjét veszem a PEVEN paritás bitnek&lt;br /&gt;
        MOV D,A     ;és elmentem a D-be;ha D=0, akkor páratlan paritás,  D=1, akkor páros paritás van&lt;br /&gt;
        MVI B,0&lt;br /&gt;
        MVI C,8 &lt;br /&gt;
    PARIT:  RLC&lt;br /&gt;
        JNC TOV&lt;br /&gt;
        INR B       ;az utolsó ciklusba bekerül a beolvasott byte-ban lévő 1-esek száma&lt;br /&gt;
    TOV:    DCR C&lt;br /&gt;
        JNZ PARIT&lt;br /&gt;
        MOV A,B&lt;br /&gt;
        ANI 01H&lt;br /&gt;
        &lt;br /&gt;
        LXI H,3456H&lt;br /&gt;
        MOV M,A&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
=== 2. f.) ===&lt;br /&gt;
&lt;br /&gt;
Illesszen i8085-ös mikroprocesszoros rendszersínre egy visszaolvasható 8 bites kimeneti regisztert, mely az alábbi ábrán látható lámpa vezérlő egységet képes működtetni.&lt;br /&gt;
* a kimeneti regisztert (74374) a 20h IO címen írható és a kimeneti egység L1…L8 jelei a 20H IO címen visszaolvashatók&lt;br /&gt;
* Írja meg a CHECK 8085 assembly szubrutint, amely az A regiszterben kapott értéket beírja az előző feladatban kialakított kimeneti regiszterbe, majd a kimenet értékét visszaolvassa és ellenőrzi. Hiba esetén visszatéréskor CY=1, különben CY=0 legyen.&lt;br /&gt;
&lt;br /&gt;
    CHECK:  OUT 20H     ;kiírás a reg-be&lt;br /&gt;
        CMA     ;bitenként negálja az A-t&lt;br /&gt;
        MOV B,A     ;ezt a negált értéket beírjuk a B reg-be&lt;br /&gt;
        IN 20H      ;20H címről beolvasunk&lt;br /&gt;
        CMP B       ;szokásos ellenőrzés&lt;br /&gt;
        JZ CY0      ;ha egyenlő a B és a visszaolvasott érték, akkor Z=1 és akkor ugrunk arra a részre ahol CY:=0&lt;br /&gt;
        STC     ;ha Z=0 akkor CY-t 1-be állitjuk&lt;br /&gt;
        JMP VEGE        ;és ugrunk a végére&lt;br /&gt;
    CY0:    STC     ;CY=1&lt;br /&gt;
        CMC     ;CY-t negálja&lt;br /&gt;
    VEGE:   RET&lt;br /&gt;
&lt;br /&gt;
== 3. feladat ==&lt;br /&gt;
&lt;br /&gt;
=== 3. a) ===&lt;br /&gt;
&lt;br /&gt;
            LXI D,X     ; X ms-ban&lt;br /&gt;
            LXI B,R     ; R-ratio, szazalekban&lt;br /&gt;
        ELEJE:  LXI H,X*1000000*R/100/7040&lt;br /&gt;
            MVI A,C8H   ; 11001000B&lt;br /&gt;
            SIM&lt;br /&gt;
            CALL HUROK&lt;br /&gt;
            MVI A,48H   ; 01001000B&lt;br /&gt;
            SIM&lt;br /&gt;
            LXI H,X*1000000*(100-R)/100/7040&lt;br /&gt;
            CALL HUROK&lt;br /&gt;
            JMP ELEJE&lt;br /&gt;
&lt;br /&gt;
        HUROK:  DCX H       ; 4 fazis&lt;br /&gt;
            MOV A,H     ; 4 fazis&lt;br /&gt;
            ORA L       ; 4 fazis&lt;br /&gt;
            JNZ HUROK   ; 10 fazis, 7040 nsec&lt;br /&gt;
            RET&lt;br /&gt;
&lt;br /&gt;
=== 3. b.) === &lt;br /&gt;
&lt;br /&gt;
Írjon 8085 assembly szubrutint, amely a következő specifikáció szerint működik:&lt;br /&gt;
* A szubrutin a SID jel felfutó élére egy adatkivitelt, a lefutó élére egy adatbeolvasást végezzen a következők szerint:&lt;br /&gt;
* a szubrutin induláskor megvárja a SID jel 0=&amp;gt;1 átmenetét és a B regiszter tartalmát kiírja a 70h-es port címre,&lt;br /&gt;
* majd a SID jel 1=&amp;gt;0 átmenetére 71h port címről beolvas egy adatbájtot, amit a C regiszterbe tesz, ezután kilép a szubrutinból.&lt;br /&gt;
* A szubrutin bemenete: a kiírandó adat a B regiszterben.&lt;br /&gt;
* A szubrutin kimenete: a beolvasott adat a C regiszterben&lt;br /&gt;
* A megoldás során ügyeljen arra, hogy a szubrutin a C regiszter kivételével a regiszterek és a flag-ek értékét ne változtassa meg!&lt;br /&gt;
&lt;br /&gt;
    RUTIN:  MVI C,0H        ;ezzel a reg-gel ellenőrizzük azt, hogy a SID jel milyen értékű, az 1. részben 0-1 átmenet kell&lt;br /&gt;
        PUSH PSW    ;kimentések&lt;br /&gt;
        PUSH A&lt;br /&gt;
        PUSH B&lt;br /&gt;
    VAR1:   RIM     ;a beolvasott byte felső bitje a SID jel értékét mutatja &lt;br /&gt;
        MVI A,80H   ;maszkolás  &lt;br /&gt;
        ORA C       ;megnézzük, hogy a SID=0-e ha nem akkor ugárs VAR1-re / SID=1-re várunk&lt;br /&gt;
        JNZ VAR1&lt;br /&gt;
    VAR2:   RIM     ;itt gyakorlatilag ugyanaz van, mint az előbb, csak SID-1-re várunk&lt;br /&gt;
        MVI A,80H&lt;br /&gt;
        ORA C&lt;br /&gt;
        JZ VAR2     ;tehát ha SID=0 marad, akkor ugrunk VAR2-re / ha SID=1, akkor várunk még&lt;br /&gt;
        MOV A,0     ;itt azt nézzük, hogy az 1. részben vagyunk-e &lt;br /&gt;
        CMP C       ;ha a kivonás eredménye 0, akkor az 1. részben vagyunk és ekkor írjuk ki a B-t a 70H-ra&lt;br /&gt;
        JZ B70H     &lt;br /&gt;
        JMP C71H        ;ha a 2. részben vagyunk, akkor az előző ugró utasítás nem teljesül és ide kell ugrani&lt;br /&gt;
    CIMKE:  MOV C,01H   ;ha az 1. részben vagyunk, akkor C reg-t 1-be kell állítani, a 2. részben már nem fogunk ide ugrani&lt;br /&gt;
        JMP VAR1&lt;br /&gt;
    B70H:   MOV A,B&lt;br /&gt;
        OUT 70H&lt;br /&gt;
        JMP CIMKE&lt;br /&gt;
    C71H:   IN 71H&lt;br /&gt;
        MOV C,A &lt;br /&gt;
        POP B&lt;br /&gt;
        POP A&lt;br /&gt;
        POP PSW&lt;br /&gt;
        END&lt;br /&gt;
&lt;br /&gt;
Egy másik megoldás:&lt;br /&gt;
&lt;br /&gt;
        NULLBEOLV:  PUSH PSW&lt;br /&gt;
                RIM&lt;br /&gt;
                ANI 80H     ;10000000B&lt;br /&gt;
                JZ NULLBEOLV&lt;br /&gt;
                MOV A,B&lt;br /&gt;
                OUT 70H&lt;br /&gt;
        EGYBEOLV:   RIM&lt;br /&gt;
                ANI 80H&lt;br /&gt;
                JNZ EGYBEOLV&lt;br /&gt;
                IN 71H&lt;br /&gt;
                MOV C,A&lt;br /&gt;
                POP PSW&lt;br /&gt;
                JMP NULLBEOLV&lt;br /&gt;
&lt;br /&gt;
=== 3. c.) ===&lt;br /&gt;
Írjon 8085 assembly szubrutint, amely megvárja a SID jel változását (felfutó és lefutó él). A szubrutin kimenete:&lt;br /&gt;
* Z=1 felfutó él volt,&lt;br /&gt;
* Z=0 lefutó él volt!&lt;br /&gt;
* A szubrutin ne változtassa meg a regiszterpárok értékét!&lt;br /&gt;
&lt;br /&gt;
    RUTIN:  RIM&lt;br /&gt;
        ANI 80H     ;maszkolás, az SID értéke az A-ban lesz&lt;br /&gt;
        JZ FELFUT   ;ha az előbbi &amp;quot;és&amp;quot;-elés eredménye 0 (tehát a SID 0), akkor Z=1 -&amp;gt; ugrás a felfutójelhez&lt;br /&gt;
        JMP LEFUT   ;különben lefutó jelre várunk&lt;br /&gt;
    FELFUT: RIM&lt;br /&gt;
        ANI 80H     ;maszkolás&lt;br /&gt;
        JZ FELFUT   ;addig csináljuk amíg az eredmény 1 lesz (tehát a SID=1-re), Z=0-ra várunk&lt;br /&gt;
        XRA A       ;beállítjuk a Z-t 1-re&lt;br /&gt;
        JMP VEGE        ;ugrás végére&lt;br /&gt;
    LEFUT:  RIM&lt;br /&gt;
        ANI 80H&lt;br /&gt;
        JNZ FELFUT  ;ha Z=1, akkor az &amp;quot;és&amp;quot;-elés eredménye:0, tehát tovább kell várni a SID= 1 -&amp;gt; 0 átmenetre&lt;br /&gt;
        MOV A,FFH   &lt;br /&gt;
        ORA A       ;Z:=0&lt;br /&gt;
    VEGE:   RET&lt;br /&gt;
&lt;br /&gt;
Egy másik megoldás:&lt;br /&gt;
&lt;br /&gt;
                MVI A,0&lt;br /&gt;
                RIM&lt;br /&gt;
                ANI 80H&lt;br /&gt;
                JZ IDE&lt;br /&gt;
                MVI A,1&lt;br /&gt;
        IDE:        CALL IDERUTIN&lt;br /&gt;
                HALT&lt;br /&gt;
        IDERUTIN:   ANI FF&lt;br /&gt;
                JZ VAREGYRE&lt;br /&gt;
        VARNULLRA:  RIM&lt;br /&gt;
                ANI 80H&lt;br /&gt;
                JNZ VARNULLRA&lt;br /&gt;
                RZ&lt;br /&gt;
        VAREGYRE:   RIM&lt;br /&gt;
                ANI 80H&lt;br /&gt;
                JZ VAREGYRE&lt;br /&gt;
                RNZ&lt;br /&gt;
&lt;br /&gt;
=== 3. d.) ===&lt;br /&gt;
Írjon 8085 assembly szubrutint, amely a HL regiszterpárban kapott kezdőcímű és 32 byte hosszúságú adatblokkhoz 1 byte-os ellenőrző összeget számol ki, és elhelyezi a blokkot követő rekeszben. A szubrutin végén az akkumulátor az ellenőrző összeget tartalmazza! (A rutin bármely regiszter értékét elronthatja)!&lt;br /&gt;
&lt;br /&gt;
Az ellenőrző összeg számítási algoritmusa: X(i) mod 256   0&amp;lt;i&amp;lt;32&lt;br /&gt;
&lt;br /&gt;
    RUTIN:  MVI C,32        ;32 byte hosszúságú adatblokk&lt;br /&gt;
        XRA A       ;A:=0&lt;br /&gt;
    CIKLUS: ADD M       ;A+HL-&amp;gt; A&lt;br /&gt;
        INX H       ;forrásmutató növelése&lt;br /&gt;
        DCR C       &lt;br /&gt;
        JNZ CIKLUS  ;ha végigértünk akkor Z=1&lt;br /&gt;
        MOV M,A     ;a blokkot követő részen az ellenőrző összeg&lt;br /&gt;
        RET&lt;br /&gt;
&lt;br /&gt;
Egy másik megoldás:&lt;br /&gt;
                LXI D,0     ;reszosszeg kinullazasa&lt;br /&gt;
                LXI H, KC   ;kezdocim&lt;br /&gt;
                LXI B, 32   ;db&lt;br /&gt;
            HUROK:  MOV A,M&lt;br /&gt;
                CALL OSSZEGZO&lt;br /&gt;
                INX H&lt;br /&gt;
                DCX B&lt;br /&gt;
                MOV A,C&lt;br /&gt;
                ORA B&lt;br /&gt;
                JNZ HUROK&lt;br /&gt;
                MOV M,E     ;E-ben van a mod256 reszosszeg&lt;br /&gt;
            &lt;br /&gt;
            OSSZEGZO:&lt;br /&gt;
                PUSH H&lt;br /&gt;
                MOV L,A&lt;br /&gt;
                MVI H,0&lt;br /&gt;
                DAD D&lt;br /&gt;
                XCHG&lt;br /&gt;
                POP H&lt;br /&gt;
                RET&lt;br /&gt;
&lt;br /&gt;
=== 3. e.) ===&lt;br /&gt;
Írjon assembly programot amely kivonja két memóriában elhelyezkedő 32 szavas memóriatömbök egyes szavait és az eredményeket visszahelyezi egy újabb memóriaterületre! A 2 byte-os szavak felső 8 bitjét a kisebb című (páros) byte, az alsó 8 bitet a következő (páratlan) cím tárolja!&lt;br /&gt;
    (9000H,9001H) = (9100H,9101H) - (9200H,9201H) ... stb.&lt;br /&gt;
* Írja meg a kivonó programot!&lt;br /&gt;
* A kivonások elvégzése után a 9000H-n kezdődő 32 szavas memória terület után helyezzen el egy olyan byte-ot, amely megadja, hogy a 32 eredmény szó közül mennyi a pozitív szám feltételezve, hogy az operandusok (és az eredmény) 16 bites kettes komplemens kódban van ábrázolva. &lt;br /&gt;
&lt;br /&gt;
        LXI B,9000H&lt;br /&gt;
        LXI D,9101H&lt;br /&gt;
        LXI H,9201H&lt;br /&gt;
        MVI E,32H   ;2*32 szót vonunk ki egymásból  &lt;br /&gt;
    KIVON:  STC     ;CY:=1&lt;br /&gt;
        CMC     ;CY:=/CY -&amp;gt; CY:=0&lt;br /&gt;
        LDAX A,D        ;9101H-n található adatot betölti az A-ba&lt;br /&gt;
        SBB M       ;A-(HL által mutatott címen levő adat)-CY , ha van átvitel akkor CY=1 lesz&lt;br /&gt;
        STAX B      ;B által mutatott címre A tartalmát helyezi&lt;br /&gt;
        DCX B       &lt;br /&gt;
        DCX D&lt;br /&gt;
        DCX H&lt;br /&gt;
        LDAX A,D        ;9100H-n található adat megy az A-ba&lt;br /&gt;
        SBB M       ;A-M-CY&lt;br /&gt;
        STAX B      ;9000H-n a kivonás eredménye (2 byte-on)&lt;br /&gt;
        INX H&lt;br /&gt;
        INX H&lt;br /&gt;
        INX D&lt;br /&gt;
        INX D&lt;br /&gt;
        INX B&lt;br /&gt;
        INX B&lt;br /&gt;
        DCR E&lt;br /&gt;
        JNZ KIVON&lt;br /&gt;
        MVI E,32H   ;32 szavat vizsgálunk meg&lt;br /&gt;
        MVI D,0H        ;a pozitív számok számát ebben tároljuk &lt;br /&gt;
    SZAMOL: LXI B,9000H &lt;br /&gt;
        ANI 80H     ;ha a MSB (legfelső bit)=1 akkor a szám negatív&lt;br /&gt;
        JZ TOVABB   ;ha szám negatív, akkor Z=1 és nem kell növelni&lt;br /&gt;
        INR D   &lt;br /&gt;
    TOVABB: INX H       &lt;br /&gt;
        INX H&lt;br /&gt;
        DCR E       &lt;br /&gt;
        JNZ SZAMOL&lt;br /&gt;
        END&lt;br /&gt;
&lt;br /&gt;
Egy másik megoldás:&lt;br /&gt;
            XPOINTER EQU 9080H&lt;br /&gt;
            YPOINTER EQU 9082H&lt;br /&gt;
            ZPOINTER EQU 9084H  ;ideiglenes regiszterpárok, KIHASZNÁLATLAn ramterület, senkit nem zavar&lt;br /&gt;
            X EQU 9100H&lt;br /&gt;
            Y EQU 9200H&lt;br /&gt;
            Z EQU 9000H&lt;br /&gt;
 &lt;br /&gt;
            LXI H,X         ;ebbol&lt;br /&gt;
            SHLD XPOINTER&lt;br /&gt;
            LXI H,Y         ;ezt&lt;br /&gt;
            SHLD YPOINTER&lt;br /&gt;
            LXI H,Z         ;ide(eredmény)&lt;br /&gt;
            SHLD ZPOINTER&lt;br /&gt;
             &lt;br /&gt;
        CIKLUS: CALL CIKLUSMAG&lt;br /&gt;
            LXI B, X+32*2&lt;br /&gt;
            LHLD XPOINTER&lt;br /&gt;
            MOV A,H&lt;br /&gt;
            CMP B&lt;br /&gt;
            JNZ CIKLUS&lt;br /&gt;
            MOV A,L&lt;br /&gt;
            CMP C&lt;br /&gt;
            JNZ CIKLUS&lt;br /&gt;
            HALT&lt;br /&gt;
 &lt;br /&gt;
        CIKLUSMAG:&lt;br /&gt;
            LHLD XPOINTER       ;H=91,L=00&lt;br /&gt;
            MOV D,M&lt;br /&gt;
            INX H&lt;br /&gt;
            MOV E,M         ;DE=ebbol&lt;br /&gt;
            INX H&lt;br /&gt;
            SHLD XPOINTER&lt;br /&gt;
            LHLD YPOINTER&lt;br /&gt;
            MOV A,M&lt;br /&gt;
            CMA&lt;br /&gt;
            MOV B,A&lt;br /&gt;
            INX H&lt;br /&gt;
            MOV A,M&lt;br /&gt;
            CMA&lt;br /&gt;
            MOV C,A&lt;br /&gt;
            INX B           ;BC-ben kivonando kettes komplemense(-1szerese)         &lt;br /&gt;
            INX H           &lt;br /&gt;
            SHLD YPOINTER&lt;br /&gt;
            XCHG            ;HL-ben ebbol&lt;br /&gt;
            DAD B&lt;br /&gt;
            XCHG            ;DE-ben eredmeny&lt;br /&gt;
            LHLD ZPOINTER&lt;br /&gt;
            MOV M,D&lt;br /&gt;
            INX H&lt;br /&gt;
            MOV M,E&lt;br /&gt;
            INX H&lt;br /&gt;
            SHLD ZPOINTER&lt;br /&gt;
            RET&lt;br /&gt;
&lt;br /&gt;
=== 3. f.) ===&lt;br /&gt;
Írjon assembly szubrutint amely kivonja két, a memóriában elhelyezkedő 64 byte-os memóriatömb egyes byte-jait és az eredményeket visszahelyezi az első operandus helyére! Az operandusok kezdőcímeit a szubrutin a HL és DE regiszterpárokban kapja. A kivonások elvégzése után a rutin az BC regiszter-párban kapott címtől kezdődően helyezzen el egy olyan byte-ot, amely megadja, hogy a 64 eredmény byte közül mennyi a pozitív szám (&amp;gt;0), egy másik byte-ot, hogy mennyi a negatív szám (&amp;lt;0), és egy harmadik byte-ot, hogy hány érték volt 0 (=0). (Az operandusok és az eredmény 8 bites kettes komplemens kódban vannak ábrázolva.)&lt;br /&gt;
* Írja meg a szubrutint!&lt;br /&gt;
* Írja meg azt a programrészletet, amely meghívja a szubrutint a HL=8000h, DE=8800h és BC=9000h paraméterekkel, majd ellenőrzi, hogy a 9000h címtől kezdődő 3 byte összege valóban 64.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    RUTIN:  PUSH B      ;kimentjük BC-t,mert a számlálónak a B-t használjuk fel&lt;br /&gt;
        PUSH H      ;a későbbi vizsgálat során az eredeti címtől indulunk, így ezt is kimentjük&lt;br /&gt;
        MVI B,64        &lt;br /&gt;
        XCHG        ;HL és DE felcserélése&lt;br /&gt;
    KIVON:  LDAX D      ;az A-ba betölti a DE (eredetileg HL) által mutatott címen lévő adatot&lt;br /&gt;
        SUB M       ;így DE-ből kivonjuk a HL-t&lt;br /&gt;
        STAX D      ;DE által mutatott címre visszahelyezzük az eredményt&lt;br /&gt;
        INX D       &lt;br /&gt;
        INX H&lt;br /&gt;
        DCR B       &lt;br /&gt;
        JNZ KIVON   ;ha végigértünk a 64 byte-on, akkor Z=1 lesz&lt;br /&gt;
        XCHG        ;HL és DE visszacserélése&lt;br /&gt;
        &lt;br /&gt;
        POP B&lt;br /&gt;
        POP H&lt;br /&gt;
        PUSH H      &lt;br /&gt;
        MVI D,0     &lt;br /&gt;
        MVI E,64&lt;br /&gt;
    POZ:    MOV A,M     ;A-ban a HL által mutatott címen lévő byte&lt;br /&gt;
        ANI 80H     ;maszkolás az előjel bitre&lt;br /&gt;
        JNZ PT      ;ha az előjel bit=1, akkor Z=0 és akkor negatív, így kihagyjuk a D növelését&lt;br /&gt;
        INR D       ;ha Z=1, akkor a szám pozitív és növeljük D-t&lt;br /&gt;
    PT: DCR E       &lt;br /&gt;
        JNZ POZ     ;amíg végig nem értünk Z=0&lt;br /&gt;
        MOV A,D     ;D-ben van a pozitív számok darabszáma&lt;br /&gt;
        STAX B      ;B címére elhelyezzük a darabszámot&lt;br /&gt;
        INX B       ;a B következő címére kerül a negatív számok darabszáma&lt;br /&gt;
&lt;br /&gt;
    ;pepita...&lt;br /&gt;
        POP H       &lt;br /&gt;
        PUSH H&lt;br /&gt;
        MVI D,0&lt;br /&gt;
        MVI E,64    &lt;br /&gt;
    NEG:    MOV A,M&lt;br /&gt;
        ANI 80H&lt;br /&gt;
        JZ NT&lt;br /&gt;
        INR D&lt;br /&gt;
    NT: DCR E&lt;br /&gt;
        JNZ NEG&lt;br /&gt;
        MOV A,D&lt;br /&gt;
        STAX B&lt;br /&gt;
        INX B       ;a B következő címére kerül a 0 értékű számok darabszáma&lt;br /&gt;
        &lt;br /&gt;
    ;0-k száma, pepita&lt;br /&gt;
        POP H&lt;br /&gt;
        MVI D,0&lt;br /&gt;
        MVI E,64&lt;br /&gt;
    NULL:   MOV A,M&lt;br /&gt;
        ORA 00H     ;egyedül itt van különbség, ha byte csupa 0, csak akkor lesz ORA 0H = 0-val és ezzel együtt Z=1&lt;br /&gt;
        JNZ NULT&lt;br /&gt;
        INR D&lt;br /&gt;
    NULT:   DCR E&lt;br /&gt;
        JNZ NEG&lt;br /&gt;
        MOV A,D&lt;br /&gt;
        STAX B&lt;br /&gt;
        RET&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Írja meg azt a programrészletet, amely meghívja a szubrutint a HL=8000h, DE=8800h és BC=9000h paraméterekkel, majd ellenőrzi, hogy a 9000h címtől kezdődő 3 byte összege valóban 64.  &lt;br /&gt;
        &lt;br /&gt;
        LXI H,8000H&lt;br /&gt;
        LXI D,8800H&lt;br /&gt;
        LXI B,9000H&lt;br /&gt;
        CALL RUTIN&lt;br /&gt;
        MOV C,0&lt;br /&gt;
        MOV D,3&lt;br /&gt;
        STC&lt;br /&gt;
        CMC&lt;br /&gt;
    ELL:    LDAX B&lt;br /&gt;
        ADC C&lt;br /&gt;
        MOV C,A&lt;br /&gt;
        DCR D&lt;br /&gt;
        JNZ ELL&lt;br /&gt;
        MOV A,64&lt;br /&gt;
        CMP C&lt;br /&gt;
        JZ JO&lt;br /&gt;
        STC     ;ezt itt a feladat nem kéri, de utólag vhogy el kell tudni dönteni, hogy az összeg valóban 64-e&lt;br /&gt;
        CMC     ;ezért ha nem jó akkor CY flag értéke 0 lesz, jó összeg esetén 1&lt;br /&gt;
        JMP VEGE        &lt;br /&gt;
    JO:     STC&lt;br /&gt;
    VEGE:   END&lt;br /&gt;
&lt;br /&gt;
Egy másik megoldás:&lt;br /&gt;
&lt;br /&gt;
        KISERED EQU 8000H&lt;br /&gt;
        KIVONANDO EQU 8800H&lt;br /&gt;
        ELOJEL EQU 9000H            &lt;br /&gt;
 &lt;br /&gt;
        LXI H,KISERED&lt;br /&gt;
        LXI D,KIVONANDO&lt;br /&gt;
                    ;LXI B,ELOJEL ;ELOJEL=POZITÍVAK, ELOJEL+1=negatívak, ELOJEL+2=nullák&lt;br /&gt;
        &lt;br /&gt;
    CIKLUS: MOV A,M&lt;br /&gt;
        PUSH PSW&lt;br /&gt;
        LDAX D&lt;br /&gt;
        MOV B,A&lt;br /&gt;
        POP PSW&lt;br /&gt;
        SUB B           ;AKKUMULÁTORBAN EREDMÉNY&lt;br /&gt;
        MOV M,A&lt;br /&gt;
        JZ NULL&lt;br /&gt;
        JP POZ&lt;br /&gt;
        PUSH H          ;(NEGATÍV ÁG)   &lt;br /&gt;
        LHLD ELOJEL+1&lt;br /&gt;
        INX H&lt;br /&gt;
        SHLD ELOJEL+1&lt;br /&gt;
        POP H&lt;br /&gt;
        JMP ELLEN&lt;br /&gt;
    NULL:   PUSH H          ;(0 ÁG) &lt;br /&gt;
        LHLD ELOJEL+2&lt;br /&gt;
        INX H&lt;br /&gt;
        SHLD ELOJEL+2&lt;br /&gt;
        POP H&lt;br /&gt;
        JMP ELLEN       &lt;br /&gt;
    POZ:    PUSH H          ;(POZITÍV ÁG)   &lt;br /&gt;
        LHLD ELOJEL&lt;br /&gt;
        INX H&lt;br /&gt;
        SHLD ELOJEL&lt;br /&gt;
        POP H&lt;br /&gt;
    ELLEN:  INX H&lt;br /&gt;
        INX D&lt;br /&gt;
        LXI B,KISERED+64&lt;br /&gt;
        MOV A,H&lt;br /&gt;
        CMP B&lt;br /&gt;
        JNZ CIKLUS&lt;br /&gt;
        MOV A,L&lt;br /&gt;
        CMP C&lt;br /&gt;
        JNZ CIKLUS&lt;br /&gt;
        LXI B,ELOJEL&lt;br /&gt;
 &lt;br /&gt;
        LXI H,ELOJEL&lt;br /&gt;
        MOV A,M&lt;br /&gt;
        INX H&lt;br /&gt;
        ADD M&lt;br /&gt;
        INX H&lt;br /&gt;
        ADD M&lt;br /&gt;
        CPI 64&lt;br /&gt;
        JZ JO&lt;br /&gt;
    NEMJO:  NOP         ;NEM JO!!!!!!!!!!&lt;br /&gt;
    JO: HALT&lt;br /&gt;
&lt;br /&gt;
=== 3. g.) ===&lt;br /&gt;
Írjon assembly szubrutint, amely a HL regiszterpárban kapott címen elhelyezkedő 00h végjelre végződő&lt;br /&gt;
karakterstringben megkeresi az első &#039;1&#039; számjegyet. (az ’1’ számjegy ASCII kódja 31h). Találat esetén a szubrutinból visszatéréskor a HL regiszterpár mutasson a megtalált karakter címére és CY = 0 legyen. Ha a keresett karakter nem található, akkor a szubrutin CY=1 értékkel térjen vissza. (Ilyenkor a HL regiszterpár a 00h végjelre mutasson.&lt;br /&gt;
&lt;br /&gt;
    RUTIN:  MVI B,00H&lt;br /&gt;
    KERES:  MVI A,31H&lt;br /&gt;
        CMP M       ;megnézzük, hogy a HL által mutatott címen lévő adat 31H-e&lt;br /&gt;
        JNZ TOV     &lt;br /&gt;
        JMP VEGT        ;ha megtaláltuk az &#039;1&#039; számjegyet, akkor Z=1 és ugrunk a VEGT (VÉGe és Találtunk)&lt;br /&gt;
 &lt;br /&gt;
    TOV:    MOV A,B     ;00 végjel figyelésére szolgál&lt;br /&gt;
        CMP M       ;ha HL által mutatott címen 00H található, akkor és csak akkor a kivonás eredménye 0 (Z=1)&lt;br /&gt;
        JZ VEGNT        ;ugrás a VÉGe és Nem Találtunk részre&lt;br /&gt;
        INX H       ;mutató növelése&lt;br /&gt;
        JMP KERES   &lt;br /&gt;
 &lt;br /&gt;
    VEGT:   STC     ;a HL címe ekkor automatikusan a keresett karakterre mutat, így csak a CY flaget kell állítani&lt;br /&gt;
        CMC     &lt;br /&gt;
        JMP VEGE&lt;br /&gt;
 &lt;br /&gt;
    VEGNT:  STC     ;itt is a megfelelő helyre mutat a HL, így csak CY:=1-t állítunk&lt;br /&gt;
         &lt;br /&gt;
    VEGE:   RET&lt;br /&gt;
&lt;br /&gt;
Egy másik megoldás:&lt;br /&gt;
        KC EQU 9100H        ;egyéni&lt;br /&gt;
        &lt;br /&gt;
    CIKLUS: MOV A,M&lt;br /&gt;
        CPI 31H&lt;br /&gt;
        JZ TALALT&lt;br /&gt;
        CPI 0&lt;br /&gt;
        JZ NULLTALALT           &lt;br /&gt;
        INX H&lt;br /&gt;
        JMP CIKLUS&lt;br /&gt;
    TALALT: STC&lt;br /&gt;
        CMC&lt;br /&gt;
        JMP VEGE&lt;br /&gt;
    NULLTALALT: STC&lt;br /&gt;
    VEGE:   HALT&lt;br /&gt;
&lt;br /&gt;
=== 3. h.) ===&lt;br /&gt;
Írjon assembly szubrutint, amely a HL regiszterpárban kapott címtől kezdődően átmásol 32 bájtot a DE regiszterpárban megadott kezdőcímen kezdődő memóriaterületre. A megoldás során ügyeljen arra, hogy a rutin ne változtassa meg a flag-ek állapotát és a BC regiszterpár értékét!&lt;br /&gt;
&lt;br /&gt;
Írjon assembly programrészletet, amely SID=1 esetén várakozzon SID=0-ra, majd SID=0 esetén a fenti szubrutin&lt;br /&gt;
meghívásával másoljon át 32 bájtot a 9000h memóriacímről a 9150h címre.&lt;br /&gt;
&lt;br /&gt;
    RUTIN:  PUSH PSW&lt;br /&gt;
        PUSH B&lt;br /&gt;
        &lt;br /&gt;
        MVI B,32&lt;br /&gt;
    MASOL:  XCHG        ;DE felcserélése HL-lel&lt;br /&gt;
        LDAX D      ;DE (=eredetileg HL) beírása az A-ba&lt;br /&gt;
        XCHG        ;visszacsere&lt;br /&gt;
        STAX D      ;beírjuk A-t az eredeti DE által mutatott címre&lt;br /&gt;
        INX H&lt;br /&gt;
        INX D&lt;br /&gt;
        DCR B   &lt;br /&gt;
        JNZ MASOL&lt;br /&gt;
        POP PSW&lt;br /&gt;
        POP B&lt;br /&gt;
        RET&lt;br /&gt;
&lt;br /&gt;
    ;programrészlet:&lt;br /&gt;
    VAR:    RIM&lt;br /&gt;
        ANI 80H&lt;br /&gt;
        JNZ VAR&lt;br /&gt;
        LXI H,9000H&lt;br /&gt;
        LXI D,9150H&lt;br /&gt;
        CALL RUTIN&lt;br /&gt;
        END&lt;br /&gt;
&lt;br /&gt;
Egy másik megoldás:&lt;br /&gt;
     VAR:    RIM&lt;br /&gt;
        ANI 80H     ;10000000B&lt;br /&gt;
        JNZ VAR&lt;br /&gt;
        LXI H,9000H&lt;br /&gt;
        LXI D,9150H&lt;br /&gt;
        CALL MASOL&lt;br /&gt;
        HALT&lt;br /&gt;
&lt;br /&gt;
            ;HL-ben és DE-ben már megvan a kezdõcímünk..&lt;br /&gt;
    &lt;br /&gt;
    MASOL:  PUSH PSW&lt;br /&gt;
        PUSH B&lt;br /&gt;
        LXI B,32&lt;br /&gt;
    CIKLUS: MOV A,M&lt;br /&gt;
        STAX D&lt;br /&gt;
        INX H&lt;br /&gt;
        INX D   &lt;br /&gt;
        DCX B&lt;br /&gt;
        MOV A,C&lt;br /&gt;
        ORA B&lt;br /&gt;
        JNZ CIKLUS&lt;br /&gt;
        POP B&lt;br /&gt;
        POP PSW&lt;br /&gt;
        RET&lt;br /&gt;
&lt;br /&gt;
=== 3. i.) ===&lt;br /&gt;
&lt;br /&gt;
Írjon assembly szubrutint, amely a DE regiszterpárban kapott címtől kezdődő 16 bájtot a blokk végétől kezdve visszafelé átmásol a HL regiszterpárban megadott címen kezdődő memóriaterületre (A forrás-blokk utolsó byte-ja van a cél-blokk első helyén). A megoldás során ügyeljen arra, hogy a rutin ne változtassa meg a flag-ek állapotát és a regiszterpárok értékét!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    RUTIN:  PUSH PSW&lt;br /&gt;
        PUSH B&lt;br /&gt;
        PUSH D&lt;br /&gt;
        PUSH H&lt;br /&gt;
        MVI B,16&lt;br /&gt;
    ;a DE-t megnöveljük 16-tal&lt;br /&gt;
    DENOV:  INX D&lt;br /&gt;
        DCR B&lt;br /&gt;
        JNZ DENOV   &lt;br /&gt;
        MVI B,16&lt;br /&gt;
    MASOL:  LDAX D&lt;br /&gt;
        XCHG&lt;br /&gt;
        STAX D&lt;br /&gt;
        XCHG&lt;br /&gt;
        INX H&lt;br /&gt;
        DCX D&lt;br /&gt;
        DCR B&lt;br /&gt;
        JNZ MASOL&lt;br /&gt;
        POP H&lt;br /&gt;
        POP D&lt;br /&gt;
        POP B&lt;br /&gt;
        POP PSW&lt;br /&gt;
        RET&lt;br /&gt;
&lt;br /&gt;
Egy másik megoldás:&lt;br /&gt;
        PUSH PSW&lt;br /&gt;
        PUSH B&lt;br /&gt;
        PUSH D&lt;br /&gt;
        PUSH H&lt;br /&gt;
        &lt;br /&gt;
        PUSH H&lt;br /&gt;
        LXI B,16&lt;br /&gt;
        DAD B&lt;br /&gt;
        MOV B,H&lt;br /&gt;
        MOV C,L&lt;br /&gt;
        XCHG&lt;br /&gt;
        LXI D,15&lt;br /&gt;
        DAD D&lt;br /&gt;
        XCHG&lt;br /&gt;
        POP H&lt;br /&gt;
        &lt;br /&gt;
    CIKLUS: LDAX D&lt;br /&gt;
        MOV M,A&lt;br /&gt;
        INX H&lt;br /&gt;
        DCX D&lt;br /&gt;
        MOV A,H&lt;br /&gt;
        CMP B&lt;br /&gt;
        JNZ CIKLUS&lt;br /&gt;
        MOV A,L&lt;br /&gt;
        CMP C&lt;br /&gt;
        JNZ CIKLUS&lt;br /&gt;
        &lt;br /&gt;
        POP H&lt;br /&gt;
        POP D&lt;br /&gt;
        POP B&lt;br /&gt;
        POP PSW&lt;br /&gt;
&lt;br /&gt;
=== 3. j.) ===&lt;br /&gt;
Írjon assembly szubrutint, amely a DE regiszterpárban kapott címtől kezdődő 16 bájtban megszámolja a negatív&lt;br /&gt;
számokat (feltételezve, hogy az adatok 8 bites kettes komplemensben ábrázolt előjeles számok), és a kapott eredményt elhelyezi a 8000h memória rekeszbe. A megoldás során ügyeljen arra, hogy a rutin ne változtassa meg a flag-ek állapotát és a regiszterpárok értékét!   &lt;br /&gt;
&lt;br /&gt;
    RUTIN:  PUSH PSW&lt;br /&gt;
        PUSH B&lt;br /&gt;
        PUSH D&lt;br /&gt;
        MVI B,16&lt;br /&gt;
        MVI C,0 &lt;br /&gt;
    SZAMOL: LDAX D&lt;br /&gt;
        ANI 80H&lt;br /&gt;
        JZ NEMNEG&lt;br /&gt;
        INR C       ;ha Z=0, akkor negatív a számunk, ekkor növelünk&lt;br /&gt;
    NEMNEG: DCR B&lt;br /&gt;
        JNZ SZAMOL&lt;br /&gt;
        MOV A,C&lt;br /&gt;
        STA 8000H&lt;br /&gt;
        POP D&lt;br /&gt;
        POP B&lt;br /&gt;
        POP PSW&lt;br /&gt;
        RET&lt;br /&gt;
&lt;br /&gt;
Egy másik megoldás:&lt;br /&gt;
&lt;br /&gt;
        PUSH PSW&lt;br /&gt;
        PUSH B&lt;br /&gt;
        PUSH D&lt;br /&gt;
        PUSH H&lt;br /&gt;
 &lt;br /&gt;
        LXI H,8000H&lt;br /&gt;
        MVI M,0&lt;br /&gt;
        MVI B,0&lt;br /&gt;
    CIKLUS: LDAX D&lt;br /&gt;
        ANI 80H&lt;br /&gt;
        CMP D       ;FELESLEGES&lt;br /&gt;
        JZ POZITIV&lt;br /&gt;
        INR M&lt;br /&gt;
    POZITIV:INX D&lt;br /&gt;
        INR B&lt;br /&gt;
        MOV A,B&lt;br /&gt;
        CPI 16&lt;br /&gt;
        JNZ CIKLUS&lt;br /&gt;
 &lt;br /&gt;
        POP H&lt;br /&gt;
        POP D&lt;br /&gt;
        POP B&lt;br /&gt;
        POP PSW&lt;br /&gt;
        HALT&lt;br /&gt;
&lt;br /&gt;
=== 3. k.) ===&lt;br /&gt;
Írjon assembly szubrutint, amely a HL regiszterpárban kapott címtől kezdődő 254 byte-os adatblokk végére kiszámít egy 2 byte-os ellenőrző szót (a blokk byte-jainak összeadásával), és elhelyezi az adatokat követően. A megoldás során ügyeljen arra, hogy a rutin ne változtassa meg a flag-ek állapotát és a regiszterpárok értékét!&lt;br /&gt;
&lt;br /&gt;
    RUTIN:  PUSH PSW&lt;br /&gt;
        PUSH B&lt;br /&gt;
        PUSH H&lt;br /&gt;
        PUSH D&lt;br /&gt;
        &lt;br /&gt;
        MVI B,254&lt;br /&gt;
        LXI D,0&lt;br /&gt;
        MVI A,0&lt;br /&gt;
    ELL:    PUSH H  &lt;br /&gt;
        MOV A,M     ;HL által mutatott címen lévő adat betöltése A-ba&lt;br /&gt;
        MOV L,A     ;a címen lévő adat, így már a címmutató regiszter alsó részén van (itt elfér nem kell hozzá a H reg)&lt;br /&gt;
        DAD D       ;HL+D -&amp;gt; HL&lt;br /&gt;
        XCHG        ;HL cseréje DE-vel (így DE-ben van az ellenőrző összeg)&lt;br /&gt;
        POP H       &lt;br /&gt;
        INX H       ;cím növelése&lt;br /&gt;
        DCR B&lt;br /&gt;
        JNZ ELL     ;amíg végig nem értünk&lt;br /&gt;
        MOV M,D     ;D betöltése a HL címre&lt;br /&gt;
        INX H&lt;br /&gt;
        MOV M,E     ;a következő byte-ra pedig az E kerül&lt;br /&gt;
            &lt;br /&gt;
        POP D&lt;br /&gt;
        POP H&lt;br /&gt;
        POP B&lt;br /&gt;
        POP PSW&lt;br /&gt;
        RET&lt;br /&gt;
&lt;br /&gt;
Egy másik megoldás:&lt;br /&gt;
&lt;br /&gt;
     PUSH PSW&lt;br /&gt;
     PUSH B&lt;br /&gt;
     PUSH D&lt;br /&gt;
     PUSH H&lt;br /&gt;
     &lt;br /&gt;
     XCHG            ;DE-ben kezdocim&lt;br /&gt;
     LXI H,0         ;reszosszeg HL-ben&lt;br /&gt;
     MVI A,0         ;itt számoljuk a 254 db-ot&lt;br /&gt;
 CIKLUS: PUSH PSW&lt;br /&gt;
     LDAX D&lt;br /&gt;
     MVI B,0&lt;br /&gt;
     MOV C,A&lt;br /&gt;
     DAD B&lt;br /&gt;
     INX D&lt;br /&gt;
     POP PSW&lt;br /&gt;
     INR A&lt;br /&gt;
     CPI 254&lt;br /&gt;
     JNZ CIKLUS&lt;br /&gt;
     MOV A,L&lt;br /&gt;
     STAX D&lt;br /&gt;
     INX D&lt;br /&gt;
     MOV A,H&lt;br /&gt;
     STAX D&lt;br /&gt;
     &lt;br /&gt;
     POP H&lt;br /&gt;
     POP D&lt;br /&gt;
     POP B&lt;br /&gt;
     POP PSW&lt;br /&gt;
&lt;br /&gt;
=== 3. l.) ===&lt;br /&gt;
Írjon assembly szubrutint, amely 15 byte adatot és egy byte ellenőrző karaktert tartalmazó üzenet átvitelét ellenőrzi. A szubrutin bemenete az üzenet kezdőcíme (HL-ben), kimenete legyen hibátlan átvitel esetén Z=1, hibás átvitelkor Z=0. A megoldás során ügyeljen arra, hogy a rutin ne változtassa meg a regiszterpárok (BC,DE,HL) értékét!&lt;br /&gt;
&lt;br /&gt;
    RUTIN:  PUSH B&lt;br /&gt;
        PUSH H&lt;br /&gt;
        PUSH D&lt;br /&gt;
        PUSH H&lt;br /&gt;
        XCHG        ;HL és DE cseréje&lt;br /&gt;
        MVI H,16        ;16 byte másolására fog sorra kerülni&lt;br /&gt;
        LXI B,0     ;ahova másolunk, az a 0-s címen található (feltesszük, hogy a HL címe és ez nem lapolódik össze)&lt;br /&gt;
        PUSH B&lt;br /&gt;
    MASOL:  LDAX D      ;DE által mutatot cím tartalma az A-ban lesz&lt;br /&gt;
        STAX B      ;az A tartalma a BC címre kiíródik&lt;br /&gt;
        INX D&lt;br /&gt;
        INX B&lt;br /&gt;
        DCR H&lt;br /&gt;
        JNZ MASOL&lt;br /&gt;
        &lt;br /&gt;
        POP B       ;a BC-t visszacsökkentjük az eredetire&lt;br /&gt;
        MVI D,16&lt;br /&gt;
    ELL:    LDAX B      ;a BC-n és HL-n található byte-okat kivonogatjuk egymásból&lt;br /&gt;
        SUB M&lt;br /&gt;
        JZ HIBA     ;ha a kivonás eredménye 1, akkor hiba van&lt;br /&gt;
        DCR D   &lt;br /&gt;
        JNZ ELL &lt;br /&gt;
    NOHIBA: XRA A       ;Z-t 1-be állítjuk&lt;br /&gt;
        JMP VEGE        ;és átugorjuk a HIBA részt&lt;br /&gt;
    HIBA:   MOV A,FFH&lt;br /&gt;
        ORA A       ;ezzel a Z-t 0-ba állítottuk&lt;br /&gt;
    VEGE:   POP D&lt;br /&gt;
        POP H&lt;br /&gt;
        POP B&lt;br /&gt;
        RET&lt;br /&gt;
&lt;br /&gt;
Egy másik megoldás:&lt;br /&gt;
&lt;br /&gt;
 RUTIN:&lt;br /&gt;
     PUSH B&lt;br /&gt;
     PUSH D&lt;br /&gt;
     PUSH H          &lt;br /&gt;
     &lt;br /&gt;
     XCHG&lt;br /&gt;
     LXI H,0&lt;br /&gt;
     MVI A,0&lt;br /&gt;
 CIKLUS: PUSH PSW&lt;br /&gt;
     LDAX D&lt;br /&gt;
     MVI B,0 &lt;br /&gt;
     MOV C,A&lt;br /&gt;
     DAD B&lt;br /&gt;
     INX D&lt;br /&gt;
     POP PSW&lt;br /&gt;
     INR A&lt;br /&gt;
     CPI 15&lt;br /&gt;
     JNZ CIKLUS&lt;br /&gt;
     LDAX D&lt;br /&gt;
     CMP L       ;BE VAN ALLITVA A Z FLAG&lt;br /&gt;
 &lt;br /&gt;
     POP H&lt;br /&gt;
     POP D&lt;br /&gt;
     POP B&lt;br /&gt;
 &lt;br /&gt;
     RET&lt;br /&gt;
&lt;br /&gt;
=== 3. m.) ===&lt;br /&gt;
&lt;br /&gt;
Írjon Intel 8085 mikroprocesszor assembly nyelvén a PORTOLV szubrutint, amely a a CPU SID jelének 0 -&amp;gt; 1 átmenetére beolvassa 64H I/O című portot és az adatot az akkumulátorban adja vissza a szubrutint meghívó&lt;br /&gt;
programrésznek.&lt;br /&gt;
&lt;br /&gt;
Írjon a OLV32 szubrutint, amely a PORTOLV szubrutin felhasználásával beolvas 32 byte-ot és elhelyezi a memória 2000H-201FH memóriatartományában. Az OLV32 szubrutin változatlan tartalommal adja vissza a meghívó&lt;br /&gt;
programnak a CPU regisztereket.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    PORTOLV:&lt;br /&gt;
    VAR1:   RIM&lt;br /&gt;
        ANI 80H&lt;br /&gt;
        JNZ VAR1        ;ha SID=0, akkor Z=1 lesz és akkor mehetünk tovább&lt;br /&gt;
    VAR2:   RIM&lt;br /&gt;
        ANI 80H&lt;br /&gt;
        JZ VAR2     ;megvárjuk, míg SID=1 lesz  &lt;br /&gt;
        IN 64H&lt;br /&gt;
        RET&lt;br /&gt;
&lt;br /&gt;
    OLV32:  PUSH PSW&lt;br /&gt;
        PUSH B&lt;br /&gt;
        PUSH D&lt;br /&gt;
        LXI B,2000H&lt;br /&gt;
        MVI D,32&lt;br /&gt;
    MASOL:  CALL PORTOLV&lt;br /&gt;
        STAX B&lt;br /&gt;
        INX B&lt;br /&gt;
        DCR D&lt;br /&gt;
        JNZ MASOL&lt;br /&gt;
        &lt;br /&gt;
        POP D&lt;br /&gt;
        POP B&lt;br /&gt;
        POP PSW&lt;br /&gt;
        RET&lt;br /&gt;
&lt;br /&gt;
Egy másik megoldás:&lt;br /&gt;
     &lt;br /&gt;
 PORTOLV:&lt;br /&gt;
     RIM&lt;br /&gt;
     ANI 80H&lt;br /&gt;
     JZ PORTOLV&lt;br /&gt;
     IN 64H&lt;br /&gt;
     RET&lt;br /&gt;
 &lt;br /&gt;
 OLV32:&lt;br /&gt;
     PUSH PSW&lt;br /&gt;
     PUSH B&lt;br /&gt;
     PUSH D&lt;br /&gt;
     PUSH H&lt;br /&gt;
     &lt;br /&gt;
     KC EQU 2000H&lt;br /&gt;
     VC EQU 201FH&lt;br /&gt;
     LXI H,KC&lt;br /&gt;
     LXI D,VC+1&lt;br /&gt;
 CIKLUS: &lt;br /&gt;
     CALL PORTOLV&lt;br /&gt;
     MOV M,A&lt;br /&gt;
     INX H&lt;br /&gt;
     MOV A,L&lt;br /&gt;
     CMP E&lt;br /&gt;
     JNZ CIKLUS&lt;br /&gt;
     MOV A,H&lt;br /&gt;
     CMP D&lt;br /&gt;
     JNZ CIKLUS&lt;br /&gt;
     &lt;br /&gt;
     POP H&lt;br /&gt;
     POP D&lt;br /&gt;
     POP B&lt;br /&gt;
     POP PSW&lt;br /&gt;
     RET&lt;br /&gt;
&lt;br /&gt;
=== 3. n.) ===&lt;br /&gt;
Írja meg a SENDBYTE 8085 assembly szubrutint, amely a következő specifikáció szerint működik:&lt;br /&gt;
A szubrutin feladata a mellékelt ábrán specifikált hand-shake szekvencia alapján a B regiszterben kapott adat byte továbbítása a 20H I/O címre. A megoldás során ügyeljen arra, hogy a szubrutin a flag-ek értékét ne változtassa meg! Rajzolja fel a szubrutin mellé a rutin folyamatábráját is!&lt;br /&gt;
&lt;br /&gt;
Hand-shake: rajz&lt;br /&gt;
* először megjelenik az érvényes adat a porton&lt;br /&gt;
* majd a SOD jel 0 -&amp;gt; 1 átmenete után (némi várakozás után min kb. 320 ns) a SID jel is 0 -&amp;gt; 1-be váltjuk&lt;br /&gt;
* utána a SOD 0-ba vált (ekkor a porton az adatvezeték nagyimpedanciás lesz/nem lesz adat), ezután a SID is 0-ba váltjuk&lt;br /&gt;
* a lényeg, hogy a SOD 1-be váltását követően de még a 0-ba váltását megelőzően ki kell olvasni az adatot és be kell állítani a megfelelő állapotba a SID-et&lt;br /&gt;
&lt;br /&gt;
Írjon 8085 assembly kódrészletet, mely a 2345h címtől kezdődő 34 byte adatot a SENDBYTE szubrutin segítségével továbbítja.&lt;br /&gt;
&lt;br /&gt;
    SENDBYTE:       ;ez túl sok karakternek tűnik :)&lt;br /&gt;
        PUSH PSW&lt;br /&gt;
    VAR:    RIM&lt;br /&gt;
        ANI 80H&lt;br /&gt;
        JNZ VAR&lt;br /&gt;
        MOV A,B&lt;br /&gt;
        OUT 20H&lt;br /&gt;
        RIM&lt;br /&gt;
        MVI A,0C0H  ;11000000B&lt;br /&gt;
        SIM&lt;br /&gt;
    WSID0:  RIM     &lt;br /&gt;
        ANI 80H&lt;br /&gt;
        JZ WSID0&lt;br /&gt;
        RET&lt;br /&gt;
&lt;br /&gt;
    ;programrészlet&lt;br /&gt;
        LXI D,2345H&lt;br /&gt;
        MVI H,34&lt;br /&gt;
    MASOL:  LDAX D&lt;br /&gt;
        MOV B,A&lt;br /&gt;
        CALL SENDBYTE&lt;br /&gt;
        DCR H&lt;br /&gt;
        JNZ MASOL&lt;br /&gt;
&lt;br /&gt;
Egy másik megoldás:&lt;br /&gt;
 SENDBYTE:&lt;br /&gt;
     RIM&lt;br /&gt;
     ANI 80H&lt;br /&gt;
     JNZ SENDBYTE&lt;br /&gt;
     MOV A,B&lt;br /&gt;
     OUT 20H&lt;br /&gt;
     RIM&lt;br /&gt;
     ORI C0H     ;11000000B&lt;br /&gt;
     SIM&lt;br /&gt;
 VARSID1:RIM&lt;br /&gt;
     ANI 80H&lt;br /&gt;
     JZ VARSID1&lt;br /&gt;
     RIM&lt;br /&gt;
     ANI 7FH     ;01111111B&lt;br /&gt;
     ORI 40H     ;01000000B&lt;br /&gt;
     RET&lt;br /&gt;
&lt;br /&gt;
=== 3. o.) ===&lt;br /&gt;
Írjon 8085 assembly szubrutint, amely a következő specifikáció szerint működik:&lt;br /&gt;
* A szubrutin (GETBLOCK) feladata a 80H I/O címen elhelyezkedő 8255 párhuzamos periféria illesztő A portján 1-es üzemmódban az RST 5.5 IT-vel érkező 32 byte-os adatblokk és a hozzá tartozó 1 byte-os ellenőrző összeg beolvasása. A rutin a beolvasott adatokat a 9000h címtől kezdődően helyezze el. Az ellenőrző összeg számítási algoritmusa:&lt;br /&gt;
* Ai mod 256  1=&amp;lt;i=&amp;lt;32&lt;br /&gt;
* A rutin Z=1-gyel jelezze, ha az ellenőrző összeg helyes, Z=0-val, ha hibás volt. Mindkét esetben az&lt;br /&gt;
akkumulátor a helyes (a számított) ellenőrző összeget tartalmazza! (A rutin bármely regiszter értékét elronthatja!)&lt;br /&gt;
&lt;br /&gt;
* Írja meg a 8255-öst felprogramozó szubrutint (A port: 1-es üzemmód, bemenet; B port: 0-ás üzemmód, kimenet; C port:&lt;br /&gt;
bemenet)&lt;br /&gt;
&lt;br /&gt;
    FELPROG:    &lt;br /&gt;
        MOV A,10111001B&lt;br /&gt;
        OUT 83H&lt;br /&gt;
        RET&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Írja meg azt az RST 5.5-ös IT rutint, amely a 8001h címen elhelyezkedő byte legmagasabb helyértékű bitjének&lt;br /&gt;
bebillentésével jelzi, ha beolvasott egy adatot. Az adat ilyenkor a 8000h memória címen található.  &lt;br /&gt;
&lt;br /&gt;
        ORG 2CH&lt;br /&gt;
    RST55:  LXI D,8001H&lt;br /&gt;
        LDAX D&lt;br /&gt;
        XRI 01H&lt;br /&gt;
        STAX D  &lt;br /&gt;
        RET&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Írja meg a GETBLK szubrutint, az RST 5.5-ös IT rutin használatával Feltételezheti, hogy a rutin hívásakor az RST5.5 IT már engedélyezve van, de ne feledkezzen meg arról, hogy inicializáláskor a megszakítást a 8255-ösben letiltottuk!&lt;br /&gt;
&lt;br /&gt;
    GETBLK: EI&lt;br /&gt;
        MVI B,32        ;32 byte beolvasása&lt;br /&gt;
        MVI C,0     ;az ellenőrző összeg számításához&lt;br /&gt;
        LXI D,9000H &lt;br /&gt;
    BEOLV:  IN 80H&lt;br /&gt;
        CALL RST55&lt;br /&gt;
        STAX D&lt;br /&gt;
        ADD C&lt;br /&gt;
        INX D&lt;br /&gt;
        DCR B&lt;br /&gt;
        JNZ BEOLV&lt;br /&gt;
        LDAX D      ;az ellenőrző összeg beolvasása, a 32 byte-os adatblokk után következik&lt;br /&gt;
        CMP C&lt;br /&gt;
        MOV A,C&lt;br /&gt;
        DI  &lt;br /&gt;
        RET&lt;br /&gt;
&lt;br /&gt;
Egy másik megoldás:&lt;br /&gt;
&lt;br /&gt;
 ORG 2CH:JMP 1000H&lt;br /&gt;
 ORG 1000H:&lt;br /&gt;
     IN 80H&lt;br /&gt;
     MOV M,A&lt;br /&gt;
     PUSH H&lt;br /&gt;
     XCHG        ;HL-ben RESZOSSZEG&lt;br /&gt;
     MOV E,A&lt;br /&gt;
     MVI D,0&lt;br /&gt;
     DAD D       ;HL-ben uj reszosszeg       &lt;br /&gt;
     XCHG        ;DE-ben .............&lt;br /&gt;
     POP H       ;HL-ben cim (9000H)&lt;br /&gt;
     INX H&lt;br /&gt;
     DCR C&lt;br /&gt;
     EI&lt;br /&gt;
     RET&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 RUTIN:  MVI A,B9H   ;10111001B&lt;br /&gt;
     OUT 83H&lt;br /&gt;
     LXI H,9000H&lt;br /&gt;
     LXI D,0&lt;br /&gt;
     MVI C,32&lt;br /&gt;
 KORBE:  MVI A,0&lt;br /&gt;
     CMP C&lt;br /&gt;
     JNZ KORBE&lt;br /&gt;
     MOV A,M&lt;br /&gt;
     CMP E&lt;br /&gt;
     MOV A,E         &lt;br /&gt;
     RET&lt;br /&gt;
&lt;br /&gt;
 ORG 2CH:JMP1000H&lt;br /&gt;
 ORG 1000H:&lt;br /&gt;
     LXI H,8001H&lt;br /&gt;
     MOV A,M&lt;br /&gt;
     ANI 01111111B&lt;br /&gt;
     MOV M,A&lt;br /&gt;
     IN 80H&lt;br /&gt;
     LXI H,8000H&lt;br /&gt;
     MOV M,A&lt;br /&gt;
     LXI H,8001H&lt;br /&gt;
     MOV A,M&lt;br /&gt;
     ORI 10000000B&lt;br /&gt;
     MOV M,A&lt;br /&gt;
     EI&lt;br /&gt;
     RET&lt;br /&gt;
&lt;br /&gt;
=== 3. p.) ===&lt;br /&gt;
&lt;br /&gt;
Készítse el egy 8251 típusú USART-ot tartalmazó soros adó/vevő áramkör terveit és az aszinkron vételi folyamatot megvalósító szubrutin programját.Az USART áramkör a 80h és 81h port címterületet foglalja el.&lt;br /&gt;
Írja meg az áramkört inicializáló és a vételi folyamatot engedélyező programrészt! Az átvitel paraméterei:&lt;br /&gt;
* aszinkron adás és vétel&lt;br /&gt;
* egyszeres Baud-rate&lt;br /&gt;
* 8 adatbit, páros paritás, 1 STOP bit&lt;br /&gt;
* adás letiltva, vétel engedélyezve&lt;br /&gt;
&lt;br /&gt;
    ;programrész&lt;br /&gt;
        MOV A,01111101B     ;119.o./ aszinkron átvitelre vonatkozó Mode Instruction&lt;br /&gt;
        OUT 80H&lt;br /&gt;
        MOV A,11100110B     ;121.o./ Command Instruciton&lt;br /&gt;
        OUT 80H         ;elvileg ugyanarra a címre kell küldeni, mint a Mode Instr.-t&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
Írja meg a 8251-es áramkörön keresztül 32 adatbyte-ot ciklikus lekérdezéssel beolvasó szubrutint, amely az adatot a memória 8000h - 801Fh tartományába írja be! A szubrutinban feltételezheti, hogy a vétel során nem lép fel hiba!&lt;br /&gt;
* a 116.o. alján találhatók szerint a 8251-esen keresztüli adatbeolvasáshoz a C/D(negált)-nak 0-nak kell lennie&lt;br /&gt;
* arra nem jöttem rá, hogy hogyan lehet ezt állítani, lehet, hogy a feladat szerint feltesszük azt, hogy a megfelelő állapotban van&lt;br /&gt;
&lt;br /&gt;
    BEOLV:  LXI D,8000H&lt;br /&gt;
        MVI C,32&lt;br /&gt;
    OLV:    IN 80H&lt;br /&gt;
        STAX D&lt;br /&gt;
        INX D&lt;br /&gt;
        DCR C&lt;br /&gt;
        JNZ OLV&lt;br /&gt;
&lt;br /&gt;
== 4. feladat ==&lt;br /&gt;
&lt;br /&gt;
=== 4. a.) ===&lt;br /&gt;
&lt;br /&gt;
    ;kód            ;PC    ;adatsín ;/RD v. /WR   ;megjegyzés&lt;br /&gt;
    -----------------------------------------------------------------------------------&lt;br /&gt;
    ORG 0000h                                  direktíva&lt;br /&gt;
    LXI SP,0h       0000   31H      /RD&lt;br /&gt;
                    0001   00       /RD&lt;br /&gt;
                    0002   00       /RD        SP=0000H&lt;br /&gt;
    RST 7           0003   FFH      /RD        itt ugrik a 0038H-ra    &lt;br /&gt;
                    FFFF   00       /WR&lt;br /&gt;
                    FFFD   04       /WR        ;SP=FFFD&lt;br /&gt;
    HLT                                        hát ez most kimarad!&lt;br /&gt;
    ORG 38h                                    direktíva&lt;br /&gt;
    XRA A           0038   AEH      /RD        kinullázza A-t, így Z flag=1 lesz&lt;br /&gt;
    LXI H,0F000h    0039   3AH      /RD&lt;br /&gt;
                    0040   00H      /RD&lt;br /&gt;
                    0041   F0H      /RD        HL=F000H&lt;br /&gt;
    MOV M,A         0042   77H      /RD        az F000H címre 0-t tölt be&lt;br /&gt;
    ORA M           0043   B6H      /RD        0 OR 0=0 -&amp;gt; Z=1&lt;br /&gt;
    JNZ 38h         0044   C2H      /RD        feltétel nem teljesül így csak 1 byte-os az ut.&lt;br /&gt;
    RET             0045   C9H      /RD        PC=0000 , SP=0002&lt;br /&gt;
&lt;br /&gt;
=== 4. f.) ===&lt;br /&gt;
&lt;br /&gt;
    ;kód            ;PC    ;adatsín ;/RD vagy /WR   ;megjegyzés&lt;br /&gt;
    --------------------------------------------------------------------&lt;br /&gt;
    ORG 0000h                             direktíva                                      &lt;br /&gt;
    LXI H,9000h     0000   21H     /RD&lt;br /&gt;
                    0001   00H     /RD&lt;br /&gt;
                    0002   90H     /RD    HL=9000H&lt;br /&gt;
    SPHL            0003   F9H     /RD    SP=HL=9000H&lt;br /&gt;
    LXI H,0100h     0004   21H     /RD    &lt;br /&gt;
                    0005   00H     /RD&lt;br /&gt;
                    0006   01H     /RD    HL=0100H&lt;br /&gt;
    PCHL            0007   E9H     /RD    PC=0100H&lt;br /&gt;
    HLT                                   ez most kimarad! (de később idejutunk)&lt;br /&gt;
    CALL 0102h                            ez is! (de ide később se jutunk el)&lt;br /&gt;
    ORG 0100h                             direktíva&lt;br /&gt;
    MVI A,45h       0100   3EH     /RD&lt;br /&gt;
                    0101   45H     /RD    A=45H&lt;br /&gt;
    LXI B,1234h     0102   01H     /RD    &lt;br /&gt;
                    0103   34H     /RD&lt;br /&gt;
                    0104   12H     /RD    BC=1234H&lt;br /&gt;
    XRA C           0105   A9H     /RD    A=34 XOR 45 =   00110100&lt;br /&gt;
                                                  XOR     01000101        &lt;br /&gt;
                                                          -----------&lt;br /&gt;
                                                          01110001= 71H =A, Z flag=0&lt;br /&gt;
    PUSH B          0106   C5H     /RD    &lt;br /&gt;
                    8FFF   34H     /WR&lt;br /&gt;
                    8FFE   12H     /WR    SP=8FFE&lt;br /&gt;
    XRA B           0107   A8H     /RD    A=01100010B= 62H ,  Z flag=0&lt;br /&gt;
    POP D           0108   D1H     /RD&lt;br /&gt;
                    8FFE   12H     /RD&lt;br /&gt;
                    8FFF   34H     /RD    D=1234H&lt;br /&gt;
    HLT             0109   76H     /RD    &lt;br /&gt;
    JMP 0008h       010A   C3H     /RD&lt;br /&gt;
                    010B   08H     /RD&lt;br /&gt;
                    010C   00H     /RD&lt;br /&gt;
    HLT:  ez kimarad mert előtte ugrunk az 1. HLT-re (PC=0008), ahol a progi befagy&lt;br /&gt;
&lt;br /&gt;
== 5. feladat ==&lt;br /&gt;
&lt;br /&gt;
=== 5. a.) ===&lt;br /&gt;
&lt;br /&gt;
Az alábbi kódrészlettel a 8000h címen elhelyezkedő 500 byte-os memóriaterület modulo 256-os ellenőrző&lt;br /&gt;
összegét szeretnénk kiszámolni, és a memória területet követő byte-ban eltárolni. A program hibásan működik.&lt;br /&gt;
Miért? &lt;br /&gt;
&lt;br /&gt;
        LXI H,8000h&lt;br /&gt;
        LXI D,500&lt;br /&gt;
        XRA A&lt;br /&gt;
    ciklus:     &lt;br /&gt;
        ADD M&lt;br /&gt;
        INX H&lt;br /&gt;
        DCX D&lt;br /&gt;
        JNZ ciklus&lt;br /&gt;
        MOV M,A&lt;br /&gt;
&lt;br /&gt;
Válasz: a DCX utasítás nem állítja a Z flaget, így a JNZ utasítás nem működik&lt;br /&gt;
&lt;br /&gt;
=== 5. b.) ===&lt;br /&gt;
Egy i8085-ös mikroszámítógép megszakítási rendszerének megvalósításakor i8259A megszakításvezérlőt&lt;br /&gt;
alkalmaztunk, amely báziscíme 20h. Az alábbi megszakítást úgy szeretnénk megvalósítani, hogy&lt;br /&gt;
bármelyik másik megszakítás-bemenetre érkező kérés azonnal érvényre juthasson mielőtt maga az IRUT rutin&lt;br /&gt;
befejeződik. A program hibásan van megírva. Miért? Mit kellene kijavítani?&lt;br /&gt;
&lt;br /&gt;
    IRUT:   PUSH PSW&lt;br /&gt;
        PUSH B&lt;br /&gt;
        EI&lt;br /&gt;
        OUT 41h&lt;br /&gt;
        IN 40h&lt;br /&gt;
        ADI 1&lt;br /&gt;
        OUT 40h&lt;br /&gt;
        MVI B,3&lt;br /&gt;
    CIKL:   IN 40h&lt;br /&gt;
        ACI 0&lt;br /&gt;
        OUT 40h&lt;br /&gt;
        DCR B&lt;br /&gt;
        JNZ CIKL&lt;br /&gt;
        POP B&lt;br /&gt;
        MVI A,20h&lt;br /&gt;
        OUT 20h&lt;br /&gt;
        POP PSW&lt;br /&gt;
        RET&lt;br /&gt;
&lt;br /&gt;
Az a hiba, hogy a megszakítás vezérlőben az IT nyugtázása (EOI) csak az IT rutin végén történik meg (MVI A,20h; OUT 20h), ezért az alacsonyabb prioritású interruptok csak ez után jutnának érvényre.&lt;br /&gt;
&lt;br /&gt;
=== 5. c.) ===&lt;br /&gt;
&lt;br /&gt;
Ugyanaz mint az [[#5. a.)]]&lt;br /&gt;
&lt;br /&gt;
=== 5. d.) ===&lt;br /&gt;
&lt;br /&gt;
Az alábbi kódrészlettel a 8000h címen elhelyezkedő szót (16bit) szeretnénk hozzáadni a 8150h címen&lt;br /&gt;
elhelyezkedő szóhoz úgy, hogy az eredmény a 8000h címre kerüljön (A szó alacsonyabb helyértékű bájtja&lt;br /&gt;
(LSB) mindig a kisebb címen helyezkedik el.). A program hibásan működik. Miért? Mit kellene kijavítani?&lt;br /&gt;
&lt;br /&gt;
    Osszead:    LXI H,8000h&lt;br /&gt;
        LDA 8150h&lt;br /&gt;
        ADD M       &lt;br /&gt;
        MOV M,A&lt;br /&gt;
        INX H&lt;br /&gt;
        LDA 8151h&lt;br /&gt;
        ADD M       ;itt ADC M kell, mert lehet átvitel a előző byte-ok összadása során&lt;br /&gt;
        MOV M,A&lt;br /&gt;
        RET&lt;br /&gt;
    &lt;br /&gt;
== 6. feladat ==&lt;br /&gt;
&lt;br /&gt;
Ehhez létezik egy javításokat tartalmazó PDF. [[Media:Digit2_ef_V2_megold_6-7-javitott.pdf|Megtekintés.]]&lt;br /&gt;
&lt;br /&gt;
=== 6. a.) ===&lt;br /&gt;
&lt;br /&gt;
;Egy kaszkádosított megszakításkezelő rendszerben, milyen esetben kell parancsbyte-ban megadni a SLAVE megszakításkezelőknek, hogy slave áramkörök? &lt;br /&gt;
:Kaszkádosítás esetén, bufferelt kapcsolás esetén (62.o./3.5. , 63.o./3.6.3.)&lt;br /&gt;
&lt;br /&gt;
;Ebben az esetben hány ICW parancsbyte-ot kell kiadni és miért? &lt;br /&gt;
:4, ICW1-4 (66.o./ 3.6.2. - 3.6.3.) ICW3 a kaszkádosítás miatt kell, az ICW4 pedig a bufferelt kapcsolás miatt (M/S bit)&lt;br /&gt;
&lt;br /&gt;
;Miért van szükség ICW3 parancsbyte-ra? &lt;br /&gt;
:Mert kaszkádosott megszakításkezelő rendszert használunk&lt;br /&gt;
&lt;br /&gt;
;Miért van szükség ICW4 parancsbyte-ra?&lt;br /&gt;
:A master-slave pozíciókat az ICW-4-el lehet beállítani (bufferelt üzemmód esetén szükséges) (M/S bit)&lt;br /&gt;
&lt;br /&gt;
=== 6. b.) === &lt;br /&gt;
Inicializáljon egy 90h báziscímű i8255-ös párhuzamos periféria áramkör: A portját 1-es üzemmódban kimenetre, B portját szintén 1 üzemmódban bemenetre, C port alsó és felső felét bemenetre kell állítani. Adja meg a vezérlő szó értékét! Állítsa be a 8255 INTE ff-jainak értékét is!&lt;br /&gt;
&lt;br /&gt;
    MOV A,10101111B     ;95.o./5.1 táblázat&lt;br /&gt;
    OUT 93H             ;94.o./működési tábla&lt;br /&gt;
    DI&lt;br /&gt;
&lt;br /&gt;
:gondolom az INTE ff-kat mind 0-ra kell állítani, mert ha 1 lenne, akkor az üzembe helyezést követően már kérne megszakítást&lt;br /&gt;
:de az üzemmód megváltoztatásakor a f/f-k törlődnek,így ehhez sztem külön parancs nem szükséges&lt;br /&gt;
&lt;br /&gt;
=== 6. c.) ===&lt;br /&gt;
Egy vegyesen kaszkádosított 8259-es megszakítási rendszerben a MASTER egység IR2 bemenetére SLAVE áramkör&lt;br /&gt;
kapcsolódik. A MASTER egység ugrási táblájának kezdőcíme 8000h, a SLAVE ugrási táblájának kezdőcíme 9000h,&lt;br /&gt;
mindkettő nyolcas osztásban.&lt;br /&gt;
&lt;br /&gt;
Adja meg, hogy milyen ICW3 parancsot kell küldeni a MASTER illetve a SLAVE egységeknek!&lt;br /&gt;
&lt;br /&gt;
    LXI D,8000H ;MASTER&lt;br /&gt;
    MOV A,0000100B&lt;br /&gt;
    INX D&lt;br /&gt;
    STAX D&lt;br /&gt;
&lt;br /&gt;
    LXI H,9001H ;SLAVE, másik módszerrel&lt;br /&gt;
    MOV A,0000010B&lt;br /&gt;
    MOV M,A&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
; Adja meg, mennyi lesz a MASTER IR6 bemenetére érkező megszakítás szubrutinjának kezdőcíme!&lt;br /&gt;
: 802CH (65.o. ADI=0 esetén táblázat)&lt;br /&gt;
&lt;br /&gt;
Adja meg, mennyi lesz a SLAVE IR6 bemenetére érkező megszakítás szubrutinjának kezdőcíme!&lt;br /&gt;
-902CH (65.o. ADI=0 esetén táblázat)&lt;br /&gt;
&lt;br /&gt;
=== 6. d.)===&lt;br /&gt;
Egy aszinkron üzemmódba felprogramozott 8251-es soros áramkör hibásan működik. A program státusz beolvasáskor olyan hibákat olvas, amelyek adat fogadásakor lépnek fel. Melyek lehetnek ezek, mi lehet a hibák oka ?&lt;br /&gt;
&lt;br /&gt;
# OVERRUN ERROR (=túlfutási hiba), akkor ha a puffer-regiszter megelőző tartalmát a CPU még nem olvasta ki és ezt a 8251 felülírja&lt;br /&gt;
# FRAMING ERROR (=kerethiba): 0 színtű STOP bitek érkeznek&lt;br /&gt;
# PARITY ERROR (=paritás hiba): rossz paritás&lt;br /&gt;
&lt;br /&gt;
===6. e.)===&lt;br /&gt;
Mit jelent a BREAK üzemmód a 8251-es áramkörnél? &lt;br /&gt;
* aszinkron üzemmódban folyamatos kiküldhetők a vonalra, ha nincs folyamatban adatkivitel, állapotjelzésre is szolgálhat&lt;br /&gt;
&lt;br /&gt;
Mire alkalmazható? &lt;br /&gt;
* felhasználható megszakításkérés jelzésére&lt;br /&gt;
&lt;br /&gt;
Hogyan lehet beállítani?&lt;br /&gt;
* beállítása: a Command Instruction 3. bitje, a SBRK =1 esetén a TXD=0 lesz (Break karakter)&lt;br /&gt;
&lt;br /&gt;
=== 6. f.)===&lt;br /&gt;
Rajzolja fel egy aszinkron üzemmódban felprogramozott USART kimeneti jelalakját (TxD) 8 bites, 0Fh értékű adat elküldésekor, ha páros paritást és 1 stop bitet alkalmazunk.&lt;br /&gt;
&lt;br /&gt;
    0   1   1   1   1   0   0   1&lt;br /&gt;
       ___ ___ ___ ___         ___&lt;br /&gt;
   ___|               |___ ___|&lt;br /&gt;
&lt;br /&gt;
=== 6. g.)===&lt;br /&gt;
Egy i8085-ös mikroprocesszoros rendszerben az A, B, C jelek külön kártyákon állnak elő, változásuk egymástól független, de mindannyian szeretnének időszakosan megszakítást kérni a processzor RST5.5 vonalán. Milyen kimenetű kapukat kell a szaggatottal jelölt dobozokba tervezni, hogy a rendszer helyesen működjön, miért?&lt;br /&gt;
* Open collector, mivel a kimeneteket összekötöttük, és a rendszer tartalmazott közvetlen felhúzó ellenállást&lt;br /&gt;
&lt;br /&gt;
=== 6. h.) ===&lt;br /&gt;
Egy i8085-ös mikroprocesszoros rendszerben az A, B, C jelek külön kártyákon állnak elő, változásuk egymástól független, de mindegyiket szeretnénk időszakosan címezhetően külön-külön beolvasni a processzor D0 adatvonalán. Milyen kimenetű kapukat kell a szaggatottal jelölt dobozokba tervezni, hogy a rendszer helyesen működjön, miért?&lt;br /&gt;
* Tristate,  mivel a kimenetek összekötöttük és a rendszer nem tartalmazott közvetlen felhúzó ellenállást&lt;br /&gt;
&lt;br /&gt;
===6. i.)===&lt;br /&gt;
Egy 8085 mikroprocesszoros rendszerben 1 master és 4 slave 8259-es IT vezérlőt használunk. Hány megszakítást tudunk összesen lekezelni a 8259-esekkel?&lt;br /&gt;
* 4*8+(8-4)=36&lt;br /&gt;
* A 4 Slave 8 megszakítást tud kezelni + a Master maradék IR bemenetei felhasználhatók megszakításkérés céljára (60.o./3.4.)&lt;br /&gt;
&lt;br /&gt;
A fenti konfigurációt úgy kötötték be, hogy a slave egységek a master 0,2,4 és 6 sorszámú bemenetére kapcsolódnak. A rendszer hibásan működik. Miért? Indokolja a választ!&lt;br /&gt;
* ha a Masternek egyedi megszakításkérő vezetékei is vannak, akkor a IR0 bemenetre nem szabadna az egyik Slave-t sem rákötni, ugyanis a CAS vezetékek 0 állapota egyszerre jelentené a Master és az egyik Slave megszakításkérését (62.o./3.4.)&lt;br /&gt;
&lt;br /&gt;
A fenti konfigurációban az összes vezérlő egy közös meghajtón (74LS245) keresztül csatlakozik a rendszersínre. Hogyan lehet ilyen esetben az egyes vezérlőknek megmondani, hogy master vagy slave szerepet játszanak?&lt;br /&gt;
* az ICW 4 parancsbyte 2. bitjével (=M/S) (66.o./3.6.3.)&lt;br /&gt;
&lt;br /&gt;
=== 6. j.)===&lt;br /&gt;
Egy DMA vezérlő mind a 4 csatornájára egy-egy periféria csatlakozik. Használható-e ilyenkor az 1-es csatorna&lt;br /&gt;
AUTOLOAD üzemmódban? Indokolja a választ!&lt;br /&gt;
*Nem, csak a CH2 és CH3 használható (81.o./4.6.4.)&lt;br /&gt;
&lt;br /&gt;
Programozza fel a DMA vezérlőt AUTOLOAD üzemmódba úgy, hogy a 9000h memóriacímtől kezdődő címre&lt;br /&gt;
periódikusan 128 byte adatot legyen képes betölteni a perifériából. A 8257-es báziscíme: 70H.&lt;br /&gt;
&lt;br /&gt;
        LXI D,9000H&lt;br /&gt;
        MVI B,128&lt;br /&gt;
        MOV A,10101111B&lt;br /&gt;
        OUT 78H         ;beírás A3=1, A2=A1=A0=0&lt;br /&gt;
    TOLT:   IN 78H      ;kiolvasás is A3=1, A2=A1=A0=0&lt;br /&gt;
        STAX D&lt;br /&gt;
        INX D&lt;br /&gt;
        DCR B&lt;br /&gt;
        JNZ TOLT&lt;br /&gt;
        END&lt;br /&gt;
&lt;br /&gt;
=== 6. k.) ===&lt;br /&gt;
Mi különbség adatátvitel szinkronizálása szempontjából a 8251-es soros áramkör aszinkron és szinkron soros adatátvitele között?&lt;br /&gt;
* az aszinkron átvitel esetén a start és stop bitek segítségébel szinkronizájla az átvitelt, a start bit megérkezésést az RXD 1 -&amp;gt; 0 átmenet jelzi&lt;br /&gt;
* a szinkron átvitel esetén a szinkronizálást külső, vagy belső eljárással kell megoldani, SYNC karakter érkezésére várunk (belső) vagy a SYNDET-et bemenetként programozzuk fel&lt;br /&gt;
&lt;br /&gt;
=== 6. l.) ===&lt;br /&gt;
Programozzon fel egy 8253-as timer áramkört, amely 3,072MHz-ről 4800Hz frekvenciára osztja le jelet, 50-50%-os kitöltésűre! A 8253-as áramkör binárisan számol, és 90h báziscíme van. Használja a 0-s számlálót!&lt;br /&gt;
&lt;br /&gt;
    ;3,072 Mhz=4800*640&lt;br /&gt;
    ;640= 0000 0001 | 0100 0000&lt;br /&gt;
&lt;br /&gt;
    MOV A,00111110B&lt;br /&gt;
    OUT 93H&lt;br /&gt;
    MOV A,01H&lt;br /&gt;
    OUT 90H&lt;br /&gt;
    MOV A,80H&lt;br /&gt;
    OUT 91H&lt;br /&gt;
&lt;br /&gt;
=== 6. m.) === &lt;br /&gt;
Egy kaszkádosított 8259-es rendszerben a MASTER egység IR7 és IR6 bemenetére SLAVE áramkörök kapcsolódnak.&lt;br /&gt;
Adja meg, hogy milyen ICW3 parancsot kell küldeni a Master egységnek!&lt;br /&gt;
* 11000000 (66.o./3.6.2.)&lt;br /&gt;
&lt;br /&gt;
Adja meg, hogy milyen ICW3 parancsot kell küldeni Az IR6-ra csatlakozó SLAVE egységnek&lt;br /&gt;
* 01000000 (66.o./3.6.2.)&lt;br /&gt;
&lt;br /&gt;
Hogyan tudjuk kijelölni, hogy lesz ICW3 parancs?&lt;br /&gt;
*az ICW1 SNGL bitjének 0 állapotba állításával, az ICW1 1. bitje (D1)  (63.o. táblázat, 64.o. ICW1 - SNGL)&lt;br /&gt;
&lt;br /&gt;
== 7. feladat ==&lt;br /&gt;
&lt;br /&gt;
Ehhez létezik egy javításokat tartalmazó PDF. [[Media:Digit2_ef_V2_megold_6-7-javitott.pdf|Megtekintés.]]&lt;br /&gt;
&lt;br /&gt;
===7. a.)===&lt;br /&gt;
Sorolja fel az i8085 állapotait!&lt;br /&gt;
* RUN, WAIT, HALT, HOLD&lt;br /&gt;
&lt;br /&gt;
===7. b.)===&lt;br /&gt;
Szerkesszen gráfot, amely az i8085-ös állapotainak kapcsolatát ábrázolja! A nyilazott ágakra az állapot-változások okait kell felírni.&lt;br /&gt;
&lt;br /&gt;
* RUN -&amp;gt; WAIT:  Ready jel 0 szintre vált&lt;br /&gt;
* WAIT -&amp;gt; RUN:  Ready jel 1-re vált&lt;br /&gt;
* RUN -&amp;gt; HALT:  HLT parancs kiadásakor&lt;br /&gt;
* HALT -&amp;gt; RUN: megszakításkérés érkezésekor&lt;br /&gt;
* RUN -&amp;gt; HOLD: HOLD 1-be vált&lt;br /&gt;
* HOLD -&amp;gt; RUN:  a HOLD jel megszűnése után&lt;br /&gt;
* HALT -&amp;gt; HOLD: HOLD igény érkezésekor (HOLD=1)&lt;br /&gt;
* HOLD -&amp;gt; HALT: HOLD megszűnése (HOLD=0)&lt;br /&gt;
&lt;br /&gt;
=== 7. c.) ===&lt;br /&gt;
Milyen esetekben kerül a 8085-ös mikroprocesszor HALT állapotból RUN állapotba?&lt;br /&gt;
* HALT -&amp;gt; RUN: megszakításkérés érkezésekor, illetve reset hatására&lt;br /&gt;
&lt;br /&gt;
===7. d.)===&lt;br /&gt;
Sorolja fel azokat az eseteket, amikor az INTE FF = 0 értékű lesz!&lt;br /&gt;
* DI parancs kiadásakor, reset, megszakítás érvényre jutása után&lt;br /&gt;
&lt;br /&gt;
===7. e.) ===&lt;br /&gt;
Sorolja fel azokat az eseteket, amikor az RST7.5 FF = 0 értékű lesz!&lt;br /&gt;
* SIM utasítás esetén,ha a 4. bittel töröljük az RST7.5-t (A4=1), illetve RESET után&lt;br /&gt;
&lt;br /&gt;
===7. f.)===&lt;br /&gt;
Az i8085-ös processzor reszetelésekor milyen értékű lesz az INTEFF, és mi lesz a PC tartalma?&lt;br /&gt;
* az INTEFF-kat törli, tehát 0 lesz , PC:0000H&lt;br /&gt;
&lt;br /&gt;
===7. g.)===&lt;br /&gt;
Milyen kezdőcímeken kezdődnek az RST 2 és RST 5 utasításokkal meghívott szubrutinok, illetve az RST 5.5 és az RST 7.5 megszakítási szubrutinok?&lt;br /&gt;
* RST 2: 10H&lt;br /&gt;
* RST 5: 28H&lt;br /&gt;
* RST 5.5: 2CH&lt;br /&gt;
* RST 7.5: 3CH&lt;br /&gt;
&lt;br /&gt;
=== 7. h.)===&lt;br /&gt;
Mit kell kezdőértéknek az SP-be betölteni ha a programozó úgy kívánja beállítani a STACK tárat, hogy az első értékes beírt bájt 8FFFh-ra íródjon? Miért?&lt;br /&gt;
* 9000H, mert &#039;&#039;először&#039;&#039; csökkenti az SP értékét a processzor, és csak utána ír a stackre.&lt;br /&gt;
&lt;br /&gt;
===7. i.)===&lt;br /&gt;
Hogyan jelezzük a fordítóprogramnak, hogy a generált kódot az 1698h címtől kezdődően helyezze el?&lt;br /&gt;
* ORG 1698H&lt;br /&gt;
&lt;br /&gt;
===7. j.)===&lt;br /&gt;
Hogyan jelezzük a fordítóprogramnak, hogy az 1712h címtől kezdődően helyezze el a „digit” stringet?&lt;br /&gt;
&lt;br /&gt;
    ORG 1712H&lt;br /&gt;
    KAR DB &amp;quot;digit&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===7. k.)===&lt;br /&gt;
Hogyan jelezzük a fordítóprogramnak, hogy inicializált vagy inicializálatlan helyfoglalás történik?&lt;br /&gt;
* inicializált: DB vagy DW,&lt;br /&gt;
* inicializálatlan: DS direktívát használunk&lt;br /&gt;
&lt;br /&gt;
===7. l.)===&lt;br /&gt;
Mi a különbség az EQU 1200h és a DW 1200h direktívák között?&lt;br /&gt;
* CIMKE EQU 1200H: értékadás, hivatkozás a CIMKE-vel&lt;br /&gt;
* DW 1200H:  inicializált helyfoglalás&lt;br /&gt;
&lt;br /&gt;
===7. m.)===&lt;br /&gt;
Sorolja fel az i8085 mikroprocesszor megszakítással kapcsolatos jeleit!&lt;br /&gt;
* TRAP, RST 5.5,6.5,7.5, INTR&lt;br /&gt;
&lt;br /&gt;
===7. n.)===&lt;br /&gt;
Milyen típusú kimenettel rendelkező áramkörökkel lehet busz rendszerű vezetékeket meghajtani? Húzza alá, hogy melyik típusú kimenet alkalmas arra, hogy egy vezetéket (busz) több kimenet egyidejűleg is meghajthasson?&lt;br /&gt;
* tristate, &amp;lt;u&amp;gt;open collector&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===7. o.)===&lt;br /&gt;
Miért nem lehet két totem-pole kimenetű áramkör kimeneteit összekötni? Indokolja a választ? (sztem érdemes indokolni:))&lt;br /&gt;
* mert az ellenáláskon túl nagy teljesítmény disszipálódna, és ennek eredménye a tönkremenetel&lt;br /&gt;
&lt;br /&gt;
===7. p.)===&lt;br /&gt;
i8255-ös párhuzamos periféria áramkör A portját 1-es üzemmódban kimenetre, B-portját 0 üzemmódban bemenetre, C port alsó felét bemenetre, felső felét kimenetre kell állítani. Adja meg a vezérlő szó értékét!&lt;br /&gt;
* 10100011&lt;br /&gt;
&lt;br /&gt;
Adja meg, melyik regiszterbe és milyen értéket kell írni, hogy a fenti üzemmód esetén a PC4 portbit 0 , illetve 1 értékű legyen!&lt;br /&gt;
* Bit Set/Reset művelettel: (a 8255-ös címe+3) címre kell kiküldeni a 00001000 byte-ot a 0-ba állításhoz, 00001001 byte-ot az 1-be állításhoz&lt;br /&gt;
&lt;br /&gt;
===7. q.)===&lt;br /&gt;
Egy 3 gépi ciklusból álló utasítás (pl.: IN 83h) végrehajtása során az első gépi ciklus T1 fázisában egyidőben High (1) értékűek lesznek az INT és a HOLD bemenetek.&lt;br /&gt;
&lt;br /&gt;
;Mikor adja át a DMA vezérlőnek a 8085-ös a busz vezérlési jogot? Indokolja a válaszát!&lt;br /&gt;
:a HOLD bemenet 1-be váltásakor&lt;br /&gt;
&lt;br /&gt;
;Mikor jut érvényre a megszakítás (megszakításkérés engedélyezett állapotban van és nincs más kérés) Indokolja a válaszát!&lt;br /&gt;
:a HOLD jel megszűnését követően, hiszen a 7. b.) feladatban leírtak szerint működik a 8085, HOLD állapotból HALT-ba a HOLD=0-t követően, a HALT-ból a RUN-ba a megszakításkérést követően jut&lt;/div&gt;</summary>
		<author><name>Prisonerhu</name></author>
	</entry>
	<entry>
		<id>https://vik.wiki/index.php?title=Digit%C3%A1lis_technika_2_-_Megold%C3%A1sok_a_V2-es_ellen%C5%91rz%C5%91_feladatsorhoz&amp;diff=166247</id>
		<title>Digitális technika 2 - Megoldások a V2-es ellenőrző feladatsorhoz</title>
		<link rel="alternate" type="text/html" href="https://vik.wiki/index.php?title=Digit%C3%A1lis_technika_2_-_Megold%C3%A1sok_a_V2-es_ellen%C5%91rz%C5%91_feladatsorhoz&amp;diff=166247"/>
		<updated>2013-05-23T15:42:59Z</updated>

		<summary type="html">&lt;p&gt;Prisonerhu: /* 4. a.) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Vissza|Digitális technika 2}}&lt;br /&gt;
[[Category:Digitális technika 2]]&lt;br /&gt;
&lt;br /&gt;
Ezen az oldalon a [[Digitális technika 2#Régi és új Digit2|régi ötkredites]] Digit2 ellenőrző kérdéseihez összegyűjtött megoldások vannak. A megoldások nem mindenhol teljesek vagy jók. Az új Digit2-höz már más ellenőrző feladatsort adott ki a tanszék.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:right;margin:0.5em;&amp;quot; class=&amp;quot;noautonum&amp;quot;&amp;gt;__TOC__&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Media:Digit2_ef_V2.pdf|A V2-es feladatsor itt érhető el.]]&lt;br /&gt;
&lt;br /&gt;
== 1. feladat ==&lt;br /&gt;
&lt;br /&gt;
* [[Media:Digit2_ef_V2_megold_1_a_ell.pdf‎|PDF az 1/a) feladathoz]]&lt;br /&gt;
&lt;br /&gt;
== 2. feladat ==&lt;br /&gt;
&lt;br /&gt;
by Lacee&lt;br /&gt;
(a hibákat jelezni kérem a prisonerhu{{kukac}}freemail.hu címen)&lt;br /&gt;
&lt;br /&gt;
=== 2. a) ===&lt;br /&gt;
&lt;br /&gt;
Készítsen megszakítási vonalakat kezelő áramkört, amely egy 8085-ös processzoron alapuló sín RST 5.5-ös és RST 6.5-ös megszakítási vonalaira csatlakozva2 db külsô megszakítás (IT1 és IT2) fogadására alkalmas.&lt;br /&gt;
&lt;br /&gt;
A külső megszakítások kezelését külön-külön áramkörök végzik, amelyek a külső megszakítás felfutó élére kérnek megszakítást és alaphelyzetbe OUT utasítással állíthatók (vagy a ResetOut jel hatására). Egy megszakítási impulzus csak egyszer kérjen megszakítást. Az IT1 megszakítás hatására a C regiszter 55h, IT2 hatására a C regiszter AAh értéket vesz fel. A megszakítási flip-flopok 11h (IT1) és 17h (IT2) címen érhetők el.&lt;br /&gt;
&lt;br /&gt;
* Készítse el a rendszer inicializálását végző főprogramot (40h címtől kezdődően)!&lt;br /&gt;
* Készítse el a megszakítási szubrutinokat! &lt;br /&gt;
&lt;br /&gt;
        RST55 EQU 2CH&lt;br /&gt;
        RST65 EQU 34H&lt;br /&gt;
        C1 EQU 55H  &lt;br /&gt;
        C2 EQU AAH&lt;br /&gt;
        IT1 11H&lt;br /&gt;
        IT2 17H&lt;br /&gt;
 &lt;br /&gt;
        JMP INIC&lt;br /&gt;
        ORG 0040H&lt;br /&gt;
    INIC:&lt;br /&gt;
        MVI A,00001100B ;RST 7.5-T LETILTJUK, A TÖBBIT ENGEDÉLYEZZÜK&lt;br /&gt;
        SIM     ;MASZK BEÁLLÍTÁSA&lt;br /&gt;
        EI      ;MEGSZAKÍTÁS ENG&lt;br /&gt;
        &lt;br /&gt;
    VAR:    JMP VAR     ;VÉGTELEN CIKLUS, AZ RST-KRE VÁR, AZOK MEGSZAKÍTJÁK&lt;br /&gt;
 &lt;br /&gt;
        ORG RST55   ;RST55 CÍMÉN VAN,ÍGY HA MEGSZAKÍTÁS TÖRTÉNIK, AKKOR IDE UGRIK A PROGI&lt;br /&gt;
    MEGSZ1: MVI C,C1        ;BEÁLLÍTJUK A KÍVÁNT ÉRTÉKET    &lt;br /&gt;
        OUT IT1     ;VISSZAÁLLÍTJUK AZ IO-T&lt;br /&gt;
        EI      ;MEGSZAKÍTÁS ÉRVÉNYRE JUTTATÁSA&lt;br /&gt;
        RET&lt;br /&gt;
 &lt;br /&gt;
        ORG RST65   ;AZ ELÕBBI MINTÁJÁRA...&lt;br /&gt;
    MEGSZ2: &lt;br /&gt;
        MVI C,C2    &lt;br /&gt;
        OUT IT2&lt;br /&gt;
        EI&lt;br /&gt;
        RET&lt;br /&gt;
&lt;br /&gt;
=== 2. b) ===&lt;br /&gt;
&lt;br /&gt;
Írjon assembly szubrutint (KONV), amely az A regiszterben megkapott byte-ot átírja a 74LS374-es regiszter bekötésének megfelelően. A szubrutin kimenete az átkonvertált byte az A regiszterben. (A szubrutin más regiszterek tartalmát nem ronthatja el!)&lt;br /&gt;
&lt;br /&gt;
Írjon ellenőrző 8085-ös assembly szubrutint (ELO), amely az összes lehetséges kombinációval ellenőrzi a kimeneti regiszter bekötését. A szubrutin lefutása után a D,E regiszterpárban legyen a felismert hibák száma! (A szubrutin a D,E regiszterpár kivételével a regiszterek tartalmát nem ronthatja el!) A megoldásban használja az előző feladatban definiált KONV szubrutint! A kimeneti regiszter 0FFh I/O címen írható és 01Fh címen olvasható.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    PÉLDA1 A MÛKÖDÉSRE&lt;br /&gt;
        10101111    ;A BEJÖVÕ ADAT -&amp;gt; EZT KELL KAPNUNK A PÉLDA1-BEN: 01011111&lt;br /&gt;
    RRC 11010111    ;JOBBRA FORGATJUK&lt;br /&gt;
    AND 01010101    ;ÖSSZEÉSELJÜK  55H-VAL (MÁSNÉVEN MASZKOLÁS)&lt;br /&gt;
        ----------&lt;br /&gt;
    =   01010101 -&amp;gt; D   ;AZ EREDMÉNYT BEÍRJUK A (D) REG-BE&lt;br /&gt;
&lt;br /&gt;
    RLC 01011111    ;AZ EREDETI ADATOT FORGATJUK BALRA&lt;br /&gt;
    AND 10101010    ;ÉSELJÜK AAH-VAL&lt;br /&gt;
        ----------&lt;br /&gt;
    =   00001010 -&amp;gt; H   ;KIMENTJÜK H-BA, A PROGIBAN NEM KELL H-BA MENTENI,MERT AZ UTANA LEVÕ PARANCS A&lt;br /&gt;
          VAGYOLÁS ÉS AHHOZ AZ A- TARTALMA KELL, AMI MOST PONT A H-BA RAKOTTAL EGYEZIK MEG&lt;br /&gt;
&lt;br /&gt;
    H OR D&lt;br /&gt;
        01010101    &lt;br /&gt;
        00001010    &lt;br /&gt;
        ----------  &lt;br /&gt;
        01011111    ;AZ EREDMÉNY!&lt;br /&gt;
&lt;br /&gt;
    PÉLDA2:&lt;br /&gt;
        10101110 -&amp;gt;EBBÕL EZT:01011101&lt;br /&gt;
    RRC 01010111&lt;br /&gt;
    AND 01010101&lt;br /&gt;
        ----------&lt;br /&gt;
    =   01010101 -&amp;gt; D&lt;br /&gt;
&lt;br /&gt;
    RLC 01011101&lt;br /&gt;
    AND 10101010&lt;br /&gt;
        -----------&lt;br /&gt;
    =   00001000 -&amp;gt; H&lt;br /&gt;
&lt;br /&gt;
    H OR D&lt;br /&gt;
        01010101&lt;br /&gt;
        00001000&lt;br /&gt;
        -----------&lt;br /&gt;
        01011101&lt;br /&gt;
&lt;br /&gt;
    ;NA ÉS VÉGRE A PROGI&lt;br /&gt;
    KONV:   PUSH H&lt;br /&gt;
        PUSH D&lt;br /&gt;
        PUSH PSW    ;kimentjük A-t&lt;br /&gt;
        RRC     ;jobbra forgatunk&lt;br /&gt;
        ANI 01010101B   ;maszkoljuk 55H-val&lt;br /&gt;
        MOV D,A     ;a maszkolt byte-ot kimentjük D-be&lt;br /&gt;
        POP PSW     ;vissza az A-t&lt;br /&gt;
        RLC         ;balra forgatjuk&lt;br /&gt;
        ANI 10101010B   ;maszkoljuk AAH-val&lt;br /&gt;
        ORA D       ;összevagyoljuk D-vel&lt;br /&gt;
        POP D       ;POPpolgatunk&lt;br /&gt;
        POP H&lt;br /&gt;
        RET&lt;br /&gt;
        &lt;br /&gt;
    ELO:    &lt;br /&gt;
        PUSH PSW&lt;br /&gt;
        PUSH H&lt;br /&gt;
        PUSH B&lt;br /&gt;
        PUSH A  &lt;br /&gt;
        MVI B,0H&lt;br /&gt;
        LXI D,0H&lt;br /&gt;
    FUT:&lt;br /&gt;
        MOV A,B&lt;br /&gt;
        OUT 0FFH    ;a B 0-tól FF-ig megy, ez az összes lehetséges kombináció&lt;br /&gt;
        CALL KONV   ;az A-ban a B-nek megfelelő beolvasott (átkonvertált) adat lesz&lt;br /&gt;
        MOV C,A     &lt;br /&gt;
        IN  01FH        ;beolvassuk a reg tartalmát&lt;br /&gt;
        CMP C       ;ha A=C akkor jó (C:a B konvertált alakja, A:a közvetlenül visszaolvasott alak&lt;br /&gt;
        &lt;br /&gt;
        JZ TOVABB   ;ha B=C -&amp;gt; Z=1, tehát nem kell növelni a DE-t&lt;br /&gt;
        INX D       ;ha azonban Z=0, növeljük DE-t&lt;br /&gt;
    TOVABB: INR B       &lt;br /&gt;
        MOV A,FF&lt;br /&gt;
        CMP B   &lt;br /&gt;
        JNZ FUT     ;ha B végigpörgött, tehát elérte az FF-t, akkor kilépünk&lt;br /&gt;
        POP A&lt;br /&gt;
        POP B&lt;br /&gt;
        POP H&lt;br /&gt;
        POP PSW&lt;br /&gt;
&lt;br /&gt;
=== 2. c) ===&lt;br /&gt;
&lt;br /&gt;
Írja meg a VIZS 8085 assembly szubrutint, amely az A regiszterben kapott értéket beírja a kimeneti regiszterbe, majd a kimenet értékét visszaolvassa és ellenőrzi, hogy a beérkezett karakter helyes-e? Hiba esetén a szubrutinból való visszatéréskor Z=1, különben Z=0 legyen!&lt;br /&gt;
&lt;br /&gt;
* A kimeneti egység K1…K8 jelei a 0ACh IO címen olvashatók vissza.&lt;br /&gt;
* a kimeneti regiszter (74374) a 0AAh IO címen írható&lt;br /&gt;
* A kimeneti regiszter minden második bitje (K0,K2,K4,K6) negáltan legyen kivezetve.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    VIZS:   OUT 0AAH    ;BEÍRJUK AZ A REG TARTALMÁT A KIMENETI REG-BE&lt;br /&gt;
        AND 55H     ;A KIMENET ÉRTÉKE NEM A BEÍRT A-VAL LESZ EGYENLÕ&lt;br /&gt;
        XRA FFH     ;EZÉRT MEGCSINÁLJUK SZOFTVERESEN A BYTE MINDEN MÁSODIK BITJÉNEK NEGÁLÁSÁT&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    ;példa 1:a fenti műveltre (AND 55H;XRA FFH)&lt;br /&gt;
    kiírt adat: &lt;br /&gt;
        11111111  -&amp;gt; ebből ezt kell kapnunk: 10101010&lt;br /&gt;
    AND 01010101&lt;br /&gt;
        -----------&lt;br /&gt;
        01010101&lt;br /&gt;
    XRA 11111111&lt;br /&gt;
        -----------&lt;br /&gt;
        10101010  -&amp;gt;és kész!&lt;br /&gt;
&lt;br /&gt;
    ;példa 2:&lt;br /&gt;
    kiírt adat:&lt;br /&gt;
        10111011  -&amp;gt;ez lesz belőle: 11101110&lt;br /&gt;
    AND 01010101&lt;br /&gt;
        -----------&lt;br /&gt;
        00010001&lt;br /&gt;
    XRA 11111111&lt;br /&gt;
        -----------&lt;br /&gt;
        11101110  -&amp;gt; ready!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    ;és a progi folytatása&lt;br /&gt;
        MOV B,A     ;elmentjük B-be, mert később a visszaolvasott adat alapból az A-ba kerül és felülírja ezt&lt;br /&gt;
        IN 0ACH     ;visszaolvasás&lt;br /&gt;
        CMP B       ;a szokásos vizsgálat, A-ból kivonjuk a B-t(az ellenőrző byte-ot)&lt;br /&gt;
        JNZ Z1      ;és ha az eredmény nem 0 (akkor Z=0,és hiba van), a feladata pont az ellentetjét kéri&lt;br /&gt;
        XRA A       ;ezért a Z flaget megnegáljuk az alábbi paranccsal&lt;br /&gt;
        JMP VEGE&lt;br /&gt;
    Z1: MOV A,1H&lt;br /&gt;
        ORA A       &lt;br /&gt;
    VEGE:   RET&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 2. d) ===&lt;br /&gt;
&lt;br /&gt;
Illesszen i8085-ös mikroprocesszoros rendszersínre két 8251-es soros periféria illesztő áramkört. Az „A” áramkör csak kimenetre, a „B” áramkör csak bemenetre van felprogramozva. Az „A” áramkör TxD kimenetét a „B” áramkör RxD bemenetére kell kötni. Mindkét áramkör TxC és RxC órajel bemeneteire CLK96 órajel van kötve. Inicializáláskor mindkét áramkör programozása: aszinkron üzemmód, 8 bites karakter, páros paritás és 2 stop bit. A „B” áramkör az /RST 5,5 sínen kér megszakítást. Az „A” áramkör báziscíme 0AAh, a „B” áramkör báziscíme 0AEh.&lt;br /&gt;
&lt;br /&gt;
Írja meg azt a két assembly programrészletet, amely a két 8251-est felprogramozza a fenti konfigurációnak megfelelően!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    AFELPROG:&lt;br /&gt;
        ;először a MODE INSTRUCTION-t kell kiküldeni&lt;br /&gt;
        ;kódszó: 11111101B - a alsó 2 bit értéke elvileg úgy jön ki, hogy a TxC és RxC órajeleknek 1-szeres arány kell legyen&lt;br /&gt;
        MOV A,FDH&lt;br /&gt;
        OUT 0AAH&lt;br /&gt;
        MOV A,00    000001B     ;Command Instruction&lt;br /&gt;
        OUT 0AAH        &lt;br /&gt;
        RET&lt;br /&gt;
        &lt;br /&gt;
&lt;br /&gt;
    BFELPROG:&lt;br /&gt;
        ;kódszó: ugyanaz,mint az előbb&lt;br /&gt;
        MOV A,FDH&lt;br /&gt;
        OUT 0AEH&lt;br /&gt;
        MOV A,00000000B     ;Command Instruction, B lesz a vevő&lt;br /&gt;
        OUT 0AEH    &lt;br /&gt;
        JMP 002CH&lt;br /&gt;
        RET&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 2. e) NR! ===&lt;br /&gt;
&lt;br /&gt;
Illesszen a 8085 mikroprocesszor sínrendszerére 8255-ös típusúPPIO áramkört, amely a 94H, 95H, 96H, 97H portcímeket foglalja el. A PPIO áramkör B portjára egy 8 bites párhuzamos adat kimenettel rendelkező periféria csatlakozik, (tehát a B portot bemenetként kell felprogramozni) amely hand-shaking (kézfogásosos) jelekkel ütemezi az adatátvitelt. Adat beolvasása esetén az áramkör kérjen megszakítást a CPU RST5.5 bemenetén. A periféria 8 adatvezetéken kívül az adattal egyidőben megjeleníti a PEVEN páros paritás jelet is. A PEVEN jel csak a hand-shaking folyamat közben áll rendelkezésre.&lt;br /&gt;
&lt;br /&gt;
Vegye figyelembe, hogy a megszakítási szubrutinban megvalósított adatbeolvasás időpontjában nem biztos, hogy a PEVEN paritás rendelkezésre áll, viszont a feladathoz feltétlen szükséges. Ezért javasolt a paritás jel mintavételezése (a megfelelő hand-shaking jellel) és letárolása a PPIO áramkörön kívül, majd beolvasása az A porton keresztül (pl. PA0 bemeneten) a megszakítási szubrutinban.&lt;br /&gt;
&lt;br /&gt;
* Írjon INIC55 szubrutint, amely elvégzi a PPIO áramkör fentiek szerinti inicializálást, és az SP beállítását, ha a STACK 8F00h és 8FFFh memóriatartományban van&lt;br /&gt;
* Írjon RST5.5 megszakítási szubrutint, amely beolvassa az adatot és a paritást PPIO áramkörről, ellenőrzi paritást, majd azadatot elhelyezi a 3456H című memória byte-ban, illetve paritáshiba esetén megnöveli a 3457H című memória byte tartalmát.&lt;br /&gt;
&lt;br /&gt;
    INIC55: ORG 8F00H   &lt;br /&gt;
        TER DS FF   ;STACK helyfoglalás&lt;br /&gt;
        &lt;br /&gt;
        ORG 0H&lt;br /&gt;
        ;STÁTUSZ szó: 10111111  - segédlet 95-97.oldala alapján&lt;br /&gt;
        MOV A,DFH&lt;br /&gt;
        OUT 97H&lt;br /&gt;
        &lt;br /&gt;
        IN 95H&lt;br /&gt;
        JMP 2CH &lt;br /&gt;
&lt;br /&gt;
        ORG 2CH&lt;br /&gt;
        IN 94H      ;ez itt a PEVEN jel beolvasása &lt;br /&gt;
        ANI 01H     ;a PA0 bitjét veszem a PEVEN paritás bitnek&lt;br /&gt;
        MOV D,A     ;és elmentem a D-be;ha D=0, akkor páratlan paritás,  D=1, akkor páros paritás van&lt;br /&gt;
        MVI B,0&lt;br /&gt;
        MVI C,8 &lt;br /&gt;
    PARIT:  RLC&lt;br /&gt;
        JNC TOV&lt;br /&gt;
        INR B       ;az utolsó ciklusba bekerül a beolvasott byte-ban lévő 1-esek száma&lt;br /&gt;
    TOV:    DCR C&lt;br /&gt;
        JNZ PARIT&lt;br /&gt;
        MOV A,B&lt;br /&gt;
        ANI 01H&lt;br /&gt;
        &lt;br /&gt;
        LXI H,3456H&lt;br /&gt;
        MOV M,A&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
=== 2. f.) ===&lt;br /&gt;
&lt;br /&gt;
Illesszen i8085-ös mikroprocesszoros rendszersínre egy visszaolvasható 8 bites kimeneti regisztert, mely az alábbi ábrán látható lámpa vezérlő egységet képes működtetni.&lt;br /&gt;
* a kimeneti regisztert (74374) a 20h IO címen írható és a kimeneti egység L1…L8 jelei a 20H IO címen visszaolvashatók&lt;br /&gt;
* Írja meg a CHECK 8085 assembly szubrutint, amely az A regiszterben kapott értéket beírja az előző feladatban kialakított kimeneti regiszterbe, majd a kimenet értékét visszaolvassa és ellenőrzi. Hiba esetén visszatéréskor CY=1, különben CY=0 legyen.&lt;br /&gt;
&lt;br /&gt;
    CHECK:  OUT 20H     ;kiírás a reg-be&lt;br /&gt;
        CMA     ;bitenként negálja az A-t&lt;br /&gt;
        MOV B,A     ;ezt a negált értéket beírjuk a B reg-be&lt;br /&gt;
        IN 20H      ;20H címről beolvasunk&lt;br /&gt;
        CMP B       ;szokásos ellenőrzés&lt;br /&gt;
        JZ CY0      ;ha egyenlő a B és a visszaolvasott érték, akkor Z=1 és akkor ugrunk arra a részre ahol CY:=0&lt;br /&gt;
        STC     ;ha Z=0 akkor CY-t 1-be állitjuk&lt;br /&gt;
        JMP VEGE        ;és ugrunk a végére&lt;br /&gt;
    CY0:    STC     ;CY=1&lt;br /&gt;
        CMC     ;CY-t negálja&lt;br /&gt;
    VEGE:   RET&lt;br /&gt;
&lt;br /&gt;
== 3. feladat ==&lt;br /&gt;
&lt;br /&gt;
=== 3. a) ===&lt;br /&gt;
&lt;br /&gt;
            LXI D,X     ; X ms-ban&lt;br /&gt;
            LXI B,R     ; R-ratio, szazalekban&lt;br /&gt;
        ELEJE:  LXI H,X*1000000*R/100/7040&lt;br /&gt;
            MVI A,C8H   ; 11001000B&lt;br /&gt;
            SIM&lt;br /&gt;
            CALL HUROK&lt;br /&gt;
            MVI A,48H   ; 01001000B&lt;br /&gt;
            SIM&lt;br /&gt;
            LXI H,X*1000000*(100-R)/100/7040&lt;br /&gt;
            CALL HUROK&lt;br /&gt;
            JMP ELEJE&lt;br /&gt;
&lt;br /&gt;
        HUROK:  DCX H       ; 4 fazis&lt;br /&gt;
            MOV A,H     ; 4 fazis&lt;br /&gt;
            ORA L       ; 4 fazis&lt;br /&gt;
            JNZ HUROK   ; 10 fazis, 7040 nsec&lt;br /&gt;
            RET&lt;br /&gt;
&lt;br /&gt;
=== 3. b.) === &lt;br /&gt;
&lt;br /&gt;
Írjon 8085 assembly szubrutint, amely a következő specifikáció szerint működik:&lt;br /&gt;
* A szubrutin a SID jel felfutó élére egy adatkivitelt, a lefutó élére egy adatbeolvasást végezzen a következők szerint:&lt;br /&gt;
* a szubrutin induláskor megvárja a SID jel 0=&amp;gt;1 átmenetét és a B regiszter tartalmát kiírja a 70h-es port címre,&lt;br /&gt;
* majd a SID jel 1=&amp;gt;0 átmenetére 71h port címről beolvas egy adatbájtot, amit a C regiszterbe tesz, ezután kilép a szubrutinból.&lt;br /&gt;
* A szubrutin bemenete: a kiírandó adat a B regiszterben.&lt;br /&gt;
* A szubrutin kimenete: a beolvasott adat a C regiszterben&lt;br /&gt;
* A megoldás során ügyeljen arra, hogy a szubrutin a C regiszter kivételével a regiszterek és a flag-ek értékét ne változtassa meg!&lt;br /&gt;
&lt;br /&gt;
    RUTIN:  MVI C,0H        ;ezzel a reg-gel ellenőrizzük azt, hogy a SID jel milyen értékű, az 1. részben 0-1 átmenet kell&lt;br /&gt;
        PUSH PSW    ;kimentések&lt;br /&gt;
        PUSH A&lt;br /&gt;
        PUSH B&lt;br /&gt;
    VAR1:   RIM     ;a beolvasott byte felső bitje a SID jel értékét mutatja &lt;br /&gt;
        MVI A,80H   ;maszkolás  &lt;br /&gt;
        ORA C       ;megnézzük, hogy a SID=0-e ha nem akkor ugárs VAR1-re / SID=1-re várunk&lt;br /&gt;
        JNZ VAR1&lt;br /&gt;
    VAR2:   RIM     ;itt gyakorlatilag ugyanaz van, mint az előbb, csak SID-1-re várunk&lt;br /&gt;
        MVI A,80H&lt;br /&gt;
        ORA C&lt;br /&gt;
        JZ VAR2     ;tehát ha SID=0 marad, akkor ugrunk VAR2-re / ha SID=1, akkor várunk még&lt;br /&gt;
        MOV A,0     ;itt azt nézzük, hogy az 1. részben vagyunk-e &lt;br /&gt;
        CMP C       ;ha a kivonás eredménye 0, akkor az 1. részben vagyunk és ekkor írjuk ki a B-t a 70H-ra&lt;br /&gt;
        JZ B70H     &lt;br /&gt;
        JMP C71H        ;ha a 2. részben vagyunk, akkor az előző ugró utasítás nem teljesül és ide kell ugrani&lt;br /&gt;
    CIMKE:  MOV C,01H   ;ha az 1. részben vagyunk, akkor C reg-t 1-be kell állítani, a 2. részben már nem fogunk ide ugrani&lt;br /&gt;
        JMP VAR1&lt;br /&gt;
    B70H:   MOV A,B&lt;br /&gt;
        OUT 70H&lt;br /&gt;
        JMP CIMKE&lt;br /&gt;
    C71H:   IN 71H&lt;br /&gt;
        MOV C,A &lt;br /&gt;
        POP B&lt;br /&gt;
        POP A&lt;br /&gt;
        POP PSW&lt;br /&gt;
        END&lt;br /&gt;
&lt;br /&gt;
Egy másik megoldás:&lt;br /&gt;
&lt;br /&gt;
        NULLBEOLV:  PUSH PSW&lt;br /&gt;
                RIM&lt;br /&gt;
                ANI 80H     ;10000000B&lt;br /&gt;
                JZ NULLBEOLV&lt;br /&gt;
                MOV A,B&lt;br /&gt;
                OUT 70H&lt;br /&gt;
        EGYBEOLV:   RIM&lt;br /&gt;
                ANI 80H&lt;br /&gt;
                JNZ EGYBEOLV&lt;br /&gt;
                IN 71H&lt;br /&gt;
                MOV C,A&lt;br /&gt;
                POP PSW&lt;br /&gt;
                JMP NULLBEOLV&lt;br /&gt;
&lt;br /&gt;
=== 3. c.) ===&lt;br /&gt;
Írjon 8085 assembly szubrutint, amely megvárja a SID jel változását (felfutó és lefutó él). A szubrutin kimenete:&lt;br /&gt;
* Z=1 felfutó él volt,&lt;br /&gt;
* Z=0 lefutó él volt!&lt;br /&gt;
* A szubrutin ne változtassa meg a regiszterpárok értékét!&lt;br /&gt;
&lt;br /&gt;
    RUTIN:  RIM&lt;br /&gt;
        ANI 80H     ;maszkolás, az SID értéke az A-ban lesz&lt;br /&gt;
        JZ FELFUT   ;ha az előbbi &amp;quot;és&amp;quot;-elés eredménye 0 (tehát a SID 0), akkor Z=1 -&amp;gt; ugrás a felfutójelhez&lt;br /&gt;
        JMP LEFUT   ;különben lefutó jelre várunk&lt;br /&gt;
    FELFUT: RIM&lt;br /&gt;
        ANI 80H     ;maszkolás&lt;br /&gt;
        JZ FELFUT   ;addig csináljuk amíg az eredmény 1 lesz (tehát a SID=1-re), Z=0-ra várunk&lt;br /&gt;
        XRA A       ;beállítjuk a Z-t 1-re&lt;br /&gt;
        JMP VEGE        ;ugrás végére&lt;br /&gt;
    LEFUT:  RIM&lt;br /&gt;
        ANI 80H&lt;br /&gt;
        JNZ FELFUT  ;ha Z=1, akkor az &amp;quot;és&amp;quot;-elés eredménye:0, tehát tovább kell várni a SID= 1 -&amp;gt; 0 átmenetre&lt;br /&gt;
        MOV A,FFH   &lt;br /&gt;
        ORA A       ;Z:=0&lt;br /&gt;
    VEGE:   RET&lt;br /&gt;
&lt;br /&gt;
Egy másik megoldás:&lt;br /&gt;
&lt;br /&gt;
                MVI A,0&lt;br /&gt;
                RIM&lt;br /&gt;
                ANI 80H&lt;br /&gt;
                JZ IDE&lt;br /&gt;
                MVI A,1&lt;br /&gt;
        IDE:        CALL IDERUTIN&lt;br /&gt;
                HALT&lt;br /&gt;
        IDERUTIN:   ANI FF&lt;br /&gt;
                JZ VAREGYRE&lt;br /&gt;
        VARNULLRA:  RIM&lt;br /&gt;
                ANI 80H&lt;br /&gt;
                JNZ VARNULLRA&lt;br /&gt;
                RZ&lt;br /&gt;
        VAREGYRE:   RIM&lt;br /&gt;
                ANI 80H&lt;br /&gt;
                JZ VAREGYRE&lt;br /&gt;
                RNZ&lt;br /&gt;
&lt;br /&gt;
=== 3. d.) ===&lt;br /&gt;
Írjon 8085 assembly szubrutint, amely a HL regiszterpárban kapott kezdőcímű és 32 byte hosszúságú adatblokkhoz 1 byte-os ellenőrző összeget számol ki, és elhelyezi a blokkot követő rekeszben. A szubrutin végén az akkumulátor az ellenőrző összeget tartalmazza! (A rutin bármely regiszter értékét elronthatja)!&lt;br /&gt;
&lt;br /&gt;
Az ellenőrző összeg számítási algoritmusa: X(i) mod 256   0&amp;lt;i&amp;lt;32&lt;br /&gt;
&lt;br /&gt;
    RUTIN:  MVI C,32        ;32 byte hosszúságú adatblokk&lt;br /&gt;
        XRA A       ;A:=0&lt;br /&gt;
    CIKLUS: ADD M       ;A+HL-&amp;gt; A&lt;br /&gt;
        INX H       ;forrásmutató növelése&lt;br /&gt;
        DCR C       &lt;br /&gt;
        JNZ CIKLUS  ;ha végigértünk akkor Z=1&lt;br /&gt;
        MOV M,A     ;a blokkot követő részen az ellenőrző összeg&lt;br /&gt;
        RET&lt;br /&gt;
&lt;br /&gt;
Egy másik megoldás:&lt;br /&gt;
                LXI D,0     ;reszosszeg kinullazasa&lt;br /&gt;
                LXI H, KC   ;kezdocim&lt;br /&gt;
                LXI B, 32   ;db&lt;br /&gt;
            HUROK:  MOV A,M&lt;br /&gt;
                CALL OSSZEGZO&lt;br /&gt;
                INX H&lt;br /&gt;
                DCX B&lt;br /&gt;
                MOV A,C&lt;br /&gt;
                ORA B&lt;br /&gt;
                JNZ HUROK&lt;br /&gt;
                MOV M,E     ;E-ben van a mod256 reszosszeg&lt;br /&gt;
            &lt;br /&gt;
            OSSZEGZO:&lt;br /&gt;
                PUSH H&lt;br /&gt;
                MOV L,A&lt;br /&gt;
                MVI H,0&lt;br /&gt;
                DAD D&lt;br /&gt;
                XCHG&lt;br /&gt;
                POP H&lt;br /&gt;
                RET&lt;br /&gt;
&lt;br /&gt;
=== 3. e.) ===&lt;br /&gt;
Írjon assembly programot amely kivonja két memóriában elhelyezkedő 32 szavas memóriatömbök egyes szavait és az eredményeket visszahelyezi egy újabb memóriaterületre! A 2 byte-os szavak felső 8 bitjét a kisebb című (páros) byte, az alsó 8 bitet a következő (páratlan) cím tárolja!&lt;br /&gt;
    (9000H,9001H) = (9100H,9101H) - (9200H,9201H) ... stb.&lt;br /&gt;
* Írja meg a kivonó programot!&lt;br /&gt;
* A kivonások elvégzése után a 9000H-n kezdődő 32 szavas memória terület után helyezzen el egy olyan byte-ot, amely megadja, hogy a 32 eredmény szó közül mennyi a pozitív szám feltételezve, hogy az operandusok (és az eredmény) 16 bites kettes komplemens kódban van ábrázolva. &lt;br /&gt;
&lt;br /&gt;
        LXI B,9000H&lt;br /&gt;
        LXI D,9101H&lt;br /&gt;
        LXI H,9201H&lt;br /&gt;
        MVI E,32H   ;2*32 szót vonunk ki egymásból  &lt;br /&gt;
    KIVON:  STC     ;CY:=1&lt;br /&gt;
        CMC     ;CY:=/CY -&amp;gt; CY:=0&lt;br /&gt;
        LDAX A,D        ;9101H-n található adatot betölti az A-ba&lt;br /&gt;
        SBB M       ;A-(HL által mutatott címen levő adat)-CY , ha van átvitel akkor CY=1 lesz&lt;br /&gt;
        STAX B      ;B által mutatott címre A tartalmát helyezi&lt;br /&gt;
        DCX B       &lt;br /&gt;
        DCX D&lt;br /&gt;
        DCX H&lt;br /&gt;
        LDAX A,D        ;9100H-n található adat megy az A-ba&lt;br /&gt;
        SBB M       ;A-M-CY&lt;br /&gt;
        STAX B      ;9000H-n a kivonás eredménye (2 byte-on)&lt;br /&gt;
        INX H&lt;br /&gt;
        INX H&lt;br /&gt;
        INX D&lt;br /&gt;
        INX D&lt;br /&gt;
        INX B&lt;br /&gt;
        INX B&lt;br /&gt;
        DCR E&lt;br /&gt;
        JNZ KIVON&lt;br /&gt;
        MVI E,32H   ;32 szavat vizsgálunk meg&lt;br /&gt;
        MVI D,0H        ;a pozitív számok számát ebben tároljuk &lt;br /&gt;
    SZAMOL: LXI B,9000H &lt;br /&gt;
        ANI 80H     ;ha a MSB (legfelső bit)=1 akkor a szám negatív&lt;br /&gt;
        JZ TOVABB   ;ha szám negatív, akkor Z=1 és nem kell növelni&lt;br /&gt;
        INR D   &lt;br /&gt;
    TOVABB: INX H       &lt;br /&gt;
        INX H&lt;br /&gt;
        DCR E       &lt;br /&gt;
        JNZ SZAMOL&lt;br /&gt;
        END&lt;br /&gt;
&lt;br /&gt;
Egy másik megoldás:&lt;br /&gt;
            XPOINTER EQU 9080H&lt;br /&gt;
            YPOINTER EQU 9082H&lt;br /&gt;
            ZPOINTER EQU 9084H  ;ideiglenes regiszterpárok, KIHASZNÁLATLAn ramterület, senkit nem zavar&lt;br /&gt;
            X EQU 9100H&lt;br /&gt;
            Y EQU 9200H&lt;br /&gt;
            Z EQU 9000H&lt;br /&gt;
 &lt;br /&gt;
            LXI H,X         ;ebbol&lt;br /&gt;
            SHLD XPOINTER&lt;br /&gt;
            LXI H,Y         ;ezt&lt;br /&gt;
            SHLD YPOINTER&lt;br /&gt;
            LXI H,Z         ;ide(eredmény)&lt;br /&gt;
            SHLD ZPOINTER&lt;br /&gt;
             &lt;br /&gt;
        CIKLUS: CALL CIKLUSMAG&lt;br /&gt;
            LXI B, X+32*2&lt;br /&gt;
            LHLD XPOINTER&lt;br /&gt;
            MOV A,H&lt;br /&gt;
            CMP B&lt;br /&gt;
            JNZ CIKLUS&lt;br /&gt;
            MOV A,L&lt;br /&gt;
            CMP C&lt;br /&gt;
            JNZ CIKLUS&lt;br /&gt;
            HALT&lt;br /&gt;
 &lt;br /&gt;
        CIKLUSMAG:&lt;br /&gt;
            LHLD XPOINTER       ;H=91,L=00&lt;br /&gt;
            MOV D,M&lt;br /&gt;
            INX H&lt;br /&gt;
            MOV E,M         ;DE=ebbol&lt;br /&gt;
            INX H&lt;br /&gt;
            SHLD XPOINTER&lt;br /&gt;
            LHLD YPOINTER&lt;br /&gt;
            MOV A,M&lt;br /&gt;
            CMA&lt;br /&gt;
            MOV B,A&lt;br /&gt;
            INX H&lt;br /&gt;
            MOV A,M&lt;br /&gt;
            CMA&lt;br /&gt;
            MOV C,A&lt;br /&gt;
            INX B           ;BC-ben kivonando kettes komplemense(-1szerese)         &lt;br /&gt;
            INX H           &lt;br /&gt;
            SHLD YPOINTER&lt;br /&gt;
            XCHG            ;HL-ben ebbol&lt;br /&gt;
            DAD B&lt;br /&gt;
            XCHG            ;DE-ben eredmeny&lt;br /&gt;
            LHLD ZPOINTER&lt;br /&gt;
            MOV M,D&lt;br /&gt;
            INX H&lt;br /&gt;
            MOV M,E&lt;br /&gt;
            INX H&lt;br /&gt;
            SHLD ZPOINTER&lt;br /&gt;
            RET&lt;br /&gt;
&lt;br /&gt;
=== 3. f.) ===&lt;br /&gt;
Írjon assembly szubrutint amely kivonja két, a memóriában elhelyezkedő 64 byte-os memóriatömb egyes byte-jait és az eredményeket visszahelyezi az első operandus helyére! Az operandusok kezdőcímeit a szubrutin a HL és DE regiszterpárokban kapja. A kivonások elvégzése után a rutin az BC regiszter-párban kapott címtől kezdődően helyezzen el egy olyan byte-ot, amely megadja, hogy a 64 eredmény byte közül mennyi a pozitív szám (&amp;gt;0), egy másik byte-ot, hogy mennyi a negatív szám (&amp;lt;0), és egy harmadik byte-ot, hogy hány érték volt 0 (=0). (Az operandusok és az eredmény 8 bites kettes komplemens kódban vannak ábrázolva.)&lt;br /&gt;
* Írja meg a szubrutint!&lt;br /&gt;
* Írja meg azt a programrészletet, amely meghívja a szubrutint a HL=8000h, DE=8800h és BC=9000h paraméterekkel, majd ellenőrzi, hogy a 9000h címtől kezdődő 3 byte összege valóban 64.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    RUTIN:  PUSH B      ;kimentjük BC-t,mert a számlálónak a B-t használjuk fel&lt;br /&gt;
        PUSH H      ;a későbbi vizsgálat során az eredeti címtől indulunk, így ezt is kimentjük&lt;br /&gt;
        MVI B,64        &lt;br /&gt;
        XCHG        ;HL és DE felcserélése&lt;br /&gt;
    KIVON:  LDAX D      ;az A-ba betölti a DE (eredetileg HL) által mutatott címen lévő adatot&lt;br /&gt;
        SUB M       ;így DE-ből kivonjuk a HL-t&lt;br /&gt;
        STAX D      ;DE által mutatott címre visszahelyezzük az eredményt&lt;br /&gt;
        INX D       &lt;br /&gt;
        INX H&lt;br /&gt;
        DCR B       &lt;br /&gt;
        JNZ KIVON   ;ha végigértünk a 64 byte-on, akkor Z=1 lesz&lt;br /&gt;
        XCHG        ;HL és DE visszacserélése&lt;br /&gt;
        &lt;br /&gt;
        POP B&lt;br /&gt;
        POP H&lt;br /&gt;
        PUSH H      &lt;br /&gt;
        MVI D,0     &lt;br /&gt;
        MVI E,64&lt;br /&gt;
    POZ:    MOV A,M     ;A-ban a HL által mutatott címen lévő byte&lt;br /&gt;
        ANI 80H     ;maszkolás az előjel bitre&lt;br /&gt;
        JNZ PT      ;ha az előjel bit=1, akkor Z=0 és akkor negatív, így kihagyjuk a D növelését&lt;br /&gt;
        INR D       ;ha Z=1, akkor a szám pozitív és növeljük D-t&lt;br /&gt;
    PT: DCR E       &lt;br /&gt;
        JNZ POZ     ;amíg végig nem értünk Z=0&lt;br /&gt;
        MOV A,D     ;D-ben van a pozitív számok darabszáma&lt;br /&gt;
        STAX B      ;B címére elhelyezzük a darabszámot&lt;br /&gt;
        INX B       ;a B következő címére kerül a negatív számok darabszáma&lt;br /&gt;
&lt;br /&gt;
    ;pepita...&lt;br /&gt;
        POP H       &lt;br /&gt;
        PUSH H&lt;br /&gt;
        MVI D,0&lt;br /&gt;
        MVI E,64    &lt;br /&gt;
    NEG:    MOV A,M&lt;br /&gt;
        ANI 80H&lt;br /&gt;
        JZ NT&lt;br /&gt;
        INR D&lt;br /&gt;
    NT: DCR E&lt;br /&gt;
        JNZ NEG&lt;br /&gt;
        MOV A,D&lt;br /&gt;
        STAX B&lt;br /&gt;
        INX B       ;a B következő címére kerül a 0 értékű számok darabszáma&lt;br /&gt;
        &lt;br /&gt;
    ;0-k száma, pepita&lt;br /&gt;
        POP H&lt;br /&gt;
        MVI D,0&lt;br /&gt;
        MVI E,64&lt;br /&gt;
    NULL:   MOV A,M&lt;br /&gt;
        ORA 00H     ;egyedül itt van különbség, ha byte csupa 0, csak akkor lesz ORA 0H = 0-val és ezzel együtt Z=1&lt;br /&gt;
        JNZ NULT&lt;br /&gt;
        INR D&lt;br /&gt;
    NULT:   DCR E&lt;br /&gt;
        JNZ NEG&lt;br /&gt;
        MOV A,D&lt;br /&gt;
        STAX B&lt;br /&gt;
        RET&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Írja meg azt a programrészletet, amely meghívja a szubrutint a HL=8000h, DE=8800h és BC=9000h paraméterekkel, majd ellenőrzi, hogy a 9000h címtől kezdődő 3 byte összege valóban 64.  &lt;br /&gt;
        &lt;br /&gt;
        LXI H,8000H&lt;br /&gt;
        LXI D,8800H&lt;br /&gt;
        LXI B,9000H&lt;br /&gt;
        CALL RUTIN&lt;br /&gt;
        MOV C,0&lt;br /&gt;
        MOV D,3&lt;br /&gt;
        STC&lt;br /&gt;
        CMC&lt;br /&gt;
    ELL:    LDAX B&lt;br /&gt;
        ADC C&lt;br /&gt;
        MOV C,A&lt;br /&gt;
        DCR D&lt;br /&gt;
        JNZ ELL&lt;br /&gt;
        MOV A,64&lt;br /&gt;
        CMP C&lt;br /&gt;
        JZ JO&lt;br /&gt;
        STC     ;ezt itt a feladat nem kéri, de utólag vhogy el kell tudni dönteni, hogy az összeg valóban 64-e&lt;br /&gt;
        CMC     ;ezért ha nem jó akkor CY flag értéke 0 lesz, jó összeg esetén 1&lt;br /&gt;
        JMP VEGE        &lt;br /&gt;
    JO:     STC&lt;br /&gt;
    VEGE:   END&lt;br /&gt;
&lt;br /&gt;
Egy másik megoldás:&lt;br /&gt;
&lt;br /&gt;
        KISERED EQU 8000H&lt;br /&gt;
        KIVONANDO EQU 8800H&lt;br /&gt;
        ELOJEL EQU 9000H            &lt;br /&gt;
 &lt;br /&gt;
        LXI H,KISERED&lt;br /&gt;
        LXI D,KIVONANDO&lt;br /&gt;
                    ;LXI B,ELOJEL ;ELOJEL=POZITÍVAK, ELOJEL+1=negatívak, ELOJEL+2=nullák&lt;br /&gt;
        &lt;br /&gt;
    CIKLUS: MOV A,M&lt;br /&gt;
        PUSH PSW&lt;br /&gt;
        LDAX D&lt;br /&gt;
        MOV B,A&lt;br /&gt;
        POP PSW&lt;br /&gt;
        SUB B           ;AKKUMULÁTORBAN EREDMÉNY&lt;br /&gt;
        MOV M,A&lt;br /&gt;
        JZ NULL&lt;br /&gt;
        JP POZ&lt;br /&gt;
        PUSH H          ;(NEGATÍV ÁG)   &lt;br /&gt;
        LHLD ELOJEL+1&lt;br /&gt;
        INX H&lt;br /&gt;
        SHLD ELOJEL+1&lt;br /&gt;
        POP H&lt;br /&gt;
        JMP ELLEN&lt;br /&gt;
    NULL:   PUSH H          ;(0 ÁG) &lt;br /&gt;
        LHLD ELOJEL+2&lt;br /&gt;
        INX H&lt;br /&gt;
        SHLD ELOJEL+2&lt;br /&gt;
        POP H&lt;br /&gt;
        JMP ELLEN       &lt;br /&gt;
    POZ:    PUSH H          ;(POZITÍV ÁG)   &lt;br /&gt;
        LHLD ELOJEL&lt;br /&gt;
        INX H&lt;br /&gt;
        SHLD ELOJEL&lt;br /&gt;
        POP H&lt;br /&gt;
    ELLEN:  INX H&lt;br /&gt;
        INX D&lt;br /&gt;
        LXI B,KISERED+64&lt;br /&gt;
        MOV A,H&lt;br /&gt;
        CMP B&lt;br /&gt;
        JNZ CIKLUS&lt;br /&gt;
        MOV A,L&lt;br /&gt;
        CMP C&lt;br /&gt;
        JNZ CIKLUS&lt;br /&gt;
        LXI B,ELOJEL&lt;br /&gt;
 &lt;br /&gt;
        LXI H,ELOJEL&lt;br /&gt;
        MOV A,M&lt;br /&gt;
        INX H&lt;br /&gt;
        ADD M&lt;br /&gt;
        INX H&lt;br /&gt;
        ADD M&lt;br /&gt;
        CPI 64&lt;br /&gt;
        JZ JO&lt;br /&gt;
    NEMJO:  NOP         ;NEM JO!!!!!!!!!!&lt;br /&gt;
    JO: HALT&lt;br /&gt;
&lt;br /&gt;
=== 3. g.) ===&lt;br /&gt;
Írjon assembly szubrutint, amely a HL regiszterpárban kapott címen elhelyezkedő 00h végjelre végződő&lt;br /&gt;
karakterstringben megkeresi az első &#039;1&#039; számjegyet. (az ’1’ számjegy ASCII kódja 31h). Találat esetén a szubrutinból visszatéréskor a HL regiszterpár mutasson a megtalált karakter címére és CY = 0 legyen. Ha a keresett karakter nem található, akkor a szubrutin CY=1 értékkel térjen vissza. (Ilyenkor a HL regiszterpár a 00h végjelre mutasson.&lt;br /&gt;
&lt;br /&gt;
    RUTIN:  MVI B,00H&lt;br /&gt;
    KERES:  MVI A,31H&lt;br /&gt;
        CMP M       ;megnézzük, hogy a HL által mutatott címen lévő adat 31H-e&lt;br /&gt;
        JNZ TOV     &lt;br /&gt;
        JMP VEGT        ;ha megtaláltuk az &#039;1&#039; számjegyet, akkor Z=1 és ugrunk a VEGT (VÉGe és Találtunk)&lt;br /&gt;
 &lt;br /&gt;
    TOV:    MOV A,B     ;00 végjel figyelésére szolgál&lt;br /&gt;
        CMP M       ;ha HL által mutatott címen 00H található, akkor és csak akkor a kivonás eredménye 0 (Z=1)&lt;br /&gt;
        JZ VEGNT        ;ugrás a VÉGe és Nem Találtunk részre&lt;br /&gt;
        INX H       ;mutató növelése&lt;br /&gt;
        JMP KERES   &lt;br /&gt;
 &lt;br /&gt;
    VEGT:   STC     ;a HL címe ekkor automatikusan a keresett karakterre mutat, így csak a CY flaget kell állítani&lt;br /&gt;
        CMC     &lt;br /&gt;
        JMP VEGE&lt;br /&gt;
 &lt;br /&gt;
    VEGNT:  STC     ;itt is a megfelelő helyre mutat a HL, így csak CY:=1-t állítunk&lt;br /&gt;
         &lt;br /&gt;
    VEGE:   RET&lt;br /&gt;
&lt;br /&gt;
Egy másik megoldás:&lt;br /&gt;
        KC EQU 9100H        ;egyéni&lt;br /&gt;
        &lt;br /&gt;
    CIKLUS: MOV A,M&lt;br /&gt;
        CPI 31H&lt;br /&gt;
        JZ TALALT&lt;br /&gt;
        CPI 0&lt;br /&gt;
        JZ NULLTALALT           &lt;br /&gt;
        INX H&lt;br /&gt;
        JMP CIKLUS&lt;br /&gt;
    TALALT: STC&lt;br /&gt;
        CMC&lt;br /&gt;
        JMP VEGE&lt;br /&gt;
    NULLTALALT: STC&lt;br /&gt;
    VEGE:   HALT&lt;br /&gt;
&lt;br /&gt;
=== 3. h.) ===&lt;br /&gt;
Írjon assembly szubrutint, amely a HL regiszterpárban kapott címtől kezdődően átmásol 32 bájtot a DE regiszterpárban megadott kezdőcímen kezdődő memóriaterületre. A megoldás során ügyeljen arra, hogy a rutin ne változtassa meg a flag-ek állapotát és a BC regiszterpár értékét!&lt;br /&gt;
&lt;br /&gt;
Írjon assembly programrészletet, amely SID=1 esetén várakozzon SID=0-ra, majd SID=0 esetén a fenti szubrutin&lt;br /&gt;
meghívásával másoljon át 32 bájtot a 9000h memóriacímről a 9150h címre.&lt;br /&gt;
&lt;br /&gt;
    RUTIN:  PUSH PSW&lt;br /&gt;
        PUSH B&lt;br /&gt;
        &lt;br /&gt;
        MVI B,32&lt;br /&gt;
    MASOL:  XCHG        ;DE felcserélése HL-lel&lt;br /&gt;
        LDAX D      ;DE (=eredetileg HL) beírása az A-ba&lt;br /&gt;
        XCHG        ;visszacsere&lt;br /&gt;
        STAX D      ;beírjuk A-t az eredeti DE által mutatott címre&lt;br /&gt;
        INX H&lt;br /&gt;
        INX D&lt;br /&gt;
        DCR B   &lt;br /&gt;
        JNZ MASOL&lt;br /&gt;
        POP PSW&lt;br /&gt;
        POP B&lt;br /&gt;
        RET&lt;br /&gt;
&lt;br /&gt;
    ;programrészlet:&lt;br /&gt;
    VAR:    RIM&lt;br /&gt;
        ANI 80H&lt;br /&gt;
        JNZ VAR&lt;br /&gt;
        LXI H,9000H&lt;br /&gt;
        LXI D,9150H&lt;br /&gt;
        CALL RUTIN&lt;br /&gt;
        END&lt;br /&gt;
&lt;br /&gt;
Egy másik megoldás:&lt;br /&gt;
     VAR:    RIM&lt;br /&gt;
        ANI 80H     ;10000000B&lt;br /&gt;
        JNZ VAR&lt;br /&gt;
        LXI H,9000H&lt;br /&gt;
        LXI D,9150H&lt;br /&gt;
        CALL MASOL&lt;br /&gt;
        HALT&lt;br /&gt;
&lt;br /&gt;
            ;HL-ben és DE-ben már megvan a kezdõcímünk..&lt;br /&gt;
    &lt;br /&gt;
    MASOL:  PUSH PSW&lt;br /&gt;
        PUSH B&lt;br /&gt;
        LXI B,32&lt;br /&gt;
    CIKLUS: MOV A,M&lt;br /&gt;
        STAX D&lt;br /&gt;
        INX H&lt;br /&gt;
        INX D   &lt;br /&gt;
        DCX B&lt;br /&gt;
        MOV A,C&lt;br /&gt;
        ORA B&lt;br /&gt;
        JNZ CIKLUS&lt;br /&gt;
        POP B&lt;br /&gt;
        POP PSW&lt;br /&gt;
        RET&lt;br /&gt;
&lt;br /&gt;
=== 3. i.) ===&lt;br /&gt;
&lt;br /&gt;
Írjon assembly szubrutint, amely a DE regiszterpárban kapott címtől kezdődő 16 bájtot a blokk végétől kezdve visszafelé átmásol a HL regiszterpárban megadott címen kezdődő memóriaterületre (A forrás-blokk utolsó byte-ja van a cél-blokk első helyén). A megoldás során ügyeljen arra, hogy a rutin ne változtassa meg a flag-ek állapotát és a regiszterpárok értékét!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    RUTIN:  PUSH PSW&lt;br /&gt;
        PUSH B&lt;br /&gt;
        PUSH D&lt;br /&gt;
        PUSH H&lt;br /&gt;
        MVI B,16&lt;br /&gt;
    ;a DE-t megnöveljük 16-tal&lt;br /&gt;
    DENOV:  INX D&lt;br /&gt;
        DCR B&lt;br /&gt;
        JNZ DENOV   &lt;br /&gt;
        MVI B,16&lt;br /&gt;
    MASOL:  LDAX D&lt;br /&gt;
        XCHG&lt;br /&gt;
        STAX D&lt;br /&gt;
        XCHG&lt;br /&gt;
        INX H&lt;br /&gt;
        DCX D&lt;br /&gt;
        DCR B&lt;br /&gt;
        JNZ MASOL&lt;br /&gt;
        POP H&lt;br /&gt;
        POP D&lt;br /&gt;
        POP B&lt;br /&gt;
        POP PSW&lt;br /&gt;
        RET&lt;br /&gt;
&lt;br /&gt;
Egy másik megoldás:&lt;br /&gt;
        PUSH PSW&lt;br /&gt;
        PUSH B&lt;br /&gt;
        PUSH D&lt;br /&gt;
        PUSH H&lt;br /&gt;
        &lt;br /&gt;
        PUSH H&lt;br /&gt;
        LXI B,16&lt;br /&gt;
        DAD B&lt;br /&gt;
        MOV B,H&lt;br /&gt;
        MOV C,L&lt;br /&gt;
        XCHG&lt;br /&gt;
        LXI D,15&lt;br /&gt;
        DAD D&lt;br /&gt;
        XCHG&lt;br /&gt;
        POP H&lt;br /&gt;
        &lt;br /&gt;
    CIKLUS: LDAX D&lt;br /&gt;
        MOV M,A&lt;br /&gt;
        INX H&lt;br /&gt;
        DCX D&lt;br /&gt;
        MOV A,H&lt;br /&gt;
        CMP B&lt;br /&gt;
        JNZ CIKLUS&lt;br /&gt;
        MOV A,L&lt;br /&gt;
        CMP C&lt;br /&gt;
        JNZ CIKLUS&lt;br /&gt;
        &lt;br /&gt;
        POP H&lt;br /&gt;
        POP D&lt;br /&gt;
        POP B&lt;br /&gt;
        POP PSW&lt;br /&gt;
&lt;br /&gt;
=== 3. j.) ===&lt;br /&gt;
Írjon assembly szubrutint, amely a DE regiszterpárban kapott címtől kezdődő 16 bájtban megszámolja a negatív&lt;br /&gt;
számokat (feltételezve, hogy az adatok 8 bites kettes komplemensben ábrázolt előjeles számok), és a kapott eredményt elhelyezi a 8000h memória rekeszbe. A megoldás során ügyeljen arra, hogy a rutin ne változtassa meg a flag-ek állapotát és a regiszterpárok értékét!   &lt;br /&gt;
&lt;br /&gt;
    RUTIN:  PUSH PSW&lt;br /&gt;
        PUSH B&lt;br /&gt;
        PUSH D&lt;br /&gt;
        MVI B,16&lt;br /&gt;
        MVI C,0 &lt;br /&gt;
    SZAMOL: LDAX D&lt;br /&gt;
        ANI 80H&lt;br /&gt;
        JZ NEMNEG&lt;br /&gt;
        INR C       ;ha Z=0, akkor negatív a számunk, ekkor növelünk&lt;br /&gt;
    NEMNEG: DCR B&lt;br /&gt;
        JNZ SZAMOL&lt;br /&gt;
        MOV A,C&lt;br /&gt;
        STA 8000H&lt;br /&gt;
        POP D&lt;br /&gt;
        POP B&lt;br /&gt;
        POP PSW&lt;br /&gt;
        RET&lt;br /&gt;
&lt;br /&gt;
Egy másik megoldás:&lt;br /&gt;
&lt;br /&gt;
        PUSH PSW&lt;br /&gt;
        PUSH B&lt;br /&gt;
        PUSH D&lt;br /&gt;
        PUSH H&lt;br /&gt;
 &lt;br /&gt;
        LXI H,8000H&lt;br /&gt;
        MVI M,0&lt;br /&gt;
        MVI B,0&lt;br /&gt;
    CIKLUS: LDAX D&lt;br /&gt;
        ANI 80H&lt;br /&gt;
        CMP D       ;FELESLEGES&lt;br /&gt;
        JZ POZITIV&lt;br /&gt;
        INR M&lt;br /&gt;
    POZITIV:INX D&lt;br /&gt;
        INR B&lt;br /&gt;
        MOV A,B&lt;br /&gt;
        CPI 16&lt;br /&gt;
        JNZ CIKLUS&lt;br /&gt;
 &lt;br /&gt;
        POP H&lt;br /&gt;
        POP D&lt;br /&gt;
        POP B&lt;br /&gt;
        POP PSW&lt;br /&gt;
        HALT&lt;br /&gt;
&lt;br /&gt;
=== 3. k.) ===&lt;br /&gt;
Írjon assembly szubrutint, amely a HL regiszterpárban kapott címtől kezdődő 254 byte-os adatblokk végére kiszámít egy 2 byte-os ellenőrző szót (a blokk byte-jainak összeadásával), és elhelyezi az adatokat követően. A megoldás során ügyeljen arra, hogy a rutin ne változtassa meg a flag-ek állapotát és a regiszterpárok értékét!&lt;br /&gt;
&lt;br /&gt;
    RUTIN:  PUSH PSW&lt;br /&gt;
        PUSH B&lt;br /&gt;
        PUSH H&lt;br /&gt;
        PUSH D&lt;br /&gt;
        &lt;br /&gt;
        MVI B,254&lt;br /&gt;
        LXI D,0&lt;br /&gt;
        MVI A,0&lt;br /&gt;
    ELL:    PUSH H  &lt;br /&gt;
        MOV A,M     ;HL által mutatott címen lévő adat betöltése A-ba&lt;br /&gt;
        MOV L,A     ;a címen lévő adat, így már a címmutató regiszter alsó részén van (itt elfér nem kell hozzá a H reg)&lt;br /&gt;
        DAD D       ;HL+D -&amp;gt; HL&lt;br /&gt;
        XCHG        ;HL cseréje DE-vel (így DE-ben van az ellenőrző összeg)&lt;br /&gt;
        POP H       &lt;br /&gt;
        INX H       ;cím növelése&lt;br /&gt;
        DCR B&lt;br /&gt;
        JNZ ELL     ;amíg végig nem értünk&lt;br /&gt;
        MOV M,D     ;D betöltése a HL címre&lt;br /&gt;
        INX H&lt;br /&gt;
        MOV M,E     ;a következő byte-ra pedig az E kerül&lt;br /&gt;
            &lt;br /&gt;
        POP D&lt;br /&gt;
        POP H&lt;br /&gt;
        POP B&lt;br /&gt;
        POP PSW&lt;br /&gt;
        RET&lt;br /&gt;
&lt;br /&gt;
Egy másik megoldás:&lt;br /&gt;
&lt;br /&gt;
     PUSH PSW&lt;br /&gt;
     PUSH B&lt;br /&gt;
     PUSH D&lt;br /&gt;
     PUSH H&lt;br /&gt;
     &lt;br /&gt;
     XCHG            ;DE-ben kezdocim&lt;br /&gt;
     LXI H,0         ;reszosszeg HL-ben&lt;br /&gt;
     MVI A,0         ;itt számoljuk a 254 db-ot&lt;br /&gt;
 CIKLUS: PUSH PSW&lt;br /&gt;
     LDAX D&lt;br /&gt;
     MVI B,0&lt;br /&gt;
     MOV C,A&lt;br /&gt;
     DAD B&lt;br /&gt;
     INX D&lt;br /&gt;
     POP PSW&lt;br /&gt;
     INR A&lt;br /&gt;
     CPI 254&lt;br /&gt;
     JNZ CIKLUS&lt;br /&gt;
     MOV A,L&lt;br /&gt;
     STAX D&lt;br /&gt;
     INX D&lt;br /&gt;
     MOV A,H&lt;br /&gt;
     STAX D&lt;br /&gt;
     &lt;br /&gt;
     POP H&lt;br /&gt;
     POP D&lt;br /&gt;
     POP B&lt;br /&gt;
     POP PSW&lt;br /&gt;
&lt;br /&gt;
=== 3. l.) ===&lt;br /&gt;
Írjon assembly szubrutint, amely 15 byte adatot és egy byte ellenőrző karaktert tartalmazó üzenet átvitelét ellenőrzi. A szubrutin bemenete az üzenet kezdőcíme (HL-ben), kimenete legyen hibátlan átvitel esetén Z=1, hibás átvitelkor Z=0. A megoldás során ügyeljen arra, hogy a rutin ne változtassa meg a regiszterpárok (BC,DE,HL) értékét!&lt;br /&gt;
&lt;br /&gt;
    RUTIN:  PUSH B&lt;br /&gt;
        PUSH H&lt;br /&gt;
        PUSH D&lt;br /&gt;
        PUSH H&lt;br /&gt;
        XCHG        ;HL és DE cseréje&lt;br /&gt;
        MVI H,16        ;16 byte másolására fog sorra kerülni&lt;br /&gt;
        LXI B,0     ;ahova másolunk, az a 0-s címen található (feltesszük, hogy a HL címe és ez nem lapolódik össze)&lt;br /&gt;
        PUSH B&lt;br /&gt;
    MASOL:  LDAX D      ;DE által mutatot cím tartalma az A-ban lesz&lt;br /&gt;
        STAX B      ;az A tartalma a BC címre kiíródik&lt;br /&gt;
        INX D&lt;br /&gt;
        INX B&lt;br /&gt;
        DCR H&lt;br /&gt;
        JNZ MASOL&lt;br /&gt;
        &lt;br /&gt;
        POP B       ;a BC-t visszacsökkentjük az eredetire&lt;br /&gt;
        MVI D,16&lt;br /&gt;
    ELL:    LDAX B      ;a BC-n és HL-n található byte-okat kivonogatjuk egymásból&lt;br /&gt;
        SUB M&lt;br /&gt;
        JZ HIBA     ;ha a kivonás eredménye 1, akkor hiba van&lt;br /&gt;
        DCR D   &lt;br /&gt;
        JNZ ELL &lt;br /&gt;
    NOHIBA: XRA A       ;Z-t 1-be állítjuk&lt;br /&gt;
        JMP VEGE        ;és átugorjuk a HIBA részt&lt;br /&gt;
    HIBA:   MOV A,FFH&lt;br /&gt;
        ORA A       ;ezzel a Z-t 0-ba állítottuk&lt;br /&gt;
    VEGE:   POP D&lt;br /&gt;
        POP H&lt;br /&gt;
        POP B&lt;br /&gt;
        RET&lt;br /&gt;
&lt;br /&gt;
Egy másik megoldás:&lt;br /&gt;
&lt;br /&gt;
 RUTIN:&lt;br /&gt;
     PUSH B&lt;br /&gt;
     PUSH D&lt;br /&gt;
     PUSH H          &lt;br /&gt;
     &lt;br /&gt;
     XCHG&lt;br /&gt;
     LXI H,0&lt;br /&gt;
     MVI A,0&lt;br /&gt;
 CIKLUS: PUSH PSW&lt;br /&gt;
     LDAX D&lt;br /&gt;
     MVI B,0 &lt;br /&gt;
     MOV C,A&lt;br /&gt;
     DAD B&lt;br /&gt;
     INX D&lt;br /&gt;
     POP PSW&lt;br /&gt;
     INR A&lt;br /&gt;
     CPI 15&lt;br /&gt;
     JNZ CIKLUS&lt;br /&gt;
     LDAX D&lt;br /&gt;
     CMP L       ;BE VAN ALLITVA A Z FLAG&lt;br /&gt;
 &lt;br /&gt;
     POP H&lt;br /&gt;
     POP D&lt;br /&gt;
     POP B&lt;br /&gt;
 &lt;br /&gt;
     RET&lt;br /&gt;
&lt;br /&gt;
=== 3. m.) ===&lt;br /&gt;
&lt;br /&gt;
Írjon Intel 8085 mikroprocesszor assembly nyelvén a PORTOLV szubrutint, amely a a CPU SID jelének 0 -&amp;gt; 1 átmenetére beolvassa 64H I/O című portot és az adatot az akkumulátorban adja vissza a szubrutint meghívó&lt;br /&gt;
programrésznek.&lt;br /&gt;
&lt;br /&gt;
Írjon a OLV32 szubrutint, amely a PORTOLV szubrutin felhasználásával beolvas 32 byte-ot és elhelyezi a memória 2000H-201FH memóriatartományában. Az OLV32 szubrutin változatlan tartalommal adja vissza a meghívó&lt;br /&gt;
programnak a CPU regisztereket.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    PORTOLV:&lt;br /&gt;
    VAR1:   RIM&lt;br /&gt;
        ANI 80H&lt;br /&gt;
        JNZ VAR1        ;ha SID=0, akkor Z=1 lesz és akkor mehetünk tovább&lt;br /&gt;
    VAR2:   RIM&lt;br /&gt;
        ANI 80H&lt;br /&gt;
        JZ VAR2     ;megvárjuk, míg SID=1 lesz  &lt;br /&gt;
        IN 64H&lt;br /&gt;
        RET&lt;br /&gt;
&lt;br /&gt;
    OLV32:  PUSH PSW&lt;br /&gt;
        PUSH B&lt;br /&gt;
        PUSH D&lt;br /&gt;
        LXI B,2000H&lt;br /&gt;
        MVI D,32&lt;br /&gt;
    MASOL:  CALL PORTOLV&lt;br /&gt;
        STAX B&lt;br /&gt;
        INX B&lt;br /&gt;
        DCR D&lt;br /&gt;
        JNZ MASOL&lt;br /&gt;
        &lt;br /&gt;
        POP D&lt;br /&gt;
        POP B&lt;br /&gt;
        POP PSW&lt;br /&gt;
        RET&lt;br /&gt;
&lt;br /&gt;
Egy másik megoldás:&lt;br /&gt;
     &lt;br /&gt;
 PORTOLV:&lt;br /&gt;
     RIM&lt;br /&gt;
     ANI 80H&lt;br /&gt;
     JZ PORTOLV&lt;br /&gt;
     IN 64H&lt;br /&gt;
     RET&lt;br /&gt;
 &lt;br /&gt;
 OLV32:&lt;br /&gt;
     PUSH PSW&lt;br /&gt;
     PUSH B&lt;br /&gt;
     PUSH D&lt;br /&gt;
     PUSH H&lt;br /&gt;
     &lt;br /&gt;
     KC EQU 2000H&lt;br /&gt;
     VC EQU 201FH&lt;br /&gt;
     LXI H,KC&lt;br /&gt;
     LXI D,VC+1&lt;br /&gt;
 CIKLUS: &lt;br /&gt;
     CALL PORTOLV&lt;br /&gt;
     MOV M,A&lt;br /&gt;
     INX H&lt;br /&gt;
     MOV A,L&lt;br /&gt;
     CMP E&lt;br /&gt;
     JNZ CIKLUS&lt;br /&gt;
     MOV A,H&lt;br /&gt;
     CMP D&lt;br /&gt;
     JNZ CIKLUS&lt;br /&gt;
     &lt;br /&gt;
     POP H&lt;br /&gt;
     POP D&lt;br /&gt;
     POP B&lt;br /&gt;
     POP PSW&lt;br /&gt;
     RET&lt;br /&gt;
&lt;br /&gt;
=== 3. n.) ===&lt;br /&gt;
Írja meg a SENDBYTE 8085 assembly szubrutint, amely a következő specifikáció szerint működik:&lt;br /&gt;
A szubrutin feladata a mellékelt ábrán specifikált hand-shake szekvencia alapján a B regiszterben kapott adat byte továbbítása a 20H I/O címre. A megoldás során ügyeljen arra, hogy a szubrutin a flag-ek értékét ne változtassa meg! Rajzolja fel a szubrutin mellé a rutin folyamatábráját is!&lt;br /&gt;
&lt;br /&gt;
Hand-shake: rajz&lt;br /&gt;
* először megjelenik az érvényes adat a porton&lt;br /&gt;
* majd a SOD jel 0 -&amp;gt; 1 átmenete után (némi várakozás után min kb. 320 ns) a SID jel is 0 -&amp;gt; 1-be váltjuk&lt;br /&gt;
* utána a SOD 0-ba vált (ekkor a porton az adatvezeték nagyimpedanciás lesz/nem lesz adat), ezután a SID is 0-ba váltjuk&lt;br /&gt;
* a lényeg, hogy a SOD 1-be váltását követően de még a 0-ba váltását megelőzően ki kell olvasni az adatot és be kell állítani a megfelelő állapotba a SID-et&lt;br /&gt;
&lt;br /&gt;
Írjon 8085 assembly kódrészletet, mely a 2345h címtől kezdődő 34 byte adatot a SENDBYTE szubrutin segítségével továbbítja.&lt;br /&gt;
&lt;br /&gt;
    SENDBYTE:       ;ez túl sok karakternek tűnik :)&lt;br /&gt;
        PUSH PSW&lt;br /&gt;
    VAR:    RIM&lt;br /&gt;
        ANI 80H&lt;br /&gt;
        JNZ VAR&lt;br /&gt;
        MOV A,B&lt;br /&gt;
        OUT 20H&lt;br /&gt;
        RIM&lt;br /&gt;
        MOV A,0C0H  ;11000000B&lt;br /&gt;
        SIM&lt;br /&gt;
    WSID0:  RIM     &lt;br /&gt;
        ANI 80H&lt;br /&gt;
        JZ WSID0&lt;br /&gt;
        RET&lt;br /&gt;
&lt;br /&gt;
    ;programrészlet&lt;br /&gt;
        LXI D,2345H&lt;br /&gt;
        MVI H,34&lt;br /&gt;
    MASOL:  LDAX D&lt;br /&gt;
        MOV B,A&lt;br /&gt;
        CALL SENDBYTE&lt;br /&gt;
        DCR H&lt;br /&gt;
        JNZ MASOL&lt;br /&gt;
&lt;br /&gt;
Egy másik megoldás:&lt;br /&gt;
 SENDBYTE:&lt;br /&gt;
     RIM&lt;br /&gt;
     ANI 80H&lt;br /&gt;
     JNZ SENDBYTE&lt;br /&gt;
     MOV A,B&lt;br /&gt;
     OUT 20H&lt;br /&gt;
     RIM&lt;br /&gt;
     ORI C0H     ;11000000B&lt;br /&gt;
     SIM&lt;br /&gt;
 VARSID1:RIM&lt;br /&gt;
     ANI 80H&lt;br /&gt;
     JZ VARSID1&lt;br /&gt;
     RIM&lt;br /&gt;
     ANI 7FH     ;01111111B&lt;br /&gt;
     ORI 40H     ;01000000B&lt;br /&gt;
     RET&lt;br /&gt;
&lt;br /&gt;
=== 3. o.) ===&lt;br /&gt;
Írjon 8085 assembly szubrutint, amely a következő specifikáció szerint működik:&lt;br /&gt;
* A szubrutin (GETBLOCK) feladata a 80H I/O címen elhelyezkedő 8255 párhuzamos periféria illesztő A portján 1-es üzemmódban az RST 5.5 IT-vel érkező 32 byte-os adatblokk és a hozzá tartozó 1 byte-os ellenőrző összeg beolvasása. A rutin a beolvasott adatokat a 9000h címtől kezdődően helyezze el. Az ellenőrző összeg számítási algoritmusa:&lt;br /&gt;
* Ai mod 256  1=&amp;lt;i=&amp;lt;32&lt;br /&gt;
* A rutin Z=1-gyel jelezze, ha az ellenőrző összeg helyes, Z=0-val, ha hibás volt. Mindkét esetben az&lt;br /&gt;
akkumulátor a helyes (a számított) ellenőrző összeget tartalmazza! (A rutin bármely regiszter értékét elronthatja!)&lt;br /&gt;
&lt;br /&gt;
* Írja meg a 8255-öst felprogramozó szubrutint (A port: 1-es üzemmód, bemenet; B port: 0-ás üzemmód, kimenet; C port:&lt;br /&gt;
bemenet)&lt;br /&gt;
&lt;br /&gt;
    FELPROG:    &lt;br /&gt;
        MOV A,10111001B&lt;br /&gt;
        OUT 83H&lt;br /&gt;
        RET&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Írja meg azt az RST 5.5-ös IT rutint, amely a 8001h címen elhelyezkedő byte legmagasabb helyértékű bitjének&lt;br /&gt;
bebillentésével jelzi, ha beolvasott egy adatot. Az adat ilyenkor a 8000h memória címen található.  &lt;br /&gt;
&lt;br /&gt;
        ORG 2CH&lt;br /&gt;
    RST55:  LXI D,8001H&lt;br /&gt;
        LDAX D&lt;br /&gt;
        XRI 01H&lt;br /&gt;
        STAX D  &lt;br /&gt;
        RET&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Írja meg a GETBLK szubrutint, az RST 5.5-ös IT rutin használatával Feltételezheti, hogy a rutin hívásakor az RST5.5 IT már engedélyezve van, de ne feledkezzen meg arról, hogy inicializáláskor a megszakítást a 8255-ösben letiltottuk!&lt;br /&gt;
&lt;br /&gt;
    GETBLK: EI&lt;br /&gt;
        MVI B,32        ;32 byte beolvasása&lt;br /&gt;
        MVI C,0     ;az ellenőrző összeg számításához&lt;br /&gt;
        LXI D,9000H &lt;br /&gt;
    BEOLV:  IN 80H&lt;br /&gt;
        CALL RST55&lt;br /&gt;
        STAX D&lt;br /&gt;
        ADD C&lt;br /&gt;
        INX D&lt;br /&gt;
        DCR B&lt;br /&gt;
        JNZ BEOLV&lt;br /&gt;
        LDAX D      ;az ellenőrző összeg beolvasása, a 32 byte-os adatblokk után következik&lt;br /&gt;
        CMP C&lt;br /&gt;
        MOV A,C&lt;br /&gt;
        DI  &lt;br /&gt;
        RET&lt;br /&gt;
&lt;br /&gt;
Egy másik megoldás:&lt;br /&gt;
&lt;br /&gt;
 ORG 2CH:JMP 1000H&lt;br /&gt;
 ORG 1000H:&lt;br /&gt;
     IN 80H&lt;br /&gt;
     MOV M,A&lt;br /&gt;
     PUSH H&lt;br /&gt;
     XCHG        ;HL-ben RESZOSSZEG&lt;br /&gt;
     MOV E,A&lt;br /&gt;
     MVI D,0&lt;br /&gt;
     DAD D       ;HL-ben uj reszosszeg       &lt;br /&gt;
     XCHG        ;DE-ben .............&lt;br /&gt;
     POP H       ;HL-ben cim (9000H)&lt;br /&gt;
     INX H&lt;br /&gt;
     DCR C&lt;br /&gt;
     EI&lt;br /&gt;
     RET&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 RUTIN:  MVI A,B9H   ;10111001B&lt;br /&gt;
     OUT 83H&lt;br /&gt;
     LXI H,9000H&lt;br /&gt;
     LXI D,0&lt;br /&gt;
     MVI C,32&lt;br /&gt;
 KORBE:  MVI A,0&lt;br /&gt;
     CMP C&lt;br /&gt;
     JNZ KORBE&lt;br /&gt;
     MOV A,M&lt;br /&gt;
     CMP E&lt;br /&gt;
     MOV A,E         &lt;br /&gt;
     RET&lt;br /&gt;
&lt;br /&gt;
 ORG 2CH:JMP1000H&lt;br /&gt;
 ORG 1000H:&lt;br /&gt;
     LXI H,8001H&lt;br /&gt;
     MOV A,M&lt;br /&gt;
     ANI 01111111B&lt;br /&gt;
     MOV M,A&lt;br /&gt;
     IN 80H&lt;br /&gt;
     LXI H,8000H&lt;br /&gt;
     MOV M,A&lt;br /&gt;
     LXI H,8001H&lt;br /&gt;
     MOV A,M&lt;br /&gt;
     ORI 10000000B&lt;br /&gt;
     MOV M,A&lt;br /&gt;
     EI&lt;br /&gt;
     RET&lt;br /&gt;
&lt;br /&gt;
=== 3. p.) ===&lt;br /&gt;
&lt;br /&gt;
Készítse el egy 8251 típusú USART-ot tartalmazó soros adó/vevő áramkör terveit és az aszinkron vételi folyamatot megvalósító szubrutin programját.Az USART áramkör a 80h és 81h port címterületet foglalja el.&lt;br /&gt;
Írja meg az áramkört inicializáló és a vételi folyamatot engedélyező programrészt! Az átvitel paraméterei:&lt;br /&gt;
* aszinkron adás és vétel&lt;br /&gt;
* egyszeres Baud-rate&lt;br /&gt;
* 8 adatbit, páros paritás, 1 STOP bit&lt;br /&gt;
* adás letiltva, vétel engedélyezve&lt;br /&gt;
&lt;br /&gt;
    ;programrész&lt;br /&gt;
        MOV A,01111101B     ;119.o./ aszinkron átvitelre vonatkozó Mode Instruction&lt;br /&gt;
        OUT 80H&lt;br /&gt;
        MOV A,11100110B     ;121.o./ Command Instruciton&lt;br /&gt;
        OUT 80H         ;elvileg ugyanarra a címre kell küldeni, mint a Mode Instr.-t&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
Írja meg a 8251-es áramkörön keresztül 32 adatbyte-ot ciklikus lekérdezéssel beolvasó szubrutint, amely az adatot a memória 8000h - 801Fh tartományába írja be! A szubrutinban feltételezheti, hogy a vétel során nem lép fel hiba!&lt;br /&gt;
* a 116.o. alján találhatók szerint a 8251-esen keresztüli adatbeolvasáshoz a C/D(negált)-nak 0-nak kell lennie&lt;br /&gt;
* arra nem jöttem rá, hogy hogyan lehet ezt állítani, lehet, hogy a feladat szerint feltesszük azt, hogy a megfelelő állapotban van&lt;br /&gt;
&lt;br /&gt;
    BEOLV:  LXI D,8000H&lt;br /&gt;
        MVI C,32&lt;br /&gt;
    OLV:    IN 80H&lt;br /&gt;
        STAX D&lt;br /&gt;
        INX D&lt;br /&gt;
        DCR C&lt;br /&gt;
        JNZ OLV&lt;br /&gt;
&lt;br /&gt;
== 4. feladat ==&lt;br /&gt;
&lt;br /&gt;
=== 4. a.) ===&lt;br /&gt;
&lt;br /&gt;
    ;kód            ;PC    ;adatsín ;/RD v. /WR   ;megjegyzés&lt;br /&gt;
    -----------------------------------------------------------------------------------&lt;br /&gt;
    ORG 0000h                                  direktíva&lt;br /&gt;
    LXI SP,0h       0000   31H      /RD&lt;br /&gt;
                    0001   00       /RD&lt;br /&gt;
                    0002   00       /RD        SP=0000H&lt;br /&gt;
    RST 7           0003   FFH      /RD        itt ugrik a 0038H-ra    &lt;br /&gt;
                    FFFF   00       /WR&lt;br /&gt;
                    FFFD   04       /WR        ;SP=FFFD&lt;br /&gt;
    HLT                                        hát ez most kimarad!&lt;br /&gt;
    ORG 38h                                    direktíva&lt;br /&gt;
    XRA A           0038   AEH      /RD        kinullázza A-t, így Z flag=1 lesz&lt;br /&gt;
    LXI H,0F000h    0039   3AH      /RD&lt;br /&gt;
                    0040   00H      /RD&lt;br /&gt;
                    0041   F0H      /RD        HL=F000H&lt;br /&gt;
    MOV M,A         0042   77H      /RD        az F000H címre 0-t tölt be&lt;br /&gt;
    ORA M           0043   B6H      /RD        0 OR 0=0 -&amp;gt; Z=1&lt;br /&gt;
    JNZ 38h         0044   C2H      /RD        feltétel nem teljesül így csak 1 byte-os az ut.&lt;br /&gt;
    RET             0045   C9H      /RD        PC=0000 , SP=0002&lt;br /&gt;
&lt;br /&gt;
=== 4. f.) ===&lt;br /&gt;
&lt;br /&gt;
    ;kód            ;PC    ;adatsín ;/RD vagy /WR   ;megjegyzés&lt;br /&gt;
    --------------------------------------------------------------------&lt;br /&gt;
    ORG 0000h                             direktíva                                      &lt;br /&gt;
    LXI H,9000h     0000   21H     /RD&lt;br /&gt;
                    0001   00H     /RD&lt;br /&gt;
                    0002   90H     /RD    HL=9000H&lt;br /&gt;
    SPHL            0003   F9H     /RD    SP=HL=9000H&lt;br /&gt;
    LXI H,0100h     0004   21H     /RD    &lt;br /&gt;
                    0005   00H     /RD&lt;br /&gt;
                    0006   01H     /RD    HL=0100H&lt;br /&gt;
    PCHL            0007   E9H     /RD    PC=0100H&lt;br /&gt;
    HLT                                   ez most kimarad! (de később idejutunk)&lt;br /&gt;
    CALL 0102h                            ez is! (de ide később se jutunk el)&lt;br /&gt;
    ORG 0100h                             direktíva&lt;br /&gt;
    MVI A,45h       0100   3EH     /RD&lt;br /&gt;
                    0101   45H     /RD    A=45H&lt;br /&gt;
    LXI B,1234h     0102   01H     /RD    &lt;br /&gt;
                    0103   34H     /RD&lt;br /&gt;
                    0104   12H     /RD    BC=1234H&lt;br /&gt;
    XRA C           0105   A9H     /RD    A=34 XOR 45 =   00110100&lt;br /&gt;
                                                  XOR     01000101        &lt;br /&gt;
                                                          -----------&lt;br /&gt;
                                                          01110001= 71H =A, Z flag=0&lt;br /&gt;
    PUSH B          0106   C5H     /RD    &lt;br /&gt;
                    8FFF   34H     /WR&lt;br /&gt;
                    8FFE   12H     /WR    SP=8FFE&lt;br /&gt;
    XRA B           0107   A8H     /RD    A=01100010B= 62H ,  Z flag=0&lt;br /&gt;
    POP D           0108   D1H     /RD&lt;br /&gt;
                    8FFE   12H     /RD&lt;br /&gt;
                    8FFF   34H     /RD    D=1234H&lt;br /&gt;
    HLT             0109   76H     /RD    &lt;br /&gt;
    JMP 0008h       010A   C3H     /RD&lt;br /&gt;
                    010B   08H     /RD&lt;br /&gt;
                    010C   00H     /RD&lt;br /&gt;
    HLT:  ez kimarad mert előtte ugrunk az 1. HLT-re (PC=0008), ahol a progi befagy&lt;br /&gt;
&lt;br /&gt;
== 5. feladat ==&lt;br /&gt;
&lt;br /&gt;
=== 5. a.) ===&lt;br /&gt;
&lt;br /&gt;
Az alábbi kódrészlettel a 8000h címen elhelyezkedő 500 byte-os memóriaterület modulo 256-os ellenőrző&lt;br /&gt;
összegét szeretnénk kiszámolni, és a memória területet követő byte-ban eltárolni. A program hibásan működik.&lt;br /&gt;
Miért? &lt;br /&gt;
&lt;br /&gt;
        LXI H,8000h&lt;br /&gt;
        LXI D,500&lt;br /&gt;
        XRA A&lt;br /&gt;
    ciklus:     &lt;br /&gt;
        ADD M&lt;br /&gt;
        INX H&lt;br /&gt;
        DCX D&lt;br /&gt;
        JNZ ciklus&lt;br /&gt;
        MOV M,A&lt;br /&gt;
&lt;br /&gt;
Válasz: a DCX utasítás nem állítja a Z flaget, így a JNZ utasítás nem működik&lt;br /&gt;
&lt;br /&gt;
=== 5. b.) ===&lt;br /&gt;
Egy i8085-ös mikroszámítógép megszakítási rendszerének megvalósításakor i8259A megszakításvezérlőt&lt;br /&gt;
alkalmaztunk, amely báziscíme 20h. Az alábbi megszakítást úgy szeretnénk megvalósítani, hogy&lt;br /&gt;
bármelyik másik megszakítás-bemenetre érkező kérés azonnal érvényre juthasson mielőtt maga az IRUT rutin&lt;br /&gt;
befejeződik. A program hibásan van megírva. Miért? Mit kellene kijavítani?&lt;br /&gt;
&lt;br /&gt;
    IRUT:   PUSH PSW&lt;br /&gt;
        PUSH B&lt;br /&gt;
        EI&lt;br /&gt;
        OUT 41h&lt;br /&gt;
        IN 40h&lt;br /&gt;
        ADI 1&lt;br /&gt;
        OUT 40h&lt;br /&gt;
        MVI B,3&lt;br /&gt;
    CIKL:   IN 40h&lt;br /&gt;
        ACI 0&lt;br /&gt;
        OUT 40h&lt;br /&gt;
        DCR B&lt;br /&gt;
        JNZ CIKL&lt;br /&gt;
        POP B&lt;br /&gt;
        MVI A,20h&lt;br /&gt;
        OUT 20h&lt;br /&gt;
        POP PSW&lt;br /&gt;
        RET&lt;br /&gt;
&lt;br /&gt;
Az a hiba, hogy a megszakítás vezérlőben az IT nyugtázása (EOI) csak az IT rutin végén történik meg (MVI A,20h; OUT 20h), ezért az alacsonyabb prioritású interruptok csak ez után jutnának érvényre.&lt;br /&gt;
&lt;br /&gt;
=== 5. c.) ===&lt;br /&gt;
&lt;br /&gt;
Ugyanaz mint az [[#5. a.)]]&lt;br /&gt;
&lt;br /&gt;
=== 5. d.) ===&lt;br /&gt;
&lt;br /&gt;
Az alábbi kódrészlettel a 8000h címen elhelyezkedő szót (16bit) szeretnénk hozzáadni a 8150h címen&lt;br /&gt;
elhelyezkedő szóhoz úgy, hogy az eredmény a 8000h címre kerüljön (A szó alacsonyabb helyértékű bájtja&lt;br /&gt;
(LSB) mindig a kisebb címen helyezkedik el.). A program hibásan működik. Miért? Mit kellene kijavítani?&lt;br /&gt;
&lt;br /&gt;
    Osszead:    LXI H,8000h&lt;br /&gt;
        LDA 8150h&lt;br /&gt;
        ADD M       &lt;br /&gt;
        MOV M,A&lt;br /&gt;
        INX H&lt;br /&gt;
        LDA 8151h&lt;br /&gt;
        ADD M       ;itt ADC M kell, mert lehet átvitel a előző byte-ok összadása során&lt;br /&gt;
        MOV M,A&lt;br /&gt;
        RET&lt;br /&gt;
    &lt;br /&gt;
== 6. feladat ==&lt;br /&gt;
&lt;br /&gt;
Ehhez létezik egy javításokat tartalmazó PDF. [[Media:Digit2_ef_V2_megold_6-7-javitott.pdf|Megtekintés.]]&lt;br /&gt;
&lt;br /&gt;
=== 6. a.) ===&lt;br /&gt;
&lt;br /&gt;
;Egy kaszkádosított megszakításkezelő rendszerben, milyen esetben kell parancsbyte-ban megadni a SLAVE megszakításkezelőknek, hogy slave áramkörök? &lt;br /&gt;
:Kaszkádosítás esetén, bufferelt kapcsolás esetén (62.o./3.5. , 63.o./3.6.3.)&lt;br /&gt;
&lt;br /&gt;
;Ebben az esetben hány ICW parancsbyte-ot kell kiadni és miért? &lt;br /&gt;
:4, ICW1-4 (66.o./ 3.6.2. - 3.6.3.) ICW3 a kaszkádosítás miatt kell, az ICW4 pedig a bufferelt kapcsolás miatt (M/S bit)&lt;br /&gt;
&lt;br /&gt;
;Miért van szükség ICW3 parancsbyte-ra? &lt;br /&gt;
:Mert kaszkádosott megszakításkezelő rendszert használunk&lt;br /&gt;
&lt;br /&gt;
;Miért van szükség ICW4 parancsbyte-ra?&lt;br /&gt;
:A master-slave pozíciókat az ICW-4-el lehet beállítani (bufferelt üzemmód esetén szükséges) (M/S bit)&lt;br /&gt;
&lt;br /&gt;
=== 6. b.) === &lt;br /&gt;
Inicializáljon egy 90h báziscímű i8255-ös párhuzamos periféria áramkör: A portját 1-es üzemmódban kimenetre, B portját szintén 1 üzemmódban bemenetre, C port alsó és felső felét bemenetre kell állítani. Adja meg a vezérlő szó értékét! Állítsa be a 8255 INTE ff-jainak értékét is!&lt;br /&gt;
&lt;br /&gt;
    MOV A,10101111B     ;95.o./5.1 táblázat&lt;br /&gt;
    OUT 93H             ;94.o./működési tábla&lt;br /&gt;
    DI&lt;br /&gt;
&lt;br /&gt;
:gondolom az INTE ff-kat mind 0-ra kell állítani, mert ha 1 lenne, akkor az üzembe helyezést követően már kérne megszakítást&lt;br /&gt;
:de az üzemmód megváltoztatásakor a f/f-k törlődnek,így ehhez sztem külön parancs nem szükséges&lt;br /&gt;
&lt;br /&gt;
=== 6. c.) ===&lt;br /&gt;
Egy vegyesen kaszkádosított 8259-es megszakítási rendszerben a MASTER egység IR2 bemenetére SLAVE áramkör&lt;br /&gt;
kapcsolódik. A MASTER egység ugrási táblájának kezdőcíme 8000h, a SLAVE ugrási táblájának kezdőcíme 9000h,&lt;br /&gt;
mindkettő nyolcas osztásban.&lt;br /&gt;
&lt;br /&gt;
Adja meg, hogy milyen ICW3 parancsot kell küldeni a MASTER illetve a SLAVE egységeknek!&lt;br /&gt;
&lt;br /&gt;
    LXI D,8000H ;MASTER&lt;br /&gt;
    MOV A,0000100B&lt;br /&gt;
    INX D&lt;br /&gt;
    STAX D&lt;br /&gt;
&lt;br /&gt;
    LXI H,9001H ;SLAVE, másik módszerrel&lt;br /&gt;
    MOV A,0000010B&lt;br /&gt;
    MOV M,A&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
; Adja meg, mennyi lesz a MASTER IR6 bemenetére érkező megszakítás szubrutinjának kezdőcíme!&lt;br /&gt;
: 802CH (65.o. ADI=0 esetén táblázat)&lt;br /&gt;
&lt;br /&gt;
Adja meg, mennyi lesz a SLAVE IR6 bemenetére érkező megszakítás szubrutinjának kezdőcíme!&lt;br /&gt;
-902CH (65.o. ADI=0 esetén táblázat)&lt;br /&gt;
&lt;br /&gt;
=== 6. d.)===&lt;br /&gt;
Egy aszinkron üzemmódba felprogramozott 8251-es soros áramkör hibásan működik. A program státusz beolvasáskor olyan hibákat olvas, amelyek adat fogadásakor lépnek fel. Melyek lehetnek ezek, mi lehet a hibák oka ?&lt;br /&gt;
&lt;br /&gt;
# OVERRUN ERROR (=túlfutási hiba), akkor ha a puffer-regiszter megelőző tartalmát a CPU még nem olvasta ki és ezt a 8251 felülírja&lt;br /&gt;
# FRAMING ERROR (=kerethiba): 0 színtű STOP bitek érkeznek&lt;br /&gt;
# PARITY ERROR (=paritás hiba): rossz paritás&lt;br /&gt;
&lt;br /&gt;
===6. e.)===&lt;br /&gt;
Mit jelent a BREAK üzemmód a 8251-es áramkörnél? &lt;br /&gt;
* aszinkron üzemmódban folyamatos kiküldhetők a vonalra, ha nincs folyamatban adatkivitel, állapotjelzésre is szolgálhat&lt;br /&gt;
&lt;br /&gt;
Mire alkalmazható? &lt;br /&gt;
* felhasználható megszakításkérés jelzésére&lt;br /&gt;
&lt;br /&gt;
Hogyan lehet beállítani?&lt;br /&gt;
* beállítása: a Command Instruction 3. bitje, a SBRK =1 esetén a TXD=0 lesz (Break karakter)&lt;br /&gt;
&lt;br /&gt;
=== 6. f.)===&lt;br /&gt;
Rajzolja fel egy aszinkron üzemmódban felprogramozott USART kimeneti jelalakját (TxD) 8 bites, 0Fh értékű adat elküldésekor, ha páros paritást és 1 stop bitet alkalmazunk.&lt;br /&gt;
&lt;br /&gt;
    0   1   1   1   1   0   0   1&lt;br /&gt;
       ___ ___ ___ ___         ___&lt;br /&gt;
   ___|               |___ ___|&lt;br /&gt;
&lt;br /&gt;
=== 6. g.)===&lt;br /&gt;
Egy i8085-ös mikroprocesszoros rendszerben az A, B, C jelek külön kártyákon állnak elő, változásuk egymástól független, de mindannyian szeretnének időszakosan megszakítást kérni a processzor RST5.5 vonalán. Milyen kimenetű kapukat kell a szaggatottal jelölt dobozokba tervezni, hogy a rendszer helyesen működjön, miért?&lt;br /&gt;
* Open collector, mivel a kimeneteket összekötöttük, és a rendszer tartalmazott közvetlen felhúzó ellenállást&lt;br /&gt;
&lt;br /&gt;
=== 6. h.) ===&lt;br /&gt;
Egy i8085-ös mikroprocesszoros rendszerben az A, B, C jelek külön kártyákon állnak elő, változásuk egymástól független, de mindegyiket szeretnénk időszakosan címezhetően külön-külön beolvasni a processzor D0 adatvonalán. Milyen kimenetű kapukat kell a szaggatottal jelölt dobozokba tervezni, hogy a rendszer helyesen működjön, miért?&lt;br /&gt;
* Tristate,  mivel a kimenetek összekötöttük és a rendszer nem tartalmazott közvetlen felhúzó ellenállást&lt;br /&gt;
&lt;br /&gt;
===6. i.)===&lt;br /&gt;
Egy 8085 mikroprocesszoros rendszerben 1 master és 4 slave 8259-es IT vezérlőt használunk. Hány megszakítást tudunk összesen lekezelni a 8259-esekkel?&lt;br /&gt;
* 4*8+(8-4)=36&lt;br /&gt;
* A 4 Slave 8 megszakítást tud kezelni + a Master maradék IR bemenetei felhasználhatók megszakításkérés céljára (60.o./3.4.)&lt;br /&gt;
&lt;br /&gt;
A fenti konfigurációt úgy kötötték be, hogy a slave egységek a master 0,2,4 és 6 sorszámú bemenetére kapcsolódnak. A rendszer hibásan működik. Miért? Indokolja a választ!&lt;br /&gt;
* ha a Masternek egyedi megszakításkérő vezetékei is vannak, akkor a IR0 bemenetre nem szabadna az egyik Slave-t sem rákötni, ugyanis a CAS vezetékek 0 állapota egyszerre jelentené a Master és az egyik Slave megszakításkérését (62.o./3.4.)&lt;br /&gt;
&lt;br /&gt;
A fenti konfigurációban az összes vezérlő egy közös meghajtón (74LS245) keresztül csatlakozik a rendszersínre. Hogyan lehet ilyen esetben az egyes vezérlőknek megmondani, hogy master vagy slave szerepet játszanak?&lt;br /&gt;
* az ICW 4 parancsbyte 2. bitjével (=M/S) (66.o./3.6.3.)&lt;br /&gt;
&lt;br /&gt;
=== 6. j.)===&lt;br /&gt;
Egy DMA vezérlő mind a 4 csatornájára egy-egy periféria csatlakozik. Használható-e ilyenkor az 1-es csatorna&lt;br /&gt;
AUTOLOAD üzemmódban? Indokolja a választ!&lt;br /&gt;
*Nem, csak a CH2 és CH3 használható (81.o./4.6.4.)&lt;br /&gt;
&lt;br /&gt;
Programozza fel a DMA vezérlőt AUTOLOAD üzemmódba úgy, hogy a 9000h memóriacímtől kezdődő címre&lt;br /&gt;
periódikusan 128 byte adatot legyen képes betölteni a perifériából. A 8257-es báziscíme: 70H.&lt;br /&gt;
&lt;br /&gt;
        LXI D,9000H&lt;br /&gt;
        MVI B,128&lt;br /&gt;
        MOV A,10101111B&lt;br /&gt;
        OUT 78H         ;beírás A3=1, A2=A1=A0=0&lt;br /&gt;
    TOLT:   IN 78H      ;kiolvasás is A3=1, A2=A1=A0=0&lt;br /&gt;
        STAX D&lt;br /&gt;
        INX D&lt;br /&gt;
        DCR B&lt;br /&gt;
        JNZ TOLT&lt;br /&gt;
        END&lt;br /&gt;
&lt;br /&gt;
=== 6. k.) ===&lt;br /&gt;
Mi különbség adatátvitel szinkronizálása szempontjából a 8251-es soros áramkör aszinkron és szinkron soros adatátvitele között?&lt;br /&gt;
* az aszinkron átvitel esetén a start és stop bitek segítségébel szinkronizájla az átvitelt, a start bit megérkezésést az RXD 1 -&amp;gt; 0 átmenet jelzi&lt;br /&gt;
* a szinkron átvitel esetén a szinkronizálást külső, vagy belső eljárással kell megoldani, SYNC karakter érkezésére várunk (belső) vagy a SYNDET-et bemenetként programozzuk fel&lt;br /&gt;
&lt;br /&gt;
=== 6. l.) ===&lt;br /&gt;
Programozzon fel egy 8253-as timer áramkört, amely 3,072MHz-ről 4800Hz frekvenciára osztja le jelet, 50-50%-os kitöltésűre! A 8253-as áramkör binárisan számol, és 90h báziscíme van. Használja a 0-s számlálót!&lt;br /&gt;
&lt;br /&gt;
    ;3,072 Mhz=4800*640&lt;br /&gt;
    ;640= 0000 0001 | 0100 0000&lt;br /&gt;
&lt;br /&gt;
    MOV A,00111110B&lt;br /&gt;
    OUT 93H&lt;br /&gt;
    MOV A,01H&lt;br /&gt;
    OUT 90H&lt;br /&gt;
    MOV A,80H&lt;br /&gt;
    OUT 91H&lt;br /&gt;
&lt;br /&gt;
=== 6. m.) === &lt;br /&gt;
Egy kaszkádosított 8259-es rendszerben a MASTER egység IR7 és IR6 bemenetére SLAVE áramkörök kapcsolódnak.&lt;br /&gt;
Adja meg, hogy milyen ICW3 parancsot kell küldeni a Master egységnek!&lt;br /&gt;
* 11000000 (66.o./3.6.2.)&lt;br /&gt;
&lt;br /&gt;
Adja meg, hogy milyen ICW3 parancsot kell küldeni Az IR6-ra csatlakozó SLAVE egységnek&lt;br /&gt;
* 01000000 (66.o./3.6.2.)&lt;br /&gt;
&lt;br /&gt;
Hogyan tudjuk kijelölni, hogy lesz ICW3 parancs?&lt;br /&gt;
*az ICW1 SNGL bitjének 0 állapotba állításával, az ICW1 1. bitje (D1)  (63.o. táblázat, 64.o. ICW1 - SNGL)&lt;br /&gt;
&lt;br /&gt;
== 7. feladat ==&lt;br /&gt;
&lt;br /&gt;
Ehhez létezik egy javításokat tartalmazó PDF. [[Media:Digit2_ef_V2_megold_6-7-javitott.pdf|Megtekintés.]]&lt;br /&gt;
&lt;br /&gt;
===7. a.)===&lt;br /&gt;
Sorolja fel az i8085 állapotait!&lt;br /&gt;
* RUN, WAIT, HALT, HOLD&lt;br /&gt;
&lt;br /&gt;
===7. b.)===&lt;br /&gt;
Szerkesszen gráfot, amely az i8085-ös állapotainak kapcsolatát ábrázolja! A nyilazott ágakra az állapot-változások okait kell felírni.&lt;br /&gt;
&lt;br /&gt;
* RUN -&amp;gt; WAIT:  Ready jel 0 szintre vált&lt;br /&gt;
* WAIT -&amp;gt; RUN:  Ready jel 1-re vált&lt;br /&gt;
* RUN -&amp;gt; HALT:  HLT parancs kiadásakor&lt;br /&gt;
* HALT -&amp;gt; RUN: megszakításkérés érkezésekor&lt;br /&gt;
* RUN -&amp;gt; HOLD: HOLD 1-be vált&lt;br /&gt;
* HOLD -&amp;gt; RUN:  a HOLD jel megszűnése után&lt;br /&gt;
* HALT -&amp;gt; HOLD: HOLD igény érkezésekor (HOLD=1)&lt;br /&gt;
* HOLD -&amp;gt; HALT: HOLD megszűnése (HOLD=0)&lt;br /&gt;
&lt;br /&gt;
=== 7. c.) ===&lt;br /&gt;
Milyen esetekben kerül a 8085-ös mikroprocesszor HALT állapotból RUN állapotba?&lt;br /&gt;
* HALT -&amp;gt; RUN: megszakításkérés érkezésekor, illetve reset hatására&lt;br /&gt;
&lt;br /&gt;
===7. d.)===&lt;br /&gt;
Sorolja fel azokat az eseteket, amikor az INTE FF = 0 értékű lesz!&lt;br /&gt;
* DI parancs kiadásakor, reset, megszakítás érvényre jutása után&lt;br /&gt;
&lt;br /&gt;
===7. e.) ===&lt;br /&gt;
Sorolja fel azokat az eseteket, amikor az RST7.5 FF = 0 értékű lesz!&lt;br /&gt;
* SIM utasítás esetén,ha a 4. bittel töröljük az RST7.5-t (A4=1), illetve RESET után&lt;br /&gt;
&lt;br /&gt;
===7. f.)===&lt;br /&gt;
Az i8085-ös processzor reszetelésekor milyen értékű lesz az INTEFF, és mi lesz a PC tartalma?&lt;br /&gt;
* az INTEFF-kat törli, tehát 0 lesz , PC:0000H&lt;br /&gt;
&lt;br /&gt;
===7. g.)===&lt;br /&gt;
Milyen kezdőcímeken kezdődnek az RST 2 és RST 5 utasításokkal meghívott szubrutinok, illetve az RST 5.5 és az RST 7.5 megszakítási szubrutinok?&lt;br /&gt;
* RST 2: 10H&lt;br /&gt;
* RST 5: 28H&lt;br /&gt;
* RST 5.5: 2CH&lt;br /&gt;
* RST 7.5: 3CH&lt;br /&gt;
&lt;br /&gt;
=== 7. h.)===&lt;br /&gt;
Mit kell kezdőértéknek az SP-be betölteni ha a programozó úgy kívánja beállítani a STACK tárat, hogy az első értékes beírt bájt 8FFFh-ra íródjon? Miért?&lt;br /&gt;
* 9000H, mert &#039;&#039;először&#039;&#039; csökkenti az SP értékét a processzor, és csak utána ír a stackre.&lt;br /&gt;
&lt;br /&gt;
===7. i.)===&lt;br /&gt;
Hogyan jelezzük a fordítóprogramnak, hogy a generált kódot az 1698h címtől kezdődően helyezze el?&lt;br /&gt;
* ORG 1698H&lt;br /&gt;
&lt;br /&gt;
===7. j.)===&lt;br /&gt;
Hogyan jelezzük a fordítóprogramnak, hogy az 1712h címtől kezdődően helyezze el a „digit” stringet?&lt;br /&gt;
&lt;br /&gt;
    ORG 1712H&lt;br /&gt;
    KAR DB &amp;quot;digit&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===7. k.)===&lt;br /&gt;
Hogyan jelezzük a fordítóprogramnak, hogy inicializált vagy inicializálatlan helyfoglalás történik?&lt;br /&gt;
* inicializált: DB vagy DW,&lt;br /&gt;
* inicializálatlan: DS direktívát használunk&lt;br /&gt;
&lt;br /&gt;
===7. l.)===&lt;br /&gt;
Mi a különbség az EQU 1200h és a DW 1200h direktívák között?&lt;br /&gt;
* CIMKE EQU 1200H: értékadás, hivatkozás a CIMKE-vel&lt;br /&gt;
* DW 1200H:  inicializált helyfoglalás&lt;br /&gt;
&lt;br /&gt;
===7. m.)===&lt;br /&gt;
Sorolja fel az i8085 mikroprocesszor megszakítással kapcsolatos jeleit!&lt;br /&gt;
* TRAP, RST 5.5,6.5,7.5, INTR&lt;br /&gt;
&lt;br /&gt;
===7. n.)===&lt;br /&gt;
Milyen típusú kimenettel rendelkező áramkörökkel lehet busz rendszerű vezetékeket meghajtani? Húzza alá, hogy melyik típusú kimenet alkalmas arra, hogy egy vezetéket (busz) több kimenet egyidejűleg is meghajthasson?&lt;br /&gt;
* tristate, &amp;lt;u&amp;gt;open collector&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===7. o.)===&lt;br /&gt;
Miért nem lehet két totem-pole kimenetű áramkör kimeneteit összekötni? Indokolja a választ? (sztem érdemes indokolni:))&lt;br /&gt;
* mert az ellenáláskon túl nagy teljesítmény disszipálódna, és ennek eredménye a tönkremenetel&lt;br /&gt;
&lt;br /&gt;
===7. p.)===&lt;br /&gt;
i8255-ös párhuzamos periféria áramkör A portját 1-es üzemmódban kimenetre, B-portját 0 üzemmódban bemenetre, C port alsó felét bemenetre, felső felét kimenetre kell állítani. Adja meg a vezérlő szó értékét!&lt;br /&gt;
* 10100011&lt;br /&gt;
&lt;br /&gt;
Adja meg, melyik regiszterbe és milyen értéket kell írni, hogy a fenti üzemmód esetén a PC4 portbit 0 , illetve 1 értékű legyen!&lt;br /&gt;
* Bit Set/Reset művelettel: (a 8255-ös címe+3) címre kell kiküldeni a 00001000 byte-ot a 0-ba állításhoz, 00001001 byte-ot az 1-be állításhoz&lt;br /&gt;
&lt;br /&gt;
===7. q.)===&lt;br /&gt;
Egy 3 gépi ciklusból álló utasítás (pl.: IN 83h) végrehajtása során az első gépi ciklus T1 fázisában egyidőben High (1) értékűek lesznek az INT és a HOLD bemenetek.&lt;br /&gt;
&lt;br /&gt;
;Mikor adja át a DMA vezérlőnek a 8085-ös a busz vezérlési jogot? Indokolja a válaszát!&lt;br /&gt;
:a HOLD bemenet 1-be váltásakor&lt;br /&gt;
&lt;br /&gt;
;Mikor jut érvényre a megszakítás (megszakításkérés engedélyezett állapotban van és nincs más kérés) Indokolja a válaszát!&lt;br /&gt;
:a HOLD jel megszűnését követően, hiszen a 7. b.) feladatban leírtak szerint működik a 8085, HOLD állapotból HALT-ba a HOLD=0-t követően, a HALT-ból a RUN-ba a megszakításkérést követően jut&lt;/div&gt;</summary>
		<author><name>Prisonerhu</name></author>
	</entry>
</feed>