Architektura PMC


Podrozdziały
 

W rozdziale przedstawiam krok po kroku wszystkie elementy PMC, których znajomość jest niezbędna do programowania tego komputera.

 

Struktura logiczna PMC


John Von Neuman
(1903 - 1957)

Wszystkie współczesne komputery budowane są wg schematu określonego w 1945 przez Johna Von Neumana. Schemat ten zakłada, iż komputer będzie posiadał trzy odrębne elementy składowe: pamięć, urządzenia wejścia/wyjścia oraz procesor. W pamięci będą przechowywane przetwarzane dane oraz program dla procesora. Urządzenia wejścia/wyjścia umożliwią wymianę informacji pomiędzy komputerem a otoczeniem, natomiast procesor umożliwi przetwarzanie danych. Nasza Przykładowa Maszyna Cyfrowa również zbudowana jest wg schematu komputera Johna Von Neumana i posiada wszystkie trzy wymienione wyżej składniki.

 


Struktura logiczna Przykładowej Maszyny Cyfrowej

 

Centralną funkcję w systemie pełni procesor, który komunikuje się z pozostałymi komponentami za pomocą trzech magistral (magistrala składa się z kilku linii, po których biegną sygnały cyfrowe, tzn. 0 lub 1):

Pamięć PMC

Omawianie struktury PMC rozpoczniemy od pamięci. Pamięć jest elementem każdego komputera, w którym przechowuje się program dla procesora oraz dane przez ten program przetwarzane. Pamięć składa się z komórek. W PMC każda komórka może zapamiętać 16 bitów, powiemy więc, iż pamięć PMC jest 16 bitowa. Aby uzyskać dostęp do zawartości komórki musimy operować adresem. Adres jest numerem przypisanym każdej komórce. W PMC pierwsza komórka pamięci ma adres 8, a ostatnia 1023. Wynika stąd, iż komórek pamięci jest w sumie 1016 (w rzeczywistej pamięci komórek tych jest 1024, lecz pierwsze osiem nie są dostępne dla procesora, gdyż w tym miejscu przestrzeni adresowej przebywają rejestry wejścia/wyjścia). Ponieważ PMC służy tylko do przykładowych programów, jest to ilość więcej niż wystarczająca.

 


Schemat pamięci PMC

 

Gdy sygnał sterujący MEM ma stan 1, pamięć PMC może wykonywać dwa cykle pracy - cykl zapisu oraz cykl odczytu. Gdy sygnał MEM ma stan niski 0, pamięć jest nieaktywna i odłączona od magistrali danych.

 

Cykl odczytu pamięci PMC

Każdy cykl rozpoczyna się stanem niskim sygnałów R, W oraz MEM,

  1. Procesor ustawia na magistrali adresowej adres komórki, którą chce odczytać. Dekoder adresowy wewnątrz pamięci uaktywnia odpowiednią komórkę. Ponieważ sygnał MEM jest w stanie niskim 0, to pamięć jest odłączona od magistrali danych.
  2. Procesor ustawia w stan wysoki sygnał R (Read - odczyt).
  3. Procesor ustawia w stan wysoki sygnał wyboru pamięci MEM. Po pojawieniu się tego sygnału uaktywniony zostaje układ zapisu/odczytu. Ponieważ sygnał R jest w stanie wysokim, więc na wyjście magistrali danych zostaje podana zawartość komórki, którą uaktywnia układ adresowy. Kończy to cykl odczytu.
  4. Procesor czeka przez odpowiedni okres czasu, aż ustalą się stany na magistrali danych, po czym odczytuje z niej zawartość adresowanej komórki pamięci.
  5. Procesor ustawia w stan niski sygnały R i MEM. Powoduje to odłączenie pamięci od magistrali danych i przejście w stan nieaktywny.
     


Cykl odczytu pamięci PMC

 

Cykl zapisu pamięci PMC

Na początku cyklu zapisu sygnały sterujące MEM, W oraz R mają stan niski 0.

  1. Procesor ustawia na magistrali adresowej adres komórki, do której chce wprowadzić informację. Na magistrali danych procesor ustawia dane do zapisu w komórce. Dekoder adresowy wewnątrz pamięci uaktywnia komórkę o podanym adresie. Ponieważ sygnał wyboru pamięci MEM ma jeszcze stan niski, to pamięć jest odłączona od magistrali danych.
  2. Procesor ustawia w stan wysoki 1 linię W (Write - zapis). Sygnał MEM ma stan niski, więc pamięć jeszcze nie reaguje na ten sygnał.
  3. Procesor ustawia w stan wysoki linię MEM. Powoduje to uaktywnienie układu zapisu/odczytu komórki pamięci. Ponieważ linia W jest w stanie wysokim, to układ ten odczytuje z magistrali danych daną i umieszcza ją w uaktywnionej przez dekoder adresowy komórce.
  4. Procesor czeka odpowiedni okres czasu, aby pamięć zdążyła pobrać dane i umieścić je w komórce.
  5. Procesor ustawia w stan niski linie W oraz MEM. Kończy to cykl zapisu. Pamięć staje się nieaktywna. Cykl zapisu zostaje ukończony.
     


Cykl zapisu pamięci PMC

 

Porty wejścia/wyjścia

Porty wejścia/wyjścia (ang. I/O - Input/Output) są bramami, poprzez które procesor może przesyłać informację do różnych urządzeń zewnętrznych komputera. W PMC jest osiem portów we/wy umieszczonych w przestrzeni adresowej procesora od adresu 0 do 7. Tłumaczy to, dlaczego właściwa pamięć rozpoczyna się dopiero od komórki o adresie 8 - niższe adresy zajmują porty.

Cykl zapisu i odczytu portu wejścia wyjścia jest identyczny z cyklem zapisu i odczytu pamięci. Jedyną różnicą jest użycie w tym przypadku linii IO do uaktywniania portów zamiast linii MEM. Porty posiadają różną długość w bitach w zależności od pełnionej przez nie funkcji i nie zachowują się jak komórki pamięci, tzn. zapis do portu powoduje wykonanie pewnej operacji przez urządzenie zewnętrzne, które jest sterowane za pomocą tego portu.

Teraz omówimy dokładnie każdy z portów dostępnych w PMC. Poznanie ich funkcji jest niezbędne dla programowania tego komputera.

 

CHP, CHI - Porty wyjścia znakowego


Widok ekranu znakowego na symulatorze PMC

 

PMC wyposażona jest w wyświetlacz znakowy, który potrafi wyświetlać 16 znaków. Nie jest to ilość imponująca, ale pamiętaj o przeznaczeniu PMC! Kolor wyświetlanych znaków wybieramy klikając w kolorowe przyciski umieszczone ponad wyświetlaczem po prawej stronie. Sterowanie odbywa się poprzez dwa skojarzone ze sobą porty:

 

Adres Port Funkcja
0 CHP CHaracter Port - port znakowy
1 CHI CHaracter Index Port - port indeksowy

 

Do portu CHP zapisujemy polecenie, które ma wykonać wyświetlacz. Polecenia są 9 bitowe i mają następujący format:

 

funkcja b8 b7 b6 b5 b4 b3 b2 b1 b0
znak 0 kod ASCII znaku
funkcja 1 0 0 0 0 0 x x x

 

Jeśli bit b8 ma wartość 0, to pozostałe bity są traktowane jako kod ASCII znaku, który zostanie wyświetlony na wyświetlaczu (jeśli więc zechcesz wyświetlić znak, to wystarczy przesłać do tego portu jego kod ASCII). Pozycję znaku na wyświetlaczu określa zawartość portu CHI. Na przykład, jeśli wyświetlacz jest pusty i do portu CHI prześlemy liczbę 5, a do CHP kod ASCII znaku A, to wyświetlacz znakowy przyjmie następujący wygląd:

 

. . . . . A . . . . . . . . . .

 

Literka A pojawi się na pozycji nr 5 (pozycje numerujemy od zera poczynając od lewej strony).  Jeśli teraz do portu CHI wpiszemy 6, a do CHP kod literki B, to na wyświetlaczu pojawi się następujący napis:
 

. . . . . A B . . . . . . . . .

 

Zrozumiałeś już przeznaczenie tych portów? Port CHP steruje wyświetlaniem znaków, a CHI określa pozycję znaku na wyświetlaczu. Port ten jest 4-bitowy. Ogólniej CHI określa pozycję wyświetlacza, której użyje funkcja wprowadzona do portu CHP.

Jeśli bit b8 ma stan 1 (kody > 255), to wprowadzenie takiej wartości do portu CHP spowoduje wykonanie operacji określonej stanem bitów b2, b1 oraz b0. Są to następujące operacje:

 

b8 b7 b6 b5 b4 b3 b2 b1 b0 Kod
1 0 0 0 0 0 0 0 0 256(10) 100(16)

DEL - usuwa znak na pozycji CHI. Znaki znajdujące się na prawo od tej pozycji są przesuwane o jedną kolumnę w lewo. Na ostatniej pozycji wyświetlacza umieszczana jest spacja. Na przykład, jeśli wyświetlacz przedstawia napis:


W i t a j c i e . w . P M C . .


...to po wprowadzeniu do portu CHI wartości 5, a do CHP kodu 256 na wyświetlaczu pojawi się:
 

W i t a j i e . w . P M C . . .


Z wyświetlacza zniknęła literka "c", ponieważ przed wykonaniem operacji DELETE literka ta była na pozycji 5, czyli tej, którą określiliśmy w porcie CHI. Zwróć uwagę, iż literki na prawo od tej pozycji zmieniły swoje położenie.
 

b8 b7 b6 b5 b4 b3 b2 b1 b0 Kod
1 0 0 0 0 0 0 0 1 257(10) 101(16)

INS - znaki zostaną rozsunięte w prawo począwszy od pozycji CHI. Znak, który znajdował się przed wykonaniem tej operacji na pozycji 15 wyświetlacza zostaje stracony. Następnie na pozycji CHI zostaje umieszczony znak spacji. Funkcja ta umożliwia zrobienie miejsca pod nowe znaki, które chcielibyśmy wstawić do tekstu już wyświetlonego na wyświetlaczu znakowym. Jeśli wyświetlacz ma następujący wygląd:
 

A B C D E F G H I J K L M N O P


to po wstawieniu do portu CHI wartości 5, a do portu CHP  kodu 257, wyświetlacz przyjmie następujący wygląd:
 

A B C D E . F G H I J K L M N O


Na pozycji 5 zrobione zostało miejsce - można tam bezpośrednio wprowadzić nowy znak. Znaki od F do O zostały przesunięte o jedną kolumnę w prawo. Literka P została usunięta z wyświetlacza.
 

b8 b7 b6 b5 b4 b3 b2 b1 b0 Kod
1 0 0 0 0 0 0 1 0 258(10) 102(16)

SHL - funkcja powoduje przesunięcie wszystkich znaków na wyświetlaczu o jedną kolumnę w lewo. Znak na pozycji 0 zostaje usunięty. Na pozycji 15 wpisywana jest spacja. Jeśli przed wykonaniem tej funkcji wyświetlacz znakowy miał wygląd:

N a s z a . k l a s a . I I I B


to po wprowadzeniu do portu CHP kodu 258, wyświetlacz zmieni się na:
 

a s z a . k l a s a . I I I B .


Funkcja SHL nie korzysta z zawartości portu indeksowego CHI. Funkcja ta pozwala w prosty sposób wyświetlać dłuższe teksty. Port CHI ustawiamy na 15. Następnie przed wypisaniem kolejnej literki tekstu wprowadzamy do portu CHP kod 258. Spowoduje to przesunięcie wszystkich znaków w lewo i pozostawienie pozycji 15 pustej. Teraz możemy zapisać do portu CHP kod znaku, który pojawi się na końcu wyświetlacza. Osiągniemy efekt giełdowego paska tekstowego.
 

b8 b7 b6 b5 b4 b3 b2 b1 b0 Kod
1 0 0 0 0 0 0 1 1 259(10) 103(16)

SHR - funkcja przesuwa wszystkie znaki na wyświetlaczu o jedną kolumnę w prawo. Znak na pozycji 15 zostaje usunięty. Na pozycję 0 wpisywana jest spacja. Jeśli przed wykonaniem tej funkcji wyświetlacz znakowy miał następującą zawartość:


N a s z a . k l a s a . I I I B


to po umieszczeniu w porcie CHP kodu 259, wyświetlacz zmieni się na:
 

. N a s z a . k l a s a . I I I


Funkcja SHR nie korzysta z zawartości portu indeksowego CHI.
 

b8 b7 b6 b5 b4 b3 b2 b1 b0 Kod
1 0 0 0 0 0 1 0 0 260(10) 104(16)

RLL - wszystkie znaki na wyświetlaczu zostają przesunięte o jedną kolumnę w lewo. Znak z pozycji 0 trafia na pozycję 15. Jeśli wyświetlacz miał zawartość:


N a s z a . k l a s a . I I I B


to po wprowadzeniu kodu 260 do portu CHP na wyświetlaczu pojawi się następujący napis:
 

a s z a . k l a s a . I I I B N


Po przesunięciu znaków w lewo literka N trafiła z pozycji 0 na pozycję 15. Funkcja ta umożliwia cykliczne wyświetlanie określonego napisu. Zawartość portu CHI nie jest wykorzystywana.
 

b8 b7 b6 b5 b4 b3 b2 b1 b0 Kod
1 0 0 0 0 0 1 0 1 261(10) 105(16)

RLR - wszystkie znaki na wyświetlaczu zostają przesunięte o jedną kolumnę w prawo. Znak z pozycji 15 trafia na pozycję 0. Jeśli wyświetlacz przed wykonaniem tej operacji miał zawartość:

N a s z a . k l a s a . I I I B


to po wprowadzeniu kodu 261 do portu CHP na wyświetlaczu pojawi się następujący napis:
 

B N a s z a . k l a s a . I I I


Po przesunięciu znaków w prawo literka B trafiła z pozycji 15 na pozycję 0. Funkcja ta umożliwia cykliczne wyświetlanie określonego napisu. Zawartość portu CHI nie jest wykorzystywana.
 

b8 b7 b6 b5 b4 b3 b2 b1 b0 Kod
1 0 0 0 0 0 1 1 0 262(10) 106(16)

CLR - funkcja usuwa wszystkie znaki z wyświetlacza. Zawartość rejestru CHI nie jest zmieniana. Funkcja umożliwia szybkie czyszczenie wyświetlacza znakowego przed wyprowadzeniem nowego tekstu.

 

Następną właściwością wyświetlacza znakowego (dotyczy to również pozostałych urządzeń we/wy, które posiadają porty indeksowe) jest możliwość odczytu jego zawartości. Jeśli odczytamy stan portu CHP, to dostaniemy w wyniku kod znaku, który jest wyświetlany na pozycji określonej zawartością portu CHI. Na przykład, jeśli wyświetlacz ma następującą zawartość:
 

A B C D E F G H I J K L M N O P


to wprowadzenie do portu CHI wartości 5, a następnie odczytanie portu CHP da w wyniku kod literki F, gdyż znajduje się ona właśnie na pozycji 5. Odczytanie portu CHI da z kolei numer pozycji wyświetlacza, na której pojawi się znak wprowadzany do portu CHP. Ponieważ jednak port CHI ma rozmiar 4 bitów, to zapis liczby większej od 15 pozostawi w tym porcie tylko 4 ostatnie bity. Odczyt zwróci te cztery bity. Na przykład, zapisujemy do portu CHI liczbę 27(10). Binarnie jest to liczba 11011(2). W porcie pozostanie 1011(2). Odczyt da więc wartość 11(10).

 

Zapamiętaj!

Jeśli wprowadzisz liczbę do portu CHI, to ustawisz aktywną pozycję na wyświetlaczu znakowym. Teraz odczyt portu CHP zwróci ci kod znaku znajdującego się na tej pozycji, a zapis kodu znaku do portu CHP spowoduje wyświetlenie znaku na ustawionej pozycji.

 

INP - Port znakowego wejścia danych


Widok bufora znakowego na symulatorze PMC
 

Wyjście znakowe (CHP i CHI) umożliwia PMC wyświetlanie prostych informacji tekstowych. Bardzo często jednak program musi odczytywać dane wprowadzane przez użytkownika. Do tego celu służy kolejny port  - wejście znakowe.

 

Adres Port Funkcja
2 INP INput Port - port wejścia znakowego

 

Port jest 16-bitowy i służy tylko do odczytu. Zapis danych do tego portu jest ignorowany i nie wywołuje żadnego działania ze strony PMC. Każdy odczyt portu INP daje w wyniku kod kolejnego znaku z bufora tekstowego lub wartości 0 albo -1. Znaki do bufora wprowadza użytkownik za pomocą klawiatury. Jeśli program stara się odczytać znak z bufora, a bufor jest pusty (skończyły się w nim znaki, użytkownik nie wprowadził jeszcze nowych), to otrzymamy w wyniku wartość -1 (kody wszystkich znaków są dodatnie). Jeśli natomiast użytkownik edytuje zawartość bufora, to odczyt portu INP da w wyniku 0. Wynika stąd następujący algorytm odczytu danych:

  1. Odczytaj port INP
  2. Jeśli dostałeś -1, to w buforze nie ma znaków. Możesz poprosić użytkownika w jakiś sposób o wprowadzenie nowej partii tekstu. W każdym razie kończysz odczyt.
  3. Jeśli dostałeś 0, to port jest edytowany przez użytkownika, wracasz więc do punktu 1, aby czekać na udostępnienie bufora.
  4. Odczytałeś znak, możesz go przetworzyć

Odczytany znak jest usuwany z bufora wejściowego. Następny odczyt portu INP da więc kod kolejnego znaku.

 

IOP - Port prostego wejścia/wyjścia


Widok diod LED oraz przycisków portu IOP na symulatorze PMC
 

Adres Port Funkcja
3 IOP Input Output Port - port prostego wejścia/wyjścia

 

Port ma długość 16 bitów oraz posiada inną funkcję przy odczycie, a inną przy zapisie.

Gdy odczytujemy port IOP otrzymujemy bitowy stan przycisków podłączonych do tego portu. Każdy przycisk steruje stanem jednego bitu. Gdy przycisk jest wciśnięty, to odpowiadający mu bit ma stan 1, a gdy wyciśnięty, to bit ten przyjmuje wartość 0. Badając stan bitów program może dowiedzieć się, który z przycisków został naciśnięty przez użytkownika. Numery bitów podane są nad przyciskami. Jeśli więc po odczycie portu IOP otrzymamy wartość 17(10), to zamieniwszy ją na 16 bitową liczbę binarną:
 

17(10) = 0000000000010001(2)


stwierdzamy, iż naciśnięty jest przycisk 0 oraz 4.

Gdy zapisujemy wartość do portu, to powodujemy zaświecenie się diod LED, dla których odpowiednie bity zapisanej danej są ustawione na 1. Jeśli zapiszemy do tego portu wartość 17, to spowoduje to zaświecenie się diody LED numer 0 oraz numer 4. Kolor świecenia diod można regulować klikając myszką kolorowe przyciski umieszczone ponad diodami LED.

 

DSP, DSI - Porty wyświetlacza 7-segmentowego


Wyświetlacze 7-segmentowe w symulatorze PMC
 

Wyświetlacz 7-segmentowy LED jest popularnym wskaźnikiem cyfrowym, który znajduje szerokie zastosowanie w różnych urządzeniach pomiarowych i licznikowych. Nawet starsze komputery IBM posiadały takie wskaźniki. Było to w czasach, gdy procesory pracowały z dwoma częstotliwościami taktowania - normalną oraz turbo. Aby użytkownik wiedział, w jakim trybie pracuje procesor, stosowano dwu lub trzycyfrowy wyświetlacz 7-segmentowy. Warto więc poznać sposób programowania takich wyświetlaczy. PMC posiada ich 16. Są one numerowane od strony prawej do lewej. Na powyższej ilustracji widzimy zapalone wszystkie segmenty na wyświetlaczu nr 0. Wyświetlacz sterowany jest przy pomocy dwóch portów (podobnie jak wyjście znakowe):

 

Adres Port Funkcja
4 DSP DiSplay Port - port wyświetlacza 7-segmentowego
5 DSI DiSplay Index - port indeksu wyświetlacza 7-segmentowego

 

Port DSI ustawia aktywny wyświetlacz. Port ma długość 4 bitów. Wpisujemy do niego numer wyświetlacza cyfry, do którego chcemy uzyskać dostęp. Dostęp do segmentów wyświetlacza uzyskujemy poprzez port DSP. Port ten jest 8 bitowy. Każdy bit steruje świeceniem jednego segmentu wyświetlacza w sposób pokazany poniżej:

 

 
Przydział bitów poszczególnym segmentom w porcie DSP

 

Taki sposób sterowania pozwala na wyświetlanie oprócz cyfr 0..9 również niektórych liter alfabetu oraz symboli. Zawartość portu DSP można również odczytywać. Dostaniemy wtedy informację o zaświeconych segmentach na wyświetlaczu, którego numer ustawiony został w porcie DSI. Poniżej przedstawiamy tabelę wartości, które należy wprowadzać do portu DSP, aby uzyskać odpowiednią cyfrę na wyświetlaczu (jeśli cyfra ma być razem z przecinkiem, to bit b7 musi być ustawiony na 1, czyli do poniższych kodów należy dodać 128).

 

cyfra bity portu DSP kod
b7 b6 b5 b4 b3 b2 b1 b0 hex dec
0 0 1 1 1 1 1 1 3F 63
0 0 0 0 0 0 1 1 03 3
0 1 1 0 1 1 0 1 6D 109
0 1 1 0 0 1 1 1 67 103
0 1 0 1 0 0 1 1 53 83
0 1 1 1 0 1 1 0 76 118
0 1 1 1 1 1 1 0 7E 126
0 0 1 0 0 0 1 1 23 35
0 1 1 1 1 1 1 1 7F 127
0 1 1 1 0 1 1 1 77 119

 

Zwróć uwagę, iż w tym przypadku posługiwanie się systemem binarnym do opisu zawartości portu DSP jest bardziej odpowiednie niż tajemnicze liczby dziesiętne, które nie oddają sensu zapisywanych w porcie informacji.

 

Zapamiętaj!

Jeśli wprowadzisz liczbę do portu DSI, to ustawisz aktywną pozycję na wyświetlaczu cyfrowym. Pozycje numerowane są od strony prawej do lewej Teraz odczyt portu DSP zwróci ci stan segmentów na wskaźniku znajdującym się na tej pozycji, a zapis do portu DSP spowoduje zapalenie lub zgaszenie segmentów LED na ustawionej pozycji.

 

GRP, GRI - Porty ekranu graficznego


Widok ekranu graficznego
16 × 16 punktów w symulatorze PMC

PMC została wyposażona w bardzo proste możliwości graficzne - nie chciałem zbytnio komplikować zasad programowania komputera. Ekranik graficzny składa się z matrycy 16 × 16 punktów graficznych (pikseli). Każdy punkt może przyjmować jeden z 4096 różnych kolorów (tutaj ukłon w stronę Amigi). Sterowanie ekranikiem (tak go będę nazywał) graficznym odbywa się poprzez dwa ostatnie rejestry wejścia/wyjścia:

 

Adres Port Funkcja
6 GRP GRaphics Port - port graficzny koloru
7 GRI GRaphics Index - port indeksowy grafiki

 

Port GRP jest 12 bitowy i steruje kolorem punktu, a GRI jest 8 bitowy i określa pozycję punktu na ekraniku graficznym.

Kolor jest kodowany na 12 bitach w trzech polach 4-bitowych. Każde pole steruje intensywnością związanego z nim koloru podstawowego w systemie RGB (Red - czerwony, Green - zielony, Blue - niebieski). Cztery bity pozwalają na określenie 16 poziomów, od 0000(2) do 1111(2) - czyli od 0 do 15. Poziom 0 oznacza brak danego koloru podstawowego. Poziom 15 oznacza maksymalne natężenie koloru podstawowego. Kolor wynikowy powstaje z mieszanki kolorów podstawowych. Poniżej przedstawiamy sposób kodowania kolorów podstawowych w porcie GRP:

 

R - czerwony G - zielony B - niebieski
b11 b10 b09 b08 b07 b06 b05 b04 b03 b02 b01 b00
     

 

Jeśli zawartość rejestru przedstawimy w postaci liczby szesnastkowej, to każda cyfra będzie określała natężenie jednego koloru podstawowego. W poniższej tabeli przedstawiamy kilka wybranych kolorów oraz ich kody w systemie szesnastkowym dla portu GRP.

 

R G B Kod Kolor
0 0 0 000  
F F F FFF  
F 0 0 F00  
0 F 0 0F0  
0 0 F 00F  
F F 0 FF0  
0 F F 0FF  
F 0 F F0F  

 

Gdy umiemy określać już kolor punktu na ekraniku graficznym, musimy się nauczyć wybierać punkt leżący na określonej współrzędnej. Do tego celu służy port GRI. Punkt graficzny ma dwie współrzędne - poziomą x od 0 do 15 oraz pionową y od 0 do 15. W poniższym przykładzie na ekraniku graficznym umieszczono kilka kolorowych punktów.

 

  00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15
00                                
01                                
02                                
03                                
04                                
05                                
06                                
07                                
08                                
09                                
10                                
11                                
12                                
13                                
14                                
15                                

punkty te mają następujące współrzędne (x,y):

Jeśli współrzędną x i y zapiszemy w systemie dwójkowym, to każda z nich zajmie 4 bity. Bity te łączymy razem w daną 8 bitową i zapisujemy do portu GRI. Na przykład, aby umieścić na ekraniku graficznym punkt czerwony na współrzędnej (2,10) wykonujemy następujące operacje:

  1. Przeliczamy współrzędne na system dwójkowy: y = 2(10) = 0010, x = 10(10) = 1010(2)
  2. Łączymy współrzędne binarne w daną 8-bitową: 0010 1010 - 00101010(2) = 2A(16)
  3. Daną tę umieszczamy w porcie GRI. Spowoduje to udostępnienie w porcie GRP punktu leżącego na tych współrzędnych - odczyt tego portu da nam aktualny kolor punktu, zapis zmieni kolor punktu na ekranie.
  4. Obliczamy kod koloru czerwonego : R=F(16), G=0(16), B=0(16), czyli kolor = F00(16)
  5. Kod ten umieszczamy w porcie GRP. Na współrzędnych (2,10) pojawi się mały czerwony punkcik.
     

Zapamiętaj!

Jeśli wprowadzisz do portu GRI współrzędne punktu na ekranie graficznym, to z portu GRP możesz odczytać 12 bitowy kolor punktu leżącego na tych współrzędnych. Zapis do portu GRP spowoduje pojawienie się na ekraniku graficznym punktu na bieżących współrzędnych o kolorze określonym wprowadzoną do portu GRP wartością.

 

Obszar adresowy procesora PMC

Procesor PMC pozwala na zaadresowanie 1024 komórek pamięci. Szyna adresowa ma długość 10 bitów. Część obszaru adresowego zajęta jest przez rejestry wejścia/wyjścia. Poniżej przedstawiamy logiczną mapę pamięci tego komputera z punktu widzenia procesora

 

adres
hex
adres
dec
Nazwa Typ Opis
000 0 CHP port we/wy sterowanie wyświetlaczem znakowym
001 1 CHI port we/wy
002 2 INP port we odczyt bufora znakowego
003 3 IOP port we odczyt stanu przycisków
port wy sterowanie świeceniem diod LED
004 4 DSP port we/wy sterowanie segmentami wyświetlaczy LED 7-segmentowymi
005 5 DSI port we/wy
006 6 GRP port we/wy sterowanie ekranikiem graficznym
007 7 GRI port we/wy
008 8   komórka pierwsza komórka pamięci operacyjnej PMC
... ...   komórka  
3FF 1023   komórka ostatnia komórka pamięci operacyjnej PMC

 

Procesor PMC

Procesor jest centralnym układem służącym do przetwarzania informacji w PMC. Posiada on całkowitą kontrolę nad magistralą adresową, danych oraz sterującą. Pozostałe elementy PMC, pamięć i porty wejścia/wyjścia muszą się całkowicie podporządkować procesorowi. Protokoły komunikacyjne pomiędzy procesorem a pamięcią opisaliśmy już wcześniej, a teraz nadszedł czas na zajrzenie do środka procesora.

Procesor PMC jest układem 16-bitowym, tzn. w jednej instrukcji potrafi przetworzyć porcję 16 bitów. Aby zachować prostotę PMC, co jest naszym głównym celem, zestaw rozkazów procesora składa się tylko z 16 różnych poleceń, które omówimy dokładnie w dalszej części tego rozdziału. Procesor posiada 10 bitową magistralę adresową. 10 bitów pozwala na zaadresowanie 210 komórek pamięci, czyli 1024. Pierwsze 8 adresów (od 0 do 7) zajęte jest jednak przez porty wejścia/wyjścia. Dlatego faktycznie komórek pamięci jest mniej o 8, czyli 1016. Magistrala danych jest 16 bitowa, co pozwala w jednym cyklu dostępu do pamięci lub portów we/wy przesłać 16 bitów informacji binarnej. Do sterowania pamięcią i portami procesor korzysta z magistrali sterującej, która zawiera cztery linie: MEM (wybór pamięci), IO (wybór portów), R (odczyt z pamięci lub portu w zależności od stanu linii MEM i IO) i W (Write - zapisz).

 

Rejestry procesora PMC


Widok rejestrów procesora na symulatorze PMC
 

Podstawową funkcją rejestrów jest przechowywanie informacji dla procesora. Rejestry czynnie uczestniczą w operacjach wykonywanych przez procesor. PMC posiada cztery rejestry:
 

ACR (ACcumulator Register) - 16 bitowy rejestr akumulatora. Wykorzystują go wszystkie operacje arytmetyczne i logiczne do przechowywania jednego z argumentów oraz wyniku. Używany jest również przy przesyłaniu danych pomiędzy różnymi obszarami pamięci oraz pomiędzy pamięcią a portami wejścia/wyjścia.

SPR (Stack Pointer Register) - 4 bitowy rejestr wskaźnika stosu. Stos jest grupą 16 wewnętrznych komórek pamięci o rozmiarze 10 bitów każda. Służy służy do przechowywania adresów powrotnych z podprogramów. Jego funkcję opiszemy dokładnie w dalszej części rozdziału. Wskaźnik stosu wskazuje wolne miejsce na stosie - takie, w którym można coś umieścić. Po wpisaniu danej na stos wskaźnik ten jest zwiększany o 1 i wskazuje następne wolne miejsce. Przy odczycie danych ze stosu wskaźnik najpierw jest zmniejszany o 1, a następnie odczytywana jest lokacja stosu o numerze zawartym we wskaźniku.

PCR (Program Counter Register) - 10 bitowy rejestr licznika rozkazów. Służy on do adresowania komórek pamięci PMC, w których zawarte są wykonywane przez procesor instrukcje. Instrukcja jest pobierana z komórki o adresie w liczniku rozkazów. Po wykonaniu instrukcji procesor zwiększa o 1 zawartość rejestru licznika rozkazów i używa jej do pobrania z pamięci kolejnej instrukcji.

INR (INstruction Register) - 16 bitowy rejestr licznika instrukcji. Procesor pobraną z komórki pamięci instrukcję umieszcza w rejestrze instrukcji. Następnie dekoduje ją i wykonuje.

 

Cykl rozkazowy procesora PMC


Wskaźnik fazy wykonania polecenia na symulatorze PMC
 

Każdy procesor (również ten w komputerze IBM czy w Amidze) wykonuje polecenia w kilku cyklach, zwanych również fazami lub taktami. W PMC wszystkie polecenia są wykonywane w trzech fazach, które nazywać będziemy cyklem rozkazowym. Oto one:

 

F1 - Pobranie rozkazu. Procesor wysyła na magistralę adresową zawartość rejestru licznika rozkazów - PCR. Powoduje to zaadresowanie komórki pamięci, w której przechowywany jest rozkaz do wykonania. Następnie procesor PMC odczytuje z pamięci instrukcję i umieszcza ją w rejestrze instrukcji INR.

F2 - Dekodowanie rozkazu. Procesor za pomocą swojej sieci logicznej dekoduje (rozpoznaje) pobraną instrukcję do rejestru INR. W ten sposób procesor przygotowuje się do wykonania polecenia.

F3 - Wykonanie rozkazu. Po zdekodowaniu instrukcji procesor wie, jakie polecenie zostało pobrane z pamięci. Przystępuje więc do jego wykonania. Najpierw zwiększa o 1 zawartość rejestru PCR, aby wskazywał następną instrukcję w pamięci, która zostanie pobrana w kolejnym cyklu rozkazowym. Jeśli rozkaz wymaga pobrania danych z pamięci, to są one pobierane. Procesor wykonuje operacje zdefiniowane przez kod instrukcji. Jeśli operacja wymaga umieszczenia wyników w pamięci, to zostają one tam umieszczone. Cykl rozkazowy kończy się i następuje przejście do następnego cyklu.

 

Format instrukcji dla procesora PMC

Instrukcje dla procesora PMC przechowywane są w pamięci operacyjnej, więc mają taką długość w bitach jak komórki, czyli 16 bitów. Bity tworzące instrukcje podzielone są na trzy odrębne pola:

 

KOD TAD ARG
b15 b14 b13 b12 b11 b10 b9 b8 b7 b6 b5 b4 b3 b2 b1 b0
INSTRUKCJA PMC

 

KOD - 4 bitowe pole, które przechowuje kod operacji, którą należy wykonać. Ponieważ do dyspozycji mamy tylko 4 bity, to mogą one przyjąć 16 różnych kombinacji stanów. Stąd procesor PMC potrafi wykonywać jedynie 16 poleceń. Każde polecenie posiada swoją własną kombinację stanów tych bitów.

TAD - 2 bitowe pole, które określa tryb adresowania argumentu lub wyniku operacji, zdefiniowanej w polu KOD. Tryb adresowania jest sposobem dostępu do danej. Ponieważ pole to ma rozmiar dwóch bitów, to mamy do dyspozycji 4 różne tryby adresowania dla każdego polecenia PMC.

ARG - 10 bitowe pole, które przechowuje argument dla operacji. Znaczenie tych bitów zależy od użytego w instrukcji trybu adresowania.

 

Tryby adresowania

Instrukcje PMC operują nad danymi. Dane te należy pobierać lub przesyłać do pamięci. Sposób dostępu do danych dla określonej instrukcji definiuje tryb adresowania. Informacja dla procesora PMC o użytym w instrukcji trybie adresowania przechowywana jest w polu TAD instrukcji. Pole to ma rozmiar dwóch bitów, mamy zatem cztery różne tryby adresowania. Pole TAD ściśle współpracuje z polem ARG, w którym przechowywane są dane istotne dla trybu adresowania.

 

Adresowanie natychmiastowe

KOD TAD ARG
x x x x 0 0 b9 b8 b7 b6 b5 b4 b3 b2 b1 b0
rozkaz tryb dana bezpośrednia od -512 do 511

 

Pole TAD zawiera bity 00. Jest to najprostszy tryb adresowania - dane zawarte są bezpośrednio w instrukcji w polu ARG i są traktowane jako liczba w kodzie U2 (z wyjątkiem rozkazów skoków, które traktują ARG jak liczbę bez znaku). Ponieważ pole ARG ma rozmiar 10 bitów, więc zakres liczb wynosi od -512 do 511. Jeśli w instrukcji musimy użyć liczb  wykraczających poza zakres, to niestety należy zmienić tryb adresowania na adresowanie komórki pamięci, w której da się już umieszczać liczby 16 bitowe o zakresie -32768 do 32767.

 

Adresowanie bezpośrednie

KOD TAD ARG
x x x x 0 1 b9 b8 b7 b6 b5 b4 b3 b2 b1 b0
rozkaz tryb adres komórki lub portu od 0...1023

 

Pole TAD zawiera bity 01. W trybie tym pole ARG jest adresem komórki pamięci lub portu wejścia/wyjścia, w których znajdują się dane dla instrukcji PMC. 10 bitowe pole ARG traktowane jest jako liczba bez znaku. Zakres adresów obejmuje cały obszar adresowy PMC - od 0 do 1023. Tryb ten pozwala pobierać dane z pamięci PMC oraz umieszczać wyniki obliczeń we wskazanych komórkach lub portach. O tym, czy będzie to pobranie danych, czy umieszczenie ich w pamięci decyduje rodzaj instrukcji, której kod zdefiniowano w polu KOD.

 

Adresowanie pośrednie z postinkrementacją

KOD TAD ARG
x x x x 1 0 b9 b8 b7 b6 b5 b4 b3 b2 b1 b0
rozkaz tryb adres komórki od 0...1023

 

Pole TAD zawiera bity 10. Ten tryb adresowania jest początkowo trudny do zrozumienia. W polu ARG umieszczony jest adres komórki pamięci PMC. W adresowanej komórce znajduje się adres danych. Dlatego tryb ten nosi adresowania pośredniego - dane adresujemy za pośrednictwem komórki pamięci zawierającej właściwy adres. Komórkę zawierającą taki adres nazywamy wskazaniem (ang. pointer). Postinkrementacja oznacza zwiększenie o 1 adresu zawartego w komórce po wykonaniu instrukcji zawierającej ten tryb adresowania. Działanie trybu pośredniego z postinkrementacją jest zatem następujące:

  1. Procesor pobiera zawartość komórki wskazanej przez pole ARG instrukcji.
  2. Pobrany adres jest wykorzystywany do dostępu do danych w pamięci PMC.
  3. Pobrany adres jest zwiększany o 1 (wskazuje następną daną w pamięci) i umieszczany w komórce wskazywanej przez pole ARG instrukcji.

Tryb pośredni umożliwia adresowanie kolejnych komórek pamięci PMC. Załóżmy, iż we fragmencie pamięci umieszczono następujące dane:
 

adres zawartość opis
8 10 tutaj rozpoczynają się dane
9 20 następne dane
10 100 następne dane
11 8 Tutaj umieszczono adres początku danych

 

Załóżmy teraz, iż pewna instrukcja odczytuje pamięć za pomocą trybu pośredniego z postinkrementacją, w którym w polu ARG umieszczono adres komórki 11 przechowującej adres początku danych. Instrukcja ta może wyglądać tak:

 

KOD TAD ARG
x x x x 1 0 0 0 0 0 0 0 1 0 1 1
Pewna instrukcja PMC stosująca adresowanie
pośrednie z postinkrementacją

 

Pierwsze wykonanie tej instrukcji da w wyniku daną o wartości 10. Zawartość komórki 11 zostanie zwiększona i będzie wynosić teraz 9 - wskazuje komórkę zawierającą liczbę 20. Drugie wykonanie takiej samej instrukcji spowoduje pobranie z pamięci liczby 20, a komórka 11 zwiększy swą zawartość na 10. Kolejne wykonanie instrukcji pobierze z pamięci liczbę 100, komórka 11 zwiększy zawartość na 11.

Tryb adresowania pośredniego z postinkrementacją jest szczególnie przydatny do adresowania kolejnych elementów tablic przechowywanych w ciągłych obszarach pamięci PMC oraz do tworzenia struktur stosowych.

 

Adresowanie pośrednie z predekrementacją

KOD TAD ARG
x x x x 1 1 b9 b8 b7 b6 b5 b4 b3 b2 b1 b0
rozkaz tryb adres komórki od 0...1023

 

Pole TAD zawiera bity 11. Jest to ostatni tryb adresowania stosowany przez procesor PMC. W działaniu jest bardzo podobny do poprzedniego trybu. Pole ARG zawiera adres komórki ze wskazaniem. Wskazanie to zostanie użyte przy dostępie do właściwych danych w pamięci PMC. Predekrementacja oznacza zmniejszenie o 1 przed wykonaniem instrukcji. Działanie trybu z predekrementacją jest następujące:

  1. Procesor pobiera zawartość komórki o adresie podanym w polu ARG.
  2. Pobrany adres zostaje zmniejszony o 1.
  3. Tak zmodyfikowany adres zostaje wykorzystany przy dostępie do danych.
  4. Po wykonaniu instrukcji procesor umieszcza zmodyfikowany adres w komórce podanej w polu ARG instrukcji.

Tryb adresowania pośredniego z predekrementacją nadaje się do adresowania tablic od ostatniego elementu - niektóre algorytmy wymagają takiego podejścia.

 

Instrukcje procesora PMC

Kod operacji do wykonania przez procesor PMC zawarty jest w 4 bitowym polu KOD. Cztery bity mogą przyjmować 16 różnych kombinacji stanów. Każdy z tych stanów oznacza jedną instrukcję PMC. Instrukcje te są następujące:

 

0000 TAD ARG
LDA  ARG

LDA (LoaD Accumulator - ładuj akumulator)


ACR ¬ ARG
PCR ¬ PCR + 1
 

Instrukcja umieszcza argument pobrany zgodnie z zastosowanym trybem adresowania w rejestrze akumulatora. Po wykonaniu operacji rejestr licznika programu zwiększony zostaje o 1 i wskazuje kolejną instrukcję w pamięci. Ponieważ operacja zwiększenia licznika rozkazów występuje prawie w każdej instrukcji, nie będziemy już o niej wspominać.
 

0001 TAD ARG
STA  ARG

STA (STore Accumulator - prześlij akumulator)


ARG ¬ ACR
PCR ¬ PCR + 1
 

Instrukcja umieszcza zawartość rejestru akumulatora w komórce pamięci (lub porcie wejścia/wyjścia) zgodnie z zastosowanym trybem adresowania. W przypadku użycia trybu natychmiastowego (który nie ma w tym przypadku sensu) instrukcja STA nic nie wykonuje.
 

0010 TAD ARG
JMP  ARG

JMP (JuMP - skocz)


PCR ¬ ARG
 

Polecenie JMP jest tzw. skokiem bezwarunkowym. Argument jest umieszczany w rejestrze licznika programu, który w tym wypadku nie jest już zwiększany o 1. Zmiana zawartości licznika programu spowoduje, iż kolejną wykonywaną instrukcją będzie polecenie umieszczone w komórce o adresie ARG. Program wykonuje więc skok do podanego adresu. Jako argument instrukcji skoku stosuje się najczęściej adres zawarty w instrukcji w polu ARG - tryb natychmiastowy. W przypadku skoków pole to jest traktowane jako liczba bez znaku w naturalnym kodzie dwójkowym.

UWAGA! Instrukcje skoków mogą zatrzymać wykonanie programu PMC jeśli skok odbył się poza obszar komórek, które zdefiniowano w edytorze jako komórki programu. Również program zatrzyma się, jeśli wykona ostatnią instrukcję w programie. Typowo zatrzymujemy wykonywanie programu skokiem pod adres 0.
 

0011 TAD ARG
JZR  ARG

JZR (Jump on ZeRo - skocz przy zerze)


jeśli
ACR = 0, to  PCR ¬ ARG, inaczej  PCR ¬ PCR + 1
 

Polecenie JZR jest tzw. skokiem warunkowym. Skok warunkowy jest wykonywany, gdy rejestr akumulatora zawiera wartość zero. W przeciwnym wypadku następuje przejście do następnej instrukcji za rozkazem skoku. Skoki warunkowe umożliwiają tworzenie rozgałęzień w programie.
 

0100 TAD ARG
JMI  ARG

JMI (Jump on MInus - skocz przy wartości ujemnej)


jeśli
ACR < 0, to  PCR ¬ ARG, inaczej  PCR ¬ PCR + 1
 

Polecenie JMI powoduje skok programowy do instrukcji pod adresem określonym przez ARG, gdy zawartość akumulatora jest mniejsza niż zero. Ponieważ zawartość ta jest traktowana przez rozkaz skoku jako liczba w kodzie U2, to warunkiem wystarczającym wykonania skoku jest to, aby bit znaku (najstarszy bit) miał wartość 1.
 

0101 TAD ARG
JSR  ARG

JSR (Jump to SubRoutine - skocz do podprogramu)


PCR ¬ PCR + 1
STACK[SPR] ¬ PCR
SPR ¬ SPR + 1
PCR ¬ ARG 
 

Polecenie to działa podobnie do rozkazu JMP w tym sensie, iż w obu wypadkach wykonywany jest skok bezwarunkowy pod wskazany przez ARG adres. Jednak w przypadku JSR przed wykonaniem skoku na wewnętrznym stosie procesora PMC zapamiętana zostaje zawartość zwiększonego o 1 licznika rozkazów. Jest to adres instrukcji bezpośrednio za poleceniem JSR. Adres ten będzie można pobrać później ze stosu za pomocą instrukcji RTS i umieścić z powrotem w liczniku rozkazów, co spowoduje powrót do adresu bezpośrednio za poleceniem JSR. Taka operacja nazywana jest wywołaniem podprogramu. Podprogramy są bardzo istotnym elementem każdego programu. Podprogram jest zwykle prostą procedurą (np. odczyt liczby, wypisanie zadanego tekstu). którą można wywoływać za pomocą polecenia JSR z wielu różnych miejsc w programie, a po wykonaniu nastąpi automatyczny powrót do polecenia za rozkazem JSR.

UWAGA: Polecenie JSR może powodować awaryjne zatrzymanie pracy PMC. Każde użycie instrukcji skoku do podprogramu powoduje odłożenie na wewnętrznym stosie adresu powrotnego. Jeśli adresy te nie są pobierane ze stosu, to stos staje się coraz bardziej zapełniony. Gdy liczba przechowywanych na stosie adresów powrotnych osiągnie wartość 16, to stos staje się pełny i nie może już przyjąć żadnego nowego adresu. Wykonanie w takiej chwili kolejnego polecenia JSR spowoduje przepełnienie stosu i zatrzymanie programu z odpowiednim komunikatem o błędzie (komunikaty są wypisywane w pasku stanu symulatora).
 

0110 TAD ARG
RTS  ARG

RTS (ReTurn from Subroutine - powróć z podprogramu)


SPR ¬ SPR - 1
PCR ¬ STACK[SPR]
 

Polecenie umożliwia powrót z podprogramu, do którego wcześniej nastąpił skok przy pomocy rozkazu JSR. Pobiera ono ze stosu procesora PMC adres powrotny i umieszcza go w rejestrze licznika rozkazów. Dzięki temu następne polecenie wykonane zostanie z komórki za instrukcją JSR. Rozkaz RTS nie potrzebuje argumentów, jednak ze względu na spójność składni poleceń PMC w asemblerze wymagany jest dowolny argument za poleceniem RTS. Jeśli zastosujemy tryb adresowania pośredniego z postinkrementacją lub predekrementacją, to pomimo ignorowania tych danych sam tryb spowoduje modyfikację komórki zawierającej wskazanie. Najbezpieczniej więc używać trybu natychmiastowego z wartością zero, o ile nie będzie naszym zamiarem modyfikowanie jakiejś komórki przy wychodzeniu z podprogramu.

UWAGA: Polecenie RTS może powodować awaryjne zatrzymanie pracy PMC. Stanie się to w przypadku próby pobrania adresu powrotnego z pustego stosu (jeśli żadna instrukcja JSR nie umieściła na tym stosie danych powrotnych). Dzieje się tak wtedy, gdy program napotka instrukcję RTS bez wykonania wcześniej instrukcji JSR.
 

0111 TAD ARG
ADD  ARG

ADD (ADD - dodaj)


ACR ¬ ACR + ARG
PCR ¬ PCR + 1
 

Polecenie dodaje do zawartości rejestru akumulatora wskazany trybem adresowania argument. Wynik dodawania umieszczany jest w akumulatorze. Ponieważ akumulator jest rejestrem 16 bitowym, w przypadku, gdy wynik dodawania nie mieści się na 16 bitach w kodzie U2, zostaje on obcięty do 16 bitów. Może to prowadzić do błędnych wyników:

Na przykład dodawanie 32767 + 32767 da w wyniku -2, a oto dlaczego:
 

  0111111111111111    32767
+ 0111111111111111  + 32767
 01111111111111110       -2
w kodzie U2, ponieważ ograniczamy do 16 najmłodszych bitów
 

Sytuacja, gdy działanie arytmetyczne prowadzi do wyniku wykraczającego poza dopuszczalny zakres liczb nazywa się przy dodawaniu i mnożeniu nadmiarem (ang. overflow) oraz przy odejmowaniu niedomiarem (ang. underflow). Nadmiar i niedomiar zdarzają się nawet w systemach takich jak IBM. Jest to zupełnie naturalne zjawisko, z którym muszą w swoich programach walczyć programiści (i niekiedy przegrywają).
 

1000 TAD ARG
SUB  ARG

SUB (SUBstruct - odejmij)


ACR ¬ ACR - ARG
PCR ¬ PCR + 1
 

Polecenie odejmuje od zawartości rejestru akumulatora wskazany trybem adresowania argument. Wynik odejmowania umieszczany jest w akumulatorze. Podobnie jak przy dodawaniu również tutaj może dojść do błędów, jeśli wynik nie mieści się na 16 bitach w kodzie U2. Sytuacja taka nazywana jest niedomiarem (ang. underflow). Na przykład odjęcie od liczby -32768 liczby 1 daje w wyniku 32767, a oto dlaczego:
 

  1000000000000000   -32768
+ 1111111111111111  +    -1
odejmowanie zastępujemy dodawaniem wartości przeciwnej
 10111111111111111    32767
w kodzie U2, ponieważ ograniczamy do 16 najmłodszych bitów
 

1001 TAD ARG
MUL  ARG

MUL (MULtiply - mnóż)


ACR ¬ ACR x ARG
PCR ¬ PCR + 1
 

Polecenie mnoży zawartość rejestru akumulatora przez argument wskazany trybem adresowania. Wynik mnożenia umieszczany jest w akumulatorze. Do polecenia MUL również odnoszą się uwagi dotyczące nadmiaru i obcinania wyników do 16 bitów.
 

1010 TAD ARG
DIV  ARG

DIV (DIVide - dziel)


ACR ¬ ACR : ARG
PCR ¬ PCR + 1
 

Polecenie dzieli zawartość rejestru akumulatora przez argument wskazany trybem adresowania. Wynik umieszczany jest w akumulatorze. Operacja dokonuje dzielenia całkowitoliczbowego. Część ułamkowa jest tracona. Na przykład 7 : 2 da w wyniku 3 (2 mieści się 3 razy w 7 i zostaje reszta 1).

UWAGA: Polecenie DIV może spowodować awaryjne zatrzymanie programu PMC w przypadku próby dzielenia przez 0.
 

1011 TAD ARG
INC  ARG

INC (INCrement - zwiększ o jeden)


ARG ¬ ARG + 1
PCR ¬ PCR + 1
 

Polecenie zwiększa argument wskazany trybem adresowania o 1. Najczęściej będzie to tryb bezpośredni, czyli zawartość komórki pamięci, której adres przechowuje pole ARG w instrukcji PMC. Jeśli zostanie zastosowany tryb natychmiastowy (ARG zawiera bezpośrednio dane), to zawartość pola ARG będzie dodana do zawartości rejestru akumulatora. Takie zastosowanie instrukcji INC dubluje rozkaz ADD i może być stosowane wymiennie z nim.

Instrukcja INC nie jest niezbędna do tworzenia programów. Ten sam efekt można osiągnąć przy pomocy instrukcji LDA, ADD i STA, jednak zwiększenie zawartości komórki pamięci wymaga użycia aż trzech wymienionych poleceń. Dzięki INC zrobimy to szybko i bardziej przejrzyście. Większość mikroprocesorów w prawdziwych komputerach posiada odpowiednik takiej instrukcji, więc nasza PMC nie będzie gorsza.
 

1100 TAD ARG
RLA  ARG

RLA (RoLl Accumulator - obracaj bity akumulatora)


jeśli
ARG > 0, to  OBRÓĆ BITY ACR O ARG POZYCJI W LEWO,
inaczej jeśli
ARG < 0, to  OBRÓĆ BITY ACR O -ARG POZYCJI W PRAWO
PCR ¬ PCR + 1
 

Z definicji operacji RLA wynika, iż bity akumulatora zostaną obrócone o ARG pozycji w lewo, jeśli ARG będzie liczbą dodatnią lub o |ARG| pozycji w prawo, jeśli ARG będzie liczbą ujemną. Obrót bitów oznacza przesunięcie wszystkich bitów na sąsiednie pozycje w prawo lub w lewo. Bity skrajne, które wychodzą z akumulatora trafiają na początek po drugiej stronie (wyobraź sobie, iż akumulator został sklejony końcami i bity przesuwają się wokoło jak grupa osób chodząca w kółko). Poniżej przedstawiamy  zasadę działania tej instrukcji.
 

ACR = 1011111111000000(2) - przed wykonaniem polecenia RLA
ACR = 1111111100000010(2) - po wykonaniu polecenia RLA z ARG = 2, bity obrócone w lewo

ACR = 1011111111000000(2) - przed wykonaniem polecenia RLA
ACR = 0010111111110000(2) - po wykonaniu polecenia RLA z ARG = -2, bity obrócone w prawo
 

Instrukcja RLA jest bardzo przydatna przy różnych operacjach na bitach akumulatora (np. przy łączeniu pól bitowych). Odpowiednie przykłady zastosowania znajdziesz w rozdziale poświęconym programowaniu PMC.
 

1101 TAD ARG
AND  ARG

AND (logical AND - iloczyn logiczny bitów)


ACR ¬ ACR AND ARG
PCR ¬ PCR + 1
 

Instrukcja wykonuje iloczyn logiczny nad poszczególnymi bitami rejestru akumulatora i argumentu. Wynik umieszczany jest w akumulatorze. Operacja ta umożliwia badanie lub zerowanie określonych bitów akumulatora. Przykłady wykorzystania znajdziesz w rozdziale poświęconym programowaniu PMC.
 

1110 TAD ARG
ORA  ARG

ORA (logical OR with Accumulator - suma logiczna bitów)


ACR ¬ ACR OR ARG
PCR ¬ PCR + 1
 

Instrukcja wykonuje sumę logiczną  nad poszczególnymi bitami rejestru akumulatora i argumentu. Wynik umieszczany jest w akumulatorze. Operacja ta umożliwia ustawianie lub łączenie określonych bitów akumulatora z bitami argumentu. Przykłady wykorzystania znajdziesz w rozdziale poświęconym programowaniu PMC.
 

1111 TAD ARG
XOR  ARG

XOR (logical eX-OR - suma modulo 2 bitów)


ACR ¬ ACR EX-OR ARG
PCR ¬ PCR + 1
 

Instrukcja wykonuje sumę modulo 2 nad poszczególnymi bitami rejestru akumulatora i argumentu. Wynik umieszczany jest w akumulatorze. Operacja ta umożliwia negowanie określonych bitów akumulatora. Przykłady wykorzystania znajdziesz w rozdziale poświęconym programowaniu PMC.

 



List do administratora Serwisu Edukacyjnego Nauczycieli I LO

Twój email: (jeśli chcesz otrzymać odpowiedź)
Temat:
Uwaga: ← tutaj wpisz wyraz  ilo , inaczej list zostanie zignorowany

Poniżej wpisz swoje uwagi lub pytania dotyczące tego rozdziału (max. 2048 znaków).

Liczba znaków do wykorzystania: 2048

 

W związku z dużą liczbą listów do naszego serwisu edukacyjnego nie będziemy udzielać odpowiedzi na prośby rozwiązywania zadań, pisania programów zaliczeniowych, przesyłania materiałów czy też tłumaczenia zagadnień szeroko opisywanych w podręcznikach.



   I Liceum Ogólnokształcące   
im. Kazimierza Brodzińskiego
w Tarnowie

©2017 mgr Jerzy Wałaszek

Dokument ten rozpowszechniany jest zgodnie z zasadami licencji
GNU Free Documentation License.