WERYFIKATOR DYSKIETEKProgram, którego listing jest zamieszczony poniżej, naprawia uszkodzone dyskietki (pojęcie "uszkodzone" nie oznacza fizycznego defektu nośnika, np. jego rozmagnesowanie, złamanie dyskietki itp., tylko nieprawidłowe zapisanie danych) oraz odzyskuje skasowane pliki, jeżeli jest to jeszcze możliwe. Użytkownicy DOS-u 2.5 wiedzą zapewne o programie DISKFIX.COM weryfikującym dyskietki i odtwarzającym skasowane przypadkowo pliki (jeśli tego chcemy). Ale jest to program wymagający wywołania z programu DUP.SYS (czyli trudnego we współżyciu firmowego Command Processora DOS-u 2.5), poza tym jest bezsilny wobec dyskietek sformatowanych w podwójnej gęstości (sektory zawierające 256 bajtów danych). WERYFIKATOR DYSKOWYPo uruchomieniu programu musimy zaczekać na umieszczenie danych programu maszynowego na szóstej stronie pamięci. Następnie program zażąda od nas dyskietki przeznaczonej do weryfikacji i po jej włożeniu, naciśnięcia dowolnego klawisza (oprócz klawisza ESC, który zawsze powoduje przerwanie programu). Po wczytaniu sektorów zawierających katalog dyskowy zostaną wyświetlone nazwy skasowanych plików (o ile takie są) wraz z odpowiadającymi im numerami. Jeżeli żadnego pliku nie chcemy odkasowywać, to naciskamy klawisz RETURN nie podając liczby. Etap pytania o pliki przeznaczone do odzyskania można ominąć, zmieniając wiersz 29 na 29 UNERASE=0. Potem program przystąpi do zweryfikowania dyskietki, informując o występujących błędach i źle zbudowanych plikach. O zakończeniu tego procesu poinformuje nas odpowiednim komunikatem. Program korzysta z komórek 208 i 209 na stronie zerowej. Życzę wszystkim użytkownikom stacji dysków "małego Atari" jak najrzadszego korzystania z programu WERYFIKATOR DYSKOWY. ZNACZENIE ZMIENNYCH:DENSITY - zmienna informująca o gęstości sformatowania dysku DIR - zmienna używana w pętli przy odczycie i zapisie katalogu DIR$ - zmienna zawierająca katalog dyskowy, LENGTH - długość pliku w sektorach, LOCKSEC - adres procedury zabezpieczenia sektora przed ponownym zapisem, wywołanie poprzez podanie numeru sektora i adresu zmiennej zawierającej mapę bitową dysku (VTOC$) jako parametrów, PLIK - numer pliku, Q - zmienna używana w pętlach, RSECTOR - adres procedury czytania sektora, wywołuje się ją poprzez podanie numeru sektora i gęstości jako parametrów, S - zmienna pomocnicza do przechowywania numeru sektora, SEKTOR -numer sektora, SETDEN - adres procedury ustalającej gęstość zapisu dyskietki, SIZE - rozmiar sektora, np. 253 dla sektorów 256 bajtowych, STAT - status pliku, TEMP, TMP1-3 - zmienne pomocnicze, UNERASE - zmienna odpowiedzialna za wykonanie procedury odzyskania pliku, jeżeli jest równa 0 procedura nie wywoła się, VTOC$ - zmienna zawierająca mapę bitową dysku, WSECTOR - adres procedury zapisu sektora, wywołanie jak w przypadku RSECTOR, XCHNG$ - zmienna zawierająca część kodu maszynowego. 10 REM ....................... 11 REM | | 12 REM | WERYFIKATOR DYSKOWY | 13 REM | | 14 REM | autor: L. Pasternak | 15 REM | | 16 REM ....................... 19 REM Inicjalizacja procedur maszynow ych 20 GRAPHICS 0:PRINT :PRINT "Zaczekaj c hwile ..." 29 UNERASE=1 30 BUFOR=1024:SETDEN=1536:RSECTOR=1539 :WSECTOR=1542:LOCKSEC=1545:UNLOCK=1548 :DIM VTOC$(144),DIR$(1024),XCHNG$(15) 40 FOR Q=1 TO 14:READ DANA:XCHNG$(Q,Q) =CHR$(DANA):NEXT Q 41 DATA 104,104,104,72,74,74,133,208,1 04,41,3,133,209,96 50 FOR Q=1536 TO 1791:READ DANA:POKE Q ,DANA:NEXT Q 55 REM Wywolanie polskich liter 56 GOSUB 2000 60 DATA 76,43,6,76,126,6,76,122,6,76,1 77,6,76,207,6,169,4,141,5,3,169,0,141, 4,3,169,83,141,2,3,169,4,32,86,6,169 62 DATA 0,141,9,3,76,89,228,32,15,6,48 ,30,173,0,4,162,192,41,32,208,9,162,0, 173,0,4,48,2,162,128,160,1,138,16,7 64 DATA 160,0,10,16,2,160,3,132,208,16 9,0,133,209,104,96,141,8,3,169,49,141, 0,3,169,128,174,2,3,224,80,240,5,224 66 DATA 87,240,1,74,141,3,3,169,224,14 1,6,3,169,1,141,1,3,96,160,80,208,2,16 0,82,104,169,0,162,4,142,5,3,140,2 68 DATA 3,141,4,3,104,141,11,3,104,141 ,10,3,104,104,74,74,169,0,42,141,9,3,7 4,106,73,128,32,86,6,32,89,228,169,0 70 DATA 133,209,132,208,96,104,104,133 ,209,104,133,208,32,232,6,73,255,170,1 04,133,209,104,133,208,152,24,105,10 72 DATA 168,138,49,208,145,208,96,104, 104,133,209,104,133,208,32,232,6,152,2 4,105,10,168,104,133,209,104,133,208 74 DATA 17,208,144,228,165,208,41,7,17 0,165,209,160,5,6,208,42,136,208,250,1 68,169,0,56,106,202,16,252,96 99 REM Ustalenie gestosci zapisu dyski etki 100 PRINT CHR$(125):POSITION 12,5:PRIN T "WERYFIKATOR DYSKOWY";:POSITION 3,8: PRINT "Po włożeniu dyskietki"; 110 PRINT " przeznaczonej":PRINT " do weryfikacji naciśnij klawisz ..." 115 GOSUB 900 120 DENSITY=USR(SETDEN) 125 IF PEEK(208)>127 THEN PRINT :PRINT "Wystąpił błąd numer ";PEEK(208):PRIN T :END 130 REM DENSITY=0 - gestosc pojedyncza , DENSITY=1 - zwiekszona gestosc, DENS ITY=3 - gestosc podwojna 139 REM Wczytanie katalogu dyskowego 140 PRINT :PRINT "Wczytuję katalog dys kowy ..." 150 FOR DIR=0 TO 7:SEKTOR=361+DIR:I=US R(RSECTOR,SEKTOR,DENSITY):IF PEEK(208) >127 THEN GOTO 160 155 FOR Q=0 TO 127:DIR$(LEN(DIR$)+1)=C HR$(PEEK(BUFOR+Q)):NEXT Q:NEXT DIR:PLI K=0:GOTO 163 160 PRINT "Błąd odczytu katalogu dysku ...":END 162 REM Procedura odzyskania skasowane go pliku 163 IF UNERASE<>0 THEN GOSUB 500 165 PRINT CHR$(125):POSITION 8,5:PRINT "Dysk jest weryfikowany ...":PRINT :P RINT :DENSITY=PEEK(208):SIZE=125 167 IF DENSITY=3 THEN SIZE=253 170 FOR Q=0 TO 143:VTOC$(LEN(VTOC$)+1) =CHR$(255):NEXT Q 174 REM Dane do nowej mapy bitowej dys kietki 175 DATA 2,0,47,195,0,1,2,0,0,195,0,0, 2,15,0,0,255,0 179 REM Utworzenie nowej mapy bitowej dysku 180 RESTORE 175:TMP1=1:TMP2=7:TMP3=139 :FOR LOOP=5 TO 0 STEP -1 190 READ A:VTOC$(TMP1,TMP1)=CHR$(A):TM P1=TMP1+1:READ A:VTOC$(TMP2,TMP2)=CHR$ (A):TMP2=TMP2+1:READ A 195 VTOC$(TMP3,TMP3)=CHR$(A):TMP3=TMP3 +1:NEXT LOOP 200 VTOC$(101,101)=CHR$(127):VTOC$(57, 57)=CHR$(127):VTOC$(56,56)=CHR$(0) 205 IF DENSITY=1 THEN VTOC$(3,3)=CHR$( 3):VTOC$(2,2)=CHR$(242) 209 REM Poczatek weryfikacji pliku 210 STAT=ASC(DIR$(PLIK*16+1,PLIK*16+1) ):LENGTH=0:GOTO 220 211 REM Dyskietke zweryfikowano 212 IF PLIK<64 THEN GOTO 214 213 FOR Q=BUFOR+128 TO BUFOR+255:POKE Q,0:NEXT Q:GOSUB 1000:PRINT :PRINT "Cz y nast.pna dyskietka ?";:GOSUB 700:RUN 214 IF STAT=0 THEN PLIK=64:GOTO 212:RE M STAT=0 oznacza koniec plikow w katal ogu dyskowym 216 IF STAT=67 THEN PRINT "Plik otwart y do zapisu. Kasuję go ...":DIR$(PLIK* 16+1,PLIK*16+1)=CHR$(128) 218 PRINT "Plik ";DIR$(PLIK*16+6,PLIK* 16+16);" jest nieaktywny !":PLIK=PLIK+ 1:GOTO 210:REM Plik jest skasowany 220 IF NOT (STAT=66 OR STAT=3 OR STAT =98 OR STAT=35) THEN GOTO 212 229 REM Ustalenie numeru pierwszego se ktora pliku 230 SEKTOR=ASC(DIR$(PLIK*16+4,PLIK*16+ 4))+256*ASC(DIR$(PLIK*16+5,PLIK*16+5)) 235 IF (SEKTOR>1024 OR (DENSITY<>1 AND SEKTOR>720)) THEN GOTO 280 240 PRINT "Weryfikuję plik ";DIR$(PLIK *16+6,PLIK*16+16) 250 I=USR(RSECTOR,SEKTOR,DENSITY):IF P EEK(208)>127 THEN GOTO 125 260 LENGTH=LENGTH+1:I=USR(ADR(XCHNG$), PEEK(BUFOR+SIZE)):REM Zmienna LENGTH o znacza dlugosc pliku w sektorach 270 IF PEEK(208)=PLIK THEN GOTO 300 280 IF LENGTH<2 THEN PRINT "Zły sektor początkowy. Plik kasuję.":DIR$(PLIK*1 6+1,PLIK*16+1)=CHR$(128) 285 IF LENGTH<2 THEN PLIK=PLIK+1:GOTO 210 289 I=USR(RSECTOR,LAST,DENSITY):IF PEE K(208)>127 THEN GOTO 125 290 PRINT "Zła kontynuacja zbioru. Pli k skracam":POKE BUFOR+SIZE+1,0:POKE BU FOR+SIZE,PLIK*4 294 I=USR(WSECTOR,LAST,DENSITY):IF PEE K(208)>127 THEN GOTO 125 295 LENGTH=LENGTH-1:GOTO 400 296 I=USR(LOCKSEC,SEKTOR,ADR(VTOC$)):T MP=4:IF SEKTOR>719 THEN TMP=139 297 IF ASC(VTOC$(TMP,TMP))>0 THEN VTOC $(TMP,TMP)=CHR$(ASC(VTOC$(TMP,TMP))-1) :GOTO 285 298 VTOC$(TMP,TMP)=CHR$(255):VTOC$(TMP +1,TMP+1)=CHR$(ASC(VTOC$(TMP+1,TMP+1)) -1):GOTO 285 299 REM Zabezpieczenie sektora w bitow ej mapie dysku 300 S=PEEK(209)*256+PEEK(BUFOR+SIZE+1) :I=USR(LOCKSEC,SEKTOR,ADR(VTOC$)):TMP= 4:IF SEKTOR>719 THEN TMP=139 305 IF ASC(VTOC$(TMP,TMP))>0 THEN VTOC $(TMP,TMP)=CHR$(ASC(VTOC$(TMP,TMP))-1) :GOTO 307 306 VTOC$(TMP,TMP)=CHR$(255):VTOC$(TMP +1,TMP+1)=CHR$(ASC(VTOC$(TMP+1,TMP+1)) -1) 307 LAST=SEKTOR:SEKTOR=S:IF SEKTOR=0 T HEN GOTO 400 310 I=USR(RSECTOR,SEKTOR,DENSITY):IF P EEK(208)>127 THEN GOTO 125 320 GOTO 260 399 REM Zapamietanie dlugosci pliku i przejscie do weryfikacji kolejnego pli ku 400 DIR$(PLIK*16+2,PLIK*16+2)=CHR$(LEN GTH-INT(LENGTH/256)):DIR$(PLIK*16+3,PL IK*16+3)=CHR$(INT(LENGTH/256)) 410 PLIK=PLIK+1:GOTO 210 499 REM Odkasowanie pliku 500 PRINT :PRINT "Pliki skasowane:":TE MP=0 510 IF ASC(DIR$(PLIK*16+1,PLIK*16+1))= 128 THEN PRINT PLIK;"> ";DIR$(PLIK*16+ 6,PLIK*16+16):TEMP=1 520 IF ASC(DIR$(PLIK*16+1,PLIK*16+1))= 0 THEN GOTO 539 530 PLIK=PLIK+1:GOTO 510 539 IF TEMP=0 THEN PRINT "Brak skasowa nych plików ...":PLIK=0:FOR Q=1 TO 400 :NEXT Q:RETURN 540 IF TEMP=1 THEN PRINT "Podaj numer pliku do odzyskania: "; 541 IF PEEK(764)=255 THEN GOTO 541 542 IF PEEK(764)=28 THEN END 543 IF PEEK(764)=12 THEN POKE 764,255: PLIK=0:RETURN 544 INPUT PLIK 560 IF (PLIK<0 OR PLIK>63) THEN PLIK=0 :RETURN 570 DIR$(PLIK*16+1,PLIK*16+1)=CHR$(66) :PLIK=0:RETURN 699 REM Procedura pytania o weryfikacj e nastepnej dyskietki 700 POKE 764,255 710 IF PEEK(764)=255 THEN GOTO 710 720 IF PEEK(764)=45 OR PEEK(764)=12 TH EN POKE 764,255:RETURN :REM Wartosc 45 oznacza litere T 730 POKE 764,255:PRINT CHR$(125):NEW : END 899 REM Czekanie na nacisniecie dowoln ego klawisza, ESC konczy program 900 POKE 764,255 910 IF PEEK(764)=255 THEN GOTO 910 920 IF PEEK(764)=28 THEN POKE 764,255: END 930 POKE 764,255:RETURN 999 REM Zapis na dyskietce katalogu dy skowego 1000 FOR DIR=0 TO 7:SEKTOR=361+DIR:FOR Q=1 TO 128:POKE BUFOR+Q-1,ASC(DIR$(DI R*128+Q,DIR*128+Q)):NEXT Q 1010 I=USR(WSECTOR,SEKTOR,DENSITY):IF PEEK(208)>127 THEN GOTO 125 1020 NEXT DIR:FOR Q=1 TO 128:POKE BUFO R+Q-1,ASC(VTOC$(Q+16,Q+16)):NEXT Q 1024 REM Zapis bitowej mapy dysku 1025 IF DENSITY=1 THEN I=USR(WSECTOR,1 024,DENSITY) 1030 IF PEEK(208)>127 THEN GOTO 125 1040 FOR Q=1 TO 101:POKE BUFOR+Q-1,ASC (VTOC$(Q,Q)):NEXT Q:FOR Q=1 TO 28:POKE BUFOR+99+Q,0:NEXT Q 1043 I=USR(WSECTOR,360,DENSITY) 1045 IF PEEK(208)>127 THEN GOTO 125 1050 PRINT :PRINT " Dyskietka jest z weryfikowana !!!":RETURN 1999 REM Generator polskich liter 2000 CHB=(PEEK(106)-8)*256 2010 FOR I=0 TO 1023:POKE CHB+I,PEEK(5 7344+I):NEXT I:RESTORE 2200 2020 READ A:IF A=-1 THEN POKE 756,CHB/ 256:RETURN 2030 FOR I=0 TO 7:READ B:POKE CHB+A*8+ I,B:NEXT I:GOTO 2020 2200 DATA 65,0,24,60,102,102,126,102,1 2 2210 DATA 67,12,60,102,96,96,102,60,0 2220 DATA 68,0,0,60,102,126,96,60,6 2230 DATA 69,0,126,96,124,96,96,126,12 2240 DATA 70,12,24,126,12,24,48,126,0 2250 DATA 71,12,24,0,126,12,48,126,0 2260 DATA 76,0,96,120,112,224,96,126,0 2270 DATA 77,12,24,0,124,102,102,102,0 2280 DATA 78,24,102,118,126,126,110,10 2,0 2290 DATA 79,12,60,102,102,102,102,60, 0 2300 DATA 80,12,24,0,60,102,102,60,0 2310 DATA 81,0,0,60,6,62,102,62,12 2320 DATA 83,12,60,96,60,6,6,60,0 2330 DATA 86,12,24,0,60,96,96,60,0 2340 DATA 87,12,24,62,96,60,6,124,0 2350 DATA 88,0,24,0,126,12,48,126,0 2360 DATA 90,24,0,126,12,24,48,126,0 2370 DATA 123,0,56,24,28,56,24,60,0 2380 DATA -1 Leon
|