4004 4040 MCS48 MCS51 8008 8080 8085 8086 Z80 Z8 Z8000
Transkrypt
4004 4040 MCS48 MCS51 8008 8080 8085 8086 Z80 Z8 Z8000
MIKROPROCESOR Z80 Pochodzenie 4004 (1971) 8008 (1972) 4040 8080 6800 (1974) (1974) (1974) 6500 8085 MCS48 (1976) (1977) MCS51 (1980) (1975) Z80 6809 (1977) (1977) 8086 Z8 6801 (1978) (1978) (1978) Z8000 68000 (1979) (1980) Walory uŜytkowe Z80: • 8-bitowa magistrala danych; • 16-bitowa magistrala adresowa - przestrzeń adresowa 64kB; • bogata gama rozkazów: ⇒ przesyłania bajtów i słów 2-bajtowych; ⇒ przesyłania i przeszukiwania bloków informacji; ⇒ operacje arytmetyczno-logiczne na bajtach i słowach 2-bajtowych; ⇒ operacje bitowe (BIT, SET, RES); ⇒ 16-bitowe skoki i wywołania procedur, bezwarunkowe i warunkowe; ⇒ skoki relatywne (1B w U2); ⇒ operacje we/wy; ⇒ rozkazy sterujące stanem mikroprocesora. • 5 trybów adresowania argumentów i wyników operacji; • 2 linie przerwań zewnętrznych: ⇒ niemaskowalne NMI i maskowalne INT; ⇒ 3 tryby obsługi przerwań maskowalnych; • 12 rejestrów roboczych 8-bitowych, ogólnego przeznaczenia, które moŜna łączyć w pary, podzielonych na 2 alternatywne zestawy, 2 16-bitowe rejestry indeksowe, 16-bitowy PC i SP, rejestr I wektora przerwań, rejestr R odświeŜania DRAM, zdwojone: akumulator A i rejestr flag F; • wbudowany mechanizm odświeŜania pamięci dynamicznych DRAM; • jednofazowy sygnał taktujący mikroprocesor 2.5MHz - Z80 4MHz - Z80A 6MHz - Z80B 8MHz - Z80H • sygnały zewnętrzne zgodne z poziomami napięć logicznych TTL; • jedno napięcie zasilania 5V. L.J.Grodzki -1- Struktura wewnętrzna Z80 wewnętrzna szyna danych EXX A A’ RR DR US tmp F F’ D0-D7 MPX I EX B D H at C E L B’ C’ D’ E’ H’ L’ IX IY SP PC ALU R +1 + wewnętrzna szyna adresów wewnętrzna szyna sterowań Słowo stanu procesora S Z - H - P/V N S - flaga znaku, najbardziej znaczący bit wyniku operacji Z - flaga zera, ustawiana gdy wynik operacji równy 0 H - flaga przeniesienia połówkowego przy dodawaniu (z bitu 3 na 4) i poŜyczki przy odejmowaniu (z bitu 4 na 3) P/V - flaga parzystości / nadmiaru: po operacjach logicznych =1 przy parzystej liczbie „1” w wyniku; po operacjach arytmetycznych =1 przy nadmiarze; N - flaga odejmowania, ustawiana przy operacjach odejmowania, a zerowana przy operacjach dodawania C - flaga przeniesienia -2- C Opis wyprowadzeń mikroprocesora Z80 (obudowa DIL40) D0-D7 - we/wy, 3-stanowe, 8-bitowa magistrala danych; A0-A15 - wy, 3-stanowe, 16-bitowa magistrala adresów; /M1 - wy, sygnalizuje przy /MREQ = 0 pobieranie bajtu kodu rozkazu z pamięci, a przy /IORQ = 0 - wejście w obsługę przerwania maskowalnego; /MREQ - wy, 3-stanowe, sygnalizuje operacje dostępu do pamięci; /IORQ - wy, 3-stanowe, sygnalizuje operacje dostępu do układów we/wy (portów); /RD,/WR - wy, 3-stanowe, sygnały określające kierunek transmisji informacji A11 A10 odpowiednio: odczyt do µP i zapis z µP; A12 A9 /RFSH - wy, jego niski stan przy /MREQ = 0 A13 A8 sygnalizuje obecność na liniach A0-A6 A14 A7 adresu odświeŜania DRAM; A15 A6 /WAIT - we, słuŜy do sygnalizowania CLK A5 mikroprocesorowi braku gotowości D4 A4 układów pamięci lub portów do D3 A3 przesyłania informacji; D5 A2 /NMI - we, wejście przerwania niemaskowalnego D6 A1 (aktywne opadającym zboczem); +5V A0 /INT - we, wejście przerwania maskowalnego D2 GND (aktywne poziomem); D7 RFSH /BUSREQ - we, wejście sygnału od DMA Ŝądania D0 M1 zwolnienia przez µP magistrali systemu; D1 RESET /BUSACK - wy, potwierdzenie zwolnienia INT BUSREQ magistrali systemu przez µP; NMI WAIT /HALT - wy, wyjście sygnalizujące niskim HALT BUSACK poziomem wykonywanie przez µP MREQ WR rozkazu HALT; IORQ RD /RESET - we, wejście sygnału zerowania µP; CLK - we, sygnał taktujący pracę µP; 5V,GND - linie zasilające. L.J.Grodzki -3- Schemat blokowy cyklu pracy Z80 T koniec rozkazu ? N RR:=M(PC) PC:=PC+1 praca DR wykonanie rozkazu cały kod rozkazu ? T N koniec cyklu masz.? N BUSRQ=0? N T T BRFF:=not(BUSRQ) BRFF:=1 tryb DMA BUSACK:=0 N koniec rozkazu ? T T N BUSRQ=1? N NMI=0? NMIFF:=1 T N INT=0? BUSACK:=1 BRFF:=0 T N IFF1=1? T INTFF:=1 T N BRFF=1? tryb DMA BUSACK:=0 T NMIFF=1? N IFF2:=IFF1 IFF1:=0 PC→ →stos PC:=66h NMIFF:=0 N BUSRQ=1? T T BUSACK:=1 BRFF:=0 INTFF=1? N -4- IFF1:=0 PC→ →stos PC:=adres proc.obs. przerwania INTFF:=0 Cykle maszynowe cykl pobrania pierwszego bajtu kodu rozkazu M1 CLK T1 A0..A15 T2 Tw T3 PC T4 T1 adres odświeŜ. (A0..A6) MREQ RD WAIT M1 RFSH D0..D7 kod cykl zwolnienia magistrali (tryb DMA) cykl maszynowy CLK TL tryb DMA Tx BUSREQ BUSACK A0..A15 D0..D7 RD WR MREQ IORQ RFSH HALT M1=high L.J.Grodzki -5- Tx Tx T1 cykl odczytu/zapisu bajtu pamięci CLK T1 A0..A15 T2 Tw T3 T1 ADRES MREQ WAIT O D C Z Y T RD D0..D7 DANEwe Z A P I S WR D0..D7 DANEwy cykl odczytu/zapisu portu zewnętrznego CLK T1 A0..A15 Tw* T2 ADRES PORTU Tw T3 T1 (A0..A7) IORQ WAIT RD D0..D7 DANEwe Z A P I S WR D0..D7 DANEwy cykl zatrzymania (HALT) M1 CLK M1 T1 T2 M1 T3 HALT NMI -6- O D C Z Y T T4 T1 Tryby adresowania argumentów i wyników operacji w Z80 1. Adresowanie rejestrowe (implikowane) ld a,b kod: 78h 0 1 1 1 1 0 0 0 d d,s: B C D E H L M A kod: 0 1 2 3 4 5 6 s 7 2. Adresowanie natychmiastowe ld a,25 kod: 3E 19 ld hl,8120h kod: 21 20 81 A H L 3. Adresowanie bezpośrednie ld a,(8120h) kod: 3A 20 81 PAO A 8120h: XX 4. Adresowanie rejestrowe pośrednie ld hl,8120h ld a,(hl) kod: 3E H L 81 20 PAO A 8120h: XX 5. Adresowanie indeksowe (bazowe) ld ix,8100h ld a,(ix+20h) DD 21 00 81 DD 7E 20 ld iy,8180h ld a,(iy-60h) IX/IY PAO 8120h: + L.J.Grodzki -7- XX FD 21 80 81 FD 7E A0 A Stos mikroprocesora Z80 Cechy: • stos programowy typu LIFO; • dowolna alokacja w przestrzeni adresowej 64kB PAO (musi być w RAM); • dowolny rozmiar (wielkość) - ilość informacji na stosie jest ograniczona tylko wielkością dostępnego RAM; • jednostką operacji na stosie jest słowo dwubajtowe (starszy bajt jest umieszczony w komórce RAM o wyŜszym adresie, a młodszy - w komórce o niŜszym adresie); • przy zapisie stos „narasta” w kierunku malejących adresów; • 16-bitowy SP wskazuje zawsze na ostatnio zapisany bajt na stosie; • dostęp do stosu realizowany jest: − automatycznie przy wejściu w wywoływaną procedurę lub procedurę obsługi przerwania; − programowo, rozkazami PUSH, POP, EX (SP). zapis na stos: SP := SP-1 M(SP) := ppH SP := SP-1 M(SP) := ppL SP PAO ppH ppL SP odczyt ze stosu: ppL := M(SP) SP := SP+1 ppH := M(SP) SP := SP+1 Zerowanie (reset) mikroprocesora Z80 Wywoływany jest przez niski sygnał na wejściu /RESET trwający przez minimum 3 okresy przebiegu taktującego CLK. Reset powoduje: • ustawienie linii zewnętrznych w stan wysokiej impedancji lub wysoki; • PC:=0; • SP:=0; • zablokowanie przerwań maskowalnych INT; • ustawienie podstawowego trybu obsługi przerwań maskowalnych. -8- LISTA ROZKAZÓW MIKROPROCESORA Z80 1. Rozkazy przesłań jednobajtowych LD r1,r2 ; r1 ← r2 , r1,r2 = A,B,C,D,E,H,L LD r1,(HL) ; r1 ← M(HL) LD r1,(rx+dd) ; r1 ← M(rx+ddU2) LD (HL),r2 ; M(HL) ← r2 LD (rx+dd),r2 ; M(rx+ddU2) ← r2 LD r,n ; r ← n , r = A,B,C,D,E,H,L,(HL), (IX+dd), (IY+dd) ; n - stała jednobajtowa LD A,(BC) ; A ← M(BC) LD A,(DE) LD (BC),A LD (DE),A LD A,(adr) ; A ← M(adr) , adr - adres 16-bitowy LD (adr),A ; M(adr) ← A LD A,I ;A←I LD I,A ;I←A LD A,R ;A←R LD R,A ;R←A rx = IX,IY , ddU2 = -128..127 ; A ← M(DE) ; M(BC) ← A ; M(DE) ← A 2. Rozkazy przesłań dwubajtowych LD pp,nn ; pp ← nn , pp = BC,DE,HL,SP,IX,IY ; ppL ← nnL , ppH ← nnH , nn - stała 2-bajtowa LD pp,(adr) ; ppL ← M(adr) , ppH ← M(adr+1) LD (adr),pp ; M(adr) ← ppL , M(adr+1) ← ppH LD SP,pp’ ; SP ← pp’ , pp’ = HL,IX,IY PUSH pp” ; SP:=SP-1, M(SP) ← pp”H , SP:=SP-1, M(SP) ← pp”L ; pp” = AF,BC,DE,HL,IX,IY POP pp” L.J.Grodzki ; pp”L ← M(SP) , SP:=SP+1 , pp”H ← M(SP) , SP:=SP+1 -9- Ilustracja działania rozkazów przesłań: A 11100011 przed ld 10111001 przed: B A 10111001 11100011 a,b ld po 10111001 C przed a,12 10111001 ld 00001100 po b,’1’ 00110001 HL 32h 81h ld 22h c,(hl) po: 88h przed: B 81h 8121h: 89h 8122h: 88h 8123h: 87h 8121h: 89h 8122h: 88h 8123h: 87h 22h C IY 32h 81h ld 1Dh c,(iy+5) po: 88h 81h przed: 1Dh HL 12h 34h ld 8100h: 30h 8101h: 40h 8100h: 34h 8101h: 12h (8100h),hl po: 12h przed: BC 23h 34h push 7Fh bc po: BC 23h SP 8010h 88h xx xx 7Fh xx xx SP SP 800Eh 800Eh RAM 8010h: przed: DE 8010h: 800Eh: RAM 88h 23h 7Fh 88h 23h 7Fh - 10 - de po: DE 23h 7Fh SP RAM 800Eh: pop 8010h RAM 8010h: 88h 23h 7Fh 3. Rozkazy zamiany EXX ; przełączenie alternatywnych rejestrów BCDEHL EX AF,AF’ ; przełączenie alternatywnych par AF EX DE,HL ; zamiana: D ↔ H , E ↔ L EX (SP),HL ; zamiana: M(SP+1) ↔ H , M(SP) ↔ L EX (SP),IX ; zamiana: M(SP+1) ↔ IXH , M(SP) ↔ IXL EX (SP),IY ; zamiana: M(SP+1) ↔ IYH , M(SP) ↔ IYL 4. Jednobajtowe rozkazy arytmetyczno-logiczne ADD A,s ; A:=A+s ; s = A,B,C,D,E,H,L,(HL),(IX+dd),(IY+dd),n ADC A,s ; A:=A+s+CY SUB s ; A:=A-s SBC A,s ; A:=A-s-CY CP s ;A?s: relacja CY A<s A=s A>s Z 1 0 0 0 1 0 AND s ; A:=A ∧ s OR s ; A:=A ∨ s XOR s ; A:=A ⊕ s INC s’ ; s’:=s’+1, s’=A,B,C,D,E,H,L,(HL),(IX+dd),(IY+dd) DEC s’ ; s’:=s’-1 CPL ; A:= not(A) NEG ; A:= (-A)U2 inaczej: A:=0-A DAA ; korekcja dziesiętna po operacji na BCD, ;np: ld a,18h ; ld b,25h ; add a,b ;A:=3Dh ; daa ;A:=43h L.J.Grodzki - 11 - Ilustracja działania rozkazów arytmetycznych: CY A = -29 x 11100011 B = -71 przed add 1 10011100 S P/V Z H N 10111001 x x x x x 10111001 1 0 0 0 0 S P/V Z H N 10111001 x x x x x 10111001 0 1 0 0 0 B = -71 S P/V Z H N 10111001 x x x x x 10111001 0 1 0 0 0 S P/V Z H N 00111001 x x x x x 00111001 1 0 0 1 1 S P/V Z H N 00111001 x x x x x 00111001 1 0 0 1 1 S P/V Z H N 10111111 x x x x x 10111111 0 0 1 1 1 a,b po A = -100 CY A = -63 x 11000000 B = -71 przed add 1 01111001 a,b po A = 121 CY A = -63 1 11000000 przed adc 1 01111010 a,b po A = 122 CY A = 192 x 11000000 D = 57 przed sub 0 10000111 d po A = 135 CY A = 192 1 11000000 D = 57 przed sbc 0 10000110 a,d po A = 134 CY A = 192 1 11000000 D = 191 przed sbc 0 00000000 a,d po A=0 - 12 - Ilustracja działania rozkazów logicznych: CY A = C0h x 11000000 D =39h przed and 0 00000000 S P/V Z H N 00111001 x x x x x 00111001 0 1 1 1 0 S P/V Z H N d po A=0 CY A = C0h x 11000000 C = 79h przed and 0 01000000 01111001 x x x x x 01111001 0 0 0 1 0 D = 39h S P/V Z H N 00111001 x x x x x 00111001 1 1 0 0 0 B = 33h S P/V Z H N 00110011 x x x x x 00110011 0 1 0 0 0 c po A = 40h CY x A = C0h 11000000 przed or 0 11111001 d po A = F9h CY A = 66h x 01100110 przed or 0 01110111 b po A = 77h CY A = 66h x 01100110 przed xor 0 01010101 B = 33h S P/V Z H N 00110011 x x x x x 00110011 0 1 0 0 0 00110011 0 1 0 0 0 b po A = 55h ponownie 0 01100110 xor b A = 66h L.J.Grodzki - 13 - 5. Rozkazy obrotów i przesunięć ; s’=A,B,C,D,E,H,L,(HL),(IX+dd),(IY+dd) RLC s’ RLCA RL ; jak RLC s’ RLA RRC s’ s’ RRA SRA s’ ← s’ ← 0 CY 7 ← s’ ← 0 CY 7 → s’ → 0 CY 7 → s’ → 0 A ; ; jak RR 7 A ; ; jak RRC CY A ; ; jak RL RRCA RR ; A ; → 7 s’ → 0 CY CY ; np. rozkazy: sra h ; rr l ; są równowaŜne dzieleniu przez 2 liczby ; 2-bajtowej ze znakiem SRL s’ ; SLA s’ ; 0 CY 7 → s’ → 0 7 ← s’ ← 0 0 HL A RLD ; RRD ; 7 4 3 0 7 4 3 0 HL A 7 4 3 - 14 - 0 7 4 3 0 6. Rozkazy bitowe SCF ; CY:=1 CCF ; CY:=not(CY) BIT b,s’ ; Z:=not(s’.b) , numer bitu b = 0..7 SET b,s’ ; s’. b:=1 s’=A,B,C,D,E,H,L,(HL),(IX+dd),(IY+dd) RES b,s’ ; s’.b := 0 7. Rozkazy arytmetyki 16-bitowej ADD HL,pp ; HL:=HL+pp , pp = BC,DE,HL,SP ADD IX,pp ; IX:=IX+pp , pp = BC,DE,IX,SP ADD IY,pp ; IY:=IY+pp , pp = BC,DE,IY,SP ADC HL,pp ; HL:=HL+pp+CY, pp = BC,DE,HL,SP SBC HL,pp ; HL:=HL-pp-CY , pp = BC,DE,HL,SP INC pp’ ; pp’:=pp’+1 , pp’ = BC,DE,HL,SP,IX,IY DEC pp’ ; pp’:=pp’-1 , pp’ = BC,DE,HL,SP,IX,IY 8. Rozkazy blokowego przepisywania i przeszukiwania LDI ; M(DE) ← M(HL), HL:=HL+1, DE:=DE+1, BC:=BC-1 LDD ; M(DE) ← M(HL), HL:=HL-1, DE:=DE-1, BC:=BC-1 ; w obu rozkazach P/V:=1 gdy BC ≠ 0 LDIR ; powtarzanie operacji LDI aŜ do BC = 0 , P/V:=0 LDDR ; powtarzanie operacji LDD aŜ do BC = 0 , P/V:=0 CPI ; porównanie A ? M(HL), HL:=HL+1, BC:=BC-1 CPD ; porównanie A ? M(HL), HL:=HL-1, BC:=BC-1 CPIR ; powtarzanie operacji CPI aŜ do M(HL)=A lub BC = 0 CPDR ; powtarzanie operacji CPD aŜ do M(HL)=A lub BC = 0 ; w rozkazach porównania: P/V:=1 gdy BC ≠ 0 ; L.J.Grodzki Z:=1 gdy A=M(HL) - 15 - Przykład wykorzystania rozkazów LDIR oraz LDDR Procedura kopiująca „ilość” bajtów począwszy od adresu „skąd” pod adres „dokąd”. MoŜliwe przypadki: 1. dokąd→ 2. skąd→ i l o ś ć dokąd ≤ skąd LDIR ld ld ld call ..... przepisz:push and sbc pop jr add dec ex add dec ex lddr ret etldir: ldir ret i l o ś ć skąd→ 3. skąd→ dokąd→ dokąd→ dokąd ≥ skąd+ilość LDIR lub LDDR skąd < dokąd ≤ skąd+ilość LDIR LDDR ..... bc,ilosc de,dokad hl,skad przepisz hl a hl,de hl nc,etldir hl,bc hl de,hl hl,bc hl de,hl ; przechowanie wartości HL na stosie ; CY:=0 ; CY=1 gdy skad < dokad ; skok gdy dokad ≤ skad ; skad’ := skad+ilosc -1 ; dokad’ := dokad+ilosc -1 ; przepisanie od końca ; przepisanie normalne - 16 - i l o ś ć 9. Rozkazy sterujące NOP ; pusty rozkaz „nic nie rób” HALT ; zatrzymanie mikroprocesora DI ; zablokowanie przerwań maskowalnych EI ; odblokowanie przerwań maskowalnych IM m ; wybór trybu obsługi przerwań maskowalnych, m = 0,1,2 10. Rozkazy skoków JP adr ; PC:=adr , adr - adres 16-bitowy JP w,adr ; jeŜeli w to PC:=adr JP (HL) ; PC:=HL JP (IX) ; PC:=IX JP (IY) ; PC:=IY JR adrel ; PC:=PC+adrel JR w’,adrel ; jeŜeli w’ to PC:=PC+adrel , DJNZ adrel warunek w Z NZ C NC PO PE P M spełniony gdy flaga Z=1 Z=0 CY = 1 CY = 0 P/V = 0 P/V = 1 S=0 S=1 w’ = Z , NZ , C , NC ; B:=B-1, jeŜeli B≠0 to PC:=PC+adrel Ilustracja działania rozkazu ze skokiem relatywnym: tekst programu: ld b,10 kod programu: 330h: 06h 0Ah powtorz: ex (sp),hl 332h: E3h ex (sp),hl 333h: E3h djnz powtorz 334h: 10h FCh 336h+FCh=332h (FCh ≡ -4) ld L.J.Grodzki a,(bc) 336h: - 17 - 0Ah Przykład realizacji tzw. skoku z przełącznikiem fragment programu realizujący algorytm „skoku z przełącznikiem” fragment kodu przykładowego programu ;A = wartość parametru z przedziału 0..4 ld e,a ld d,0 ; DE = wartość ld hl,tabskok add hl,de add hl,de ; HL → mł. bajt adresu skoku ld e,(hl) inc hl ld d,(hl) ; DE = adres skoku ex de,hl jp (hl) ; skok pod wybrany adres tabskok: defw adr1,adr2,adr3,adr4,adr5 0E9h jp adr1L tabskok adr1H adr2L tabskok+2 adr2H adr3L tabskok+4 adr3H adr4L tabskok+6 adr4H adr5L tabskok+8 adr5H 11. Rozkazy wywołań procedur i powrotów CALL adr ; symulowanie PUSH PC, PC:=adr CALL w,adr ; jeŜeli w to: CALL adr , RST ; 1-bajtowe wywołanie procedury spod adresu ; k = 00, 08h, 10h, 18h, 20h, 28h, 30h, 38h k RET RET warunek w - j.w. ; symulowanie POP PC w ; jeŜeli w to: RET RETI ; powrót z procedury obsługi przerwania maskowalnego RETN ; powrót z procedury obsługi przerwania niemask. Przykład: org 1100h stos: 1100: 310080 ld sp,8000h 8000: 1103: CD8020 call 2080h 7FFF: 11h adres 1106: 3E07 ld a,7 7FFE: 06h powrotu - 18 - (hl) xx 12. Rozkazy we/wy jednobajtowe: IN ; A ← Port(p) , p = 00h..0FFh A,(p) OUT (p),A ; Port(p) ← A , IN ; r ← Port(BC) , r = B,C,D,E,H,L,A r,(C) ; Port(BC) ← r, OUT (C),r p→A7..A0 BC→A15..A0 blokowe (w rozkazach tych BC→A15..A0): INI ; M(HL) ← Port(BC) , HL:=HL+1 , B:=B-1 , Z:=1 gdy B:=0 IND ; M(HL) ← Port(BC) , HL:=HL-1 , B:=B-1 , Z:=1 gdy B:=0 INIR ; powtarzanie INI aŜ do B = 0 , Z:=1 INDR ; powtarzanie IND aŜ do B = 0 , Z:=1 OUTI ; Port(BC) ← M(HL) , HL:=HL+1 , B:=B-1 , Z:=1 gdy B:=0 OUTD ; Port(BC) ← M(HL) , HL:=HL-1 , B:=B-1 , Z:=1 gdy B:=0 OTIR ; powtarzanie OUTI aŜ do B = 0 , Z:=1 OTDR ; powtarzanie OUTD aŜ do B = 0 , Z:=1 13. Rozkazy nieoficjalne LD LD ADD ADC SUB SBC INC SLI RLC RRC RL RR SLA SRA SRL SLI SET RES r’,rx’ rx’,r’ A,rx’ A,rx’ rx’ A,rx’ rx’ s’ (RX+dd),r” (RX+dd),r” (RX+dd),r” (RX+dd),r” (RX+dd),r” (RX+dd),r” (RX+dd),r” (RX+dd),r” b,(RX+dd),r” b,(RX+dd),r” L.J.Grodzki ; r’ = B,C,D,E,HX,LX,A przy rx’ = HX,LX albo ; r’ = B,C,D,E,HY,LY,A przy rx’ = HY,LY AND rx’ OR rx’ XOR rx’ CP rx’ DEC rx’ ; ≡ SLA s’ , INC s’ , s’=A,B,C,D,E,H,L,(HL),(IX+dd),(IY+dd) ; wynik operacji trafia takŜe do rejestru ; r” = A,B,C,D,E,H,L , RX = IX , IY ; dd - 1-bajtowe przesunięcie w U2 ; b = 0..7 - numer bitu - 19 - Wpływ wykonania rozkazów na stan rejestru flag rozkaz S Z H PV N C S Z H PV N C ADD A,s V 0 SUB s ↔ ↔ ↔ ↔ ↔ ↔ ↔ V 1 ↔ ADC A,s SBC A,s INC s ↔ ↔ ↔ V 0 = DEC s ↔ ↔ ↔ V 1 = CP s V 1 NEG ↔ ↔ ↔ ↔ ↔ ↔ ↔ V 1 ↔ AND s 0 0 OR s 0 0 ↔ ↔ 1 P ↔ ↔ 0 P XOR s DAA P = CPL = = 1 = 1 = ↔ ↔ ↔ ↔ ADD HL,pp = = x = 0 ↔ ADC HL,pp ↔ ↔ x V 0 ↔ ADD IX,pp SBC HL,pp ↔ ↔ x V 1 ↔ ADD IY,pp RLA = = 0 = 0 ↔ RL s 0 ↔ ↔ ↔ 0 P RLCA RLC s RRA RR s RRCA RRC s SRL s SLA s SRA s RLD 0 = LD A,I ↔ ↔ 0 P ↔ ↔ 0 IF1 0 = RRD LD A,R SCF = = 0 = 0 1 CCF = = x = 0 ↔ BIT b,s x ↔ 1 x 0 = IN r,(C) P 0 = ↔ ↔ ↔ INI x ↔ x x 1 x INIR x 1 x x 1 x IND INDR OUTI OTIR OUTD OTDR CPI x ↔ x ↔ 1 = LDI x x 0 ↔ 0 = CPIR LDD CPD LDIR x x 0 0 0 = CPDR LDDR oznaczenia: ↔ - zmieniana zgodnie z wynikiem operacji; 1 - ustawiana; 0 - zerowana; = - nie zmieniana; P - sygnalizuje parzystość; V - sygnalizuje nadmiar; x - stan nieistotny; IF1 - stan przerzutnika IFF1 zezwolenia na przerwania maskowalne; r - w rozkazie IN r,(C) oznacza: B, C, D, E, H lub L (rozkaz IN A,(C) nie zmienia flag). - 20 - Zasady programowania w asemblerze Z80 (i nie tylko) 1. Wyzerowanie mikroprocesora sygnałem /RESET powoduje rozpoczęcie realizacji programu od PC=0000h (istnieją rozwiązania sprzętowe wymuszające na szynie adresów po /RESET inny niŜ wymieniony adres, a tylko niektóre mikroprocesory startują od niezerowego stanu PC). 2. Jednym z pierwszych rozkazów wykonywanych przez mikroprocesor po zerowaniu musi być rozkaz inicjujący SP. 3. Podczas inicjalizacji systemu (programowanie układów współpracujących z mikroprocesorem, inicjacja wartości początkowych zmiennych, wektorów przerwań, systemu obsługi przerwań) przerwania muszą być zablokowane. 4. Procedury obsługi przerwań powinny na swym początku składować na stosie zawartości rejestrów i zmiennych, na których będą operować, aby móc je odtworzyć przed zakończeniem obsługi przerwania. 5. Nie stosować rozkazów mikroprocesora z listy „nieoficjalnej”. 6. Przerwanie niemaskowalne /NMI powoduje wywołanie procedury jego obsługi zawsze od adresu 0066h i procedura ta winna kończyć się rozkazem RETN. 7. Przy pracy w trybie 1 obsługi przerwań maskowalnych /INT przerwanie powoduje wywołanie procedury jego obsługi zawsze od adresu 0038h. 8. Tablica wektorów przerwań musi być alokowana od adresu parzystego (najlepiej od adresu który modulo 16 daje 0). 9. Procedury obsługi przerwań w trybie 2 (wektorowym) muszą kończyć się rozkazem RETI. L.J.Grodzki - 21 - 1. Konwersja NB na BCD – metodą tablicy wag bitów dla 1 bajtu: L=0..0FFh → LBCD=0..255 (3 cyfry BCD - 2 bajty) Algorytm: TAB - 8 elementowa tablica wag bitów w BCD: i:=0 LBCD:=0 N Li = 1 ? T LBCD[0]:= LBCD[0]+TAB[i,0] korekcja BCD LBCD[1]:= LBCD[1]+TAB[i,1]+CY korekcja BCD i:=i+1 N i =8 ? T i,0 i,1 i=0 0 1 0 0 i=1 0 2 0 0 i=2 i=3 0 4 0 8 0 0 0 0 i=4 1 6 0 0 i=5 i=6 3 2 0 0 6 4 0 0 i=7 2 8 0 1 ld a,(liczba) ;przygotowanie parametru ld c,a ;w rej.C call binbcd ;wywolanie procedury . . . ;procedura konwersji NB->BCD dla liczb 1-bajtowych ;parametry: C=liczba L w NB; ;wyniki: DE=liczba LBCD; ;zmiany: AF binbcd: push bc ;przechowanie rejestrow push hl ;na stosie ld de,0 ;LBCD:=0 ld hl,tabwag ;HL->tablica wag w BCD ld b,8 ;licznik bitow bb1: rr c jr nc,bb2 ;test bitu ld a,e ;A=LBCD[0] add a,(hl) ;A:=LBCD[0]+TAB[i,0] daa ld e,a ;odeslanie sumy do rej.E inc hl ;HL->starszy bajt TAB[i] ld a,d ;A=LBCD[1] adc a,(hl) ;A:=LBCD[1]+TAB[i,1]+CY daa ld d,a ;odeslanie sumy do rej.D jr bb3 bb2: inc hl ;przejscie do nastepnego bb3: inc hl ;elementu tablicy wag djnz bb1 pop hl ;odtworzenie rejestrow pop bc ;ze stosu ret tabwag: dwl 0001h,0002h,0004h,0008h,0016h,0032h,0064h,0128h - 22 -