(* 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 *)