// D1SimRes.bcpl -- resident control program for "SimGo" and "SimTest". // 9 May 1983 get "d1.d" manifest [ get "d1regmem.d" ] manifest [ get "d1dmux.d" ] external [ // OS DoubleAdd // MINIT0 @MBlock; TimeStream // MASM Wss; @WssCSS; ResetsCSS // MDATA @LoopCount // MIOC DWns // MOVERLAY FlushOverlays // MRGN RemoveFromEveryTimeList // MMENU PrintActionTime // MCMD WnsCSSD; QuitCmdOverlay; PassiveOnly // MGO @QuitF // D1I0 @OldDMuxTab; @DMuxTab; HWStatus // D1ACTIONS @LongOne // D1ASM @DoStrobe; ReadDMux; LoadDMD // D1RES ReadAllRegs // D1GO MStopped; OneStep; GetHMask // D1POKE PassivePending // D1SIMT LoadandDoInst // D1SIMDEC DSimulate // D1SIMINI SimAborted // Defined here SimGo; SimTestAbort; SimGoAbort; SimLp ] //SimGo is put on EveryTimeList by StartSim. It is resident so that the //simulation overlay can be flushed before calling PrintErrors overlay. let SimGo(GoV) be [ if (DMuxTab!dESTAT & GetHMask()) ne 0 do //Real halt [ SimFinish(); MStopped(true) ] if SimAborted do //Control-C [ SimFinish(); WssCSS(", Aborted"); MStopped() ] MBlock(OldDMuxTab,DMuxTab,DMUXlen) DoStrobe(Clock); OneStep(Control+SetRun+SetSS) ReadDMux() let NDE = DSimulate(2) if NDE ne 0 do //Simulation failure [ SimFinish() WssCSS(", "); SimEPrin(NDE); MStopped(true) ] SimLoopPrint() ] and SimGoAbort(nil,nil,nil) be SimAborted = true //FlushOverlays to make space for the go overlay that might come in when //MStopped is called. and SimFinish() be [ LoadDMD(RunEnable+(HWStatus>>HWStatus.RunControl)) if PassivePending then PassiveOnly = true FlushOverlays() ] and SimLoopPrint() be [ DoubleAdd(LoopCount,LongOne) if (LoopCount!1 & #37) eq 0 do [ PrintActionTime(); Wss(TimeStream,", ") DWns(TimeStream,LoopCount) ] ] and SimEPrin(NErrs) be [ WnsCSSD(NErrs); WssCSS(" DMux errs") ] and SimTestAbort(NErrs,nil,nil) be [ SimFinish() RemoveFromEveryTimeList(QuitF); ResetsCSS() test NErrs eq 0 ifso WssCSS("Mouse halt") ifnot SimEPrin(NErrs) ReadAllRegs(1) QuitCmdOverlay() ] and SimLp(nil) be [ MBlock(OldDMuxTab,DMuxTab,DMUXlen) LoadandDoInst() let E = DSimulate(2) if E ne 0 then SimTestAbort(E) SimLoopPrint() ]