Digitális technika 2 - Megoldások a V2-es ellenőrző feladatsorhoz
Ezen az oldalon a 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, de nagyon sok átfedés van ezzel!
A V2-es feladatsor itt érhető el.
1. feladat
2. feladat
by Lacee (a hibákat jelezni kérem a prisonerhu freemail.hu címen)
2. a)
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.
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.
- Készítse el a rendszer inicializálását végző főprogramot (40h címtől kezdődően)!
- Készítse el a megszakítási szubrutinokat!
RST55 EQU 2CH RST65 EQU 34H C1 EQU 55H C2 EQU AAH IT1 11H IT2 17H JMP INIC ORG 0040H INIC: MVI A,00001100B ;RST 7.5-T LETILTJUK, A TÖBBIT ENGEDÉLYEZZÜK SIM ;MASZK BEÁLLÍTÁSA EI ;MEGSZAKÍTÁS ENG VAR: JMP VAR ;VÉGTELEN CIKLUS, AZ RST-KRE VÁR, AZOK MEGSZAKÍTJÁK ORG RST55 ;RST55 CÍMÉN VAN,ÍGY HA MEGSZAKÍTÁS TÖRTÉNIK, AKKOR IDE UGRIK A PROGI MEGSZ1: MVI C,C1 ;BEÁLLÍTJUK A KÍVÁNT ÉRTÉKET OUT IT1 ;VISSZAÁLLÍTJUK AZ IO-T EI ;MEGSZAKÍTÁS ÉRVÉNYRE JUTTATÁSA RET ORG RST65 ;AZ ELÕBBI MINTÁJÁRA... MEGSZ2: MVI C,C2 OUT IT2 EI RET
2. b)
Í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!)
Í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ó.
PÉLDA1 A MÛKÖDÉSRE 10101111 ;A BEJÖVÕ ADAT -> EZT KELL KAPNUNK A PÉLDA1-BEN: 01011111 RRC 11010111 ;JOBBRA FORGATJUK AND 01010101 ;ÖSSZEÉSELJÜK 55H-VAL (MÁSNÉVEN MASZKOLÁS) ---------- = 01010101 -> D ;AZ EREDMÉNYT BEÍRJUK A (D) REG-BE
RLC 01011111 ;AZ EREDETI ADATOT FORGATJUK BALRA AND 10101010 ;ÉSELJÜK AAH-VAL ---------- = 00001010 -> H ;KIMENTJÜK H-BA, A PROGIBAN NEM KELL H-BA MENTENI,MERT AZ UTANA LEVÕ PARANCS A VAGYOLÁS ÉS AHHOZ AZ A- TARTALMA KELL, AMI MOST PONT A H-BA RAKOTTAL EGYEZIK MEG
H OR D 01010101 00001010 ---------- 01011111 ;AZ EREDMÉNY!
PÉLDA2: 10101110 ->EBBÕL EZT:01011101 RRC 01010111 AND 01010101 ---------- = 01010101 -> D
RLC 01011101 AND 10101010 ----------- = 00001000 -> H
H OR D 01010101 00001000 ----------- 01011101
;NA ÉS VÉGRE A PROGI KONV: PUSH H PUSH D PUSH PSW ;kimentjük A-t RRC ;jobbra forgatunk ANI 01010101B ;maszkoljuk 55H-val MOV D,A ;a maszkolt byte-ot kimentjük D-be POP PSW ;vissza az A-t RLC ;balra forgatjuk ANI 10101010B ;maszkoljuk AAH-val ORA D ;összevagyoljuk D-vel POP D ;POPpolgatunk POP H RET ELO: PUSH PSW PUSH H PUSH B PUSH A MVI B,0H LXI D,0H FUT: MOV A,B OUT 0FFH ;a B 0-tól FF-ig megy, ez az összes lehetséges kombináció CALL KONV ;az A-ban a B-nek megfelelő beolvasott (átkonvertált) adat lesz MOV C,A IN 01FH ;beolvassuk a reg tartalmát CMP C ;ha A=C akkor jó (C:a B konvertált alakja, A:a közvetlenül visszaolvasott alak JZ TOVABB ;ha B=C -> Z=1, tehát nem kell növelni a DE-t INX D ;ha azonban Z=0, növeljük DE-t TOVABB: INR B MOV A,FF CMP B JNZ FUT ;ha B végigpörgött, tehát elérte az FF-t, akkor kilépünk POP A POP B POP H POP PSW
2. c)
Í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!
- A kimeneti egység K1…K8 jelei a 0ACh IO címen olvashatók vissza.
- a kimeneti regiszter (74374) a 0AAh IO címen írható
- A kimeneti regiszter minden második bitje (K0,K2,K4,K6) negáltan legyen kivezetve.
VIZS: OUT 0AAH ;BEÍRJUK AZ A REG TARTALMÁT A KIMENETI REG-BE AND 55H ;A KIMENET ÉRTÉKE NEM A BEÍRT A-VAL LESZ EGYENLÕ XRA FFH ;EZÉRT MEGCSINÁLJUK SZOFTVERESEN A BYTE MINDEN MÁSODIK BITJÉNEK NEGÁLÁSÁT
;példa 1:a fenti műveltre (AND 55H;XRA FFH) kiírt adat: 11111111 -> ebből ezt kell kapnunk: 10101010 AND 01010101 ----------- 01010101 XRA 11111111 ----------- 10101010 ->és kész!
;példa 2: kiírt adat: 10111011 ->ez lesz belőle: 11101110 AND 01010101 ----------- 00010001 XRA 11111111 ----------- 11101110 -> ready!
;és a progi folytatása 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 IN 0ACH ;visszaolvasás CMP B ;a szokásos vizsgálat, A-ból kivonjuk a B-t(az ellenőrző byte-ot) JNZ Z1 ;és ha az eredmény nem 0 (akkor Z=0,és hiba van), a feladata pont az ellentetjét kéri XRA A ;ezért a Z flaget megnegáljuk az alábbi paranccsal JMP VEGE Z1: MOV A,1H ORA A VEGE: RET
2. d)
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.
Írja meg azt a két assembly programrészletet, amely a két 8251-est felprogramozza a fenti konfigurációnak megfelelően!
AFELPROG: ;először a MODE INSTRUCTION-t kell kiküldeni ;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 MOV A,FDH OUT 0AAH MOV A,00 000001B ;Command Instruction OUT 0AAH RET
BFELPROG: ;kódszó: ugyanaz,mint az előbb MOV A,FDH OUT 0AEH MOV A,00000000B ;Command Instruction, B lesz a vevő OUT 0AEH JMP 002CH RET
2. e) NR!
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.
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.
- Í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
- Í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.
INIC55: ORG 8F00H TER DS FF ;STACK helyfoglalás ORG 0H ;STÁTUSZ szó: 10111111 - segédlet 95-97.oldala alapján MOV A,DFH OUT 97H IN 95H JMP 2CH
ORG 2CH IN 94H ;ez itt a PEVEN jel beolvasása ANI 01H ;a PA0 bitjét veszem a PEVEN paritás bitnek MOV D,A ;és elmentem a D-be;ha D=0, akkor páratlan paritás, D=1, akkor páros paritás van MVI B,0 MVI C,8 PARIT: RLC JNC TOV INR B ;az utolsó ciklusba bekerül a beolvasott byte-ban lévő 1-esek száma TOV: DCR C JNZ PARIT MOV A,B ANI 01H LXI H,3456H MOV M,A
2. f.)
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.
- 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
- Í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.
CHECK: OUT 20H ;kiírás a reg-be CMA ;bitenként negálja az A-t MOV B,A ;ezt a negált értéket beírjuk a B reg-be IN 20H ;20H címről beolvasunk CMP B ;szokásos ellenőrzés JZ CY0 ;ha egyenlő a B és a visszaolvasott érték, akkor Z=1 és akkor ugrunk arra a részre ahol CY:=0 STC ;ha Z=0 akkor CY-t 1-be állitjuk JMP VEGE ;és ugrunk a végére CY0: STC ;CY=1 CMC ;CY-t negálja VEGE: RET
3. feladat
3. a)
LXI D,X ; X ms-ban LXI B,R ; R-ratio, szazalekban ELEJE: LXI H,X*1000000*R/100/7040 MVI A,C8H ; 11001000B SIM CALL HUROK MVI A,48H ; 01001000B SIM LXI H,X*1000000*(100-R)/100/7040 CALL HUROK JMP ELEJE
HUROK: DCX H ; 4 fazis MOV A,H ; 4 fazis ORA L ; 4 fazis JNZ HUROK ; 10 fazis, 7040 nsec RET
3. b.)
Írjon 8085 assembly szubrutint, amely a következő specifikáció szerint működik:
- A szubrutin a SID jel felfutó élére egy adatkivitelt, a lefutó élére egy adatbeolvasást végezzen a következők szerint:
- a szubrutin induláskor megvárja a SID jel 0=>1 átmenetét és a B regiszter tartalmát kiírja a 70h-es port címre,
- majd a SID jel 1=>0 átmenetére 71h port címről beolvas egy adatbájtot, amit a C regiszterbe tesz, ezután kilép a szubrutinból.
- A szubrutin bemenete: a kiírandó adat a B regiszterben.
- A szubrutin kimenete: a beolvasott adat a C regiszterben
- 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!
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 PUSH PSW ;kimentések PUSH A PUSH B VAR1: RIM ;a beolvasott byte felső bitje a SID jel értékét mutatja MVI A,80H ;maszkolás ORA C ;megnézzük, hogy a SID=0-e ha nem akkor ugárs VAR1-re / SID=1-re várunk JNZ VAR1 VAR2: RIM ;itt gyakorlatilag ugyanaz van, mint az előbb, csak SID-1-re várunk MVI A,80H ORA C JZ VAR2 ;tehát ha SID=0 marad, akkor ugrunk VAR2-re / ha SID=1, akkor várunk még MOV A,0 ;itt azt nézzük, hogy az 1. részben vagyunk-e 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 JZ B70H JMP C71H ;ha a 2. részben vagyunk, akkor az előző ugró utasítás nem teljesül és ide kell ugrani 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 JMP VAR1 B70H: MOV A,B OUT 70H JMP CIMKE C71H: IN 71H MOV C,A POP B POP A POP PSW END
Egy másik megoldás:
NULLBEOLV: PUSH PSW RIM ANI 80H ;10000000B JZ NULLBEOLV MOV A,B OUT 70H EGYBEOLV: RIM ANI 80H JNZ EGYBEOLV IN 71H MOV C,A POP PSW JMP NULLBEOLV
3. c.)
Írjon 8085 assembly szubrutint, amely megvárja a SID jel változását (felfutó és lefutó él). A szubrutin kimenete:
- Z=1 felfutó él volt,
- Z=0 lefutó él volt!
- A szubrutin ne változtassa meg a regiszterpárok értékét!
RUTIN: RIM ANI 80H ;maszkolás, az SID értéke az A-ban lesz JZ FELFUT ;ha az előbbi "és"-elés eredménye 0 (tehát a SID 0), akkor Z=1 -> ugrás a felfutójelhez JMP LEFUT ;különben lefutó jelre várunk FELFUT: RIM ANI 80H ;maszkolás JZ FELFUT ;addig csináljuk amíg az eredmény 1 lesz (tehát a SID=1-re), Z=0-ra várunk XRA A ;beállítjuk a Z-t 1-re JMP VEGE ;ugrás végére LEFUT: RIM ANI 80H JNZ FELFUT ;ha Z=1, akkor az "és"-elés eredménye:0, tehát tovább kell várni a SID= 1 -> 0 átmenetre MOV A,FFH ORA A ;Z:=0 VEGE: RET
Egy másik megoldás:
MVI A,0 RIM ANI 80H JZ IDE MVI A,1 IDE: CALL IDERUTIN HALT IDERUTIN: ANI FF JZ VAREGYRE VARNULLRA: RIM ANI 80H JNZ VARNULLRA RZ VAREGYRE: RIM ANI 80H JZ VAREGYRE RNZ
3. d.)
Í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)!
Az ellenőrző összeg számítási algoritmusa: X(i) mod 256 0<i<32
RUTIN: MVI C,32 ;32 byte hosszúságú adatblokk XRA A ;A:=0 CIKLUS: ADD M ;A+HL-> A INX H ;forrásmutató növelése DCR C JNZ CIKLUS ;ha végigértünk akkor Z=1 MOV M,A ;a blokkot követő részen az ellenőrző összeg RET
Egy másik megoldás:
LXI D,0 ;reszosszeg kinullazasa LXI H, KC ;kezdocim LXI B, 32 ;db HUROK: MOV A,M CALL OSSZEGZO INX H DCX B MOV A,C ORA B JNZ HUROK MOV M,E ;E-ben van a mod256 reszosszeg OSSZEGZO: PUSH H MOV L,A MVI H,0 DAD D XCHG POP H RET
3. e.)
Í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!
(9000H,9001H) = (9100H,9101H) - (9200H,9201H) ... stb.
- Írja meg a kivonó programot!
- 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.
LXI B,9000H LXI D,9101H LXI H,9201H MVI E,32H ;2*32 szót vonunk ki egymásból KIVON: STC ;CY:=1 CMC ;CY:=/CY -> CY:=0 LDAX A,D ;9101H-n található adatot betölti az A-ba SBB M ;A-(HL által mutatott címen levő adat)-CY , ha van átvitel akkor CY=1 lesz STAX B ;B által mutatott címre A tartalmát helyezi DCX B DCX D DCX H LDAX A,D ;9100H-n található adat megy az A-ba SBB M ;A-M-CY STAX B ;9000H-n a kivonás eredménye (2 byte-on) INX H INX H INX D INX D INX B INX B DCR E JNZ KIVON MVI E,32H ;32 szavat vizsgálunk meg MVI D,0H ;a pozitív számok számát ebben tároljuk SZAMOL: LXI B,9000H ANI 80H ;ha a MSB (legfelső bit)=1 akkor a szám negatív JZ TOVABB ;ha szám negatív, akkor Z=1 és nem kell növelni INR D TOVABB: INX H INX H DCR E JNZ SZAMOL END
Egy másik megoldás:
XPOINTER EQU 9080H YPOINTER EQU 9082H ZPOINTER EQU 9084H ;ideiglenes regiszterpárok, KIHASZNÁLATLAn ramterület, senkit nem zavar X EQU 9100H Y EQU 9200H Z EQU 9000H LXI H,X ;ebbol SHLD XPOINTER LXI H,Y ;ezt SHLD YPOINTER LXI H,Z ;ide(eredmény) SHLD ZPOINTER CIKLUS: CALL CIKLUSMAG LXI B, X+32*2 LHLD XPOINTER MOV A,H CMP B JNZ CIKLUS MOV A,L CMP C JNZ CIKLUS HALT CIKLUSMAG: LHLD XPOINTER ;H=91,L=00 MOV D,M INX H MOV E,M ;DE=ebbol INX H SHLD XPOINTER LHLD YPOINTER MOV A,M CMA MOV B,A INX H MOV A,M CMA MOV C,A INX B ;BC-ben kivonando kettes komplemense(-1szerese) INX H SHLD YPOINTER XCHG ;HL-ben ebbol DAD B XCHG ;DE-ben eredmeny LHLD ZPOINTER MOV M,D INX H MOV M,E INX H SHLD ZPOINTER RET
3. f.)
Í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 (>0), egy másik byte-ot, hogy mennyi a negatív szám (<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.)
- Írja meg a szubrutint!
- Í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.
RUTIN: PUSH B ;kimentjük BC-t,mert a számlálónak a B-t használjuk fel PUSH H ;a későbbi vizsgálat során az eredeti címtől indulunk, így ezt is kimentjük MVI B,64 XCHG ;HL és DE felcserélése KIVON: LDAX D ;az A-ba betölti a DE (eredetileg HL) által mutatott címen lévő adatot SUB M ;így DE-ből kivonjuk a HL-t STAX D ;DE által mutatott címre visszahelyezzük az eredményt INX D INX H DCR B JNZ KIVON ;ha végigértünk a 64 byte-on, akkor Z=1 lesz XCHG ;HL és DE visszacserélése POP B POP H PUSH H MVI D,0 MVI E,64 POZ: MOV A,M ;A-ban a HL által mutatott címen lévő byte ANI 80H ;maszkolás az előjel bitre JNZ PT ;ha az előjel bit=1, akkor Z=0 és akkor negatív, így kihagyjuk a D növelését INR D ;ha Z=1, akkor a szám pozitív és növeljük D-t PT: DCR E JNZ POZ ;amíg végig nem értünk Z=0 MOV A,D ;D-ben van a pozitív számok darabszáma STAX B ;B címére elhelyezzük a darabszámot INX B ;a B következő címére kerül a negatív számok darabszáma
;pepita... POP H PUSH H MVI D,0 MVI E,64 NEG: MOV A,M ANI 80H JZ NT INR D NT: DCR E JNZ NEG MOV A,D STAX B INX B ;a B következő címére kerül a 0 értékű számok darabszáma ;0-k száma, pepita POP H MVI D,0 MVI E,64 NULL: MOV A,M 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 JNZ NULT INR D NULT: DCR E JNZ NEG MOV A,D STAX B RET
- Í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.
LXI H,8000H LXI D,8800H LXI B,9000H CALL RUTIN MOV C,0 MOV D,3 STC CMC ELL: LDAX B ADC C MOV C,A DCR D JNZ ELL MOV A,64 CMP C JZ JO STC ;ezt itt a feladat nem kéri, de utólag vhogy el kell tudni dönteni, hogy az összeg valóban 64-e CMC ;ezért ha nem jó akkor CY flag értéke 0 lesz, jó összeg esetén 1 JMP VEGE JO: STC VEGE: END
Egy másik megoldás:
KISERED EQU 8000H KIVONANDO EQU 8800H ELOJEL EQU 9000H LXI H,KISERED LXI D,KIVONANDO ;LXI B,ELOJEL ;ELOJEL=POZITÍVAK, ELOJEL+1=negatívak, ELOJEL+2=nullák CIKLUS: MOV A,M PUSH PSW LDAX D MOV B,A POP PSW SUB B ;AKKUMULÁTORBAN EREDMÉNY MOV M,A JZ NULL JP POZ PUSH H ;(NEGATÍV ÁG) LHLD ELOJEL+1 INX H SHLD ELOJEL+1 POP H JMP ELLEN NULL: PUSH H ;(0 ÁG) LHLD ELOJEL+2 INX H SHLD ELOJEL+2 POP H JMP ELLEN POZ: PUSH H ;(POZITÍV ÁG) LHLD ELOJEL INX H SHLD ELOJEL POP H ELLEN: INX H INX D LXI B,KISERED+64 MOV A,H CMP B JNZ CIKLUS MOV A,L CMP C JNZ CIKLUS LXI B,ELOJEL LXI H,ELOJEL MOV A,M INX H ADD M INX H ADD M CPI 64 JZ JO NEMJO: NOP ;NEM JO!!!!!!!!!! JO: HALT
3. g.)
Írjon assembly szubrutint, amely a HL regiszterpárban kapott címen elhelyezkedő 00h végjelre végződő karakterstringben megkeresi az első '1' 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.
RUTIN: MVI B,00H KERES: MVI A,31H CMP M ;megnézzük, hogy a HL által mutatott címen lévő adat 31H-e JNZ TOV JMP VEGT ;ha megtaláltuk az '1' számjegyet, akkor Z=1 és ugrunk a VEGT (VÉGe és Találtunk) TOV: MOV A,B ;00 végjel figyelésére szolgál CMP M ;ha HL által mutatott címen 00H található, akkor és csak akkor a kivonás eredménye 0 (Z=1) JZ VEGNT ;ugrás a VÉGe és Nem Találtunk részre INX H ;mutató növelése JMP KERES VEGT: STC ;a HL címe ekkor automatikusan a keresett karakterre mutat, így csak a CY flaget kell állítani CMC JMP VEGE VEGNT: STC ;itt is a megfelelő helyre mutat a HL, így csak CY:=1-t állítunk VEGE: RET
Egy másik megoldás:
KC EQU 9100H ;egyéni CIKLUS: MOV A,M CPI 31H JZ TALALT CPI 0 JZ NULLTALALT INX H JMP CIKLUS TALALT: STC CMC JMP VEGE NULLTALALT: STC VEGE: HALT
3. h.)
Í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!
Írjon assembly programrészletet, amely SID=1 esetén várakozzon SID=0-ra, majd SID=0 esetén a fenti szubrutin meghívásával másoljon át 32 bájtot a 9000h memóriacímről a 9150h címre.
RUTIN: PUSH PSW PUSH B MVI B,32 MASOL: XCHG ;DE felcserélése HL-lel LDAX D ;DE (=eredetileg HL) beírása az A-ba XCHG ;visszacsere STAX D ;beírjuk A-t az eredeti DE által mutatott címre INX H INX D DCR B JNZ MASOL POP PSW POP B RET
;programrészlet: VAR: RIM ANI 80H JNZ VAR LXI H,9000H LXI D,9150H CALL RUTIN END
Egy másik megoldás:
VAR: RIM ANI 80H ;10000000B JNZ VAR LXI H,9000H LXI D,9150H CALL MASOL HALT
;HL-ben és DE-ben már megvan a kezdõcímünk.. MASOL: PUSH PSW PUSH B LXI B,32 CIKLUS: MOV A,M STAX D INX H INX D DCX B MOV A,C ORA B JNZ CIKLUS POP B POP PSW RET
3. i.)
Í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!
RUTIN: PUSH PSW PUSH B PUSH D PUSH H MVI B,16 ;a DE-t megnöveljük 16-tal DENOV: INX D DCR B JNZ DENOV MVI B,16 MASOL: LDAX D XCHG STAX D XCHG INX H DCX D DCR B JNZ MASOL POP H POP D POP B POP PSW RET
Egy másik megoldás:
PUSH PSW PUSH B PUSH D PUSH H PUSH H LXI B,16 DAD B MOV B,H MOV C,L XCHG LXI D,15 DAD D XCHG POP H CIKLUS: LDAX D MOV M,A INX H DCX D MOV A,H CMP B JNZ CIKLUS MOV A,L CMP C JNZ CIKLUS POP H POP D POP B POP PSW
3. j.)
Írjon assembly szubrutint, amely a DE regiszterpárban kapott címtől kezdődő 16 bájtban megszámolja a negatív 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!
RUTIN: PUSH PSW PUSH B PUSH D MVI B,16 MVI C,0 SZAMOL: LDAX D ANI 80H JZ NEMNEG INR C ;ha Z=0, akkor negatív a számunk, ekkor növelünk NEMNEG: DCR B JNZ SZAMOL MOV A,C STA 8000H POP D POP B POP PSW RET
Egy másik megoldás:
PUSH PSW PUSH B PUSH D PUSH H LXI H,8000H MVI M,0 MVI B,0 CIKLUS: LDAX D ANI 80H CMP D ;FELESLEGES JZ POZITIV INR M POZITIV:INX D INR B MOV A,B CPI 16 JNZ CIKLUS POP H POP D POP B POP PSW HALT
3. k.)
Í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!
RUTIN: PUSH PSW PUSH B PUSH H PUSH D MVI B,254 LXI D,0 MVI A,0 ELL: PUSH H MOV A,M ;HL által mutatott címen lévő adat betöltése A-ba 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) DAD D ;HL+D -> HL XCHG ;HL cseréje DE-vel (így DE-ben van az ellenőrző összeg) POP H INX H ;cím növelése DCR B JNZ ELL ;amíg végig nem értünk MOV M,D ;D betöltése a HL címre INX H MOV M,E ;a következő byte-ra pedig az E kerül POP D POP H POP B POP PSW RET
Egy másik megoldás:
PUSH PSW PUSH B PUSH D PUSH H XCHG ;DE-ben kezdocim LXI H,0 ;reszosszeg HL-ben MVI A,0 ;itt számoljuk a 254 db-ot CIKLUS: PUSH PSW LDAX D MVI B,0 MOV C,A DAD B INX D POP PSW INR A CPI 254 JNZ CIKLUS MOV A,L STAX D INX D MOV A,H STAX D POP H POP D POP B POP PSW
3. l.)
Í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!
RUTIN: PUSH B PUSH H PUSH D PUSH H XCHG ;HL és DE cseréje MVI H,16 ;16 byte másolására fog sorra kerülni 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) PUSH B MASOL: LDAX D ;DE által mutatot cím tartalma az A-ban lesz STAX B ;az A tartalma a BC címre kiíródik INX D INX B DCR H JNZ MASOL POP B ;a BC-t visszacsökkentjük az eredetire MVI D,16 ELL: LDAX B ;a BC-n és HL-n található byte-okat kivonogatjuk egymásból SUB M JZ HIBA ;ha a kivonás eredménye 1, akkor hiba van DCR D JNZ ELL NOHIBA: XRA A ;Z-t 1-be állítjuk JMP VEGE ;és átugorjuk a HIBA részt HIBA: MOV A,FFH ORA A ;ezzel a Z-t 0-ba állítottuk VEGE: POP D POP H POP B RET
Egy másik megoldás:
RUTIN: PUSH B PUSH D PUSH H XCHG LXI H,0 MVI A,0 CIKLUS: PUSH PSW LDAX D MVI B,0 MOV C,A DAD B INX D POP PSW INR A CPI 15 JNZ CIKLUS LDAX D CMP L ;BE VAN ALLITVA A Z FLAG POP H POP D POP B RET
3. m.)
Írjon Intel 8085 mikroprocesszor assembly nyelvén a PORTOLV szubrutint, amely a a CPU SID jelének 0 -> 1 átmenetére beolvassa 64H I/O című portot és az adatot az akkumulátorban adja vissza a szubrutint meghívó programrésznek.
Í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ó programnak a CPU regisztereket.
PORTOLV: VAR1: RIM ANI 80H JNZ VAR1 ;ha SID=0, akkor Z=1 lesz és akkor mehetünk tovább VAR2: RIM ANI 80H JZ VAR2 ;megvárjuk, míg SID=1 lesz IN 64H RET
OLV32: PUSH PSW PUSH B PUSH D LXI B,2000H MVI D,32 MASOL: CALL PORTOLV STAX B INX B DCR D JNZ MASOL POP D POP B POP PSW RET
Egy másik megoldás:
PORTOLV: RIM ANI 80H JZ PORTOLV IN 64H RET OLV32: PUSH PSW PUSH B PUSH D PUSH H KC EQU 2000H VC EQU 201FH LXI H,KC LXI D,VC+1 CIKLUS: CALL PORTOLV MOV M,A INX H MOV A,L CMP E JNZ CIKLUS MOV A,H CMP D JNZ CIKLUS POP H POP D POP B POP PSW RET
3. n.)
Írja meg a SENDBYTE 8085 assembly szubrutint, amely a következő specifikáció szerint működik: 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!
Hand-shake: rajz
- először megjelenik az érvényes adat a porton
- majd a SOD jel 0 -> 1 átmenete után (némi várakozás után min kb. 320 ns) a SID jel is 0 -> 1-be váltjuk
- 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
- 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
Í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.
SENDBYTE: ;ez túl sok karakternek tűnik :) PUSH PSW VAR: RIM ANI 80H JNZ VAR MOV A,B OUT 20H RIM MVI A,0C0H ;11000000B SIM WSID0: RIM ANI 80H JZ WSID0 RET
;programrészlet LXI D,2345H MVI H,34 MASOL: LDAX D MOV B,A CALL SENDBYTE DCR H JNZ MASOL
Egy másik megoldás:
SENDBYTE: RIM ANI 80H JNZ SENDBYTE MOV A,B OUT 20H RIM ORI C0H ;11000000B SIM VARSID1:RIM ANI 80H JZ VARSID1 RIM ANI 7FH ;01111111B ORI 40H ;01000000B RET
3. o.)
Írjon 8085 assembly szubrutint, amely a következő specifikáció szerint működik:
- 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:
- Ai mod 256 1=<i=<32
- A rutin Z=1-gyel jelezze, ha az ellenőrző összeg helyes, Z=0-val, ha hibás volt. Mindkét esetben az
akkumulátor a helyes (a számított) ellenőrző összeget tartalmazza! (A rutin bármely regiszter értékét elronthatja!)
- Írja meg a 8255-öst felprogramozó szubrutint (A port: 1-es üzemmód, bemenet; B port: 0-ás üzemmód, kimenet; C port:
bemenet)
FELPROG: MOV A,10111001B OUT 83H RET
Írja meg azt az RST 5.5-ös IT rutint, amely a 8001h címen elhelyezkedő byte legmagasabb helyértékű bitjének
bebillentésével jelzi, ha beolvasott egy adatot. Az adat ilyenkor a 8000h memória címen található.
ORG 2CH RST55: LXI D,8001H LDAX D XRI 01H STAX D RET
Í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!
GETBLK: EI MVI B,32 ;32 byte beolvasása MVI C,0 ;az ellenőrző összeg számításához LXI D,9000H BEOLV: IN 80H CALL RST55 STAX D ADD C INX D DCR B JNZ BEOLV LDAX D ;az ellenőrző összeg beolvasása, a 32 byte-os adatblokk után következik CMP C MOV A,C DI RET
Egy másik megoldás:
ORG 2CH:JMP 1000H ORG 1000H: IN 80H MOV M,A PUSH H XCHG ;HL-ben RESZOSSZEG MOV E,A MVI D,0 DAD D ;HL-ben uj reszosszeg XCHG ;DE-ben ............. POP H ;HL-ben cim (9000H) INX H DCR C EI RET
RUTIN: MVI A,B9H ;10111001B OUT 83H LXI H,9000H LXI D,0 MVI C,32 KORBE: MVI A,0 CMP C JNZ KORBE MOV A,M CMP E MOV A,E RET
ORG 2CH:JMP1000H ORG 1000H: LXI H,8001H MOV A,M ANI 01111111B MOV M,A IN 80H LXI H,8000H MOV M,A LXI H,8001H MOV A,M ORI 10000000B MOV M,A EI RET
3. p.)
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. Írja meg az áramkört inicializáló és a vételi folyamatot engedélyező programrészt! Az átvitel paraméterei:
- aszinkron adás és vétel
- egyszeres Baud-rate
- 8 adatbit, páros paritás, 1 STOP bit
- adás letiltva, vétel engedélyezve
;programrész MOV A,01111101B ;119.o./ aszinkron átvitelre vonatkozó Mode Instruction OUT 80H MOV A,11100110B ;121.o./ Command Instruciton OUT 80H ;elvileg ugyanarra a címre kell küldeni, mint a Mode Instr.-t
Í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!
- 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
- arra nem jöttem rá, hogy hogyan lehet ezt állítani, lehet, hogy a feladat szerint feltesszük azt, hogy a megfelelő állapotban van
BEOLV: LXI D,8000H MVI C,32 OLV: IN 80H STAX D INX D DCR C JNZ OLV
4. feladat
4. a.)
;kód ;PC ;adatsín ;/RD v. /WR ;megjegyzés ----------------------------------------------------------------------------------- ORG 0000h direktíva LXI SP,0h 0000 31H /RD 0001 00 /RD 0002 00 /RD SP=0000H RST 7 0003 FFH /RD itt ugrik a 0038H-ra FFFF 00 /WR FFFD 04 /WR ;SP=FFFD HLT hát ez most kimarad! ORG 38h direktíva XRA A 0038 AFH /RD kinullázza A-t, így Z flag=1 lesz LXI H,0F000h 0039 3AH /RD 003A 00H /RD 003B F0H /RD HL=F000H MOV M,A 003C 77H /RD az F000H címre 0-t tölt be ORA M 003D B6H /RD 0 OR 0=0 -> Z=1 JNZ 38h 003E C2H /RD feltétel nem teljesül így csak 1 byte-os az ut. RET 003F C9H /RD PC=0000 , SP=0002
4. f.)
;kód ;PC ;adatsín ;/RD vagy /WR ;megjegyzés -------------------------------------------------------------------- ORG 0000h direktíva LXI H,9000h 0000 21H /RD 0001 00H /RD 0002 90H /RD HL=9000H SPHL 0003 F9H /RD SP=HL=9000H LXI H,0100h 0004 21H /RD 0005 00H /RD 0006 01H /RD HL=0100H PCHL 0007 E9H /RD PC=0100H HLT ez most kimarad! (de később idejutunk) CALL 0102h ez is! (de ide később se jutunk el) ORG 0100h direktíva MVI A,45h 0100 3EH /RD 0101 45H /RD A=45H LXI B,1234h 0102 01H /RD 0103 34H /RD 0104 12H /RD BC=1234H XRA C 0105 A9H /RD A=34 XOR 45 = 00110100 XOR 01000101 ----------- 01110001= 71H =A, Z flag=0 PUSH B 0106 C5H /RD 8FFF 34H /WR 8FFE 12H /WR SP=8FFE XRA B 0107 A8H /RD A=01100010B= 62H , Z flag=0 POP D 0108 D1H /RD 8FFE 12H /RD 8FFF 34H /RD D=1234H HLT 0109 76H /RD JMP 0008h 010A C3H /RD 010B 08H /RD 010C 00H /RD HLT: ez kimarad mert előtte ugrunk az 1. HLT-re (PC=0008), ahol a progi befagy
5. feladat
5. a.)
Az alábbi kódrészlettel a 8000h címen elhelyezkedő 500 byte-os memóriaterület modulo 256-os ellenőrző ö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. Miért?
LXI H,8000h LXI D,500 XRA A ciklus: ADD M INX H DCX D JNZ ciklus MOV M,A
Válasz: a DCX utasítás nem állítja a Z flaget, így a JNZ utasítás nem működik
5. b.)
Egy i8085-ös mikroszámítógép megszakítási rendszerének megvalósításakor i8259A megszakításvezérlőt alkalmaztunk, amely báziscíme 20h. Az alábbi megszakítást úgy szeretnénk megvalósítani, hogy bármelyik másik megszakítás-bemenetre érkező kérés azonnal érvényre juthasson mielőtt maga az IRUT rutin befejeződik. A program hibásan van megírva. Miért? Mit kellene kijavítani?
IRUT: PUSH PSW PUSH B EI OUT 41h IN 40h ADI 1 OUT 40h MVI B,3 CIKL: IN 40h ACI 0 OUT 40h DCR B JNZ CIKL POP B MVI A,20h OUT 20h POP PSW RET
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.
5. c.)
Ugyanaz mint az #5. a.)
5. d.)
Az alábbi kódrészlettel a 8000h címen elhelyezkedő szót (16bit) szeretnénk hozzáadni a 8150h címen elhelyezkedő szóhoz úgy, hogy az eredmény a 8000h címre kerüljön (A szó alacsonyabb helyértékű bájtja (LSB) mindig a kisebb címen helyezkedik el.). A program hibásan működik. Miért? Mit kellene kijavítani?
Osszead: LXI H,8000h LDA 8150h ADD M MOV M,A INX H LDA 8151h ADD M ;itt ADC M kell, mert lehet átvitel a előző byte-ok összadása során MOV M,A RET
6. feladat
Ehhez létezik egy javításokat tartalmazó PDF. Megtekintés.
6. a.)
- 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?
- Kaszkádosítás esetén, bufferelt kapcsolás esetén (62.o./3.5. , 63.o./3.6.3.)
- Ebben az esetben hány ICW parancsbyte-ot kell kiadni és miért?
- 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)
- Miért van szükség ICW3 parancsbyte-ra?
- Mert kaszkádosott megszakításkezelő rendszert használunk
- Miért van szükség ICW4 parancsbyte-ra?
- 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)
6. b.)
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!
MOV A,10101111B ;95.o./5.1 táblázat OUT 93H ;94.o./működési tábla DI
- 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
- 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
6. c.)
Egy vegyesen kaszkádosított 8259-es megszakítási rendszerben a MASTER egység IR2 bemenetére SLAVE áramkör 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, mindkettő nyolcas osztásban.
Adja meg, hogy milyen ICW3 parancsot kell küldeni a MASTER illetve a SLAVE egységeknek!
LXI D,8000H ;MASTER MOV A,0000100B INX D STAX D
LXI H,9001H ;SLAVE, másik módszerrel MOV A,0000010B MOV M,A
- Adja meg, mennyi lesz a MASTER IR6 bemenetére érkező megszakítás szubrutinjának kezdőcíme!
- 802CH (65.o. ADI=0 esetén táblázat)
Adja meg, mennyi lesz a SLAVE IR6 bemenetére érkező megszakítás szubrutinjának kezdőcíme! -902CH (65.o. ADI=0 esetén táblázat)
6. d.)
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 ?
- 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
- FRAMING ERROR (=kerethiba): 0 színtű STOP bitek érkeznek
- PARITY ERROR (=paritás hiba): rossz paritás
6. e.)
Mit jelent a BREAK üzemmód a 8251-es áramkörnél?
- aszinkron üzemmódban folyamatos kiküldhetők a vonalra, ha nincs folyamatban adatkivitel, állapotjelzésre is szolgálhat
Mire alkalmazható?
- felhasználható megszakításkérés jelzésére
Hogyan lehet beállítani?
- beállítása: a Command Instruction 3. bitje, a SBRK =1 esetén a TXD=0 lesz (Break karakter)
6. f.)
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.
0 1 1 1 1 0 0 1 ___ ___ ___ ___ ___ |___| |___ ___|
6. g.)
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?
- Open collector, mivel a kimeneteket összekötöttük, és a rendszer tartalmazott közvetlen felhúzó ellenállást
6. h.)
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?
- Tristate, mivel a kimenetek összekötöttük és a rendszer nem tartalmazott közvetlen felhúzó ellenállást
6. i.)
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?
- 4*8+(8-4)=36
- 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.)
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!
- 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.)
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?
- az ICW 4 parancsbyte 2. bitjével (=M/S) (66.o./3.6.3.)
6. j.)
Egy DMA vezérlő mind a 4 csatornájára egy-egy periféria csatlakozik. Használható-e ilyenkor az 1-es csatorna AUTOLOAD üzemmódban? Indokolja a választ!
- Nem, csak a CH2 és CH3 használható (81.o./4.6.4.)
Programozza fel a DMA vezérlőt AUTOLOAD üzemmódba úgy, hogy a 9000h memóriacímtől kezdődő címre periódikusan 128 byte adatot legyen képes betölteni a perifériából. A 8257-es báziscíme: 70H.
LXI D,9000H MVI B,128 MOV A,10101111B OUT 78H ;beírás A3=1, A2=A1=A0=0 TOLT: IN 78H ;kiolvasás is A3=1, A2=A1=A0=0 STAX D INX D DCR B JNZ TOLT END
6. k.)
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?
- 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 -> 0 átmenet jelzi
- 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
6. l.)
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!
;3,072 Mhz=4800*640 ;640= 0000 0001 | 0100 0000
MOV A,00111110B OUT 93H MOV A,01H OUT 90H MOV A,80H OUT 91H
6. m.)
Egy kaszkádosított 8259-es rendszerben a MASTER egység IR7 és IR6 bemenetére SLAVE áramkörök kapcsolódnak. Adja meg, hogy milyen ICW3 parancsot kell küldeni a Master egységnek!
- 11000000 (66.o./3.6.2.)
Adja meg, hogy milyen ICW3 parancsot kell küldeni Az IR6-ra csatlakozó SLAVE egységnek
- 00000110 (66.o./3.6.2.)
Hogyan tudjuk kijelölni, hogy lesz ICW3 parancs?
- 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)
7. feladat
Ehhez létezik egy javításokat tartalmazó PDF. Megtekintés.
7. a.)
Sorolja fel az i8085 állapotait!
- RUN, WAIT, HALT, HOLD
7. b.)
Szerkesszen gráfot, amely az i8085-ös állapotainak kapcsolatát ábrázolja! A nyilazott ágakra az állapot-változások okait kell felírni.
- RUN -> WAIT: Ready jel 0 szintre vált
- WAIT -> RUN: Ready jel 1-re vált
- RUN -> HALT: HLT parancs kiadásakor
- HALT -> RUN: megszakításkérés érkezésekor
- RUN -> HOLD: HOLD 1-be vált
- HOLD -> RUN: a HOLD jel megszűnése után
- HALT -> HOLD: HOLD igény érkezésekor (HOLD=1)
- HOLD -> HALT: HOLD megszűnése (HOLD=0)
7. c.)
Milyen esetekben kerül a 8085-ös mikroprocesszor HALT állapotból RUN állapotba?
- HALT -> RUN: megszakításkérés érkezésekor, illetve reset hatására
7. d.)
Sorolja fel azokat az eseteket, amikor az INTE FF = 0 értékű lesz!
- DI parancs kiadásakor, reset, megszakítás érvényre jutása után
7. e.)
Sorolja fel azokat az eseteket, amikor az RST7.5 FF = 0 értékű lesz!
- SIM utasítás esetén,ha a 4. bittel töröljük az RST7.5-t (A4=1), illetve RESET után
7. f.)
Az i8085-ös processzor reszetelésekor milyen értékű lesz az INTEFF, és mi lesz a PC tartalma?
- az INTEFF-kat törli, tehát 0 lesz , PC:0000H
7. g.)
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?
- RST 2: 10H
- RST 5: 28H
- RST 5.5: 2CH
- RST 7.5: 3CH
7. h.)
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?
- 9000H, mert először csökkenti az SP értékét a processzor, és csak utána ír a stackre.
7. i.)
Hogyan jelezzük a fordítóprogramnak, hogy a generált kódot az 1698h címtől kezdődően helyezze el?
- ORG 1698H
7. j.)
Hogyan jelezzük a fordítóprogramnak, hogy az 1712h címtől kezdődően helyezze el a „digit” stringet?
ORG 1712H KAR DB "digit"
7. k.)
Hogyan jelezzük a fordítóprogramnak, hogy inicializált vagy inicializálatlan helyfoglalás történik?
- inicializált: DB vagy DW,
- inicializálatlan: DS direktívát használunk
7. l.)
Mi a különbség az EQU 1200h és a DW 1200h direktívák között?
- CIMKE EQU 1200H: értékadás, hivatkozás a CIMKE-vel
- DW 1200H: inicializált helyfoglalás
7. m.)
Sorolja fel az i8085 mikroprocesszor megszakítással kapcsolatos jeleit!
- TRAP, RST 5.5,6.5,7.5, INTR
7. n.)
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?
- tristate, open collector
7. o.)
Miért nem lehet két totem-pole kimenetű áramkör kimeneteit összekötni? Indokolja a választ? (sztem érdemes indokolni:))
- mert az ellenáláskon túl nagy teljesítmény disszipálódna, és ennek eredménye a tönkremenetel
7. p.)
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!
- 10100011
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!
- 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
7. q.)
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.
- Mikor adja át a DMA vezérlőnek a 8085-ös a busz vezérlési jogot? Indokolja a válaszát!
- a HOLD bemenet 1-be váltásakor
- 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!
- 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