home *** CD-ROM | disk | FTP | other *** search
/ ftp.barnyard.co.uk / 2015.02.ftp.barnyard.co.uk.tar / ftp.barnyard.co.uk / cpm / walnut-creek-CDROM / ENTERPRS / CPM / UTILS / S / TRANS12C.LBR / TRANS-05.INC < prev    next >
Text File  |  2000-06-30  |  7KB  |  298 lines

  1.  
  2.  
  3. procedure Set_FileLengthCPM;
  4. begin
  5. CPM_FCB.DriveCode := CPM_Drive + 1;
  6. move(DOS_FCB^.Name, CPM_FCB.Name, 8);
  7. move(DOS_FCB^.Extention, CPM_FCB.Extention, 3);
  8. I := ord(CPM_FCB.Name[6]);
  9. I := I or $80;                       {set high bit f6'}
  10. CPM_FCB.Name[6] := chr(I);
  11. for I := 0 to 19 do
  12.   mem[addr(CPM_FCB.Extent) + I] := 0;
  13. CPM_FCB.CR := 128 - (DOS_FCB^.FileSize[1] and $7F);
  14. bdos(SETATT, addr(CPM_FCB));
  15. end;
  16.  
  17.  
  18. function NumberOfRecords(Index: integer): integer;
  19. var
  20.   I: integer;
  21. begin
  22. I := (Index - 1) div 128;
  23. if (((Index - 1) mod 128) > 0) then
  24.   I := I + 1;
  25. NumberOfRecords := I;
  26. end;
  27.  
  28.  
  29. Function SizeDOS_File(Var A: SizeArray): Real;
  30. Begin
  31. SizeDOS_File:= (A[1] + (256.0 * A[2]) + (256.0 * 256.0 * A[3]) +
  32.     (256.0 * 256.0 * 256.0 * A[4]));
  33. End;
  34.  
  35.  
  36. procedure BufferToScreen;
  37. var
  38.   I, J: integer;
  39. begin
  40. I := 1;
  41. while (I < BufferIndex) and not Stop do
  42.   begin
  43.   J := ord(DataBuffer[I]);
  44.   if (J = $0A) or (J = $0D) or ((J > $1F) and (J < $80)) then
  45.     write(DataBuffer[I]);
  46.   Stop := Stop or Break;
  47.   I := I + 1;
  48.   end;
  49. end;
  50.  
  51.  
  52.  
  53. procedure ReadMS_DOS;
  54. var
  55.   FileName:          Str20;
  56.   CPMName:           Str20;
  57.   I,Err:             integer;
  58.   Cl:                integer;
  59.   RecordsPerCluster: integer;
  60.   Size:              Real;
  61.  
  62. procedure AdvanceDataBufferIndex;
  63. begin
  64. if (NumberOfClusters > 0) then
  65.   begin
  66.   NumberOfClusters := NumberOfClusters - 1;
  67.   BufferIndex := BufferIndex + RecordsPerCluster * 128;
  68.   end
  69. else
  70.   BufferIndex := BufferIndex + ExtraBytes;
  71. end;
  72.  
  73.  
  74. begin     (* ReadMS_DOS *)
  75. {bdos(RESETDSK);}                {for safety}
  76. IdentifyMS_DOS;
  77. if not (Identity = Unidentified) then
  78.   begin
  79.   ClrScr;
  80.   writeln;
  81.   if (Selection = '2') then
  82.     writeln('File Transfer From MS-DOS to CP/M')
  83.   else
  84.     writeln('View a Text File on MS_DOS Disk');
  85.   writeln;
  86.   write('File Name to Get From MS-DOS: ');
  87.   readln(FileName);
  88.   writeln;
  89.   Stop:= false;
  90.  
  91.   CheckWildcard(FileName);
  92.   SearchFirst(FileName,Err);
  93.   While VolumeName or SubDirName do
  94.     SearchNext(FileName,Err);
  95.  
  96.   if (Err = EODirectory) then
  97.     begin
  98.     write('File Not Found, ');
  99.     end
  100.   else
  101.     begin
  102.     writeln('Transfering -');
  103.     RecordsPerCluster:= RecordsPerSector * SecsPerCluster;
  104.     BiosSelect(CPM_Drive, First);
  105.  
  106.     repeat
  107.       CPMName:= '';
  108.       for I:= 1 to NameSize do
  109.         if not (DOS_FCB^.Name[I]=' ') then
  110.           CPMName:= CPMName + DOS_FCB^.Name[I];
  111.       CPMName:= CPMName + '.';
  112.       for I:= 1 to TypeSize do
  113.         CPMName:= CPMName + DOS_FCB^.Extention[I];
  114.       if (Selection = '2') then
  115.         CPMName:= concat(CPM_DriveCh,':',CPMName);
  116.       writeln(CPMName);
  117.       if (Selection = '2') then
  118.         begin
  119.         assign(CPMFile,CPMName);
  120.         rewrite(CPMFile);
  121.         end
  122.       else
  123.         begin
  124.         writeln;
  125.         writeln('Press <CTRL-S> to pause, <ESC> to abort -');
  126.         writeln;
  127.         end;
  128.       Stop := Stop or Break;
  129.       if not Stop then
  130.         begin
  131.         Cl:= DOS_FCB^.ClusterNo;
  132.         Size:= SizeDOS_File(DOS_FCB^.FileSize);
  133.         NumberOfClusters := Trunc(Size / (RecordsPerCluster * 128.0));
  134.         ExtraBytes := Trunc(Size - (NumberOfClusters
  135.                                     * RecordsPerCluster * 128.0));
  136.         fillchar(DataBuffer, DataBufferSize, 0);
  137.         BufferIndex := 1;
  138.         BiosSelect(MS_DOS_Drive, Next);
  139.         while (Cl < $FF8) and not Stop do
  140.           begin
  141.           ReadCluster(Cl, BufferIndex);
  142.           AdvanceDataBufferIndex;
  143.           if ((BufferIndex-1)>DataBufferSize-(RecordsPerCluster*128)) then
  144.             begin
  145.             BiosSelect(CPM_Drive, Next);
  146.             if (Selection = '2') then
  147.               blockwrite(CPMFile,DataBuffer[1],NumberOfRecords(BufferIndex))
  148.             else
  149.               BufferToScreen;
  150.             BiosSelect(MS_DOS_Drive, Next);
  151.             fillchar(DataBuffer, DataBufferSize, 0);
  152.             BufferIndex := 1;
  153.             end;
  154.           Cl:= FATPointer(Cl); (* Point to Next Cluster *)
  155.           end;
  156.  
  157.         BiosSelect(CPM_Drive, Next);
  158.         DataBuffer[BufferIndex] := ^Z;
  159.         if (Selection = '2') then
  160.           begin
  161.           blockwrite(CPMFile, DataBuffer[1], NumberOfRecords(BufferIndex));
  162.           close(CPMFile);
  163.           if (CPMversion > $30) then Set_FileLengthCPM;
  164.           end
  165.         else
  166.           if not Stop then BufferToScreen;
  167.         end;  (* if not Stop *)
  168.  
  169.       Stop := Stop or Break;
  170.  
  171.       if Wildcard and not Stop then
  172.         begin
  173.         BiosSelect(MS_DOS_Drive, Next);
  174.         Repeat
  175.           SearchNext(FileName,Err);
  176.           Until Not (VolumeName or SubDirName);
  177.         if not (Err = EODirectory) then
  178.           BiosSelect(CPM_Drive, Next);
  179.         end;
  180.  
  181.       until (Err = EODirectory) or Stop or not Wildcard;
  182.  
  183.     writeln;
  184.     writeln;
  185.     end;   (* if EODirectory *)
  186.   if Stop then write('Aborted, ');
  187.   Continue;
  188.   end;
  189. end;
  190.  
  191.  
  192.  
  193. procedure DirMS_DOS;
  194. var
  195.   ErrorCode,
  196.   Count,
  197.   I,N:         integer;
  198.   X:           real;
  199.   FileName:    Str20;
  200.   MonthString: array[0..38] of char;
  201. begin
  202. MonthString:= '...JanFebMarAprMayJunJulAugSepOctNovDec';
  203. Count:= 0;
  204. IdentifyMS_DOS;
  205. if not (Identity = Unidentified) then
  206.   begin
  207.   ClrScr;
  208.   writeln;
  209.   write('Dir Mask: ');
  210.   readln(FileName);
  211.   writeln;
  212.   writeln('Name',
  213.   'Attrubutes':18,
  214.     'Clstr':7,
  215.     'Date':13,
  216.     'Time':10,
  217.     'Size':8);
  218.   for I:= 1 to 60 do write('-');
  219.   SearchFirst(FileName,ErrorCode);
  220.   repeat
  221.     if (ErrorCode = FoundDir) then
  222.       begin
  223.       writeln;
  224.       Count:= Count + 1;
  225.  
  226.       with DOS_FCB^ do
  227.         begin
  228.         for I:= 1 to NameSize do write(Name[I]);
  229.         write('.');
  230.         for I:= 1 to TypeSize do write(Extention[I]);
  231.         write('  ');
  232.         N:= Attribute;
  233.  
  234.         If VolumeName Then
  235.           Write('<VolNam>')
  236.         Else if SubDirName Then
  237.           Write('<SubDir>')
  238.         Else
  239.           for I:= 1 to 8 do
  240.             begin
  241.             write(chr(((N shr 7) and 1) + $30));
  242.             N:= N shl 1;
  243.             end;
  244.  
  245.         write(ClusterNo:7);
  246.         write('  ');
  247.         N:= ((Date shr 5) and $F);
  248.         if (N > 12) then N:= 0;
  249.         N:= N * 3;
  250.         for I:= N to N+2 do write(MonthString[I]);
  251.         write(' ');
  252.         N:= Date and $1F;
  253.         if N < 10 then write('0');
  254.         write(N);
  255.         write(',',(Date shr 9) + 1980);
  256.  
  257.         write('  ');
  258.         N:= (Time shr 11);
  259.         if N < 10 then write('0');
  260.         write(N,':');
  261.         N:= ((Time shr 5) and 63);
  262.         if N < 10 then write('0');
  263.         write(N,':');
  264.         N:= ((Time and $1F) * 2);
  265.         if N < 10 then write('0');
  266.         write(N);
  267.         write('  ',SizeDOS_File(FileSize):6:0);
  268.         end;
  269.       end;
  270.     SearchNext(FileName,ErrorCode);
  271.     until (ErrorCode = EODirectory) or Break;
  272.   writeln;
  273.   writeln;
  274.   writeln('File Count: ',Count);
  275.   Continue;
  276.   end;
  277. end;
  278.  
  279.  
  280.  
  281. procedure MapMS_DOS;
  282. begin
  283. IdentifyMS_DOS;
  284. if not (Identity = Unidentified) then
  285.   begin
  286.   ClrScr;
  287.   for I:= 0 to NClusters -1 do
  288.     begin
  289.     if (I mod 18) = 0 then writeln;
  290.     write(FATPointer(I + 2),',')
  291.     end;
  292.   writeln;
  293.   writeln;
  294.   continue;
  295.   end;
  296. end;
  297.  
  298.