%include "CONFIG.INC"
%include "DISQIO.INC"

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

%integerfn checksum(%record(bad fm)%name b)
   %integer i, c
      c = 0
      c = c + b_x(i) %for i = 1, 1, 512
      %result = c
%end

%routine open it
   %string(31) bbl
      %on 9 %start
         printstring("Can't open bad-block list file: ")
         printstring(event_message);  newline
         %stop
      %finish
      prompt("BBL file: ");  read(bbl)
      open input(1, bbl)
      select input(1)
%end

%begin
   %record(bad fm) b
   %integer n, x, a, l
   %integername z
      %on 9 %start;  -> read all;  %finish
      b = 0
      n = 0
      open it
      l = -1
      %cycle
         read(x)
         n = n + 1
         b_b(n) = x
         printstring("Bad block ");  write(n, 0)
         printstring(" at ");  write(x, 0)
         newline
         %if x <= l %start
            printstring("Bad ordering");  newline
            %stop
         %finish
         l = x
      %repeat
read all:
      b_stamp = 1
      b_limit = n
      b_checksum = -checksum(b)
      %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 %of %program
