{ChipTest.mc, HGM, 4-Nov-84 2:29:05} {Chip Tester for Dicentra memory. See FTCS-7 pg 81.} Reserve[0F5F, 0FFF]; {section used by the CP Kernel } SetTask[0]; StartAddress[Go]; RegDef[bank, R, 0]; {Current bank} RegDef[highBank, U, 0]; {Highest bank to test} RegDef[lowBank, U, 1]; {Lowest bank to test} RegDef[address, R, 1]; {Word within bank} RegDef[rhAddr, RH, 1]; RegDef[addres2, R, 2]; RegDef[rhAdr2, RH, 2]; RegDef[expected, R, 3]; RegDef[rhEx, RH, 3]; RegDef[found, R, 4]; RegDef[found2, R, 5]; RegDef[found3, R, 6]; RegDef[diff, U, 10]; RegDef[picked, U, 11]; RegDef[dropped, U, 12]; RegDef[rA, R, 0A]; RegDef[rB, R, 0B]; RegDef[rC, R, 0C]; RegDef[passCount, R, 0E]; {number of good passes} RegDef[test, RH, 0E]; {current test} Set[Test.Zero, 0]; Set[Test.One, 1]; Set[Test.Two, 2]; Set[Test.Three, 3]; Set[Test.Four, 4]; Trap: rA ← RRot1 ErrnIBnStkp, ClrIntErr, CANCELBR[$, 0F], c1, at[0]; Xbus ← rA LRot0, XwdDisp, c2; DISP2[TrapType], c3; Parity: GOTO[GoToGo], c1, at[0,4,TrapType]; Init: GOTO[GoToGo], c1, at[1,4,TrapType]; Stack: GOTO[GoToGo], c1, at[2,4,TrapType]; IB: GOTO[GoToGo], c1, at[3,4,TrapType]; GoToGo: Noop, c2; Noop, GOTO[Go], c3; Go: rhAdr2 ← 0, c1; Noop, c2; Noop, c3; addres2 ← 010, c1; addres2 ← addres2 LRot8, c2; addres2 ← addres2 + 018, c3; IO ← [rhAdr2, addres2 + 0], c1; MDR ← 0A, {Disarm 40.96ms int and Watchdog} c2; Noop, c3; IO ← [rhAdr2, addres2 + 0], c1; MDR ← 040, {Ack it (in case)} c2; Noop, c3; {Give interrupt time to go away.} Noop, c1; Noop, c2; Noop, c3; Noop, c1; Noop, c2; Noop, c3; passCount ← 0, test ← Test.Zero, ClrIntErr, c1; ExtCtrl ← 5, {Init Incr, Zero, UnBlank} c2; addres2 ← 0, GOTO[MainLoop], c3; {------------------------------------------------------------------------------------} MainLoop: Noop, c1; MainLoop2: Noop, c2; MainLoop3: bank ← lowBank, c3; NewBank: Noop, c1; rhAddr ← bank LRot0, MesaIntBr, c2; rhAdr2 ← bank LRot0, BRANCH[$, MesaInt], c3; Noop, c1; Xbus ← test, XDisp, c2; DISP4[DoIt], c3; NextBank: Noop, c2; bank ← bank + 1, c3; Q ← highBank, c1; Q ← Q - bank, NegBr, c2; BRANCH[NewBank, NextTest], c3; NextTest: ExtCtrl ← 3, {Gets Bumped on rising edge} c1; ExtCtrl ← 7 c2; Xbus ← test, XDisp, c3; RET[NewTest], c1; {------------------------------------------------------------------------------------} ZeroFinished: addres2 ← 0, c2, at [Test.Zero, 10, NewTest]; test ← Test.One, GOTO[MainLoop], c3; OneFinished: addres2 ← addres2 + 1, CarryBr, c2, at [Test.One, 10, NewTest]; BRANCH[$, DoTestTwo], c3; GOTO[MainLoop2], c1; DoTestTwo: addres2 ← 0, c1; test ← Test.Two, GOTO[MainLoop3], c2; TwoFinished: addres2 ← addres2 + 1, CarryBr, c2, at [Test.Two, 10, NewTest]; BRANCH[$, DoTestThree], c3; GOTO[MainLoop2], c1; DoTestThree: addres2 ← addres2 xor ~addres2, c1; test ← Test.Three, GOTO[MainLoop3], c2; ThreeFinished: addres2 ← addres2 - 1, CarryBr, c2, at [Test.Three, 10, NewTest]; BRANCH[DoTestFour, $], c3; GOTO[MainLoop2], c1; DoTestFour: addres2 ← addres2 xor ~addres2, c1; test ← Test.Four, GOTO[MainLoop3], c2; FourFinished: addres2 ← addres2 - 1, CarryBr, c2, at [Test.Four, 10, NewTest]; BRANCH[DoTestOne, $], c3; GOTO[MainLoop2], c1; DoTestOne: passCount ← passCount + 1, c1; addres2 ← 0, c2; test ← Test.One, GOTO[MainLoop] c3; {------------------------------------------------------------------------------------} {Initialize whole world to 0.} WriteZeros: expected ← 0, c1, at[Test.Zero,10,DoIt]; address ← 0, c2; Noop, c3; WriteZeroLoop: MAR ← [rhAddr, address + 0], c1; MDR ← expected, address ← address + 1, CarryBr, c2; BRANCH[WriteZeroLoop, $], c3; GOTO[NextBank], c1; {------------------------------------------------------------------------------------} {Do Up transition in forward scan.} PassOne: expected ← 0, GOTO[Forward], c1, at[Test.One,10,DoIt]; {Do Down transition in forward scan.} PassTwo: expected ← expected xor ~expected, GOTO[Forward], c1, at[Test.Two,10,DoIt]; Forward: address ← addres2, c2; [] ← 0, ZeroBr, c3; {Check [addres2..FFFF].} ForwardA: MAR ← [rhAddr, address + 0], BRANCH[BugFA1, $], c1; address ← address + 1, CarryBr, c2; found ← expected xor MD, ZeroBr, BRANCH[ForwardA, $], c3, LOOPHOLE[stw]; BRANCH[BugFA2, $], c1; expected ← ~expected, c2; Noop, c3; ForwardStore: MAR ← [rhAdr2, addres2 + 0], c1; MDR ← expected, c2; Noop, c3; address ← addres2, c1; Noop, c2; [] ← 0, ZeroBr, c3; {Check [0..addres2] (scanning backwards).} ForwardB: MAR ← [rhAddr, address + 0], BRANCH[BugFB1, $], c1; address ← address - 1, CarryBr, c2; found ← expected xor MD, ZeroBr, BRANCH[$, ForwardB], c3, LOOPHOLE[stw]; ForwardEnd: BRANCH[BugFB2, $], c1; Noop, c2; Noop, c3; GOTO[NextBank], c1; {------------------------------------------------------------------------------------} {Do Up transition in reverse scan.} PassThree: expected ← 0, GOTO[Reverse], c1, at[Test.Three,10,DoIt]; {Do Down transition in reverse scan.} PassFour: expected ← ~expected xor expected, GOTO[Reverse], c1, at[Test.Four,10,DoIt]; Reverse: address ← addres2, c2; [] ← 0, ZeroBr, c3; {Check [0..addres2] (scanning backwards).} ReverseA: MAR ← [rhAddr, address + 0], BRANCH[BugRA1, $], c1; address ← address - 1, CarryBr, c2; found ← expected xor MD, ZeroBr, BRANCH[$, ReverseA], c3, LOOPHOLE[stw]; BRANCH[BugRA2, $], c1; expected ← ~expected, c2; Noop, c3; ReverseStore: MAR ← [rhAdr2, addres2 + 0], c1; MDR ← expected, c2; Noop, c3; address ← addres2, c1; Noop, c2; [] ← 0, ZeroBr, c3; {Check [addres2..FFFF].} ReverseB: MAR ← [rhAddr, address + 0], BRANCH[BugRB1, $], c1; address ← address + 1, CarryBr, c2; found ← expected xor MD, ZeroBr, BRANCH[ReverseB, $], c3, LOOPHOLE[stw]; ReverseEnd: BRANCH[BugRB2, $], c1; Noop, c2; ReverseEnd3: Noop, c3; GOTO[NextBank], c1; {------------------------------------------------------------------------------------} BugFA1: found ← found xor expected, CANCELBR[Retreat], c2; BugFA2: found ← found xor expected, CANCELBR[Retreat], c2; BugFB1: found ← found xor expected, CANCELBR[Advance], c2; BugFB2: found ← found xor expected, CANCELBR[Advance], c2; BugRA1: found ← found xor expected, CANCELBR[Advance], c2; BugRA2: found ← found xor expected, CANCELBR[Advance], c2; BugRB1: found ← found xor expected, CANCELBR[Retreat], c2; BugRB2: found ← found xor expected, CANCELBR[Retreat], c2; Advance: address ← address + 1, GOTO[Error], c3; Retreat: address ← address - 1, GOTO[Error], c3; Error: Noop, c1; Noop, c2; found2 ← MD, c3, LOOPHOLE[mdok]; MAR← [rhAddr, address + 0], c1; Noop, c2; found3 ← MD, c3; Q ← found xor expected, c1; diff ← Q, c2; Noop, c3; rA ← Q and ~expected, c1; picked ← rA, c2; Noop, c3; rA ← Q and expected, c1; dropped ← rA, c2; Noop, c3; DataMismatch: Noop, c1; Noop, c2; GOTO[Go], c3; {------------------------------------------------------------------------------------} MesaInt: addres2 ← 010, c1; addres2 ← addres2 LRot8, c2; addres2 ← addres2 + 018, c3; IO ← [rhAdr2, addres2 + 0], c1; rB ← ExtStat, c2; rA ← MD, c3; MesaIntIsProbablyAParityError: Noop, c1; Noop, c2; GOTO[Go], c3; {------------------------------------------------------------------------------------}