Rozwiązania wspomagające uruchamianie programów
W celu efektywnego opracowania, przetestowania programu aplikacyjnego niezbędny staje się system z docelowym procesorem wyposażonym w szereg środków ułatwiających i umożliwiających te prace. Procedury systemowe analizują funkcje edycji, asemblacji, deasemblacji a także pozwalają na wgląd uruchamiany program. W tym celu należy dysponować możliwością opuszczenia w wybranym miejscu uruchamianej procedury i przejście do oprogramowania systemowego. Umożliwi ono podgląd zawartości rejestrów, asemblację najbliższych rozkazów, podgląd stosów i wszystkich zasobów pamięciowych. Oprócz podglądu użytkownik ma możliwość modyfikacji danych tak aby po powrocie do uruchamianych procedury μP wystartował np. z innymi wartościami w rejestrach, zmienionym kodem itp. Omawiane 8-bitowe μP nie dysponują rozbudowanymi środkami do realizacji tych celów. Jedynie w 6800 występuje instrukcja SUI która może być wykorzystana jako rozkaz pułapkujący. Przy pewnych ograniczeniach dla Z80 funkcję tą może pełnić także rozkaz restartu.
Począwszy od 16-bitowych μP pojawiły się nowe możliwości. Są to : programowa praca krokowa (zwykła oraz z trybem śledzenia wyłącznie na dwóch rozgałęzieniach), wewnętrzne sprzętowe e rejestry pułapki.
Pułapkę tą możemy zrealizować w sposób :
sprzętowy
programowy
Spotyka się też rozwiązania kombinowane.
Sygnałem zgodności adresu w procesorze 6800 jest VMA
Sygnałem zgodności adresu w Z80 jest MREQ
Jeżeli procesor dochodzi do tego miejsca gdzie adres się zgodzi dostaje przerwanie NMI. Procesor musi skończyć wszystkie cykle rozkazu danego i wchodzi w obsługę NMI. W czasie wejścia w obsługę NMI na stosie zostaje złożony adres tego rozkazu który byłby wykonany gdyby nie to przerwanie Pułapka jest zawsze po skończeniu operacji
Pytanie : ile można założyć pułapek z komparatorem - tyle komparatorów ile chcemy mieć adresów do pułapkowania.
Pułapka sprzętowa wykorzystuje komparator adresowy typu równościowego. Porównuje on stan szyny adresowej z zawartością tutaj 2-bajtowych rejestrów do których procedury nadrzędne zapisują pułapkowany adres. Zadziałanie komparatora warunkują sygnały potwierdzające ważność adresu. Dla 6800 jest to linia VMA a dla Z80 suma sygnałów MREQ i IORQ.
Wyjście z komparatora najwygodniej jest podłączyć na linię NMI. Przy zgodności adresu w danym cyklu magistrali μP otrzyma sygnał przerywający niemaskowany. Należy zwrócić uwagę, że adres wpisywany do rejestrów pułapki nie musi wskazywać tylko na lokację w programie, może dotyczyć także kontaktów z wyróżnioną lokacją danych.
Pułapka sprzętowa jest pułapką typu „po” ponieważ przerwanie jest akceptowane po całkowitym zakończeniu instrukcji. Przy większej ilości pułapkowanych adresów należy oczywiście powielić zespoły komparator-rejestry.
Wchodząc do obsługi NMI μP kładzie na stosie adres rozkazu który byłby wykonany gdyby nie przerwanie. W związku z tym jeśli operator zamiast narzucić przetworzony kolejny pułapkowany adres ustawi tryb realizacji krokowej (metodą kroczącej pułapki), to adres który należy wpisać do rejestru pułapki, procedura systemowa odczyta bezpośrednio ze stosu.
Tyle pułapek ile operatorów. Program nie jest najszybszy ale zawsze tańszy w realizacji i mniej zawodny od sprzętu.
Pytanie ? - czy można zrobić takie rozwiązanie adresowe przy procesorze który ma kolejkę? - nie, ponieważ chodzi o to że to co odczytuje pobiera do kolejki. Może dojść do takiej sytuacji że gdy jest pętla i na końcu jest skok na początek pętli μP w rozpędzie pobrał jeszcze następne zaskoki. W takich sytuacjach pułapki sprzętowej się nie stosuje.
Kod uruchamianego programu zapisywany jest zawsze do RAM-u.
Ponieważ uruchamiana procedura znajduje się w pamięci RAM można więc w miejsce KO wyróżnionego rozkazu wpisać instrukcję SWI uprzednio zachowawszy zasłaniany rozkaz. SWI możemy oczywiście wpisać tylko w miejsce KO (pierwszego jego bajtu), umieszczanie SWI w miejscu adresu bezpośredniego przy danych natychmiastowych nie ma żadnego sensu. Rozkaz pułapkujący nie może być dłuższy od najkrótszej instrukcji.
|
SWI |
|
|
|
|
|
|
KO |
α+1 |
|
|
|
|
KO |
|
|
|
|
|
KO |
α |
|
|
|
|
Dane |
|
|
|
|
|
KO |
|
|
|
|
|
adres |
|
|
|
|
|
|
|
|
|
|
SWI |
|
|
|
|
|
KO |
α |
|
|
|
adres |
α+1 |
|
|
|
skoku |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
KO |
α |
|
|
|
przesuw |
α+1 |
|
Po przejściu do obsługi NMI μP zapisuje na stosie jako adres powrotny wartość α+1. Przed powrotem z procedury systemowej należy :
przywrócić KO zasłonięte NMI
na stosie zmniejszyć o jeden adres powrotu (aby μP trafił na rozkaz uprzednio zasłonięty a jeszcze nie wykonany
umieścić SWI w innym wskazanym przez operatora miejscu
Ilość pułapek typy SWI jest oczywiście nieograniczona, praktycznie nie spotyka się w procedurach liczby większej niż 8.
Problemy zaczynają się jeśli użytkownik wybierze teraz tryb pracy krokowej (krocząca pułapka). Zasłonięty rozkaz mógł być dozwolony a więc wcale nie musi być zachowana sekwencyjność działania. Procedura systemowa musi więc wykonać analizę zasłoniętej instrukcji.
|
|
|
|
0000 |
|
|
|
|
|
stos |
|
|
|
|
|
|
|
|
|
|
|
|
|
xxx |
|
|
|
|
8 b |
|
stos μP (5b) zapisany przez SWI |
|
|
|
|
|
|
PC |
|
|
|
|
|
|
α+1 |
|
|
|
|
|
|
adres powt |
|
|
|
|
|
|
jeśli zasłaniam RTS |
|
|
|
|
|
|
|
|
|
|
rozkazy sekwencyjne : procedura na podstawie analizy zasłoniętego KO określa ilość baj-
tów rozkazu i wpisuje ponownie SWI do lokacji (α+1),+2 lub +3
jeśli zasłonięty rozkaz był skokiem bezwarunkowym bądź wywołaniem to :
dla adresacji bezpośredniej miejsce wstawienia SWI określi wprost drugi i trzeci bajt rozkazu (spod α+1 i +2).
dla adresacji względnej adres tworzymy przez dodanie w kodzie U2 przesunięcia z α+1 do pomniejszonego o 1 stanu PC ze stosu.
przy adresacji indeksowej przesunięcie dodajemy w kodzie U2 do zawartości IX w momencie gdyby rozkaz ten był wykonany, stan IX znajduje się oczywiście na stosie.
przy rozkazach warunkowych (skoki) należy brać jeszcze pod uwagę odpowiednie warunki lub funkcje bitów warunkowych i w przypadku spełnienia postępować jak wyżej a przy niespełnieniu warunku przesunąć SWI sekwencyjnie.
jeśli zasłanianym rozkazem był RTS to miał on wpisać do PC wartość z wierzchołka stosu, procedura musi więc stworzyć 8-bajtowe.............. .warstwy nałożonej przez SWI odczytać 2-bajtowy adres nowego ulokowania SWI.
jeśli zasłoniliśmy instrukcję RTI to docelowo PC znajduje się w odpowiednim miejscu na drugiej ośmiobajtowej warstwie stosu.
Pisząc oprogramowanie na bity warunkowe oraz na właściwe stosowanie stosu. Przy każdym rozkazie podawany jest stan bitów warunkowych : bez zmian, modyfikacja, zerowanie, ustawianie, stan nieokreślony. Należy pamiętać aby inne rozkazy nie „zniszczyły” bitu ustawionego wcześniej a wykorzystywanego przez rozkaz warunkowy. Operując na stosie musimy pamiętać ażeby przed wykonaniem rozkazu powrotu wskaźnik stosu wskazywał na powrotną wartość PC a nie na przykład na stan innego rejestru. Generalnie stos musi zostać zrównoważony : w stanie ustalonym liczba zapisów i odczytu ze stosu musi być zrównoważona. Pisząc procedurę należy właściwie zagospodarować wewnętrzne rejestry gdzie umieszczamy najczęściej używane dane zmniejszając w ten sposób liczbę odwołań do pamięci. Procedura winna zachowywać a na końcu odtwarzać stan rejestrów przez nią wykorzystywanych. Oprogramowanie rozpoczynamy przez napisanie w miarę możliwości procedur do komunikacji z układami sprzętowymi systemu, przy zmianie sprzętu zmiana oprogramowania ograniczy się tylko do wymiany niniejszych podprogramów.
tu czegoś brakuje
W zapisie asemblerowym przyjmuje się zawsze, że wartość w nawiasie określa lokację pamięci zapis Motorolowski jest ......................... a Z80 i INTEL stosują notację odwrotną.
Mnemonik źródło, przeznaczenie (MOTOROLA)
Mnemonik przeznaczenie, źródło (INTEL, Z80)
Przy zapisie danych wielobajtowych MOTOROLA umieszcza argumenty począwszy od bajtu najstarszego a Z80 i INTEL i od najmłodszego.
Podobnie jest w przypadku szyn danych : najstarszy bajt dla MOTOROLI odpowiada ............... numerowi szyny. Dla INTEL-a sytuacja jest odwrotna.
Jeżeli stosujemy indeksację rejestrową to rozkaz musi zawierać zawsze ..............................bajt jest obecny nawet gdy przesunięcie jest zerowe. Jeśli w instrukcji występują równocześnie bajt związany z adresem i bajt związany z danymi to są one zapisywane..........................................
LD ( IY + d ), n
KO
KO
d
n
LD ( n n ), IX
KO
KO
n
n
Aby zamienić zestaw rejestrów podstawowych na alternatywny musimy użyć pary rozkazów. Rejestrów alternatywnych używamy szczególnie w przypadku procedur obsługi przerwania. nie wykorzystując pracochłonnych rozkazów chowania i odtwarzania na stosie. Warunkiem obsługa jednopoziomowa tzn. następne przerwanie nie przerywa poprzedniego
|
|
|
zamienia IX → IY |
|
|
|
|||||||
|
|
|
|
|
|
|
|
||||||
|
|
IX |
|
|
IY |
|
|
||||||
|
|
|
|
|
|
|
|
||||||
|
|
|
stos |
|
|
|
|||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||
|
|
|
|
|
|
|
|
||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||
|
|
|
lub |
|
|
|
||||||||||
EX (SP), IX |
|
EX (SP), IY |
|
PUSH IX |
||||||||||||
EX (SP), IY |
|
EX (SP), IX |
|
PUSH IY |
||||||||||||
EX (SP),IX |
|
EX (SP), .... |
|
POP IX |
||||||||||||
|
|
|
|
POP IY |
Na liście Z80 występują po raz pierwszy rozkazy blokowe (dotyczą one wyłącznie przesłań pamięci bądź przesłań pomiędzy pamięcią a przestrzenią we/wy.
Rozkaz blokowy zastępuje kilka innych instrukcji a w przypadku Z80 wykonuje się jeszcze metodą cofania PC i ponawiania za każdym nawrotem powielania 2-bajtowego KO (przy przesłaniu blokowym pamięci efektywność wynosi więc 50 %)
Rozkazy blokowe mogą być przerywane w normalny sposób za każdym nawrotem, zaś oddawane magistrali dopuszczalne jest oczywiście po każdym jego cyklu magistral. Przed użyciem rozkazu blokowego (łańcuchowy string ............) należy załadować odpowiedni stan do rejestrów BC, DE, HL. Występuje wiele mutacji przesłania blokowego jak również wersje jednokrotne przeznaczone w zastosowaniach innego warunku końca niż niezerowanie się pary BC.
Przestrzeń we/wy Z80 ma nominalnie 256 lokacji (adres na liniach A0 - A7). Jednakże ponieważ μP wyprowadza na górną połowę szyny adresowej stany rejestrów A lub B to rzeczywista ilość lokacji może wynosić 216. Używany tryb adresacji to bezpośredni (bajt za kodem operacyjnym) lub pośredni rejestrowy (adres w rejestrze C). Przed rozkazem we/wy występują także instrukcje blokowe (maksymalnie 256 nawrotów zliczanych wstecz przez rejestr B). Przy operacji blokowej inkrementacji ulega tutaj wyłącznie wskaźnik adresowy pamięci (para HL) natomiast zawartość rejestru C adresująca we/wy nie ulega zmianie (układ wtedy np. wyprowadza szeregowo przez tą samą lokację kolejne bajty). W przypadku tych instrukcji blokowych symetrycznie występują wersje z dekrementacją i wersje jednokrotne.
Oprócz blokowych przesłań występują także porównania. Rozkazy te przeszukują zadany obszar pamięci pod kątem znalezienia bajtu zgodnie ze wzorcem zapisanym do akumulatora. Wyjście z rozkazu porównania blokowego może nastąpić po :
stwierdzeniu zgodności
przepatrzeniu całego obszaru
Dla potrzeb procedury zliczającej ilość zgodnych bajtów odmiennie ustawiony jest bit Z (wyjście po stwierdzeniu równości Z=1 wyjście ostateczne Z=0).
Uwaga !!! Tutaj są znaczne braki ponieważ wyszedłem w wykładu po ksera. Tekst tylko z kasety!
Jak odczytać aktualną zawartość PC ? - dać rozkaz CALL (wywołanie) który pójdzie na miejsce przez nas wskazane a na stosie zostawi PC. Kiedy natychmiast z tej lokacji powrócimy a na stosie PC zostanie. W następnych rozkazach możemy zdjąć ze stosu to co tam było.
Wskaźnik stosu SP może być załadowany bezpośrednio względnie z rejestru IX IY oraz HL. Odczytanie SP jest natomiast utrudnione. Jedyna możliwość to wykonanie rozkazu ..................po uprzednim wyzerowaniu HL. Stan PC jest ustalany na 0 po wyzerowaniu a potem uwalnia rozkazy skoku wywołań, powrotów i przerwania. Wśród skoków występują także instrukcje ............................przenoszące do PC stan wyróżnionych rejestrów. Odczytanie stanu PC napotyka na szczególne trudności. Jedynym sposobem jest użycie instrukcji CALL a w miejscu wywołania umieszczenie rozkazu RET. Ponieważ odczyt z pamięci jest nieniszczący więc na stosie po powrocie pozostanie wartość PC na instrukcji następnej za rozkazem CALL.
Z80 str.8 - IM0 - po resecie ustawia się w tryb przerwań obsługi zerowej czyli używa rozkazu restartu chyba że przełączymy go softwerowo w inny tryb tryb 1 (zacznie obsługę od 38 lokacji) oraz tryb 2 pośredni używając tabeli adresów startowych.
μP Z80 dopuszcza operację na wyróżnionych bitach (w rejestrach bądź w lokacjach pamięciowych adresowanych poprzez HL, IX, IY). Bity mogą być przenoszone do flag Z w celu użycia instrukcji skoku warunkowego, mogą być też selektywnie zerowane i ustawiane. Niniejszy zestaw czynności nie obejmuje jeszcze rozkazów negacji bitu, skoku od bitu z zanegowaniem, ustawieniem bądź wyzerowaniem. W nowszych μP pojawiły się nawet operacje na tzw. polach bitowych.
W ciągu instrukcji przesunięć i obrotów μP Z80 dysponuje także obrotami 3 cyfrowej liczby dziesiętnej w kodzie BCD w której liczba setek to dolna połówka akumulatora a pozostałe cyfry to lokacja pamięciowa. Przy operacjach arytmetyczno - logicznych jednym z argumentów (domyślnym) jest zawsze akumulator.