%constinteger anon = 16_087F5780

%include "Config.Inc"

%include "System:Common"
%include "System:Disqio.Inc"

%include "Inc:Util.Imp"


%recordformat bad fm((%integer stamp, %integerarray b(1 : 512 - 3),
                      %integer limit, checksum) %c
                 %or %integerarray x(1 : 512))

%routine init bad
   %record(bad fm) b
   %integer n, a
   %integername z
      b = 0
      %for n = 1, 1, 4 %cycle
         a = (sy2 start + bad area(n)) << 9
         z == transfer(D write ! D verify, 2048, a, integer(addr(b)))
         %while z = 0 %cycle;  %repeat
         %if z = 2048 %start
            printstring("Bad area ");  write(n, 0)
            printstring(" initialised")
         %else
            printstring("Failed to initialise bad area ")
            write(n, 0)
         %finish
         newline
      %repeat
%end

%begin
   %record(directory fm) dir
   %integer i, p, a
   %integername x
      dir = 0
      dir_header_owner = anon
      dir_header_directory size = 2048
      %for p = 0, 1, last partition %cycle
         %for i = 1, 1, u per p %cycle
            a = pd start(p) + 4 * i - 4
            printstring("Initialising ");  write(p, 3);  write(i, 3)
            printstring(" at ");  phex(a)
            newline
            x == transfer(D write ! D verify, 2048, a << 9, integer(addr(dir)))
            %cycle;  %repeat %until x # 0
            dir_header_owner = 0
         %repeat
      %repeat
      init bad
%end %of %program
