Użycie sterownika dyskowego

From Atariki

Revision as of 07:15, 12 mar 2025; view current revision
←Older revision | Newer revision→
Jump to: navigation, search

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