SIO
From Atariki
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.
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. W przypadku stacji dysków trzeba podać identyfikator zwiększony o 1! |
$0301 | DUNIT | Bajt | Numer urządzenia; w przypadku stacji dysków numer napędu. |
$0302 | DCMND | Bajt | Komenda dla urządzenia. |
$0303 | DSTATS | Bajt | Przed wywołaniem SIO należy ustawić tu rodzaj operacji ($40 odczyt, $80 zapis). Po powrocie z systemu znajduje się tu status operacji (kod błędu). |
$0304 | DBUFA | Dwa bajty | Adres bufora. |
$0306 | DTIMLO | Bajt | Czas oczekiwania 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 cztery predefiniowane urządzenia:
- $30: dyskową pamięć masową (stację dysków, twardy dysk)
- $40: drukarkę
- $50: interfejs RS-232
- $60: magnetofon kasetowy
przy czym identyfikator urządzenia to górne 4 bity podanego kodu, dolne natomiast 4 bity stanowi indywidualny numer urządzenia (np. $31 - stacja dysków nr 1, $32 - stacja dysków nr 2 itd.). W DCB wartości tej podajemy oddzielnie.
Wykaz typowych komend
Kod | Nazwa | Urządzenie | R/W | Ilość danych | Opis |
$21 (!) | FORMAT DISK | $31 (stacja dysków) | R | 128 B | Formatuje dyskietkę w wybranej uprzednio (komendami PERCOM) gęstości, lub w pojedynczej gęstości, jeśli stacja nie jest konfigurowalna. Zwraca listę zawierającą do 62 numerów wadliwych sektorów wykrytych w czasie formatowania, zakończoną wartością $FFFF. Kontroler KMK/JŻ IDE nie rozpoznaje tej komendy dla bezpieczeństwa danych na dysku (do partycjonowania i "formatowania" dysku służy oddzielny program). |
$22 (") | FORMAT MEDIUM | $31 (stacja dysków) | R | 128 B | Analogicznie do FORMAT DISK, z tym że formatowanie zawsze przeprowadzane jest w gęstości średniej. Komenda wprowadzona razem ze stacją 1050. Kontroler KMK/JŻ IDE nie rozpoznaje tej komendy dla bezpieczeństwa danych na dysku (do partycjonowania i "formatowania" dysku służy oddzielny program). |
$4E (N) | READ PERCOM | $31 (stacja dysków) | R | 12 bajtów | Odczytuje z urządzenia dwunastobajtowy blok danych opisujący jego bieżącą konfigurację, tj. przede wszystkim format znajdującej się w stacji dyskietki. Komenda ta nie jest rozpoznawana przez standardowe stacje Atari, ale jest zaimplementowana we wszystkich rozszerzeniach oraz stacjach innych producentów. |
$4F (O) | WRITE PERCOM | $31 (stacja dysków) | W | 12 bajtów | Zapisuje do urządzenia dwanaście bajtów opisujących żądaną konfigurację, tj. liczbę ścieżek, stron dyskietki, sektorów na ścieżkę, wielkość sektora, gęstość. Po pomyślnym wykonaniu tej operacji komenda FORMAT DISK ($21) sformatuje dykietkę zgodnie z zapisaną konfiguracją. Komenda ta nie jest rozpoznawana przez standardowe stacje Atari, ale jest zaimplementowana we wszystkich rozszerzeniach oraz stacjach innych producentów. Kontroler KMK/JŻ IDE nie rozpoznaje tej komendy dla bezpieczeństwa danych na dysku (do definiowania wielkości partycji służy oddzielny program). |
$50 (P) | PUT SECTOR | Wszystkie za wyjątkiem drukarki | W | Zależna od urządzenia i trybu pracy. | Zapisuje do urządzenia blok danych wskazany przez DBUFA, a zawierający DBYT bajtów. W przypadku stacji dysków jest to zapis bez weryfikacji. |
$52 (R) | READ SECTOR | Wszystkie oprócz drukarki | R | Zależna od urządzenia i trybu pracy. | Odczytuje z urządzenia blok danych o wielkości DBYT bajtów i zapisuje go w pamięci pod adresem wskazanym przez DBUFA. |
$53 (S) | READ STATUS | Wszystkie | R | 4 bajty | Odczytuje z urządzenia czterobajtowy blok statusu i zapisuje go pod adresem wskazanym przez DBUFA. Typowo komenda ta służy to stwierdzenia, czy urządzenie jest gotowe do pracy. |
$57 (W) | WRITE SECTOR | Wszystkie | W | Zależna od urządzenia i trybu pracy. | To samo, co PUT SECTOR ($52). W przypadku stacji dysków zapis przeprowadzany jest z weryfikacją. |
Blok statusu
Blok PERCOM
Protokół transmisji
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.
Protokół transmisji urządzeń podłączonych do szyny szeregowej jest zdefiniowany następująco:
- 1 bit startu
- osiem bitów danych bez 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 nagnetofonu 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 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, odpowiedzią jest $4E ("N", jak Negative Acknowledge) i na tym transmisja się kończy; jeśli jest ona wykonalna, urządzenie powinno odpowiedzieć kodem $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 to jest odczyt danych, urządzenie stwierdza, czy dane są dostępne (np. czy istnieje sektor o podanym numerze); jeśli nie, 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 ("A") 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, kolejność jest odwrotna: najpierw komputer przesyła blok danych plus sumę kontrolną do urządzenia, a dopiero potem urządzenie odpowiada 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").