Użycie sterownika dyskowego

From Atariki

(Różnice między wersjami)
Jump to: navigation, search
Wersja z dnia 10:28, 12 mar 2025
Mono (Dyskusja | wkład)
(Zmienne systemowe - reset i boot)
← Previous diff
Aktualna wersja
Mono (Dyskusja | wkład)
(przeniesienie uwagi o READ SECTOR)
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 52: Linia 54:
* DBUF na adres [[SIO#Blok statusu|bloku statusu]] DVSTAT $02EA, * DBUF na adres [[SIO#Blok statusu|bloku statusu]] DVSTAT $02EA,
* w DTIMLO zaś znajdzie się wartość $07 odpowiadająca mniej więcej siedmiu sekundom. * 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 [[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 83: Linia 85:
'''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).
- 
-'''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 == == Zapis sektora ==

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