Powrót do spisu treści |
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 RTSOdczyt 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 RTSPo 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. |