home *** CD-ROM | disk | FTP | other *** search
/ Oakland CPM Archive / oakcpm.iso / sigm / vol256 / trans-02.inc < prev    next >
Encoding:
Text File  |  1986-03-22  |  5.0 KB  |  235 lines

  1.  
  2.  
  3. procedure ConvertName(Str: Str20; var N: NameAry; var T: TypeAry);
  4. var
  5.   I,J: integer;
  6. begin
  7. for I:= 1 to NameSize do N[I]:= ' ';
  8. for I:= 1 to TypeSize do T[I]:= ' ';
  9. if (Str = '') then Str:= '*.*';
  10. if (pos('.',Str) = 0) then Str:= concat(Str,'.');
  11. if not (pos('.',Str)-1 > NameSize) then
  12.   for I:= 1 to pos('.',Str)-1 do
  13.     N[I]:= upcase(Str[I]);
  14. if not (length(copy(Str,pos('.',Str)+1,20)) > TypeSize) then
  15.   for I:= pos('.',Str)+1 to length(Str) do
  16.     T[I-pos('.',Str)]:= upcase(Str[I]);
  17. for I:= 1 to NameSize do
  18.   if (N[I] = '*') then
  19.     for J:= I to NameSize do
  20.       N[J]:= '?';
  21. for I:= 1 to TypeSize do
  22.   if (T[I] = '*') then
  23.     for J:= I to TypeSize do
  24.       T[J]:= '?';
  25. end;
  26.  
  27.  
  28.  
  29. function SameName(S: Str20; FN: NameAry; FT: TypeAry): boolean;
  30. var
  31.   N: NameAry;
  32.   T: TypeAry;
  33.   I,J: integer;
  34.   Match: boolean;
  35. begin
  36. ConvertName(S,N,T);
  37. Match:= true;
  38. for I:= 1 to NameSize do
  39.   if ((N[I] <> FN[I]) and (N[I] <> '?')) then
  40.     Match:= False;
  41. for I:= 1 to TypeSize do
  42.   if ((T[I] <> FT[I]) and (T[I] <> '?')) then
  43.     Match:= False;
  44. SameName:= Match;
  45. end;
  46.  
  47.  
  48.  
  49. procedure SearchNextAll(FileName: Str20; var Error: integer);
  50. const
  51.   SizePC_FCB = 32;
  52. var
  53.   I,FCBsPerSector: integer;
  54.  
  55. begin
  56. repeat
  57.   Error:= FoundDir;  { default }
  58.   FCBsPerSector:= (SectorSize div SizePC_FCB);
  59.  
  60.   if ((DirOffset mod FCBsPerSector) = 0) then
  61.     begin
  62.     DirOffset:= 0;
  63.     NextSector(DirSector,DirTrack);
  64.     ReadSector(DirSector,DirTrack,Addr(DirBuffer));
  65.     DirSectorCount:= DirSectorCount +1;
  66.     end;
  67.  
  68.   if (DirSectorCount < DirSecs) then
  69.     begin
  70.     DOS_FCB:= ptr(addr(DirBuffer) + (DirOffset * SizePC_FCB));
  71.     if (DOS_FCB^.Name[1] in [#0,#$F6,#$E5]) then
  72.       Error:= MTDirectory;
  73.     end
  74.   else
  75.     Error:= EODirectory;
  76.   DirOffset:= DirOffset +1;
  77.   until ((Error = EODirectory)
  78.     or (Error = MTDirectory)
  79.     or (SameName(FileName,DOS_FCB^.Name,DOS_FCB^.Extention)));
  80.  
  81. If (Error = EODirectory) Then
  82.   Begin
  83.   VolumeName:= False;
  84.   SubDirName:= False;
  85.   End
  86. Else
  87.   Begin
  88.   VolumeName:= (DOS_FCB^.Attribute and $08) <> 0;
  89.   SubDirName:= (DOS_FCB^.Attribute and $10) <> 0;
  90.   End
  91. end;
  92.  
  93.  
  94.  
  95. procedure SearchNext(FN: Str20; var Err: integer);
  96. begin
  97. repeat
  98.   SearchNextAll(FN,Err);
  99.   if (DOS_FCB^.Name[1] = #0) then { "high water" mark }
  100.     Err:= EODirectory;
  101.   until ((Err = EODirectory) or (Err = FoundDir));
  102. end;
  103.  
  104.  
  105.  
  106. procedure SearchFirstAll( FileName: Str20; var Error: integer );
  107. const
  108.   SizePC_FCB = 32;
  109. var
  110.   I: integer;
  111. begin
  112. DirOffset:= 0;
  113. DirTrack:= 0;
  114. DirSectorCount:= -1;
  115. DirSector:= FirstDirSector -1;
  116. SearchNextAll(FileName,Error);
  117. end;
  118.  
  119.  
  120.  
  121. procedure SearchFirst(FN: Str20; var Err: integer);
  122. begin
  123. SearchFirstAll(FN,Err);
  124. if (Err = MTDirectory) then
  125.   SearchNext(FN,Err);
  126. end;
  127.  
  128.  
  129.  
  130. procedure IdentifyMS_DOS;
  131. begin
  132. SectorSize:= 512;
  133. RecordsPerSector:= SectorSize div 128;
  134. FirstFATSector:= 1;
  135. GetFAT;
  136. case FAT[1] of
  137.   $FF:
  138.     begin
  139.     Identity:=       ds8spt;
  140.     FATSize:=        1;          (* size of FAT in sectors (1 copy)*)
  141.     DirSecs:=        7;          (* number of sectors in directory *)
  142.     NTracks:=        80;         (* number of tracks on disk       *)
  143.     NSectors:=       8;          (* number of sectors per track    *)
  144.     SecsPerCluster:= 2;          (* number of sectors per cluster  *)
  145.     SingleSided:=    false;
  146.     end;
  147.   $FE:
  148.     begin
  149.     Identity:=       ss8spt;
  150.     FATSize:=        1;
  151.     DirSecs:=        4;
  152.     NTracks:=        40;
  153.     NSectors:=       8;
  154.     SecsPerCluster:= 1;
  155.     SingleSided:=    true;
  156.     end;
  157.   $FD:
  158.     begin
  159.     Identity:=       ds9spt;
  160.     FATSize:=        2;
  161.     DirSecs:=        7;
  162.     NTracks:=        80;
  163.     NSectors:=       9;
  164.     SecsPerCluster:= 2;
  165.     SingleSided:=    false;
  166.     end;
  167.   $FC:
  168.     begin
  169.     Identity:=       ss9spt;
  170.     FATSize:=        2;
  171.     DirSecs:=        4;
  172.     NTracks:=        40;
  173.     NSectors:=       9;
  174.     SecsPerCluster:= 2;
  175.     SingleSided:=    true;
  176.     end;
  177. else
  178.   begin  (* Try Another Sector Size *)
  179.   SectorSize:= 256;
  180.   FirstFATSector:= 2;
  181.   RecordsPerSector:= SectorSize div 128;
  182.   GetFAT;
  183.   Case FAT[1] of
  184.     $F8:
  185.       Begin
  186.       Identity:=       B_20; (* Burroughs B-20 *)
  187.       FATSize:=        2;
  188.       DirSecs:=        18;
  189.       NTracks:=        160;
  190.       NSectors:=       16;
  191.       SecsPerCluster:= 8;
  192.       SingleSided:=    false;
  193.       End;
  194.   else
  195.     Begin
  196.     Identity:= Unidentified;
  197.     gotoxy(1,23);
  198.     write('Cannot Identify MS-DOS Disk, ');
  199.     Continue;
  200.     end; (* else Case *)
  201.     end; (* Case      *)
  202.   end;   (* else Case *)
  203.   end;   (* Case      *)
  204. if not (Identity = Unidentified) then
  205.   begin
  206.   FirstDirSector:=   FatSize * 2 + FirstFATSector;
  207.   FirstDataSector:=  (FirstDirSector + DirSecs) mod NSectors;
  208.   FirstDataTrack:=   (FirstDirSector + DirSecs) div NSectors;
  209.   NClusters:= (NTracks * NSectors div SecsPerCluster)
  210.               - (((FATSize * 2) + DirSecs + 1) div SecsPerCluster);
  211.   end;
  212. end;
  213.  
  214.  
  215.  
  216. procedure RestoreFAT;
  217. var
  218.   S,T,I: integer;
  219. begin
  220. writeln;
  221. write('FAT Size in Sectors? (1,2..) ');
  222. readln(FATSize);
  223. FATSize:= (FATSize and 3);
  224. S:= 1 + FATSize;
  225. T:= 0;
  226. for I:= 0 to FATSize-1 do
  227.   begin
  228.   ReadSector(S,T,addr(FAT) + (SectorSize * I));
  229.   NextSector(S,T);
  230.   PutFAT;
  231.   end
  232. end;
  233.  
  234.  
  235.