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 -