Wybrane pojęcia z arytmetyki binarnej.
bit CY oznacza przeniesienie ( względnie pożyczkę ) z najwyższego bitu układu ALU ( sumator ) bit ten jest wykorzystywany w zapisie naturalnym binarnym ( bez znaku ). Razem z bitem zerowości pozwala określić wszystkie relacje po miedzy dwiema liczbami bez znaku. Porównania dokonuje się poprzez odjęcie porównywalnych argumentów, w efekcie czego ustawiają się bity warunkowe za sam wynik odejmowania nie jest nigdzie zapamiętany.
|
0 |
1 |
|
Wynik odejmowania |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
< CY |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
≥ CY |
|
|
|
|
|
|
≤ CY v Z |
|
|
|
|
|
|
> CY v Z |
|
|
Jeżeli argumentami obliczeń są liczby ze znakiem w notacji kodu U2 to pod uwagę należy wziąć dwa kolejne bity warunkowe. Są to :
N- bit znaku ( powtarza najstarszy bit argumentu )
bit przekroczenia zakresu ( owerflow ), informuje o nieprawidłowości wyniku wskutek przekroczenia zakresu liczb.
Kod U2:
7 |
0 111 |
|
|
|
|
|
|
6 |
0 110 |
|
|
|
|
|
|
5 |
0 101 |
|
|
+2 0010 |
|
+3 0011 |
|
|
0 100 |
|
|
+5 0101 |
|
+6 0110 |
|
3 |
0 011 |
|
|
+7 0111 |
|
!−7 1001 |
|
2 |
0 010 |
|
zmiana |
|
|
|
|
1 |
0 001 |
|
znaku, |
|
|
|
|
0 |
0 000 |
|
negacja |
|
|
|
|
|
1 111 |
|
i dodanie |
|
|
|
|
−2 |
1 110 |
|
1 na LSB |
|
|
|
|
−3 |
1 101 |
|
|
|
|
|
|
−4 |
1 100 |
|
|
−3 1101 |
|
−5 1011 |
|
−5 |
1 011 |
|
|
−4 1100 |
|
−7 1001 |
|
−6 |
1 010 |
|
|
−7 1001 |
|
!+4 0100 |
|
−7 |
1 001 |
|
|
|
|
|
|
−8 |
1 000 |
|
|
|
|
|
|
|
N- |
najstarszy bit (znaku) |
|
|
|
|
|
W μP. w których arytmometr nie umożliwia pracy w trybie dziesiętnym. ( kod BCD ) występuje bit warunkowy przeniesienia pomocniczego ( AC ) jest on głównie wykorzystywany przy rozkazie tzw. korekcji dziesiętnej.
75 |
0111 0101 |
|
|
|
|
+89 |
1000 1001 |
|
|
|
|
1 64 |
1111 1110 |
|
|
AC≡H |
|
CY |
0110 |
(+6) |
|
|
|
|
0000 0100 |
|
Rozkaz DAA |
|
|
|
AC |
|
(korekcji |
|
|
|
|
0110 |
(+60) |
Dziesiętnej) |
|
|
1 0110 0100 |
|
|
|
|
|
CY |
|
|
|
Przesunięcia logiczne
0 → |
→ |
SLR |
|
|
0 |
|
← |
← SLL |
Przesunięcia arytmetyczne są równoważne z mnożeniem i dzieleniem przez 2.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
0 |
0 |
1 |
1 |
|
+3 |
|
|
|
|
|
|
|
|
1 |
1 |
0 |
1 |
|
+3 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
0 |
1 |
1 |
0 |
|
+6 |
|
|
|
|
|
|
|
|
1 |
0 |
1 |
0 |
|
+6 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
0 |
0 |
1 |
1 |
|
|
|
|
|
|
|
|
|
! |
1 |
1 |
0 |
1 |
|
-3 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Powielić bit znaku |
|
|
|
|
|
← |
← 0 SAL |
|
|
|
SAL≡SAR |
|
SAR |
|
Przesunięcia arytmetyczne.
Przesuwając arytmetycznie w prawo należy powielić bit znaku aby rezultat był prawidłowy. Ponad to zauważamy że przesunięcie logiczne w lewo jest tożsame z przesunięciem arytmetycznym ( wystarczy wspólny rozkaz )
Listy rozkazów.
W omawianych μP. występują różne formaty instrukcji.
|
KO |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
* |
KO |
|
KO |
|
|
* |
tylko w |
Z80 |
|
|
|
|
|
|
|
|
|
|
KO |
|
Dana, adres |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
KO |
|
|
|
|
|
|
|
|
|
|
__Dane, adres__ |
|
|
|
||
* |
KO |
|
KO |
|
Dana, adres |
|
|
|
|
|
|
|
|
|
|
|
|
* |
KO |
|
KO |
|
|
|
|
|
|
|
|
|
|
__Dane, adres__ |
|
Jednobajtowy KO daje możliwość rozróżnienia prze μP 256 instrukcji. Ze względu na ewentualne rozbudowy listy, praktycznie wszystkie μP. pozostawiają wolne kombinacje KO. Jeśli rozkazy są kodowane jedno- i dwubajtowo, to pewne kombinacje pierwszego bajtu KO dają początek nowej 256-bitowej rodzinie. Wtedy wolne kombinacje mogą np. występować dla kodów dwubajtowych. Jeżeli μP. pobierze niewykorzystywany (niezaimplementowany) KO to można spodziewać się następujących zachowań:
wykonanie instrukcji pustej NOP (no operation)
przypadkowa działalność
blokada pracy - konieczny RESET
począwszy od 16-bitowych μP. przyjęło się, że w takim przypadku μP zgłasza stan wyjątkowy nielegalnej instrukcji
Przy akceptacji przerwania μP kładzie na stosie adres rozkazu który byłby wykonany gdyby nie przerwanie. Ponadto 6502 zapisuje na stosie rejestr statusowy a 6800 wszystkie swoje pozostałe rejestry (wskaźnik stosu SP adresujący stos nie jest na nim oczywiście zapisywany). Warunkiem akceptacji przerwania jest zakończenie instrukcji (dotyczy to NMI) a w przypadku przerwań maskowanych IRQ , także odpowiedni stan bitu zezwolenia (względnie bitu maski). Należy pamiętać że przerwanie NMI jest akceptowane od wyróżnionego zbocza (gdyby było przyjmowane poziomem przerywałoby samo siebie). Po przyjęciu przerwania NMI względnie przerwania maskowanego μP. blokuje zezwolenia na przerwania maskowane. Tak samo dzieje się po podaniu sygnału zerującego μP. Oprócz tego do manipulacji bitem zezwolenia przewidziano dwie instrukcje EI, oraz DI (enable interrupt, disable interrupt). W przypadku zerowania μP. adres z pod którego będzie odczytywany KO pierwszej instrukcji może być określany bezpośrednio (sztywna lokacja: Z80, 8051 - lokacja zerowa) lub w sposób pośredni (głownie Motorole), np. dla 6800 (i 6502), po wyzerowaniu μP odczytuje zawartość dwóch ostatnich lokacji (FFFE, FFFF), umieszcza odczytane bajty w PC i dopiero stamtąd odczytuje KO pierwszego rozkazu.
Jeżeli bit zezwalający (maskujący) przerwania „zwykłe” znajduje się w rejestrze bitów warunkowych, to wykorzystując stos (przy wejściu w obsługę) zapamiętujemy także rejestr bitów warunkowych a przy powrocie odtwarzamy go ze stosu to można w naturalny sposób zapewnić:
przywracanie stanu zezwolenia po zakończeniu obsługi przerwania maskowanego
zapamiętywanie na czas obsługi NMI stanu zezwolenia przerwań zwykłych
W μP Z80 bit zezwolenia jest ulokowany jest poza rejestrem bitów warunkowych. Jest to przerzutnik IFF1 Ponieważ przy wejściu w obsługę przerwania zostaje on wyzerowany, więc przed rozkazem powrotu musimy umieścić instrukcję EI. Razem z przerzutnikiem IFF2 przerzutnik zezwolenia tworzy jednopoziomowy stos. Przy akceptacji NMI stan IFF1 przed wyzerowaniem zapamiętywany jest w IFF2 w celu późniejszego odtworzenia. Kolejną konsekwencją jest stosowanie w związku z tym oddzielnego rozkazu powrotu z przerwań niemaskowanych RETN. Oprócz niego do powrotu z przerwania zwykłego używamy rozkazu RET lub instrukcji RETI, jeżeli w systemie występują interfejsy rodziny Z80 połączone w łańcuszkowym systemie przerwań (układy te dekodują tzn. rozpoznają rozkaz RETI), co powoduje, że układ aktualnie obsługiwany wycofuje żądanie obsługi. Ponadto instrukcja RET1 nadmiarowo odtwarza IFF1 z IFF2.
Jeśli mP „zdecydował się” przyjąć przerwanie zwykłe, to przeważnie inicjuje cykl akceptacji przerwania. W cyklu tym, od urządzenia przerywającego bądź kontrolera zarządzającego wieloma źródłami przerwań mP otrzymuje poprzez szynę danych :
Kod operacyjny pierwszej instrukcji obsługi przerwania
Indeks do tabeli z adresami startowymi obsługi dla różnych źródeł przerwań.
Jeżeli tablica z adresami obsługi jest tylko jednoelementowa to cykl akceptacji nie występuje (jest on domyślny, mP ładuje go z jednoelementowej tablicy). Ponadto możliwe jest rozpoczynanie obsługi od sztywnych lokacji. Dotyczy to NMI Z80 (start od adresu 0066H lub dla trybu pierwszego obsługi przerwań w tym mP kiedy obsługa każdego źródła przerwania IRQ rozpoczyna się od lokacji 0038H. Powszechną praktyką we współczesnych mP jest stosowanie tabeli z adresami startowymi względnie z deskryptorami).
W trybie zerowym Z80 mP wykonuje :
Cykl akceptacji w którym otrzymuje z kontrolera przerwań kody od RST 0 do RST 7
Wykonywane są dwa cykle zapisu PC na stos
mP pobiera KO następnej instrukcji obsługi z pod lokacji 0, 8, 10 . . . 38H. Kolejne instrukcje obsługi odczytuje sekwencyjnie. Pod powyższymi lokacjami znajdują się rozkazy skoku ponieważ zmieszczenie obsługi na 8 bajtach nie wchodzi zwykle w rachubę.
Przy trybie drugim przerwań mP wykona następujące cykle (rozkaz programu głównego został zakończony) :
cykl akceptacji (w cyklu tym kontroler przerwań, a przeważnie samo urządzenie żądające obsługi wysyła poprzez szynę danych do mP swój numer z zakresu 0-127.
mP zapisuje na stosie adres następnej instrukcji (była by ona wykonana gdyby nie przerwanie) - dwa cykle.
mP odczytuje z tabeli adresów startowych dwie kolejne lokacje z których pierwsza jest określona przez adres powstały ze złożenia zawartości rejestru I oraz wartości dosłanej w cyklu akceptacji.
15 8 |
|
7 |
0 |
I |
|
Nr. urządzenia |
0 |
|
|
Dosłany w cyklu akceptacji (INTA) |
|
|
|
|
|
|
|
|
|
Adres startowy 0 |
|
|
|
1 |
|
|
|
|
|
256 kB |
|
|
|
|
|
|
|
|
|
|
|
|
|
Adres startowy 127 |
|
|
|
|
|
|
|
|
|
|
Dwie kolejne lokacje odczytane z tabeli po złożeniu tworzą adres startowy procedury obsługi danego urządzenia. Tabela adresów startowych znajduje się w pamięci RAM co umożliwia modyfikację w jej zawartości podczas pracy mP. Zauważamy, że w pamięci mP może być więcej niż jedna tabela, dostęp do odpowiedniej następuje poprzez zmianę zawartości rejestru I.
W przypadku 6800 i 6502 z powodów podanych uprzednio nie występuje cykl akceptacji. mP od razu ale po uprzednim zapamiętaniu właściwych rejestrów na stosie odczytuje zawartość dwóch odpowiednich bajtów z końca przestrzeni adresowej, ładuje je do PC i rozpoczyna obsługę. W zwykły sposób nie jest możliwe rozróżnienie więcej niż jednego przerwania maskowanego.
W niektórych systemach z 6800 pamięć stała obejmuje tylko dwie ostatnie lokacje, pozostałe adresy startowe można modyfikować w pamięci RAM.
Mechanizm tablicy adresów startowych umożliwia tworzenie systemów obsługi priorytetowej. Dla Z80 może to dotyczyć przerwań IRQ1 - IRQ7 (najważniejsze). Załóżmy, że wszystkie siedem urządzeń ingeruje w wejście INT na zasadzie bramek OC, natomiast w cyklu akceptacji mP odczytuje stan zgłoszeń wszystkich siedmiu urządzeń (poziom aktywny niski).
IRQ7 . . . . . . . . . IRQ1
|
Tabela adresów startowych |
|
|
|
|
|
|
|
0 |
|
|
|
|
|
64 x adres dosłany IRQ7 |
|
|
|
|
10XXXXX |
63 |
|
|
|
64 |
|
|
|
|
|
32 x adres dosłany IRQ6 |
|
|
|
|
|
95 |
|
|
|
|
|
|
|
|
|
|
|
127 |
|
1 x adres d IRQ1 |
Procedura obsługi przerwania podobnie jak podprogram winna na początki zapisać na stos stan tych rejestrów, które mogą być zmienione ( są wykorzystywane podczas realizacji procedury). Na końcu czynności właściwej obsługi znajdują się rozkazy odtwarzające w odwrotnej kolejności stan zachowanych rejestrów po czym procedura kończy się rozkazem powrotu z przerwania. Zwykle przy większej ilości przerwań stosujemy strukturę jednopoziomową tzn. następne może być obsłużone po zakończeniu obsługi poprzedniego. Możliwa jest również obsługa wielopoziomowa. Posługuje się ona kontrolerami przerwań (INTEL) lub korzysta z wrodzonych własności μP (rodzina MOTOROLA 68000). W przypadku omawianych 8-bitowych μP, aby dopuścić następne. należy w obsłudze po zachowaniu rejestru odblokować przerwania. W przypadku Z80 zamiast korzystać ze stosu można posłużyć się rejestrami alternatywnymi.
W przypadku obsługi większej ilości przerwań możliwa jest struktura zdecentralizowana (każdy moduł samodzielnie w cyklu akceptacji wysyła swój numer). Dotyczy to μP Z80 i rodziny 68000). Z drugiej strony w systemie może istnieć scentralizowany kontroler który zbiera wszystkie żądania wybiera najważniejsze, umożliwia różne maskowanie i temu podobnie po czym akceptacji wysyła do μP numer przerwania wybranego do obsługi. Sposób ten stosuje INTEL. Stosuje się sterowniki 8214 (prosty, priorytetowy, z maską) 8259 (programowany). Ten drugi wymaga od μP (i cała rodzina 80x86 do tego się stosuje) dwóch cykli akceptacji przerwania. W pierwszym cyklu rozstrzygane są sprawy priorytetów pomiędzy sterownikiem Master a Slave'ami (układy te można łączyć kaskadowo). Dopiero w drugim cyklu μP oczekuje numeru urządzenia skierowanego do obsługi.
Układy rodziny Z80 wykorzystywały po raz pierwszy łańcuszkowy sposób przerwań stosowany potem powszechnie w różnych standardach magistral.
Układy ABC są układami peryferyjnymi z rodziny Z80. Są one specjalnie przystosowane do pracy w łańcuszkowym systemie przerwań. Po wyzerowaniu μP realizuje zaprogramowanie układów peryferyjnych. Polega ono na wysłaniu pod adres (adresy) tych układów w przestrzeni we/wy, umownych bajtów precyzujących wybrany sposób działania. Między innymi μP programuje jaki numer (numery) dany układ wyśle przez DB do μP w cyklu akceptacji. Po zaprogramowaniu układy pracują zgodnie ze swoim przeznaczeniem (np. odmierzanie czasu, obsługa portu szeregowego) i jeśli jest to konieczne wystawiają żądanie obsługi. Obowiązują następujące reguły gry:
Układ obsługiwany podtrzymuje aktywny sygnał żądający aż do rozpoznania w cyklach pobrania (dwóch) rozkazu RETI (aktywne linie M1 i RD).
W cyklu akceptacji wysyła swój numer to urządzenie które :
żąda obsługi
na swoim wejściu IEI ma stan wysoki
Urządzenie wystawiające numer steruje swoje wyjście IEO w stan niski.
Każdy układ transmituje bezwarunkowo 0 z IEI na IEO
Mimo blokady na IEI każdy układ jeśli to konieczne steruje wyjście żądające INT i czeka aż do skutku.
Jeśli chodzi o bezpośredni dostęp do pamięci to system Z80 rozwiązuje ten problem także metodą łańcuszkową. W łańcuszku pracują dedykowane sterowniki DMA. Każdy z nich obsługuje jeden kanał dostępu do pamięci. Alternatywą jest stosowanie zcentralizowanego sterownika obsługującego większa ilość kanałów, czego przykładem są systemy INTELA (sterownik 8237 i następne).
9