// IfsScavPrint.bcpl
// Copyright Xerox Corporation 1979
// Last modified December 28, 1979 3:59 AM by Boggs
get "IfsScavenger.decl"
get "AltoFileSys.d"
get "Disks.d"
get "Tfs.d"
external
[
// outgoing procedures
PrintTime; PrintPLME
PrintDiskError; PrintRealDA
// incoming procedures
PutTemplate; Ws
ReadCalendar; DoubleDifference
// incoming statics
dsp; pass; phase; plme
]
//----------------------------------------------------------------------------
let PrintTime(startTime) be
//----------------------------------------------------------------------------
[
let stopTime = vec 1; ReadCalendar(stopTime)
let seconds = DoubleDifference(stopTime, startTime)
if pass ne 0 then PutTemplate(dsp, "*N[$D-$D] ", pass, phase)
PutTemplate(dsp, "Time = $D:$2F0D", seconds/60, seconds rem 60)
]
//----------------------------------------------------------------------------
and PrintPLME(vda) be
//----------------------------------------------------------------------------
[
PutTemplate(dsp, "*N[$D-$D]*TFID $EUO;$UO, page number $UO, num chars $UO",
pass, phase, lv plme>>PLME.sn1, plme>>PLME.vn,
plme>>PLME.pn, plme>>PLME.numChars)
PutTemplate(dsp, "*N[$D-$D]*Tcurrent vda $UO, previous vda $UO, next vda $UO",
pass, phase, vda, plme>>PLME.backP, plme>>PLME.nextP)
]
//----------------------------------------------------------------------------
and PrintDiskError(cb) be
//----------------------------------------------------------------------------
// Called from various Hard disk error routines.
[
if pass ne 0 then PutTemplate(dsp, "*N[$D-$D] ", pass, phase)
PutTemplate(dsp, "Hard disk error at vda $UO ($P)",
cb>>CB.vDiskAddress, PrintRealDA, lv cb>>CB.diskAddress)
PrintDiskStatus("header", lv cb>>CB.CommH)
PrintDiskStatus("label", lv cb>>CB.CommL)
PrintDiskStatus("data", lv cb>>CB.CommD)
]
//----------------------------------------------------------------------------
and PrintDiskStatus(record, kcbBlock) be
//----------------------------------------------------------------------------
// Prints a record status block in human-readable form.
// 'record' is one of the strings "Header", "Label", or "Data".
// 'kcbBlock' is a KCBblock structure from a TFS control block.
[
if pass ne 0 then PutTemplate(dsp, "*N[$D-$D] ", pass, phase)
PutTemplate(dsp, "$S $S status: ",
selecton kcbBlock>>KCBblock.Comm into
[
case diskRead: "read"
case diskCheck: "check"
case diskWrite: "write"
case diskReset: "reset"
case diskRestore: "restore"
case diskNoop: "noop"
default: "unknown action on"
], record)
for i = 0 to 15 do
if (kcbBlock>>KCBblock.Status & 1 lshift i) ne 0 then
Ws(selecton 1 lshift i into
[
case 100000b: "seekIncomplete "
case 40000b: "cylinderOverflow "
case 20000b: "deviceCheck "
case 10000b: "notSelected "
case 4000b: "notOnLine "
case 2000b: "notReady "
case 1000b: "sectorOverflow "
case 400b: "writeDataLate "
case 200b: "readDataLate "
case 100b: "checkError "
case 40b: "readOnly "
case 20b: "offset "
case 10b: "unfixableECC "
default: ""
])
if kcbBlock>>KCBblock.Status eq 1 then Ws("Good")
if kcbBlock>>KCBblock.Status eq 0 then Ws("0")
]
//----------------------------------------------------------------------------
and PrintRealDA(stream, lvRealDA) be
//----------------------------------------------------------------------------
PutTemplate(stream, "cyl $UD hd $UD sec $UD",
lvRealDA>>DA.track, lvRealDA>>DA.head, lvRealDA>>DA.sector)