home *** CD-ROM | disk | FTP | other *** search
-
- (* module 01 *)
-
-
- procedure Box (X1, Y1, X2, Y2: integer);
-
- var
- I: integer;
-
- begin
- gotoxy (X1,Y1);
- for I:= X1 to X2 do
- write ('*');
- for I:= Y1 to Y2 do
- begin
- gotoxy (X2,I);
- write ('*')
- end;
- gotoxy (X1,Y2);
- for I:= X2 downto X1 do
- write ('*');
- for I:= Y2 downto Y1 do begin
- gotoxy (X1,I);
- write ('*')
- end;
- end;
-
-
-
- function MainSelection: char;
-
- var
- Ch: char;
-
- begin
- ClrScr;
- Box(13,4,60,23);
- writeln('* TRANSFER - vers ',Vers,' ');
-
- gotoxy(MenuMargin,7);
- write(' CP/M= ',chr(CPM_Drive+ord('A')),':');
- write(' MS-DOS= ',chr (MS_DOS_Drive+ord ('A')), ':');
-
- gotoxy (menuMargin, 8);
- write (' Path == ', pathStr);
-
- gotoxy(MenuMargin,10);
- write('1. Transfer File: CP/M >> MS-DOS');
-
- gotoxy(MenuMargin,11);
- write('2. Transfer File: MS-DOS >> CP/M');
-
- gotoxy(MenuMargin,12);
- write('3. Directory of MS-DOS Disk');
-
- gotoxy(MenuMargin,13);
- write('4. Allocation Map MS-DOS Disk');
-
- gotoxy(MenuMargin,14);
- write('5. Directory of CP/M Disk');
-
- gotoxy(MenuMargin,15);
- write('6. Erase File MS-DOS Disk');
-
- gotoxy(MenuMargin,16);
- write('7. Boot Sector MS-DOS Disk');
-
- gotoxy (menuMargin, 17);
- write ('8. Open MS-DOS SubDirectory');
-
- gotoxy(MenuMargin,18);
- write('9. Quit');
-
- repeat
- gotoxy(MenuMargin,20);
- write(' Enter Your Selection? ');
- read(KBD,Ch);
- until (Ch in ['1'..'9']);
- MainSelection:= Ch
- end;
-
-
-
- procedure Continue;
- begin
- write('Press [Return] to Continue..');
- repeat
- read(KBD,Selection);
- until (Selection = #$D);
- end;
-
-
-
- procedure NextSector(var S: integer; var T: integer);
- begin
- S:= S + 1;
- if (S >= NSectors) then
- begin
- S:= MinSector;
- T:= T + 1;
- end;
- end;
-
-
-
- procedure DiskError;
- begin
- writeln;
- write('Disk I/O Error, ');
- Continue;
- end;
-
-
-
- procedure BiosSelect(DriveCode: integer);
- var firstsel:integer;
- begin
- firstsel:=1;
- if((DriveCode = MS_DOS_Drive) and dosnew) then begin
- dosnew:=false;
- firstsel:=0;
- end;
- if((DriveCode = CPM_Drive) and cpmnew) then begin
- cpmnew:=false;
- firstsel:=0;
- end;
- { hier stand mal ne 9 drin, aber bei der BIOS Nummerierung }
- { von Turbo Pascal muss es ne 8 sein !!! }
- BiosError:=(mybioshl(8, DriveCode, firstsel) = 0);
- end;
-
-
-
- procedure ReadSector(Sector, Track, Address: integer);
- var
- Rec: integer;
- RPS: integer;
- I: integer;
- dummy: integer;
- begin
- BiosSelect(MS_DOS_Drive); { SWITCH TO DOS DISK }
- if cpm3 then begin
- { new code for cpm3 }
- dummy := mybioshl(11, address, 0); { SET DMA ADDRESS }
- dummy := mybioshl(9, track, 0); { SET TRACK }
- dummy := mybioshl(10, sector + 1, 0); { SET SECTOR }
- biosError := (mybios(12, 0, 0) <> 0); { READ SECTOR }
- end else begin
- { old (CPM2) Code }
- (* if singlesided then Track:= Track * 2; *)
- RPS:= SectorSize div 128;
- BiosError:= False;
- for I:= 0 to (RPS -1)do begin
- dummy := mybioshl(9, track, 0); (* select track *)
- if SecTrans then
- Rec:= myBiosHL(15,Sector * RPS + I + SO, 0) (* translate sector *)
- else
- Rec:= (Sector * RPS + I + SO);
- dummy := mybioshl(10,Rec,0); (* select sector *)
- dummy := mybioshl(11,(I * 128) + Address,0); (* set dma addr *)
- BiosError:= (BiosError or (mybios(12,0,0)<>0)); (* read 128 bytes *)
- end;
- end;
- dummy := mybioshl(8,CPM_Drive,0); { SWITCH BACK TO CP/M }
- if BiosError then DiskError;
- end;
-
-
-
- procedure WriteSector(Sector,Track,Address: integer);
- var
- Rec: integer;
- RPS: integer;
- I: integer;
- l: integer;
- dummy: integer;
- begin
- BiosSelect(MS_DOS_Drive); { SWITCH TO DOS DISK }
- if cpm3 then begin
- { new code for cpm3 }
- dummy := mybioshl(11, address, 0); { SET DMA ADDRESS }
- dummy := mybioshl(9, track, 0); { SET TRACK }
- dummy := mybioshl(10, sector + 1, 0); { SET SECTOR }
- biosError := (mybios(13, 0, 0) <> 0); { WRITE SECTOR }
- end else begin
- { old (CPM2) Code }
- (* if singlesided then Track:= Track * 2; *)
- RPS:= SectorSize div 128;
- BiosError:= False;
- for I:= 0 to (RPS -1)do begin
- if i = rps-1 then l := 1 else l := 2;
- dummy := mybioshl(9,track,0); (* select track *)
- if SecTrans then
- Rec:= myBiosHL(15,Sector * RPS + I + SO,0) (* translate sector *)
- else
- Rec:= (Sector * RPS + I + SO);
- dummy := mybioshl(10,Rec,0); (* select sector *)
- dummy := mybioshl(11,(I * 128) + Address,0); (* set dma addr *)
- BiosError:= (BiosError or (mybios(13,l,0)<>0)); (* write 128 bytes *)
- end;
- end;
- dummy := mybioshl(8,CPM_Drive,0); { SWITCH BACK TO CP/M }
- if BiosError then DiskError;
- end;
-
-
-
- procedure GetFAT;
-
- var
- s, t, i: integer;
- begin
- s := firstfatsector;
- t := 0;
- for i := 0 to fatsize-1 do begin
- ReadSector (s, t, addr (fat) + (sectorsize * i));
- NextSector (s, t)
- end
- end;
-
-
- procedure PutFAT;
-
- var
- S, T, I, j: integer;
-
- begin
- S := FirstFATSector;
- T := 0;
- for j := 1 to fatnum do
- for I := 0 to FATSize-1 do begin
- WriteSector (S,T,addr(FAT) + (SectorSize * I));
- NextSector (S,T);
- end;
- end;
-
-
- procedure ReadCluster(Cl: integer);
- var
- I: integer;
- Sector: integer;
- Track: integer;
- begin
- Cl:= Cl - 2;
- Track:= (Cl * SecsPerCluster) div NSectors;
- Sector:= (Cl * SecsPerCluster) mod NSectors;
- Sector:= Sector + FirstDataSector;
- Track:= Track + FirstDataTrack + (Sector div NSectors);
- Sector:= Sector mod NSectors;
- for I:= 0 to (SecsPerCluster -1) do
- begin
- ReadSector(Sector,Track,addr( ClusterBuffer[ I * SectorSize + 1] ));
- NextSector(Sector,Track);
- end;
- end;
-
-
-
- procedure WriteCluster(Cl: integer);
- var
- I: integer;
- Sector: integer;
- Track: integer;
- begin
- Cl:= Cl - 2;
- Track:= (Cl * SecsPerCluster) div NSectors;
- Sector:= (Cl * SecsPerCluster) mod NSectors;
- Sector:= Sector + FirstDataSector;
- Track:= Track + FirstDataTrack + (Sector div NSectors);
- Sector:= Sector mod NSectors;
- for I:= 0 to (SecsPerCluster -1) do
- begin
- WriteSector(Sector,Track,addr( ClusterBuffer[ I * SectorSize + 1] ));
- NextSector(Sector,Track);
- end;
- end;
-
-
-
- function FATPointer(Index: integer): Integer; (* 2..NClusters + 2 *)
- var
- Result,I: Integer;
- OddNum: Boolean;
- begin
- I:= ((Index * 3) div 2) +1;
- Result:= (FAT[I] + (256 * FAT[I + 1]));
- if odd(Index) then Result:= Result shr 4;
- FATPointer:= (Result and $FFF);
- end;
-
-
-
- function Break: boolean;
- var
- Ch: char;
- begin
- if KeyPressed then
- begin
- read(KBD,Ch);
- if (Ch = ^S) then
- begin
- while not KeyPressed do;
- read(KBD,Ch);
- end;
- if (Ch = #27) then
- Break:= true
- else
- Break:= false;
- end
- else
- Break:= false;
- end;
-
-
-
- (* end module 01 *)