// MPEScan.bcpl -- machine-independent part of PE scan overlay // Last editted: 20 June 1979 get "mdecl.d" get "mcommon.d" external [ // OS Zero // MASM Wss; @WssCSS; PutsCSS; ResetsCSS; ResetsCS1; WssCS1 // MIOC DWns; DataToStream // MMENU CreateAction; @WsMarkA; ItemStream // MCMD CmdCommentStream; CmdCS1; WnsCSSD; FormCmdMenu QuitCmdOverlay; DisplayError; SetAbort; CmdAbort; @CmdAbortAct // MGO @CantContinue // MINIT0 @ACTS // Machine-dependent resident @MEMNAM; @MEMCON; @MEMWID; @MEMFORMS; @NMEMS // Machine-dependent pe-scan overlay ScanForPE // Defined here PEScan; ReportPE; PEScanning ] static [ PEScanning = 0 ] let PEScan(nil,nil) = valof [ SetAbort(lv CmdAbort,0) ACTS!1 = CreateAction("Scan-and-report",lv ScanMems,true) ACTS!2 = CreateAction("Scan-for-totals",lv ScanMems,false) let I = 3; ACTS!0 = 0 for X = 0 to NMEMS-1 do [ if (MEMCON+X)>>MRType.HasParity ne 0 do [ ACTS!I = CreateAction(MEMNAM!X,lv ScanAct,I) ACTS!(I+1) = X; ACTS!(I+2) = true; I = I+3; ACTS!0 = ACTS!0+1 ] ] PEScanning = false; resultis PEScanMenu ] and PEScanMenu(nil,nil) be [ ResetsCSS(); ResetsCS1() WsMarkA(CmdAbortAct) //PEScanning serves here as a menu switch and may also be used by //the machine-dependent memory read procedures, if they do something //special during a PEscan. if PEScanning then return WssCSS("Scan for parity errors in: ") WsMarkA(ACTS!1); WsMarkA(ACTS!2) let I = 3 for J = 1 to ACTS!0 do [ if ACTS!(I+2) then [ Wss(ItemStream,"not-"); WssCSS(MEMNAM!(ACTS!(I+1))) PutsCSS($ ) ] WsMarkA(ACTS!I); I = I+3 ] ] and ScanAct(I,nil,nil) be [ ACTS!(I+2) = not ACTS!(I+2) FormCmdMenu() ] and ScanMems(WaitP,nil,nil) be [ CantContinue = CantContinue % didPEscan PEScanning = true FormCmdMenu() let NPETab = vec 40 //Vector to accumulate totals Zero(NPETab,40); NPETab!0 = 2 let J = 3 //The machine-dependent ScanForPE(MemX,WaitP,Vec) routine sets NPETab!1 //to true if any errors are detected. NPETab!0 points at the next //free table entry which should be filled out as follows for each //error total: // NPETab!(NPETab!0) = error total // NPETab!(NPETab!0+1) = string 1 in summary // NPETab!(NPETab!0+2) = string 2 in summary = memory name for I = 1 to ACTS!0 do [ if ACTS!(J+2) then [ ScanForPE(ACTS!(J+1),WaitP,NPETab) ] J = J+3 ] ResetsCSS(); ResetsCS1() test NPETab!1 eq 0 ifso WssCSS("No errors") ifnot [ WssCSS("PE totals:"); let FirstS = " " for I = 2 to NPETab!0 by 3 if NPETab!I ne 0 do [ WssCSS(FirstS); WnsCSSD(NPETab!I) WssCSS(NPETab!(I+1)); WssCSS(NPETab!(I+2)) FirstS = ", " ] ] PEScanning = false QuitCmdOverlay() ] and ReportPE(NPETab,NPEX,DVec,MemX,AVec,WaitP) be [ if WaitP & (NPETab!NPEX < 20) do [ ResetsCSS(); WssCSS("PE in ") WssCSS(NPETab!(NPEX+2)); WssCSS(" at ") DWns(CmdCommentStream,AVec) ResetsCS1(); WssCS1("Data is: ") DataToStream(CmdCS1,MEMFORMS!MemX,MEMWID!MemX,DVec) PEScanning = false DisplayError(0,"Continue",0,0) PEScanning = true ] NPETab!NPEX = NPETab!NPEX+1 NPETab!1 = true ]