// DiExStatus.bcpl get "DiEx.defs" static @CurrentDr manifest noStat = -1 let DisplayStatus() be [ Active = false DisplayParam(ListETable, 0, Tab3) DisplayParam(GetStatus, 0, Tab2) DisplayParam(DoRestore, 0, Tab1) DisplayParam(ResetET, 1, Tab0) DisplayParam(Chain, 8, Tab3) ] and GetStatus() be [ external TP2 if Returns eq 0 then CurrentDr = FirstDr let status = nil let last1 = Button(Left%Middle,Up) if Active then test last1 ifnot return ifso [ SelectDrive(CurrentDr,false); status = DiskStatus() if last1 eq Left then break Wait(1000) if Button(Left%Middle,Down) then break ] repeat //unless status<<DST.sector eq #17 then [ CurrentDr = CurrentDr ls LastDr? CurrentDr+1,FirstDr ] PrintParam("Print Status") ] and DoRestore() be [ SendHint("Middle button will invoke repeated restores until left button") if Returns eq 0 then CurrentDr = FirstDr let last1 = Button(Left%Middle,Up) if Active then [ test last1 ifnot return ifso [ SelectDrive(CurrentDr,true) if last1 eq Left then break Msg("↑") Wait(50) if Button(Left%Middle,Up) then [ Msg("*n>>"); break ] ] repeat DiskStatus() //unless status<<DST.sector eq #17 then [ CurrentDr = CurrentDr ls LastDr? CurrentDr+1,FirstDr ] ] PrintParam("Restore Disk") ] and Chain() be [ if NewBoolian("Chain disk commands for full speed operation. - no chaining for testing bad hardware") then T>>P.Chain = T>>P.Chain eq 0 PrintParam("Chain: $S",T>>P.Chain?"Yes","No") ] and ListETable(Print,FT) be [ if Returns eq 0 then CurrentDr = FirstDr if NewBoolian("Print contents of Error Table") then [ ListET(CurrentDr); CurrentDr = CurrentDr ls LastDr? CurrentDr+1,FirstDr ] PrintParam("List E.T.") ] and ResetET(Print,FT) be [ if NewBoolian("Clear contents of Error Table",true) then [ initCounters(); Hint("Done") ] PrintParam("Reset E.T.") ] and ResetDisk(restore) be [ external [ Idle; InitializeCbStorage; GetCb; DoDiskCommand ] let CA = vec 256 let zone = vec CBzoneLength InitializeCbStorage(zone, 1, CBzoneLength, 0) let cb1 = GetCb(zone) let cb2 = GetCb(zone) let DA1,DA2 = 0,0 DA1<<DA.restore = 1 DA2<<DA.track = restore? T>>P.FirstCyl, lastDiskAddress>>DA.track @lastDiskAddress = -1 @nextDiskCommand = 0// In case there is not microcode - assums that the disk is idle if restore then DoDiskCommand(cb1, 0, DA1, 0, 0,msb rshift offset DC.seekOnly )//Restore DoDiskCommand(cb2, 0, DA2, 0, 0,msb rshift offset DC.seekOnly )//do Seek //wait for command issued for i = 0 to 32000 do if (cb2>>CB.status & DSTdoneBits) ne 0 then break //if diskStatus>>DST.NotLoaded eq 3 then return //wait for seek completed for i = 0 to 32000 do [ Idle(); if diskStatus>>DST.seekInProgress ne 1 then break ] ] and SelectDrive(drive,reset) be [ if (drive eq DiskSel) & not reset then return DiskSel=drive ResetDisk(true) ] and DiskStatus() =valof [ @diskStatus = noStat Msg(" Diablo-$S Disk status:",nTracks eq 203? "31","44") Wait(20) if @diskStatus ne noStat then [ Msg(" for Drive #$D: Last track ",lastDiskAddress>>DA.disk) test @lastDiskAddress eq true ifso Msg("unknown") ifnot Msg("= $D",lastDiskAddress>>DA.track) Msg(", Current sector = $D.*n",diskStatus>>DST.sector) ] test (@diskStatus & #367) ne 0 ifso Msg(" Status error(s) are:*n ") ifnot Msg(" No errors.*n") TypeErrors(@diskStatus,false) Msg("*n*n>>") resultis @diskStatus ] and TypeErrors(status,ComStat; numargs nargs) be [ if nargs ls 2 then ComStat = true let sndmsg(txt) be Msg("$S*n ",txt) if status eq noStat then [ sndmsg("No response from Disk Microcode"); return ] if status<<DST.CompairErr & ComStat then sndmsg("DiEx Read and Check Error!") if status<<DST.seekFailed then sndmsg("Seak Incomplete!") test status<<DST.NotLoaded eq 3 ifso sndmsg("Heads not loaded") ifnot [ if status<<DST.seekInProgress then sndmsg("Seek in Progress") if status<<DST.notReady then sndmsg("Drive NOT ready") ] if status<<DST.dataLate then sndmsg("Data Late; Write inhibeted!") if ComStat & status<<DST.noTransfer then sndmsg("No Transfer last sector!") if status<<DST.checksumError then sndmsg("Checksum Error - read data invalid!") if status<<DST.finalStatus eq 1 then sndmsg("Hardware Error or Sector Overflow!") if status<<DST.finalStatus eq 2 then sndmsg("Check Err on 'Read and compair'!") if status<<DST.finalStatus eq 3 then sndmsg("Disk command with Illegal Sector!") ]