Użycie sterownika dyskowego

From Atariki

(Różnice między wersjami)
Jump to: navigation, search
Wersja z dnia 21:20, 11 mar 2025
Mono (Dyskusja | wkład)
(Odczyt sektora - link do błędów)
← Previous diff
Wersja z dnia 07:15, 12 mar 2025
Mono (Dyskusja | wkład)
(kosmetyka)
Next diff →
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 47: Linia 47:
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),
 +* 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 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. 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.
Linia 74: Linia 77:
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ę [[Kody statusowe Atari OS|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).
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).

Wersja z dnia 07:15, 12 mar 2025

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 BOOT:

  • DSCTLN inicjalizowany jest wartością $80 odpowiadającą rozmiarowi boot-sektorów (1-3),
  • natomiast DSKTIM kopiowany jest z bloku DVSTAT ($2EA) po pobraniu statusu stacji dysków.

Operacje te wykonywane są na napędzie 1.

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.

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).

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).

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