%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

%begin
   %record(bad fm) b
   %integer n, x, a
   %integername z
      %on 9 %start;  -> read all;  %finish
      b = 0
      n = 0
      openinput(1,"bad.dat")
      select input(1)
      %cycle
         read(x)
         n = n + 1
         b_b(n) = x
         printstring("Bad block ");  write(n, 0)
         printstring(" at ");  write(x, 0)
         newline
      %repeat
read all:
{}selectinput(0); printstring("'.' to continue:")
{}readsymbol(x) %until x='.'
      b_stamp = 1
      b_limit = n
      b_checksum = -checksum(b)
      %for n = 1, 1, 4 %cycle
         a = (sy2 start + bad area(n)) << 9
{}printstring("Calling driver: ")
{}write(dwrite!dverify,0); write(2048,1); write(a,1); write(addr(b),1); newline
         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
