Floppy

Disk-Tester

Mit diesem Programm lassen sich Disketten schneller, komfortabler und schonender auf defekte Sektoren untersuchen, als das mit dem entsprechenden Programm auf der Test/Demodiskette der Fall ist.

Das Programm ist insbesondere bei Verwendung älterer Disketten oder bei Nutzung der Disketten-Rückseite zu empfehlen. Es überprüft in knapp 10 Minuten die gesamte Diskette auf schadhafte Stellen und markiert die eventuell gefundenen unbrauchbaren Sektoren als belegt, so daß sie von der 1541 nicht mehr zur Datenspeicherung verwendet werden. So ist es möglich, auch teilweise beschädigte Disketten noch zur Datenspeicherung heranzuziehen, ohne daß es zu WRITE- oder READ-ERRORS kommt.

Programmbeschreibung:

Nach dem Starten des Programms (siehe Listing) muß man entscheiden, ob man nur die vollen Blocks (durch Lesen) oder alle Blocks (durch Lesen und Beschreiben) testen will, oder ob man die schon bei vorherigen Tests als fehlerhaft erkannten Blocks nach einem VALIDATE wieder belegen will. Danach wird gefragt, ob der Befehl »VALIDATE« an die Floppy gesendet werden soll. Dies ist nur bei Disketten sinnvoll, auf denen die Daten öfters geändert werden und die keine relativen Dateien, ISAM-Dateien oder ähnliche, im Direktzugriff arbeitenden Speicherformate, enthalten. Bei Disketten mit den oben genannten Dateien, von denen man nicht sicher weiß, ob die beschriebenen Blöcke auch in der BAM (Block Availability Map, Sektorbelegungstabelle) als belegt gekennzeichnetsind, sollte die Option »Leere Blocks testen« auf keinen Fall angewandt werden, da sonst Daten verlorengehen können.

Es folgt nach kurzer Lese- und Decodierzeit die symbolische Belegung der Diskette auf dem Bildschirm, auf der die belegten Sektoren als »-« und die nicht belegten als »*« gekennzeichnet sind. Wie kommt es dazu? Nun, jede Spur belegt in der BAM (Spur 18, Block 0, Positionen 4-143) 4 Byte. Zuerst kommt die Anzahl der freien Blöcke auf der Spur, im Programm bezeichnet mit FR$. Dann kommt nacheinander die Belegung der Sektoren 7-0, 15-8 und 23-16. Ein 1-Bit kennzeichnet dabei einen freien Block, ein O-Bit einen besetzten. Dies wird nun in der Routine »Analysieren der BAM«aufgelöst und in B%(T,S) festgehalten, wobei T die Spur und S den Sektor enthält. Die darauffolgende Testroutine beschränkt sich jetzt nur darauf, die Spuren und Sektoren einzeln durchzuzählen und in Abhängigkeit von B%(T,S) und der Variable TS (0, wenn alle, 1, wenn nur volle Blocks getestet werden sollen) entweder den Block zu lesen, oder ihn mit dem einmal aufgefüllten Puffer zu beschreiben. Danach wird der Fehlerkanal auf die Fehlernummer abgefragt, da dies schneller geht, als immer die ganze Fehlermeldung zu holen. Tritt ein Fehler auf, so wird dieser angezeigt und auf dem Monitor als roter Punkt in der BAM markiert. Gleichzeitig wird die Variable FE erhöht. Tritt kein Fehlerauf, so wird die Kennzeichnung für den gerade getesteten Block auf dem Monitor gelöscht. Sind alle Blocks getestet, werden die eventuell vorhandenen defekten Blocks auf der Diskette belegt und in dem Format »Spur,chr$(13),Block,chr$(13)« in dem USR-File ».DISKFEHLER« gespeichert. Das erste Byte entspricht in diesem Fall der Anzahl aller gefundenen Fehler.

Die Routine »Kaputte Blocks belegen« hat nun nichts weiter zu tun, als dieses File zu lesen und die Blocks zu belegen.

Änderungen für andere Computer

Für einen der »großen« CBMs muß die Zeile 135 und sämtliche POKEs in den Zeilen 150 und 470 gelöscht werden, da sie keine Farbdarstellungen besitzen. Die Zeile 140 muß so geändert werden:
140 BI=32768

Für einen VC 20 mit 40-Zeichen-Bildschirm müssen nur die farbgebenden POKEs in Zeile 150, die Strings in Zeile 135 und die Variablen in Zeile 140 angepaßt werden. Für die Besitzer eines VC 20 mit 22-Zeichen-Bildschirm sind größere Änderungen erforderlich, da die BAM nicht angezeigt werden kann und sie sich somit mit einer numerischen Darstellung des Testablaufs zufrieden geben müssen. Es werden die freien und die belegten Blocks sowie der zuletzt getestete Sektor angezeigt. Die Zeilen 140, 470 und 635 ff. müssen vollständig gelöscht werden. Folgende Zeilen müssen geändert werden:
355 PRINTL$T$" BESETZTE BLOCKS:" O$683-FR:-PRINTT$" FREIE BLOCKS": "O$FR;D$D$
450 INPUT#15,F:IFF\<20GOT0480
480 PRINTG$" T: " T;Z$"S;Z$" "U

Zehn Minuten für das Überprüfen einer Diskette mögen zwar immer noch recht lang anmuten, wenn man jedoch bedenkt, wieviel Ärger (READ-ERROR, WRITE-ERROR) ein fehlerhafter Sektor verursachen kann, dann rentiert es sich bestimmt, diese Zeit zu investieren.

(Ulrich Langler/ev)
100 rem*disktester
105 rem*uli lang*
110 rem*talstr.10*
115 rem*8609 bischberg*
120 rem*tel.0951/67389*
125 :
130 l$="{clr}":d$="{down}":u$="{up}":z$="{left}":rem*loeschen,crsr down,crsr up,crsr back*
135 g$="{grn}":o$="{orng}":b$="{lblu}":t$="{cyn}":r$="{lred}":rem*gruen,orange,hellblau,tuerkis,rot*
140 farbspeicher=55296:bildschirmspeicher=1024
145 dimt%(100),s%(100):rem*fehlerhafte blocks*
150 printl$g$d$spc(15)"disktester"d$:poke53280,0:poke53281,0:rem*scwarz*
155 printo$d$"<"b$"a"o$"> alle    blocks testen"
160 printd$"<"b$"b"o$"> belegte blocks testen"
165 printd$"<"b$"k"o$"> kaputte blocks belegen"
170 geta$
175 ifa$="a"thents=1:goto210
180 ifa$="b"thents=0:goto210
185 ifa$="k"then575
190 goto170
195 rem*****************
200 rem*diskette testen*
205 rem*****************
210 dimb%(35,23),f$(8):k$=",":n$=chr$(0):fr=0:fe=0:ft=0
215 fori=0to8:readf$(i):next:rem*fehlermeldungen*
220 gosub610:rem*auf space warten*
225 open15,8,15,"i"
230 printl$"validate? "b$"j/n"
235 geta$
240 ifa$="n"then255
245 ifa$="j"thenprintl$t$d$"validating...":print#15,"v":goto255
250 goto235
255 open3,8,3,"#":iftsthenopen5,8,5,"#"
260 printl$t$"bam wird gelesen         "u$
265 print#15,"u1:"3;0;18;0:get#3,a$,a$,a$
270 ifa$<>chr$(65)thenprintd$"kein dos 2.6 oder 2.5!":goto550
275 get#3,a$
280 rem***********************
285 rem*analysieren der bam  *
287 rem*aufgeloest in b%(t,s)*
290 rem***********************
295 fort=1to35
300   rem*freie blocks,sektor 7-0,sektor 15-8,sektor 23-16*
305   get#3,fr$:fr=fr+asc(fr$+n$):s=0
310   iffrthen320:rem*nicht alle blocks belegt*
315   fors=0to23:b%(t,s)=0:nexts:goto345
320   a=1:get#3,ba$:ba=asc(ba$+n$)
325   fors=stos+7
330     b%(t,s)=(baanda)/a:a=a+a:ft=ft+b%(t,s)
335   nexts
340   ifs<23then320
345 nextt
350 iffr<>ftthenprintl$r$tab(14)"!bam-fehler!":goto550
355 gosub635
360 rem***********************
365 rem*start der testroutine*
370 rem***********************
375 ifts=0thenfr=683-fr:rem*volle blocks*
380 ifts=0then400
385 rem*170=%10101010 , 85=%01010101*
390 print#15,"b-p:"5;1:fori=1to128:print#5,chr$(170)chr$(85);:next
395 rem*puffer braucht nur einmal gefuellt zu werden*
400 fort=1to35:rem*spurzaehler*
405   ift<18thenms=20:goto425
410   ift<25thenms=18:goto425
415   ift<31thenms=17:goto425
420   ms=16
425   fors=0toms:rem*blockzaehler*
430     onts*2+b%(t,s)goto485,435,440
435     print#15,"u1:"3;0;t;s:goto445:rem*block lesen*
440     print#15,"b-w:"5;0;t;s:rem*buffer auf disk schreiben*
445     ao=40*(20-s)+t+3:rem*adressoffset*
450     input#15,f:iff<20thenp=32:goto480
455     iff<29thenf$=f$(f-20):goto465
460     f$=""
465     printr$f;f$" t:"t;z$" s:"s;z$" "u$
470     pokefa+ao,10:p=81+6*b%(t,s):rem*rotes"Q,W"
475     t%(fe)=t:s%(fe)=s:fe=fe+b%(t,s)
480     pokebi+ao,p
485   nexts
490 nextt:close5:close3
495 iffe=0thenprint"      !keine zu belegenden fehler!";:goto550
500 rem*****************************
505 rem*belegen der kaputten blocks*
510 rem*****************************
515 printl$t$" test zuende, belegen und kennzeichnen"
520 printtab(8)"der fehlerhaften blocks"
525 fori=0tofe-1
530   print#15,"b-a:"0;t%(i);s%(i):rem*in bam belegen*
535 next
540 open3,8,3,"@:.diskfehler,u,w":print#3,chr$(fe-1);
545 fori=0tofe-1:print#15,t%(i)chr$(13)s%(i):next
550 close3:close15:end
555 :
560 rem******************************
565 rem*wiederbelegung nach validate*
570 rem******************************
575 gosub610
580 printl$t$"wiederbelegen der schadhaften blocks"
585 open15,8,15,"i":open5,8,5,".diskfehler,u,r"
590 get#5,a$:fe=asc(a$)
595 fori=0tofe:input#5,t%(i),s%(i):printr$"t:"t%(i),"s:"s%(i):next:close5
600 fori=0tofe:print#15,"b-a:"0;t%(i);s%(i):next:close15:end
605 :
610 printl$tab(9)o$"testdiskette  einlegen":printtab(17)"<"b$"space"o$">"
615 geta$:ifa$<>" "then615
620 return
625 :
630 rem*bam darstellen*
635 printl$;
640 fors=20to0step-1
645 printo$s;tab(4);
650   fort=1to35
655     ift<18thenms=20:goto675
660     ift<25thenms=18:goto675
665     ift<31thenms=17:goto675
670     ms=16
675     ifs>msthen690
680     ifb%(t,s)=0thenprintb$"-";:goto690
685     printg$"*";
690   nextt:print
695 nexts:printtab(4);
700 fort=1to35:printright$(str$(t),1);:next
705 print:return
710 rem*fehlermeldungen*
715 data"kein header      ","kein sync char   ","kein block vorh. "
720 data"pruefsumme daten ","bitmusterfehler  ","schreibfehler    "
725 data"schreibschutz    ","pruefsumme header","block zu lang    "
Listing »Disk-Tester«. Bitte beachten Sie die Eingabehinweise auf Seite 6.
PDF Diesen Artikel als PDF herunterladen
Mastodon Diesen Artikel auf Mastodon teilen
← Vorheriger ArtikelNächster Artikel →