// DiExMSG.bcpl
get "DiEx.defs"
static [ saveMsgS=0; thisErr=0 ]
let saveErr(lvDA,status,ec) be
[ unless T>>P.MsgEnable do return
rv DAstart = displayCB; MsgS = saveMsgS
status = status & #7777
let xstatus = status & #777
test ec eq 1
ifso
[
Msg("*n*nError on $S pass $UD",WritePass? "Write","Read",pass)
Msg(" of Drive #$D: ",DiskSel)
Msg("Track $3D, Head $D,Sector $D had ", lvDA>>DA.track, lvDA>>DA.head, lvDA>>DA.sector)
]
ifnot Msg("*n again ")
Msg("Status of $6UF0O.", xstatus)
if (ec eq 1) % (not thisErr) then thisErr = errTable + DiskSel*maxEntries*lET
status = status % #7000
if ec eq 1 then
[
let block = 0
[
if rv lvDA eq thisErr>>ET.Addr & status eq thisErr>>ET.status then break
if block eq maxEntries-1 then [ thisErr>>ET.Addr = thisErr>>ET.Addr + 1; break ]
if thisErr>>ET.status eq 0 then
[ thisErr>>ET.Addr = rv lvDA; break ]
thisErr = thisErr + lET
block = block + 1
] repeat
thisErr>>ET.softErr = thisErr>>ET.softErr+1
]
thisErr>>ET.status = thisErr>>ET.status % status
if ec eq maxEC then
[
thisErr>>ET.softErr = thisErr>>ET.softErr-1
thisErr>>ET.hardErr = thisErr>>ET.hardErr+1
]
Wait(300); RestartDiex()
]
and ListET(drive) be
[ let disko = false
let LF(wide) be [ Msg("*n");if wide then Msg("*n") ]
//let diskoTemp = disko
let MsgStemp = MsgS
let bitmask = 1b15
let FromDr = drive
let ToDr = drive
if drive eq true then return
//[
//disko = OpenFile("PACKERR",ksTypeWriteOnly,charItem); MsgS=0
//FromDr = FirstDr; ToDr=LastDr
//]
for dr = FromDr to ToDr do
[driveLoop
thisErr = errTable + dr*maxEntries*lET
let errors, CheckErr, noResponse = 0,0,0
let Final1, Final2, Final3 = 0,0,0
Msg(" Summary of errors found while running Drive #$D with Pack Serial Number #............",dr)
LF(disko)
PrintBits(dr)
if not thisErr>>ET.status then [ Msg(" No errors found."); goto exit ]
LF(disko)
Msg("DA > Cyl, Head, Sector: Status** SoftErs HardErs *n")
for block = 1 to maxEntries do
[
let last1 = block eq maxEntries
if not thisErr>>ET.status then break
let status = thisErr>>ET.status & #777
let burst = thisErr>>ET.burstBits
let burstSize = 0
while burst do [ burst = burst rshift 1; burstSize=burstSize+1 ]
if last1 then Msg("*n. . . etc.*n# of remaining errors")
Msg("*n $3F0D $2F0D $2F0D $6F0UO", thisErr>>ET.track% last1,thisErr>>ET.head% last1,thisErr>>ET.sector% last1,status)
Msg(" $5F0UD $5F0UD ", thisErr>>ET.softErr, thisErr>>ET.hardErr )
//if thisErr>>ET.status eq 7 then Msg("$2D words", thisErr>>ET.burstBits)
if thisErr>>ET.finalStatus eq 1 then Final1 = true
if thisErr>>ET.finalStatus eq 2 then Final2 = true
if thisErr>>ET.finalStatus eq 3 then Final3 = true
errors = errors % status
//if status eq 1 then CheckErr = true
if not status then noResponse = true
thisErr = thisErr + lET
]
LF(disko)
Msg("*n--------")
LF(disko)
Msg("** Status bits indicate the following:*n ")
while bitmask ne 2 do
[
if (bitmask & errors) ne 0 then
[ Msg("$6F0UO = ",bitmask); TypeErrors(bitmask) ]
bitmask = bitmask rshift 1
]
//if CheckErr then [ Msg("000001 = "); TypeErrors(7) ]
if noResponse then [ Msg("000000 = "); TypeErrors(-1) ]
if Final1 then [ Msg("000001 = "); TypeErrors(1) ]
if Final2 then [ Msg("000002 = "); TypeErrors(2) ]
if Final3 then [ Msg("000003 = "); TypeErrors(3) ]
exit:
LF(disko)
]driveLoop
if drive eq true then if disko then Closes(disko)
//disko = diskoTemp
Msg("*n*n>>")
MsgS = MsgStemp
]
and PrintBits(drive; numargs nargs) be
[
if nargs eq 0 then drive = 0
FLD(29,drive)
FML(29,FLDI(31,2+8+256))
FML(29,FLDI(31,16))
Msg("*nTotal bits Read = "); PrintFP(29)
Msg(" during $UD *"test$S*" of the disk.",totalPasses,totalPasses eq 1? "","s")
]
and PrintFP(ac) be
[
if FCM(ac,FLDI(31,1000)) ls 0 then [ Msg("$D",FTR(ac)); return ]
let power = 3
FLDI(30,10)
FLDI(31,10000)
while FCM(ac,31) ge 0 do [ FDV(ac,30); power = power+1 ]
let num = FTR(ac)
Msg("$D.$3F0D**10↑$D",num/1000,num rem 1000,power)
]
and initCounters() be
[ totalPasses = 0; for dr = 0 to 7 do FLDI(dr,0); Zero(errTable,ETsize) ]
and PrintContents(cb, doneOK) be
[
MsgS = saveMsgS
if CheckInput() then return
let printBlk(type, blk, com) =valof
[ let str = nil; let done = nil
switchon type into
[
case 0: str = "*nHeader - "; done = 2; endcase
case 1: str = "*nLabel - "; done = 8; endcase
case 2: str = "*nData - "; done = 256; endcase
]
Msg(str)
test com eq diskRead
ifso Msg("read:")
ifnot Msg("checked against:")
let cnt = 0
for L = 1 to 32 do
[
Msg("*n$4O: ",cnt)
for i = 0 to 7 do
[ Msg(" $6F0UO",blk!cnt); cnt=cnt+1; if cnt eq done then resultis false ]
if CheckInput() then resultis true
]
resultis false
]
let rDA = cb>>CB.diskAddress
let vDA = VirtualDA(lv rDA)
if doneOK then Msg("*n*nData read from virtual disk address = $UD ($3D,$D,$D); ",vDA, rDA<<DA.track, rDA<<DA.head, rDA<<DA.sector)
if printBlk(0, cb>>CB.headerAddress, cb>>CB.command.headerAction) then return
if printBlk(1, cb>>CB.labelAddress, cb>>CB.command.labelAction) then return
if printBlk(2, cb>>CB.dataAddress, cb>>CB.command.dataAction) then return
let Exit = 6000; Msg(" ... Continue?")
[ if CheckInput() % (Exit eq true) then break; Exit = Exit-1; Wait(100) ] repeat
if Exit ne true then GetChar() //read out the continue character
]