<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="pl">
	<id>https://mirror.atariki.pl/w/index.php?action=history&amp;feed=atom&amp;title=SIO</id>
	<title>SIO - Historia wersji</title>
	<link rel="self" type="application/atom+xml" href="https://mirror.atariki.pl/w/index.php?action=history&amp;feed=atom&amp;title=SIO"/>
	<link rel="alternate" type="text/html" href="https://mirror.atariki.pl/w/index.php?title=SIO&amp;action=history"/>
	<updated>2026-10-02T15:24:58Z</updated>
	<subtitle>Historia wersji tej strony wiki</subtitle>
	<generator>MediaWiki 1.46.0</generator>
	<entry>
		<id>https://mirror.atariki.pl/w/index.php?title=SIO&amp;diff=3535&amp;oldid=prev</id>
		<title>imported&gt;Atariki recovery: Reconstructed from archived HTML; see provenance manifest</title>
		<link rel="alternate" type="text/html" href="https://mirror.atariki.pl/w/index.php?title=SIO&amp;diff=3535&amp;oldid=prev"/>
		<updated>2026-10-01T08:51:48Z</updated>

		<summary type="html">&lt;p&gt;Reconstructed from archived HTML; see provenance manifest&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Nowa strona&lt;/b&gt;&lt;/p&gt;&lt;div&gt;Serial Input/Output. W założeniach jest to rezydujący w ROM-ie podsystem niskopoziomowych procedur blokowego dostępu do urządzeń szeregowych, to jest przede wszystkim stacji dysków, drukarek, modemów i magnetofonu. Wszystkie te urządzenia podłącza się w Atari do [[Gniazdo SIO|gniazda SIO]].&lt;br /&gt;
&lt;br /&gt;
W serii [[XL]] do podsystemu SIO dodano także niskopoziomową (blokową) obsługę urządzeń podłączanych do szyny równoległej ([[PBI]]), czyli tak zwanych [[Nowe urządzenia|nowych urządzeń]].&lt;br /&gt;
&lt;br /&gt;
== Sposób użycia ==&lt;br /&gt;
&lt;br /&gt;
Żą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]].&lt;br /&gt;
&lt;br /&gt;
=== Struktura DCB ===&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Adres&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Etykieta&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Wielkość&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Znaczenie&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|-&lt;br /&gt;
| $0300&lt;br /&gt;
| DDEVIC&lt;br /&gt;
| Bajt&lt;br /&gt;
| Identyfikator urządzenia (zob. niżej).&lt;br /&gt;
|-&lt;br /&gt;
| $0301&lt;br /&gt;
| DUNIT&lt;br /&gt;
| Bajt&lt;br /&gt;
| Numer urządzenia; w przypadku stacji dysków numer napędu.&lt;br /&gt;
|-&lt;br /&gt;
| $0302&lt;br /&gt;
| DCMND&lt;br /&gt;
| Bajt&lt;br /&gt;
| Komenda dla urządzenia.&lt;br /&gt;
|-&lt;br /&gt;
| $0303&lt;br /&gt;
| DSTATS&lt;br /&gt;
| Bajt&lt;br /&gt;
| 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]]).&lt;br /&gt;
|-&lt;br /&gt;
| $0304&lt;br /&gt;
| DBUFA&lt;br /&gt;
| Dwa bajty&lt;br /&gt;
| 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.&lt;br /&gt;
|-&lt;br /&gt;
| $0306&lt;br /&gt;
| DTIMLO&lt;br /&gt;
| Bajt&lt;br /&gt;
| Czas oczekiwania na pozytywną odpowiedź urządzenia, tzw. &amp;#039;&amp;#039;timeout&amp;#039;&amp;#039;. Oblicza się to jak następuje: wartość DTIMLO mnożona jest przez 64, w wyniku czego otrzymujemy liczbę &amp;quot;[[Ramka|ramek]]&amp;quot; [[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ść &amp;quot;0&amp;quot; oznacza 256 jednostek.&lt;br /&gt;
&lt;br /&gt;
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 (&amp;quot;S&amp;quot;, zob. niżej).&lt;br /&gt;
|-&lt;br /&gt;
| $0307&lt;br /&gt;
| DUNUSE&lt;br /&gt;
| Bajt&lt;br /&gt;
| Bajt nieużywany, zarezerwowany do przyszłych zastosowań.&lt;br /&gt;
|-&lt;br /&gt;
| $0308&lt;br /&gt;
| DBYT&lt;br /&gt;
| Dwa bajty&lt;br /&gt;
| Wielkość bufora; musi być zgodna z wielkością transmitowanego bloku danych. Zero oznacza 64 kilobajty.&lt;br /&gt;
|-&lt;br /&gt;
| $030A&lt;br /&gt;
| DAUX1&lt;br /&gt;
| Bajt&lt;br /&gt;
| Pierwszy bajt pomocniczy. W operacjach dyskowych młodszy bajt numeru sektora.&lt;br /&gt;
|-&lt;br /&gt;
| $030B&lt;br /&gt;
| DAUX2&lt;br /&gt;
| Bajt&lt;br /&gt;
| Drugi bajt pomocniczy. W operacjach dyskowych starszy bajt numeru sektora.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Wykaz urządzeń ===&lt;br /&gt;
&lt;br /&gt;
Komenda wysyłana do urządzenia formowana jest w strukturze CFB (Command Frame Buffer, $023A) składającej się z:&lt;br /&gt;
&lt;br /&gt;
* CDEVIC&lt;br /&gt;
* CCMND&lt;br /&gt;
* CAUX1&lt;br /&gt;
* CAUX2&lt;br /&gt;
&lt;br /&gt;
a uzupełnianej na podstawie DCB.&lt;br /&gt;
&lt;br /&gt;
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. &amp;quot;nieudokumentowana&amp;quot; cecha procedur szeregowych OS-u, inne urządzenia (jak np. [[Nowe urządzenia|nowe urządzenia]]) mogą tego nie robić.&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;DDEVIC&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;CDEVIC&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Opis&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|-&lt;br /&gt;
| $31&lt;br /&gt;
| $31-$3F&lt;br /&gt;
| dyskowa pamięć masowa (stacja dysków, twardy dysk)&lt;br /&gt;
|-&lt;br /&gt;
| $40&lt;br /&gt;
| $40-$43&lt;br /&gt;
| drukarka&lt;br /&gt;
|-&lt;br /&gt;
| $4F&lt;br /&gt;
| $4F&lt;br /&gt;
| bus master (moduł [[1090]])&lt;br /&gt;
|-&lt;br /&gt;
| $50&lt;br /&gt;
| $50-$53&lt;br /&gt;
| port szeregowy RS-232C&lt;br /&gt;
|-&lt;br /&gt;
| $60&lt;br /&gt;
| $60&lt;br /&gt;
| magnetofon kasetowy&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Urządzeniem, które na podanej powyżej liście jest wyjątkowe, jest magnetofon kasetowy. Jest to jedyne &amp;quot;nieinteligentne&amp;quot; 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.&lt;br /&gt;
&lt;br /&gt;
Wartości CDEVIC powyżej $7F są zarezerwowane dla pewnych rozszerzeń protokołu SIO, patrz [[SIO#Rozszerzenia SIO|niżej]].&lt;br /&gt;
&lt;br /&gt;
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:&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;DDEVIC&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;CDEVIC&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Opis&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|-&lt;br /&gt;
| $20&lt;br /&gt;
| $20&lt;br /&gt;
| [[IDE Plus]], [[SIDE]]&lt;br /&gt;
|-&lt;br /&gt;
| $45&lt;br /&gt;
| $45&lt;br /&gt;
| [[Smart Device]] ( [[APE Time]] i [[URL Submit]])&lt;br /&gt;
|-&lt;br /&gt;
| $5A&lt;br /&gt;
| $5A&lt;br /&gt;
| [[ATR 8000]]&lt;br /&gt;
|-&lt;br /&gt;
| $61&lt;br /&gt;
| $61&lt;br /&gt;
| [[AtariSIO]], [[DOS2DOS]]&lt;br /&gt;
|-&lt;br /&gt;
| $70&lt;br /&gt;
| $70&lt;br /&gt;
| [http://www.mathyvannisselroy.nl/aspi.htm Atari ASPI] (zob. [http://pl.wikipedia.org/wiki/ASPI ASPI])&lt;br /&gt;
|-&lt;br /&gt;
| $70&lt;br /&gt;
| $70&lt;br /&gt;
| [[FujiNet]] - komendy modułu&lt;br /&gt;
|-&lt;br /&gt;
| $71-$78&lt;br /&gt;
| $70&lt;br /&gt;
| [[FujiNet]] - komendy dla urządzenia N:&lt;br /&gt;
|-&lt;br /&gt;
| $71-$74&lt;br /&gt;
| $71-$74&lt;br /&gt;
| [[SDrive]]&lt;br /&gt;
|-&lt;br /&gt;
| $71&lt;br /&gt;
| $70&lt;br /&gt;
| [[SIO2USB]][http://www.atariage.com/forums/topic/155690-ape-time/page__view__findpost__p__1916403?s=2e4d3fd681ca05ec0c05b0a7e5474dd6 [1]]&lt;br /&gt;
|-&lt;br /&gt;
| $73&lt;br /&gt;
| $72-$75&lt;br /&gt;
| [[SIO2SD|Sio2SD]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Wykazy komend ===&lt;br /&gt;
&lt;br /&gt;
* [[Lista komend SIO według funkcji]]&lt;br /&gt;
* [[Lista komend SIO według kodów operacyjnych]]&lt;br /&gt;
&lt;br /&gt;
=== Blok statusu ===&lt;br /&gt;
&lt;br /&gt;
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:&lt;br /&gt;
&lt;br /&gt;
* bity 0-2 sygnalizują status komunikacji pomiędzy komputerem a urządzeniem&lt;br /&gt;
* bity 3-7 sygnalizują status wewnętrzny urządzenia&lt;br /&gt;
&lt;br /&gt;
==== Stacja dysków ====&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Bajt&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Znaczenie&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| * bit 0 = 1 - wydana ostatnio komenda nie została rozpoznana&lt;br /&gt;
* bit 1 = 1 - przesłany ostatnio blok danych był błędny (błąd sumy kontrolnej)&lt;br /&gt;
* bit 2 = 1 - ostatnia operacja nie powiodła się (np. próbowano odczytać wadliwy sektor)&lt;br /&gt;
* bit 3 = 1 - dyskietka jest zabezpieczona przed zapisem&lt;br /&gt;
* bit 4 = 1 - kręci się silnik obracający dyskietkę&lt;br /&gt;
* bit 5 = 1 - sektory 256-bajtowe (128-bajtowe w przeciwnym wypadku)&lt;br /&gt;
* bit 6 = 0 - zarezerwowany&lt;br /&gt;
* bit 7 = 1 - praca w średniej gęstości&lt;br /&gt;
&lt;br /&gt;
W przypadku interfejsu [[KMK/JŻ]] IDE znaczenie mają tylko bity 3 i 5, reszta jest zawsze wyzerowana.&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| Kopia rejestru statusu kontrolera WD 1772 (lub kompatybilnego), wszystkie bity są poddane inwersji.&lt;br /&gt;
&lt;br /&gt;
* bit 0 = 1 - BUSY&lt;br /&gt;
* bit 1 = 1 - DRQ (Data Request)&lt;br /&gt;
* bit 2 = 1 - Track 0 not found&lt;br /&gt;
* bit 3 = 1 - CRC error&lt;br /&gt;
* bit 4 = 1 - Record not found&lt;br /&gt;
* bit 5 = 1 - Seek complete&lt;br /&gt;
* bit 6 = 1 - Write protected&lt;br /&gt;
* bit 7 = 1 - Not ready&lt;br /&gt;
&lt;br /&gt;
Interfejs IDE [[KMK/JŻ]] zwraca zamiast tego zawartość rejestru ERROR kontrolera IDE:&lt;br /&gt;
&lt;br /&gt;
* bit 0 = 1 - Data Address Mark not found&lt;br /&gt;
* bit 1 = 1 - Track 0 not found&lt;br /&gt;
* bit 2 = 1 - Aborted command&lt;br /&gt;
* bit 3, zarezerwowany&lt;br /&gt;
* bit 4 = 1 - ID not found&lt;br /&gt;
* bit 5, zarezerwowany&lt;br /&gt;
* bit 6 = 1 - ECC error&lt;br /&gt;
* bit 7 = 1 - Bad sector&lt;br /&gt;
&lt;br /&gt;
Podobnie jak powyżej wszystkie bity są poddane inwersji (EOR #$FF).&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| Maksymalny czas oczekiwania na wykonanie komendy (timeout) przewidziany dla operacji dyskowej. Najdłużej trwa formatowanie, zalecaną wartością jest 240.&lt;br /&gt;
|-&lt;br /&gt;
| 3&lt;br /&gt;
| Nie używany.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Drukarka ====&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Bajt&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Znaczenie&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| * bit 0 = 1 - wydana ostatnio komenda nie została rozpoznana&lt;br /&gt;
* bit 1 = 1 - przesłany ostatnio blok danych był błędny (błąd sumy kontrolnej)&lt;br /&gt;
* bit 7 = 1 - drukarka jest programowalna (w drukarkach Atari ten bit jest skasowany)&lt;br /&gt;
&lt;br /&gt;
Pozostałe bity są zarezerwowane.&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| DAUX2 przesłanej ostatnio komendy&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| Maksymalny czas oczekiwania na wykonanie komendy (timeout) przewidziany dla tej drukarki&lt;br /&gt;
|-&lt;br /&gt;
| 3&lt;br /&gt;
| Nie używany.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== RS-232 ([[850|Atari 850]]) ====&lt;br /&gt;
&lt;br /&gt;
Blok statusu portu RS-232 ma dwa bajty (w pozostałych urządzeniach - cztery).&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Bajt&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Znaczenie&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| * bit 0 = 1 - wydana ostatnio komenda nie została rozpoznana&lt;br /&gt;
* bit 1 = 1 - przesłany ostatnio blok danych był błędny (błąd sumy kontrolnej)&lt;br /&gt;
* bit 2, zarezerwowany&lt;br /&gt;
* bit 3, zarezerwowany&lt;br /&gt;
* bit 4 = 1 - przepełnienie bufora RS-232&lt;br /&gt;
* bit 5 = 1 - błąd parzystości RS-232&lt;br /&gt;
* bit 6 = 1 - na porcie RS-232 wystąpił nadmiar bitów (overrun)&lt;br /&gt;
* bit 7 = 1 - na porcie RS-232 wystąpiło zakłócenie transmisji szeregowej (framing error)&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| * bit 0 = 1 - RCV (czyli RX) ustawione&lt;br /&gt;
* bit 1, zarezerwowany&lt;br /&gt;
* bit 2, kopia bitu 3&lt;br /&gt;
* bit 3 = 1 - CRX (czyli DCD) ustawione&lt;br /&gt;
* bit 4, kopia bitu 5&lt;br /&gt;
* bit 5 = 1 - CTS ustawione&lt;br /&gt;
* bit 6, kopia bitu 7&lt;br /&gt;
* bit 7 = 1 - DSR ustawione&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Magnetofon kasetowy ====&lt;br /&gt;
&lt;br /&gt;
Przyjmuje się, że magnetofon, jako urządzenie &amp;quot;nieinteligentne&amp;quot;, 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.&lt;br /&gt;
&lt;br /&gt;
=== Blok PERCOM ===&lt;br /&gt;
&lt;br /&gt;
Blok PERCOM jest to 12 bajtów informacji o konfiguracji stacji dysków. Odczyt przeprowadza się komendą $4E (&amp;quot;N&amp;quot;), a zapis - komendą $4F (&amp;quot;O&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Bajt&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Opis&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| 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.&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| Szybkość przesuwu głowicy ze ścieżki na ścieżkę:&lt;br /&gt;
* 0 - 30 ms&lt;br /&gt;
* 1 - 20 ms&lt;br /&gt;
* 2 - 12 ms&lt;br /&gt;
* 3 - 6 ms&lt;br /&gt;
&lt;br /&gt;
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)&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| STARSZY bajt liczby sektorów na ścieżce.&lt;br /&gt;
|-&lt;br /&gt;
| 3&lt;br /&gt;
| MŁODSZY bajt liczby sektorów na ścieżce.&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| Liczba aktywnych stron dyskietki zmniejszona o 1 albo najstarszy bajt liczby sektorów partycji twardego dysku (patrz niżej).&lt;br /&gt;
|-&lt;br /&gt;
| 5&lt;br /&gt;
| * bit 0 - zarezerwowany&lt;br /&gt;
* bit 1 = 1, dyskietka ośmiocalowa; 5,25 cala w przeciwnym wypadku&lt;br /&gt;
* bit 2 = 1, gęstość MFM, FM w przeciwnym wypadku&lt;br /&gt;
* bit 3 = 1, dysk nie ma &amp;quot;stron&amp;quot;, a zamiast liczby stron jest podany najstarszy bajt całkowitej liczby sektorów dysku (partycji twardego dysku)&lt;br /&gt;
&lt;br /&gt;
Pozostałe bity są zarezerwowane i powinny być wyzerowane.&lt;br /&gt;
|-&lt;br /&gt;
| 6&lt;br /&gt;
| STARSZY bajt wielkości sektora (w bajtach)&lt;br /&gt;
|-&lt;br /&gt;
| 7&lt;br /&gt;
| MŁODSZY bajt wielkości sektora (w bajtach)&lt;br /&gt;
|-&lt;br /&gt;
| 8&lt;br /&gt;
| 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:&lt;br /&gt;
&lt;br /&gt;
* bit 0 = 1, sektory fizyczne na ścieżce numerowane są od 0, a nie od 1.&lt;br /&gt;
* bit 1 = 1, sektory fizyczne 1,2,3 mają pełne rozmiary.&lt;br /&gt;
* bit 2, zarezerwowany&lt;br /&gt;
* bit 3, zarezerwowany&lt;br /&gt;
* bit 4, zarezerwowany&lt;br /&gt;
* bit 5, zarezerwowany&lt;br /&gt;
* bit 6 = 0, napęd stacji jest odłączony (wyjęty).&lt;br /&gt;
* bit 7 = 1, napęd 80-ścieżkowy pracuje w trybie 40-ścieżkowym.&lt;br /&gt;
&lt;br /&gt;
W praktyce większość stacji nie ustawia tych bitów zgodnie z powyższym opisem.&lt;br /&gt;
|-&lt;br /&gt;
| 9&lt;br /&gt;
| Niewykorzystane, na ogół 0.&lt;br /&gt;
|-&lt;br /&gt;
| 10&lt;br /&gt;
| Niewykorzystane, na ogół 0.&lt;br /&gt;
|-&lt;br /&gt;
| 11&lt;br /&gt;
| Niewykorzystane, na ogół 0.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Protokół transmisji ==&lt;br /&gt;
&lt;br /&gt;
=== Połączenia równoległe ===&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
=== Połączenia szeregowe ===&lt;br /&gt;
&lt;br /&gt;
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).&lt;br /&gt;
&lt;br /&gt;
==== Opis przebiegu komunikacji ====&lt;br /&gt;
&lt;br /&gt;
Przebieg komunikacji pomiędzy komputerem a urządzeniem jest następujący:&lt;br /&gt;
&lt;br /&gt;
1) komputer ustawia linię COMMAND [[Gniazdo SIO|portu SIO]];&lt;br /&gt;
&lt;br /&gt;
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;&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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ź;&lt;br /&gt;
&lt;br /&gt;
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 (&amp;quot;N&amp;quot;, jak Negative Acknowledge) i na tym transmisja się kończy; jeśli komenda jest urządzeniu znana a parametry prawidłowe, odpowiedzią jest $41 (&amp;quot;A&amp;quot;, jak Acknowledge). Urządzenie musi rozpocząć wysyłanie odpowiedzi w czasie od 0 do 16 msec. od skasowania linii COMMAND przez komputer;&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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 (&amp;quot;E&amp;quot;, jak Error); w przeciwnym wypadku przesyłany jest kod $43 (&amp;quot;C&amp;quot;, jak Complete); na tym transmisja się kończy.&lt;br /&gt;
&lt;br /&gt;
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 (&amp;quot;E&amp;quot;, jak Error); w przeciwnym wypadku przesyłany jest kod $43 (&amp;quot;C&amp;quot;, 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.&lt;br /&gt;
&lt;br /&gt;
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 (&amp;quot;A&amp;quot;) 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 (&amp;quot;N&amp;quot;) 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 &amp;quot;C&amp;quot; lub &amp;quot;E&amp;quot; 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 &amp;quot;A&amp;quot;). Rozpoczęcie przesłania potwierdzenia otrzymania bloku (&amp;quot;A&amp;quot; lub &amp;quot;N&amp;quot;) musi nastąpić w czasie od 850 usec. do 16 msec. po przesłaniu ostatniego bitu bloku danych.&lt;br /&gt;
&lt;br /&gt;
We wszystkich 3 przypadkach transmisja potwierdzenia końcowego (&amp;quot;C&amp;quot; lub &amp;quot;E&amp;quot;) 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 (&amp;quot;A&amp;quot;) (6a, 6b) lub od odebrania ostatniego bitu bloku danych (6c).&lt;br /&gt;
&lt;br /&gt;
Konieczność odebrania bloku danych z urządzenia podczas operacji odczytu, nawet po ustaleniu że operacja została wykonana błędnie (kod &amp;quot;E&amp;quot;) 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).&lt;br /&gt;
&lt;br /&gt;
==== Schemat wymiany danych ====&lt;br /&gt;
&lt;br /&gt;
W fazie oznaczonej jako &amp;#039;&amp;#039;wykonanie&amp;#039;&amp;#039; urządzenie dokonuje niezbędnych czynności (np. stacja dysków wyszukuje żądany sektor na dyskietce i odczytuje go, albo zapisuje), a komputer czeka.&lt;br /&gt;
&lt;br /&gt;
Potwierdzenia przesyłane są bez sum kontrolnych.&lt;br /&gt;
&lt;br /&gt;
===== Tylko komenda =====&lt;br /&gt;
&lt;br /&gt;
* komputer --&amp;gt; komenda 4 B + suma kontrolna --&amp;gt; urządzenie&lt;br /&gt;
* komputer &amp;lt;-- potwierdzenie &amp;#039;A&amp;#039; &amp;lt;-- urządzenie&lt;br /&gt;
* wykonanie&lt;br /&gt;
* komputer &amp;lt;-- potwierdzenie &amp;#039;C&amp;#039; &amp;lt;-- urządzenie&lt;br /&gt;
* koniec&lt;br /&gt;
&lt;br /&gt;
===== Odczyt =====&lt;br /&gt;
&lt;br /&gt;
* komputer --&amp;gt; komenda 4 B + suma kontrolna --&amp;gt; urządzenie&lt;br /&gt;
* komputer &amp;lt;-- potwierdzenie &amp;#039;A&amp;#039; &amp;lt;-- urządzenie&lt;br /&gt;
* wykonanie&lt;br /&gt;
* komputer &amp;lt;-- potwierdzenie &amp;#039;C&amp;#039; &amp;lt;-- urządzenie&lt;br /&gt;
* komputer &amp;lt;-- blok danych + suma kontrolna &amp;lt;-- urządzenie&lt;br /&gt;
* koniec&lt;br /&gt;
&lt;br /&gt;
===== Zapis =====&lt;br /&gt;
&lt;br /&gt;
* komputer --&amp;gt; komenda 4 B + suma kontrolna --&amp;gt; urządzenie&lt;br /&gt;
* komputer &amp;lt;-- potwierdzenie &amp;#039;A&amp;#039; &amp;lt;-- urządzenie&lt;br /&gt;
* komputer --&amp;gt; blok danych + suma kontrolna --&amp;gt; urządzenie&lt;br /&gt;
* komputer &amp;lt;-- potwierdzenie &amp;#039;A&amp;#039; &amp;lt;-- urządzenie&lt;br /&gt;
* wykonanie&lt;br /&gt;
* komputer &amp;lt;-- potwierdzenie &amp;#039;C&amp;#039; &amp;lt;-- urządzenie&lt;br /&gt;
* koniec&lt;br /&gt;
&lt;br /&gt;
===== Zapis i odczyt =====&lt;br /&gt;
&lt;br /&gt;
* komputer --&amp;gt; komenda 4 B + suma kontrolna --&amp;gt; urządzenie&lt;br /&gt;
* komputer &amp;lt;-- potwierdzenie &amp;#039;A&amp;#039; &amp;lt;-- urządzenie&lt;br /&gt;
* komputer --&amp;gt; blok danych + suma kontrolna --&amp;gt; urządzenie&lt;br /&gt;
* komputer &amp;lt;-- potwierdzenie &amp;#039;A&amp;#039; &amp;lt;-- urządzenie&lt;br /&gt;
* wykonanie&lt;br /&gt;
* komputer &amp;lt;-- potwierdzenie &amp;#039;C&amp;#039; &amp;lt;-- urządzenie&lt;br /&gt;
* komputer &amp;lt;-- blok danych + suma kontrolna &amp;lt;-- urządzenie&lt;br /&gt;
* koniec&lt;br /&gt;
&lt;br /&gt;
==== Magnetofon ====&lt;br /&gt;
&lt;br /&gt;
Powyższe schematy dotyczą wszystkich urządzeń SIO za wyjątkiem magnetofonu. Magnetofon nie zawiera w sobie mikroprocesora, jest urządzeniem &amp;quot;nieinteligentnym&amp;quot;. 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.&lt;br /&gt;
&lt;br /&gt;
== Rozszerzenia SIO ==&lt;br /&gt;
&lt;br /&gt;
=== Systemy turbo do stacji dysków ===&lt;br /&gt;
&lt;br /&gt;
Standardowa szybkość wymiany danych ze stacją dysków - 19200 bps - szybko okazała się dalece niewystarczająca. Ponieważ, jak napisano powyżej, możliwości układu [[POKEY]] pozwalają uzyskać znacznie więcej, wkrótce powstało kilka, różnych niestety, [[Systemy Turbo|systemów &amp;quot;turbo&amp;quot;]].&lt;br /&gt;
&lt;br /&gt;
=== Rozszerzone adresowanie sektorów (KMK/JŻ IDE) ===&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
=== Rozszerzone adresowanie pamięci (65C816) ===&lt;br /&gt;
&lt;br /&gt;
[[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.&lt;br /&gt;
&lt;br /&gt;
== Zobacz też ==&lt;br /&gt;
&lt;br /&gt;
* [http://www.atariarchives.org/dere/ De Re Atari]&lt;br /&gt;
* [[Obsługa protokołu SIO przez urządzenie peryferyjne]]&lt;br /&gt;
* [[Użycie sterownika dyskowego]]&lt;br /&gt;
&lt;br /&gt;
== Bibliografia ==&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;[http://ftp.pigwa.net/stuff/collections/nir_dary_cds/Tech%2520Info/SIOSPECS.PDF Atari Home Computer System: Serial Input Output Interface, User&amp;#039;s Handbook]&amp;#039;&amp;#039;&lt;br /&gt;
* Harry B. Stewart, &amp;#039;&amp;#039;[http://www.atarimuseum.com/ahs_archives/archives/pdf/computers/8bits/1200XL/sweet-16_OS.pdf Z800/Sweet 16 Operating System, External Reference Specification]&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
[[Kategoria:Menu Główne]]&lt;br /&gt;
[[Kategoria:Programowanie Atari 8-bit]]&lt;br /&gt;
&lt;/div&gt;</summary>
		<author><name>imported&gt;Atariki recovery</name></author>
	</entry>
</feed>