Tajemnice ATARI

WERYFIKATOR DYSKIETEK

    Posiadacze stacji dysków doskonale wiedzą, że pliki zapisane na dyskietkach ulegają z różnych powodów destrukcji. Niekiedy zniszczona zostanie bitowa mapa dysku, tzw. VTOC, informująca o wolnych i zajętych sektorach. Jest to powodem nieprawidłowego działania Dyskowego Systemu Operacyjnego i może sprawić, że pisane w pocie czoła programy zostaną skasowane.

   Program, 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 DYSKOWY

jest najprawdopodobniej jedynym programem przeznaczonym do weryfikacji dyskietek w trzech podstawowych gęstościach zapisu: pojedynczej, zwiększonej i podwójnej. Dla poprawnego działania programu nie jest wymagany żaden DOS (!), program będzie działał nawet po wczytaniu z magnetofonu, ale należy pamiętać, że weryfikuje dyskietki zapisane w formacie Atari (DOS 2.5, DOS XL, itd.). Jeżeli dyskietka jest sformatowana inaczej, np. SpartaDOS-em, to najprawdopodobniej pliki zostaną zniszczone.

   Po 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:

BUFOR - adres bufora danych sektora, wymaga długości 256 bajtów
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



Powrót na start | Powrót do spisu treści | Powrót na stronę główną

Pixel 2001