SIO
From Atariki
Wersja z dnia 12:03, 3 gru 2005 KMK (Dyskusja | wkład) (→Magnetofon) ← Previous diff |
Wersja z dnia 09:17, 4 gru 2005 KMK (Dyskusja | wkład) (→Protokół transmisji) Next diff → |
||
Linia 366: | Linia 366: | ||
=== Połączenia szeregowe === | === Połączenia szeregowe === | ||
- | Protokół transmisji urządzeń podłączonych do szyny szeregowej jest zdefiniowany następująco: | + | Protokół transmisji szeregowej uzależniony jest od układu [[POKEY#Transmisja szeregowa|POKEY]]. |
- | + | ||
- | * 1 bit startu | + | |
- | * osiem bitów danych | + | |
- | * brak kontroli parzystości | + | |
- | * 1 bit stopu | + | |
- | * 19200 bitów na sekundę | + | |
- | + | ||
- | Dane transmitowane są w kolejności od najmłodszego bitu. Szybkość transmisji 19200 bitów na sekundę nie dotyczy magnetofonu kasetowego, gdzie określona jest na 600 bitów na sekundę. | + | |
- | + | ||
- | Przebieg komunikacji pomiędzy komputerem i 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 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. | + | |
- | + | ||
- | 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ź; | + | |
- | + | ||
- | 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 numere), 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; | + | |
- | + | ||
- | 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.; | + | |
- | + | ||
- | 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 ("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. | + | |
- | + | ||
- | 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"). | + | |
- | + | ||
- | Ogólnie schemat wymiany danych przy odczycie jest następujący: | + | |
- | + | ||
- | * komputer --> komenda 4 B + CRC --> urządzenie | + | |
- | * komputer <-- potwierdzenie 'A' <-- urządzenie | + | |
- | * wykonanie | + | |
- | * komputer <-- potwierdzenie 'C' <-- urządzenie | + | |
- | * komputer <-- blok danych + CRC <-- urządzenie | + | |
- | * koniec. | + | |
- | + | ||
- | Natomiast zapis wygląda tak: | + | |
- | + | ||
- | * komputer --> komenda 4 B + CRC --> urządzenie | + | |
- | * komputer <-- potwierdzenie 'A' <-- urządzenie | + | |
- | * komputer --> blok danych + CRC --> urządzenie | + | |
- | * komputer <-- potwierdzenie 'A' <-- urządzenie | + | |
- | * wykonanie | + | |
- | * komputer <-- potwierdzenie 'C' <-- urządzenie | + | |
- | * 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. | + | |
- | + | ||
- | Potwierdzenia przesyłane są bez sum kontrolnych (CRC). | + | |
- | + | ||
- | ===Układ POKEY a transmisja szeregowa=== | + | |
- | + | ||
- | Transmisja szeregowa jest wspomagana przez układ [[POKEY]]. Działa on jako UART, przejmując na siebie podział bajtów, wpisanych przez system do [[Rejestry POKEY-a#SEROUT|rejestrze wyjścia szeregowego (SEROUT)]], na pojedyncze bity i wyemitowanie ich na złącze szeregowe z zaprogramowaną częstotliwością, lub scalenie napływających z urządzenia bitów w bajt i przekazanie go w [[Rejestry POKEY-a#SERIN|rejestrze wejścia szeregowego (SERIN)]]. | + | |
- | + | ||
- | Szybkość transmisji programowana jest przy użyciu połączonych w parę dzielników 3 i 4 (AUDF3 i AUDF4), do których doprowadza się sygnał o częstotliwości głównego zegara systemu, czyli 1773446,25 Hz w systemie PAL albo 1789772,5 Hz w systemie NTSC. Szybkość tę możemy obliczyć według następującego wzoru: | + | |
- | + | ||
- | baud = (F/2)/(R+7) | + | |
- | + | ||
- | gdzie F to wspomniana wyżej częstotliwość bazowa, a R - wartość wstawiana do rejestru układu [[POKEY]]. Żądaną wartość licznika dla znanej prędkości możemy obliczyć po przekształceniu tego wzoru: | + | |
- | + | ||
- | R = ((F/2)/baud)-7 | + | |
- | + | ||
- | Szukana wartość to R po zaokrągleniu do najbliższej całkowitej. | + | |
- | + | ||
- | Normalnie ustawianą przez system operacyjny wartością R jest 40. Teoretycznie ma to odpowiadać szybkości 19200 bitów na sekundę, z podanego wzoru wynika jednak, że w rzeczywistości jest to 18866,45 bps w systemie PAL oraz 19040 bps w systemie NTSC. W praktyce szybkość transmisji nieprzyspieszanej może wahać się w zakresie od 17734,46 bps do 20152,8 bps (19200 bps +/- 5%; odpowiada to wartościom dzielnika [[POKEY]]-a z zakresu od 43 do 37, w systemie PAL). | + | |
- | + | ||
- | Możliwości układu [[POKEY]] nie kończą się jednak na szybkości 20 kbps. Niektóre możliwe do wygenerowania szybkości transmisji przedstawia poniższa tabela: | + | |
- | + | ||
- | <table border=1 cellpadding=5> | + | |
- | <tr><td><b>R</b></td><td><b>bps<br>(PAL / NTSC)</b></td><td><b>Uwagi</b></td></tr> | + | |
- | + | ||
- | <tr><td>0</td><td>126674,7 / 127840,9</td><td>Szybkość trudna do praktycznego użycia ze względu na zakłócenia powodowane przez układ [[ANTIC]] przy generowaniu obrazu.</td></tr> | + | |
- | <tr><td>1</td><td>110840,4 / 111860,8</td><td>j/w. Jest to najbliższy (odchyłka <5%) odpowiednik "standardowej" szybkości 115,2 kbps (6x19200).</td></tr> | + | |
- | <tr><td>2</td><td>98524,8 / 99431,8</td><td>Maksymalna praktycznie użyteczna szybkość transmisji szeregowej ze stacją dysków</td></tr> | + | |
- | <tr><td>3</td><td>88672,3 / 89488,6</td><td> </td></tr> | + | |
- | <tr><td>4</td><td>80611,2 / 81353,3</td><td>Szybkość opcjonalna stacji [[XFD-602]]</td></tr> | + | |
- | <tr><td>5</td><td>73893,6 / 74573,8</td><td>Najbliższy (odchyłka <5%) odpowiednik "standardowej" szybkości 76800 bps (4x19200).</td></tr> | + | |
- | <tr><td>6</td><td>68209,5 / 68837,4</td><td>Szybkość stacji [[LDW Super 2000]], [[Top Drive 1050]], [[TOMS Turbo]], [[TOMS Multi]], [[TOMS 710]], [[TOMS 720]], [[XFD-601]]/602 itd., krótko mówiąc, najpopularniejsze "turbo" do szeregowej stacji dysków</td></tr> | + | |
- | <tr><td>7</td><td>63337,3 / 63920,4</td><td> </td></tr> | + | |
- | <tr><td>8</td><td>59114,9 / 59659</td><td>Najbliższy (odchyłka <5%) odpowiednik "standardowej" szybkości 57600 bps (3x19200). </td></tr> | + | |
- | <tr><td>9</td><td>55420,2 / 55930,4</td><td>Szybkość transmisji używana w rozszerzeniu [[Speedy 1050]]</td></tr> | + | |
- | <tr><td>10</td><td>52160,2 / 52640,4</td><td>52 kbps, szybkość stacji [[US Doubler]] i [[Happy Warp]]</td></tr> | + | |
- | <tr><td>11</td><td>49262,4 / 49715,9</td><td> </td></tr> | + | |
- | <tr><td>12</td><td>46669,6 / 47099,3</td><td> </td></tr> | + | |
- | <tr><td>13</td><td>44336,1 / 44744,3</td><td> </td></tr> | + | |
- | <tr><td>14</td><td>42224,9 / 42613,6</td><td> </td></tr> | + | |
- | <tr><td>15</td><td>40305,6 / 40676,6</td><td> </td></tr> | + | |
- | <tr><td>16</td><td>38553,2 / 38908</td><td>Maksymalna szybkość nie modyfikowanych stacji [[XF551|XF-551]] oraz [[CA2001|CA-2001]]. Najbliższy (odchyłka <5%) odpowiednik "standardowej" szybkości 38400 bps (2x19200).</td></tr> | + | |
- | </table> | + | |
- | + | ||
- | Oczywiście wartość dzielnika częstotliwości może mieć i wyższe wartości, do 65535 włącznie (co daje 13,6 bps). | + | |
- | + | ||
- | ===Magnetofon=== | + | |
- | + | ||
- | Dla magnetofonu domyślną wartością rejestru jest 1484, co odpowiada szybkości 594,7 bps. Szybkość tę podczas transmisji komputer dostosowuje w pewnym zakresie do bieżących potrzeb wynikłych np. z nierównomiernego przesuwu taśmy bądź jej rozciągnięcia itd. | + | |
- | + | ||
- | W starszych wersjach ROM-u, przeznaczonych dla serii 400/800, do wymiany danych z magnetofonem stosowany był tryb dwutonowy. | + | |
==Rozszerzenia SIO== | ==Rozszerzenia SIO== |
Wersja z dnia 09:17, 4 gru 2005
SIO - Serial Input/Output. W założeniach jest to rezydujący w ROM-ie podsystem niskopoziomowych procedur blokowego dostępu do urządzeń szeregowych, to jest przede wszystkim stacji dysków, drukarek, modemów i magnetofonu. Wszystkie te urządzenia podłącza się w Atari do gniazda SIO.
W serii XL do podsystemu SIO dodano także niskopoziomową (blokową) obsługę urządzeń podłączanych do szyny równoległej (PBI), czyli tak zwanych nowych urządzeń.
Spis treści |
Sposób użycia
Żądaną operację definiuje się ustawiwszy przedtem odpowiednie zmienne w bloku DCB (Device Control Block, $0300), a nastepnie wywołuje skokiem JSR pod JSIOINT $E459, co jest punktem wejściowym interfejsu szeregowo-równoległego. Przy powrocie rejestr Y zawiera wartość 1 w przypadku powodzenia, bądź ujemny kod błędu.
Struktura DCB
Adres | Etykieta | Wielkość | Znaczenie |
$0300 | DDEVIC | Bajt | Identyfikator urządzenia (zob. niżej). |
$0301 | DUNIT | Bajt | Numer urządzenia; w przypadku stacji dysków numer napędu. |
$0302 | DCMND | Bajt | Komenda dla urządzenia. |
$0303 | DSTATS | Bajt | Przed wywołaniem SIO należy ustawić tu rodzaj operacji ($40 odczyt, $80 zapis, $00 brak transferu danych). Po powrocie z systemu znajduje się tu status operacji (kod błędu). |
$0304 | DBUFA | Dwa bajty | Adres bufora. |
$0306 | DTIMLO | Bajt | Czas oczekiwania - w sekundach - na pozytywną odpowiedź urządzenia. |
$0307 | DUNUSE | Bajt | Bajt nieużywany, zarezerwowany do przyszłych zastosowań. |
$0308 | DBYT | Dwa bajty | Wielkość bufora; musi być zgodna z wielkością transmitowanego bloku danych. |
$030A | DAUX1 | Bajt | Pierwszy bajt pomocniczy. W operacjach dyskowych młodszy bajt numeru sektora. |
$030B | DAUX2 | Bajt | Drugi bajt pomocniczy. W operacjach dyskowych starszy bajt numeru sektora. |
Wykaz urządzeń
Interfejs SIO znajdujący się w ROM-ie rozpoznaje pięć predefiniowanych urządzeń:
- $31: dyskową pamięć masową (stację dysków, twardy dysk)
- $40: drukarkę
- $4F: bus master (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.
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.
Wykaz komend
Podstawowy zestaw komend
Poniższa tabela wyszczególnia podstawowe minimum komend rozpoznawanych przez urządzenia peryferyjne Atari.
Kod | Nazwa | Urządzenie | R/W | Ilość danych | Opis |
$21 (!) | FORMAT DISK | $31 (stacja dysków) | R | Równa wielkości sektora danych na dysku | Formatuje dyskietkę w wybranej uprzednio (komendami PERCOM) gęstości, lub w pojedynczej gęstości (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... Kontroler KMK/JŻ IDE nie rozpoznaje tej komendy dla bezpieczeństwa danych na dysku (do partycjonowania i "formatowania" dysku służy oddzielny program). |
$50 (P) | PUT SECTOR | $31 i $60 (stacja dysków i magnetofon) | W | Zależna od urządzenia i trybu pracy. | Zapisuje do urządzenia blok danych wskazany przez DBUFA, a zawierający DBYT bajtów. W przypadku stacji dysków jest to zapis bez weryfikacji. |
$52 (R) | READ SECTOR | R | Odczytuje z urządzenia blok danych o wielkości DBYT bajtów i zapisuje go w pamięci pod adresem wskazanym przez DBUFA. | ||
$53 (S) | READ STATUS | Wszystkie oprócz magnetofonu | R | Zależna od urządzenia | 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. |
$57 (W) | WRITE SECTOR | Wszystkie | W | Zależna od urządzenia i trybu pracy. | To samo, co PUT SECTOR ($50). W przypadku stacji dysków zapis przeprowadzany jest z weryfikacją. |
W przypadku drukarki długość bufora może wynosić 20, 29 albo 40 znaków (na ogół to ostatnie), a znaczenie DAUX2 jest jak następuje:
| |||||
Dla interfejsu Atari 850 wielkość bufora wynosi 64 bajty. |
Komendy dodatkowe
Rozpoznawane przez urządzenia peryferyjne Atari komendy dodatkowe w stosunku do powyżej wspomnianego niezbędnego minimum.
Kod | Nazwa | Urządzenie | R/W | Ilość danych | Opis |
$22 (") | FORMAT MEDIUM | $31 (stacja dysków) | R | 128 bajtów | Analogicznie do FORMAT DISK ($21), z tym że formatowanie zawsze przeprowadzane jest w 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). |
$23 (#) | FORMAT DSDD | 256 bajtów | Analogicznie do FORMAT DISK ($21), z tym że formatowanie zawsze przeprowadzane jest w gęstości podwójnej dwustronnej (360k). Komenda wprowadzona razem ze stacją 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). | ||
$41 (A) | ??? | $50 (RS-232) | - | (brak) | Komenda aktywująca linie DTR, RTS i XMT (TX) wskazanego portu RS-232 interfejsu 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. |
$42 (B) | ??? | Komenda ustawiająca różne parametry pracy (m.in. szybkość transmisji) wskazanego portu RS-232 interfejsu 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. |
Komendy PERCOM
Komendy PERCOM noszą nazwę od stacji dysków firmy PERCOM, w których po raz pierwszy się pojawiły. Nie są rozpoznawane przez stacje dysków firmy Atari (z wyjątkiem Atari XF-551), są jednak zaimplementowane we wszystkich rozszerzeniach oraz stacjach innych producentów i stanowią de facto standard.
Kod | Nazwa | Urządzenie | R/W | Ilość danych | Opis |
$4E (N) | READ PERCOM | $31 (stacja dysków) | R | 12 bajtów | Odczytuje z urządzenia dwunastobajtowy blok danych opisujący jego bieżącą konfigurację, tj. przede wszystkim format znajdującej się w stacji dyskietki. |
$4F (O) | WRITE PERCOM | W | Zapisuje do urządzenia dwanaście bajtów opisujących żądaną konfigurację, tj. liczbę ścieżek, stron dyskietki, sektorów na ścieżkę, wielkość sektora, gęstość. Po pomyślnym wykonaniu tej operacji komenda FORMAT DISK ($21) sformatuje dykietkę zgodnie z zapisaną konfiguracją (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). |
Komendy specjalne
Komendy wspomagające automatyczną instalację w systemie handlerów podłączonych urządzeń zewnętrznych.
Kod | Nazwa | Urządzenie | R/W | Ilość danych | Opis |
$21 (!) | SEND RELOCATOR | $50 (RS-232) | R | Wg odpowiedzi na komendę POLL ($3F) | 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. Komendę SEND RELOCATOR rozpoznaje moduł Atari 850, a może dotyczyć też innych urządzeń, oprócz stacji dysków (gdzie kod operacyjny $21 oznacza formatowanie dyskietki). |
$26 (&) | SEND HANDLER | Wg parametrów ustawionych przez relokator przesłany przez SEND RELOCATOR ($21) lub wg odpowiedzi na komendę POLL BUS ($40) | R | Wg parametrów ustawionych przez relokator (przesłany przez urządzenie lub rezydujący) | Komenda SEND HANDLER służy do załadowania z urządzenia kodu programu obsługi (handlera) tego urządzenia. Moe ona działać różnie w zależności od tego, czy transmisja została zainicjowana przez komendę POLL ($3F) czy POLL BUS ($40). 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. 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. 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 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 kodem błędu INCOMPLETE EXECUTION. Ustawienia zmiennych DCB dla komendy SEND HANDLER wyglądają następująco:
|
$3F (?) | POLL | $31 (stacja dysków) | R | 1 bajt | Stacje kompatybilne z US Doubler w odpowiedzi na tę komendę przesyłają wartość rejestru POKEY-a służącego do ustawienia częstotliwości nośnej dla przyspieszonej transmisji. | $50 (RS-232) | 12 bajtów | Komenda ta 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. W module Atari 850 odpowiedzią na komendę POLL są wartości, jakie trzeba wstawić do DCB celem wykonania komendy SEND RELOCATOR ($21). 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. | </tr>
$40 (@) | POLL BUS | $4F (bus master) | R | 4 bajty | 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. Istnieje kilka odmian komendy POLL BUS różniących się parametrami przesyłanymi w DAUX1 i DAUX2:
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 nie przesyłają żadnej odpowiedzi, a komputer jej nie oczekuje. 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 nie reaguje), 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. Trzeci przysłany bajt to identyfikator urządzenia (dla DDEVIC), które odpowiedziało na komendę i z którym będzie prowadzona dalsza komunikacja. Po stwierdzeniu poprawności odpowiedzi komputer dokonuje rezerwacji pamięci nad wartością MEMLO zaokrągloną w górę do najbliższej granicy słowa i próbuje dokonać odczytu z urządzenia, które się zgłosiło, 128 bajtów pod adres $03FD, przy użyciu innej "nietypowej" komendy, a mianowicie $26 - SEND HANDLER. 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. Procedura ładowania handlera wywoływana jest po procedurze bootowania DOS-u, ale niezależnie od jej wyniku; z czego wniosek, że "handler" może spełniać funkcję zarówno dodatku do DOS-u, jak i zostać załadowany zamiast DOS-u. Tą samą drogą można już po całkowitym uruchomieniu systemu, podczas pracy, załadować handler urządzenia konkretnie wskazanego. Robi to CIO przy każdorazowej próbie otwarcia pliku na urządzeniu, którego system nie zna (nie ma takiego wpisu w tablicy handlerów). Odpytanie bus mastera na okoliczność dysponowania takowym handlerem odbywa się za pomocą komendy POLL TYPE 4. 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). |
Pozostałe komendy
Komendy zdefiniowane przez Atari, na których temat brak bliższych danych.
Kod | Nazwa | Urządzenie | R/W | Ilość danych | Opis | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
$20 ( ) | DOWNLOAD | ??? | W (?) | ??? | Komenda wymieniana przez niektóre źrodła. Szczegóły nieznane. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
$23 (#) | DIAG1 | $31 (stacja dysków) | ??? | ??? | Komendy diagnostyczne stacji Atari 1050. UWAGA: kod operacyjny pierwszej z nich ($23) jest taki sam, jak kod komendy formatowania w stacji Atari XF-551! | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
$24 ($) | DIAG2 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
$51 (Q) | READ SPIN | $31 (stacja dysków) | R (?) | ? | Komendy te występują jako komendy dyskowe na liście rozkazów SIO w dokumentacji sporządzonej przez Atari. Nie znam jednak stacji, która by na nie reagowała. Mogą to być komendy stacji 810, jakieś komendy diagnostyczne jej prototypu, albo komendy planowane, lecz nie zaimplementowane. Dostępna dokumentacja nie zawiera ich opisu. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
$54 (T) | READ ADDRESS | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
$55 (U) | MOTOR ON | - | (brak) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
$56 (V) | VERIFY SECTOR | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
$58 (X) | ??? | $50 (RS-232) | R | 9 bajtów | Interfejs 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. </tr> </table> Blok statusuBlok 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:
Stacja dysków
Drukarka
RS-232 (Atari 850)Blok statusu portu RS-232 ma dwa bajty (w pozostałych urządzeniach - cztery).
Magnetofon kasetowyPrzyjmuje 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 PERCOMBlok PERCOM jest to 12 bajtów informacji o konfiguracji stacji dysków. Odczyt przeprowadza się komendą $4E ("N"), a zapis - komendą $4F ("O").
Sposób użyciaDla utrzymania zgodności z dotychczasowym oprogramowaniem, a już zwłaszcza z dotychczasowymi sterownikami urządzeń podłączanych do szyny równoległej, wpisanie pod $000304/5/E 24-bitowego adresu nie da pożądanego wyniku; jeśliby bowiem urządzenie brało pod uwagę tylko 16 najmłodszych bitów adresu ignorując najstarszy bajt wpisany pod $00030E, wtedy - przy odczycie - dane zostałyby umieszczone nie tam, gdzie trzeba. Musi więc istnieć mechanizm, który zapobiega tego typu nieporozumieniom. W tym celu SIO definiuje trzy nowe urządzenia wirtualne, o kodach jak następuje:
Wywołanie urządzenia z takim kodem w DDEVIC powiadamia sterownik SIO, że adres bufora w DCB jest 24-bitowy i że najstarszy bajt adresu jest pod $00030E (w przeciwnym wypadku SIO zakłada, że najstarszy bajt adresu to 0); oraz że numer sektora jest 32-bitowy i jest umieszczony w DAUX1-DAUX4 (UWAGA: w przypadku szeregowych stacji dysków, SIO2IDE, SIO2PC itp. dwa najstarsze bajty tego numeru są ignorowane, ale powinny być wyzerowane dla kompatybilności). Poza tym działanie urządzeń wirtualnych jest identyczne, jak tradycyjnych (odpowiednio $31, $40 i $50), a kod urządzenia jest przed wysłaniem na port szeregowy przekładany na kod rzeczywisty. Przyjmując komendę do wykonania SIO w żaden sposób nie sprawdza, czy dodatkowa pamięć w ogóle istnieje - zakłada się, że program sam stwierdzi jej istnienie (choćby za pomocą funkcji alokacji pamięci) przed próbą odczytu do niej danych. Bibliografia
|