//MDebug.bcpl -- machine-independent part of "Debug" overlay used to //setup for data generation and checking. // Last edited: 16 November 1979 get "mdecl.d" external [ // OS SetBlock; Zero // MASM ResetsCSS; ResetsCS1; @WssCSS; WssCS1; @MBlock; SelfRel // MDATA @DataWas; @ShouldBe; @BitsChecked; @LoopCount @LowAddress; @HighAddress; @CurrentAddress; @AddrIncrement AddrIntersect; AddrUnion; BitsDropped; BitsPicked; TestFailures // MIOC DWns; Wns; DataToStream // MRGN UpdateDisplay; RemoveFromEveryTimeList; AddToEveryTimeList // MMENU CreateAction; @WsMarkA // MCMD FormCmdMenu; SetAbort; ShowActions CmdCommentStream; CmdCS1; @CmdAbortAct // MINIT0 @ACTS // MGO @QuitF // MDEBUGASM PatTab; NPatterns // MPATTERN @RANDIX; RanTab; RanLen; @PATTERN; IncV // xxACTIONS @LongOne // Machine-dependent resident @MEMFORMS; @MEMWID; MDATAmemx // Machine-dependent debug overlay file QuitTest // Defined here GetPattern; ShowPattern; SetupPattern ErrorStop; WriteComment; ContinueGen; SaveDGen; RestoreDGen; Vec60 @NDWords; NActs; STAT1; STAT2; STAT3; TestAborted; FreeRunning LastName; LastRadix ] static [ TestAborted; NActs; DebugProcedure; PATACT STAT1 //First string on status line STAT2 //Second string on status line STAT3 //Number on status line @NDWords = TValSize; FreeRunning = false Vec60; LastName; LastRadix ] let GetPattern(NumActs,DebugProc) = valof [ NActs,DebugProcedure,TestAborted = NumActs,DebugProc,false SetAbort(lv TestStop,0) PATACT = CreateAction(SelfRel(PatTab),lv SetPattern,0) for I = 1 to NPatterns-1 do [ CreateAction(SelfRel(PatTab+I),lv SetPattern,I) ] QuitF = -1; WssCSS("Select data pattern:") resultis DebugMenu ] and SetPattern(PatX,Buttons,nil) be [ PATTERN = PatX; QuitF = -2; FormCmdMenu() ] //The caller must initialize BitsChecked when the new item being tested //differs from the last; also the caller must put a right-justified "1" //into IncV. SetupPattern will then mask BitsChecked by DMask and use //IncV in controlling the SEQUENTIAL, CYC0, and CYC1 test patterns. and SetupPattern(DMask,Name,Radix) be [ Zero(LoopCount,2); Zero(TestFailures,2) Zero(AddrUnion,2); SetBlock(AddrIntersect,-1,2) Zero(BitsDropped,NDWords); Zero(BitsPicked,NDWords) switchon PATTERN into [ case 0: //Zeroes case 7: //AltZO case 5: Zero(ShouldBe,NDWords) //Sequential endcase case 1: SetBlock(ShouldBe,-1,NDWords) //Ones endcase case 3: for I = 0 to TValSize-1 do //Cyc0 [ IncV!I = not IncV!I ] case 2: MBlock(ShouldBe,IncV,NDWords) //Cyc1 case 4: //Random case 6: //Should-Be case 8: endcase //Alt-Should-Be ] for I = 0 to TValSize-1 do BitsChecked!I = BitsChecked!I & DMask!I LastName,LastRadix = Name,Radix ResetsCSS(); ShowPattern("Testing ",Name,Radix) ] and SaveDGen() be [ Vec60!0 = RANDIX MBlock(Vec60+1,RanTab,RanLen) MBlock(Vec60+RanLen+1,ShouldBe,NDWords) ] and RestoreDGen() be [ RANDIX = Vec60!0 MBlock(RanTab,Vec60+1,RanLen) MBlock(ShouldBe,Vec60+RanLen+1,NDWords) ] //Procedure called to continue a test aborted for some reason. //Continues checking with the next word. and ContinueGen(lvProc,Arg) = valof [ TestAborted = false; SetAbort(lv TestStop,0) QuitF = AddToEveryTimeList(rv lvProc,Arg) resultis DebugMenu ] and DebugMenu(nil,nil) be [ WsMarkA(CmdAbortAct) if QuitF eq -2 then DebugProcedure() if QuitF eq -1 do ShowActions(-1,PATACT,NPatterns) ] and TestStop(nil,Buttons,nil) be [ test QuitF ge 0 ifso TestAborted = true ifnot ErrorStop("XXX","") ] and ErrorStop(str1,str2,AVec; numargs NA) be [ test NA > 0 ifso [ if FreeRunning do //Not stopping on errors? [ if (TestFailures!1 < 8) % ((TestFailures!1 & 77B) eq 0) do [ ResetsCS1(); DWns(CmdCS1,TestFailures,32,0,10) WssCS1(" failures in ") DWns(CmdCS1,LoopCount,32,0,10); WssCS1(" iterations") ] return ] ResetsCSS(); WssCSS(str1); WssCSS(str2) if NA ge 3 then DWns(CmdCommentStream,AVec) ] ifnot [ ResetsCSS(); WssCSS("Test halted by mouse") ] if QuitF ge 0 do [ RemoveFromEveryTimeList(QuitF) ] FreeRunning = false QuitTest() ] and ShowPattern(S1,S2,Radix) be [ WssCSS(S1); WssCSS(S2); WssCSS(" with ") WssCSS(SelfRel(PatTab+PATTERN)) WssCSS(", mask = ") DataToStream(CmdCommentStream,MEMFORMS!MDATAmemx,MEMWID!MDATAmemx, BitsChecked,Radix) ] and WriteComment() be [ ResetsCSS(); WssCSS(STAT1); WssCSS(STAT2) if STAT3 ne 177777B then Wns(CmdCommentStream,STAT3,6,8) UpdateDisplay() ]