home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Oakland CPM Archive
/
oakcpm.iso
/
cpm
/
dskutl
/
transf18.ark
/
TRANS-01.INC
< prev
next >
Wrap
Text File
|
1989-09-27
|
7KB
|
317 lines
(* 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 *)