[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.