MULTIX od środka
Dokumentacja techniczna MULTIX-a prawdopodobnie dziś już nie istnieje. Niniejsza strona jest próbą odtworzenia tego, jak MULTIX działał i jaka była jego architektura.
Sprzęt
MULTIX to komputer zbudowany w oparciu o procesor Intel 8085, z programem sterującym (firmware) zapisanym w pamięci ROM. Z punktu widzenia MULTIX-a, MERA-400 jest jednym z jego urządzeń zewnętrznych. Komunikacja z nią odbywa się przy użyciu przerwania (zgłoszenie polecenia wysyłane przez MERĘ-400) i DMA (wymiana danych między MERĄ-400 a MULTIX-em). Poniższy schemat blokowy przedstawia budowę MULTIX-a (wraz z podziałem na pakiety) i sprzęg z MERĄ-400.
- CPU: 8085 (NEC D8085AC)
- pamięć EPROM 3x8KB
- pamięć RAM 2x8KB Hitachi HM6264LP-15
- Timer: 8253 (NEC M5L8253P-5)
- DMA: 8257 (NEC D8257C-2)
- kanał 1: MERA-400
- kanał 2: taśma
- kanał 3: autoload
- I/O równoległe: 8255 (NEC D8255AC-2)
- I/O szeregowe: 8251 (NEC M5L8251AP-5)
- I/O floppy:
- kontroler Zilog Z0765A08PSC
- DMA 8257 (NEC M5L8257P-5)
- pamięć RAM 8KB Hitachi HM6264LP-15
- I/O winchester:
- kontroler Intel C82062-00
- pamięć RAM 8KB Hitachi HM6264LP-15
Mapa pamięci
Adres | Nazwa | Zawartość |
---|---|---|
0x0000-0x1fff | EPROM 1 | |
0x2000-0x3fff | EPROM 2 | |
0x4000-0x5fff | EPROM 3 | |
0x6000-0x9fff | RAM | RAM główna (16KB) |
0x6000+154 | STACK | koniec stosu, początek dostępnej RAM |
0xa000-0xbfff | RAMW8 | RAM floppy dysku (8KB) |
0xc000-0xdfff | RAMW6 | RAM winchestera (8KB) |
0xff00-0xffff | AD | we/wy widziane jako pamięć |
I/O
Adres | R/W | Nazwa | Znaczenie |
---|---|---|---|
MERA-400 | |||
0-1 | R | DANEI | dane odczytane z MERA-400 (MSB, LSB) |
0-1 | W | DANEO | dane do przesłania rozkazem "pisz do PAO" (MSB, LSB) |
2-3 | R | PSARG | argument polecenia sterującego (MSB, LSB) |
2-3 | W | ADRES | adres w PAO MERA-400 (MSB, LSB) |
4 | R | POLST | specyfikacja polecenia sterującego |
4 | W | NBPN | nr bloku PAO, nr procesora |
5 | R | POLST+1 | ID linii |
5 | W | KWINT | pokwitowanie przerwań |
6 | W | SPECI | specyfikacja przerwania do MERA-400 |
7 | W | SPECI+1 | specyfikacja przerwania: numer linii |
8 | W | KOTRA | Rozkaz "koniec transmisji" |
10 | W | PISZB | Rozkaz "pisz blok przez DMA do MERA-400" |
11 | W | CZYTB | Rozkaz "czytaj blok przez DMA z MERA-400" |
12 | W | PISZP | Rozkaz "pisz do MERA-400" |
13 | W | CZYTP | Rozkaz "czytaj z MERA-400" |
14 | W | INTR0 | Rozkaz "zgłoś przerwanie do MERA-400" (procesor 0) |
15 | W | INTR1 | Rozkaz "zgłoś przerwanie do MERA-400" (procesor 1) |
0x38 | W | KOPRQ | pokwitowanie OPRQ |
0x4e | W | WUUPG | ustawienie maski przerwań 'INTR' |
Timer | |||
0x50 | RW | CLOCK | zegar |
0x51 | RW | CLDZI | dzielnik zegara (we=1536kHz) |
0x52 | RW | CLUSA | dzielnik dla USART (we=1536kHz, wy=153,6kHz) |
DMA | |||
0x64-0x65 | RW | DMAD1 | kanał 1: rejestr adresu |
0x66-0x67 | RW | DMCO1 | kanał 1: licznik, typ pracy |
0x68-0x69 | RW | DMAD2 | kanał 2: rejestr adresu |
0x6a-0x6b | RW | DMCO2 | kanał 2: licznik, typ pracy |
0x6c-0x6d | RW | DMAD3 | kanał 3: rejestr adresu |
0x6e-0x6f | RW | DMCO3 | kanał 3: licznik, typ pracy |
0x70 | RW | DMAST | sterowanie |
Linie szeregowe... | |||
0x80 | RW | INFTR | informacja do/z linii szeregowej |
0x81 | RW | INFST | status i sterowanie linii szeregowej |
...lub inie równoległe | |||
0x80 | RW | PARIO | PORT A = parzysty nr. linii |
0x81 | RW | PARIO+1 | PORT B = nieparzysty nr. linii |
0x82 | RW | PARIO+2 | port C = sygnały handshake i gotowości |
0x83 | R | PARIO+3 | sterowanie |
... | ... | ... | kolejne linie szeregowe/równoległe |
Urządzenia
Winchester
Dyski Winchester adresowane są logicznie, geometria napędu jest ukryta przed użytkownikiem. W pierwszej wersji MULTIX-a obsługującej dyski twarde Winchester wspierane były tylko jednostki o pojemności do 32MB - pole używane do adresowania sektorów miało długość 16-bit. Znane były MULTIX-owi jedynie dwa typy dysków: NEC D5126 (4 powierzchnie) i BASF 6185 (6 powierzchni). Na stałe określona jest ilość sektorów na ścieżkę - 16. Ponieważ dyski pozwalały na umieszczenie 17 sektorów na ścieżce, 6% pojemności napędu było tracone.
W późniejszej wersji pole adresowe dla sektorów zostało rozszerzone do 24-bit, pozwalając na zaadresowanie 8GB. Dzięki możliwości dowolnego określenia liczby powierzchni, wsparcie otrzymały też inne typy dysków (jednak wciąż zachowane zostało sztywne ograniczenie do 16 sektorów na ścieżkę). MULTIX nie znał ilości cylindrów dla danego dysku - próba odczytu/zapisu sektora znajdującego się na nieistniejących cylindrów kończyła się niepowodzeniem.
Linia fizyczna
Kierunek linii fizycznej dla winchesterów musiał mieć wartość 0, inne były traktowane jako nieprawidłowe.
Linia logiczna
Pole konfiguracji winchestera dla "starego" MULTIX-a:
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
Typ dysku | Protekcja format. |
Gdzie Typ dysku to 0 (BASF) lub 1 (NEC).
Pole konfiguracji winchestera dla "nowego" MULTIX-a:
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
Z | L. pow. | Protekcja form. |
Gdzie Z jest opisem formatu pola zapasowego:
- 0 - dysk typu 0 lub 1 w starym MULTIX-ie
- 1 - dysk >32MB w nowym MULTIX-ie
- 1 lub 0 - dysk <32MB w nowym MULTIX-ie
Operacje
Maksymalna długość transmisji wynosi 16 sektorów (z punktu widzenia MERY? czy z punktu widzenia zadania mx?). Linie z Winchesterem nie obsługują polecenia "przerwij transmisję".
Przerwania wewnętrzne
Nr | Oznaczenie | Opis | Pokwitowanie |
---|---|---|---|
1 | IKWIT | MERA-400 przyjęła przerwanie | zapis 1 DO "KWINT" |
2 | IZEGA | zegar | zapis "MODE" do "CLCON" |
3 | IOPRQ | zgłoszenie OPRQ | zapis "KOPRQ" |
4.5 | ITRAP | dla testowania | odczyt "PTRAP" |
5.5 | IPOST | polecenie sterujące | odczyt "POLST+1" |
6 | ITAP | taśma magnetyczna | odczyt specyfikacji |
6.5 | IKASE | kaskada serial | odczyt/zapis informacji |
7 | IKAPA | kaskada parallel | odczyt/zapis informacji |
7.5 | IDMA | DMA | odczyt DMAST |
Przerwania do MERA-400
Przerwania wysyłane do MERY-400 opisane są tutaj. Rzeczy, o których wspomniana dokumentacja nie mówi:
Kolejka przerwań wysyłanych z MULTIX-a do MERY-400 (KOINM) marozmiar RKOIN=32 pozycje i wygląda następująco:
- 0 - pozycja zgłoszonego przerwania
- +1 - ilość oczekujących przerwań
- +2*RKOIN - bufor przerwań, zawiera pary:
- +0 = 0,<specyfikacja> lub 1,<nr proc.>,<specyfikacja>
- +1 = nr linii
ID linii dla przerwania "niesprawny kanał" zawiera informację o przyczynie niesprawności:
- 1 - błąd sumy kontrolnej ROM
- 3 - za mała pamięć RAM
- 5 - przesunięcie SP
- 11 - RST 4
- 13 - RST 5 gdy WIN=0
- 15 - RST 6 gdy TAP=0
- 17 - niekompletny program: brak 5 (koniec RAM), SETKO, TESTU
- 19 - błąd transmisji przy POST-MORT po ITRAP
- 2*N dla N=0-32 - niedozwolona specyfikacja przerwania linii fizycznej nr N, gdzie:
- (STBOT) - adres ostatniej pozycji stosu
- ostatnia pozycja - 2*N, specyfikacja
Przerwania, o których nie wspomina dokumentacja:
Oznaczenie | Nr | Opis |
---|---|---|
IEPS0 | 35 | nieznane polecenie sterujące, KOD=0 |
IEPS6 | 36 | nieznane polecenie sterujące, KOD=6 |
IEPS7 | 37 | nieznane polecenie sterujące, KOD=7 |
IEPS8 | 38 | nieznane polecenie sterujące, KOD=8 |
IEPSC | 39 | nieznane polecenie sterujące, KOD=C |
IEPSD | 40 | nieznane polecenie sterujące, KOD=D |
IEPSE | 41 | nieznane polecenie sterujące, KOD=E |
IEPSF | 42 | nieznane polecenie sterujące, KOD=F |
Polecenia
W zależności od typu polecenia, jest ono przetwarzane na różnych etapach pracy MULTIX-a.
Polecenia kanałowe
Polecenia kanałowe wymagają natychmiastowej odpowiedzi, niezależnie od tego, czym aktualnie zajęty jest procesor MULTIX-a. Dlatego realizowane są sprzętowo, na styku MULTIX-interfejs MERY-400. Należą do nich:
- Zerowanie - realizowane sprzętowo przez reset procesora MULTIX-a i wszystkich układów podległych. MULTIX w ten sam sposób musi reagować na zerowanie komendą IN/OU, programowe (MCL) i sprzętowe (CLEAR). To znaczy, że polecenie zerowania musi być dekodowane sprzętowo "na interfejsie" i skutkować sprzętowym resetem.
- Sprawdź istnienie kanału - rezultatem tego polecenia jest wysterowanie odpowiedniej szyny magistrali (OK lub NO), więc również musi być realizowane sprzętowo.
- Podaj specyfikację przerwania - rezultatu tego polecenia oczekuje się natychmiast po jego wykonaniu (w procedurze obsługi przerwania), więc ponownie - musi być realizowane sprzętowo.
Polecenia ogólne
Polecenia ogólne dotyczą pracy MULTIX-a (a nie poszczególnych linii MULTIX-a) i realizowane są w ramach obsługi przerwania IPOST (5.5). W trakcie obsługi przerwania IPOST kolejne jego przyjęcia mogą być zablokowane, co skutkować będzie odpowiedzią EN do procesora. Do poleceń ogólnych należą:
- Ustaw konfigurację - jest to pierwsze polecenie, jakie MULTIX może przyjąć. Zanim nie zostanie poprawnie zakończone, żadne polecenie liniowe nie może zostać wykonane. W trakcie jego realizacji przerwania są zablokowane, więc każde kolejne polecenie "ustaw konfiguracje" wydane przed zakończeniem bieżącego zakończy się sygnałem EN.
- Testuj - jest to polecenie specjalne, które skutkuje uruchomieniem na procesorze MULTIX-a programu innego niż zapisany w firmware. Pozwala na przeprowadzenie dowolnego testu komputera.
- Cofnij przerwanie niepokwitowane do kolejki - dotyczy wyłącznie kolejki przerwań do MERY-400 i musi zostać wykonane podczas gdy kolejka nie zmienia swojego stanu.
Polecenia kanałowe
Polecenia kanałowe są przyjmowane w procedurze obsługi przerwania IPOST. Wynikiem przyjęcia polecenia może być zgłoszenie zadania odpowiadającego poleceniu, bądź jego odrzucenie (bo linia nie istnieje, polecenie jest już wykonywane, ...). Po zgłoszeniu zadania obsługa przerwania się kończy, a zadanie podjąć może manager zadań (główny program MULTIX-a).
Zadania liniowe
Zadania są przedmiotem pracy MULTIX-a. Zadanie liniowe opisane jest numerem zadania i numerem linii, której dotyczy. Zadanie może stać się gotowe do podjęcia na skutek różnych zdarzeń, takich jak zgłoszenie polecenia przez MERĘ-400, bądź przerwanie od któregoś z urządzeń zewnętrznych lub timera. Zadania wybierane są do obsłużenia przez manager zadań, który cyklicznie przegląda listę zadań, wybierając (według priorytetów) to, którym należy się zająć.
Zadanie aktywne opisuje pole IDZAD, którego kolejne bajty zawierają:
- 0-1: adres pola głównego
- 2-3: adres pola zadania
- 4: numer zadania
- 5: numer linii logicznej
Etapy, przez które może przechodzić zadanie po wydaniu polecenia przez MERĘ-400:
- zignorowane (EN do procesora - przerwanie IPOST w MULTIX-ie zablokowane)
- przyjęte (przez obsługę przerwania IPOST)
- odrzucone (przez obsługę przerwania IPOST)
- zgłoszone (wpisane do tablicy zadań, gotowe do podjęcia przez task manager MULTIX-a)
- zawieszone (oczekuje w tablicy na zdarzenie)
- aktywne (aktualnie działające)
Zgłoszenie zadania poleceniem liniowym
Po otrzymaniu polecenia od MERY-400 MULTIX sprawdza, czy może przyjąć polecenie i reaguje odpowiednio do warunków, wysyłając przerwanie odpowiednie dla danego polecenia:
- jeśli linii nie ma w konf - przerwanie "brak linii"
- jeśli zadania danego typu jest zgłoszone, ale nie zostało jeszcze odebrane przez manager zadań - przerwanie "odrzucenie polecenia"
- jeśli zadanie w linii jest aktywne - przerwanie "odrzucenie polecenia"
- jeśli zadanie w linii jest zawieszone - przerwanie "odrzucenie polecenia"
- jeśli żadna z powyższych sytuacji nie wystąpiła, zadanie jest zgłaszane:
- opcionalnie pobierany jest argument zadania (dla zadań, które mają argumenty)
- PZGLI dla zadania = 1
- ADPZL[zadanie, linia] |= 1 (zgłoszenie zadania od początku)
Przerwanie potwierdzające odebranie polecenia nie jest wysyłane na etapie jego zgłoszenia, a dopiero po odebraniu zadania przez manager zadań.
Manager zadań
Zadania przechowywane są w dwóch tablicach. Pierwsza z nich, PZGLI, wskazuje, czy zadanie danego typu zostało zgłoszone (dla dowolnej linii). Jest to pierwsze kryterium wyboru zadania, według malejących priorytetów jak w tabeli poniżej:
Oznaczenie | Nr | Opis |
---|---|---|
T.STR | 0 | Podaj status |
T.ODL | 1 | Odłącz linię |
T.ORQ | 2 | Zgłość OPRQ |
T.TRA | 3 | Przesyłaj |
T.ABT | 4 | Zerwij transmisję |
T.DOL | 5 | Dołącz linię |
Druga tablica (adres w ADPZL) przechowuje opis stanów wszystkich zadań dla każdej z linii. Stan opisują dwa bajty:
- bajt zawieszenia - ustawiany przez zadanie, po wykonaniu czynności z nim związanych. Mówi, na jakie zdarzenie zadanie oczekuje.
- ustawiony bit 0 mówi, że zadanie jest aktualnie wykonywane
- nie ustawiony bit 0 mówi, że zadanie jest zawieszone, wtedy bity 7-1 określają przyczynę
- bajt warunków - ustawiany w procedurach obsługi przerwań. Opisuje przyczynę zgłoszenia zadania.
Jeśli okaże się, że żadna linia nie wymaga obsługi, zgłoszenie zadania jest kasowane.
Po wybraniu typu zadania przeglądane są bajty warunków wszystkich linie (począwszy od linii A+1, gdzie A jest poprzednio obsługiwaną linią). Podejmowana jest obsługa pierwszej linii, która jej wymaga, a wykonywana akcja zależy od tego, jakie zdarzenie nastąpiło w linii. Priorytetem jest zawartość bajtu warunku (od najwyższego priorytetu):
Oznaczenie | Wartość | Opis |
---|---|---|
- | 00000001 | start zadania |
WAODB | 00000010 | przesyłaj - zakończony odbiór |
WANAD | 00000100 | przesyłaj - zakończone nadawanie |
WAAWA | 00001000 | przesyłaj - awaria |
WAOPR | 00010000 | przesyłaj - OPRQ |
WAFWI | 00100000 | przesyłaj - winchester zakończył, XON dla monitorów |
WATIM | 10000000 | przesyłaj - timeout (timer) |
Odebranie zadania
- poszukaj zgłoszonego zadania o najwyższym priorytecie
- wpisz nr.zad do IDZAD
- wybierz linię, od której zaczniesz szukać (następna, bądź 0 jeśli pracowała ostatnia) i iteruj po wszystkich liniach
- jeśli dla żadnej linii nie znaleziono zgłoszenia -> zeruj zgłoszenia zadania dla wszystkich linii
- jeśli dla linii jest jakieś zgłoszenie -> startuj zadanie
- wyślij przerwanie liniowe
- ponownie uruchom manager zadań