Użycie sterownika dyskowego
From Atariki
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 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.
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
DSTATS zostanie ustawiony na odczyt ($40), a 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 '!', 'P', 'W' i 'S' jako odczyt sektora i ustawi DCB tak, jakby to był rozkaz 'R'.
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
DSTATS zostanie ustawiony na zapis ($80), a 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
DSTATS jest ustawiany na odczyt ($40), a 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).