Architektura systemów komputerowych jesień 2013 Wykład 6 Mikroprocesor Z80 dr inż. Wojciech Bieniecki Instytut Nauk Ekonomicznych i Informatyki http://wbieniec.kis.p.lodz.pl/pwsz
Materiały źródłowe http://z80-heaven.wikidot.com/control-structures http://we.pb.edu.pl/~kaie/kaie-md/Lab/TM2EDsem4instr.pdf http://z80-heaven.wikidot.com/control-structures http://edu.i-lo.tarnow.pl/inf/retro/004_z80_inst/0007.php Marcin Peczarski Instytut Informatyki, Uniwersytet Warszawski, Materiały do wykładu: Mikroprocesor
Geneza mikroprocesora Zbyt czasochłonne projektowanie od podstaw z bramek logicznych nowego modelu np. kalkulatora lub sterownika windy Podczas projektowania łatwo popełnić trudny do usunięcia błąd Układ uniwersalny – mikroprocesor Nowa funkcjonalność przez wymianę programu
Geneza mikroprogramowania Zbyt czasochłonne projektowanie od podstaw z bramek logicznych nowej jednostki sterującej (mikro)procesora Podczas projektowania łatwo popełnić trudny do usunięcia błąd Uniwersalna jednostka sterująca Nowa funkcjonalność przez wymianę mikroprogramu
Mikroprogramowanie
Kod maszynowy a Asembler Kod maszynowy – binarny sposób opisu rozkazów procesora Każda architektura ma swój unikalny kod maszynowy W obrębie tej samej architektury kod maszynowy może być nieco różny dla poszczególnych modeli procesorów Asembler – język programowania niskiego poziomu Jedno polecenie odpowiada zwykle jednemu rozkazowi maszynowemu Każda architektura ma swój unikalny Asembler
Architektura mikroprocesora
Dlaczego Z80? Jeden z najpopularniejszych mikroprocesorów 8-bitowych Nadal produkowany i używany Bezpośredni wpływ na najpopularniejszą obecnie architekturę x86 Kompromisy projektowe, kompatybilność z 8080 Wystarczająco prosty
Wykorzystanie procesora Komputery domowe ZX 80/81 ZX Spectrum Amstrad CPC Spectravideo Commodore 128 regulatory przemysłowe sprzęt pomiarowy
Cechy procesora 8-bitowa magistrala danych 16-bitowa magistrala adresowa możliwość bezpośredniego adresowania 64 kB pamięci możliwość wykonywania operacji na bitach, słowach 8- i 16-bitowych 158 rozkazów (w tym 78 rozkazów wykonywanych przez 8080) dwie linie przerwań (maskowalna i niemaskowalna) układ automatycznego odświeżania pamięci dynamicznych RAM pojedyncze zasilanie +5V sygnały logiczne TTL
Opis wyprowadzeń procesora
Opis wyprowadzeń procesora A15-A0 Magistrala Adresowa (wyjście, aktywna w stanie wysokim, trójstanowa). Linie A15-A0 tworzą 16-bitową magistralę adresową. Udostępnia ona adresy do wymiany informacji z pamięcią poprzez magistralę danych(do 64K bajtów) oraz do komunikacji z urządzeniami I/O (ang. Input / Output - wejście / wyjście). BUSACK Bus Acknowledge - Potwierdzenie Zwolnienia Magistral (wyjście, aktywne w stanie Niskim). BUSACK informuje żądające tego urządzenie zewnętrzne, iż magistrale adresowa, danych oraz sygnały sterujące MREQ, IORQ, RD i WR mikroprocesora przeszły w stan wysokiej impedancji (stały się nieaktywne elektrycznie). Urządzenie zewnętrzne może teraz przejąć pełną kontrolę nad magistralami w systemie. BUSREQ Bus Request - Żądanie Zwolnienia Magistral (wejście, aktywne w stanie Niskim). BUSREQ posiada wyższy priorytet niż NMI i jest zawsze rozpoznawane na końcu bieżącego cyklu maszynowego. BUSREQ wymusza stan wysokiej impedancji na magistrali adresowej, magistrali danych oraz dla sygnałów sterujących MREQ, IORQ, RD i WR, w celu przejęcia tych linii przez inne urządzenie w systemie. Wejście BUSREQ zwykle łączy się równolegle z liniami urządzeń i dlatego wymaga zewnętrznego podciągnięcia napięcia przy takich zastosowaniach (np. przez rezystor 4,7k do 5V). Przedłużone okresy BUSREQ spowodowane operacjami DMA (ang. Direct Memory Access - bezpośredni dostęp do pamięci) mogą spowodować problemy z odświeżaniem dynamicznych pamięci RAM przez mikroprocesor.
Opis wyprowadzeń procesora D7-D0 Magistrala Danych (wejście/wyjście, aktywna w stanie Wysokim, trójstanowa). Linie D7-D0 tworzą 8-bitową, dwukierunkową magistralę danych, używaną przy wymianie informacji z pamięcią i urządzeniami I/O. HALT Stan Zatrzymania (wyjście, aktywne w stanie Niskim). Sygnał HALT wskazuje, iż mikroprocesor wykonał instrukcję HALT i czeka albo na przerwanie niemaskowane, albo na maskowane (z włączoną maską) zanim powróci do wykonywania programu. Podczas stanu Zatrzymania mikroprocesor wykonuje cyklicznie rozkaz NOP w celu podtrzymania funkcji odświeżania pamięci dynamicznych. INT Żądanie Przerwania (wejście, aktywne w stanie Niskim). Żądanie Przerwania jest generowane przez urządzenia I/O. Mikroprocesor honoruje to żądanie na końcu bieżącej instrukcji, jeśli wewnętrzny przerzutnik flip-flop aktywacji przerwań (IFF), sterowany programowo, jest włączony Linia INT zwykle łączona jest równolegle z liniami urządzeń I/O i wymaga zewnętrznego podciągnięcia napięcia, aby umożliwić tę funkcję. IORQ Żądanie I/O (wyjście, aktywne w stanie Niskim, trójstanowe). Sygnał IORQ oznacza, iż na dolnej połowie magistrali adresowej znajduje się poprawny adres I/O do operacji odczytu lub zapisu I/O. IORQ jest również generowane współbieżnie z M1 podczas cyklu potwierdzenia przyjęcia przerwania w celu poinformowania urządzenia I/O, iż wektor odpowiedzi na przerwanie może zostać umieszczony na magistrali danych.
Opis wyprowadzeń procesora M1 Cykl Maszynowy Nr 1 (wyjście, aktywne w stanie niskim). Sygnał M1 wraz z MREQ oznacza, iż bieżący cykl maszynowy jest cyklem pobrania kodu rozkazu dla wykonywanej instrukcji. M1 wraz z IORQ oznacza cykl potwierdzenia przyjęcia przerwania. MREQ Żądanie dostępu do pamięci (wyjście, aktywne w stanie Niskim, trójstanowe). Sygnał MREQ oznacza, iż magistrala adresowa zawiera ważny adres dla operacji odczytu lub zapisu do pamięci. NMI Żądanie Przerwania Niemaskowanego (wejście, wyzwalane ujemnym zboczem: czyli przejściem ze stanu 1 na 0). Sygnał NMI posiada wyższy priorytet od INT. Sygnał NMI jest zawsze przyjmowany na końcu bieżącej instrukcji, bez względu na stan przerzutnika aktywacji przerwań (IFF) i automatycznie wymusza na procesorze restart od adresu 0066H. RD Odczyt (wyjście, aktywne w stanie Niskim, trójstanowe). Sygnał RD oznacza, iż mikroprocesor chce dokonać odczytu lub zapisu z pamięci albo urządzenia I/O. Zaadresowane urządzenie I/O lub pamięć powinni wykorzystywać ten sygnał do umieszczania informacji na magistrali danych mikroprocesora.
Opis wyprowadzeń procesora RESET (wejście, aktywne w stanie Niskim). Sygnał RESET inicjuje mikroprocesor w sposób następujący: kasuje przerzutnik aktywacji przerwań, zeruje rejestr PC oraz rejestry I i R, a następnie ustawia status przerwań na tryb 0. W czasie resetowania magistrale adresowa i danych przechodzą w stan wysokiej impedancji, a wszystkie wyjściowe linie sterujące przyjmują stan nieaktywny. Uwaga: sygnał RESET musi być aktywny przez minimum 3 pełne cykle zegara, zanim operacja resetowania zostanie zakończona. RFSH Odświeżanie (wyjście, aktywne w stanie Niskim). Sygnał RFSH wraz z MREQ oznacza, iż dolne siedem bitów magistrali adresowej systemu może zostać wykorzystane jako adres odświeżania dla pamięci dynamicznych. W górnej połowie magistrali adresowej jest umieszczana zawartość rejestru I. WAIT Oczekiwanie (wejście, aktywne w stanie Niskim). Sygnał WAIT informuje mikroprocesor, iż zaadresowana pamięć lub urządzenie I/O nie są jeszcze gotowe do wymiany informacji. Mikroprocesor powtarza cykle oczekiwania tak długo, aż sygnał ten powróci do stanu wysokiego. Przedłużone okresy oczekiwania mogą spowodować błędy w odświeżaniu przez mikroprocesor pamięci dynamicznych. WR Zapis (wyjście, aktywne w stanie Niskim, trójstanowe). Sygnał WR oznacza, iż magistrala danych mikroprocesora zawiera ważne dane, które mają zostać umieszczone w zaadresowanej pamięci lub w rejestrze I/O. CLK Zegar (wejście). Jednofazowe wejście zegarowe o poziomie MOS.
Rejestry procesora Każdy z rejestrów A, B, C, D, H, L jest 8-bitowy. Rejestry można łączyć w pary 16-bitowe: AB, CD, HL (H - starszy, L - młodszy bajt) Wyróżnionym rejestrem jest rejestr A - tzw. akumulator. W rejestrze tym umieszczony jest zazwyczaj jeden z argumentów operacji, a później wynik jej działania. W operacjach na liczbach 16-bitowych rolę akumulatora pełni para rejestrów HL. W operacjach blokowych rejestr BC jest licznikiem.
Rejestry procesora Procesor Z80 dysponuje alternatywnym bankiem rejestrów A', F', ... itd. Dostęp do nich jest ograniczony – możliwy jest tylko poprzez rozkazy wymiany. EX AF, A'F' ; wymiana rejestrów AF z A'F' EXX ; wymiana wszystkich rejestrów
Rejestr flag procesora Bit Znacznik Nazwa Opis C Carry przeniesienie z najstarszego bajtu (np. przy sumowaniu) 1 N Negativ oznacza, że ostatnio wykonaną operacją było odejmowanie, informacja o tym jest istotna przy korekcji wyników 2 P/V Parity/Overflow po operacjach logicznych - oznacza parzystą liczbę jedynek w wyniku po operacjach arytmetycznych - przepełnienie w kodzie U2 4 H Half Carry przeniesienie połówkowe pomiędzy tetradami (z młodszej do starszej) 6 Z Zero znacznik jest ustawiony, gdy wynik operacji = 0 7 S Sign znak liczby w kodzie U2 (kopia najstarszego bitu wyniku)
Rejestry sterujące PC - Program Counter, 16-bitowy licznik rozkazów SP - Stack Pointer, 16-bitowy wskaźnik stosu. Przechowuje adres szczytu stosu. Stos rozrasta się "w dół" /adresy/. Programista ma dostęp tylko do szczytu stosu. Do wymiany danych ze stosem służą instrukcje PUSH i POP. IX, IY - rejestry indeksowe używane w rozkazach blokowych, czasem mogą zastępować rejestry HL I - Interrupt, wektor przerwania. Zawartość rejestru I uczestniczy w obliczaniu adresu podprogramu obsługi przerwania R - Refresh, rejestr odświeżania, jego zawartość jest umieszczana w cyklu M1 (w drugiej połowie) na magistrali adresowej (na młodszym bajcie)
Cztery podstawowe operacje sprzętowe Operacja/sygnały MREQ* IOREQ* RD* WR* odczyt danych: MEM --> CPU 1 zapis danych: CPU --> MEM odczyt z portu we/wy: I/O --> CPU zapis do portu we/wy: CPU --> I/O
Przesyłanie danej 8-bitowej LD d, s LD d, n 0 1 d s 00 d 110 n d argument 000 001 010 011 100 101 110 111 B C D E H L (HL) A d, s argument 000 001 010 011 100 101 110 111 B C D E H L (HL) A Adresowanie rejestrowe bezpośrednie (pośrednie) Adresowanie natychmiastowe
Przesłanie danej 8-bitowej (adresy) Adresowanie bezpośrednie (adresy są 16-bitowe) LD (p), A LD A, (p) LD (aa), A LD A, (aa) 000 p d 010 0 0 1 1 d 0 1 0 aal aah p para rejestrów 0 BC 1 DE d kierunek 0 z akumulatora do pamięci 1 z pamięci do akumulatora
Używanie rejestrów indeksowych LD r, (HL) LD r, (i + d) 0 1 r 1 1 0 1 1 i 1 1 1 0 1 0 1 r r r 1 0 0 d r rejestr 000 001 010 011 100 101 110 111 B C D E H L (HL) A i rejestr indeksowy 0 IX 1 IY
Używanie rejestrów indeksowych LD (HL), n LD (i + d), n 0 0 1 1 0 n 1 1 i 1 1 1 0 1 0 0 1 1 0 d n i rejestr indeksowy 0 IX 1 IY
Rejestry zapasowe i flagi EX AF, AF’ EXX 1 1 0 1 1 0 0 1 0 0 0 0 1 0 0 0 S Z - AC P/V N CY S – najstarszy bit wyniku operacji, wynik ujemny Z – wynik operacji zerowy AC – pomocnicze przeniesienie z pozycji 3, arytmetyka BCD P/V – znacznik parzystości dla operacji logicznych i nadmiaru (ang. overflow) dla operacji arytmetycznych N – znacznik zerowany przy wykonywaniu dodawania i ustawiany przy wykonywaniu odejmowania, arytmetyka BCD CY – znacznik przeniesienia (pożyczki przy odejmowaniu)
Rotacje i przesunięcia bitowe RL x RR x RLC x RRC x SLA x SRL x SRA x x : A, B, C, D, E, H, L, (HL), (IX + d), (IY + d)
Operacje na adresach Ładowanie LD r, nn LD r, (aa) LD (aa), r r: BC, DE, HL, SP, IX, IY Zamiana EX DE, HL Inkrementacja i dekrementacja INC r DEC r
Operacje na adresach Arytmetyka 16-bitowa ADD HL, r ADC HL, r SBC HL, r r: BC, DE, HL, SP Dodawanie i odejmowanie wartości w rejestrach indeksowych ADD IX, p gdzie p ∈ {BC, DE, SP, IX} ADD IY, p gdzie p ∈ {BC, DE, SP, IY}
Operacje stosowe Stos to blok pamięci. Rejestr SP wskazuje wierzchołek stosu – adres ostatniego zajętego bajtu. Stos rośnie w dół – w kierunku mniejszych adresów. PUSH p Odkłada na stos najpierw starszy, potem młodszy bajt argumentu (architektura little-endian). Zmniejsza SP o 2 p ∈ {AF, BC, DE, HL, IX, IY} POP p Zdejmuje ze stosu najpierw młodszy, potem starszy bajt i umieszcza je w argumencie. Zwiększa SP o 2.
Operacje stosowe Inicjowanie wskaźnika stosu LD SP, nn LD SP, (aa) LD SP, p gdzie p ∈ {HL, IX, IY} Manipulowanie wierzchołkiem stosu INC SP DEC SP EX (SP), p gdzie p ∈ {HL, IX, IY}
Skoki i podprogramy JP aa 1 1 0 0 0 0 1 1 aal aah wykonuje skok pod podany adres (wpisuje aa do PC) odkłada na stos adres następnego rozkazu (adres powrotu) i wykonuje skok pod podany adres 1 1 0 0 1 1 0 1 aal aah CALL aa zdejmuje ze stosu adres powrotu i wykonuje skok pod ten adres RET 1 1 0 0 1 0 0 1
Skoki warunkowe JP w, aa CALL w, aa RET w 1 1 w 0 1 0 aal aah w skrót warunek skoku 000 NZ Z = 0 001 Z Z = 1 010 NC CY = 0 011 C CY = 1 100 PO P/V = 0 101 PE P/V = 1 110 P S = 0 111 M S = 1 1 1 w 1 0 0 aal aah CALL w, aa RET w 1 1 w 0 0 0
Skoki względne JR d JR v, d 0 0 0 1 1 0 0 0 n v skrót warunek skoku 00 NZ Z = 0 01 Z Z = 1 10 NC CY = 0 11 C CY = 1 0 0 1 v 0 0 0 d JR v, d Skok względny dodaje do PC wartość d traktowaną jako liczba ze znakiem.
Przykłady programów
Pętle zm: equ 20h ;deklaracja zmiennej org 0h ;adres poczatkowy programu ld sp,38h ;zainicjowanie wskaznika stosu ld b,8 ;B=licznik petli petla: ld a,b add a,b ld c,a push bc ;zapis na stos 2 bajtow djnz petla ;realizacja petli programowej ld hl,zm ld (hl),a ;zapis do zmiennej 'zm' halt .end
Pętle i tablice tab: equ 20h ;deklaracja zmiennej org 0h ;adres poczatkowy programu ld sp,28h ;zainicjowanie wskaznika stosu ld hl,1 ld de,2 add hl,de ;dodawanie 2-bajtowe push hl ;zapis na stos slowa 16-bitowego ex de,hl ;zamiana zawartosci HL i DE ld b,2 ;B=licznik petli petla: pop de ;odczyt ze stosu 2 bajtow djnz petla;realizacja petli programowej halt .end
Tablice w assemblerze wygodnym narzędziem do deklarowania adresu początkowego zmiennej programowej, prostej lub złożonej (tablicy), jest dyrektywa asemblera EQU znak: equ 110h ;zadeklarowanie 1-bajtowej zmiennej "znak" znaki: equ 111h ;zadeklarowanie 15-bajtowej tablicy "znaki" ;o adresie początkowym 111h liczba: equ 120h ;zadeklarowanie zmiennej 2-bajtowej liczba znak: equ 110h znaki: equ znak+1 liczba: equ znaki+15
Dostęp sekwencyjny do tablicy Należy do wybranego rejestru 16-bitowego załadować adres początkowy interesującej na tablicy, a następnie odpowiednio czytać lub zapisywać jej kolejne komórki, zwiększając po każdej operacji wartość tego rejestru rozkazem INC. ld b,15 ;dlugosc tablicy znakow ld hl,znaki ;zainicjowanie rejestru adresujacego czysc: ld (hl)," " ;wpisanie spacji inc hl ;modyfikacja adresu djnz czysc ;realizacja petli programowej dostęp sekwencyjny do tablicy od końca ld b,liczba-znaki ;dlugosc tablicy znakow wyliczona aut. ld ix,liczba-1 ;zainicjowanie rejestru adresujacego ;na adres ostatniej komorki tabl. "znaki" litA: ld (ix),"A" ;wpisanie litery A dec ix ;modyfikacja adresu djnz litA ;realizacja petli programowej
Dostęp swobodny do tablicy ld bc,0 ;rejestr indeksujacy od 0 do 14 czysc: ld hl,znaki ;kazdorazowa inicj. adresu pocz.tablicy add hl,bc ;dodanie indeksu, HL-> wybrany element ld (hl)," " ;wpisanie spacji inc bc ;modyfikacja indeksu ld c,a ;sprawdzenie warunku konca cp 15 ;czy indeks < 15 jr c,czysc ;skok jesli tak
Operacje blokowe Przemieść w pamięci łańcuch danych o długości 737 bajtów spod adresu DATA do BUFFER LD HL, DATA ; adres start. łańcucha danych LD DE, BUFFER ; adres start. miejsca docelowego LD BC, 737 ; długość łańcucha LDIR ; prześlij łańcuch Polecenie LDIR przemieści obszar pamięci wskazywany przez HL do obszaru pamięci wskazywanego przez DE. Sekwencyjnie zwiększa HL i DE, zmniejsza BC, kontynuuj e, aż BC = 0.
Operacje blokowe Zadanie: skopiuj łańcuch tekstowy (o długości ograniczonej do 132 znaków) z adresu DATA pod adres BUFFER. Kopiowanie trwa do momentu napotkania znaku '$' lub przesłania wszystkich 132 znaków. LD HL, DATA ; adres początku łańcucha LD DE, BUFFER ; adres docelowego bufora LD BC, 132 ; maksymalna długość łańcucha LD A, '$' ; kod zakończenia łańcucha LOOP: CP (HL) ; porównaj znak z '$' JR Z, END ; idź na koniec, jeśli znak się zgadza LDI ; przenieś znak spod (HL) do (DE) ; zwiększ HL i DE, zmniejsz BC JP PE, LOOP ; wróć do LOOP, jeśli pozostało więcej znaków END: HALT ; inaczej przejdź do zakończenia. .END ; Uwaga: znacznik P/V jest używany ; do informowania, że BC osiągnął zero.