home *** CD-ROM | disk | FTP | other *** search
/ Programmer 7500 / MAX_PROGRAMMERS.iso / PROGRAMS / UTILS / FLOPPIES / FDFORM16.ZIP / WIMAGE.PAS < prev   
Encoding:
Pascal/Delphi Source File  |  1990-10-26  |  5.6 KB  |  197 lines

  1. {$A+,B-,D+,E-,F-,I-,L+,N-,O-,R-,S-,V-}
  2. {$M 4096,0,655360}
  3. PROGRAM WIMAGE;
  4.  
  5.   {WIMAGE - Write Diskette to file / Read Diskette from file - Ver 1.10}
  6.   {Compiled with Turbo-Pascal Ver 5.5}
  7.  
  8. USES dos,diskio;
  9.  
  10. VAR para   : String[50];
  11.   fn       : String[50];
  12.   f        : FILE;
  13.   lw       : Byte;
  14.   ok       : Boolean;
  15.   trk      : Word;
  16.   rest     : Word;
  17.   t,rt     : Word;
  18.   j        : Word;
  19.   written  : Word;
  20.   xsec     : LongInt;
  21.   readdisk : Boolean;
  22.   FileBoot : ^bpbtyp;
  23.   ysec     : LongInt;
  24.   ftrk     : Word;
  25.   CylMem   : CmTyp;
  26.  
  27.   PROCEDURE SyntaxError;
  28.   BEGIN
  29.     WriteLn('Syntax Error.');
  30.     WriteLn;
  31.     WriteLn('Syntax is:   WIMAGE <drive>: <file>  (write Diskette to file)');
  32.     WriteLn('             WIMAGE <file> <drive>:  (read Diskette from file)');
  33.     WriteLn;
  34.     WriteLn('Exapmles: WIMAGE A: C:\DISKS\MYDISK.360');
  35.     WriteLn('          WIMAGE C:\DISKS\DOS330.144 A:');
  36.     WriteLn;
  37.     Halt(1);
  38.   END;
  39.  
  40.   PROCEDURE BootError;
  41.   BEGIN
  42.     WriteLn('File ',fn,' is no diskette image.');
  43.     Close(f);
  44.     Halt(9);
  45.   END;
  46.  
  47.   PROCEDURE DosError;
  48.   BEGIN
  49.     WriteLn('This program requires DOS 3.20 or higher.');
  50.     Halt(10);
  51.   END;
  52.  
  53. BEGIN
  54.   WriteLn;
  55.   WriteLn('WIMAGE-Write Disk to File/Read Disk from File-V1.10');
  56.   WriteLn('Copyright (c) 1988 - 1989, Christoph H. Hochstätter');
  57.   WriteLn;
  58.   IF Swap(DosVersion)<$314 THEN DosError;
  59.   IF (Length(ParamStr(1))=2) AND (Length(ParamStr(2))=2) THEN SyntaxError;
  60.   IF Length(ParamStr(1))=2 THEN BEGIN
  61.     para:=ParamStr(1);
  62.     fn:=ParamStr(2);
  63.     readdisk:=True;
  64.   END ELSE IF Length(ParamStr(2))=2 THEN BEGIN
  65.     para:=ParamStr(2);
  66.     fn:=ParamStr(1);
  67.     readdisk:=False;
  68.   END ELSE
  69.     SyntaxError;
  70.   IF fn='' THEN SyntaxError;
  71.   FOR lw:=1 TO Length(fn) DO fn[lw]:=Upcase(fn[lw]);
  72.   IF para[2]<>':' THEN SyntaxError;
  73.   lw:=Ord(Upcase(para[1]))-$40;
  74.   BootSec.init(ok);
  75.   IF NOT(ok) THEN BEGIN
  76.     WriteLn('Not enough Memory.');
  77.     Halt(4);
  78.   END;
  79.   BootSec.Readx(lw);
  80.   IF BootSec.UnknownDrive THEN BEGIN
  81.     WriteLn('Drive does not exist.');
  82.     Halt(3);
  83.   END;
  84.   IF (BootSec.Status AND $9200) <> 0 THEN BEGIN
  85.     WriteLn('WIMAGE does not work with a SUBST/ASSIGN/NETWORK Drive.');
  86.     Halt(2);
  87.   END;
  88.   IF BootSec.Media=5 THEN BEGIN
  89.     WriteLn('WIMAGE does not handle fixed disks.');
  90.     Halt(8);
  91.   END;
  92.   WITH BootSec.bpb^ DO BEGIN
  93.     IF sec<>0 THEN
  94.       xsec:=sec
  95.     ELSE
  96.       xsec:=lsc;
  97.     rest:=xsec MOD (hds*spt);
  98.     IF rest<>0 THEN BEGIN
  99.       WriteLn('This disk has hidden sectors.');
  100.       Halt(5);
  101.     END;
  102.     trk:=xsec DIV (hds*spt);
  103.     WriteLn('Information from the floppy:');
  104.     WriteLn('Tracks       : ',trk);
  105.     WriteLn('Sectors/Track: ',spt);
  106.     WriteLn('Sides        : ',hds);
  107.     IF readdisk THEN BEGIN
  108.       WriteLn('Bytes total  : ',DiskSize(lw));
  109.       WriteLn('Bytes free   : ',DiskFree(lw));
  110.     END ELSE ysec:=DiskSize(lw);
  111.     WriteLn;
  112.     Assign(f,fn);
  113.     IF readdisk THEN
  114.       Rewrite(f,1)
  115.     ELSE
  116.       Reset(f,1);
  117.     IF IoResult<>0 THEN BEGIN
  118.       WriteLn('File ',fn,' cannot be openend.');
  119.       Close(f);
  120.       Halt(6);
  121.     END;
  122.     IF NOT(readdisk) THEN BEGIN
  123.       GetMem(FileBoot,512);
  124.       BlockRead(f,FileBoot^,512,written);
  125.       IF (written<>512) OR
  126.       (FileBoot^.boot_code[511]<>$AA) OR
  127.       (FileBoot^.boot_code[510]<>$55) THEN BEGIN
  128.         BootError;
  129.       END;
  130.       IF FileBoot^.sec=0 THEN
  131.         ysec:=FileBoot^.lsc
  132.       ELSE
  133.         ysec:=FileBoot^.sec;
  134.       ftrk:=ysec DIV (FileBoot^.spt*FileBoot^.hds);
  135.       WriteLn('Information from the Image-File');
  136.       WriteLn('Tracks       : ',ftrk);
  137.       WriteLn('Sectors/Track: ',FileBoot^.spt);
  138.       WriteLn('Sides        : ',FileBoot^.hds);
  139.       WriteLn;
  140.       IF (ftrk<>trk) OR (FileBoot^.spt<>spt) OR (FileBoot^.hds<>hds) THEN BEGIN
  141.         Close(f);
  142.         WriteLn('Source File and Destination Disk have different formats.');
  143.         Halt(11);
  144.       END;
  145.       Seek(f,0);
  146.       FreeMem(FileBoot,512);
  147.     END;
  148.     maxcyl:=AllocCyl(CylMem,trk-1);
  149.     WriteLn(Succ(maxcyl)*LongInt(CylMem^[0]^.Datalen),' Bytes available for ',maxcyl+1,' Cylinders.');
  150.     WriteLn;
  151.     t:=0;
  152.     IF readdisk THEN BEGIN
  153.       WHILE t<trk DO BEGIN
  154.         IF t+maxcyl>trk-1 THEN rt:=trk-t ELSE rt:=maxcyl+1;
  155.         Write('Reading',rt:3,' Cylinders from',t:3,' to',t+rt-1:3,' ');
  156.         FOR j:=0 TO rt-1 DO BEGIN
  157.           CylMem^[j]^.Readx(lw,t+j);
  158.         END;
  159.         WriteLn('- Writing to File ',fn);
  160.         FOR j:=0 TO rt-1 DO BEGIN
  161.           BlockWrite(f,CylMem^[j]^.data^,CylMem^[j]^.Datalen,written);
  162.           IF IoResult<>0 THEN BEGIN
  163.             WriteLn('Error writing to file ',fn);
  164.             Close(f);
  165.             Halt(13);
  166.           END;
  167.           IF written<>CylMem^[j]^.Datalen THEN BEGIN
  168.             WriteLn('Disk Full - File: ',fn);
  169.             Close(f);
  170.             Halt(7);
  171.           END;
  172.         END;
  173.         t:=t+rt;
  174.       END;
  175.     END ELSE BEGIN
  176.       WHILE t<trk DO BEGIN
  177.         IF t+maxcyl>trk-1 THEN rt:=trk-t ELSE rt:=maxcyl+1;
  178.         Write('Reading from file ',fn,' ');
  179.         FOR j:=0 TO rt-1 DO BEGIN
  180.           BlockRead(f,CylMem^[j]^.data^,CylMem^[j]^.Datalen,written);
  181.           IF (written<>CylMem^[j]^.Datalen) OR (IoResult<>0) THEN BEGIN
  182.             WriteLn('Error reading from File ',fn);
  183.             Close(f);
  184.             Halt(12);
  185.           END;
  186.         END;
  187.         WriteLn('- Writing',rt:3,' Cylinders from',t:3,' to',t+rt-1:3);
  188.         FOR j:=0 TO rt-1 DO BEGIN
  189.           CylMem^[j]^.Writex(lw,t+j);
  190.         END;
  191.         t:=t+rt;
  192.       END;
  193.     END;
  194.     Close(f);
  195.   END;
  196. END.
  197.