Mikroprocesor Z80 lista rozkazów
Przegląd listy rozkazów Lista rozkazów - spis treści 2/34 Przegląd listy rozkazów Rozkazy przesłań 1-bajtowych Rozkazy przesłań 2-bajtowych Rozkazy zamiany Rozkazy arytmetyczno-logiczne 1-bajtowe Rozkazy przesunięć i obrotów Rozkazy bitowe Rozkazy arytmetyki 16-bitowej Rozkazy operacji blokowych Rozkazy skoków Wywołania procedur i powroty Operacje we/wy Rozkazy sterujące Wpływ rozkazów na flagi Zasady programowania w asemblerze Z80 Przykłady programowania
Z80 - lista rozkazów 3/34 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 (HL),r2 ; M(HL) r2 LD r,n ; r n , r = A,B,C,D,E,H,L,(HL), (IX+dd), (IY+dd) ; n - stała jednobajtowa
Z80 - lista rozkazów 4/34 LD r1,(rx+ddU2) ; r1 M(rx+ddU2) rx = IX,IY , ddU2 = -128..127 LD (rx+ddU2),r2 ; M(rx+ddU2) r2 LD A,(BC) ; A M(BC) LD A,(DE) ; A M(DE) LD (BC),A ; M(BC) A LD (DE),A ; M(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
Z80 - lista rozkazów 5/34 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) , adr - adres 16-bitowy LD (adr),pp ; M(adr) ppL , M(adr+1) ppH LD SP,pp’ ; SP pp’ , pp’ = HL,IX,IY
Z80 - lista rozkazów 6/34 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” ; pp”L M(SP) , SP:=SP+1 , pp”H M(SP) , SP:=SP+1
Z80 - lista rozkazów 7/34 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
Z80 - lista rozkazów 8/34 4. Jednobajtowe rozkazy arytmetyczno-logiczne ADD A,s ; A:=A+s s = A,B,C,D,E,H,L,(HL),(IX+ddU2),(IY+ddU2),n ADC A,s ; A:=A+s+CY
Z80 - lista rozkazów 9/34 SUB s ; A:=A-s s = A,B,C,D,E,H,L,(HL),(IX+ddU2),(IY+ddU2),n SBC A,s ; A:=A-s-CY
Z80 - lista rozkazów 10/34 CP s ; A ? s : relacja CY Z ; A < s 1 0 ; A = s 0 1 ; A > s 0 0 INC s’ ; s’:=s’+1, s’=A,B,C,D,E,H,L,(HL),(IX+ddU2),(IY+ddU2) DEC s’ ; s’:=s’-1 DAA ; korekcja dziesiętna po operacji na BCD, ;np: ld a,18h ; ld b,25h ; add a,b ;A:=3Dh ; daa ;A:=43h NEG ; A:= (-A)U2 inaczej: A:=0-A
Z80 - lista rozkazów 11/34 AND s ; A:=A s s = A,B,C,D,E,H,L,(HL),(IX+ddU2),(IY+ddU2),n
Z80 - lista rozkazów 12/34 OR s ; A:=A s s = A,B,C,D,E,H,L,(HL),(IX+ddU2),(IY+ddU2),n
Z80 - lista rozkazów 13/34 XOR s ; A:=A s s = A,B,C,D,E,H,L,(HL),(IX+ddU2),(IY+ddU2),n CPL ; A:= not(A)
5. Rozkazy obrotów i przesunięć Z80 - lista rozkazów 14/34 5. Rozkazy obrotów i przesunięć ; s’=A,B,C,D,E,H,L,(HL),(IX+ddU2),(IY+ddU2) RLC s’ RLCA ; jak RLC A RL s’ RLA ; jak RL A RRC s’ RRCA ; jak RRC A RR s’ RRA ; jak RR A CY 7 s’ 0 CY 7 s’ 0 CY 7 s’ 0 CY 7 s’ 0
Z80 - lista rozkazów 15/34
Z80 - lista rozkazów 16/34 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+ddU2),(IY+ddU2) RES b,s’ ; s’.b := 0
Z80 - lista rozkazów 17/34 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
Z80 - lista rozkazów 18/34 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 ; Z:=1 gdy A=M(HL)
Przykład wykorzystania rozkazów LDIR oraz LDDR Z80 - lista rozkazów 19/34 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: ld bc,ilosc ld de,dokad ld hl,skad call przepisz LDDR
Z80 - lista rozkazów 20/34 przepisz:push hl ; przechowanie HL na stosie and a ; CY:=0 sbc hl,de ; CY=1 gdy skad < dokad pop hl jr nc,etldir ; skok gdy dokad skad add hl,bc dec hl ; skad’ := skad+ilosc -1 ex de,hl ; HL := dokad dec hl ; HL := dokad’ = dokad+ilosc -1 ex de,hl ; DE := dokad’ lddr ; przepisanie od końca ret etldir: ldir ; przepisanie normalne
JP adr ; PC:=adr , adr - adres 16-bitowy Z80 - lista rozkazów 21/34 9. 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 , w’ = Z , NZ , C , NC DJNZ adrel ; B:=B-1, jeżeli B0 to PC:=PC+adrel warunek w spełniony gdy flaga Z Z = 1 NZ Z = 0 C CY = 1 NC CY = 0 PO P/V = 0 PE P/V = 1 P S = 0 M S = 1
Z80 - lista rozkazów 22/34
Z80 - lista rozkazów 23/34
Z80 - lista rozkazów 24/34 10. Rozkazy wywołań procedur i powrotów CALL adr ; symulowanie PUSH PC, PC:=adr CALL w,adr ; jeżeli w to: CALL adr , warunek w - jak przy skokach RST k ; 1-bajtowe wywołanie procedury spod adresu ; k = 00, 08h, 10h, 18h, 20h, 28h, 30h, 38h RET ; symulowanie POP PC RET w ; jeżeli w to: RET RETI ; powrót z procedury obsługi przerwania maskowalnego RETN ; powrót z procedury obsługi przerwania niemaskowalnego
Z80 - lista rozkazów 25/34 11. Rozkazy we/wy jednobajtowe: IN A,(p) ; A Port(p) , p = 00h..0FFh OUT (p),A ; Port(p) A , pA7..A0 IN r,(C) ; r Port(BC) , r = B,C,D,E,H,L,A OUT (C),r ; Port(BC) r, BCA15..A0 blokowe (w rozkazach tych BCA15..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
Z80 - lista rozkazów 26/34 12. 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
Z80 - lista rozkazów 27/34 13. Rozkazy nieoficjalne LD r’,rx’ ; r’ = B,C,D,E,HX,LX,A przy rx’ = HX,LX albo LD rx’,r’ ; r’ = B,C,D,E,HY,LY,A przy rx’ = HY,LY ADD A,rx’ AND rx’ ADC A,rx’ OR rx’ SUB rx’ XOR rx’ SBC A,rx’ CP rx’ INC rx’ DEC rx’ SLI s’ ; SLA s’ , INC s’ , s’=A,B,C,D,E,H,L,(HL),(IX+dd),(IY+dd) RLC (RX+dd),r” RRC (RX+dd),r” ; wynik operacji trafia także do rejestru RL (RX+dd),r” ; r” = A,B,C,D,E,H,L , RX = IX , IY RR (RX+dd),r” ; dd - 1-bajtowe przesunięcie w U2 SLA (RX+dd),r” SRA (RX+dd),r” SRL (RX+dd),r” SLI (RX+dd),r” SET b,(RX+dd),r” RES b,(RX+dd),r”
Z80 - lista rozkazów 28/34
Z80 - lista rozkazów 29/34
Zasady programowania w asemblerze Z80 (i nie tylko) Z80 - lista rozkazów 30/34 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.
Zasady programowania... - c.d. Z80 - lista rozkazów 31/34 Zasady programowania... - c.d. 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, przerwanie /INT 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.
Z80 - przykłady procedur 32/34 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 LBCD[0]:= LBCD[0]+TAB[i,0] korekcja BCD LBCD[1]:= LBCD[1]+TAB[i,1]+CY i:=i+1 i =8 ? N T Li = 1 ? 0 1 0 0 0 2 0 4 0 8 1 6 3 2 6 4 2 8 i,0 i,1 i=0 i=1 i=2 i=3 i=4 i=5 i=6 i=7
Z80 - lista rozkazów 33/34 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
Z80 - lista rozkazów 34/34 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 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, dwl 0016h,0032h,0064h,0128h