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 "