home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
PC World Komputer 1995 November
/
PCWK1195.iso
/
inne
/
podstawy
/
dos
/
format
/
fdform18.exe
/
WIMAGE.PAS
< prev
Wrap
Pascal/Delphi Source File
|
1991-07-21
|
6KB
|
218 lines
{$A+,B-,D+,E-,F-,I-,L+,N-,O-,R-,S-,V-}
{$M 4096,0,655360}
PROGRAM WIMAGE;
{WIMAGE - Write Diskette to file / Read Diskette from file - Ver 1.21}
{Compiled with Turbo-Pascal Ver 6.0}
USES auxdos,dos,diskio;
VAR para : String[50];
fn : String[50];
f : FILE;
lw : Byte;
ok : Boolean;
trk : Word;
rest : Word;
t,rt : Word;
j : Word;
written : Word;
xsec : LongInt;
readdisk : Boolean;
FileBoot : ^bpbtyp;
ysec : LongInt;
ftrk : Word;
CylMem : CmTyp;
PROCEDURE SyntaxError;
BEGIN
InOutRes:=0;
WriteLn(stderr,'Syntax Error.');
WriteLn(stderr);
WriteLn(stderr,'Syntax is: WIMAGE <drive>: <file> (write Diskette to file)');
WriteLn(stderr,' WIMAGE <file> <drive>: (read Diskette from file)');
WriteLn(stderr);
WriteLn(stderr,'Exapmles: WIMAGE A: C:\DISKS\MYDISK.360');
WriteLn(stderr,' WIMAGE C:\DISKS\DOS330.144 A:');
WriteLn(stderr);
Halt(1);
END;
PROCEDURE BootError;
BEGIN
InOutRes:=0;
WriteLn(stderr,'File ',fn,' is no diskette image.');
Halt(9);
END;
PROCEDURE DosError;
BEGIN
InOutRes:=0;
WriteLn(stderr,'This program requires DOS 3.20 or higher.');
Halt(10);
END;
PROCEDURE CloseExitProc;
BEGIN
Close(f);
IF readdisk THEN Erase(f);
DefExitProc;
END;
BEGIN
SetIntVec($1B,@CtrlBreak);
WriteLn;
WriteLn('WIMAGE-Write Disk to File/Read Disk from File-V1.21');
WriteLn('Copyright (c) 1988 - 1991, Christoph H. Hochstätter');
WriteLn;
IF Swap(DosVersion)<$314 THEN DosError;
IF (Length(ParamStr(1))=2) AND (Length(ParamStr(2))=2) THEN SyntaxError;
IF Length(ParamStr(1))=2 THEN BEGIN
para:=ParamStr(1);
fn:=ParamStr(2);
readdisk:=True;
END ELSE IF Length(ParamStr(2))=2 THEN BEGIN
para:=ParamStr(2);
fn:=ParamStr(1);
readdisk:=False;
END ELSE
SyntaxError;
IF fn='' THEN SyntaxError;
FOR lw:=1 TO Length(fn) DO fn[lw]:=Upcase(fn[lw]);
IF para[2]<>':' THEN SyntaxError;
lw:=Ord(Upcase(para[1]))-$40;
BootSec.init(ok);
IF NOT(ok) THEN BEGIN
WriteLn(stderr,'Not enough Memory.');
Halt(4);
END;
BootSec.Readx(lw);
IF BootSec.UnknownDrive THEN BEGIN
WriteLn(stderr,'Drive does not exist.');
Halt(3);
END;
IF (BootSec.Status AND $9200) <> 0 THEN BEGIN
WriteLn(stderr,'WIMAGE does not work with a SUBST/ASSIGN/NETWORK Drive.');
Halt(2);
END;
IF BootSec.Media=5 THEN BEGIN
WriteLn(stderr,'WIMAGE does not handle fixed disks.');
Halt(8);
END;
WITH BootSec.bpb^ DO BEGIN
IF sec<>0 THEN
xsec:=sec
ELSE
xsec:=lsc;
rest:=xsec MOD (hds*spt);
IF rest<>0 THEN BEGIN
WriteLn(stderr,'This disk has hidden sectors.');
Halt(5);
END;
trk:=xsec DIV (hds*spt);
WriteLn('Information from the floppy:');
WriteLn('Tracks : ',trk);
WriteLn('Sectors/Track: ',spt);
WriteLn('Sides : ',hds);
IF readdisk THEN BEGIN
WriteLn('Bytes total : ',DiskSize(lw));
WriteLn('Bytes free : ',DiskFree(lw));
END ELSE ysec:=DiskSize(lw);
WriteLn;
Assign(f,fn);
IF readdisk THEN BEGIN
FileMode:=OWriteOnly OR ODenyWrite;
Rewrite(f,1);
Reset(f,1);
END ELSE BEGIN
FileMode:=OReadOnly OR ODenyWrite;
Reset(f,1);
END;
IF IoResult<>0 THEN BEGIN
WriteLn(stderr,'File ',fn,' cannot be openend.');
Halt(6);
END;
ExitProc:=@CloseExitProc;
IF NOT(readdisk) THEN BEGIN
GetMem(FileBoot,512);
BlockRead(f,FileBoot^,512,written);
IF (written<>512) OR
(FileBoot^.boot_code[511]<>$AA) OR
(FileBoot^.boot_code[510]<>$55) THEN BEGIN
BootError;
END;
IF FileBoot^.sec=0 THEN
ysec:=FileBoot^.lsc
ELSE
ysec:=FileBoot^.sec;
ftrk:=ysec DIV (FileBoot^.spt*FileBoot^.hds);
WriteLn('Information from the Image-File');
WriteLn('Tracks : ',ftrk);
WriteLn('Sectors/Track: ',FileBoot^.spt);
WriteLn('Sides : ',FileBoot^.hds);
WriteLn;
IF (ftrk<>trk) OR (FileBoot^.spt<>spt) OR (FileBoot^.hds<>hds) THEN BEGIN
InOutRes:=0;
WriteLn(stderr,'Source File and Destination Disk have different formats.');
Halt(11);
END;
Seek(f,0);
FreeMem(FileBoot,512);
END;
maxcyl:=AllocCyl(CylMem,trk-1);
WriteLn(Succ(maxcyl)*LongInt(CylMem^[0]^.Datalen),' Bytes available for ',maxcyl+1,' Cylinders.');
WriteLn;
t:=0;
IF readdisk THEN BEGIN
WHILE t<trk DO BEGIN
InOutRes:=0;
EndProgram(128,'User abort.');
IF t+maxcyl>trk-1 THEN rt:=trk-t ELSE rt:=maxcyl+1;
Write('Reading',rt:3,' Cylinders from',t:3,' to',t+rt-1:3,' ');
FOR j:=0 TO rt-1 DO BEGIN
InOutRes:=0;
EndProgram(128,'User abort. Partial file '+fn+' erased.');
CylMem^[j]^.Readx(lw,t+j);
END;
WriteLn('- Writing to File ',fn);
FOR j:=0 TO rt-1 DO BEGIN
BlockWrite(f,CylMem^[j]^.data^,CylMem^[j]^.Datalen,written);
IF IoResult<>0 THEN BEGIN
WriteLn(stderr,'Error writing to file ',fn);
Halt(13);
END;
IF written<>CylMem^[j]^.Datalen THEN BEGIN
InOutRes:=0;
WriteLn(stderr,'Disk Full - File: ',fn);
Halt(7);
END;
END;
t:=t+rt;
END;
END ELSE BEGIN
WHILE t<trk DO BEGIN
EndProgram(128,'User abort.');
IF t+maxcyl>trk-1 THEN rt:=trk-t ELSE rt:=maxcyl+1;
Write('Reading from file ',fn,' ');
FOR j:=0 TO rt-1 DO BEGIN
BlockRead(f,CylMem^[j]^.data^,CylMem^[j]^.Datalen,written);
IF (written<>CylMem^[j]^.Datalen) OR (IoResult<>0) THEN BEGIN
WriteLn(stderr,'Error reading from File ',fn);
Halt(12);
END;
END;
WriteLn('- Writing',rt:3,' Cylinders from',t:3,' to',t+rt-1:3);
FOR j:=0 TO rt-1 DO BEGIN
InOutRes:=0;
EndProgram(128,'User abort.');
CylMem^[j]^.Writex(lw,t+j);
END;
t:=t+rt;
END;
BootSec.Remount(lw);
END;
Close(f);
ExitProc:=@DefExitProc;
END;
END.