[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: USCD Pascal on a CFFA drive
Pascal pgm to mount/unmount files on units 4,5,9..12 as volumes on
units 13..20,128..143. Compile and run after getting system.attach
working. Next message will be short example which can act as an auto-
exec file (shows how simple the mount pgm is to use).
Program DiskMount;
(*$S+ *)
UNIT CATALOG;
INTERFACE
CONST
MAXDIR=77; {MAXIMUM NUMBER OF ENTRIES IN DIRECTORY}
VIDLENG=7; {NUMBER OF CHARACTERS IN VOLUME ID}
TIDLENG=15; {NUMBER OF CHARACTERS IN TITLE ID}
FBLKSIZE=512; {STANDARD DISK BLOCK LENGTH}
DIRBLK=2; {DIRECTORY STARTS AT THIS DISK-BLOCK ADDRESS}
TYPE
DATEREC=
PACKED RECORD
MONTH:0..12; {0 IMPLIES MEANINGLESS DATE}
DAY:0..31; {DAY OF THE MONTH}
YEAR:0..100; {0 IMPLIES THE DATED VOLUME IS TEMPORARY}
END {DATEREC};
VID=STRING[VIDLENG];
TID=STRING[TIDLENG];
DIRRANGE=0..MAXDIR;
FILEKIND=(UNTYPEDFILE,XDSKFILE,CODEFILE,TEXTFILE,INFOFILE,DATAFILE,
GRAFFILE,FOTOFILE,SECUREDIR);
DIRENTRY=PACKED RECORD
DFIRSTBLK:INTEGER; {1ST PHISICAL DISK ADDRESS}
DLASTBLK :INTEGER; {BLOCK FOLLOWING LAST USED BLOCK}
CASE DFKIND:FILEKIND OF
SECUREDIR,UNTYPEDFILE:
(FILLER1: 0..2048; {13 BITS}
DVID: VID; {NAME OF DISK VOLUME}
DEOVBLK: INTEGER; {NUMBER OF BLOCKS
ON VOLUME}
DNUMFILES: DIRRANGE; {NUMBER OF FILES IN DIRECTORY}
DLOADTIME: INTEGER; {TIME OF LAST ACCESS}
DLASTBOOT: DATEREC {MOST RECENT DATE SETTING});
XDSKFILE,CODEFILE,TEXTFILE,INFOFILE,DATAFILE,GRAFFILE,FOTOFILE:
(FILLER2: 0..1024; {12 BITS}
STATUS: BOOLEAN; {FOR FILER WILDCARDS}
DTID: TID; {FILE NAME}
DLASTBYTE: 1..FBLKSIZE; {NUMBER OF BYTES IN LAST BLOCK}
DACCESS: DATEREC) {DATE OF LAST MODIFICATION}
END {CASE} {RECORD};
DIRECTORY=ARRAY[DIRRANGE] OF DIRENTRY;
VAR KINDFILE: ARRAY[FILEKIND] OF STRING[8];
PROCEDURE LISTDIR(VAR UNITNUM:INTEGER);
IMPLEMENTATION
PROCEDURE LISTDIR;
VAR DIR:DIRECTORY;
I,n,NFILE,FREE: INTEGER;
USED,UNUSED: INTEGER;
Function CheckPage(n:integer):integer;
begin
n:=succ(n);
IF ((n MOD 22)=0) THEN BEGIN
gotoxy(0,0);
WRITE(chr(29),'Press
<RETURN> to continue ');
READLN ;
n:=0;
gotoxy(0,23);
END;
CheckPage:=n;
end;
BEGIN
IF NOT (UNITNUM IN [4,5,9..20,128..143]) THEN EXIT(LISTDIR);
PAGE(OUTPUT);
(*$I- *) UNITREAD(UNITNUM,DIR,SIZEOF(DIR),DIRBLK) (*$I+ *);
IF IORESULT=0 THEN
BEGIN
GOTOXY(0,1);
WITH DIR[0] DO
BEGIN WRITELN(DVID,': (Unit#',UNITNUM,')',DEOVBLK:6,' Blocks ',
DLASTBOOT.MONTH:2,'/',DLASTBOOT.DAY:2,'/',DLASTBOOT.YEAR);
NFILE:=DNUMFILES;
FREE:=DEOVBLK-6;
END;
n:=1;
FOR I:=1 TO NFILE DO WITH DIR[I] DO
BEGIN
UNUSED:=DFIRSTBLK-DIR[I-1].DLASTBLK;
USED :=DLASTBLK-DFIRSTBLK;
IF UNUSED>0 THEN begin
WRITELN(' <UNUSED> ',' ':10,UNUSED:4,' ':10,
DIR[I-1].DLASTBLK:6);
n:=CheckPage(n);
end;
if dfkind in [securedir,untypedfile] then
writeln(dvid,' ':(20-length(dvid)),used:4,' ',
dlastboot.month:2,'/',dlastboot.day:2,'/',dlastboot.year,
dfirstblk:6,' ':4,kindfile[dfkind])
else
WRITELN(DTID,' ':(20-LENGTH(DTID)),USED:4,' ',
DACCESS.MONTH:2,'/',DACCESS.DAY:
2,'/',DACCESS.YEAR,
DFIRSTBLK:6,' ':4,KINDFILE[DFKIND]);
n:=CheckPage(n);
FREE:=FREE-USED;
END;
UNUSED:=DIR[0].DEOVBLK-DIR[NFILE].DLASTBLK;
IF UNUSED>0 THEN WRITELN(' <UNUSED> ',' ':10,UNUSED:4,' ':10,
DIR[NFILE].DLASTBLK:6);
WRITELN(DIR[0].DNUMFILES:4,' Files, ',
(DIR[0].DEOVBLK-FREE):4,' Blocks used,',' ':4,FREE,' Blocks
unused');
(* GOTOXY(0,0); *)
END
END {LISTDIR};
BEGIN
KINDFILE[CODEFILE]:='Codefile';
KINDFILE[DATAFILE]:='Datafile';
KINDFILE[TEXTFILE]:='Textfile';
KINDFILE[FOTOFILE]:='Fotofile';
KINDFILE[GRAFFILE]:='Graffile';
KINDFILE[INFOFILE]:='Infofile';
KINDFILE[XDSKFILE]:='Xdskfile';
KINDFILE[UNTYPEDFILE]:=' file';
KINDFILE[SECUREDIR]:='SubDir '
END {CATALOG};
uses chainstuff,CATALOG;
const get_info = 2;
set_info = 3;
type mountinfo = packed record
vol : integer;
fblk : integer;
eblk : integer;
end;
var mounttbl : array [1..24] of mountinfo;
unitn : integer;
cmndset : set of char;
ch : char;
dir : directory;
Function UnitCalc(u:integer):integer;
begin
if u>127 then UnitCalc:=u-119
else UnitCalc:=u-12;
end;
Procedure DisplayUnit;
begin
unitstatus(unitn,mounttbl[UnitCalc(unitn)],get_info);
with mounttbl[UnitCalc(unitn)] do begin
if eblk < fblk then vol:=0;
if vol > 0 then
begin
writeln('Volume#',unitn:3,' is directed to volume#',vol:3,
' blocks ',fblk:4,' - ',eblk:4);
end;
end;
end;
Procedure View;
var line : integer;
begin
page(output);
writeln;
line:=2;
for unitn:=13 to 20 do begin
gotoxy(0,line);
DisplayUnit;
with mounttbl[UnitCalc(unitn)] do
if vol > 0 then begin
line:=succ(line);
if line > 23 then line:=23;
end;
end;
for unitn:=128 to 143 do begin
gotoxy(0,line);
DisplayUnit;
with mounttbl[UnitCalc(unitn)] do
if vol > 0 then begin
line:=succ(line);
if line > 23 then line:=23;
end;
end;
end;
Procedure Catlg;
begin
gotoxy(0,0); write(chr(29));
writeln;
repeat
gotoxy(0,1);
write ('Catalog unit [0,4,5,9..20,128..143] #');
readln(unitn);
until (unitn in [0,4,5,9..20,128..143]);
if unitn=0 then exit(Catlg);
listdir(unitn);
if (unitn in [13..20,128..143]) then begin
writeln;
DisplayUnit
end;
gotoxy(0,0);
write(chr(29),'Press <RETURN> to continue');
readln;
end;
Procedure Add;
var (* fblk,nblk : integer; *)
voln : integer;
dirname : tid;
i : integer;
Procedure UpCase(var fname:tid);
var i : integer;
begin
for i:=1 to length(fname) do
begin
if fname[i] in ['a'..'z'] then
fname[i]:=chr(ord(fname[i])-ord('a')+ord('A'));
end;
end;
begin
gotoxy(0,0); write(chr(29));
writeln('Add a subvolume to list');
repeat
gotoxy(0,1);
write('Mount Unit [0,13..20,128..143] #'); readln(unitn);
until (unitn in [0,13..20,128..143]);
if unitn=0 then exit(Add);
gotoxy(0,12);
write('Base volume unit #'); readln(voln);
(* write('Beginning block #'); readln(fblk);
write('Number of blocks '); readln(nblk); *)
write('Directory (file)name '); readln(dirname);
UpCase(dirname);
(*$I- *) unitread(voln,dir,sizeof(dir),dirblk); (*$I+ *)
unitstatus(unitn,mounttbl[UnitCalc(unitn)],get_info);
for i:=1 to dir[0].dnumfiles do
with dir[i] do
begin
if dtid=dirname then with mounttbl[UnitCalc(unitn)] do
begin
vol:=voln;
fblk:=dfirstblk;
eblk:=dlastblk;
(* nblk:=dlastblk-dfirstblk; *)
end;
end;
(* mounttbl[UnitCalc(unitn)].vol:=voln;
mounttbl[UnitCalc(unitn)].fblk:=fblk;
mounttbl[UnitCalc(unitn)].eblk:=fblk+nblk; *)
unitstatus(unitn,mounttbl[UnitCalc(unitn)],set_info);
(* gotoxy(0,unitn-11); DisplayUnit; *)
end;
Procedure Remove;
begin
gotoxy(0,0); write(chr(29));
writeln('Remove a subvolume from list');
repeat
gotoxy(0,1);
write('Dismount Unit [0,13..20,128..143] #'); readln(unitn);
until (unitn in [0,13..20,128..143]);
if unitn=0 then exit(Remove);
with mounttbl[UnitCalc(unitn)] do begin
vol:=0;
fblk:=0;
eblk:=0;
end;
unitstatus(unitn,mounttbl[UnitCalc(unitn)],set_info);
(* gotoxy(0,unitn-11); DisplayUnit; *)
end;
Procedure Vary;
begin
gotoxy(0,0); write(chr(29));
writeln('Vary volume size if < filesize');
repeat
gotoxy(0,1);
write('Vary Unit [0,13..20,128..143] #'); readln(unitn);
until (unitn in [0,13..20,128..143]);
if unitn=0 then exit(vary);
unitstatus(unitn,mounttbl[UnitCalc(unitn)],get_info);
unitread(unitn,dir,sizeof(dir),dirblk);
(* if dir[0].dfkind not in [securedir,untypedfile] then
dir[0].dfkind:=untypedfile; *)
with mounttbl[UnitCalc(unitn)] do dir[0].deovblk:=eblk-fblk;
unitwrite(unitn,dir,sizeof(dir),dirblk);
end;
Procedure Create;
var f : file;
dirname : tid;
ch : char;
begin
gotoxy(0,0); write(chr(29));
writeln('Create a sub-volume file. Enter vol:name[blks] ');
write(chr(29),'Filename? '); readln(dirname);
write(chr(29),'Create ',dirname,'? (y/n)');
repeat read(ch); write(chr(8)) until ch in ['Y','y','N','n'];
if ch in ['Y','y'] then
begin
rewrite(f,dirname);
close(f,lock);
end;
end;
begin
cmndset:=['V','v','D','d','M','m','L','l','C','c','F','f','Q','q'];
repeat
View;
gotoxy(0,0); write(chr(29));
write (chr(15),'DiskMount: ',chr(14),
'L(ist Dir., ','C(reate, ','M(ount, ','D(ismount, ','V(ary, ',
'F(iler, ','Q(uit');
repeat read(ch); write(chr(8)) until (ch in cmndset);
case ch of
'L','l' : Catlg;
'V','v' : Vary;
'M','m' : Add;
'D','d' : Remove;
'C','c' : Create;
'F','f' : begin
setcval('*diskmount'); setchain('*system.filer.');
exit(diskmount)
end;
'Q','q' : begin (* do nothing *) end
end;
until (ch in ['Q','q']);
end.