! BADDUMP, a program for dumping out a filestore's bad block list.
! (This will all be a thing of the past with the new discs....)
! GDMR, 14/02/86

include  "INC:UTIL.IMP"

constinteger  bad limit = 512 - 3
recordformat  bad fm((integer  stamp, integerarray  bad(1 : bad limit),
                      integer  last bad, checksum) c 
                 or  integerarray  x(1 : 512))

integerfn  bad checksum(record (bad fm)name  b)
   ! Calculate the checksum for the bad block lists
   integer  i, c
      c = 0
      c = c + b_x(i) for  i = 1, 1, 512
      result  = c
end 

begin 
   record (bad fm)name  bad block list
   integer  start, size, i, last, error
      on  9 start 
         printstring("Error:");  printstring(event_message)
         newline
         stop 
      finish 
      connect file("$:BADLIST", 0, start, size)
      if  size # 4 * 512 start 
         printstring("Bad size for bad list");  newline
         stop 
      finish 
      bad block list == record(start)
      unless  bad checksum(bad block list) = 0 start 
         printstring("Bad block list checksum error")
         newline
         stop 
      finish 
      write(bad block list_last bad, 0)
      printstring(" bad block")
      print symbol('s') if  bad block list_last bad # 1
      printstring(", sequence ");  write(bad block list_stamp, 0)
      print symbol(':');  newline
      last = -1;  error = 0
      for  i = 1, 1, bad block list_last bad cycle 
         write(bad block list_bad(i), 8)
         newline if  i & 7 = 0
         if  bad block list_bad(i) > last start 
            last = bad block list_bad(i) if  error = 0
         else 
            error = 1
         finish 
      repeat 
      newline if  bad block list_last bad & 7 # 0
      if  error # 0 start 
         printstring("Monoticity error at ");  write(last, 0)
         newline
      finish 
end  of  program