Powrót do spisu treści

Rozdział 5

STEROWNIK DYSKOWY

    Komputery Atari do współpracy ze stacją dysków wymagają najpierw wczytania z dyskietki DOS-u (Disk Operating System). Ten powszechny pogląd jest jednak niesłuszny, a dowód na to jest w nim zawarty. Otóż DOS musi być odczytany z dyskietki, a jak to zrobić skoro bez DOS-u nie można.

    System operacyjny musi więc zawierać procedurę pozwalającą na komunikację ze stacją dysków. Procedura ta nazywa się DSKINT i jest dostępna dla użytkownika wyłącznie z poziomu języka maszynowego. Wykorzystuje ona do komunikacji ze stacją dysków blok DCB i procedury SIO (zob. rozdział 4).

    Przed wywołaniem DSKINT w rejestrze DCMND musi zostać umieszczony kod operacji. Podczas odczytu i zapisu sektora rejestry DAUX1 i DAUX2 muszą zawierać numer sektora, a rejestr DBUFA - adres bufora. Podania adresu bufora wymaga także operacja formatowania dyskietki.

    Na początku procedury kod urządzenia jest ustawiany na wartość $31 (stacja dysków numer 1). Oznacza to, że komunikację z inną stacją dysków należy wykonywać przez umieszczenie w akumulatorze jej kodu i wywołanie procedury od adresu DSKINT+2. Następnie ustalana jest wartość Timeout - dla formatowania pobierana jest z rejestru DSKTIM (DiSK TIMeout), a dla pozostałych operacji wynosi $07. Również zawartość rejestru DSTATS zależy od rodzaju operacji: dla zapisu jest ona równa $80, a dla innych operacji - $40.
            0100 ;DiSK INTerface
            0110 ;
            0120 BUFADR = $15
            0130 DBUFA = $0304
            0140 DBYT =  $0308
            0150 DCMND = $0302
            0160 DDEVIC = $0300
            0170 DSCTLN = $02D5
            0180 DSKTIM = $0246
            0190 DSTATS = $0303
            0200 DTIMLO = $0306
            0210 DVSTAT = $02EA
            0220 JSIOINT = $E459
            0230 PUTADR = $C73A
            0240 ;
            0250     *=  $C6B3
            0260 ;
            0270     LDA #$31
            0280     STA DDEVIC
            0290     LDA DSKTIM
            0300     LDX DCMND
            0310     CPX #'!
            0320     BEQ STM
            0330     LDA #$07
            0340 STM STA DTIMLO
            0350     LDX #$40
            0360     LDA DCMND
            0370     CMP #'P
            0380     BEQ WRT
            0390     CMP #'W
            0400     BNE READ
            0410 WRT LDX #$80
            0420 READ CMP #'S
            0430     BNE DSL
            0440     LDA # >DVSTAT
            0450     STA DBUFA
            0460     LDA # <DVSTAT
            0470     STA DBUFA+1
            0480     LDY #$04
            0490     LDA #$00
            0500     BEQ SPM
            0510 DPL LDY DSCTLN
            0520     LDA DSCTLN+1
            0530 SPM STX DSTATS
            0540     STY DBYT
            0550     STA DBYT+1
            0560     JSR JSIOINT
            0570     BPL SUC
            0580     RTS
            0590 SUC LDA DCMND
            0600     CMP #'S
            0610     BNE FRMT
            0620     JSR PUTADR
            0630     LDY #$02
            0640     LDA (BUFADR),Y
            0650     STA DSKTIM
            0660 FRMT LDA DCMND
            0670     CMP #'!
            0680     BNE EXIT
            0690     JSR PUTADR
            0700     LDY #$FE
            0710 LOOP1 INY
            0720     INY
            0730 LOOP2 LDA (BUFADR),Y
            0740     CMP #$FF
            0750     BNE LOOP1
            0760     INY
            0770     LDA (BUFADR),Y
            0780     INY
            0790     CMP #$FF
            0800     BNE LOOP2
            0810     DEY
            0820     DEY
            0830     STY DBYT
            0840     LDA #$00
            0850     STA DBYT+1
            0860 EXIT LDY DSTATS
            0870     RTS
    Odczyt statusu daje w rezultacie czterobajtowy blok informacji, który umieszczany jest w rejestrze DVSTAT. Dla tej operacji jest więc odpowiednio ustawiany adres bufora. Długość bufora dla wszystkich operacji jest pobierana z rejestru DSCTLN (Disk SeCTor LeNgth).

    Po tych czynnościach przygotowawczych wywoływana jest procedura SIOINT, która przeprowadza żądaną operację. Jeżeli zakończy się ona błędem, to DSKINT jest przerywana rozkazem RTS. W przeciwnym przypadku sprawdzany jest jeszcze kod operacji. Gdy nie jest to ani STATUS, ani FORMAT, to po odczytaniu do rejestru Y zawartości DSTATS procedura także się kończy.
            0100 ;PUT ADdRess
            0110 ;
            0120 BUFADR = $15
            0130 DBUFA = $0304
            0140 ;
            0150     *=  $C73A
            0160 ;
            0170     LDA DBUFA
            0180     STA BUFADR
            0190     LDA DBUFA+1
            0200     STA BUFADR+1
            0210     RTS
    Po operacji formatowania dyskietki w buforze umieszczane są numery wadliwych sektorów, a na końcu wpisywane są dwa bajty $FF. Po wywołaniu procedury PUTADR, która przepisuje adres bufora do rejestru BUFADR (BUFfer ADdRess), poszukiwana jest końcowa sekwencja bajtów w buforze. Gdy zostanie ona znaleziona, to do rejestru DBYT zapisywana jest aktualna długość bufora.

    W czasie, gdy powstawał system operacyjny Atari, dyskietki były jeszcze stosunkowo drogie. Stąd zastosowanie takiego sposobu formatowania, który umożliwia korzystanie nawet z uszkodzonych dyskietek. Ponieważ cena dyskietek znacznie się zmniejszyła, to żaden DOS nie wykorzystuje tej możliwości. Przydatność jej okazuje się jednak bardzo duża w przypadku korzystania z twardego dysku. Umożliwia bowiem korzystanie z uszkodzonego dysku, a jego cena jest aktualnie bardzo wysoka (wiosna 1988: twardy dysk 20 MB - około 650,- $).

    Po odczycie statusu także wywoływana jest procedura PUTADR. Następnie trzeci bajt odczytanego statusu oznaczający maksymalny czas wykonywania operacji jest przepisywany do rejestru DSKTIM w celu jego uaktualnienia. Po tym DSKINT się kończy.
Zientara Wojciech: Mapa pamięci Atari XL/XE. Procedury wejścia-wyjścia, SOETO, Warszawa, 1988.