! 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
constinteger heads = 16
constinteger sectors = 32
constinteger cylinders = 1024
include "INC:UTIL.IMP"
include "SYSTEM:CONFIG.INC"
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
ownrecord (bad fm)name bad block list
routine analyse directories(integer p)
integer i, start, finish, e = 0, n, c, h, s
start = pd start(p); finish = pd start(p) + dp size - 1
for i = 1, 1, bad block list_last bad cycle
n = bad block list_bad(i)
exit if n > finish
if n >= start start
printstring(" directory"); write((n - start) // dir size, 3)
printstring(" (")
write(n, 6); printstring(" physical,")
h = n // sectors; s = rem(n, sectors)
c = h // heads; h = rem(h, heads)
write(c, 4); print symbol('C')
write(h, 2); print symbol('H')
write(s, 2); print string("S)")
newline
e = e + 1
finish
repeat
write(e, 4); printstring(" bad directory block")
print symbol('s') if e # 1
newline
end
routine analyse data(integer p)
integer i, start, finish, e = 0, n, c, h, s
start = p start(p); finish = p start(p) + fp size - 1
for i = 1, 1, bad block list_last bad cycle
n = bad block list_bad(i)
exit if n > finish
if n >= start start
write(n - start, 12); printstring(" logical (")
write(n, 6); printstring(" physical,")
h = n // sectors; s = rem(n, sectors)
c = h // heads; h = rem(h, heads)
write(c, 4); print symbol('C')
write(h, 2); print symbol('H')
write(s, 2); print string("S)")
newline
e = e + 1
finish
repeat
write(e, 4); printstring(" bad data block")
print symbol('s') if e # 1
newline
end
begin
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)
last = -1; error = 0
for i = 1, 1, bad block list_last bad cycle
if bad block list_bad(i) > last start
last = bad block list_bad(i) if error = 0
else
error = 1
finish
repeat
printstring(" **monoticity error**") if error # 0
newline
for i = 0, 1, last partition cycle
newline
printstring("Partition "); write(i, 0)
print symbol(':'); newline
analyse directories(i)
analyse data(i)
repeat
end of program