Das größere Diskettenformat

Wem ist es wohl noch nicht passiert, Dateien auf eine Diskette kopieren zu wollen und dann plötzlich festzustellen, daß der Platz nicht reicht? Bisher gab’s meist nur zwei Möglichkeiten: Neuformatieren mit größerem Format oder eine zweite Diskette zur Hand zu nehmen.

Dabei handelt es sich meist nur um ein paar KiloBytes. Schöner wäre es doch, wenn die eingelegte Diskette plötzlich mehr Platz hätte! Aber, Neuformatieren hat das Löschen der Dateien zur Folge. Nicht so mit dem hier vorgestellten Diskettenformatierer. Das Programm formatiert einfach zwei unbenutzte Tracks (Nummer 80 und 81) und läßt alle anderen in Ruhe. Damit man über den Platz auch verfügen kann, wird der Bootsektor angepaßt. Das bringt pro Diskettenseite immerhin 10 kB ohne größere Umstände! Das Programm wird gestartet und untersucht ohne weitere Nachfrage die Diskette in Laufwerk A. Ist sie normal formatiert (360 oder 720 kB), werden die zusätzlichen Tracks formatiert, sofern kein Fehler auftritt. Sollte das Format nicht stimmen, wird dies mit einer Fehlermeldung zum Ausdruck gebracht. Das Programm stellt selbst fest, welches Diskettenformat vorliegt. Der Benutzer braucht also nur die passende Diskette in Laufwerk A zu legen und dann das Formatierprogramm zu starten.

In der Kürze liegt die Würze. Das war's schon mit all den Erklärungen! Zum Programm selbst steht noch etwas im (Pascal Plus-)Listing! Ich wünsche Ihnen viel Freude und immer ausreichend Platz auf allen Disketten!

(* Programm FORMAT PLUS *) 
program formatplus;

(* Entwickelt mit ST Pascal Plus 2.0.	*)
(* 16. Dezember 1987 / Dietmar Rabich	*)
(* Literatur; Atari ST Profibuch (Sybex 1987) *)

type buffer_klein = packed array [0..511] of byte; (* 0.5 KByte *)

var bootsekt,filler_k1 : buffer_klein: 
	seiten	:	short_integer;

(* Liest Sektor *)

procedure floprd(var buf,filler : buffer_klein;
		devno,sectno,trackno,sideno,count : short_integer);
	XBI0S(8);

(* Schreibt Sektor *)
procedure flopwr(var buf,filler : buffer_klein;
	devno,sectno,trackno,sideno,count : short_integer);
	XBIOS(9):

(* Formatiert Track 80 und 81 *)
function format (side : short_integer) : boolean;
	type buffer_gross = packed array 10..8191] of byte;
	(* 8 KByte *)

	var i,error_f : short_integer;
	buf,filler : buffer_gross;

	(* Formatiert einen Track *)
	function flopfmt(var buf,filler : buffer_gross;
		devno,spt,trackno,sideno,interlv : short_integer; 
		magic	: long_integer:
		virgin	:	short_integer)
		:short_integer;
	XBIOS(10);

	begin 
		i:=80; 
		repeat
			error_f: =flopfmt (buf, filler, 0,9, i, side, 1 ,$87654321, $0000);
			i:= i+1;
		until (error_f<>0) or (i>=82); 
		format:=(error_f<>0); 
	end;

	(* Fehlerausgabe *) 
	procedure fehler(erg:boolean);

	begin 
		if erg then 
		begin
			writeln('*** Fehler bei Formatiervorgang / falsches Format ***');
			repeat
			until keypress;
			halt
		end;
	end;

(* Hauptprogramm *) 
begin
	writeln('*** Format Plus / (c) Dietmar Rabich ***'); 
	writeln('   (Entwickelt mit ST Pascal Plus 2.00.)'); floprd(bootsekt,filler_kl,0,1,0,0,1); (* Bootsektor lesen *)
	if (bootsekt[19]=$A0) and (bootsekt[20]=$05) then
		(* zweiseitig (720 kB) ? *)
		seiten:=2;
	if (bootsekt[19]=$D0) and (bootsekt[20]=$02) then
		(* einseitig (360 kB) ? *)
		seiten:=1;
	if seiten in [1,2] then 
		begin
			fehler(format(0));	(* formatiere Seite 1 *)
			if seiten=2 then
				fehler(format(1));	(* formatiere Seite 2 *)
			if seiten=2 then	(* neue Bootsektoren *)
			begin
				bootsekt[19]:=$C4; (* 1476 Sektoren insgesamt *) bootsekt[20]:=$05: 
			end 
			else 
			begin
				bootsekt[19]:=$E2; (* 738 Sektoren insgesamt *) 
				bootsekt[20]:=$02;
			end;
			flopwr(bootsekt,filler_kl,0,1,0,0,1); (* Bootsektor schreiben *)
		end
	else
		fehler(true);
end.
(* Programmende *)

Dietmar Rabich
Aus: ST-Computer 07 / 1988, Seite 96

Links

Copyright-Bestimmungen: siehe Über diese Seite