//D1HWCheck.bcpl -- hardware checkout stuff inappropriate for "Test" // 23 May 1983 get "mcommon.d" get "d1.d" manifest [ get "d1regmem.d" ] manifest [ get "d1dmux.d" ] external [ // OS Zero; DoubleAdd // MINIT0 @MBlock; @ACTS // MIDAS MidasSwat // MASM @WssCSS; WssCS1; ResetsCS1; GetField // MDATA @LoopCount; @ShouldBe; DWatch // MIOC SimpleTexttoDVec // MTXTBUF InputTextBuffer // MRGN RemoveFromEveryTimeList; AddToEveryTimeList; UpdateDisplay // MMENU CreateAction; @WsMarkA // MGO @QuitF; @CantContinue // MCMD SetAbort; @CmdAbortAct; QuitCmdOverlay; FormCmdMenu; ErrorExit WnsCSS; WnsCS1D // MPATTERN NextData; @PATTERN // D1I0 @DMuxTab; @OldDMuxTab; DWrong; HWStatus; @SaveMIR // D1ACTIONS @LongOne // D1MICASM @MCXct // D1MICRES ChangeAltoControl // D1ASM ReadDMux; LoadDWatch; LoadMIR; @D1In; LoadCPReg; @DoStrobe; IMtoMIR // D1RES ReadAllRegs // D1MEM TurnOffRefresh // D1GO OneStep // Defined here HWCheck ] //Use ACTS!20 for menu control, ACTS!21 and ACTS!22 as counters let HWCheck(nil,nil) = valof [ SetAbort(lv HWChkStop,nil) Zero(ACTS+20,3) QuitF = -1 Zero(LoopCount,2) DefM0(0,lv ReadSignal,"Read-DWATCH-Signal") DefM0(1,lv ReadAllDMux,"Read-All-DMux") DefM0(2,lv MCConnectDisconnect,"Connect-Disconnect") DefM0(3,lv AltoControl,"Alto/MC-control") resultis HWChkMenu ] and DefM0(N,lvProc,Str) be [ ACTS!N = CreateAction(Str,lvProc,0) ] and HWChkStop(nil,nil,nil) be [ if QuitF ge 0 then RemoveFromEveryTimeList(QuitF) QuitF = -1 if (ACTS!20 eq 2) % (ACTS!20 eq 4) do Zero(DWatch,2) ReadAllRegs(0); QuitCmdOverlay() ] and HWChkMenu(S,nil) be [ WsMarkA(CmdAbortAct) switchon ACTS!20 into [ case 0: WsMarkA(ACTS!0); WsMarkA(ACTS!1); WsMarkA(ACTS!2) WsMarkA(ACTS!3) case 1: case 2: case 3: case 4: endcase default: MidasSwat(HWChkMenubug) ] ] and ReadSignal(nil,MBunion,nil) be [ if DWatch!1 eq 0 then ErrorExit("DWATCH must be non-0") ACTS!20 = 1 QuitF = AddToEveryTimeList(ReadSignalLp,nil) WssCSS("Reloading DWATCH address and reading DMUX signal ") WnsCSS(DWatch!1); WssCSS(" ...") FormCmdMenu(); UpdateDisplay() ] and ReadSignalLp(nil) be [ for I = 0 to 300 do [ DoubleAdd(LoopCount,LongOne) LoadDWatch() test ((rv D1In) & #4000) ne 0 ifso ACTS!21 = ACTS!21+1 ifnot ACTS!22 = ACTS!22+1 ] ResetsCS1(); WnsCS1D(ACTS!21); WssCS1(" ones, ") WnsCS1D(ACTS!22); WssCS1(" zeroes") ] and ReadAllDMux(nil,MBunion,nil) be [ ACTS!20 = 2 ACTS!21 = -1 PATTERN = 4 //Random pattern CantContinue = CantContinue % didTest Zero(DWrong,DMUXlen) TurnOffRefresh() QuitF = AddToEveryTimeList(ReadDMuxLp,nil) WssCSS("Random instruction DMux signal stability test...") DWatch!1 = 1 //Disable microcomputer ReadDMux() FormCmdMenu(); UpdateDisplay() ] //Execute a random MIR instruction and then read the DMux 3 times, checking //each readout for consistency with the last. Errors are accumulated in //DWrong. Works like SimTest. Legitimately unstable signals, such as the //Ethernet mufflers aren't reported. and ReadDMuxLp(nil) be [ for I = 0 to 10 do [ [ NextData() switchon GetField(22B,10B,ShouldBe) into //FF [ case 36B: //OUTPUT← (avoid activating io devices case 101B: //TEST← (avoid Testing and Mar←Pcf) case 140B: //USEDMD case 141B: //MIDASSTROBE← loop default: break ] ] repeat IMtoMIR(SaveMIR,ShouldBe); LoadMIR(SaveMIR) DoStrobe(Clock); OneStep(Control+SetRun+SetSS) ReadDMux() MBlock(OldDMuxTab,DMuxTab,DMUXlen) DoubleAdd(LoopCount,LongOne) for J = 0 to 2 do [ ReadDMux() for I = 0 to DMUXlen-1 do [ DWrong!I = DWrong!I % (OldDMuxTab!I xor DMuxTab!I) ] ] ] //Don't report legitimate muffler changes as inconsistent. //In ERX0: PDNew, PDOld, PDCnt[0:3], PdCntCtrl, RxCRCError, RxBusRegFull) DWrong!dERX0 = DWrong!dERX0 & 713B //All signals in ERX1. DWrong!dERX1 = 0 //AItem[0:7]/V and BItem[0:7]/V observed varying. DWrong!dITEMS = 0 //ASize* and BSize*/V inconsisten. DWrong!dSPSIZE = DWrong!dSPSIZE & 177700B //AOn/V and BOn/V inconsistent. DWrong!dRESON = DWrong!dRESON & 37777B let NWrong = 0 for I = 0 to DMUXlen-1 do [ let Bad = DWrong!I while Bad ne 0 do [ NWrong = NWrong+1; Bad = Bad-(Bad & -Bad) ] ] if ACTS!21 ne NWrong do [ ACTS!21 = NWrong ResetsCS1(); WnsCS1D(NWrong); WssCS1(" inconsistencies") ] ] and MCConnectDisconnect(nil,MBunion,nil) be [ ACTS!20 = 3 ACTS!21,ACTS!22 = 0,0 let Num = vec 1 if InputTextBuffer!0 ne 0 then if SimpleTexttoDVec(InputTextBuffer,16,Num) do [ if Num>>lh ne 0 then ErrorExit("Unreasonable serial number") WssCSS("Repeatedly connecting to/disconnecting from serial #") WnsCSS(Num>>rh); WssCSS(" ...") HWStatus>>HWStatus.ConnectedMachine = -1 QuitF = AddToEveryTimeList(MCConnectDisconnectLp,Num>>rh) FormCmdMenu(); UpdateDisplay(); return ] ErrorExit("Type serial number first") ] and MCConnectDisconnectLp(N) be [ for I = 0 to 20 do [ LoadCPReg(BSelD+BCNoop+N); DoStrobe(Clock+BaseBAtten) test MCXct(BInt+BCNoop) eq 0 ifso ACTS!22 = ACTS!22+1 ifnot ACTS!21 = ACTS!21+1 LoadCPReg(BSelD+BCNoop+(N xor #377)) DoStrobe(Clock+BaseBAtten) ] ResetsCS1(); WnsCS1D(ACTS!22); WssCS1(" OK connections, ") WnsCS1D(ACTS!21); WssCS1(" failed connections") ] and AltoControl(nil,MBunion,nil) be [ ACTS!20 = 4 DWatch!1 = 1 //Disable HWEveryTime stuff if HWStatus>>HWStatus.ConnectedMachine eq -1 then ErrorExit("Not connected to any machine") WssCSS("Alternating Alto and MC muffler control for scoping ...") QuitF = AddToEveryTimeList(AltoControlLp,nil) FormCmdMenu(); UpdateDisplay() ] and AltoControlLp(nil) be [ for I = 0 to 40 do [ ChangeAltoControl(BAltoControl+BCNoop) //MC controls ChangeAltoControl(BAltoControl+BCNoop+1) //Alto controls DoubleAdd(LoopCount,LongOne) ] ]