SIO

From Atariki

(Różnice między wersjami)
Jump to: navigation, search
Wersja z dnia 23:22, 8 gru 2004
KMK (Dyskusja | wkład)

← Previous diff
Aktualna wersja
Mono (Dyskusja | wkład)
(wydzielenie osobnego artykułu o obsłudze protokołu sio)
Linia 1: Linia 1:
-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.+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 [[Gniazdo SIO|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 [[nowe urządzenia|nowych urządzeń]].+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 [[nowe urządzenia|nowych urządzeń]].
-===Sposób użycia===+==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 [[kody błędów|kod błędu]].+Żądaną operację definiuje się ustawiwszy przedtem odpowiednie zmienne w bloku DCB (Device Control Block, $0300), a następnie 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 [[kody błędów|kod błędu]].
-Struktura DCB:+===Struktura DCB===
<table border=1 cellpadding=5> <table border=1 cellpadding=5>
-<tr><td>Adres</td><td>Etykieta</td><td>Wielkość</td><td>Znaczenie</td></tr>+<tr><td><b>Adres</b></td><td><b>Etykieta</b></td><td><b>Wielkość</b></td><td><b>Znaczenie</b></td></tr>
-<tr><td>$0300</td><td>DDEVIC</td><td>Bajt</td><td>Identyfikator urządzenia. W przypadku stacji dysków trzeba podać identyfikator zwiększony o 1!</td></tr>+ 
 +<tr><td>$0300</td><td>DDEVIC</td><td>Bajt</td><td>Identyfikator urządzenia (zob. niżej).</td></tr>
 + 
<tr><td>$0301</td><td>DUNIT</td><td>Bajt</td><td>Numer urządzenia; w przypadku stacji dysków numer napędu.</td></tr> <tr><td>$0301</td><td>DUNIT</td><td>Bajt</td><td>Numer urządzenia; w przypadku stacji dysków numer napędu.</td></tr>
 +
<tr><td>$0302</td><td>DCMND</td><td>Bajt</td><td>Komenda dla urządzenia.</td></tr> <tr><td>$0302</td><td>DCMND</td><td>Bajt</td><td>Komenda dla urządzenia.</td></tr>
-<tr><td>$0303</td><td>DSTATS</td><td>Bajt</td><td>Przed wywołaniem SIO należy ustawić tu rodzaj operacji ($40 odczyt, $80 zapis). Po powrocie z systemu znajduje się tu status operacji ([[kody błędów|kod błędu]]).</td></tr>+ 
-<tr><td>$0304</td><td>DBUFA</td><td>Dwa bajty</td><td>Adres bufora.</td></tr>+<tr><td>$0303</td><td>DSTATS</td><td>Bajt</td><td>Przed wywołaniem SIO należy ustawić tu rodzaj operacji ($40 odczyt, $80 zapis, $C0 zapis i odczyt, $00 brak transferu danych). Po powrocie z systemu znajduje się tu status operacji ([[kody błędów|kod błędu]]).</td></tr>
-<tr><td>$0306</td><td>DTIMLO</td><td>Bajt</td><td>Czas oczekiwania na pozytywną odpowiedź urządzenia.</td></tr>+ 
 +<tr><td>$0304</td><td>DBUFA</td><td>Dwa bajty</td><td>Adres bufora. Przy operacji zapisu i odczytu jednocześnie (DSTATS = $C0) bufor na odczytywane dane znajduje się w tym samym miejscu, co bufor danch przeznaczonych do zapisu.</td></tr>
 + 
 +<tr><td>$0306</td><td>DTIMLO</td><td>Bajt</td><td>
 +<p>Czas oczekiwania na pozytywną odpowiedź urządzenia, tzw. ''timeout''. Oblicza się to jak następuje: wartość DTIMLO mnożona jest przez 64, w wyniku czego otrzymujemy liczbę "[[ramka|ramek]]" [[VBL]] do odczekania. Zwiększenie DTIMLO o jeden powoduje wydłużenie czasu oczekiwania o 1,28 sek. w systemie PAL i o 1,067 sek. w systemie NTSC. Wartość "0" oznacza 256 jednostek.</p>
 +<p>Typowo ustawia się tu wartość z zakresu od $06 do $08 (zależnie od kaprysu programisty) dla wszystkich operacji oprócz formatowania. Właściwą wartość timeout dla formatowania urządzenie przesyła w bloku statusu, w odpowiedzi na komendę READ STATUS ("S", zob. niżej).</p>
 +</td></tr>
 + 
<tr><td>$0307</td><td>DUNUSE</td><td>Bajt</td><td>Bajt nieużywany, zarezerwowany do przyszłych zastosowań.</td></tr> <tr><td>$0307</td><td>DUNUSE</td><td>Bajt</td><td>Bajt nieużywany, zarezerwowany do przyszłych zastosowań.</td></tr>
-<tr><td>$0308</td><td>DBYT</td><td>Dwa bajty</td><td>Wielkość bufora; musi być zgodna z wielkością transmitowanego bloku danych.</td></tr>+ 
 +<tr><td>$0308</td><td>DBYT</td><td>Dwa bajty</td><td>Wielkość bufora; musi być zgodna z wielkością transmitowanego bloku danych. Zero oznacza 64 kilobajty.</td></tr>
 + 
<tr><td>$030A</td><td>DAUX1</td><td>Bajt</td><td>Pierwszy bajt pomocniczy. W operacjach dyskowych młodszy bajt numeru sektora.</td></tr> <tr><td>$030A</td><td>DAUX1</td><td>Bajt</td><td>Pierwszy bajt pomocniczy. W operacjach dyskowych młodszy bajt numeru sektora.</td></tr>
 +
<tr><td>$030B</td><td>DAUX2</td><td>Bajt</td><td>Drugi bajt pomocniczy. W operacjach dyskowych starszy bajt numeru sektora.</td></tr> <tr><td>$030B</td><td>DAUX2</td><td>Bajt</td><td>Drugi bajt pomocniczy. W operacjach dyskowych starszy bajt numeru sektora.</td></tr>
</table> </table>
-Interfejs SIO znajdujący się w ROM-ie rozpoznaje cztery predefiniowane urządzenia:+===Wykaz urządzeń===
-* $30: dyskową pamięć masową (stację dysków, twardy dysk)+Komenda wysyłana do urządzenia formowana jest w strukturze CFB (Command Frame Buffer, $023A) składającej się z:
-* $40: drukarkę+* CDEVIC
-* $50: interfejs RS-232+* CCMND
-* $60: magnetofon kasetowy+* CAUX1
 +* CAUX2
 +a uzupełnianej na podstawie DCB.
-przy czym identyfikator urządzenia to górne 4 bity podanego kodu, dolne natomiast 4 bity stanowi indywidualny numer urządzenia (np. $31 - stacja dysków nr 1, $32 - stacja dysków nr 2 itd.).+Istnieje pięć urządzeń zdefiniowanych przez Atari. Właściwy identyfikator urządzenia (CDEVIC) 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. Dlatego stację dysków nr 1 można wywołać też jako DDEVIC=$32 i DUNIT=0, liczy się wynik wspomnianego dodawania (CDEVIC). UWAGA: jest to tzw. "nieudokumentowana" cecha procedur szeregowych OS-u, inne urządzenia (jak np. [[nowe urządzenia]]) mogą tego nie robić.
-Wykaz typowych komend:+<table border=1 cellpadding = 5>
 +<tr><td><b>DDEVIC</b></td><td><b>CDEVIC</b></td><td><b>Opis</b></td></tr>
 +<tr><td>$31</td><td>$31-$3F</td><td>dyskowa pamięć masowa (stacja dysków, twardy dysk)</td></tr>
 +<tr><td>$40</td><td>$40-$43</td><td>drukarka</td></tr>
 +<tr><td>$4F</td><td>$4F</td><td>bus master (moduł [[1090]])</td></tr>
 +<tr><td>$50</td><td>$50-$53</td><td>port szeregowy RS-232C</td></tr>
 +<tr><td>$60</td><td>$60</td><td>magnetofon kasetowy</td></tr>
 +</table>
-<table border=1 cellpadding=5>+Przypisanie identyfikatorów do poszczególnych urządzeń jest niezbyt konsekwentne, np. CDEVIC=$31 to stacja dysków numer 1, ale CDEVIC=$41 to drukarka numer 2.
-<tr><td>Kod</td><td>Nazwa</td><td>Urządzenie</td><td>R/W</td><td>Ilość danych</td><td>Opis</td></tr>+
-<tr><td>$21 (!)</td><td>FORMAT DISK</td><td>$31 (stacja dysków)</td><td>R</td><td>128 B</td><td>Formatuje dyskietkę w wybranej uprzednio (komendami PERCOM) gęstości, lub w [[Formaty dyskietek|pojedynczej gęstości]], jeśli stacja nie jest konfigurowalna. Zwraca listę zawierającą do 62 numerów wadliwych sektorów wykrytych w czasie formatowania, zakończoną wartością $FFFF.</td></tr>+
-<tr><td>$22 (")</td><td>FORMAT MEDIUM</td><td>$31 (stacja dysków)</td><td>R</td><td>128 B</td><td>Analogicznie do FORMAT DISK, z tym że formatowanie zawsze przeprowadzane jest w [[Formaty dyskietek|gęstości średniej]]. Komenda wprowadzona razem ze stacją [[1050]]</td></tr>+
-<tr><td>$50 (P)</td><td>PUT SECTOR</td><td>Wszystkie</td><td>W</td><td>Zależna od urządzenia i trybu pracy.</td><td>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.</td></tr>+
-<tr><td>$52 (R)</td><td>READ SECTOR</td><td>Wszystkie oprócz drukarki</td><td>R</td><td>Zależna od urządzenia i trybu pracy.</td><td>Odczytuje z urządzenia blok danych o wielkości DBYT bajtów i zapisuje go w pamięci pod adresem wskazanym przez DBUFA.</td></tr>+
 +Urządzeniem, które na podanej powyżej liście jest wyjątkowe, jest magnetofon kasetowy. Jest to jedyne "nieinteligentne" urządzenie peryferyjne, to jest nie zawierające własnego procesora. Wszystkie zadania związane z wysyłaniem danych na magnetofon i odbiorem z niego wykonuje system operacyjny komputera. W odróżnieniu od innych urządzeń, magnetofon okupuje tylko identyfikator $60, a wartość DUNIT jest ignorowana - w związku z tym kody urządzeń od $61 do $6F są (na razie) wolne.
 +
 +Wartości CDEVIC powyżej $7F są zarezerwowane dla pewnych rozszerzeń protokołu SIO, patrz [[SIO#Rozszerzenia_SIO|niżej]].
 +
 +Ponieważ identyfikator jest częścią wysyłanej do urządzenia komendy, więc budując własne urządzenie można posłużyć się identyfikatorem spoza powyżej wyszczególnionych:
 +
 +<table border=1 cellpadding = 5>
 +<tr><td><b>DDEVIC</b></td><td><b>CDEVIC</b></td><td><b>Opis</b></td></tr>
 +<tr><td>$20</td><td>$20</td><td>[[IDE Plus]], [[SIDE]]</td></tr>
 +<tr><td>$45</td><td>$45</td><td>[[Smart Device]] ( [[APE Time]] i [[URL Submit]])</td></tr>
 +<tr><td>$5A</td><td>$5A</td><td>[[ATR 8000]]</td></tr>
 +<tr><td>$61</td><td>$61</td><td>[[AtariSIO]], [[DOS2DOS]]</td></tr>
 +<tr><td>$70</td><td>$70</td><td>[http://www.mathyvannisselroy.nl/aspi.htm Atari ASPI] (zob. [http://pl.wikipedia.org/wiki/ASPI ASPI])</td></tr>
 +<tr><td>$71-$74</td><td>$71-$74</td><td>[[SDrive]]</td></tr>
 +<tr><td>$71</td><td>$70</td><td>[[SIO2USB]] [http://www.atariage.com/forums/topic/155690-ape-time/page__view__findpost__p__1916403?s=2e4d3fd681ca05ec0c05b0a7e5474dd6]</td></tr>
 +<tr><td>$73</td><td>$72-$75</td><td>[[SIO2SD|Sio2SD]]</td></tr>
</table> </table>
 +
 +===Wykazy komend===
 +
 +* [[Lista komend SIO według funkcji]]
 +* [[Lista komend SIO według kodów operacyjnych]]
 +
 +===Blok statusu===
 +
 +Blok statusu przysyłany na komendę żądania statusu ($53) ma strukturę w dużym stopniu zależną od urządzenia. Są to dwa lub cztery bajty, a ich znaczenie dla poszczególnych urządzeń jest opisane poniżej. W pierwszym bajcie statusu obowiązuje jednolity dla wszystkich urządzeń podział na dwie grupy bitów:
 +
 +* bity 0-2 sygnalizują status komunikacji pomiędzy komputerem a urządzeniem
 +* bity 3-7 sygnalizują status wewnętrzny urządzenia
 +
 +====Stacja dysków====
 +
 +<table border=1 cellpadding=4>
 +<tr><td><b>Bajt</b></td><td><b>Znaczenie</b></td></tr>
 +<tr><td>0</td><td>
 +* bit 0 = 1 - wydana ostatnio komenda nie została rozpoznana
 +* bit 1 = 1 - przesłany ostatnio blok danych był błędny (błąd sumy kontrolnej)
 +* bit 2 = 1 - ostatnia operacja nie powiodła się (np. próbowano odczytać wadliwy sektor)
 +* bit 3 = 1 - dyskietka jest zabezpieczona przed zapisem
 +* bit 4 = 1 - kręci się silnik obracający dyskietkę
 +* bit 5 = 1 - sektory 256-bajtowe (128-bajtowe w przeciwnym wypadku)
 +* bit 6 = 0 - zarezerwowany
 +* bit 7 = 1 - praca w średniej gęstości
 +<p>W przypadku interfejsu [[KMK/JŻ]] IDE znaczenie mają tylko bity 3 i 5, reszta jest zawsze wyzerowana.</p>
 +</td></tr>
 +<tr><td>1</td><td><p>Kopia rejestru statusu kontrolera WD 1772 (lub kompatybilnego), wszystkie bity są poddane inwersji.</p>
 +* bit 0 = 1 - BUSY
 +* bit 1 = 1 - DRQ (Data Request)
 +* bit 2 = 1 - Track 0 not found
 +* bit 3 = 1 - CRC error
 +* bit 4 = 1 - Record not found
 +* bit 5 = 1 - Seek complete
 +* bit 6 = 1 - Write protected
 +* bit 7 = 1 - Not ready
 +<p>Interfejs IDE [[KMK/JŻ]] zwraca zamiast tego zawartość rejestru ERROR kontrolera IDE:</p>
 +* bit 0 = 1 - Data Address Mark not found
 +* bit 1 = 1 - Track 0 not found
 +* bit 2 = 1 - Aborted command
 +* bit 3, zarezerwowany
 +* bit 4 = 1 - ID not found
 +* bit 5, zarezerwowany
 +* bit 6 = 1 - ECC error
 +* bit 7 = 1 - Bad sector
 +<p>Podobnie jak powyżej wszystkie bity są poddane inwersji (EOR #$FF).</p>
 +</td></tr>
 +<tr><td>2</td><td>Maksymalny czas oczekiwania na wykonanie komendy (timeout) przewidziany dla operacji dyskowej. Najdłużej trwa formatowanie, zalecaną wartością jest 240.</td></tr>
 +<tr><td>3</td><td>Nie używany.</td></tr>
 +</table>
 +
 +====Drukarka====
 +
 +<table border=1 cellpadding=4>
 +<tr><td><b>Bajt</b></td><td><b>Znaczenie</b></td></tr>
 +<tr><td>0</td><td>
 +* bit 0 = 1 - wydana ostatnio komenda nie została rozpoznana
 +* bit 1 = 1 - przesłany ostatnio blok danych był błędny (błąd sumy kontrolnej)
 +* bit 7 = 1 - drukarka jest programowalna (w drukarkach Atari ten bit jest skasowany)
 +Pozostałe bity są zarezerwowane.</td></tr>
 +<tr><td>1</td><td>DAUX2 przesłanej ostatnio komendy</td></tr>
 +<tr><td>2</td><td>Maksymalny czas oczekiwania na wykonanie komendy (timeout) przewidziany dla tej drukarki</td></tr>
 +<tr><td>3</td><td>Nie używany.</td></tr>
 +</table>
 +
 +====RS-232 ([[850|Atari 850]])====
 +
 +Blok statusu portu RS-232 ma dwa bajty (w pozostałych urządzeniach - cztery).
 +
 +<table border=1 cellpadding=4>
 +<tr><td><b>Bajt</b></td><td><b>Znaczenie</b></td></tr>
 +<tr><td>0</td><td>
 +* bit 0 = 1 - wydana ostatnio komenda nie została rozpoznana
 +* bit 1 = 1 - przesłany ostatnio blok danych był błędny (błąd sumy kontrolnej)
 +* bit 2, zarezerwowany
 +* bit 3, zarezerwowany
 +* bit 4 = 1 - przepełnienie bufora RS-232
 +* bit 5 = 1 - błąd parzystości RS-232
 +* bit 6 = 1 - na porcie RS-232 wystąpił nadmiar bitów (overrun)
 +* bit 7 = 1 - na porcie RS-232 wystąpiło zakłócenie transmisji szeregowej (framing error)
 +</td></tr>
 +<tr><td>1</td><td>
 +* bit 0 = 1 - RCV (czyli RX) ustawione
 +* bit 1, zarezerwowany
 +* bit 2, kopia bitu 3
 +* bit 3 = 1 - CRX (czyli DCD) ustawione
 +* bit 4, kopia bitu 5
 +* bit 5 = 1 - CTS ustawione
 +* bit 6, kopia bitu 7
 +* bit 7 = 1 - DSR ustawione
 +</td></tr>
 +</table>
 +
 +====Magnetofon kasetowy====
 +
 +Przyjmuje się, że magnetofon, jako urządzenie "nieinteligentne", jest zawsze podłączony i gotowy do pracy, a więc nie zachodzi potrzeba sprawdzania jego statusu. W związku z tym funkcja READ STATUS ($53) nie jest dla magnetofonu zaimplementowana.
 +
 +===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").
 +
 +<table border=1 cellpadding=5>
 +<tr><td><b>Bajt</b></td><td><b>Opis</b></td></tr>
 +<tr><td>0</td><td>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.</td></tr>
 +<tr><td>1</td><td>Szybkość przesuwu głowicy ze ścieżki na ścieżkę:
 +* 0 - 30 ms
 +* 1 - 20 ms
 +* 2 - 12 ms
 +* 3 - 6 ms
 +<p>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)</p></td></tr>
 +<tr><td>2</td><td>STARSZY bajt liczby sektorów na ścieżce.</td></tr>
 +<tr><td>3</td><td>MŁODSZY bajt liczby sektorów na ścieżce.</td></tr>
 +<tr><td>4</td><td>Liczba aktywnych stron dyskietki zmniejszona o 1 albo najstarszy bajt liczby sektorów partycji twardego dysku (patrz niżej).</td></tr>
 +<tr><td>5</td><td>
 +* bit 0 - zarezerwowany
 +* bit 1 = 1, dyskietka ośmiocalowa; 5,25 cala w przeciwnym wypadku
 +* bit 2 = 1, gęstość MFM, FM w przeciwnym wypadku
 +* bit 3 = 1, dysk nie ma "stron", a zamiast liczby stron jest podany najstarszy bajt całkowitej liczby sektorów dysku (partycji twardego dysku)
 +<p>Pozostałe bity są zarezerwowane i powinny być wyzerowane.</p></td></tr>
 +<tr><td>6</td><td>STARSZY bajt wielkości sektora (w bajtach)</td></tr>
 +<tr><td>7</td><td>MŁODSZY bajt wielkości sektora (w bajtach)</td></tr>
 +<tr><td>8</td><td><p>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:</p>
 +* bit 0 = 1, sektory fizyczne na ścieżce numerowane są od 0, a nie od 1.
 +* bit 1 = 1, sektory fizyczne 1,2,3 mają pełne rozmiary.
 +* bit 2, zarezerwowany
 +* bit 3, zarezerwowany
 +* bit 4, zarezerwowany
 +* bit 5, zarezerwowany
 +* bit 6 = 0, napęd stacji jest odłączony (wyjęty).
 +* bit 7 = 1, napęd 80-ścieżkowy pracuje w trybie 40-ścieżkowym.
 +<p>W praktyce większość stacji nie ustawia tych bitów zgodnie z powyższym opisem.</p></td></tr>
 +<tr><td>9</td><td>Niewykorzystane, na ogół 0.</td></tr>
 +<tr><td>10</td><td>Niewykorzystane, na ogół 0.</td></tr>
 +<tr><td>11</td><td>Niewykorzystane, na ogół 0.</td></tr>
 +</table>
 +
 +==Protokół transmisji==
 +
 +=== Połączenia równoległe ===
 +
 +Protokół transmisji urządzeń podłączanych do szyny równoległej jest zależny od programu obsługi urządzenia zawartego w jego pamięci ROM. System operacyjny tego nie definiuje.
 +
 +=== Połączenia szeregowe ===
 +
 +Podziału poszczególnych bajtów na bity i wyemitowania ich na złącze szeregowe tudzież przyjmowania pojedynczych bitów i scalania ich w bajty dokonuje sprzętowo układ [[POKEY]] (quod vide).
 +
 +==== Opis przebiegu komunikacji ====
 +Przebieg komunikacji pomiędzy komputerem a urządzeniem jest następujący:
 +
 +1) komputer ustawia linię COMMAND [[gniazdo SIO|portu SIO]];
 +
 +2) komputer formuje czterobajtowy blok komendy, tzw. Command Frame. Command Frame składa się kolejno z (bajt 1) dodanych do siebie wartości DDEVIC i DUNIT, odjąć 1; (bajt 2) wartości DCMND; (bajt 3) wartości DAUX1; (bajt 4) wartości DAUX2;
 +
 +3) komenda jest wysyłana do urządzenia razem z dołączoną na końcu [[suma kontrolna SIO|sumą kontrolną]]; czas pomiędzy ustawieniem linii COMMAND a rozpoczęciem wysyłania komendy musi być nie mniejszy niż 750 usec i nie większy niż 1600 usec.
 +
 +4) komputer kasuje linię COMMAND portu SIO (nie wcześniej niż po 650 usec i nie później niż 950 usec po wysłaniu ostatniego bitu komendy) i czeka na odpowiedź;
 +
 +5) urządzenie przyjmuje komendę; jeśli urządzenie stwierdziło w komendzie błąd sumy kontrolnej, nie reaguje; jeśli komenda jest nierozpoznana, albo nieprawidłowe są jej parametry (np. nie istnieje sektor o podanym numerze), odpowiedzią jest $4E ("N", jak Negative Acknowledge) i na tym transmisja się kończy; jeśli komenda jest urządzeniu znana a parametry prawidłowe, odpowiedzią jest $41 ("A", jak Acknowledge). Urządzenie musi rozpocząć wysyłanie odpowiedzi w czasie od 0 do 16 msec. od skasowania linii COMMAND przez komputer;
 +
 +Dalszy przebieg jest zależny tego, czy dana komenda wymaga przesłania dodatkowego bloku danych do/z urządzenia. Możliwe są 3 sytuacje: brak transmisji danych; odczyt danych z urządzenia; zapis danych do urządzenia.
 +
 +6a) Jeśli komenda nie wymaga transmisji bloku danych, urządzenie podejmuje próbę wykonania operacji; jeśli się to nie uda, wysyła kod $45 ("E", jak Error); w przeciwnym wypadku przesyłany jest kod $43 ("C", jak Complete); na tym transmisja się kończy.
 +
 +6b) jeśli komenda polega na odczycie bloku danych, urządzenie podejmuje próbę wykonania operacji; jeśli się to nie uda (np. nie można odczytać sektora z powodu uszkodzenia nośnika), wysyła kod $45 ("E", jak Error); w przeciwnym wypadku przesyłany jest kod $43 ("C", jak Complete); następnie w obydwu przypadkach urządzenie natychmiast wysyła blok danych zakończony sumą kontrolną i na tym transmisja się kończy.
 +
 +6c) jeśli to jest zapis bloku danych, komputer przesyła blok danych plus sumę kontrolną do urządzenia. Po jego przyjęciu, jeśli blok danych jest poprawny, urządzenie odpowiada kodem $41 ("A") i przystępuje do np. zapisania danych na nośnik. W przeciwnym wypadku, jeśli w nadesłanym bloku danych urządzenie stwierdzi błąd sumy kontrolnej lub inne nieprawidłowości, odpowiada kodem $4E ("N") lub nie odpowiada w ogóle, a blok danych ignoruje (należy tu jednak mieć na względzie, że Atari zasygnalizuje wtedy błąd timeout-u $8A). W następnej fazie urządzenie informuje komputer o wykonaniu kodem "C" lub "E" o znaczeniu jak powyżej, i na tym transmisja się kończy. Przesłanie bloku danych musi rozpocząć się nie wcześniej niż 1000 usec. i nie później niż 1800 usec. po przesłaniu ostatniego bitu potwierdzeniu przyjęcia komendy (pierwszym "A"). Rozpoczęcie przesłania potwierdzenia otrzymania bloku ("A" lub "N") musi nastąpić w czasie od 850 usec. do 16 msec. po przesłaniu ostatniego bitu bloku danych.
 +
 +We wszystkich 3 przypadkach transmisja potwierdzenia końcowego ("C" lub "E") z urządzenia musi rozpocząć się nie wcześniej niż po 250 usec. i nie później niż po 255 sekundach - czyli po 4 minutach i 15 sekundach - od przesłania ostatniego bitu potwierdzenia komendy ("A") (6a, 6b) lub od odebrania ostatniego bitu bloku danych (6c).
 +
 +Konieczność odebrania bloku danych z urządzenia podczas operacji odczytu, nawet po ustaleniu że operacja została wykonana błędnie (kod "E") może tłumaczyć fakt, że po operacji formatowania dysku stacje dysków wysyłają listę błędnych sektorów (rozmiar odbieranego bloku danych ustalany jest w DBYT).
 +
 +==== Schemat wymiany danych ====
 +
 +W fazie oznaczonej jako ''wykonanie'' urządzenie dokonuje niezbędnych czynności (np. stacja dysków wyszukuje żądany sektor na dyskietce i odczytuje go, albo zapisuje), a komputer czeka.
 +
 +Potwierdzenia przesyłane są bez sum kontrolnych.
 +
 +===== Tylko komenda =====
 +
 +* komputer --> komenda 4 B + suma kontrolna --> urządzenie
 +* komputer <-- potwierdzenie 'A' <-- urządzenie
 +* wykonanie
 +* komputer <-- potwierdzenie 'C' <-- urządzenie
 +* koniec
 +
 +===== Odczyt =====
 +
 +* komputer --> komenda 4 B + suma kontrolna --> urządzenie
 +* komputer <-- potwierdzenie 'A' <-- urządzenie
 +* wykonanie
 +* komputer <-- potwierdzenie 'C' <-- urządzenie
 +* komputer <-- blok danych + suma kontrolna <-- urządzenie
 +* koniec
 +
 +===== Zapis =====
 +
 +* komputer --> komenda 4 B + suma kontrolna --> urządzenie
 +* komputer <-- potwierdzenie 'A' <-- urządzenie
 +* komputer --> blok danych + suma kontrolna --> urządzenie
 +* komputer <-- potwierdzenie 'A' <-- urządzenie
 +* wykonanie
 +* komputer <-- potwierdzenie 'C' <-- urządzenie
 +* koniec
 +
 +===== Zapis i odczyt =====
 +
 +* komputer --> komenda 4 B + suma kontrolna --> urządzenie
 +* komputer <-- potwierdzenie 'A' <-- urządzenie
 +* komputer --> blok danych + suma kontrolna --> urządzenie
 +* komputer <-- potwierdzenie 'A' <-- urządzenie
 +* wykonanie
 +* komputer <-- potwierdzenie 'C' <-- urządzenie
 +* komputer <-- blok danych + suma kontrolna <-- urządzenie
 +* koniec
 +
 +====Magnetofon====
 +
 +Powyższe schematy dotyczą wszystkich urządzeń SIO za wyjątkiem magnetofonu. Magnetofon nie zawiera w sobie mikroprocesora, jest urządzeniem "nieinteligentnym". Transmisja jest w całości obsługiwana przez komputer, który wysyła (i przyjmuje) bloki danych, tzw. rekordy, zawierające każdy po 128 bajtów danych, bajt sumy kontrolnej oraz bajt rodzaju rekordu i dwa dodatkowe bajty służące do pomiaru równomierności przesuwu taśmy - łącznie 132 bajty.
 +
 +==Rozszerzenia SIO==
 +
 +===Systemy turbo do stacji dysków===
 +
 +Standardowa 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, [[Systemy Turbo|systemów "turbo"]].
 +
 +===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) oraz 32-bitowe adresowanie sektorów.
 +
 +==Zobacz też==
 +* [http://www.atariarchives.org/dere/ De Re Atari]
 +* [[Obsługa protokołu SIO przez urządzenie peryferyjne]]
 +
 +==Bibliografia==
 +
 +* ''[http://ftp.pigwa.net/stuff/collections/nir_dary_cds/Tech%2520Info/SIOSPECS.PDF Atari Home Computer System: Serial Input Output Interface, User's Handbook]''
 +* Harry B. Stewart, ''[http://www.atarimuseum.com/ahs_archives/archives/pdf/computers/8bits/1200XL/sweet-16_OS.pdf Z800/Sweet 16 Operating System, External Reference Specification]''
 +
 +[[Kategoria:Menu Główne]]
 +[[Kategoria:Programowanie Atari 8-bit]]

Aktualna wersja

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 następnie 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

AdresEtykietaWielkośćZnaczenie
$0300DDEVICBajtIdentyfikator urządzenia (zob. niżej).
$0301DUNITBajtNumer urządzenia; w przypadku stacji dysków numer napędu.
$0302DCMNDBajtKomenda dla urządzenia.
$0303DSTATSBajtPrzed wywołaniem SIO należy ustawić tu rodzaj operacji ($40 odczyt, $80 zapis, $C0 zapis i odczyt, $00 brak transferu danych). Po powrocie z systemu znajduje się tu status operacji (kod błędu).
$0304DBUFADwa bajtyAdres bufora. Przy operacji zapisu i odczytu jednocześnie (DSTATS = $C0) bufor na odczytywane dane znajduje się w tym samym miejscu, co bufor danch przeznaczonych do zapisu.
$0306DTIMLOBajt

Czas oczekiwania na pozytywną odpowiedź urządzenia, tzw. timeout. Oblicza się to jak następuje: wartość DTIMLO mnożona jest przez 64, w wyniku czego otrzymujemy liczbę "ramek" VBL do odczekania. Zwiększenie DTIMLO o jeden powoduje wydłużenie czasu oczekiwania o 1,28 sek. w systemie PAL i o 1,067 sek. w systemie NTSC. Wartość "0" oznacza 256 jednostek.

Typowo ustawia się tu wartość z zakresu od $06 do $08 (zależnie od kaprysu programisty) dla wszystkich operacji oprócz formatowania. Właściwą wartość timeout dla formatowania urządzenie przesyła w bloku statusu, w odpowiedzi na komendę READ STATUS ("S", zob. niżej).

$0307DUNUSEBajtBajt nieużywany, zarezerwowany do przyszłych zastosowań.
$0308DBYTDwa bajtyWielkość bufora; musi być zgodna z wielkością transmitowanego bloku danych. Zero oznacza 64 kilobajty.
$030ADAUX1BajtPierwszy bajt pomocniczy. W operacjach dyskowych młodszy bajt numeru sektora.
$030BDAUX2BajtDrugi bajt pomocniczy. W operacjach dyskowych starszy bajt numeru sektora.

Wykaz urządzeń

Komenda wysyłana do urządzenia formowana jest w strukturze CFB (Command Frame Buffer, $023A) składającej się z:

  • CDEVIC
  • CCMND
  • CAUX1
  • CAUX2

a uzupełnianej na podstawie DCB.

Istnieje pięć urządzeń zdefiniowanych przez Atari. Właściwy identyfikator urządzenia (CDEVIC) 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. Dlatego stację dysków nr 1 można wywołać też jako DDEVIC=$32 i DUNIT=0, liczy się wynik wspomnianego dodawania (CDEVIC). UWAGA: jest to tzw. "nieudokumentowana" cecha procedur szeregowych OS-u, inne urządzenia (jak np. nowe urządzenia) mogą tego nie robić.

DDEVICCDEVICOpis
$31$31-$3Fdyskowa pamięć masowa (stacja dysków, twardy dysk)
$40$40-$43drukarka
$4F$4Fbus master (moduł 1090)
$50$50-$53port szeregowy RS-232C
$60$60magnetofon kasetowy

Przypisanie identyfikatorów do poszczególnych urządzeń jest niezbyt konsekwentne, np. CDEVIC=$31 to stacja dysków numer 1, ale CDEVIC=$41 to drukarka numer 2.

Urządzeniem, które na podanej powyżej liście jest wyjątkowe, jest magnetofon kasetowy. Jest to jedyne "nieinteligentne" urządzenie peryferyjne, to jest nie zawierające własnego procesora. Wszystkie zadania związane z wysyłaniem danych na magnetofon i odbiorem z niego wykonuje system operacyjny komputera. W odróżnieniu od innych urządzeń, magnetofon okupuje tylko identyfikator $60, a wartość DUNIT jest ignorowana - w związku z tym kody urządzeń od $61 do $6F są (na razie) wolne.

Wartości CDEVIC powyżej $7F są zarezerwowane dla pewnych rozszerzeń protokołu SIO, patrz niżej.

Ponieważ identyfikator jest częścią wysyłanej do urządzenia komendy, więc budując własne urządzenie można posłużyć się identyfikatorem spoza powyżej wyszczególnionych:

DDEVICCDEVICOpis
$20$20IDE Plus, SIDE
$45$45Smart Device ( APE Time i URL Submit)
$5A$5AATR 8000
$61$61AtariSIO, DOS2DOS
$70$70Atari ASPI (zob. ASPI)
$71-$74$71-$74SDrive
$71$70SIO2USB [1]
$73$72-$75Sio2SD

Wykazy komend

Blok statusu

Blok statusu przysyłany na komendę żądania statusu ($53) ma strukturę w dużym stopniu zależną od urządzenia. Są to dwa lub cztery bajty, a ich znaczenie dla poszczególnych urządzeń jest opisane poniżej. W pierwszym bajcie statusu obowiązuje jednolity dla wszystkich urządzeń podział na dwie grupy bitów:

  • bity 0-2 sygnalizują status komunikacji pomiędzy komputerem a urządzeniem
  • bity 3-7 sygnalizują status wewnętrzny urządzenia

Stacja dysków

BajtZnaczenie
0
  • bit 0 = 1 - wydana ostatnio komenda nie została rozpoznana
  • bit 1 = 1 - przesłany ostatnio blok danych był błędny (błąd sumy kontrolnej)
  • bit 2 = 1 - ostatnia operacja nie powiodła się (np. próbowano odczytać wadliwy sektor)
  • bit 3 = 1 - dyskietka jest zabezpieczona przed zapisem
  • bit 4 = 1 - kręci się silnik obracający dyskietkę
  • bit 5 = 1 - sektory 256-bajtowe (128-bajtowe w przeciwnym wypadku)
  • bit 6 = 0 - zarezerwowany
  • bit 7 = 1 - praca w średniej gęstości

W przypadku interfejsu KMK/JŻ IDE znaczenie mają tylko bity 3 i 5, reszta jest zawsze wyzerowana.

1

Kopia rejestru statusu kontrolera WD 1772 (lub kompatybilnego), wszystkie bity są poddane inwersji.

  • bit 0 = 1 - BUSY
  • bit 1 = 1 - DRQ (Data Request)
  • bit 2 = 1 - Track 0 not found
  • bit 3 = 1 - CRC error
  • bit 4 = 1 - Record not found
  • bit 5 = 1 - Seek complete
  • bit 6 = 1 - Write protected
  • bit 7 = 1 - Not ready

Interfejs IDE KMK/JŻ zwraca zamiast tego zawartość rejestru ERROR kontrolera IDE:

  • bit 0 = 1 - Data Address Mark not found
  • bit 1 = 1 - Track 0 not found
  • bit 2 = 1 - Aborted command
  • bit 3, zarezerwowany
  • bit 4 = 1 - ID not found
  • bit 5, zarezerwowany
  • bit 6 = 1 - ECC error
  • bit 7 = 1 - Bad sector

Podobnie jak powyżej wszystkie bity są poddane inwersji (EOR #$FF).

2Maksymalny czas oczekiwania na wykonanie komendy (timeout) przewidziany dla operacji dyskowej. Najdłużej trwa formatowanie, zalecaną wartością jest 240.
3Nie używany.

Drukarka

BajtZnaczenie
0
  • bit 0 = 1 - wydana ostatnio komenda nie została rozpoznana
  • bit 1 = 1 - przesłany ostatnio blok danych był błędny (błąd sumy kontrolnej)
  • bit 7 = 1 - drukarka jest programowalna (w drukarkach Atari ten bit jest skasowany)
Pozostałe bity są zarezerwowane.
1DAUX2 przesłanej ostatnio komendy
2Maksymalny czas oczekiwania na wykonanie komendy (timeout) przewidziany dla tej drukarki
3Nie używany.

RS-232 (Atari 850)

Blok statusu portu RS-232 ma dwa bajty (w pozostałych urządzeniach - cztery).

BajtZnaczenie
0
  • bit 0 = 1 - wydana ostatnio komenda nie została rozpoznana
  • bit 1 = 1 - przesłany ostatnio blok danych był błędny (błąd sumy kontrolnej)
  • bit 2, zarezerwowany
  • bit 3, zarezerwowany
  • bit 4 = 1 - przepełnienie bufora RS-232
  • bit 5 = 1 - błąd parzystości RS-232
  • bit 6 = 1 - na porcie RS-232 wystąpił nadmiar bitów (overrun)
  • bit 7 = 1 - na porcie RS-232 wystąpiło zakłócenie transmisji szeregowej (framing error)
1
  • bit 0 = 1 - RCV (czyli RX) ustawione
  • bit 1, zarezerwowany
  • bit 2, kopia bitu 3
  • bit 3 = 1 - CRX (czyli DCD) ustawione
  • bit 4, kopia bitu 5
  • bit 5 = 1 - CTS ustawione
  • bit 6, kopia bitu 7
  • bit 7 = 1 - DSR ustawione

Magnetofon kasetowy

Przyjmuje się, że magnetofon, jako urządzenie "nieinteligentne", jest zawsze podłączony i gotowy do pracy, a więc nie zachodzi potrzeba sprawdzania jego statusu. W związku z tym funkcja READ STATUS ($53) nie jest dla magnetofonu zaimplementowana.

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

BajtOpis
0Liczba ś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.
1Szybkość przesuwu głowicy ze ścieżki na ścieżkę:
  • 0 - 30 ms
  • 1 - 20 ms
  • 2 - 12 ms
  • 3 - 6 ms

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)

2STARSZY bajt liczby sektorów na ścieżce.
3MŁODSZY bajt liczby sektorów na ścieżce.
4Liczba aktywnych stron dyskietki zmniejszona o 1 albo najstarszy bajt liczby sektorów partycji twardego dysku (patrz niżej).
5
  • bit 0 - zarezerwowany
  • bit 1 = 1, dyskietka ośmiocalowa; 5,25 cala w przeciwnym wypadku
  • bit 2 = 1, gęstość MFM, FM w przeciwnym wypadku
  • bit 3 = 1, dysk nie ma "stron", a zamiast liczby stron jest podany najstarszy bajt całkowitej liczby sektorów dysku (partycji twardego dysku)

Pozostałe bity są zarezerwowane i powinny być wyzerowane.

6STARSZY bajt wielkości sektora (w bajtach)
7MŁ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:

  • bit 0 = 1, sektory fizyczne na ścieżce numerowane są od 0, a nie od 1.
  • bit 1 = 1, sektory fizyczne 1,2,3 mają pełne rozmiary.
  • bit 2, zarezerwowany
  • bit 3, zarezerwowany
  • bit 4, zarezerwowany
  • bit 5, zarezerwowany
  • bit 6 = 0, napęd stacji jest odłączony (wyjęty).
  • bit 7 = 1, napęd 80-ścieżkowy pracuje w trybie 40-ścieżkowym.

W praktyce większość stacji nie ustawia tych bitów zgodnie z powyższym opisem.

9Niewykorzystane, na ogół 0.
10Niewykorzystane, na ogół 0.
11Niewykorzystane, na ogół 0.

Protokół transmisji

Połączenia równoległe

Protokół transmisji urządzeń podłączanych do szyny równoległej jest zależny od programu obsługi urządzenia zawartego w jego pamięci ROM. System operacyjny tego nie definiuje.

Połączenia szeregowe

Podziału poszczególnych bajtów na bity i wyemitowania ich na złącze szeregowe tudzież przyjmowania pojedynczych bitów i scalania ich w bajty dokonuje sprzętowo układ POKEY (quod vide).

Opis przebiegu komunikacji

Przebieg komunikacji pomiędzy komputerem a urządzeniem jest następujący:

1) komputer ustawia linię COMMAND portu SIO;

2) komputer formuje czterobajtowy blok komendy, tzw. Command Frame. Command Frame składa się kolejno z (bajt 1) dodanych do siebie wartości DDEVIC i DUNIT, odjąć 1; (bajt 2) wartości DCMND; (bajt 3) wartości DAUX1; (bajt 4) wartości DAUX2;

3) komenda jest wysyłana do urządzenia razem z dołączoną na końcu sumą kontrolną; czas pomiędzy ustawieniem linii COMMAND a rozpoczęciem wysyłania komendy musi być nie mniejszy niż 750 usec i nie większy niż 1600 usec.

4) komputer kasuje linię COMMAND portu SIO (nie wcześniej niż po 650 usec i nie później niż 950 usec po wysłaniu ostatniego bitu komendy) i czeka na odpowiedź;

5) urządzenie przyjmuje komendę; jeśli urządzenie stwierdziło w komendzie błąd sumy kontrolnej, nie reaguje; jeśli komenda jest nierozpoznana, albo nieprawidłowe są jej parametry (np. nie istnieje sektor o podanym numerze), odpowiedzią jest $4E ("N", jak Negative Acknowledge) i na tym transmisja się kończy; jeśli komenda jest urządzeniu znana a parametry prawidłowe, odpowiedzią jest $41 ("A", jak Acknowledge). Urządzenie musi rozpocząć wysyłanie odpowiedzi w czasie od 0 do 16 msec. od skasowania linii COMMAND przez komputer;

Dalszy przebieg jest zależny tego, czy dana komenda wymaga przesłania dodatkowego bloku danych do/z urządzenia. Możliwe są 3 sytuacje: brak transmisji danych; odczyt danych z urządzenia; zapis danych do urządzenia.

6a) Jeśli komenda nie wymaga transmisji bloku danych, urządzenie podejmuje próbę wykonania operacji; jeśli się to nie uda, wysyła kod $45 ("E", jak Error); w przeciwnym wypadku przesyłany jest kod $43 ("C", jak Complete); na tym transmisja się kończy.

6b) jeśli komenda polega na odczycie bloku danych, urządzenie podejmuje próbę wykonania operacji; jeśli się to nie uda (np. nie można odczytać sektora z powodu uszkodzenia nośnika), wysyła kod $45 ("E", jak Error); w przeciwnym wypadku przesyłany jest kod $43 ("C", jak Complete); następnie w obydwu przypadkach urządzenie natychmiast wysyła blok danych zakończony sumą kontrolną i na tym transmisja się kończy.

6c) jeśli to jest zapis bloku danych, komputer przesyła blok danych plus sumę kontrolną do urządzenia. Po jego przyjęciu, jeśli blok danych jest poprawny, urządzenie odpowiada kodem $41 ("A") i przystępuje do np. zapisania danych na nośnik. W przeciwnym wypadku, jeśli w nadesłanym bloku danych urządzenie stwierdzi błąd sumy kontrolnej lub inne nieprawidłowości, odpowiada kodem $4E ("N") lub nie odpowiada w ogóle, a blok danych ignoruje (należy tu jednak mieć na względzie, że Atari zasygnalizuje wtedy błąd timeout-u $8A). W następnej fazie urządzenie informuje komputer o wykonaniu kodem "C" lub "E" o znaczeniu jak powyżej, i na tym transmisja się kończy. Przesłanie bloku danych musi rozpocząć się nie wcześniej niż 1000 usec. i nie później niż 1800 usec. po przesłaniu ostatniego bitu potwierdzeniu przyjęcia komendy (pierwszym "A"). Rozpoczęcie przesłania potwierdzenia otrzymania bloku ("A" lub "N") musi nastąpić w czasie od 850 usec. do 16 msec. po przesłaniu ostatniego bitu bloku danych.

We wszystkich 3 przypadkach transmisja potwierdzenia końcowego ("C" lub "E") z urządzenia musi rozpocząć się nie wcześniej niż po 250 usec. i nie później niż po 255 sekundach - czyli po 4 minutach i 15 sekundach - od przesłania ostatniego bitu potwierdzenia komendy ("A") (6a, 6b) lub od odebrania ostatniego bitu bloku danych (6c).

Konieczność odebrania bloku danych z urządzenia podczas operacji odczytu, nawet po ustaleniu że operacja została wykonana błędnie (kod "E") może tłumaczyć fakt, że po operacji formatowania dysku stacje dysków wysyłają listę błędnych sektorów (rozmiar odbieranego bloku danych ustalany jest w DBYT).

Schemat wymiany danych

W fazie oznaczonej jako wykonanie urządzenie dokonuje niezbędnych czynności (np. stacja dysków wyszukuje żądany sektor na dyskietce i odczytuje go, albo zapisuje), a komputer czeka.

Potwierdzenia przesyłane są bez sum kontrolnych.

Tylko komenda
  • komputer --> komenda 4 B + suma kontrolna --> urządzenie
  • komputer <-- potwierdzenie 'A' <-- urządzenie
  • wykonanie
  • komputer <-- potwierdzenie 'C' <-- urządzenie
  • koniec
Odczyt
  • komputer --> komenda 4 B + suma kontrolna --> urządzenie
  • komputer <-- potwierdzenie 'A' <-- urządzenie
  • wykonanie
  • komputer <-- potwierdzenie 'C' <-- urządzenie
  • komputer <-- blok danych + suma kontrolna <-- urządzenie
  • koniec
Zapis
  • komputer --> komenda 4 B + suma kontrolna --> urządzenie
  • komputer <-- potwierdzenie 'A' <-- urządzenie
  • komputer --> blok danych + suma kontrolna --> urządzenie
  • komputer <-- potwierdzenie 'A' <-- urządzenie
  • wykonanie
  • komputer <-- potwierdzenie 'C' <-- urządzenie
  • koniec
Zapis i odczyt
  • komputer --> komenda 4 B + suma kontrolna --> urządzenie
  • komputer <-- potwierdzenie 'A' <-- urządzenie
  • komputer --> blok danych + suma kontrolna --> urządzenie
  • komputer <-- potwierdzenie 'A' <-- urządzenie
  • wykonanie
  • komputer <-- potwierdzenie 'C' <-- urządzenie
  • komputer <-- blok danych + suma kontrolna <-- urządzenie
  • koniec

Magnetofon

Powyższe schematy dotyczą wszystkich urządzeń SIO za wyjątkiem magnetofonu. Magnetofon nie zawiera w sobie mikroprocesora, jest urządzeniem "nieinteligentnym". Transmisja jest w całości obsługiwana przez komputer, który wysyła (i przyjmuje) bloki danych, tzw. rekordy, zawierające każdy po 128 bajtów danych, bajt sumy kontrolnej oraz bajt rodzaju rekordu i dwa dodatkowe bajty służące do pomiaru równomierności przesuwu taśmy - łącznie 132 bajty.

Rozszerzenia SIO

Systemy turbo do stacji dysków

Standardowa 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".

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) oraz 32-bitowe adresowanie sektorów.

Zobacz też

Bibliografia

Personal tools