%include "CONFIG.INC"
%include "COMMON"
%include "UTILITY.INC"
%include "DISQIO.INC"
%include "I:UTIL.INC"

%constinteger dollars      = 16_F9FF
%constinteger dots         = 16_F396

%constinteger subliminal 1 = dollars << 16 ! dots
%constinteger subliminal 2 = dots    << 16 ! dots

%constinteger anon         = 16_087F5780

%constinteger temporary    = 62400

%constinteger F permission = 3
%constinteger R permission = 2
%constinteger O permission = 1
%constinteger N permission = 0

%constinteger owner  permission shift = 14
%constinteger public permission shift = 12
%constinteger archive bit       shift = 11

%constinteger files       mask = 2_00 00 0 00 0 1111 1111
%constinteger bytes       mask = 2_00 00 0 00 1 1111 1111
%constinteger permissions mask = 2_11 11 1 00 0 0000 0000 ! 16_FFFF0000
%constinteger FRA              = 2_11 10 1 00 0 0000 0000 ! 16_FFFF0000
                                                           {** FRIG **}
%constinteger time        mask = 2_0000 0 111 1111 1111

%constinteger transient file   = 16_8000 ! 16_FFFF0000     {** FRIG **}
%constinteger dud       file   = 16_4000

%routine display directory(%record(directory fm)%name d)
   %record(entry fm)%name file
   %record(header fm)%name header
   %record(extent fm)%name extent
   %string(31) s
   %integer x, i, j
      header == d_header
      printstring("Directory ");  printstring(unpack(header_owner, 0))
      newline
      %if header_files & files mask = 0 %start
         printstring("No files");  newline
         %return
      %finish
      ! x = extent limit
      %for i = 1, 1, header_files & files mask %cycle
         file == d_file(i)
         printstring("File ");  write(i, 0);  printstring(": ")
         printstring(unpack(file_name1, file_name2))
         print symbol('?') %if file_status & dud       file # 0
         print symbol('!') %if file_status & transient file # 0
         newline
         ! %for j = file_extents, 1, x %cycle
         !    extent == d_extent(j)
         !    printstring("   Extent ");  write(j - file_extents, 2)
         !    printstring(" (");  write(j, 2);  printstring(")  ")
         !    write(extent_start, 5);  write(extent_size, 5)
         !    newline
         ! %repeat
         ! x = file_extents - 1
      %repeat
%end

%ownintegerarray zero(1 : 512) = 0(*)

%begin
   %record(directory fm) directory
   %record(header fm)%name header
   %record(entry fm)%name file
   %integer part, slot, d addr, zap
   %integername x
      prompt("Partition: ");  read(part)
      prompt("Slot: ");  read(slot)
      d addr = pd start(part) + 4 * slot - 4
      printstring("Directory is at ");  write(d addr, 0);  newline
      x == transfer(D read ! D verify, 2048, d addr << 9, %c
                    integer(addr(directory)))
      %cycle;  %repeat %until x # 0
      display directory(directory)
      prompt("Zap? ");  read symbol(zap) %until zap & 127 > 32
      %stop %if zap # 'Y'
      x == transfer(D write ! D verify, 2048, d addr << 9, %c
                    zero(1))
      %cycle;  %repeat %until x # 0
%endofprogram
