MULTIX od środka: Różnice pomiędzy wersjami

Przejdź do nawigacji Przejdź do wyszukiwania
 
(Nie pokazano 45 pośrednich wersji utworzonych przez tego samego użytkownika)
Linia 3: Linia 3:
= Sprzęt =
= 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.
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, widzianym przez pryzmat sprzęgu znajdującego się pomiędzy magistralami MERY-400 a MULTIX-a.
 
Komunikacja MERY-400 z MULTIX-em odbywa się przy użyciu:
* jednego z przerwań procesora 8085, które informuje o nadejściu polecenia wysłanego rozkazami IN/OU z MERY-400
* rejestrów sprzętowych sprzęgu przechowujących odczytane z magistrali MERY-400 argumenty polecenia IN/OU
 
Komunikacja MULTIX-a z MERĄ-400 odbywa się przy użyciu:
* odczytu/zapisu pamięci MERY-400 (przy użyciu kontrolera DMA)
* zgłoszenia przerwania kanałowego do MERY-400
 
Poniższy schemat blokowy przedstawia budowę MULTIX-a (wraz z podziałem na pakiety) i sprzęg z MERĄ-400.


[[File:multix-internals.png|700px|center|Schemat blokowy MULTIX-a]]
[[File:multix-internals.png|700px|center|Schemat blokowy MULTIX-a]]


* CPU: 8085 (NEC D8085AC)
== Pakiety ==
 
Bloki funkcjonalne MULTIX-a i kontrolery urządzeń wejścia/wyjścia rozlokowane są na "wąskich" pakietach MERY-400.
 
=== ME-MIK-400 ===
 
ME-MIK-400 to pakiet mikrokomputera zawierający:
 
* CPU: 8085 3MHz (NEC D8085AC)
* pamięć EPROM 3x8KB
* pamięć EPROM 3x8KB
* pamięć RAM 2x8KB Hitachi HM6264LP-15
* pamięć RAM 2x8KB Hitachi HM6264LP-15
Linia 15: Linia 33:
** kanał 2: taśma
** kanał 2: taśma
** kanał 3: autoload
** kanał 3: autoload
* I/O równoległe: 8255 (NEC D8255AC-2)
 
* I/O szeregowe: 8251 (NEC M5L8251AP-5)
=== ME-BI-400 i ME-BM-400 ===
* I/O floppy:
 
** kontroler Zilog Z0765A08PSC
ME-BI-400 i ME-BM-400 to pakiety sprzęgu zapewniające komunikację między MULTIX-em a MERĄ-400. Realizują one m.in. następujące funkcje:
** DMA 8257 (NEC M5L8257P-5)
 
** pamięć RAM 8KB Hitachi HM6264LP-15
* Od strony interfejsu MERY-400:
* I/O winchester:
** dekodowanie i realizację krytycznych rozkazów I/O
** kontroler Intel C82062-00
** zgłaszanie przerwania kanałowego
** pamięć RAM 8KB Hitachi HM6264LP-15
** transmisję danych do/z PAO
* Od strony MULTIX-a:
** sprzętowe rejestry I/O
** reset MULTIX-a i urządzeń podległych
** zarządzanie przerwaniem "polecenie sterujące"
 
=== ME-UTR-400 ===
 
Cztery porty równoległe zrealizowane na dwóch układach 8255 (NEC D8255AC-2). Pakiet występuje w wersjach ME-UTR-1, ME-UTR-2 i ME-UTR-3, pozwalających na podłączenie różnego rodzaju urządzeń równoległych
 
=== ME-UTS-400 ===
 
Cztery porty szeregowe zrealizowane na czterech układach 8251 (NEC M5L8251AP-5). Pakiet występuje w wersjach ME-UTS-1, ME-UTS-2 i ME-UTS-3, pozwalających na podłączenie urządzeń różnymi interfejsami (V24 lub prądowym z optoizolacją) i dających różne dodatkowe możliwości ich konfiguracji.
 
=== ME-FDC ===
 
Kontroler czterech stacji dyskietek zrealizowany w oparciu o:
 
* kontroler Zilog Z0765A08PSC
* DMA 8257 (NEC M5L8257P-5)
* pamięć RAM 8KB Hitachi HM6264LP-15
 
=== ME-WDC-506 ===
 
Kontroler czterech dysków ST-506 (winchester) zrealizowany w oparciu o:
 
* kontroler Intel C82062-00
* pamięć RAM 8KB Hitachi HM6264LP-15


= Mapa pamięci =
= Mapa pamięci =
Linia 167: Linia 212:
|-
|-
| 0x52 || RW || CLUSA || dzielnik dla USART (we=1536kHz, wy=153,6kHz)
| 0x52 || RW || CLUSA || dzielnik dla USART (we=1536kHz, wy=153,6kHz)
|-
| 0x53 || W || CLCON || sterowanie
|-
|-
| align="center" bgcolor="Cornsilk" colspan="4" | <b>DMA</b>
| align="center" bgcolor="Cornsilk" colspan="4" | <b>DMA</b>
Linia 205: Linia 252:


= Urządzenia =  
= Urządzenia =  
== Timer 8253 ==
* Counter 2
** używany jako dzielnik częstotliwości dla USART
** 16-bit, tryb pracy 3 (Square Wave)
** częstotliwość wejściowa 1536kHz
** częstotliwość wyjściowa 153.6kHz (1536kHz/10)
* Counter 1
** używany jako dzielnik zegara dla Counter-a 0 (wyjście Counter 1 jest wejściem Counter 0)
** 16-bit, tryb pracy 2 (Rate Generator)
** częstotliwość wejściowa 1536kHz
** częstotliwość wyjściowa 1kHz (1536kHz/1536)
* Counter 0
** używany do generowania co pół sekundy przerwania zegarowego dla CPU (tam używane do realizacji timeoutów przesyłu, etc.)
** 16-bit, tryb pracy 0 (Interrupt on Terminal Count)
** częstotliwość wejściowa 1kHz
** częstotliwość przerwania 2Hz (1kHz/500), licznik ustawiany ponownie w procedurze obsługi przerwania


== Winchester ==
== Winchester ==
Linia 210: Linia 275:
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.
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.
W późniejszej wersji pole adresowe dla sektorów zostało rozszerzone do 24-bit, pozwalając na zaadresowanie 8GB (w teorii, ponieważ kontroler nie dawał takiej możliwości). 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 ===
=== Linia fizyczna ===
Linia 236: Linia 301:
|}
|}


Gdzie ''Z'' jest opisem formatu pola zapasowego:
Gdzie ''Z'' jest opisem formatu pola zapasowego. Nazwa ta jest nieco myląca, ponieważ mówi ono o długości numeru sektora w operacjach transmisji i jego znaczenie jest następujące:
* 0 - dysk typu 0 lub 1 w starym MULTIX-ie
* "0" - numer sektora na 2 bajty (max. pojemność dysku 32MB)
* "1" - numer sektora ma 3 bajty (max. teoretyczna pojemność dysku 8GB)
 
Dla dysków montowanych w "nowym" MULTIX-ie powinno ono być ustawione następująco:
* 0 - dla dysków używanych wcześniej w starym MULTIX-ie
* 1 - dysk >32MB w nowym MULTIX-ie
* 1 - dysk >32MB w nowym MULTIX-ie
* 1 lub 0 - dysk <32MB w nowym MULTIX-ie
* 1 lub 0 - dysk <32MB w nowym MULTIX-ie
Pole "protekcja formatowania" jest przez firmware najnowszej wersji MULTIX-a ignorowane.
Obszar zapasowy (do przenoszenia uszkodzonych sektorów) ma zawsze długość ''ilość powierzchni * 16'' sektorów (czyli cały pierwszy cylinder).


=== Operacje ===
=== 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ę".
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ę".
=== Sektory zapasowe ===
Producenci dysków winchester dopuszczali zazwyczaj występowanie na powierzchni dysku
kilkudziesięciu uszkodzonych sektorów. Wyjątkiem był pierwszy cylinder, który
musiał być wolny od błędów. Fakt ten został przez Amepol wykorzystany do
podniesienia niezawodności dysków winchester pracujących w MULTX-ie.
Cały pierwszy cylinder zarezerwowany jest na kopie uszkodzonych sektorów
i jest dla użytkownika niedostępny. Dwa pierwsze sektory zajęte są przez
tablicę numerów uszkodzonych sektorów (pierwszy sektor) i jej wierną kopię (drugi
sektor). Przy czterech głowicach i 16 sektorach na ścieżkę daje to możliwość zrelokowania do 62 sektorów.
Tablica numerów sektorów ma również 62 pozycje. W zależności od wersji MULTIX-a mają one długość 2 lub 3 bajtów. Każda z nich wskazuje, jaki
sektor (o jakim numerze logicznym) został przeniesiony na daną pozycję obszaru
zapasowego.
Jeśli podczas operacji czytania sektora z dysku wystąpił jeden z warunków:
* pole adresowe sektora nie zostało odnalezione
* sektor oznaczony jest jako uszkodzony
to następuje próba odnalezienia danego sektora w obszarze zapasowym.
Jeśli sektor zostanie znaleziony, to jest stamtąd odczytywany i błąd odczytu nie występuje.
Jeśli sektor nie zostanie odnaleziony, to sygnalizowany jest błąd.
Przenoszenie uszkodzonych sektorów do obszaru zapasowego nie jest wykonywane
automatycznie przez MULTIX-a. Odbywa się za
pomocą polecenia formatowania ścieżki z przeniesieniem uszkodzonych sektorów.
== Floppy ==
Użyty kontroler napędów Zilog Z0765A08PSC pozwala na podłączenie do czterech napędów dyskietek. MULTIX rozróżnia trzy typy napędów o następujących parametrach zapisanych w tablicy TATYF (TAblica TYpów Flopów):
{| class="wikitable" style="text-align: center;"
! Typ !! Nazwa !! L. głowic !! L. cylindrów !! SRT !! HLT
|-
| 0 || SD || 1 || 40 || 0xCF || 9<<1
|-
| 1 || DD || 1 || 80 || 0xCF || 9<<1
|-
| 2 || DD/HD || 1 || 80 || 0x8F || 18<<1
|}
Gdzie SRT i HLT to następujące parametry kontrolera:
* HLT - Head Load Time (2-254ms co 2ms)
* SRT - Step Rate Time (1-16ms co 1ms)
Niezależnie od typu napędu, rozróżniane są jeszcze (i weryfikowane z typem napędu) typy dyskietek. Ich parametry podawane są podczas operacji "dołącz".


= Inicjalizacja =
= Inicjalizacja =


Wstępna inicjalizacja MULTIX-a trwał około 500ms (+185ms zerowania pamięci w SINSP) i przebiega następująco:
* zablokuj przerwania
* czy "koniec ROM" wypełniony?
* sprawdzenie sumy kontrolnej ROM
* testowanie RAM (tylko podstawowe 16KB, RAM flopa i winchestera nie są testowane)
* konfiguruj timer, DMA
* odblokuj przerwania
* wołaj SINSP(IWYZE)


W przypadku wystąpienia błędu na dowolnym etapie inicjalizacji, do obu procesorów wysyłane jest przerwanie INSKA z numerem linii wskazującym przyczynę. Praca MULTIX-a jest zatrzymywana i może zostać wznowiona jedynie resetem bądź restartem.


= Przerwania wewnętrzne =
= Przerwania wewnętrzne =
Linia 259: Linia 390:
|-
|-
| 3 || IOPRQ || zgłoszenie OPRQ || zapis "KOPRQ"
| 3 || IOPRQ || zgłoszenie OPRQ || zapis "KOPRQ"
|-
| 3 || IFLO8 || floppy (nowszy multix?)
|-
| 4 || INUS4 || nie używane (stary multix)
|-
|-
| 4.5 || ITRAP || dla testowania || odczyt "PTRAP"
| 4.5 || ITRAP || dla testowania || odczyt "PTRAP"
|-
| 5 || INUS5 || nie używane (stary multix)
|-
| 5 || IWIN6 || winchester (nowy multix)
|-
|-
| 5.5 || IPOST || polecenie sterujące || odczyt "POLST+1"
| 5.5 || IPOST || polecenie sterujące || odczyt "POLST+1"
Linia 335: Linia 474:
Rozkazy 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:
Rozkazy 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.
# '''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 odpowiedzi OK na szynie magistrali.
# '''Sprawdź istnienie kanału''' - rezultatem tego polecenia jest wysterowanie odpowiedzi OK na szynie magistrali.
# Podaj specyfikację przerwania - rezultatu tego polecenia oczekuje się natychmiast po jego wykonaniu (w procedurze obsługi przerwania).
# '''Podaj specyfikację przerwania''' - rezultatu tego polecenia oczekuje się natychmiast po jego wykonaniu (w procedurze obsługi przerwania).


== Polecenia ogólne ==
== Polecenia ogólne ==
Linia 350: Linia 489:
Polecenia ogólne dotyczą sterowania pracą MULTIX-a i obsługiwane są programowo w procedurze obsługi przerwania IPOST. Należą do nich:
Polecenia ogólne dotyczą sterowania pracą MULTIX-a i obsługiwane są programowo w procedurze obsługi przerwania IPOST. Należą do nich:


# 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.
# '''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.
# '''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.
# '''Cofnij przerwanie niepokwitowane do kolejki''' - dotyczy wyłącznie kolejki przerwań do MERY-400 i musi zostać wykonane podczas gdy kolejka nie zmienia swojego stanu.
 
=== Ustaw konfigurację ===
 
==== Linie fizyczne ====
 
Dla poszczególnych urządzeń dozwolone są jedynie następujące kierunki transmisji:
 
{| class="wikitable" style="text-align:center;"
! !! Brak !! Input !! Output !! Full-duplex !! Half-duplex
|-
| USART synch. ||  || + || + || + || (+)
|-
| USART asynch. ||  || + || + || + || (+)
|-
| 8255 ||  || + || + ||  ||
|-
| Winchester || + ||  ||  ||  ||
|-
| Taśma magnetyczna || + ||  ||  ||  ||
|-
| Floppy || + ||  ||  ||  ||
|-
|}
 
'''Uwaga:''' kierunek 6 (half-duplex) wydaje się być opcjonalnie dozwolony dla linii USART (zależy od wersji MULTIX-a?)
 
Niezależnie od tego, czy linia jest konfigurowana jako użyta, czy nie, kierunek transmisji dla urządzenia musi być poprawny.
 
Linie fizyczne zorganizowane były sprzętowo w pakiety. To wymusza konfigurowanie ich również w grupach po 4 - MULTIX w trakcie ustawiania konfiguracji sprawdza:
 
* czy pierwszy numer linii w pakiecie jest wielokrotnością 4
* czy liczba linii danego typu jest wielokrotnością 4
* czy liczba pakietów kontrolera pamięci taśmowych nie przekracza 1 (maks. 4 napędy taśmowe, choć dokumentacja wspomina o 8 (po cztery przewijaki na dwa obsługiwane formatery).
 
Jeśli jakieś linie nie są używane, konfiguracja dla nich musi również zostać przygotowana, przy czym bit 3 pola konfiguracji linii fizycznej ("linia użyta") powinien mieć wtedy wartość 0. W przypadku niespełnienia warunków sygnalizowany jest błąd "niekompletny opis linii fizycznej".
 
==== Linie logiczne ====
 
Mimo, że numer linii fizycznej w polu opisu linii logicznej jest 8-bit, to tylko najmłodsze 5 bitów brane jest pod uwagę. Daje to maksymalną liczbę 32 obsługiwanych linii. Starsze bity (bit 8) wykorzystywane są jedynie dla protokołu taśmy.
 
Dozwolone typy linii fizycznych dla protokołów linii logicznej:
 
{| class="wikitable" style="text-align:center;"
! !! USART asynch. !! 8255 !! USART synch. !! Winchester !! Taśma !! Floppy
|-
| Czytnik || + || + || || || ||
|-
| Dziurkarka || + || + || || || ||
|-
| Monitor || + ||  || || || ||
|-
| Czytnik SOM || + || + || || || ||
|-
| Dziurkarka SOM || + || + || || || ||
|-
| Monitor SOM || + ||  || || || ||
|-
| Winchester ||  ||  || || + || ||
|-
| Taśma ||  ||  || || || + ||
|-
| Floppy ||  ||  || || || || +
|-
| TTY ITWL ||  ||  || || || ||
|-
|}
 
Dla każdego z protokołów zdefiniowane są wymagane kierunki linii fizycznej w postaci maski zapisanej na dwóch bitach:
 
* DVINP = 01000000
* DVOUT = 10000000
 
Maska ta odpowiada dwóm pierwszym bitom konfiguracji kierunku linii fizycznej:
 
* 100xxxxx = output
* 010xxxxx = input
* 110xxxxx = input/output half-duplex
* 111xxxxx = input/output full-duplex
 
Sprawdzenie polega na zweryfikowaniu, czy dla każdego bitu maski kierunków protokołu zapalony jest odpowiadający mu bit konfiguracji kierunków linii fizycznej. Odpowiada to sprawdzeniu, czy spełniony jest warunek:
 
maska & kierunek_l_fiz == maska
 
Dla poszczególnych protokołów linii logicznej dozwolone są zatem następujące kierunki linii fizycznych:
 
{| class="wikitable" style="text-align:center;"
! !! Brak !! Input !! Output !! Full-duplex !! Half-Duplex
|-
| Czytnik ||  || + || || + || +
|-
| Dziurkarka ||  ||  || + || + ||  +
|-
| Monitor ||  ||  || || + || +
|-
| Czytnik SOM ||  || + || || + || +
|-
| Dziurkarka SOM ||  ||  || + || + || +
|-
| Monitor SOM ||  ||  ||  || + || +
|-
| Winchester || + || +  || + || + || +
|-
| Taśma || + || + || + || + || +
|-
| Floppy || + || + || + || + || +
|-
| TTY ITWL ||  ||  || || ||
|-
|}


== Polecenia liniowe ==
== Polecenia liniowe ==
Linia 382: Linia 630:
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:
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 konfiguracja MULTIX-a nie jest ustawiona -> '''brak linii'''
* jeśli zadania danego typu jest zgłoszone, ale nie zostało jeszcze odebrane przez manager zadań - przerwanie "odrzucenie polecenia"
* jeśli linii nie ma w konf (nr. linii > MAXLL) - '''brak linii'''
* jeśli zadanie w linii jest aktywne - przerwanie "odrzucenie polecenia"
* jeśli konfiguracja MULTIX-a nie jest ustawiona (ponowne sprawdzenie) '''odrzucenie polecenia'''
* jeśli zadanie w linii jest zawieszone - przerwanie "odrzucenie polecenia"
* jeśli ((b.war & 1) | (b.zaw) != 0) -> '''odrzucenie polecenia'''. Warunek tłumaczy się na:
** jeśli jest już polecenie bezwarunkowego startu zadania (czyli takie polecenie zostało już wydane ???ale jeszcze nie wystartowane???)
** jeśli zadanie jest aktywne
** jeśli zadanie czeka na warunek
* jeśli żadna z powyższych sytuacji nie wystąpiła, zadanie jest zgłaszane:
* 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)
** opcjonalnie pobierany jest argument zadania (dla zadań, które mają argumenty)
** PZGLI dla zadania = 1
** PZGLI[zadanie] = 1
** ADPZL[zadanie, linia] |= 1 (zgłoszenie zadania od początku)
** ADPZL[zadanie, linia] |= 1 (zgłoszenie zadania od początku)


Linia 415: Linia 666:
Druga tablica (adres w ADPZL) przechowuje opis stanów wszystkich zadań dla każdej z linii. Stan opisują dwa bajty:
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.
* '''bajt zawieszenia''' - ustawiany przez zadanie, opisuje jego stan:
** ustawiony bit 0 mówi, że zadanie jest aktualnie wykonywane
** 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ę
** nie ustawiony bit 0 mówi, że zadanie jest zawieszone (oczekuje na zdarzenie), wtedy bity 7-1 określają przyczynę zawieszenia
* '''bajt warunków''' - ustawiany w procedurach obsługi przerwań. Opisuje przyczynę zgłoszenia zadania.
* '''bajt warunków''' - ustawiany "z zewnątrz" zadania, opisuje warunki, jakie dla zadania wystąpiły:
** ustawiony bit 0 mówi, że zadanie należy wystartować (rozpocząć)
** bity 7-1 opisują warunki, jakie wystąpiły dla zadania


Jeśli okaże się, że żadna linia nie wymaga obsługi, zgłoszenie zadania jest kasowane.
Jeśli okaże się, że żadna linia nie wymaga obsługi, zgłoszenie zadania jest kasowane.
Linia 441: Linia 694:
| WATIM || 10000000 || przesyłaj - timeout (timer)
| WATIM || 10000000 || przesyłaj - timeout (timer)
|}
|}
Warunek WAFWI dla winchesterów oznacza zwolnienie kontrolera. Kontroler może w danej chwili obsługiwać tylko jeden dysk. Jeśli inna linia (inny winchester) chce transmitować dane, musi poczekać, aż obecnie transmitująca linia zwolni kontroler.


== Odebranie zadania ==
== Odebranie zadania ==


* poszukaj zgłoszonego zadania o najwyższym priorytecie
* poszukaj w PZGLI zgłoszonego zadania o najwyższym priorytecie
* wpisz nr.zad do IDZAD
* 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
* wybierz linię, od której zaczniesz szukać (następna, bądź 0 jeśli pracowała ostatnia) i iteruj po wszystkich liniach
Linia 451: Linia 706:
** wyślij przerwanie liniowe
** wyślij przerwanie liniowe
** ponownie uruchom manager zadań
** ponownie uruchom manager zadań
== Status linii ==
Polecenie liniowe "podaj status" zwraca status linii opisany strukturą STATL. Dokumentacja opisuje znaczenie tylko niektórych jej bitów, poniżej kompletny opis dwóch bajtów składających się na status. Numeracja bitów MERY-400 (0=MSB, 15=LSB). W słowie statusu jest jeszcze trzeci bajt, niedostępny dla programisty, opisujący status USART-a.
{| class="wikitable"
! Bit !! Opis
|-
| 0 || 0
|-
| 1 || Nadawanie ostatniego fragmentu
|-
| 2 || Nadawanie zawieszone przez XOFF
|-
| 3 || Zadanie zawieszone przez XOFF
|-
| 4 || -
|-
| 5 || -
|-
| 6 || Aktywna transmisja
|-
| 7 || Linia dołączona
|-
| 8 || OPRQ
|-
| 9 || Błąd parzystości
|-
| 10 || Odebrano znak kończący
|-
| 11 || Stop po CAN (protokół 5)
|-
| 12 || Odbiór w toku
|-
| 13 || Odbiór rozpoczęty
|-
| 14 || Nadawanie w toku
|-
| 15 || Nadawanie rozpoczęte
|}

Menu nawigacyjne