SIO
From Atariki
Wersja z dnia 09:44, 10 sie 2008 KMK (Dyskusja | wkład) (→Komendy specyficzne dla poszczególnych urządzeń - reorganizacja) ← Previous diff |
Aktualna wersja Mono (Dyskusja | wkład) (wydzielenie osobnego artykułu o obsłudze protokołu sio) |
||
Linia 5: | Linia 5: | ||
==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=== | ||
Linia 20: | Linia 20: | ||
<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>$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>$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ę bezpośrednio po porcji danych przeznaczonych do zapisu (pod adresem DBUFA + DBYT).</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> | <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 nastepuje: 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>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> | <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> | </td></tr> | ||
Linia 39: | Linia 39: | ||
===Wykaz urządzeń=== | ===Wykaz urządzeń=== | ||
- | Istnieje pięć urządzeń zdefiniowanych przez Atari: | + | 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. | ||
- | * $31: dyskowa pamięć masowa (stacja dysków, twardy dysk) | + | 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ć. |
- | * $40: drukarka | + | |
- | * $4F: bus master (moduł [[1090]]) | + | |
- | * $50: port szeregowy RS-232C | + | |
- | * $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. | + | <table border=1 cellpadding = 5> |
- | + | <tr><td><b>DDEVIC</b></td><td><b>CDEVIC</b></td><td><b>Opis</b></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. | + | <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> | |
- | 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: | + | <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> | |
- | * $5A: [[ATR 8000]] | + | <tr><td>$60</td><td>$60</td><td>magnetofon kasetowy</td></tr> |
- | * $73: [[SIO2SD|Sio2SD]]. | + | |
- | + | ||
- | ===Wykaz komend=== | + | |
- | + | ||
- | ====Podstawowy zestaw komend==== | + | |
- | + | ||
- | Poniższa tabela wyszczególnia podstawowe minimum komend rozpoznawanych przez urządzenia peryferyjne Atari. | + | |
- | + | ||
- | <table border=1 cellpadding=5> | + | |
- | <tr><td><b>Kod</b></td><td><b>Nazwa</b></td><td><b>Urządzenie</b></td><td><b>R/W</b></td><td><b>Ilość danych</b></td><td><b>Opis</b></td></tr> | + | |
- | + | ||
- | <tr><td>$21 (!)</td><td>FORMAT DISK</td><td>$31 (stacja dysków)</td><td>R</td><td>Równa wielkości sektora danych na dysku</td><td>Formatuje dyskietkę w wybranej uprzednio (komendami PERCOM) gęstości, lub w [[Formaty dyskietek|pojedynczej gęstości]] (90k), 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...<br> | + | |
- | Kontroler [[KMK/JŻ IDE]] nie rozpoznaje tej komendy dla bezpieczeństwa danych na dysku (do partycjonowania i "formatowania" dysku służy oddzielny program).</td></tr> | + | |
- | + | ||
- | <tr><td>$50 (P)</td><td>PUT SECTOR</td><td rowspan = 2>$31 i $60 (stacja dysków i magnetofon)</td><td>W</td><td rowspan = 2>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>R</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> | + | |
- | + | ||
- | <tr><td>$53 (S)</td><td>READ STATUS</td><td>Wszystkie oprócz magnetofonu</td><td>R</td><td>Zależna od urządzenia</td><td>Odczytuje z urządzenia blok statusu i zapisuje go pod adresem wskazanym przez DBUFA. Blok statusu dla RS-232 ma wielkość 2 bajtów, dla drukarki i stacji dysków - 4. Typowo komenda ta służy to stwierdzenia, czy urządzenie jest gotowe do pracy. W przypadku magnetofonu obowiązuje założenie, że jest on zawsze podłączony i gotów, nie ma więc potrzeby sprawdzania jego statusu.</td></tr> | + | |
- | + | ||
- | <tr><td rowspan=3>$57 (W)</td><td rowspan=3>WRITE SECTOR</td><td rowspan=3>Wszystkie</td><td rowspan=3>W</td><td rowspan=3>Zależna od urządzenia i trybu pracy.</td><td>To samo, co PUT SECTOR ($50). W przypadku stacji dysków zapis przeprowadzany jest z weryfikacją.</td></tr> | + | |
- | <tr><td>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: | + | |
- | * $4E (N) drukowanie normalne | + | |
- | * $53 (S) druk obrócony o 90 stopni | + | |
- | * $44 (D) druk normalny z podwójną szerokością znaków | + | |
- | </td></tr> | + | |
- | <tr><td>Dla interfejsu [[850|Atari 850]] wielkość bufora wynosi 64 bajty.</td></tr> | + | |
</table> | </table> | ||
- | ====Komendy dodatkowe==== | + | 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. |
- | Rozpoznawane przez urządzenia peryferyjne Atari komendy dodatkowe w stosunku do powyżej wspomnianego niezbędnego minimum. | + | 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. |
- | <table border=1 cellpadding=5> | + | Wartości CDEVIC powyżej $7F są zarezerwowane dla pewnych rozszerzeń protokołu SIO, patrz [[SIO#Rozszerzenia_SIO|niżej]]. |
- | <tr><td><b>Kod</b></td><td><b>Nazwa</b></td><td><b>Urządzenie</b></td><td><b>R/W</b></td><td><b>Ilość danych</b></td><td><b>Opis</b></td></tr> | + | |
- | <tr><td>$22 (")</td><td>FORMAT MEDIUM</td><td rowspan = 2>$31 (stacja dysków)</td><td rowspan = 2>R</td><td>128 bajtów</td><td>Analogicznie do FORMAT DISK ($21), z tym że formatowanie zawsze przeprowadzane jest w [[Formaty dyskietek|gęstości średniej]] (130k). 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).</td></tr> | + | 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: |
- | + | ||
- | <tr><td>$23 (#)</td><td>FORMAT DSDD</td> <td>256 bajtów</td><td>Analogicznie do FORMAT DISK ($21), z tym że formatowanie zawsze przeprowadzane jest w [[Formaty dyskietek|gęstości podwójnej dwustronnej]] (360k). Komenda wprowadzona razem ze stacją [[XF551|Atari XF-551]]. Kontroler [[KMK/JŻ IDE]] nie rozpoznaje tej komendy dla bezpieczeństwa danych na dysku (do partycjonowania i "formatowania" dysku służy oddzielny program).</td></tr> | + | |
- | + | ||
- | <tr><td>$41 (A)</td><td>???</td><td rowspan = 2>$50 (RS-232)</td><td rowspan = 2>-</td><td rowspan = 2>(brak)</td> | + | |
- | <td><p>Komenda aktywująca linie DTR, RTS i XMT (TX) wskazanego portu RS-232 interfejsu [[850|Atari 850]]. Odpowiada komendzie [[CIO]] XIO 34,#i,x,y,"Rn:", przy czym parametry ''x'' i ''y'' wysyłane są odpowiednio jako DAUX1 i DAUX2. Wykonanie komendy nie pociąga za sobą transmisji danych.</p></td></tr> | + | |
- | + | ||
- | <tr><td>$42 (B)</td><td>???</td> | + | |
- | + | ||
- | <td><p>Komenda ustawiająca różne parametry pracy (m.in. szybkość transmisji) wskazanego portu RS-232 interfejsu [[850|Atari 850]]. Odpowiada komendzie [[CIO]] XIO 36,#i,x,y,"Rn:", przy czym parametry ''x'' i ''y'' wysyłane są odpowiednio jako DAUX1 i DAUX2. Wykonanie komendy nie pociąga za sobą transmisji danych.</p></td></tr> | + | |
+ | <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> | ||
- | ====Komendy PERCOM==== | + | ===Wykazy komend=== |
- | Komendy PERCOM noszą nazwę od stacji dysków firmy [[Percom Data Corp.|PERCOM]], w których po raz pierwszy się pojawiły. Nie są rozpoznawane przez stacje dysków firmy Atari (z wyjątkiem [[XF551|Atari XF-551]]), są jednak zaimplementowane we wszystkich rozszerzeniach oraz stacjach innych producentów i stanowią de facto standard. | + | * [[Lista komend SIO według funkcji]] |
- | + | * [[Lista komend SIO według kodów operacyjnych]] | |
- | <table border=1 cellpadding=5> | + | |
- | <tr><td><b>Kod</b></td><td><b>Nazwa</b></td><td><b>Urządzenie</b></td><td><b>R/W</b></td><td><b>Ilość danych</b></td><td><b>Opis</b></td></tr> | + | |
- | <tr><td>$4E (N)</td><td>READ PERCOM</td><td rowspan = 2>$31 (stacja dysków)</td><td>R</td><td rowspan = 2>12 bajtów</td><td>Odczytuje z urządzenia dwunastobajtowy blok danych opisujący jego bieżącą konfigurację, tj. przede wszystkim format znajdującej się w stacji dyskietki.</td></tr> | + | |
- | <tr><td>$4F (O)</td><td>WRITE PERCOM</td> <td>W</td> <td>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ą (o ile jest w stanie ją zrealizować). Kontroler [[KMK/JŻ]] IDE nie rozpoznaje tej komendy dla bezpieczeństwa danych na dysku (do definiowania wielkości partycji służy oddzielny program).</td></tr> | + | |
- | </table> | + | |
- | + | ||
- | ====Komendy specjalne==== | + | |
- | + | ||
- | Komendy wspomagające automatyczną instalację w systemie handlerów podłączonych urządzeń zewnętrznych. | + | |
- | + | ||
- | <table border=1 cellpadding=5> | + | |
- | <tr><td><b>Kod</b></td><td><b>Nazwa</b></td><td><b>Urządzenie</b></td><td><b>R/W</b></td><td><b>Ilość danych</b></td><td><b>Opis</b></td></tr> | + | |
- | + | ||
- | <tr><td>$21 (!)</td><td>SEND RELOCATOR</td> | + | |
- | <td>$50 (RS-232)</td><td>R</td><td>Wg odpowiedzi na komendę POLL ($3F)</td> | + | |
- | <td><p>Jest to komenda uzupełniająca do opisanego niżej POLL ($3F). Powoduje przesłanie przez urządzenie programu odpowiedzialnego za załadowanie (komendą SEND HANDLER) i relokację właściwego handlera. Wszystkie parametry transmisji dla SEND RELOCATOR przesyłane są na komendę POLL ($3F). Program relokatora - po jego załadowaniu - uruchamia się od adresu DBUFA + 6. Przejmuje on na siebie wykonanie reszty operacji, a w wypadku niepowodzenia sygnalizuje błąd przez ustawienie bitu Carry.</p> | + | |
- | + | ||
- | <p>Komendę SEND RELOCATOR rozpoznaje moduł [[850|Atari 850]], a może dotyczyć też innych urządzeń, oprócz stacji dysków (gdzie kod operacyjny $21 oznacza formatowanie dyskietki).</p> | + | |
- | + | ||
- | </td></tr> | + | |
- | + | ||
- | <tr><td>$26 (&)</td><td>SEND HANDLER</td><td>Wg parametrów ustawionych przez relokator przesłany przez SEND RELOCATOR ($21) lub wg odpowiedzi na komendę POLL BUS ($40)</td><td>R</td><td>Wg parametrów ustawionych przez relokator (przesłany przez urządzenie lub rezydujący)</td> | + | |
- | <td><p>Komenda SEND HANDLER służy do załadowania z urządzenia kodu programu obsługi (handlera) tego urządzenia. Może ona działać różnie w zależności od tego, czy transmisja została zainicjowana przez komendę POLL ($3F) czy POLL BUS ($40).</p> | + | |
- | + | ||
- | <p>Komenda POLL ($3F) oznacza starszy protokół transmisji, w którym format strumienia danych przesłanych przez SEND HANDLER zależny jest od programu relokatora załadowanego wcześniej komendą SEND RELOCATOR ($21) i uruchomionego przez komputer.</p> | + | |
- | + | ||
- | <p>Komenda POLL BUS ($40) oznacza nowszy protokół transmisji. Format strumienia danych jest ustalony z góry, a relokator rezyduje w ROM-ie systemu operacyjnego komputera.</p> | + | |
- | + | ||
- | <p>Po otrzymaniu pozytywnej odpowiedzi na POLL BUS ($40) komputer rozpoczyna ładowanie kolejnych, 128-bajtowych rekordów binarnych, w liczbie do 256 (czyli pojedynczy "handler" może mieć maximum 32k). Przesyłany strumień danych musi być w [[ACX|specjalnym formacie]], który zapewnia relokowalność kodu, oraz zawiera podany explicite znacznik końca pliku - wystąpienie błędu przed napotkaniem tego znacznika powoduje przerwanie procedury z [[kody błędów|kodem błędu]] INCOMPLETE EXECUTION.</p> | + | |
- | <p>Ustawienia zmiennych DCB dla komendy SEND HANDLER wyglądają następująco:</p> | + | |
- | * DDEVIC - kod urządzenia przesłany przez urządzenie $4F na komendę POLL BUS. | + | |
- | * DUNIT - zawsze $01 | + | |
- | * DCMND - $26 - SEND HANDLER | + | |
- | * DSTATS - $40 - odczyt | + | |
- | * DTIMLO - 30 sekund | + | |
- | * DBYT - 128 bajtów | + | |
- | * DAUX1 - numer kolejny rekordu danych | + | |
- | * DAUX2 - zawsze 0 | + | |
- | </td></tr> | + | |
- | + | ||
- | <tr><td>$3F (?)</td><td>POLL</td><td>$50 (RS-232)</td><td>R</td><td>12 bajtów</td> | + | |
- | <td><p>Komenda ta, zwana też TYPE 2 POLL, służy do zainicjowania transmisji mającej na celu automatyczne ściągnięcie z urządzenia i zainstalowanie odpowiedniego dlań programu obsługi (handlera). W odpowiedzi urządzenie przesyła 12 bajtów odpowiadających kolejnym wartościom, jakie należy ustawić w bloku DCB celem załadowania kodu wykonywalnego handlera. Jest to starszy protokół transmisji zaprojektowany dla komputerów serii [[400]] i [[800]].</p> | + | |
- | + | ||
- | <p>W module [[850|Atari 850]] odpowiedzią na komendę POLL są wartości, jakie trzeba wstawić do DCB celem wykonania komendy SEND RELOCATOR ($21).</p> | + | |
- | + | ||
- | <p>W celu uniknięcia wielokrotnego załadowania tego samego programu obsługi urządzenie na komendę POLL ($3F) odpowiada tylko raz, potem wykonanie komendy jest zablokowane aż do wyłączenia zasilania.</p> | + | |
- | + | ||
- | </td></tr> | + | |
- | + | ||
- | <tr><td>$40 (@)</td><td>POLL BUS</td><td>$4F (bus master)</td><td>R</td><td>4 bajty</td> | + | |
- | + | ||
- | <td><p>W komputerach serii XL oraz XE komendę tę system operacyjny przesyła do interfejsu szeregowo-równoległego przy każdym zimnym starcie; w pewnych warunkach - ale z nieco innymi parametrami - może też zostać wykonana po zainicjowaniu systemu. Jest to odpowiednik komendy POLL ($3F), jednak protokół transmisji handlera jest zunifikowany i nie wymaga od urządzenia przesyłania relokatora (uniwersalny relokator rezyduje w ROM-ie systemu operacyjnego). Analogicznie do POLL ($3F), komenda POLL BUS jest przeznaczona do zapoczątkowania transmisji mającej na celu automatyczne ściągnięcie z urządzenia i zainstalowanie odpowiedniego dlań programu obsługi (handlera). Zasadniczym adresatem jest tu moduł [[1090]] działający jako bus master.</p> | + | |
- | + | ||
- | <p>Istnieje kilka odmian komendy POLL BUS różniących się parametrami przesyłanymi w DAUX1 i DAUX2:</p> | + | |
- | + | ||
- | * TYPE 3 POLL: DAUX1 = 0 i DAUX2 = 0. | + | |
- | * TYPE 4 POLL: zobacz niżej. | + | |
- | * RESET POLL: DAUX1 = $4F i DAUX2 = $4F ("OO") | + | |
- | * NULL POLL: DAUX1 = $4E i DAUX2 = $4E ("NN") | + | |
- | + | ||
- | <p>Przy zimnym starcie na początku system wysyła RESET POLL. Komenda ta powinna odblokować rozpoznawanie komendy TYPE 3 POLL we wszystkich podłączonych urządzeniach. Na RESET POLL urządzenia, oprócz potwierdzenia wykonania, nie przesyłają żadnej odpowiedzi, a komputer jej nie oczekuje.</p> | + | |
- | + | ||
- | <p>Następnie system wysyła komendę TYPE 3 POLL. 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 (musi to być parzysta wielkość). Jeśli jest to więcej niż dostępna ilość pamięci pomiędzy MEMLO a MEMTOP, system odpowiada przez NULL POLL (podobnie jak w wypadku RESET POLL, urządzenie przesyła tylko potwierdzenie wykonania), a następnie ponownie wysyła TYPE 3 POLL. W przypadku braku pamięci byłaby to pętla nieskończona, ale pojedyncze urządzenie na komendę TYPE 3 POLL może odpowiedzieć tylko raz - pętla jest więc przerywana błędem, który wystąpi po przetestowaniu wszystkich urządzeń zarządzanych przez bus mastera. Ponowna odpowiedź na TYPE 3 POLL jest możliwa dopiero po przesłaniu urządzeniu komendy RESET POLL, inaczej TYPE 3 POLL zostanie zignorowana.</p> | + | |
- | + | ||
- | <p>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.</p> | + | |
- | + | ||
- | <p>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. Po załadowaniu i zainicjowaniu handlera pętla wraca do początku i wykonuje się cyklicznie aż do wystąpienia błędu - czyli do załadowania wszystkich handlerów będących w dyspozycji bus mastera.</p> | + | |
- | + | ||
- | <p>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 <b>zamiast</b> DOS-u.</p> | + | |
- | + | ||
- | <p>Tą samą drogą można już po całkowitym uruchomieniu systemu, podczas pracy, załadować handler urządzenia <b>konkretnie wskazanego</b>. 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).</p> | + | |
- | + | ||
- | <p>Odpytanie bus mastera na okoliczność dysponowania takowym handlerem odbywa się za pomocą komendy TYPE 4 POLL. 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).</p> | + | |
- | + | ||
- | </td></tr> | + | |
- | + | ||
- | </table> | + | |
- | + | ||
- | ====Pozostałe komendy==== | + | |
- | + | ||
- | Komendy zdefiniowane przez Atari, na których temat brak bliższych danych. | + | |
- | + | ||
- | <table border=1 cellpadding=5> | + | |
- | <tr><td><b>Kod</b></td><td><b>Nazwa</b></td><td><b>Urządzenie</b></td><td><b>R/W</b></td><td><b>Ilość danych</b></td><td><b>Opis</b></td></tr> | + | |
- | + | ||
- | <tr><td>$20 ( )</td><td>DOWNLOAD</td><td>???</td><td>W (?)</td><td>???</td><td>Komenda wymieniana przez niektóre źrodła. Szczegóły nieznane.</td></tr> | + | |
- | + | ||
- | <tr><td>$23 (#)</td><td>DIAG1</td><td rowspan = 2>$31 (stacja dysków)</td><td rowspan = 2>R/W</td><td rowspan = 2>128</td> | + | |
- | <td><p>Komenda diagnostyczna stacji [[1050|Atari 1050]]. Wymaga przesłania 128-bajtowego bloku danych, w którym dwa pierwsze bajty decydują o tym, co stacja będzie robić (DAUX1/2 są ignorowane):</p> | + | |
- | * $02 - test przejścia głowicy między ścieżkami | + | |
- | * $03 - przesuw głowicy za pomocą silnika krokowego o jeden krok w przód lub w tył; o kierunku decyduje następny bajt, wartość dodatnia (np. $01) powoduje przesuw w przód - czyli w kierunku ścieżki 39 - a wartość ujemna (np. $FF) przesuw wstecz, czyli w kierunku ścieżki 0. "Krok" silnika krokowego w tym wypadku to połowa odległości między ścieżkami, żeby więc tą komendą przesunąć głowicę na sąsiednią ścieżkę, trzeba zrobić to dwa razy. Uwaga: możliwe jest cofnięcie głowicy wstecz od ścieżki 0 (na tzw. ścieżkę -1). | + | |
- | * $04 - test zapisu i odczytu dyskietki; formatuje znajdującą się w stacji dyskietkę w średniej gęstości. | + | |
- | * $05 - przesuw główicy do ścieżki o numerze podanym w następnym bajcie. | + | |
- | <p>'''UWAGA: kod operacyjny ($23) jest taki sam, jak kod komendy formatowania w stacji [[XF551|Atari XF-551]] ora [[LDW Super 2000]] i [[CA-2001]] z załadowanym [[Synchromesh]]em!'''</p></td></tr> | + | |
- | <tr><td>$24 ($)</td><td>DIAG2</td> | + | |
- | <td><p>Komenda diagnostyczna stacji [[1050]], służy do pomiaru prędkości obrotowej dyskietki. W zależności od wartości dwóch pierwszych bajtów przesłanego bloku danych ($00, $00 lub $00, $01) stacja przesyła czas jednego obrotu dyskietki lub wartość prędkości obrotowej w obrotach na minutę.</p></td></tr> | + | |
- | + | ||
- | <tr><td>$51 (Q)</td><td>READ SPIN</td> | + | |
- | <td rowspan=3>$31 (stacja dysków)</td> | + | |
- | <td rowspan=2>R (?)</td> | + | |
- | <td rowspan=2>?</td> | + | |
- | <td rowspan=3>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.</td></tr> | + | |
- | + | ||
- | <tr><td>$54 (T)</td><td>READ ADDRESS</td></tr> | + | |
- | <tr><td>$55 (U)</td><td>MOTOR ON</td> <td>-</td><td>(brak)</td></tr> | + | |
- | + | ||
- | <tr><td>$56 (V)</td><td>VERIFY SECTOR</td><td>$31 (stacja dysków)</td><td>-</td><td>(brak)</td> | + | |
- | <td><p>Stacja odczytuje sektor wskazany przez DAUX1/2 i zwraca komputerowi informację, czy da się on odczytać bez błędów. Dane zawarte w sektorze nie są transmitowane do komputera. Komenda ta występuje w dokumentacji SIO sporządzonej przez Atari, ale żadna ze stacji marki Atari jej nie rozpoznaje.</p></td></tr> | + | |
- | + | ||
- | <tr><td>$58 (X)</td><td>???</td><td>$50 (RS-232)</td><td>R</td><td>9 bajtów</td> | + | |
- | <td><p>Interfejs [[850|Atari 850]] w odpowiedzi na tę komendę zwraca następującą sekwencję liczb: $A0, $A0, $0B, $A0, $A0, $A0, $0B, $A0, $78. Pierwsze cztery pary stanowią zapewne jakieś parametry czterech portów RS-232 modułu [[850]], ostatnia natomiast odnosi się do portu Centronics.</p></td></tr> | + | |
- | </table> | + | |
- | + | ||
- | ==== Komendy specyficzne dla poszczególnych urządzeń ==== | + | |
- | + | ||
- | ===== ATR 8000 ===== | + | |
- | + | ||
- | <table border=1 cellpadding=5> | + | |
- | <tr><td><b>Kod</b></td><td><b>Nazwa</b></td><td><b>Urządzenie</b></td><td><b>R/W</b></td><td><b>Ilość danych</b></td><td><b>Opis</b></td></tr> | + | |
- | <tr><td>$47 (G)</td><td>GO TO</td><td>$5A ([[ATR 8000]])</td><td>-</td><td>0</td><td>Komenda pozwala na wywoływanie funkcji zdefiniowanych w ROM-ie modułu [[ATR 8000]] (q.v.).</td></tr> | + | |
- | </table> | + | |
- | + | ||
- | ===== Indus GT/LDW Super 2000/CA-2001 ===== | + | |
- | + | ||
- | <table border=1 cellpadding=5> | + | |
- | <tr><td><b>Kod</b></td><td><b>Nazwa</b></td><td><b>Urządzenie</b></td><td><b>R/W</b></td><td><b>Ilość danych</b></td><td><b>Opis</b></td></tr> | + | |
- | <tr><td>$23 (#)</td><td>FORMAT SKEWED</td><td>$31</td><td>R</td><td>Równa wielkości sektora danych na dysku</td><td><p>Komenda formatowania z szybkim przeplotem w stacjach [[Indus GT]], [[LDW Super 2000]] oraz [[CA-2001]] z załadowanym [[Synchromesh]]em.</p> | + | |
- | <p>Kod operacyjny jest taki sam, jak komendy formatowania w gęstości [[DSDD]] dla stacji [[XF551]] oraz jednej z komend diagnostycznych w [[1050]]. | + | |
- | </p> | + | |
- | </td></tr> | + | |
- | <tr><td>$58 (X)</td><td>DOWNLOAD/EXECUTE</td><td>$31</td><td>R/W</td><td>Różna</td><td>Komenda zaimplementowana w stacjach [[LDW Super 2000]] i [[CA-2001]], pozwalająca na przesyłanie do stacji programów użytkownika i uruchamianie ich. Szczegóły: patrz [[Programowanie stacji LDW Super 2000 i CA-2001]].</td></tr> | + | |
- | </table> | + | |
- | + | ||
- | ===== Happy Warp ===== | + | |
- | + | ||
- | <table border=1 cellpadding=5> | + | |
- | <tr><td><b>Kod</b></td><td><b>Nazwa</b></td><td><b>Urządzenie</b></td><td><b>R/W</b></td><td><b>Ilość danych</b></td><td><b>Opis</b></td></tr> | + | |
- | <tr><td>$48 (H)</td><td>HAPPY CONFIG</td><td>$31</td><td>-</td><td>0 bajtów</td><td> Stacje z rozszerzeniem [[Happy Warp]], wskutek błędu w ROM-ie stacji, '''wymagają''' przesłania tej komendy do poprawnej obsługi zapisu w szybkiej transmisji. Wartość DAUX1/2 trzeba przy tym ustawić na $0020.</td></tr> | + | |
- | </table> | + | |
- | + | ||
- | ===== TOMS Multi Drive ===== | + | |
- | + | ||
- | <table border=1 cellpadding=5> | + | |
- | <tr><td><b>Kod</b></td><td><b>Nazwa</b></td><td><b>Urządzenie</b></td><td><b>R/W</b></td><td><b>Ilość danych</b></td><td><b>Opis</b></td></tr> | + | |
- | <tr><td>$49 (I)</td><td>INDEX FORMATTING</td><td>$31</td><td>R</td><td>Zależnie od wybranej gęstości</td><td>W stacjach [[TOMS Multi Drive]] komenda ta działa tak samo, jak zwykłe formatowanie ($21), z tym wyjątkiem, że do oznaczenia początku ścieżki stacja używa otworu indeksowego (normalnie w stacjach Atari ścieżka zaczyna się tam, gdzie akurat wypadnie). Służy to głównie do zabezpieczania programów przez tzw. synchroniczne sektory. </td></tr> | + | |
- | </table> | + | |
- | + | ||
- | ===== US Doubler ===== | + | |
- | + | ||
- | <table border=1 cellpadding=5> | + | |
- | <tr><td><b>Kod</b></td><td><b>Nazwa</b></td><td><b>Urządzenie</b></td><td><b>R/W</b></td><td><b>Ilość danych</b></td><td><b>Opis</b></td></tr> | + | |
- | <tr><td>$3F (?)</td><td>SEND HIGH SPEED INDEX</td><td>$31</td><td>R</td><td>1 bajt</td><td>Stacje kompatybilne z [[US Doubler]] w odpowiedzi na tę komendę przesyłają wartość rejestru POKEY-a służącą do ustawienia częstotliwości nośnej dla przyspieszonej transmisji.</td></tr> | + | |
- | <tr><td>$66 (f)</td><td>CUSTOM FORMAT</td><td>$31</td><td>W</td><td>128 bajtów</td><td>Komenda formatowania z zadanym przeplotem zaimplementowana w stacjach [[US Doubler]]. Wysyłane 128 bajtów określa: | + | |
- | * w pierwszych 12 bajtach: zadaną gęstość, tak jak w komendzie WRITE PERCOM | + | |
- | * następne 18 lub 26 bajtów to fizyczne numery sektorów na ścieżce w zadanej kolejności, licząc od 1. | + | |
- | <p>Przykładowe przeploty podaje hasło [[Przeplot]].</p> | + | |
- | </td></tr> | + | |
- | </table> | + | |
- | + | ||
- | ===== Speedy 1050 ===== | + | |
- | + | ||
- | <table border=1 cellpadding=5> | + | |
- | <tr><td><b>Kod</b></td><td><b>Nazwa</b></td><td><b>Urządzenie</b></td><td><b>R/W</b></td><td><b>Ilość danych</b></td><td><b>Opis</b></td></tr> | + | |
- | + | ||
- | <tr><td>$20 ( )</td><td>AUTOMATIC FORMATTING</td><td>$31</td><td>R</td><td>0 bajtów</td><td>[[Speedy 1050]] w odpowiedni na tę komendę formatuje dyskietkę w zadanej gęstości (DAUX1 = $00 pojedyncza, $20 podwójna, $80 średnia) i, o ile konfiguracja stacji tego nie zabrania, zapisuje bootsektory i [[VTOC]] zgodne z [[DOS 2.0]] lub (w średniej gęstości) [[DOS 2.5]].</td></tr> | + | |
- | <tr><td>$41 (A)</td><td>REGISTER COMMAND</td><td>$31</td><td>W</td><td>3 bajty</td><td>W stacjach [[Speedy 1050]] komenda powoduje zarejestrowanie komendy uzytkownika. Dane powinny zawierać kolejno: | + | |
- | * kod komendy | + | |
- | * młodszy bajt adresu w pamięci stacji, gdzie znajduje się podprogram obsługi | + | |
- | * starszy bajt tego adresu | + | |
- | <p>Jeśli dana komenda jest już jakoś przypisana, to przypisanie zostanie zmienione. Gdy adres ma wartość $0000, komenda zostanie wykasowana z pamięci stacji.</p> | + | |
- | </td></tr> | + | |
- | <tr><td>$44 (D)</td><td>CONFIGURE DISPLAY</td><td>$31</td><td>-</td><td>0 bajtów</td><td>Konfiguracja wyświetlacza stacji [[Speedy 1050]]. DAUX2 powinien być wyzerowany, bity DAUX1 mają znaczenie jak następuje (gdy = 1): | + | |
- | * bit 7: wyświetlanie kodów błędów na wyświetlaczu stacji | + | |
- | * bit 6: wyświetlanie numeru ścieżki w kodzie szesnastkowym | + | |
- | * bit 5: formatowanie bez weryfikacji | + | |
- | * bit 4: zablokowanie zapisu struktury logicznej dyskietki po komendzie $20 | + | |
- | * bit 3: niewyłączanie silnika po komendzie $51 | + | |
- | * bit 2: nieużywany | + | |
- | * bit 1: nieużywany | + | |
- | * bit 0: sygnał dźwiękowy w wypadku błędu | + | |
- | </td></tr> | + | |
- | <tr><td>$4B (K)</td><td>CONFIGURE DRIVE</td><td>$31</td><td>-</td><td>0 bajtów</td><td>Konfiguracja stacji [[Speedy 1050]]. DAUX2 powinien być wyzerowany, bity DAUX1 mają znaczenie jak następuje (gdy = 1): | + | |
- | * bit 7: zapis i odczyt dyskietki bez buforowania (0 po zmianie dyskietki) | + | |
- | * bit 6: zapis i odczyt ścieżki bez buforowania (0 po zmianie ścieżki) | + | |
- | * bit 5: nieużywany | + | |
- | * bit 4: nieużywany | + | |
- | * bit 3: wyłączenie buforowania ścieżek | + | |
- | * bit 2: wyłączenie weryfikacji dla komendy $57 (W) | + | |
- | * bit 1: zapis sektora z pominięciem buforowania | + | |
- | * bit 0: odczyt sektora z pominięciem buforowania | + | |
- | </td></tr> | + | |
- | <tr><td>$4C (L)</td><td>JUMP, NO ACKNOWLEDGE</td><td>$31</td><td>-</td><td>0 bajtów</td><td>W stacjach [[Speedy 1050]] wywołanie wewnętrznej procedury ROM-u stacji spod adresu przekazanego w DAUX1/2 (młodszy/starszy). Potwierdzenie wykonania rozkazu musi przesłać wywoływany podprogram.</td></tr> | + | |
- | <tr><td>$4D (M)</td><td>JUMP WITH ACKNOWLEDGE</td><td>$31</td><td>-</td><td>0 bajtów</td><td>W stacjach [[Speedy 1050]] to samo, to $4C, ale potwierdzenie rozkazu jest przesyłane automatycznie.</td></tr> | + | |
- | <tr><td>$51 (Q)</td><td>FLUSH</td><td>$31</td><td>-</td><td>0 bajtów</td><td>W stacjach [[Speedy 1050]] komenda ta powoduje natychmiastowy zapis zawartości bufora zapisu na dyskietkę i zatrzymanie silnika (normalnie stacja czeka z tym ok. 2 sekund po transmisji sektora).</td></tr> | + | |
- | <tr><td>$60 (`)</td><td>WRITE TRACK</td><td>$31</td><td>W</td><td>Liczba sektorów na ścieżce razy liczba bajtów w sektorze</td><td>W stacjach [[Speedy 1050]] zapis na dyskietkę całej ścieżki od numeru sektora wskazanego bajtami DAUX1/2. | + | |
- | </td></tr> | + | |
- | <tr><td>$62 (b)</td><td>READ TRACK</td><td>$31</td><td>R</td><td>Liczba sektorów na ścieżce razy liczba bajtów w sektorze</td><td>W stacjach [[Speedy 1050]] odczyt z dyskietki całej ścieżki od numeru sektora wskazanego bajtami DAUX1/2. | + | |
- | </td></tr> | + | |
- | <tr><td>$68 (h)</td><td>SIO LEN</td><td>$31</td><td>R</td><td>2 bajty</td><td>W stacjach [[Speedy 1050]] komenda powoduje przesłanie dwóch bajtów określających wielkość procedury SIO, którą mozna od stacji uzyskać komendą $69. | + | |
- | </td></tr> | + | |
- | <tr><td>$69 (i)</td><td>SEND SIO</td><td>$31</td><td>R</td><td>Wynik komendy $68</td><td>W stacjach [[Speedy 1050]] komenda powoduje przesłanie programu szybkiej transmisji SIO. Bajty DBYT powinny być ustawione na wartość zwróconą przez komendę $68. DAUX1/2 to adres w pamięci Atari, gdzie procedura ma zostać załadowana (stacja dokonuje relokacji kodu pod ten adres przed wysłaniem go do komputera). | + | |
- | </td></tr> | + | |
- | </table> | + | |
===Blok statusu=== | ===Blok statusu=== | ||
Linia 333: | Linia 104: | ||
<p>W przypadku interfejsu [[KMK/JŻ]] IDE znaczenie mają tylko bity 3 i 5, reszta jest zawsze wyzerowana.</p> | <p>W przypadku interfejsu [[KMK/JŻ]] IDE znaczenie mają tylko bity 3 i 5, reszta jest zawsze wyzerowana.</p> | ||
</td></tr> | </td></tr> | ||
- | <tr><td>1</td><td><p>Bajt statusu kontrolera WD 1772, wszystkie bity są poddane inwersji.</p> | + | <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 0 = 1 - BUSY | ||
* bit 1 = 1 - DRQ (Data Request) | * bit 1 = 1 - DRQ (Data Request) | ||
Linia 418: | Linia 189: | ||
<tr><td>2</td><td>STARSZY bajt liczby sektorów na ścieżce.</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>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 nastarszy bajt liczby sektorów partycji twardego dysku (patrz niżej).</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> | <tr><td>5</td><td> | ||
* bit 0 - zarezerwowany | * bit 0 - zarezerwowany | ||
Linia 428: | Linia 199: | ||
<tr><td>7</td><td>MŁODSZY 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> | <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 na ścieżce numerowane są od 0, a nie od 1. | + | * bit 0 = 1, sektory fizyczne na ścieżce numerowane są od 0, a nie od 1. |
- | * bit 1 = 1, sektory logiczne 1,2,3 mają pełne rozmiary. | + | * bit 1 = 1, sektory fizyczne 1,2,3 mają pełne rozmiary. |
* bit 2, zarezerwowany | * bit 2, zarezerwowany | ||
* bit 3, zarezerwowany | * bit 3, zarezerwowany | ||
Linia 435: | Linia 206: | ||
* bit 5, zarezerwowany | * bit 5, zarezerwowany | ||
* bit 6 = 0, napęd stacji jest odłączony (wyjęty). | * bit 6 = 0, napęd stacji jest odłączony (wyjęty). | ||
- | * bit 7 = 1, napęd 80-ściezkowy pracuje w trybie 40-ścieżkowym. | + | * 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> | <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>9</td><td>Niewykorzystane, na ogół 0.</td></tr> | ||
Linia 452: | Linia 223: | ||
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). | 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: | Przebieg komunikacji pomiędzy komputerem a urządzeniem jest następujący: | ||
Linia 458: | Linia 230: | ||
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; | 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 wysłaniem komendy musi być nie mniejszy niż 750 usec i nie większy niż 1600 usec. | + | 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 komendy) i czeka na odpowiedź; | + | 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). Odpowiedź urządzenia musi nastąpić w czasie od 0 do 16 msec. od skasowania linii COMMAND przez komputer; | + | 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; |
- | 6) jeśli komenda jest wykonalna i jest to odczyt 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) i na tym transmisja się kończy; w przeciwnym wypadku przesyłany jest kod $43 ("C", jak Complete), a następnie blok danych zakończony sumą kontrolną i na tym transmisja się kończy; po przesłaniu potwierdzenia ("C") blok danych po musi nadejść nie wcześniej niż w ciągu 1000 usec. i nie później niż w ciągu 1800 usec.; | + | 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. |
- | 7) jeśli to jest zapis danych, komputer przesyła blok danych plus sumę kontrolną do urządzenia. Po jego przyjęciu i stwierdzeniu poprawności urządzenie odpowiada kodem $41 ("A") i przystępuje do np. zapisania danych na nośnik. Po zapisie urządzenie informuje komputer kodem "C" lub "E" o znaczeniu jak powyżej, i na tym transmisja się kończy. Przesłanie danych po potwierdzeniu przyjęcia komendy (pierwszym "A") musi nastąpić nie wcześniej niż w ciągu 1000 usec. i nie później niż w ciągu 1800 usec. Przesłanie potwierdzenia końcowego ("C" lub "E") musi nastąpić w czasie od 850 usec. do 16 msec. po przesłaniu bloku danych. | + | 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. |
- | Ogólnie potwierdzenie końcowe ("C" lub "E") musi nadejść z urządzenia nie wcześniej niż po 250 usec. i nie później niż po 255 sekundach - czyli po 4 minutach i 15 sekundach - od nadesłania potwierdzenia komendy ("A"). | + | 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. |
- | Ogólnie schemat wymiany danych przy odczycie jest następujący: | + | 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. |
- | * komputer --> komenda 4 B + CRC --> urządzenie | + | 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 | * komputer <-- potwierdzenie 'A' <-- urządzenie | ||
* wykonanie | * wykonanie | ||
* komputer <-- potwierdzenie 'C' <-- urządzenie | * komputer <-- potwierdzenie 'C' <-- urządzenie | ||
- | * komputer <-- blok danych + CRC <-- urządzenie | + | * koniec |
- | * koniec. | + | |
- | Natomiast zapis wygląda tak: | + | ===== Odczyt ===== |
- | * komputer --> komenda 4 B + CRC --> urządzenie | + | * komputer --> komenda 4 B + suma kontrolna --> urządzenie |
* komputer <-- potwierdzenie 'A' <-- urządzenie | * komputer <-- potwierdzenie 'A' <-- urządzenie | ||
- | * komputer --> blok danych + CRC --> 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 | * komputer <-- potwierdzenie 'A' <-- urządzenie | ||
* wykonanie | * wykonanie | ||
Linia 489: | Linia 281: | ||
* koniec | * koniec | ||
- | 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. | + | ===== Zapis i odczyt ===== |
- | Potwierdzenia przesyłane są bez sum kontrolnych (CRC). | + | * 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==== | ====Magnetofon==== | ||
- | Opisany schemat dotyczy 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, sumę kontrolną oraz dwa dodatkowe bajty służące do pomiaru równomierności przesuwu taśmy. | + | 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== | ==Rozszerzenia SIO== | ||
Linia 513: | Linia 312: | ||
==Zobacz też== | ==Zobacz też== | ||
* [http://www.atariarchives.org/dere/ De Re Atari] | * [http://www.atariarchives.org/dere/ De Re Atari] | ||
+ | * [[Obsługa protokołu SIO przez urządzenie peryferyjne]] | ||
==Bibliografia== | ==Bibliografia== | ||
- | * ''Atari Home Computer System: Serial Input Output Interface, User's Handbook'' | + | * ''[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, ''Z800/Sweet 16 Operating System, External Reference Specification'' | + | * 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:Menu Główne]] | ||
[[Kategoria:Programowanie Atari 8-bit]] | [[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
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, $C0 zapis i odczyt, $00 brak transferu danych). Po powrocie z systemu znajduje się tu status operacji (kod błędu). |
$0304 | DBUFA | Dwa bajty | 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. |
$0306 | DTIMLO | Bajt |
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). |
$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. Zero oznacza 64 kilobajty. |
$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ń
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ć.
DDEVIC | CDEVIC | Opis |
$31 | $31-$3F | dyskowa pamięć masowa (stacja dysków, twardy dysk) |
$40 | $40-$43 | drukarka |
$4F | $4F | bus master (moduł 1090) |
$50 | $50-$53 | port szeregowy RS-232C |
$60 | $60 | magnetofon 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:
DDEVIC | CDEVIC | Opis |
$20 | $20 | IDE Plus, SIDE |
$45 | $45 | Smart Device ( APE Time i URL Submit) |
$5A | $5A | ATR 8000 |
$61 | $61 | AtariSIO, DOS2DOS |
$70 | $70 | Atari ASPI (zob. ASPI) |
$71-$74 | $71-$74 | SDrive |
$71 | $70 | SIO2USB [1] |
$73 | $72-$75 | Sio2SD |
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
Bajt | Znaczenie |
0 |
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.
Interfejs IDE KMK/JŻ zwraca zamiast tego zawartość rejestru ERROR kontrolera IDE:
Podobnie jak powyżej wszystkie bity są poddane inwersji (EOR #$FF). |
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. |
Drukarka
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. |
RS-232 (Atari 850)
Blok statusu portu RS-232 ma dwa bajty (w pozostałych urządzeniach - cztery).
Bajt | Znaczenie |
0 |
|
1 |
|
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").
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 najstarszy bajt liczby sektorów partycji twardego dysku (patrz niżej). |
5 |
Pozostałe bity są zarezerwowane i powinny być wyzerowane. |
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:
W praktyce większość stacji nie ustawia tych bitów zgodnie z powyższym opisem. |
9 | Niewykorzystane, na ogół 0. |
10 | Niewykorzystane, na ogół 0. |
11 | Niewykorzystane, 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.