<?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=U%C5%BCycie_sterownika_dyskowego</id>
	<title>Użycie sterownika dyskowego - 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=U%C5%BCycie_sterownika_dyskowego"/>
	<link rel="alternate" type="text/html" href="https://mirror.atariki.pl/w/index.php?title=U%C5%BCycie_sterownika_dyskowego&amp;action=history"/>
	<updated>2026-10-03T17:04:08Z</updated>
	<subtitle>Historia wersji tej strony wiki</subtitle>
	<generator>MediaWiki 1.46.0</generator>
	<entry>
		<id>https://mirror.atariki.pl/w/index.php?title=U%C5%BCycie_sterownika_dyskowego&amp;diff=4080&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=U%C5%BCycie_sterownika_dyskowego&amp;diff=4080&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;W haśle [[SIO]] opisano [[SIO#Struktura DCB|blok kontroli urządzeń]] i uniwersalny sposób niskopoziomowej komunikacji z dowolnym urządzeniem podłączonym do Atari za pośrednictwem [[Gniazdo SIO|szyny szeregowej]] oraz [[PBI|szyny równoległej]].&lt;br /&gt;
&lt;br /&gt;
Firma Atari umieściła w systemie operacyjnym również procedurę pozwalającą na komunikację specjalnie ze stacją dysków oraz zdefiniowała w [[Tablica skoków|tablicy skoków]] pod adresem $E453 oficjalny skok DSKINV (JDSKINT).&lt;br /&gt;
&lt;br /&gt;
Przed jej wywołaniem wystarczy ustawić w zmiennych systemowych tylko niezbędne informacje, a na ich podstawie sterownik uzupełni brakujące pola DCB i sam wywoła SIOV ($E459), zaś po powrocie zaktualizuje zmienne systemowe zależnie od rodzaju operacji.&lt;br /&gt;
Status wykonania zachowywany jest w DSTATS i dodatkowo zwracany w rejestrze Y, a znacznik procesora N=1 oznacza wystąpienie błędu.&lt;br /&gt;
&lt;br /&gt;
== Zmienne systemowe ==&lt;br /&gt;
&lt;br /&gt;
Sterownik wykorzystuje następujące zmienne systemowe:&lt;br /&gt;
&lt;br /&gt;
* DSKTIM ($246) - timeout dla operacji formatowania,&lt;br /&gt;
* DSCTLN ($2D5,$2D6) - wielkość sektora,&lt;br /&gt;
&lt;br /&gt;
a poza tym DCOMND ($302) z bloku kontroli urządzeń, do ustawienia zmiennych DCB:&lt;br /&gt;
&lt;br /&gt;
* rodzaju urządzenia DDEVIC ($300) na kod stacji dysków $31,&lt;br /&gt;
* rodzaju operacji DSTATS ($303),&lt;br /&gt;
* czasu oczekiwania na wykonanie operacji DTIMLO ($306),&lt;br /&gt;
* rozmiaru bufora DBYT ($308,$309).&lt;br /&gt;
&lt;br /&gt;
Poza tym zależnie od kodu wykonywanej operacji ustawiane są dodatkowe zmienne opisane w dalszych sekcjach.&lt;br /&gt;
&lt;br /&gt;
Status wykonanej operacji dostępny jest w DSTATS ($303).&lt;br /&gt;
&lt;br /&gt;
Obydwie zmienne DSCTLN i DSKTIM ustawiane są w trakcie procedury RESET podczas inicjalizacji sterownika dyskowego:&lt;br /&gt;
&lt;br /&gt;
* DSCTLN zapisywany jest wartością $0080 odpowiadającą rozmiarowi boot-sektorów (1-3),&lt;br /&gt;
* natomiast DSKTIM wartością $A0 odpowiadającą z grubsza 180 sekundom.&lt;br /&gt;
&lt;br /&gt;
Dalej podczas procedury BOOT następuje próba pobrania statusu napędu dyskowego nr 1 i w przypadku zakończenia operacji powodzeniem DSKTIM kopiowany jest z [[SIO#Stacja dysków|bloku DVSTAT]] ($2EA).&lt;br /&gt;
&lt;br /&gt;
== Operacje ==&lt;br /&gt;
&lt;br /&gt;
Sterownik dyskowy obsługuje tylko podstawowe operacje&lt;br /&gt;
&lt;br /&gt;
* $21 &amp;#039;!&amp;#039; - FORMAT DISK&lt;br /&gt;
* $50 &amp;#039;P&amp;#039; - PUT SECTOR without verification&lt;br /&gt;
* $52 &amp;#039;R&amp;#039; - READ SECTOR&lt;br /&gt;
* $53 &amp;#039;S&amp;#039; - READ STATUS&lt;br /&gt;
* $57 &amp;#039;W&amp;#039; - WRITE SECTOR with verification&lt;br /&gt;
&lt;br /&gt;
[[Lista komend SIO według funkcji|Każda inna operacja]] powinna być wykonywana po samodzielnym ustawieniu parametrów DCB i użyciu procedury SIOV $E459.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;UWAGA!&amp;#039;&amp;#039;&amp;#039; Sterownik dyskowy tak naprawdę potraktuje każdy rozkaz prócz &amp;#039;!&amp;#039; ($21), &amp;#039;P&amp;#039; ($50), &amp;#039;S&amp;#039; ($53) i &amp;#039;W&amp;#039; ($57) jako odczyt sektora i ustawi DCB tak, jakby to był rozkaz &amp;#039;R&amp;#039; ($52).&lt;br /&gt;
&lt;br /&gt;
== Status dysku ==&lt;br /&gt;
&lt;br /&gt;
Odczyt statusu napędu dyskietek wymaga jedynie podania jego numeru w DUNIT:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  lda #1&lt;br /&gt;
  sta DUNIT&lt;br /&gt;
  lda #&amp;#039;S&amp;#039;&lt;br /&gt;
  sta DCOMND&lt;br /&gt;
  jsr DSKINV&lt;br /&gt;
  bmi error&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sterownik ustawi:&lt;br /&gt;
&lt;br /&gt;
* DSTATS na odczyt ($40),&lt;br /&gt;
* DBYT na $0004,&lt;br /&gt;
* DBUF na adres [[SIO#Blok statusu|bloku statusu]] DVSTAT $02EA,&lt;br /&gt;
* w DTIMLO zaś znajdzie się wartość $07 odpowiadająca mniej więcej siedmiu sekundom.&lt;br /&gt;
&lt;br /&gt;
4-bajtowy blok statusu zostanie odczytany do [[SIO#Stacja dysków|bufora DVSTAT]] z którego 3-ci bajt oznaczający czas wykonania najdłuższej komendy (domyślnie jest to formatowanie dysku) przepisywany jest do DSKTIM.&lt;br /&gt;
&lt;br /&gt;
== Odczyt sektora ==&lt;br /&gt;
&lt;br /&gt;
Przed wykonaniem procedury należy podać:&lt;br /&gt;
&lt;br /&gt;
* adres bufora w DBUF,&lt;br /&gt;
* numer napędu dyskietek w DUNIT,&lt;br /&gt;
* numer sektora w DAUX,&lt;br /&gt;
* wielkość sektora w DSCTLN.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  lda #1&lt;br /&gt;
  sta DUNIT&lt;br /&gt;
  lda #&amp;#039;R&amp;#039;&lt;br /&gt;
  sta DCOMND&lt;br /&gt;
  ldx #&amp;amp;lt;buffer&lt;br /&gt;
  ldy #&amp;amp;gt;buffer&lt;br /&gt;
  stx DBUF&lt;br /&gt;
  sty DBUF+1&lt;br /&gt;
  ldx #&amp;amp;lt;sector&lt;br /&gt;
  ldy #&amp;amp;gt;sector&lt;br /&gt;
  stx DAUX1&lt;br /&gt;
  sty DAUX2&lt;br /&gt;
  jsr DSKINV&lt;br /&gt;
  bmi error&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sterownik ustawi:&lt;br /&gt;
&lt;br /&gt;
* DSTATS na odczyt ($40),&lt;br /&gt;
* DBYT na DSCTLN,&lt;br /&gt;
* w DTIMLO natomiast znajdzie się wartość $07 odpowiadająca mniej więcej siedmiu sekundom.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;UWAGA!&amp;#039;&amp;#039;&amp;#039; Po wykonaniu operacji w buforze znajdzie się zawartość żądanego sektora nawet wtedy, gdy operacja zakończy się [[Kody statusowe Atari OS|błędem]] 144 DEVICE DONE ERROR ($90).&lt;br /&gt;
&lt;br /&gt;
== Zapis sektora ==&lt;br /&gt;
&lt;br /&gt;
Przed wykonaniem procedury należy podać:&lt;br /&gt;
&lt;br /&gt;
* adres bufora w DBUF,&lt;br /&gt;
* numer napędu dyskietek w DUNIT,&lt;br /&gt;
* numer sektora w DAUX,&lt;br /&gt;
* wielkość sektora w DSCTLN.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  lda #1&lt;br /&gt;
  sta DUNIT&lt;br /&gt;
  lda #&amp;#039;P&amp;#039;     ;lub &amp;#039;W&amp;#039;&lt;br /&gt;
  sta DCOMND&lt;br /&gt;
  ldx #&amp;amp;lt;buffer&lt;br /&gt;
  ldy #&amp;amp;gt;buffer&lt;br /&gt;
  stx DBUF&lt;br /&gt;
  sty DBUF+1&lt;br /&gt;
  ldx #&amp;amp;lt;sector&lt;br /&gt;
  ldy #&amp;amp;gt;sector&lt;br /&gt;
  stx DAUX1&lt;br /&gt;
  sty DAUX2&lt;br /&gt;
  jsr DSKINV&lt;br /&gt;
  bmi error&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sterownik ustawi:&lt;br /&gt;
&lt;br /&gt;
* DSTATS na zapis ($80),&lt;br /&gt;
* DBYT na DSCTLN,&lt;br /&gt;
* w DTIMLO natomiast znajdzie się wartość $07 odpowiadająca mniej więcej siedmiu sekundom.&lt;br /&gt;
&lt;br /&gt;
Weryfikacja zapisu sektora leży po stronie stacji dysków i powoduje, że operacja po prostu będzie trwała nieco dłużej.&lt;br /&gt;
&lt;br /&gt;
== Formatowanie dysku ==&lt;br /&gt;
&lt;br /&gt;
Przed wywołaniem sterownika należy:&lt;br /&gt;
&lt;br /&gt;
* w DBUF ustawić adres bufora w którym po wykonaniu operacji znajdą się numery wadliwych sektorów,&lt;br /&gt;
* w DUNIT podać numer napędu dyskietek.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  lda #1&lt;br /&gt;
  sta DUNIT&lt;br /&gt;
  lda #&amp;#039;!&amp;#039;&lt;br /&gt;
  sta DCOMND&lt;br /&gt;
  ldx #&amp;amp;lt;buffer&lt;br /&gt;
  ldy #&amp;amp;gt;buffer&lt;br /&gt;
  stx DBUF&lt;br /&gt;
  sty DBUF+1&lt;br /&gt;
  jsr DSKINV&lt;br /&gt;
  bmi error&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sterownik ustawi:&lt;br /&gt;
&lt;br /&gt;
* DSTATS na odczyt ($40),&lt;br /&gt;
* DBYT na DSCTLN,&lt;br /&gt;
* w DTIMLO natomiast znajdzie się zawartość DSKTIM.&lt;br /&gt;
&lt;br /&gt;
Po wykonaniu komendy w buforze znajdą się przesłane przez stację numery wadliwych sektorów zakończone markerem $FFFF.&lt;br /&gt;
W DBYT zwracana jest długość listy (bez markera).&lt;br /&gt;
&lt;br /&gt;
== Zobacz ==&lt;br /&gt;
&lt;br /&gt;
* [[SIO]]&lt;br /&gt;
* [[Nowe urządzenia]]&lt;br /&gt;
* [[Tablica skoków]]&lt;br /&gt;
&lt;br /&gt;
[[Kategoria:Niezbędnik kodera]]&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>