Politechnika Białostocka Wydział Elektryczny Katedra Automatyki i Elektroniki SYMULATOR PROGRAMOWY MIKROPROCESORA Z80 opis użytkowy dr inż. L.Grodzki na podstawie pracy dyplomowej mgr inż. J.Rydzewskiego Białystok 2015
1 OGÓLNY OPIS PROGRAMU...3 1.1 INSTALACJA PROGRAMU...3 1.2 KONFIGUROWANIE PROGRAMU...3 1.3 SYMULACJA I WIZUALIZACJA STANU PROCESORA...5 1.4 ZARZĄDZANIE OKNAMI W PROGRAMIE...10 2 OPIS UŻYTKOWY SYMULATORA...10 2.1 PRZYGOTOWANIE TEKSTU PROGRAMU...11 2.2 ASEMBLACJA PROGRAMU...12 2.3 OBSŁUGA SYMULATORA...14 2.3.1 Praca krokowa...15 2.3.2 Praca ciągła...15 2.3.3 Przeskocz...16 2.3.4 Wykonaj do...16 2.3.5 Wykonaj do RET...16 2.3.6 Auto krok...16 2.3.7 Pułapki...16 2.3.8 Przerwania...17 2.4 MENU PROJEKT...18 3 BIBLIOGRAFIA...19 2
1 Ogólny opis programu Oprócz podstawowej funkcji jaką jest programowa symulacja działania mikroprocesora Z80, program oferuje użytkownikowi wbudowany edytor tekstu źródłowego oraz mechanizm asemblacji tego tekstu do pliku wynikowego, przy użyciu wybranego asemblera (domyślnie jest to meta-asembler C32 [2]). Program posiada uporządkowane menu, w którym zawarte są wszystkie funkcje. Dodatkowo poniżej menu umieszczono pasek z szybkimi przyciskami, które realizują najczęściej wykonywane funkcje. Program może pracować pod systemami rodziny Windows czyli Windows 98, Windows Me, Windows 2000 i Windows XP. Typ systemu nie ma dużego znaczenia, ponieważ program nie korzysta ze specyficznych dla danego systemu funkcji. 1.1 Instalacja programu Program nie wymaga specjalnej procedury instalacyjnej w 32-bitowych systemach operacyjnych. W przypadku 64-bitowych wersji systemów operacyjnych ze względu na wykorzystywanie meta-asemblera c32.exe konieczne jest skorzystanie z wirtualnej maszyny XP. W takim przypadku katalog z plikami roboczymi oraz oprogramowaniem narzędziowym (np. Z80) należy założyć na udostępnionym przez wirtualne XP dysku C (inna lokalizacja tego katalogu uniemożliwi uruchomienie meta-asemblera). 1.2 Konfigurowanie programu W celu dostosowania programu do indywidualnych potrzeb użytkownika, posiada on możliwość ustawiania pewnych parametrów, które decydują o działaniu programu. Wszystkie parametry konfiguracji programu można zmieniać w specjalnym oknie konfiguracji, które otwiera się z menu [Konfiguracja/Zmień...]. Okno to zawiera kilka zakładek z grupami ustawień. Na każdej zakładce znajdują się parametry wybranej grupy. Podział ten ułatwia orientację w gąszczu różnych opcji. Widok zakładek okna konfiguracji przedstawiają rysunki 1.1-1.4. Po zmianie ustawień konfiguracyjnych wskazane jest ich zapisanie w pliku konfiguracyjnym SYMULATOR.INI opcjami [Konfiguracja/Zapisz]. 3
Rys. 1-1. Okno konfiguracji - ustawienia ogólne Rys. 1-2. Okno konfiguracji - ustawienia kolorów 4
Rys. 1-3. Okno konfiguracji - ustawienia edytora Rys. 1-4. Okno konfiguracji - ustawienia asemblacji 1.3 Symulacja i wizualizacja stanu procesora Symulacja mikroprocesora wykonywana jest na poziomie rozkazów. Poziom ten jest wystarczający do testowania i uruchamiania programów pisanych przez studentów na zajęciach laboratoryjnych. Funkcje dotyczące symulacji są wzorowane na funkcjach pana Marata Fayzullina. Źródła tych funkcji udostępnił on do niekomercyjnego wykorzystania na [3]. 5
Wizualizacja zestawu rejestrów i flag umieszczona jest w oddzielnym oknie, które nazywa się Rejestry, przedstawionym na rysunku 1.5. Minimalny widok tego okna zawiera flagi i rejestry podstawowe. Wartości rejestrów są przedstawione na dwa sposoby: w systemie szesnastkowym (HEX), w specjalnym polu edycyjnym obok nazwy rejestru i w systemie binarnym, za pomocą kolorowych prostokątów reprezentujących poszczególne bity rejestru. Wartość rejestru można zmieniać wpisując wartość w systemie szesnastkowym (HEX) lub klikając na poszczególne prostokąty i modyfikując w ten sposób wartość pojedynczych bitów. Rys. 1-5. Pełne okno rejestrów Okno rejestrów może być powiększone o prezentację zawartości pamięci adresowanej przez rejestry, które mogą służyć m.in. do adresowania pośredniego: BC, DE, HL, IX, IY, PC, SP. Możliwe jest również powiększenie okna w celu prezentacji zestawu rejestrów alternatywnych. Rozwiązanie takie daje możliwość zaoszczędzenia miejsca na ekranie przez dostosowanie wymiarów okna do potrzeb użytkownika. Zawartość pamięci RAM jest przedstawiona w oknie RAM X, gdzie X to numer okna pamięci. Oznacza to możliwość pokazania kilku okien z pamięcią. Każde ma swój numer. Przykładowy widok takiego okna jest na rysunku 1.6. Dzięki temu możliwe jest obserwowanie jednocześnie kilku obszarów pamięci. Poszczególne komórki pamięci umieszczone są w tabeli, która ma 9 kolumn i w zależności od rozmiaru pamięci odpowiednią liczbę wierszy. W pierwszej kolumnie umieszczony jest adres pierwszej komórki w danym wierszu. Następne osiem kolumn to kolejne komórki pamięci. Dziewiąta kolumna przedstawia odpowiedniki w kodzie ASCII zawartości komórek w 6
wierszu. Na dole okienka umieściłem pasek statusu, na którym wyświetlane są informacje takie jak: adres zaznaczonej komórki pamięci, wartość w systemie szesnastkowym HEX, wartość w systemie dziesiętnym i znak w kodzie ASCII. W razie gdyby zaistniała konieczność odświeżenia widoku pamięci, należy dwukrotnie kliknąć na pasek statusu. Po zakończonym odświeżaniu zostanie wyświetlony na tym pasku komunikat: Odświeżanie zakończone. Rys. 1-6. Okno widoku pamięci Prezentacja portów wejść/wyjść posiada osobne okno Porty, jak na rysunku 1.7, niewidoczne przy uruchomieniu programu. Można je jednak przywołać poleceniem [Okna/Pokaż porty]. W oknie Porty możliwy jest jednoczesny podgląd czterech portów. Numer portu można wybrać za pomocą specjalnych pól edycyjnych, w których numer portu jest przedstawiony w systemie szesnastkowym. Zawartość wybranego portu jest prezentowana (podobnie jak rejestry) na dwa sposoby: w systemie szesnastkowym (HEX), w specjalnym polu edycyjnym obok numeru portu i w systemie binarnym, za pomocą kolorowych prostokątów reprezentujących stany poszczególnych bitów portu. Rys. 1-7. Okno portów we/wy Okno Kod programu zawiera interpretację zawartości pamięci jako rozkazów mikroprocesora. Główną część okna zajmuje tablica posiadająca trzy kolumny: adres, kod, rozkaz. W każdym wierszu w pierwszej kolumnie znajduje się adres początku rozkazu, w drugiej - kod rozkazu w kodzie HEX, w trzeciej mnemonik asemblerowy rozkazu. Program nie ma możliwości rozpoznania czy pod danym adresem w pamięci 7
znajduje się rozkaz czy dane. Dlatego cały obszar pamięci jest interpretowany jako rozkazy. Z tego względu może się zdarzyć, że początek kolejnego rozkazu zacznie się w niewłaściwym miejscu. Na rysunku 1.8 jest pokazane przykładowe źródło programu, które zostało skompilowane i załadowane do pamięci symulatora. CPU "Z80.TBL" HOF "INT8" ORG 0H jp start dwl 0C334H start: inc a jp start END Rys. 1-8. Zła interpretacja kodu programu Program zaczyna się od adresu 0H. Pierwszą instrukcją jest skok do etykiety start, która znajduje się za dwubajtową daną 0C334H. Następnie zwiększana jest o jeden wartości rejestru A i następuje ponowny skok do etykiety start. Po kompilacji i załadowaniu tego programu do pamięci symulatora, w oknie Kod programu pojawiła się interpretacja tego kodu widoczna na rysunku 1.8. Na przykładzie tego krótkiego programu widać, że interpretacja kodu pierwszej instrukcji jest prawidłowa JP 0005H, a następna instrukcja została zinterpretowana jako INC (HL), a nie jako dana 34H. To jeszcze nie stwarza problemu, bo rozkaz jest jednobajtowy i interpretacja następnego kodu zacznie się od kolejnego bajtu. Następny zinterpretowany rozkaz jest już 3 bajtowy (JP XXXXH). Nakłada się on na następną prawidłową instrukcję, powodując błędne interpretacje kodów dalszych rozkazów. Choć program jest wykonywany prawidłowo to interpretacja w oknie kodu jest błędna. Jeżeli chcemy, aby w dalszej części program był interpretowany poprawnie należy podać adres, od którego zaczyna się poprawna instrukcja. Można zrobić to klikając prawym przyciskiem myszki w oknie kodu programu i z menu podręcznego wybrać opcję Pokaż kod od... Pojawi się okno z pytaniem o adres jak na rysunku 1.9. 8
Rys. 1-9. Okno do podania adresu Należy podać adres (w tym przypadku 0005H) i zaznaczyć opcję Początek od tego adresu. Teraz okno kodu programu wygląda tak jak na rysunku 1.10. Rys. 1-10. Prawidłowa interpretacja kodu programu Okno Kod programu oprócz prezentacji przetłumaczonych rozkazów, posiada kilka innych przydatnych funkcji, takich jak: zmiana rozkazów - realizowaną przez edycję mnemonika rozkazu w trzeciej kolumnie okna. Jeśli nowy rozkaz jest dłuższy (w bajtach) od pierwotnego, to zmianie ulegną także bajty następne. Jeśli zmieniony rozkaz jest krótszy, to wolne miejsce jest wypełniane rozkazami NOP. W obu przypadkach wyświetli się okienko z informacją, jaka jest różnica w bajtach i pytaniem czy kontynuować zmianę rozkazu. Edycja bezpośrednio w oknie kodu programu powinna ograniczyć się do drobnych zmian, nie powodujących zwiększenia długości kodu rozkazu. Natomiast większe zmiany powinny być nanoszone w kodzie źródłowym programu; odświeżenie widoku - realizowane po kliknięciu w dolny pasek okna programu (zgodnie z widocznym na nim opisem). Ponieważ odświeżanie może czasem zająć sporo czasu, w celu jego przerwania należy powtórnie kliknąć na pasek statusu; wyróżnienie wiersza z rozkazem, który zostanie wykonany w następnym kroku pracy procesora (czyli pozycja rejestru PC) - wyróżniony wiersz ma czerwone tło; modyfikacja wartości licznika rozkazów PC - jeżeli nowa wartość PC ma wskazywać na jeden z rozkazów widocznych w oknie programu, to należy kliknąć prawym 9
klawiszem myszy na tym rozkazie i wybrać z pojawiającego się menu opcję PC=XXXX, zmieni się wartość PC i wskazany rozkaz zostanie podświetlony jako rozkaz do wykonania; wyróżnienie wierszy, w których zostały ustawione pułapki - wyróżniony wiersz ma zielone tło; ustawianie pułapek programowych - po kliknięciu prawym klawiszem myszy na wybrany rozkaz wskazujemy opcję Przełącz pułapkę albo po wskazaniu rozkazu lewym klawiszem myszy wciskamy F2; wykonanie programu do wybranego, widocznego w oknie rozkazu - po kliknięciu prawym klawiszem myszy na wybrany rozkaz wskazujemy Wykonaj do albo po wskazaniu rozkazu lewym klawiszem myszy wciskamy F4. 1.4 Zarządzanie oknami w programie Okna widoczne podczas pracy programu symulatora podlegają typowym regułom, jak w programach okienkowych: mogą być przesuwane, zamykane, można zmieniać ich wymiary. Dodatkowo okno edytora tekstu programu może być minimalizowane lub maksymalizowane. Opcje menu: [Okna/Ustaw okna] oraz [Okna/Ustaw okna i rozmiary] służą szybkiemu uporządkowaniu podstawowych okienek wizualizujących stan symulowanego procesu. Opcja [Okna/Nowe okno RAM] pozwala otwierać kolejne okna do podglądu zawartości symulowanej pamięci operacyjnej. Okna te zawsze pokazują zawartość pamięci od komórki o adresie 0000h. Chcąc oglądać inny fragment pamięci należy użyć dostępnych z boku przycisków suwaka. Wśród przycisków szybkiego wyboru znajdują się także przyciski przełączające (aktywujące) okno Rejestry, Kod programu i dowolne okno RAM X. 2 Opis użytkowy symulatora Program uruchamia się przez wywołanie pliku symulator.exe Po chwili pojawia się okno główne programu jak na rysunku 2.1. Rys. 2-1. Okno główne programu 10
Następnie, w zależności od potrzeb, przystępujemy do przygotowanie tekstu programu, jego asemblacji lub symulacji wcześniej przygotowanego kodu programu. Sposób przeprowadzenia tych czynności zostanie opisany poniżej. 2.1 Przygotowanie tekstu programu Tekst programu uruchamianego programu można przygotować w dowolnym edytorze tekstowym pozwalającym na zapis tekstu bezpośrednio w kodzie ASCII (bez informacji edytorskich i formatujących). Najwygodniejszym jednak rozwiązaniem jest skorzystanie z edytora wbudowanego w opisywany symulator. Oferuje on funkcję kolorowania składni - dzięki niej w tekście programu możemy rozróżnić krojem lub kolorem czcionki takie elementy jak: mnemoniki rozkazów, liczby, etykiety, komentarze itd. (patrz konfigurowanie programu). Chcąc rozpocząć pisanie tekstu nowego programu, należy użyć menu Asembler/Nowy lub klawisza szybkiego wyboru umożliwiające wpisywanie tekstu programu (rysunek 2.2).. Pojawi się wtedy okno Rys. 2-2. Okno edytora z przykładowym programem Można również rozpocząć od gotowego "pliku startowego" SZKIELET.ASM zawierającego już niezbędne dyrektywy asemblera. Należy w tym celu skorzystać z opcji [Asembler/Otwórz plik ASM] albo klawisza szybkiego wyboru. W ten sam sposób można powrócić do edycji uprzednio przygotowywanego programu. Menu 11
[Asembler] ma także opcję [Wczytywane], umożliwiającą szybkie odwołanie się do jednego z pięciu wcześniej edytowanych plików. Po napisaniu programu dla Z80 należy zapisać go na dysku, używając menu [Asembler/Zapisz ASM jako...] lub klawiszem. Pojawi się standardowe dla systemu Windows okno dialogu do zapisania pliku. Aktualizację już istniejącego pliku ASM nową treścią wykonuje się tak samo. 2.2 Asemblacja programu Program może współpracować z dowolnym asemblerem, generującym plik z kodem binarnym w formacie Intel-hex. Wyboru programu asemblującego dokonuje się na odpowiedniej zakładce okna konfiguracji. Domyślnie program jest skonfigurowany do korzystania z meta-asemblera C32.EXE. Wynikają z tego pewne ograniczenia: nazwy plików *.ASM muszą być w formacie DOS-owym '8.3', tj. maksimum 8 znaków nazwy; nazwy katalogów nie powinny być dłuższe niż 8 znaków. Przygotowany w edytorze program można skompilować używając menu [Asembler/Kompiluj] lub klawiszem. UWAGA: Za każdym razem, gdy chcemy skompilować edytowany program, plik w edytorze musi być zapisany na dysku. Operację zapisu przed kompilacją można zautomatyzować, zaznaczając w konfiguracji na zakładce Kompilator opcję Automatycznie zapisz przed kompilacją. Przy takim ustawieniu, gdy zostanie użyta komenda [Asembler/Kompiluj] lub klawisz, najpierw plik w edytorze zostanie zapisany na dysk, a potem zostanie wykonana kompilacja. Po kompilacji może się okazać, że wystąpiły błędy. Są one wyświetlane w dolnej części okna edytora, gdzie pojawia się wyjście kompilatora 1 (rysunek 2.3). 1 wyjście kompilatora komunikaty wyświetlane przez program w czasie jego działania 12
Rys. 2-3. Wynik kompilacji programu z błędami Kursor edytora zostanie przeniesiony w miejsce pierwszego błędu. U dołu rysunku 2.3 widoczny jest opis błędu w linii 10 kolumna 12 o treści Undefined label, czyli niezdefiniowana etykieta. Jak widać w kodzie źródłowym w instrukcji jr dale w etykiecie dale brakuje jednej litery j. Po poprawieniu błędu możemy przejść do następnego wykrytego błędu, klikając dwukrotnie w dolnej części okna edytora na linijce zawierającej tekst następnego błędu. Kursor edytora zostanie przeniesiony w miejsce, gdzie wystąpił błąd. W ten sposób można szybko poprawić błędy, nie tracąc czasu na odnajdywanie miejsca, w którym one wystąpiły. Jeżeli program asemblujący nie zgłosi żadnego błędu, nie pojawią się dodatkowe informacje w oknie edytora. Przy asemblacji powstaje dodatkowo plik o rozszerzeniu *.LST, który zawiera pełny raport z pracy meta-asemblera C32 wraz z przedrukiem asemblowanego programu. Na zakładce Kompilator okna konfiguracji możliwe jest również włączenie opcji Pokazuj tylko ostrzeżenia i błędy, która powoduje filtrowanie wyników kompilacji tak, aby w miejscu wyników kompilacji znajdowały się tylko informacje dotyczące ostrzeżeń i błędów. Przy bezbłędnej asemblacji tekstu programu generowany jest plik wynikowy typu *.HEX (w formacie Intel-hex). Uwaga: widoczna w menu opcja [Pamięć/Asembluj z pliku] służy do asemblowania pojedynczych rozkazów, zapisanych w zewnętrznym pliku. Dlatego nie ma ona znaczenia praktycznego przy uruchamianiu programów. 13
2.3 Obsługa symulatora Przed rozpoczęciem symulacji należy wykonać dwie czynności: załadować do pamięci symulatora kod uruchamianego programu; zapewnić załadowanemu programowi odpowiedni obszar pamięci typu RAM. Pierwsza czynność może być realizowana automatycznie po poprawnej asemblacji, jeżeli na zakładce Kompilator okna konfiguracji zaznaczymy opcję Automatycznie wczytaj plik HEX po kompilacji. Można również wykorzystać menu [Pamięć/Wczytaj], kombinację klawiszy [Ctrl+O] lub klawisz szybkiego wyboru. Ich użycie powoduje ukazanie się standardowego okna umożliwiającego wskazanie pliku (o domyślnym rozszerzeniu *.HEX), którego zawartość należy wczytać do pamięci symulatora. Menu [Pamięć] dysponuje także opcją [Wczytywane], której wybranie pozwala skorzystać z jednego z pięciu wcześniej ładowanych plików *.HEX. Ewentualne błędy odczytu wybranego pliku są zapisywane w oknie Log rysunek 2.4. Rys. 2-4. Okno logu z przykładowym komunikatem o błędzie odczytu pliku *.HEX Podczas ładowania kodu programu pamięć symulatora ulega rozszerzeniu do rozmiaru wynikającego z wielkości ładowanego kodu. Jednak testowany program podczas symulacji zwykle potrzebuje tzw. pamięci danych (RAM), w której powinny znaleźć się jego struktury danych, jak również stos programowy. Zarezerwowanie fragmentu pamięci typu RAM dla stosu jest konieczne, jeżeli w programie występują wywołania procedur lub przewiduje się wykorzystanie systemu przerwań. Jest to właśnie druga z niezbędnych czynności przed przystąpieniem do właściwej symulacji. Rozszerzenia lub wstępnego ustawienia rozmiaru symulowanej pamięci dokonuje się przy pomocy menu [Pamięć/Rozmiar RAM...]. W pojawiającym się okienku (rysunek 2.5) należy podać (w postaci HEX) maksymalny adres pamięci RAM, który będzie dostępny dla procesora. Po chwili pamięć zostaje przydzielona i wyzerowana. Rozmiar pamięci będzie o 1 większy niż podany adres. Dzieje się tak z powodu adresowania pamięci od zera, czyli pierwsza komórka pamięci ma adres 0H, druga 1H, trzecia 2H, itd. W przypadku procesora Z80 szyna adresowania ma szerokość 16 bitów, więc maksymalny adres może osiągnąć wartość 2 16 1 = 65535 = FFFFH. Do 14
podglądu pamięci programu i pozostałych obszarów symulowanej pamięci RAM służą opisane w pkt. 1.2 okna Kod programu i RAM X. Rys. 2-5. Definiowanie maksymalnego rozmiaru symulowanej pamięci Menu [Pamięć] posiada także opcję [Zapisz], uruchamianą także kombinacją klawiszy [Ctrl+S] lub klawiszem szybkiego wyboru. Powoduje ona pojawienie się standardowego okienka umożliwiającego zapis do wskazanego pliku bieżącego obrazu symulowanej pamięci operacyjnej mikroprocesora. Zapis odbywa się w formacie Intelhex. Mechanizm ten pozwala na zapamiętanie w pliku stanu symulowanej pamięci, by powrócić do pracy nad programem w późniejszym okresie. Kiedy już mamy załadowany program i zdefiniowaną jego pamięć operacyjną, możemy przystąpić do jego symulacji. Symulator oferuje dwa główne tryby pracy (krokowy i ciągły) oraz kilka innych, będących modyfikacjami głównych (Przeskocz, Wykonaj do, Wykonaj do RET, Auto krok). Poniżej przedstawiony jest opis każdego z wyżej wymienionych trybów pracy. 2.3.1 Praca krokowa Jeden krok procesora można wykonać za pomocą menu: [Procesor/Krok], za pomocą klawiatury przyciskiem F7 lub klawiszem szybkiego wyboru. Wykonany zostaje jeden rozkaz wskazywany przez aktualną zawartość rejestru licznika rozkazów PC. 2.3.2 Praca ciągła Tryb ten włącza się z menu [Procesor/Run Z80], klawiszem F9 lub klawiszem szybkiego wyboru. Zostaje włączone ciągłe wykonywanie pojedynczych kroków. Wyłączenie tego trybu może nastąpić na skutek jakiegoś zdarzenia (koniec pamięci, odczyt/zapis poza pamięcią, pułapka i inne). Ponadto można ręcznie zatrzymać wykonywanie programu przy pomocy menu [Procesor/Pauza] lub klawiszem szybkiego wyboru. 15
2.3.3 Przeskocz Tryb ten zachowuje się jak tryb krokowy, jeśli rozkazem do wykonania nie jest CALL. W przeciwnym przypadku zostaje wykonana procedura (CALL) w trybie pracy ciągłej. Po zakończeniu procedury program jest zatrzymywany. W efekcie procedura zostaje potraktowana jak jeden rozkaz w trybie krokowym. Pozwala to na omijanie całych procedur i szybsze analizowanie wykonywania programu. Ten tryb symulacji uruchamia się z menu [Procesor/Przeskocz], klawiszem F8 lub. 2.3.4 Wykonaj do Tryb ten uruchamia się z menu [Procesor/Wykonaj do] lub klawiszem F4. W trybie tym program przechodzi w tryb ciągłej symulacji, która jest zatrzymywana po dojściu wykonywania do zaznaczonego wiersza w oknie Kod programu. 2.3.5 Wykonaj do RET Tryb ten uruchamia się z menu [Procesor/Wykonaj do RET], kombinacją klawiszy Shift+F8 lub przyciskiem. Włączany jest tryb pracy ciągłej. Jak nazwa wskazuje, symulacja jest zatrzymywana po wykonaniu rozkazu RET, czyli powrotu z procedury. Dzięki temu można odnaleźć miejsce wywołania procedury. 2.3.6 Auto krok Tryb ten powoduje cykliczne wykonanie pojedynczych kroków z odstępem czasowym określonym w konfiguracji (rysunek 1.1 na stronie 4). Włącza się go poleceniem [Procesor/Auto krok] lub kombinacją klawiszy Shift+F7. Natomiast wyłączyć można ponownie wybierając [Procesor/Auto krok], poleceniem [Procesor/Pauza] lub klawiszem. 2.3.7 Pułapki Do testowego zatrzymywania wykonywania programu w dowolnym miejscu można użyć pułapek. W celu ustawienia pułapki, po przejściu do wybranego wiersza, należy w oknie Kod programu wybrać z menu [Pułapki/Przełącz pułapkę] lub nacisnąć klawisz F2. Ustawiona pułapka jest sygnalizowana zmienionym (zielonym) tłem wiersza. Zestawienie wszystkich pułapek można zobaczyć w oknie pułapek (rysunek 2.6). Okno to można przywołać z menu [Pułapki/Lista pułapek] lub [Okna/Lista pułapek]. 16
Rys. 2-6. Okno listy pułapek Klikając dwukrotnie w obszarze kolumny Stan, można tymczasowo wyłączyć pułapkę. W takim przypadku stan tej pułapki zmienia się na Nie aktywna. Znika też wyróżnienie w oknie Kod programu. Dwukrotne kliknięcie poza kolumną Stan powoduje przejście kursora w oknie Kod programu do wiersza z adresem pułapki. W ten sposób można szybko przeglądać w jakich miejscach znajdują się poszczególne pułapki. 2.3.8 Przerwania Mikroprocesor Z80 posiada możliwość przyjmowania dwóch przerwań zewnętrznych: niemaskowalnego (NMI) i maskowalnego (INT). Przerwanie powoduje zatrzymanie wykonywania programu i wykonanie specjalnego kodu, który zwany jest procedurą lub podprogramem obsługi przerwania. Po wykonaniu tej procedury procesor powraca do wykonywania przerwanego programu. Przyjęcie przerwania powoduje automatyczne zapamiętanie na stosie zawartości licznika rozkazów, co umożliwia poprawny powrót do programu wykonywanego przed przerwaniem. Nie jest zapamiętywana zawartość żadnych innych rejestrów. Podprogram obsługi przerwania musi zadbać o to sam. Po przyjęciu przerwania niemaskowalnego (NMI) następuje skok do procedury obsługi przerwania pod adresem 66H. W przypadku przerwania maskowalnego (INT) procesor dysponuje trzema trybami jego obsługi, przełączanymi programowo. W trybie 0 procesor przyjmując przerwanie traktuje zawartość szyny danych jako kod rozkazu do wykonania. Tę daną powinno dostarczyć urządzenie zewnętrzne. Najczęściej stosuje się przesłanie kodu rozkazu restartu RST, który jest jednobajtowym rozkazem wywołania podprogramu mieszczącego się pod jednym z adresów: 00H, 08H, 10H, 18H, 20H, 28H, 30H, 38H. W trybie 1 zostaje wywołany podprogram mieszczący się pod adresem 38h. W trybie 2 procesor oczekuje od urządzenia zewnętrznego wystawienia na magistralę danych bajtu, traktowanego jako mniej znacząca połowa adresu. Jako bardziej znaczący bajt adresu, procesor pobiera ustawioną programowo zawartość 17
rejestru I, a następnie dokonuje odczytu dwubajtowego słowa mieszczącego się w pamięci pod wskazanym adresem. Te dwa odczytane bajty traktuje jako adres podprogramu obsługi przerwania. Najmniej znaczący bit bajtu przekazywanego przez urządzenie zewnętrzne jest ignorowany i zawsze traktowany jako 0. Przerwania w symulatorze można generować za pomocą poleceń: [Procesor/NMI] i [Procesor/INT], klawiszami odpowiednio F10, F11 lub klawiszami szybkiego wyboru i. Jeśli aktualny tryb (0 lub 2) wymaga przyjęcia dodatkowych danych związanych z przerwaniem to zostanie wyświetlone okno (rysunek 2.7), w którym należy podać te dane. Rys. 2-7. Okno przyjęcia wektora przerwania INT 2.4 Menu Projekt Dzięki temu menu można zapisać lub wczytać z dysku stan pracy symulatora. Dokładniej chodzi tu o otwarte pliki oraz położenie i rozmiar okien na ekranie. Projekt można zapisać używając menu [Projekt/Zapisz jako...]. Zostanie stworzony plik w formacie INI i rozszerzeniu *.PRO. Będą w nim zapisane informacje o: rozmiarze pamięci, otwartych plikach oraz położeniu okien i ich stanie. Wczytując projekt przez menu [Projekt/Otwórz projekt...] lub przyciskiem szybkiego wyboru, zmieniany jest rozmiar pamięci, otwierane są odpowiednie pliki oraz ustawiane są okna w zapisanych wcześniej pozycjach. Dzięki temu można szybko przywrócić ustawienia i wygląd okien do poprzedniego stanu. Menu [Projekt] posiada również opcję [Wczytywane], która umożliwia szybkie odwołanie się do jednego z pięciu ostatnio używanych projektów (symulacji). Opcja [Projekt/Nowy] ( ) pozwala zainicjować pracę nad nowym projektem. 18
3 Bibliografia Opis symulatora programowego Z80 [1] "Symulator programowy mikroprocesora Z80", J.Rydzewski, praca magisterska 2004. [2] Opis metaasemblera C32, opr. dr inż. Lech Grodzki, (Białystok 2003) - http://vela.pb.bialystok.pl/~kaie/kaie-md/lab/metaasembler.pdf [3] Home Page of Marat Fayzullin, Marat Fayzullin (2004) - http://fms.komkon.org/ 19