Użycie sterownika dyskowego
From Atariki
Wersja z dnia 21:20, 11 mar 2025 Mono (Dyskusja | wkład) (→Odczyt sektora - link do błędów) ← Previous diff |
Wersja z dnia 10:31, 12 mar 2025 Mono (Dyskusja | wkład) 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 21: | Linia 21: | ||
Po wykonaniu procedury status operacji dostępny jest w DSTATS ($303). | Po wykonaniu procedury status operacji dostępny jest w DSTATS ($303). | ||
- | Obydwie zmienne DSCTLN i DSKTIM ustawiane są w trakcie procedury BOOT: | + | Obydwie zmienne DSCTLN i DSKTIM ustawiane są w trakcie procedury RESET podczas inicjalizacji sterownika dyskowego: |
- | * DSCTLN inicjalizowany jest wartością $80 odpowiadającą rozmiarowi boot-sektorów (1-3), | + | * DSCTLN zapisywany jest wartością $0080 odpowiadającą rozmiarowi boot-sektorów (1-3), |
- | * natomiast DSKTIM kopiowany jest z bloku DVSTAT ($2EA) po pobraniu statusu stacji dysków. | + | * natomiast DSKTIM wartością $A0 odpowiadającą z grubsza 180 sekundom. |
- | Operacje te wykonywane są na napędzie 1. | + | 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 [[SIO#Stacja dysków|bloku DVSTAT]] ($2EA). |
= Operacje = | = Operacje = | ||
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), | |
- | 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. | + | * 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 [[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 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 10:31, 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 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.
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).