home *** CD-ROM | disk | FTP | other *** search
- {Zweck : Diskcopy von HD-Disketten,
- Mehrfachkopien ohne wechseln;
- Disketten müssen formatiert sein
- und dürfen keine schlechten
- Sektoren enthalten;
- Sprache: Turbo Pascal 6.0
- System : PC AT 286,386,486 unter DOS 3.x}
-
- program doppel {Version 1.0};
- {$A+,G+,I-,V-,R-,L-,D-,B-}
- uses crt,dos;
- const name='DOPPEL.SWP';
- var buff:array[1..40960] of byte;
- i,j,k,se:word;
- f,n :integer;
- dat :file;
- lw :string[2];
- lwnr,run:byte;
- groesse :longint;
-
- procedure ende(c:byte);
- {Swap-Datei löschen-Ende}
- begin
- close(dat);
- erase(dat);
- halt(c)
- end;
-
- procedure weiter(w:integer);
- {Benutzerdialog oder Abbruch}
- var t:char;
- begin
- if w=0 then
- writeln(#10,'QUELL-Diskette in'
- +' ',lw,' einlegen') else
- writeln(#7,w,'. ZIEL-Diskette in'
- +' ',lw,' einlegen');
- writeln('<ESC> Abbruch, sonst'+
- ' andere Taste drücken',#10);
- t:=readkey;
- if t=#27 then ende(0)
- end;
-
- procedure lies(s,a:word);
- {a Sektoren in Buffer direkt schreiben}
- var e:byte;
- begin
- e:=0;
- asm
- mov al,lwnr
- mov cx,a
- mov dx,s
- mov bx,seg buff
- mov ds,bx
- mov bx,offset buff
- int 25h;
- add e,ah
- end;
- if e<>0 then
- begin
- writeln(#7,'Lesefehler Code ',e);
- ende(e)
- end;
- blockwrite(dat,buff,sizeof(buff))
- end;
-
- procedure schreib(s:word);
- {80 Sektoren aus Buffer direkt schreiben}
- var e:byte;
- begin
- e:=0;
- blockread(dat,buff,sizeof(buff));
- asm
- mov al,lwnr
- mov cx,80
- mov dx,s
- mov bx,seg buff
- mov ds,bx
- mov bx,offset buff
- int 26h
- add e,ah
- end;
- if e<>0 then
- begin
- writeln(#7,'Schreibfehler Code ',e);
- ende(e)
- end
- end;
-
- procedure diskcheck;
- {Anzahl der Sektoren aus
- Boot-Sektor auslesen}
-
- function bytestoword(a,b:byte):word;
- {Verdreht auf Platte gespeicherte Bytes
- in Word umwandeln}
- var w:word;
- begin
- w:=b*256;
- bytestoword:=w+a
- end;
- begin
- lies(0,1);
- se:=bytestoword(buff[20],buff[21]);
- if se=2400 then {Sektor 0,Offset 19,20}
- begin
- run:=30;
- groesse:=1228800
- end else
- if se=2880 then
- begin
- run:=36;
- groesse:=1474560
- end else
- begin
- writeln(#7,'Diskette ist kein DOS-HD-Typ!');
- writeln('Enthält nur ',se,' Sektoren');
- ende(1)
- end
- end;
-
- begin
- lw:=paramstr(1); {Parameter auswerten}
- val(paramstr(2),n,f);
- if (lw='A:') or (lw='a:') then lwnr:=0
- else
- if (lw='B:') or (lw='b:') then lwnr:=1 else
- n:=0;
- if (f<>0) or (n<1) or (paramcount<>2) then
- begin
- writeln(#7,'Parameterfehler!');
- writeln('Syntax: DOPPEL Laufwerk: Anzahl');
- halt
- end;
- assign(dat,name); {Swap-Datei öffnen}
- rewrite(dat,1);
- if (ioresult<>0) then
- begin
- writeln(#7,'Fehler beim Dateiöffnen!');
- halt(ioresult)
- end;
- j:=0;
- weiter(0);
- diskcheck; {Diskette und Platz prüfen}
- if diskfree(0) < groesse then
- begin
- writeln(#7,'Es fehlen ',groesse-diskfree(0),
- +' Bytes für die Swap-Datei!');
- ende(8)
- end;
- for i:=1 to run do {Diskette einlesen}
- begin
- lies(j,80);
- write('.');
- inc(j,80)
- end;
- writeln;
- j:=0;
- reset(dat,1); {n-mal Diskette beschreiben}
- for k:=1 to n do
- begin
- writeln;
- weiter(k);
- diskcheck;
- for i:=1 to run do
- begin
- schreib(j);
- write('.');
- inc(j,80)
- end
- end;
- ende(0)
- end.