Użycie sterownika dyskowego
From Atariki
←Older revision | Newer revision→
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).