Rozdział 5STEROWNIK DYSKOWYKomputery 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. |