Użycie sterownika dyskowego

From Atariki

(Różnice między wersjami)
Jump to: navigation, search
Wersja z dnia 21:03, 11 mar 2025
Mono (Dyskusja | wkład)
(Zmienne systemowe)
← Previous diff
Aktualna wersja
Mono (Dyskusja | wkład)
(przeniesienie uwagi o READ SECTOR)
Linia 5: Linia 5:
Przed jej wywołaniem wystarczy ustawić w zmiennych systemowych tylko niezbędne informacje, a reszta zostanie uzupełniona przez sterownik. Przed jej wywołaniem wystarczy ustawić w zmiennych systemowych tylko niezbędne informacje, a reszta zostanie uzupełniona przez sterownik.
-Po wykonaniu procedury status operacji zwracany w rejestrze Y, a znacznik procesora N=1 oznacza wystąpienie błędu.+Po wykonaniu procedury status operacji zwracany jest w rejestrze Y, a znacznik procesora N=1 oznacza wystąpienie błędu.
= Zmienne systemowe = = Zmienne systemowe =
Linia 17: Linia 17:
* czasu oczekiwania na wykonanie operacji DTIMLO ($306), * czasu oczekiwania na wykonanie operacji DTIMLO ($306),
* rozmiaru bufora DBYT ($308,$309). * rozmiaru bufora DBYT ($308,$309).
-Poza tym zależnie od kodu wykonywanej operacji ustawiane są dodatkowe zmienne.+Poza tym zależnie od kodu wykonywanej operacji ustawiane są dodatkowe zmienne opisane w dalszych sekcjach.
-Po wykonaniu procedury status wykonania dostępny jest w DSTATS ($303).+Po wykonaniu procedury status operacji dostępny jest w DSTATS ($303).
-Obydwie zmienne DSCTLN i DSKTIM ustawiane są w trakcie procedury BOOT:+Obydwie zmienne DSCTLN i DSKTIM ustawiane są w trakcie procedury RESET podczas inicjalizacji sterownika dyskowego:
-* DSCTLN inicjalizowany jest wartością $80 odpowiadającą rozmiarowi boot-sektorów (1-3),+* DSCTLN zapisywany jest wartością $0080 odpowiadającą rozmiarowi boot-sektorów (1-3),
-* natomiast DSKTIM kopiowany jest z bloku DVSTAT ($2EA) po pobraniu statusu stacji dysków.+* natomiast DSKTIM wartością $A0 odpowiadającą z grubsza 180 sekundom.
-Operacje te wykonywane są na napędzie 1.+Dalej podczas procedury BOOT następuje pobranie statusu napędu dyskowego nr 1 i jeśli stacja jest podłączona, to DSKTIM kopiowany jest z [[SIO#Stacja dysków|bloku DVSTAT]] ($2EA).
= Operacje = = Operacje =
Linia 35: Linia 35:
* $57 'W' - WRITE SECTOR with verification * $57 'W' - WRITE SECTOR with verification
[[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. [[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.
 +
 +'''UWAGA!''' Sterownik dyskowy tak naprawdę potraktuje każdy rozkaz prócz '!' ($21), 'P' ($50), 'S' ($53) i 'W' ($57) jako odczyt sektora i ustawi DCB tak, jakby to był rozkaz 'R' ($52).
== Status dysku == == Status dysku ==
Linia 47: Linia 49:
bmi error bmi error
</pre> </pre>
-Sterownik ustawi DSTATS na odczyt ($40), DBYT na $0004, DBUF na adres [[SIO#Blok statusu|bloku statusu]] DVSTAT $02EA, w DTIMLO zaś znajdzie się wartość $07 odpowiadająca mniej więcej siedmiu sekundom.+Sterownik ustawi:
- +* DSTATS na odczyt ($40),
-4-bajtowy blok statusu zostanie odczytany do 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.+* DBYT na $0004,
 +* DBUF na adres [[SIO#Blok statusu|bloku statusu]] DVSTAT $02EA,
 +* w DTIMLO zaś znajdzie się wartość $07 odpowiadająca mniej więcej siedmiu sekundom.
 +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.
== Odczyt sektora == == Odczyt sektora ==
Linia 74: Linia 79:
bmi error bmi error
</pre> </pre>
-DSTATS zostanie ustawiony na odczyt ($40), a DBYT na DSCTLN, w DTIMLO natomiast znajdzie się wartość $07 odpowiadająca mniej więcej siedmiu sekundom.+Sterownik ustawi:
 +* DSTATS na odczyt ($40),
 +* DBYT na DSCTLN,
 +* w DTIMLO natomiast znajdzie się wartość $07 odpowiadająca mniej więcej siedmiu sekundom.
-'''UWAGA!''' Po wykonaniu operacji w buforze znajdzie się zawartość żądanego sektora nawet wtedy, gdy operacja zakończy się błędem $90 (DEVICE DONE ERROR).+'''UWAGA!''' Po wykonaniu operacji w buforze znajdzie się zawartość żądanego sektora nawet wtedy, gdy operacja zakończy się [[Kody statusowe Atari OS|błędem $90]] (DEVICE DONE ERROR).
- +
-'''UWAGA!''' Sterownik dyskowy tak naprawdę potraktuje każdy rozkaz prócz '!', 'P', 'W' i 'S' jako odczyt sektora i ustawi DCB tak, jakby to był rozkaz 'R'.+
== Zapis sektora == == Zapis sektora ==
Linia 103: Linia 109:
bmi error bmi error
</pre> </pre>
-DSTATS zostanie ustawiony na zapis ($80), a DBYT na DSCTLN, w DTIMLO natomiast znajdzie się wartość $07 odpowiadająca mniej więcej siedmiu sekundom.+Sterownik ustawi:
- +* DSTATS na zapis ($80),
 +* DBYT na DSCTLN,
 +* w DTIMLO natomiast znajdzie się wartość $07 odpowiadająca mniej więcej siedmiu sekundom.
Weryfikacja zapisu sektora leży po stronie stacji dysków i powoduje, że operacja po prostu będzie trwała nieco dłużej. Weryfikacja zapisu sektora leży po stronie stacji dysków i powoduje, że operacja po prostu będzie trwała nieco dłużej.
Linia 124: Linia 132:
bmi error bmi error
</pre> </pre>
-DSTATS jest ustawiany na odczyt ($40), a DBYT na DSCTLN, w DTIMLO natomiast znajdzie się zawartość DSKTIM. +Sterownik ustawi:
 +* DSTATS na odczyt ($40),
 +* DBYT na DSCTLN,
 +* w DTIMLO natomiast znajdzie się zawartość DSKTIM.
Po wykonaniu komendy w buforze znajdą się przesłane przez stację numery wadliwych sektorów zakończone markerem $FFFF. Po wykonaniu komendy w buforze znajdą się przesłane przez stację numery wadliwych sektorów zakończone markerem $FFFF.
W DBYT zwracana jest długość listy (bez markera). W DBYT zwracana jest długość listy (bez markera).
Linia 135: Linia 146:
[[Kategoria:Niezbędnik kodera]] [[Kategoria:Niezbędnik kodera]]
 +[[Kategoria:Programowanie Atari 8-bit]]

Aktualna wersja

W haśle SIO opisano blok kontroli urządzeń i uniwersalny sposób niskopoziomowej komunikacji z dowolnym urządzeniem podłączonym do Atari za pośrednictwem szyny szeregowej oraz szyny równoległej.

Firma Atari umieściła w systemie operacyjnym również procedurę pozwalającą na komunikację specjalnie ze stacją dysków oraz zdefiniowała w tablicy skoków pod adresem $E453 oficjalny skok DSKINV (JDSKINT).

Przed jej wywołaniem wystarczy ustawić w zmiennych systemowych tylko niezbędne informacje, a reszta zostanie uzupełniona przez sterownik.

Po wykonaniu procedury status operacji zwracany jest w rejestrze Y, a znacznik procesora N=1 oznacza wystąpienie błędu.

Spis treści

Zmienne systemowe

Sterownik wykorzystuje następujące zmienne systemowe:

  • DSKTIM ($246) - timeout dla operacji formatowania,
  • DSCTLN ($2D5,$2D6) - wielkość sektora,

a poza tym DCOMND ($302) z bloku kontroli urządzeń, do ustawienia zmiennych DCB:

  • rodzaju urządzenia DDEVIC ($300) na kod stacji dysków $31,
  • rodzaju operacji DSTATS ($303),
  • czasu oczekiwania na wykonanie operacji DTIMLO ($306),
  • rozmiaru bufora DBYT ($308,$309).

Poza tym zależnie od kodu wykonywanej operacji ustawiane są dodatkowe zmienne opisane w dalszych sekcjach.

Po wykonaniu procedury status operacji dostępny jest w DSTATS ($303).

Obydwie zmienne DSCTLN i DSKTIM ustawiane są w trakcie procedury RESET podczas inicjalizacji sterownika dyskowego:

  • DSCTLN zapisywany jest wartością $0080 odpowiadającą rozmiarowi boot-sektorów (1-3),
  • natomiast DSKTIM wartością $A0 odpowiadającą z grubsza 180 sekundom.

Dalej podczas procedury BOOT następuje pobranie statusu napędu dyskowego nr 1 i jeśli stacja jest podłączona, to DSKTIM kopiowany jest z bloku DVSTAT ($2EA).

Operacje

Sterownik dyskowy obsługuje tylko podstawowe operacje

  • $21 '!' - FORMAT DISK
  • $50 'P' - PUT SECTOR without verification
  • $52 'R' - READ SECTOR
  • $53 'S' - READ STATUS
  • $57 'W' - WRITE SECTOR with verification

Każda inna operacja powinna być wykonywana po samodzielnym ustawieniu parametrów DCB i użyciu procedury SIOV $E459.

UWAGA! Sterownik dyskowy tak naprawdę potraktuje każdy rozkaz prócz '!' ($21), 'P' ($50), 'S' ($53) i 'W' ($57) jako odczyt sektora i ustawi DCB tak, jakby to był rozkaz 'R' ($52).

Status dysku

Odczyt statusu napędu dyskietek wymaga jedynie podania jego numeru w DUNIT:

  lda #1
  sta DUNIT
  lda #'S'
  sta DCOMND
  jsr DSKINV
  bmi error

Sterownik ustawi:

  • DSTATS na odczyt ($40),
  • DBYT na $0004,
  • DBUF na adres bloku statusu DVSTAT $02EA,
  • w DTIMLO zaś znajdzie się wartość $07 odpowiadająca mniej więcej siedmiu sekundom.

4-bajtowy blok statusu zostanie odczytany do 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.

Odczyt sektora

Przed wykonaniem procedury należy podać:

  • adres bufora w DBUF,
  • numer napędu dyskietek w DUNIT,
  • numer sektora w DAUX,
  • wielkość sektora w DSCTLN.
  lda #1
  sta DUNIT
  lda #'R'
  sta DCOMND
  ldx #<buffer
  ldy #>buffer
  stx DBUF
  sty DBUF+1
  ldx #<sector
  ldy #>sector
  stx DAUX1
  sty DAUX2
  jsr DSKINV
  bmi error

Sterownik ustawi:

  • DSTATS na odczyt ($40),
  • DBYT na DSCTLN,
  • w DTIMLO natomiast znajdzie się wartość $07 odpowiadająca mniej więcej siedmiu sekundom.

UWAGA! Po wykonaniu operacji w buforze znajdzie się zawartość żądanego sektora nawet wtedy, gdy operacja zakończy się błędem $90 (DEVICE DONE ERROR).

Zapis sektora

Przed wykonaniem procedury należy podać:

  • adres bufora w DBUF,
  • numer napędu dyskietek w DUNIT,
  • numer sektora w DAUX,
  • wielkość sektora w DSCTLN.
  lda #1
  sta DUNIT
  lda #'P'     ;lub 'W'
  sta DCOMND
  ldx #<buffer
  ldy #>buffer
  stx DBUF
  sty DBUF+1
  ldx #<sector
  ldy #>sector
  stx DAUX1
  sty DAUX2
  jsr DSKINV
  bmi error

Sterownik ustawi:

  • DSTATS na zapis ($80),
  • DBYT na DSCTLN,
  • w DTIMLO natomiast znajdzie się wartość $07 odpowiadająca mniej więcej siedmiu sekundom.

Weryfikacja zapisu sektora leży po stronie stacji dysków i powoduje, że operacja po prostu będzie trwała nieco dłużej.

Formatowanie dysku

Przed wywołaniem sterownika należy:

  • w DBUF ustawić adres bufora w którym po wykonaniu operacji znajdą się numery wadliwych sektorów,
  • w DUNIT podać numer napędu dyskietek.
  lda #1
  sta DUNIT
  lda #'!'
  sta DCOMND
  ldx #<buffer
  ldy #>buffer
  stx DBUF
  sty DBUF+1
  jsr DSKINV
  bmi error

Sterownik ustawi:

  • DSTATS na odczyt ($40),
  • DBYT na DSCTLN,
  • w DTIMLO natomiast znajdzie się zawartość DSKTIM.

Po wykonaniu komendy w buforze znajdą się przesłane przez stację numery wadliwych sektorów zakończone markerem $FFFF. W DBYT zwracana jest długość listy (bez markera).

Zobacz

Personal tools