SIO
From Atariki
Wersja z dnia 02:31, 25 lip 2005 KMK (Dyskusja | wkład) (→Wykaz typowych komend) ← Previous diff |
Wersja z dnia 02:34, 25 lip 2005 KMK (Dyskusja | wkład) (→Blok PERCOM) Next diff → |
||
Linia 185: | Linia 185: | ||
===Blok PERCOM=== | ===Blok PERCOM=== | ||
- | Tak zwany blok PERCOM nosi nazwę od stacj dysków firmy PERCOM, w których po raz pierwszy pojawiły się odnośne komendy. Jest to 12 bajtów informacji o konfiguracji stacji dysków. Odczyt przeprowadza się komendą $4E ("N"), a zapis - komendą $4F ("O"). | + | Blok PERCOM jest to 12 bajtów informacji o konfiguracji stacji dysków. Odczyt przeprowadza się komendą $4E ("N"), a zapis - komendą $4F ("O"). |
<table border=1 cellpadding=5> | <table border=1 cellpadding=5> |
Wersja z dnia 02:34, 25 lip 2005
SIO - Serial Input/Output. W założeniach jest to rezydujący w ROM-ie podsystem niskopoziomowych procedur blokowego dostępu do urządzeń szeregowych, to jest przede wszystkim stacji dysków, drukarek, modemów i magnetofonu. Wszystkie te urządzenia podłącza się w Atari do gniazda SIO.
W serii XL do podsystemu SIO dodano także niskopoziomową (blokową) obsługę urządzeń podłączanych do szyny równoległej (PBI), czyli tak zwanych nowych urządzeń.
Spis treści |
Sposób użycia
Żądaną operację definiuje się ustawiwszy przedtem odpowiednie zmienne w bloku DCB (Device Control Block, $0300), a nastepnie wywołuje skokiem JSR pod JSIOINT $E459, co jest punktem wejściowym interfejsu szeregowo-równoległego. Przy powrocie rejestr Y zawiera wartość 1 w przypadku powodzenia, bądź ujemny kod błędu.
Struktura DCB
Adres | Etykieta | Wielkość | Znaczenie |
$0300 | DDEVIC | Bajt | Identyfikator urządzenia (zob. niżej). |
$0301 | DUNIT | Bajt | Numer urządzenia; w przypadku stacji dysków numer napędu. |
$0302 | DCMND | Bajt | Komenda dla urządzenia. |
$0303 | DSTATS | Bajt | Przed wywołaniem SIO należy ustawić tu rodzaj operacji ($40 odczyt, $80 zapis). Po powrocie z systemu znajduje się tu status operacji (kod błędu). |
$0304 | DBUFA | Dwa bajty | Adres bufora. |
$0306 | DTIMLO | Bajt | Czas oczekiwania - w sekundach - na pozytywną odpowiedź urządzenia. |
$0307 | DUNUSE | Bajt | Bajt nieużywany, zarezerwowany do przyszłych zastosowań. |
$0308 | DBYT | Dwa bajty | Wielkość bufora; musi być zgodna z wielkością transmitowanego bloku danych. |
$030A | DAUX1 | Bajt | Pierwszy bajt pomocniczy. W operacjach dyskowych młodszy bajt numeru sektora. |
$030B | DAUX2 | Bajt | Drugi bajt pomocniczy. W operacjach dyskowych starszy bajt numeru sektora. |
Wykaz urządzeń
Interfejs SIO znajdujący się w ROM-ie rozpoznaje pięć predefiniowanych urządzeń:
- $31: dyskową pamięć masową (stację dysków, twardy dysk)
- $40: drukarkę
- $4F: bus master (Atari 1090)
- $50: port szeregowy RS-232-C
- $60: magnetofon kasetowy
Właściwy identyfikator urządzenia zestawiany jest przez system z kodu urządzenia (DDEVIC) i jego numeru indywidualnego (DUNIT). Wartości te są dodawane, po czym jeszcze odejmuje się 1. Przypisanie identyfikatorów do poszczególnych urządzeń jest niezbyt konsekwentne, np. $31 to stacja dysków numer 1, ale $41 to drukarka numer 2.
Wykaz typowych komend
Zestaw standardowych komend rozpoznawanych przez urządzenia peryferyjne Atari.
Kod | Nazwa | Urządzenie | R/W | Ilość danych | Opis |
$21 (!) | FORMAT DISK | $31 (stacja dysków) | R | Równa wielkości sektora danych na dysku | Formatuje dyskietkę w wybranej uprzednio (komendami PERCOM) gęstości, lub w pojedynczej gęstości, jeśli stacja nie jest konfigurowalna. Zwraca listę zawierającą numery wadliwych sektorów wykrytych w czasie formatowania, zakończoną wartością $FFFF. Niektóre stacje zwracają tu pustą listę ($FFFF, a dalej same zera), nawet jeśli na dyskietce są wadliwe sektory: po prostu dyskietki nie są już tak drogie, jak pod koniec lat siedemdziesiątych XX wieku... Kontroler KMK/JŻ IDE nie rozpoznaje tej komendy dla bezpieczeństwa danych na dysku (do partycjonowania i "formatowania" dysku służy oddzielny program). |
$22 (") | FORMAT MEDIUM | $31 (stacja dysków) | R | 128 bajtów | Analogicznie do FORMAT DISK, z tym że formatowanie zawsze przeprowadzane jest w gęstości średniej. Komenda wprowadzona razem ze stacją 1050. Kontroler KMK/JŻ IDE nie rozpoznaje tej komendy dla bezpieczeństwa danych na dysku (do partycjonowania i "formatowania" dysku służy oddzielny program). |
$50 (P) | PUT SECTOR | Wszystkie za wyjątkiem drukarki | W | Zależna od urządzenia i trybu pracy. | Zapisuje do urządzenia blok danych wskazany przez DBUFA, a zawierający DBYT bajtów. W przypadku stacji dysków jest to zapis bez weryfikacji. |
$52 (R) | READ SECTOR | Wszystkie oprócz drukarki | R | Zależna od urządzenia i trybu pracy. | Odczytuje z urządzenia blok danych o wielkości DBYT bajtów i zapisuje go w pamięci pod adresem wskazanym przez DBUFA. |
$53 (S) | READ STATUS | Wszystkie oprócz magnetofonu | R | 4 bajty | Odczytuje z urządzenia czterobajtowy blok statusu i zapisuje go pod adresem wskazanym przez DBUFA. Typowo komenda ta służy to stwierdzenia, czy urządzenie jest gotowe do pracy. |
$57 (W) | WRITE SECTOR | Wszystkie | W | Zależna od urządzenia i trybu pracy. | To samo, co PUT SECTOR ($52). W przypadku stacji dysków zapis przeprowadzany jest z weryfikacją. |
W przypadku drukarki długość bufora może wynosić 20, 29 albo 40 znaków (na ogół to ostatnie), a znaczenie DAUX2 jest jak następuje:
|
Komendy PERCOM
Kod | Nazwa | Urządzenie | R/W | Ilość danych | Opis |
$4E (N) | READ PERCOM | $31 (stacja dysków) | R | 12 bajtów | Odczytuje z urządzenia dwunastobajtowy blok danych opisujący jego bieżącą konfigurację, tj. przede wszystkim format znajdującej się w stacji dyskietki. Komenda ta nie jest rozpoznawana przez standardowe stacje Atari, ale jest zaimplementowana we wszystkich rozszerzeniach oraz stacjach innych producentów. |
$4F (O) | WRITE PERCOM | $31 (stacja dysków) | W | 12 bajtów | Zapisuje do urządzenia dwanaście bajtów opisujących żądaną konfigurację, tj. liczbę ścieżek, stron dyskietki, sektorów na ścieżkę, wielkość sektora, gęstość. Po pomyślnym wykonaniu tej operacji komenda FORMAT DISK ($21) sformatuje dykietkę zgodnie z zapisaną konfiguracją. Komenda ta nie jest rozpoznawana przez standardowe stacje Atari, ale jest zaimplementowana we wszystkich rozszerzeniach oraz stacjach innych producentów. Kontroler KMK/JŻ IDE nie rozpoznaje tej komendy dla bezpieczeństwa danych na dysku (do definiowania wielkości partycji służy oddzielny program). |
Komendy specjalne
Kod | Nazwa | Urządzenie | R/W | Ilość danych | Opis |
$3F (?) | POLL | $31 (stacja dysków) | R | 1 bajt | Stacje kompatybilne z US Doubler w odpowiedzi na tę komendę przesyłają wartość rejestru POKEY-a służącego do ustawienia częstotliwości nośnej dla przyspieszonej transmisji. | $50 (RS-232) | R | 12 bajtów | ??? | </tr>
$40 (@) | POLL BUS | $4F | R | 4 bajty | Komendę tę system operacyjny wysyła na port szeregowy przy każdym zimnym starcie. Jej znaczenie jest nieznane, przypuszczalnie nie jest ona w ogóle przeznaczona dla urządzenia szeregowego, lecz dla urządzenia szyny równoległej (może modułu Atari 1090). Ale nic nie stoi na przeszkodzie ku wykorzystaniu również przez urządzenia szeregowe. Na początku komenda przesyłana jest z DAUX1 = $4F i DAUX2 = $4F ("OO" - jak "open"?). Następnie - i to bez sprawdzenia statusu wykonania się tej operacji - przesyłane jest drugi raz to samo, tym razem z DAUX1 = 0 i DAUX2 = 0. Dopiero po tym sprawdzany jest status - co wskazuje, że przesłana para poleceń ma w istocie stanowić jedną komendę, albo że protokół przewiduje przesyłanie wielu komend na raz, a "00" jest klauzulą, sygnałem końca bloku poleceń. Pozytywna odpowiedź oznacza, że urządzenie nadesłało 4 bajty, z czego dwa pierwsze to ilość pamięci potrzebna do przeprowadzenia całości transmisji. Jeśli jest to więcej niż dostępna ilość pamięci pomiędzy MEMLO a MEMTOP, system ponownie wysyła tę samą komendę, ale DAUX1 i DAUX2 są tym razem ustawione na $4E ("NN" - jak "negative"?). I znów, bez sprawdzenia statusu, jako klauzula wysyłana jest ta sama komenda po raz czwarty z DAUX1 i DAUX2 ustawionymi na zero, a po pozytywnej odpowiedzi na tę sekwencję cała procedura zaczyna się od początku. W przypadku braku pamięci byłaby to pętla nieskończona, ale po wysłaniu przez komputer odpowiedzi "NN", na następną komendę urządzenie zapewne już nie odpowiada tak samo - być może jakoś zmienia ofertę, albo zgłasza błąd. Trzeci przysłany bajt to identyfikator urządzenia (dla DDEVIC), które odpowiedziało na komendę i z którym będzie prowadzona dalsza komunikacja. Po stwierdzeniu poprawności odpowiedzi komputer dokonuje rezerwacji pamięci nad wartością MEMLO zaokrągloną w górę do najbliższej granicy słowa i próbuje dokonać odczytu z urządzenia, które się zgłosiło, 128 bajtów pod adres $03FD, przy użyciu innej "nietypowej" komendy, a mianowicie $26 - SEND HANDLER. Trzeba nadmienić, że "handler", którego komputer domaga się przy zimnym starcie, ma mieć raczej charakter ogólnego handlera wszystkiego, czyli innymi słowy ma grać rolę co najmniej części, o ile nie całości, systemu operacyjnego. Procedura ładowania handlera wywoływana jest po procedurze bootowania DOS-u, ale niezależnie od jej wyniku; z czego wniosek, że "handler" może spełniać funkcję zarówno dodatku do DOS-u, jak i zostać załadowany zamiast DOS-u. Że chodzi o handler "ogólny", wiadomo stąd, że tą samą drogą można już po całkowitym uruchomieniu systemu, podczas pracy, załadować handler urządzenia konkretnie wskazanego. Robi to CIO przy każdorazowej próbie otwarcia pliku na urządzeniu, którego system nie zna (nie ma takiego wpisu w tablicy handlerów). Odpytanie urządzenia $4F (za którym to identyfikatorem stoi zapewne jakiś moduł rozszerzeń zarządzający podłączonymi do siebie kartami) na okoliczność dysponowania takowym handlerem odbywa się tak samo, jak przy zimnym starcie, z tą jedynie różnicą, że DAUX1/2 nie są wyzerowane. W DAUX1 ma się znajdować identyfikator urządzenia CIO, dla którego to urządzenia potrzebujemy handlera (np. dla magnetofonu $43, czyli "C"), w DAUX2 natomiast przesyła się numer wywoływanego urządzenia (np. dla "C1:" będzie to $01). |
$26 (&) | SEND HANDLER | Urządzenie o kodzie zwróconym przez komendę POLL BUS ($40) | R | 128 bajtów | Komenda ta nie jest nigdzie opisana, ale na szczęście w dokumentacji SIO znajduje się wzmianka o niej pozwalająca ustalić oficjalną nazwę (SEND HANDLER właśnie). Reszta została wywnioskowana z kodu systemu operacyjnego. Procedura ładowania handlera zaczyna się zawsze od wysłania komendy POLL BUS ($40). Po otrzymaniu pozytywnej odpowiedzi komputer rozpoczyna ładowanie kolejnych, 128-bajtowych rekordów binarnych, w liczbie do 256 (czyli "handler" może mieć maksimum 32k) oraz interpretację ich zawartości w sposób nie do końca jeszcze dla mnie jasny, jako że formatu danych nie zdołałem jeszcze rozgryźć. Wiadomo, że przesyłany strumień danych zawiera podany explicite znacznik końca pliku - wystąpienie błędu przed napotkaniem tego znacznika powoduje przerwanie procedury z kodem błędu INCOMPLETE EXECUTION. Ustawienia zmiennych DCB dla komendy SEND HANDLER wyglądają następująco:
|
Pozostałe komendy
Kod | Nazwa | Urządzenie | R/W | Ilość danych | Opis | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
$51 (Q) | READ SPIN | $31 (stacja dysków) | R (?) | ? | Komendy te występują jako komendy dyskowe na liście rozkazów SIO w dokumentacji sporządzonej przez Atari. Nie znam jednak stacji, która by na nie reagowała. Mogą to być komendy stacji 810, jakieś komendy diagnostyczne jej prototypu, albo komendy planowane, lecz nie zaimplementowane. Dostępna dokumentacja nie zawiera ich opisu. |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
$55 (U) | MOTOR ON | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
$56 (V) | VERIFY SECTOR | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
$21 (!) | SEND RELOCATOR | Nie wiadomo, nie stacja dysków w każdym razie | R | ? | Komenda ta występuje jako komenda "nie dysku" na liście rozkazów SIO w dokumentacji sporządzonej przez Atari. Nie znam urządzenia, które by na nie reagowało. Może to być komenda uzupełniająca do opisanego wyżej SEND HANDLER ($26). Dostępna dokumentacja nie zawiera żadnego opisu. |
Bajt | Znaczenie |
0 |
|
1 | DAUX2 przesłanej ostatnio komendy |
2 | Maksymalny czas oczekiwania na wykonanie komendy (timeout) przewidziany dla tej drukarki |
3 | Nie używany. |
Stacja dysków
Bajt | Znaczenie |
0 |
|
1 | Bajt statusu kontrolera WD 1772, wszystkie bity są poddane inwersji. |
2 | Maksymalny czas oczekiwania na wykonanie komendy (timeout) przewidziany dla operacji dyskowej. Najdłużej trwa formatowanie, zalecaną wartością jest 240. |
3 | Nie używany. |
Blok PERCOM
Blok PERCOM jest to 12 bajtów informacji o konfiguracji stacji dysków. Odczyt przeprowadza się komendą $4E ("N"), a zapis - komendą $4F ("O").
Bajt | Opis | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
0 | Liczba ścieżek na dyskietce; w praktyce dla stacji dysków spotyka się wartości najczęściej 40 lub 80, rzadziej 35 lub 77. Partycje twardego dysku zwracają 1. | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
1 | Szybkość przesuwu głowicy ze ścieżki na ścieżkę:
W praktyce stacje przeważnie ignorują przesłaną wartość. W przypadku twardego dysku jest ona bez znaczenia (kontroler KMK/JŻ zwraca w tym bajcie numer wersji wewnętrznego oprogramowania) | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
2 | STARSZY bajt liczby sektorów na ścieżce. | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
3 | MŁODSZY bajt liczby sektorów na ścieżce. | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
4 | Liczba aktywnych stron dyskietki zmniejszona o 1 albo nastarszy bajt liczby sektorów partycji twardego dysku (patrz niżej). | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
5 | Gęstość zapisu:
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
6 | STARSZY bajt wielkości sektora (w bajtach) | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
7 | MŁODSZY bajt wielkości sektora (w bajtach) | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
8 | Niewykorzystany, zapisuje się - i przeważnie odczytuje - jako $FF. W oryginalnych stacjach PERCOM bajt ten sygnalizował stan niektórych funkcji kontrolera stacji i służył do ich wybierania:
Oczywiście wartość dzielnika częstotliwości może mieć i wyższe wartości, do 65535 włącznie (co daje 13,6 bps). MagnetofonDla magnetofonu domyślną wartością rejestru jest 1484, co odpowiada szybkości 594,7 bps. Szybkość tę podczas transmisji komputer dostosowuje w pewnym zakresie do bieżących potrzeb wynikłych np. z nierównomiernego przesuwu taśmy bądź jej rozciągnięcia itd. W odróżnieniu od innych urządzeń szeregowych, które używają modulacji częstotliwościowej, dla magnetofonu stosowany jest tryb dwutonowy. Rozszerzenia SIOSystemy turbo do stacji dyskówStandardowa szybkość wymiany danych ze stacją dysków - 19200 bps - szybko okazała się dalece niewystarczająca. Ponieważ, jak napisano powyżej, możliwości układu Pokey pozwalają uzyskać znacznie więcej, wkrótce powstało kilka, różnych niestety, systemów "turbo". US Doubler / Happy WarpProtokół transmisji US Doublera (i zgodnego z nim Happy Warp) jest identyczny jak w standardzie, z tą różnicą, że układ Pokey programowany jest do pracy z prędkością 52 kbps. Praca w standardowym 19,2 kbps także jest możliwa. Stacja przełącza się automatycznie pomiędzy tymi dwoma trybami pracy, a do pomiaru żądanej przez komputer prędkości wykorzystuje pojawiający się na złączu szeregowym Atari synchronizujący sygnał zegarowy (CLOCK OUT). Stacje z rozszerzeniem US Doubler implementują dodatkową komendę POLL ('?'). Wysłanie - w standardzie - tej komendy do stacji dysków powoduje, że zwraca ona 1 bajt stanowiący wartość, jaką należy wstawić do licznika układu Pokey celem uzyskania szybkiej transmisji. W standardowych stacjach US Doubler wartością tą jest $0A, ale stacje innych producentów dzięki temu mechanizmowi mogą implementować wyższe prędkości i wciąż pozostają zgodne z US Doublerem. Atari XF-551 / CA-2001Stacje Atari XF-551 oraz California Access 2001 mogą pracować z prędkością 38400 bps. Dla zasygnalizowania stacji, że komputer żąda pracy w turbo, przy prędkości 38400 bps używany jest inny protokół transmisji będący - oczywiście - zmodyfikowaną wersją standardowego (patrz wyżej). Blok komendy (Command Frame) dla stacji, tak samo jak w standardzie, wysyłany jest z prędkością 19200 bps. Jednakże drugi bajt tego bloku, zawierający wartość bajtu DCMND bloku DCB, jest zwiększony o 128 (ORA #$80). Po wysłaniu komendy komputer, identycznie jak w standardzie, czeka - cały czas mając układ Pokey zaprogramowany na 19200 bps - na potwierdzenie jej przyjęcia. Negatywna odpowiedź urządzenia na taką komendę oznacza, że nie zna ono tego protokołu transmisji i nie może pracować w turbo zgodnym z XF-551. Odpowiedź pozytywna ('A') jest sygnałem do przeprogramowania układu Pokey na większą prędkość. Komputer wstawia do licznika AUDF3/4 wartość $10; analogicznej operacji ze swojej strony dokonuje stacja dysków. Dalsza wymiana danych wywołana przez tę jedną komendę odbywa się w przyspieszonej transmisji. Po wykonaniu komendy następuje powrót do prędkości standardowej. Ogólnie schemat wymiany danych przy odczycie jest następujący:
Natomiast zapis wygląda tak:
Budzącym zakłopotanie niedopatrzeniem jest w tym wszystkim niemożność odpytania stacji na okoliczność wartości, jaką ma mieć licznik Pokeya w czasie przyspieszonej transmisji. Dodatkowym kłopotem posiadaczy CA-2001 jest to, że stację trzeba specjalnie zaprogramować (programem o nazwie Synchromesh dostarczonym przez producenta na dyskietce), żeby w ogóle działała w turbo. XF-551 jest tej ostatniej wady na szczęście pozbawiona. Indus GT / LDW 2000 SuperProtokół przyspieszonej transmisji używany przez stacje Indus GT oraz LDW Super 2000 jest identyczny z tym opisanym powyżej dla Atari XF-551 oraz California Access 2001. Jedyną różnicą jest szybkość transmisji: dla LDW wynosi ona 68,2 kbps (wartość licznika Pokeya - $06). Dla uzyskania tej prędkości konieczne jest uprzednie zaprogramowanie stacji programem Synchromesh dostarczonym przez producenta na dyskietce. Stacja pozostaje zaprogramowana aż do wyłączenia zasilania. Ogólnie schemat wymiany danych przy odczycie jest następujący:
Natomiast zapis wygląda tak:
Top Drive / TOMS TurboStacje z rozszerzeniem Top Drive 1050, TOMS Turbo oraz TOMS Multi mogą pracować z prędkością 68,2 kbps. Dla zasygnalizowania stacji, że komputer żąda pracy w turbo, przy prędkości 68,2 kbps używany jest inny protokół transmisji będący zmodyfikowaną wersją standardowego. Protokół ten jest odmienny niż w wypadku stacji XF-551. Blok komendy (Command Frame) dla stacji, tak samo jak w standardzie, wysyłany jest z prędkością 19200 bps. Czwarty bajt tego bloku, niosący wartość bajtu DAUX2 bloku DCB, jest zwiększony o 128 (ORA #$80). Po wysłaniu komendy komputer - nie czekając na odpowiedź - przeprogramowuje układ Pokey na 68,2 kbps (wartość licznika - $06) założywszy w ciemno, że stacja ze swej strony również przełącza się na szybką transmisję. Odbiór ewentualnej negatywnej odpowiedzi oczywiście nie jest w takim układzie możliwy. Dalsza wymiana danych wywołana przez tę jedną komendę odbywa się w przyspieszonej transmisji. Po wykonaniu komendy następuje powrót do prędkości standardowej. Ogólnie schemat wymiany danych przy odczycie jest następujący:
Natomiast zapis wygląda tak:
Jest to zdecydowanie najpodlejsze turbo z omawianej tu czwórki; Top Drive nie dość, że ma wszystkie wady protokołu XF-551, to jeszcze dorzuca do nich jedną własną (którą jest wspomniana wyżej niemożność odrzucenia przez stację w cywilizowany sposób żądanego przez komputer trybu pracy), nie mając przy tym żadnych równoważących to zalet (jeden bajt więcej przesłany w szybkiej transmisji zwiększa prędkość wymiany danych o niecałe 8 promili). Rozszerzone adresowanie sektorów (KMK/JŻ IDE)Kontroler KMK/JŻ IDE wykorzystuje bajt DUNUSE ($0307) bloku DCB jako najstarszy bajt numeru sektora. Pozwala to na zaadresowanie do 16777215 sektorów na jednej partycji. Rozszerzone adresowanie pamięci (65C816)DracOS (odmiana XL OS przygotowana dla procesora 65C816) zawiera rozszerzenie SIO pozwalające na transfery danych bezpośrednio do i z dodatkowej pamięci adresowalnej liniowo (tj. znajdującej się pod adresami wyższymi niż $FFFF). Blok DCBBlock DCB w tej wersji systemu jest rozszerzony do 16 bajtów i wygląda następująco:
Sposób użyciaDla utrzymania zgodności z dotychczasowym oprogramowaniem, a już zwłaszcza z dotychczasowymi sterownikami urządzeń podłączanych do szyny równoległej, wpisanie pod $000304/5/E 24-bitowego adresu nie da pożądanego wyniku; jeśliby bowiem urządzenie brało pod uwagę tylko 16 najmłodszych bitów adresu ignorując najstarszy bajt wpisany pod $00030E, wtedy - przy odczycie - dane zostałyby umieszczone nie tam, gdzie trzeba. Musi więc istnieć mechanizm, który zapobiega tego typu nieporozumieniom. W tym celu SIO definiuje trzy nowe urządzenia wirtualne, o kodach jak następuje:
Wywołanie urządzenia z takim kodem w DDEVIC powiadamia sterownik SIO, że adres bufora w DCB jest 24-bitowy i że najstarszy bajt adresu jest pod $00030E (w przeciwnym wypadku SIO zakłada, że najstarszy bajt adresu to 0); oraz że numer sektora jest 32-bitowy i jest umieszczony w DAUX1-DAUX4 (UWAGA: w przypadku szeregowych stacji dysków, SIO2IDE, SIO2PC itp. dwa najstarsze bajty tego numeru są ignorowane, ale powinny być wyzerowane dla kompatybilności). Poza tym działanie urządzeń wirtualnych jest identyczne, jak tradycyjnych (odpowiednio $31, $40 i $50), a kod urządzenia jest przed wysłaniem na port szeregowy przekładany na kod rzeczywisty. Przyjmując komendę do wykonania SIO w żaden sposób nie sprawdza, czy dodatkowa pamięć w ogóle istnieje - zakłada się, że program sam stwierdzi jej istnienie (choćby za pomocą funkcji alokacji pamięci) przed próbą odczytu do niej danych. Bibliografia
|