Modyfikacje sprzętowe procesora: Różnice pomiędzy wersjami

Przejdź do nawigacji Przejdź do wyszukiwania
brak opisu edycji
Nie podano opisu zmian
Nie podano opisu zmian
Linia 1: Linia 1:
{{TOC limit|2}}
Procesor MERY-400 nie jest pojedynczym układem scalonym, a sporym modułem, składającym się z pakietów (płyt o wymiarach 300x300mm). Pakiety zbudowane są z układów scalonych z serii 74 oraz innych elementów dyskretnych. Taka konstrukcja powoduje, że stosunkowo łatwo jest wprowadzać w nim modyfikacje sprzętowe. Zadanie ułatwia dodatkowo fakt, że na poszczególnych pakietach procesora można znaleźć "wolne" bramki i przerzutniki.
Procesor MERY-400 nie jest pojedynczym układem scalonym, a sporym modułem, składającym się z pakietów (płyt o wymiarach 300x300mm). Pakiety zbudowane są z układów scalonych z serii 74 oraz innych elementów dyskretnych. Taka konstrukcja powoduje, że stosunkowo łatwo jest wprowadzać w nim modyfikacje sprzętowe. Zadanie ułatwia dodatkowo fakt, że na poszczególnych pakietach procesora można znaleźć "wolne" bramki i przerzutniki.


Na przestrzeni lat, w Instytucie Okrętowym Politechniki Gdańskiej, w zespole rozwijającym system operacyjny CROOK powstało kilka modyfikacji procesora MERY-400. Wykorzystywał je zarówno CROOK jak i oprogramowanie na nim działające. Były one implelentowane w istniejących instalacjach MERY-400, a ostatecznie wszystkie one złożyły się na poprawioną wersję procesora używanego w [[MX-16]].
Na przestrzeni lat, w Instytucie Okrętowym Politechniki Gdańskiej, w zespole rozwijającym system operacyjny CROOK powstało kilka modyfikacji procesora MERY-400. Wykorzystywał je zarówno CROOK jak i oprogramowanie na nim działające. Były one implelentowane w istniejących instalacjach MERY-400, a ostatecznie wszystkie one złożyły się na poprawioną wersję procesora używanego w [[MX-16]].


= Opis funkcjonalny =
Przeróbki procesora dotyczą pakietów P-A, P-D, P-R i P-P. Ich umiejscowienie związane jest z dostępnością wolnych bramek i przerzutników na pakietach. Schematy przedstawione dalej pokazują zmiany (wyróżnione na czerwono) względem [http://mera400.pl/files/mera400-dtr-t4-cz2-mjc400-schematy.pdf schematów] znajdujących się w DTR. Nazwy nowych sygnałów, nie ujętych w dokumentacji, zostały nadane w celu ułatwienia przedstawienia zmian i nie pokrywają się z nazwami nadanymi przez autorów modyfikacji (te są nieznane).


== Automatyczny bootstrap ==
= Automatyczny bootstrap =


[[Pamięć MEGA]] zawierała bootloader(-y) zapisane w pamięci EPROM, dostępne po starcie systemu pod adresem 0xf000. Można było uruchomić zawarty tam kod ustawiając z pulpitu technicznego zawartość licznika rozkazów i startując maszynę. Jednak w przypadku komputerów MX-16 nie było to możliwe - były one dostarczane bez pulpitu technicznego. Trzeba było więc zapewnić możliwość automatycznego bootstrapu systemu na komputerze w takiej konfiguracji.
[[Pamięć MEGA]] zawierała bootloader(-y) zapisane w pamięci EPROM, dostępnej po starcie systemu od adresy 0xf000. Można było uruchomić zawarty tam kod ustawiając z pulpitu technicznego zawartość licznika rozkazów i startując maszynę. Jednak w przypadku komputerów MX-16 nie było to możliwe - były one dostarczane bez pulpitu. Trzeba było więc zapewnić możliwość automatycznego bootstrapu systemu na komputerze w takiej konfiguracji.


Zostało to zrobione oprzez modyfikację procesora, która tuż po starcie maszyny zmniejszała o 1 zawartość czterobitowego rejestru, w którym przechowywane są cztery najstarsze bity IC. W ten sposób adres startowy z 0x0000 zmieniał się na 0xf000 i maszyna rozpoczynała pracę uruchamiając bootloader.
Zostało to zrobione oprzez modyfikację procesora, która tuż po włączeniu zasilania ustawiała licznik rozkazów na na 0xf000, dzięki czemu maszyna rozpoczynała pracę uruchamiając bootloader.


Przeróbka ta nie miała żadnego efektu, jeśli w systemie nie była zainstalowana pamięć MEGA, bądź bootstrap z pamięci MEGA nie został skonfigurowany (fizycznie).
Przeróbka ta nie miała żadnego efektu, jeśli w systemie nie była zainstalowana pamięć MEGA, bądź bootstrap z pamięci MEGA nie został skonfigurowany (fizycznie).


== Instrukcja włączająca modyfikacje ==
== Realizacja techniczna ==
 
Do pakietu P-A doprowadzony został sygnał '''+BOOTL''' z pamięci MEGA. Jego dokładne źródło nie jest znane, jednak charakter modyfikacji wskazuje, że informował on o gotowości pamięci MEGA do dostarczenia programu rozruchowego od adresu 0xf000. Sygnał '''-PON''' generowany jest w zasilaczu i informuje o włączeniu zasilania maszyny.
 
[[File:cpumod-p-a-boot.png|650px|center]]
 
Układ '''M54''' to 4-bit rejestr przechowujący najstarszy kwartet bitów licznika rozkazów IC. Istniejące podciągnięcie jego wejścia '''CD''' (Count Down) do stanu wysokiego zostało przerwane i zastąpione iloczynem sygnałów '''+BOOTL''' i '''+PON'''. Aktywne "0" na wyjściu bramki NAND (układ '''M21''') powoduje zmniejszenie o jeden zawartości rejestru '''M54''', a co za tym idzie ustawienie tuż po włączeniu maszyny adresu 0xf000 w liczniku rozkazów.
 
= Instrukcja włączająca modyfikacje =
 
Ponieważ należało zapewnić możliwie najpełniejszą kompatybilność wsteczną z oryginalnym procesorem MERY-400, funkcjonalność opisanych dalej przeróbek była dostępna dopiero po programowym ich aktywowaniu specjalną, nową instrukcją procesora.
 
W grupie rozkazowej S utworzono nową instrukcję CRON o kodzie 0166500. Maszyna zmodyfikowana uruchamiała się w trybie kompatybilności z oryginalnym procesorem, a dopiero jej wywołanie aktywowało modyfikacje. Zerowanie maszyny kluczem CLEAR bądź rozkazem MCL przywracało procesor do pierwotnego stanu kompatybilności.
 
== Realizacja techniczna ==
 
Modyfikacja obejmowała pakiety P-D i P-P.
 
[[File:cpumod-p-d-cron.png|600px|center]]


Ponieważ należało zapewnić możliwie najpełniejszą kompatybilność wsteczną z oryginalnym procesorem MERY-400, funkcjonalność opisanych dalej przeróbek była dostępna dopiero po programowym aktywowaniu ich specjalną, nową instrukcją procesora
Na pakiecie P-D użyto wyjścia 6 układu '''M44''', na którym stan niski wskazuje binarną wartość "101" w polu A rozkazu z grupy S. Sygnał ten jest rozpatrywany w iloczynie z niskim poziomem sygnału '''+Q'''. Tak wypracowany sygnał '''+CRON''' wskazuje więc na wydanie instrukcji CRON w systemie operacyjnym.


W grupie rozkazowej S utworzono kolejną nową instrukcję CRON o kodzie 0166500. Maszyna zmodyfikowana uruchamiała się w trybie kompatybilności z oryginalnym procesorem, a dopiero jej wywołanie aktywowało modyfikacje. Zerowanie maszyny kluczem CLEAR bądź rozkazem MCL przywracało procesor do pierwotnego stanu kompatybilności.
Należy zauważyć, że instrukcja ta wciąż była instrukcją nielegalną, co zapewnia kompatybilność wsteczną z oryginalnym procesorem. Programista używający instrukcji CRON w systemie operacyjnym musiał obsłużyć fakt, że po jej wydaniu zgłoszone zostanie przerwanie "niepoprawny rozkaz".


== 17-bitowe adresowanie bajtów ==
Rezultatem wydania instrukcji CRON musiało być "przełączenie" procesora w trym pracy z modyfikacjami aż do następnego zerowania, a więc sygnał '''+CRON''' musiał zostać gdzieś zapamiętany. Dzieje się to na pakiecie P-P.
 
[[File:cpumod-p-p-cpumod.png|550px|center]]
 
Przerzutnik '''M72''' służy do zapamiętania faktu aktywowania modyfikacji. Na wejście D przerzutnika podana jest na stałe logiczna "1", a wejściem sterującym, powodującym wpisanie sygnału z wejścia D, jest tutaj wejście zegarowe. Podany jest na nie sygnał '''+CRON''' w iloczynie z sygnałem '''+P2''', który informuje, że procesor jest w stanie P2 - wykryta została instrukcja nieefektywna (którą instrukcja CRON jest).
 
Jedynym sposobem na wyzerowanie wartości zapisanej w przerzutniku było podanie niskiego poziomu na wejście R. Doprowadzony do niego jest sygnał '''-CLM''' sygnalizujący zerowanie maszyny. Powtórzone wywołania instrukcji CRON nie wnosiły niczego - do przerzutnika wpisywana była ponownie "1".
 
= 17-bitowe adresowanie bajtów =


W oryginalnej konstrukcji procesora adres bajtu był 16-bitowy, z czego 15 najstarszych bitów adresowało słowo w pamięci, a najmłodszy bit wskazywał lewy lub prawy bajt w 16-bitowym słowie maszyny. Oznacza to, że za pomocą instrukcji używających adresowania bajtowego (LB, RB, CB) można było odwołać się jedynie do pierwszych 32k słów w maksymalnie 64k słowowym bloku. Fakt ten powodował również nieścisłości w dokumentacji (patrz [[Adresowanie pamięci]]).
W oryginalnej konstrukcji procesora adres bajtu był 16-bitowy, z czego 15 najstarszych bitów adresowało słowo w pamięci, a najmłodszy bit wskazywał lewy lub prawy bajt w 16-bitowym słowie maszyny. Oznacza to, że za pomocą instrukcji używających adresowania bajtowego (LB, RB, CB) można było odwołać się jedynie do pierwszych 32k słów w maksymalnie 64k słowowym bloku. Fakt ten powodował również nieścisłości w dokumentacji (patrz [[Adresowanie pamięci]]).
Linia 40: Linia 68:
  LB r1, r2+r2    ; załadowanie bajtu; adresem bajtowym staje się 2*r2+1
  LB r1, r2+r2    ; załadowanie bajtu; adresem bajtowym staje się 2*r2+1
</syntaxhighlight>
</syntaxhighlight>


<syntaxhighlight lang="asm">
<syntaxhighlight lang="asm">
Linia 73: Linia 100:
Dzięki temu, dla programów, o których wiadomo było, że nie pracują poprawnie z 17-bit adresowaniem, system operacyjny mógł je dla danego procesu dezaktywować, ustawiając przed przełączeniem kontekstu bit BS w rejestrze SR na 1. Takie zachowanie było kompatybilne z oryginalnym procesorem, ponieważ na takim sprzęcie bit BS nie ma znaczenia, gdy wykonywany jest program w jednym z bloków użytkowych.
Dzięki temu, dla programów, o których wiadomo było, że nie pracują poprawnie z 17-bit adresowaniem, system operacyjny mógł je dla danego procesu dezaktywować, ustawiając przed przełączeniem kontekstu bit BS w rejestrze SR na 1. Takie zachowanie było kompatybilne z oryginalnym procesorem, ponieważ na takim sprzęcie bit BS nie ma znaczenia, gdy wykonywany jest program w jednym z bloków użytkowych.


== Przerwanie programowe o wysokim priorytecie ==
== Realizacja techniczna ==
 
Ta modyfikacja jest jedną z najbardziej złożonych i obejmuje zmiany na pakietach P-P, P-R i P-A. Na pakiecie P-P wypracowywany jest sygnał '''-LRCBM''' mówiący o tym, że instrukcja LB, RB lub CB została wydana na procesorze z aktywnymi modyfikacjami.
 
[[File:cpumod-p-p-lrcbm.png|450px|center]]
 
Na pakiecie P-R znajduje się przerzutnik '''M16''', w którym pamiętany jest 17. bit używany w adresowaniu bajtowym.
 
[[File:cpumod-p-r-bab17.png|780px|center]]
 
Taktowany jest on sygnałem '''+STROB1''' w iloczynie z sygnałem '''+P4''', mówiącym o tym, że procesor jest w stanie P4, w którym następuję pre- i B-modyfikacja argumentu normalnego. Na wejściu D pojawia się sygnał, który w rezultacie wpisuje do przerzutnika wartość '''-CARRY''', gdy spełnione są wszystkie niezbęne warunki:
 
D = ~(CARRY & LRCBM & (~Q | ~BS))
 
czyli:
 
* wydany został rozkaz LB, RB lub CB na procesorze z aktywną modyfikacją
* procesor pracuje w trybie systemu operacyjnego (Q=0) lub bit specjalny jest wyzerowany (BS=0)
 
Zapamiętywana w przerzutniku wartość jest zanegowana, stąd bramka NOT ('''M55''') na wyjściu.
 
Na wejście S (które w związku z negacją na wyjściu '''M53''' jest wejściem zerującym) podane są sygnały '''-P1''' (odczytanie rozkazu ) i '''-P5''' (pobranie argumentu pośredniego). Wystąpienie któregokolwiej z nich powoduje zapamiętanie "1", czyli efektywne wyzerowanie zawartości przerzutnika.
 
Ostatecznie sygnał '''+BAB17''' niesie informację o 17 bicie powstałym w wyniku B-modyfikacji lub pre-modyfikacji argumentu normalnego rozkazów bajtowych:
 
BAB17 = CARRY & LRCBM & (~Q | ~BS)
 
Dzięki modyfikacji wprowadzonej na pakiecie P-A, wartość ta wsuwana jest z lewej strony do rejestru AT w chwili przesuwania jego zawartości podczas przygotowywania adresu słowa przy adresowaniu bajtowym:
 
[[File:cpumod-p-a-eat0.png|500px|center]]
 
= Przerwanie programowe o wysokim priorytecie =


System operacyjny CROOK wymaga istnienia przerwania programowego, którego priorytet byłby wyższy niż przerwań pochodzących z urządzeń zewnętrznych (kanałowych) i z zegara systemowego. W [[Przerwania|systemie przerwań MERY-400]] takie przerwanie nie istnieje. Wersje systemu CROOK od 1 do 5 obchodziły ten problem następująco: W jądrze systemu używana była pseudo-instrukcja SIN o kodzie (ósemkowo) 036000. Z punktu widzenia procesora jest to instrukcja niepoprawna, generująca przerwanie "nieprawidłowy rozkaz". Jednocześnie procedura obsługi tego przerwania w CROOK-u skonstruowana jest tak, aby w przypadku pseudo-rozkazu SIN zapewnić jego obsługę jak przerwania programowego o wysokim priorytecie. To obejście wykorzystywane jest we wszystkich wersjach systemu, aż do ostatniej rewizji CROOK-5.
System operacyjny CROOK wymaga istnienia przerwania programowego, którego priorytet byłby wyższy niż przerwań pochodzących z urządzeń zewnętrznych (kanałowych) i z zegara systemowego. W [[Przerwania|systemie przerwań MERY-400]] takie przerwanie nie istnieje. Wersje systemu CROOK od 1 do 5 obchodziły ten problem następująco: W jądrze systemu używana była pseudo-instrukcja SIN o kodzie (ósemkowo) 036000. Z punktu widzenia procesora jest to instrukcja niepoprawna, generująca przerwanie "nieprawidłowy rozkaz". Jednocześnie procedura obsługi tego przerwania w CROOK-u skonstruowana jest tak, aby w przypadku pseudo-rozkazu SIN zapewnić jego obsługę jak przerwania programowego o wysokim priorytecie. To obejście wykorzystywane jest we wszystkich wersjach systemu, aż do ostatniej rewizji CROOK-5.
Linia 86: Linia 144:
# Przerwanie 5 zostało użyte jako przerwanie programowe o wysokim priorytecie, sterowane instrukcjami SINT i SIND.
# Przerwanie 5 zostało użyte jako przerwanie programowe o wysokim priorytecie, sterowane instrukcjami SINT i SIND.


== Zmiana maskowania przerwań ==
== Realizacja techniczna ==
 
Modyfikacja ma miejsce na pakiecie P-P. Oryginalne połączenie źródła przerwania zegarowego do przerzutnika '''M37''' zostało przerwane. Przerwanie 11 nie ma w oryginalnym procesorze żadnego źródła, na wejściu S jest zawsze logiczna "1". Zmodyfikowany układ przerwań kieruje przerwanie zegarowe na przerzutnik '''M31''' lub '''M37''' w zależności od tego, czy modyfikacja procesora jest (odpowiednio) aktywna, czy nie.
 
[[File:cpumod-p-p-int5-int11.png|700px|center]]
 
Dodatkowo badana jest pozycja 13 rejestru rozkazu ('''+IR13''') w iloczynie z sygnałem '''+(WX & SIN)''', oznaczającym stan WX dla grupy rozkazów SIN, SIT, SIL, CIT. Jest to "dekoder" rozkazów SINT i SIND, które ulokowane są w grupie ze wspomnianymi wcześniej rozkazami (rozkazy grupy S z polem A = "010"). Jeśli najstarszy bit pola C jest dla nich zapalony (IR13=1), to procesor zgłasza przerwanie 11.


CROOK-5 miał jeszcze jedno wymaganie, które ostatecznie zostało spełnione za pomocą modyfikacji sprzętowej. Należało zapewnić, aby w trakcie obsługi przerwania kanałowego nie pojawiło się przerwanie o wyższym priorytecie (w szczególności zegarowe). W procesorze bez przeróbek wymuszane to było przez programowe maskowanie przerwań na początku procedury obsługi przerwań kanałowych. W procesorze przerobionym zrealizowane to było sprzętowo: Przyjęcie przerwania kanałowego powodowało automatyczne zamaskowanie przerwań od 5 do 31.
Przeróbka ma tę drobną wadę, że jeśli modyfikacje procesora nie są aktywne, a wydana zostanie instrukcja SIND lub SIND, to zgłoszone zostanie nadmiarowe przerwanie zegarowe.


Należy też zauważyć, że instrukcje SINT i SIND nie są tak naprawdę osobnymi instrukcjami, a specjalnym przypadkiem instrukcji SIN, SIL, SIT, CIT, dla których ustawiony jest najstarszy bit pola C (ignorowany w niezmodyfikowanym procesorze). W efekcie, wydanie instrukcji SINT lub SIND oprócz zamierzonego efektu (zgłoszenie przerwania 11), będzie miało efekt dodatkowy, zależny od zawartości dwóch najmłodszych bitów pola C. Zgodnie z treścią rozkazów SIT, SIL, SIN, CIT, które te pola wykorzystują, zgłoszone lub wyzerowane zostaną przerwania 30 i/lub 31. W systemie CROOK instrukcje SINT i SIND mają pole C=100, a więc zgłoszeniu przerwania 11 towarzyszy wyzerowanie przerwań 30 i 31.


= Zmiana maskowania przerwań =


CROOK-5 miał jeszcze jedno wymaganie, które ostatecznie zostało spełnione za pomocą modyfikacji sprzętowej. Należało zapewnić, aby w trakcie obsługi przerwania kanałowego nie pojawiło się przerwanie o wyższym priorytecie (w szczególności zegarowe). W procesorze bez przeróbek wymuszane to było przez programowe maskowanie przerwań na początku procedury obsługi przerwań kanałowych. W procesorze przerobionym zrealizowane to było sprzętowo: Przyjęcie przerwania kanałowego powodowało automatyczne zamaskowanie przerwań od 5 do 31.


== Realizacja techniczna ==


[[File:cpumod-p-p-mask.png|400px|center]]


= Połączenia na platerze procesora =


= Realizacja techniczna =
Poza zmianami wprowadzonymi na pakietach, powstały też nowe połączenia na platerze procesora:


{| class="wikitable"
! colspan="2" | Z !! colspan="2" | DO !! rowspan="2" | Sygnał
|-
! Pakiet !! Piórko !! Pakiet !! Piórko
|-
| P-D || B48 || P-P || B68 || +CRON
|-
| P-P || B40 || P-R || B38 || -LRCBM
|-
| P-P || B55 || P-D || A45 || -LRCB
|-
| P-P || B60 || P-M || A07 || -P2
|-
| P-P || B68 || P-D || B48 || +CRON
|-
| P-P || B70 || P-M || B52 || +IR13
|-
| P-R || B35 || P-A || B70 || +BAB17
|-
| P-R || B36 || P-M || A29 || -P1
|-
| P-R || B37 || P-M || B55 || -P5
|-
| P-R || B38 || P-P || B40 || -LRCBM
|-
| P-R || B51 || P-D || A77 || -P4
|-
| P-A || B70 || P-R || B35 || +BAB17
|-
| P-A || B72 || P-M || A12 || -PON
|-
| P-A || B92 || ME-GA-400 || W48 || +BOOTL
|}




{{source|title=Opracowanie własne}}
{{source|title=Opracowanie własne}}

Menu nawigacyjne