MULTIX od środka

Z MERA 400 wiki
Przejdź do nawigacji Przejdź do wyszukiwania

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).

  • CPU: Intel 8085
  • Timer: Intel 8253
  • I/O równoległe: Intel 8255
  • I/O szeregowe: Intel 8251
  • I/O floppy:
    • kontroler Zilog Z0765A08PSC + Intel 8257
    • pamięć Hitachi HM6264LP 8KB static RAM (150ns)
  • I/O winchester:
    • kontroler Intel C82062
    • pamięć: Hitachi HM6264LP 8KB static RAM (150ns)
  • DMA: Intel 8257
    • kanał 1: MERA-400
    • kanał 2: taśma
    • kanał 3: autoload
  • ROM (firmware) 24KB?
  • RAM 16KB? + 8KB (floppy) + 8KB (winchester)

Mapa pamięci

Adres Nazwa Zawartość
0x0000-0x5fff ROM? (24KB)
0x6000 RAM RAM (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

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 ma długość 32 pozycje.

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:

  1. 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.
  2. Sprawdź istnienie kanału - rezultatem tego polecenia jest wysterowanie odpowiedniej szyny magistrali (OK lub NO), więc również musi być realizowane sprzętowo.
  3. 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żą:

  1. 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.
  2. 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.
  3. 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.

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ą) i wybierana jest linia, która będzie obsługiwana. Priorytetem jest zawartość bajtu warunku (od najwyższego priorytetu):

Oznaczenie Wartość Opis
- 00000001 zadanie zgłoszone poleceniem
WAODB 00000010 zakończony odbiór
WANAD 00000100 zakończone nadawanie
WAAWA 00001000 awaria
WAOPR 00010000 OPRQ
WAFWI 00100000 winchester zakończył, XON dla monitorów
WATIM 10000000 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ń