{SccTest.mc, HGM, 12-Feb-85 0:54:50}
Reserve[0F5F, 0FFF]; {section used by the CP Kernel }
SetTask[0]; StartAddress[Go];
RegDef[address, R, 1];
RegDef[rhAddr, RH, 1];
RegDef[address10, R, 2];
RegDef[expected, R, 3];
RegDef[found, R, 4];
RegDef[temp, R, 0D];
RegDef[rhTemp, RH, 0D];
RegDef[passCount, R, 0E]; {number of good passes}
Trap: temp ← RRot1 ErrnIBnStkp, ClrIntErr, CANCELBR[$, 0F], c1, at[0];
Xbus ← temp 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: passCount ← 0, ClrIntErr, c1;
ExtCtrl ← 5, {Init Incr, Zero, UnBlank} c2;
expected ← 0, c3;
address ← 90, c1;
address ← address LRot8, {9000} c2;
address10 ← address + 10, {9010} c3;
MainLoop:
Noop, c1;
Noop, c2;
Noop, c3;
{------------------------------------------------------------------------------------}
FirstLoop:
Noop, c1;
Noop, c2;
Noop, c3;
FirstScc0:
Noop, c1;
Noop, c2;
rhAddr ← 0, {Scc0: 09000} c3;
IO ← [rhAddr, address+00], {WR0B/A} c1;
MDR ← 2, {Shift Left (ADR0 is ignored)} c2;
Noop, c3;
IO ← [rhAddr, address+09], {WR9x} c1;
MDR ← 0C2, {Reset, NV} c2;
Noop, c3;
Scc0IntVector:
IO ← [rhAddr, address10 + 02], {Interrupt Vector} c1;
MDR ← expected, c2;
Noop, c3;
IO ← [rhAddr, address10 + 02], {Interrupt Vector} c1;
Noop, c2;
found ← MD, c3;
[] ← found xor expected, NZeroBr, c1;
BRANCH[$, Scc0IntVecFailed], c2;
Noop, c3;
Scc0ChanBLSB:
IO ← [rhAddr, address + 0C], {Baud Rate Gen, LSB} c1;
MDR ← expected, c2;
Noop, c3;
IO ← [rhAddr, address + 0C], {Baud Rate Gen, LSB} c1;
Noop, c2;
found ← MD, c3;
[] ← found xor expected, NZeroBr, c1;
BRANCH[$, Scc0ChanBLSBFailed], c2;
Noop, c3;
Scc0ChanBMSB:
IO ← [rhAddr, address + 0D], {Baud Rate Gen, MSB} c1;
MDR ← expected, c2;
Noop, c3;
IO ← [rhAddr, address + 0D], {Baud Rate Gen, MSB} c1;
Noop, c2;
found ← MD, c3;
[] ← found xor expected, NZeroBr, c1;
BRANCH[$, Scc0ChanBMSBFailed], c2;
Noop, c3;
Scc0ChanALSB:
IO ← [rhAddr, address10 + 0C], {Baud Rate Gen, LSB} c1;
MDR ← expected, c2;
Noop, c3;
IO ← [rhAddr, address10 + 0C], {Baud Rate Gen, LSB} c1;
Noop, c2;
found ← MD, c3;
[] ← found xor expected, NZeroBr, c1;
BRANCH[$, Scc0ChanALSBFailed], c2;
Noop, c3;
Scc0ChanAMSB:
IO ← [rhAddr, address10 + 0D], {Baud Rate Gen, MSB} c1;
MDR ← expected, c2;
Noop, c3;
IO ← [rhAddr, address10 + 0D], {Baud Rate Gen, MSB} c1;
Noop, c2;
found ← MD, c3;
[] ← found xor expected, NZeroBr, c1;
BRANCH[$, Scc0ChanAMSBFailed], c2;
Noop, c3;
FirstScc1:
Noop, c1;
Noop, c2;
rhAddr ← 1, {Scc1: 19000} c3;
IO ← [rhAddr, address+00], {WR0B/A} c1;
MDR ← 2, {Shift Left (ADR0 is ignored)} c2;
Noop, c3;
IO ← [rhAddr, address+09], {WR9x} c1;
MDR ← 0C2, {Reset, NV} c2;
Noop, c3;
Scc1IntVector:
IO ← [rhAddr, address10 + 02], {Interrupt Vector} c1;
MDR ← expected, c2;
Noop, c3;
IO ← [rhAddr, address10 + 02], {Interrupt Vector} c1;
Noop, c2;
found ← MD, c3;
[] ← found xor expected, NZeroBr, c1;
BRANCH[$, Scc1IntVecFailed], c2;
Noop, c3;
Scc1ChanBLSB:
IO ← [rhAddr, address + 0C], {Baud Rate Gen, LSB} c1;
MDR ← expected, c2;
Noop, c3;
IO ← [rhAddr, address + 0C], {Baud Rate Gen, LSB} c1;
Noop, c2;
found ← MD, c3;
[] ← found xor expected, NZeroBr, c1;
BRANCH[$, Scc1ChanBLSBFailed], c2;
Noop, c3;
Scc1ChanBMSB:
IO ← [rhAddr, address + 0D], {Baud Rate Gen, MSB} c1;
MDR ← expected, c2;
Noop, c3;
IO ← [rhAddr, address + 0D], {Baud Rate Gen, MSB} c1;
Noop, c2;
found ← MD, c3;
[] ← found xor expected, NZeroBr, c1;
BRANCH[$, Scc1ChanBMSBFailed], c2;
Noop, c3;
Scc1ChanALSB:
IO ← [rhAddr, address10 + 0C], {Baud Rate Gen, LSB} c1;
MDR ← expected, c2;
Noop, c3;
IO ← [rhAddr, address10 + 0C], {Baud Rate Gen, LSB} c1;
Noop, c2;
found ← MD, c3;
[] ← found xor expected, NZeroBr, c1;
BRANCH[$, Scc1ChanALSBFailed], c2;
Noop, c3;
Scc1ChanAMSB:
IO ← [rhAddr, address10 + 0D], {Baud Rate Gen, MSB} c1;
MDR ← expected, c2;
Noop, c3;
IO ← [rhAddr, address10 + 0D], {Baud Rate Gen, MSB} c1;
Noop, c2;
found ← MD, c3;
[] ← found xor expected, NZeroBr, c1;
BRANCH[$, Scc1ChanAMSBFailed], c2;
Noop, c3;
FirstScc2:
Noop, c1;
Noop, c2;
rhAddr ← 2, {Scc2: 29000} c3;
IO ← [rhAddr, address+00], {WR0B/A} c1;
MDR ← 2, {Shift Left (ADR0 is ignored)} c2;
Noop, c3;
IO ← [rhAddr, address+09], {WR9x} c1;
MDR ← 0C2, {Reset, NV} c2;
Noop, c3;
Scc2IntVector:
IO ← [rhAddr, address10 + 02], {Interrupt Vector} c1;
MDR ← expected, c2;
Noop, c3;
IO ← [rhAddr, address10 + 02], {Interrupt Vector} c1;
Noop, c2;
found ← MD, c3;
[] ← found xor expected, NZeroBr, c1;
BRANCH[$, Scc2IntVecFailed], c2;
Noop, c3;
Scc2ChanBLSB:
IO ← [rhAddr, address + 0C], {Baud Rate Gen, LSB} c1;
MDR ← expected, c2;
Noop, c3;
IO ← [rhAddr, address + 0C], {Baud Rate Gen, LSB} c1;
Noop, c2;
found ← MD, c3;
[] ← found xor expected, NZeroBr, c1;
BRANCH[$, Scc2ChanBLSBFailed], c2;
Noop, c3;
Scc2ChanBMSB:
IO ← [rhAddr, address + 0D], {Baud Rate Gen, MSB} c1;
MDR ← expected, c2;
Noop, c3;
IO ← [rhAddr, address + 0D], {Baud Rate Gen, MSB} c1;
Noop, c2;
found ← MD, c3;
[] ← found xor expected, NZeroBr, c1;
BRANCH[$, Scc2ChanBMSBFailed], c2;
Noop, c3;
Scc2ChanALSB:
IO ← [rhAddr, address10 + 0C], {Baud Rate Gen, LSB} c1;
MDR ← expected, c2;
Noop, c3;
IO ← [rhAddr, address10 + 0C], {Baud Rate Gen, LSB} c1;
Noop, c2;
found ← MD, c3;
[] ← found xor expected, NZeroBr, c1;
BRANCH[$, Scc2ChanALSBFailed], c2;
Noop, c3;
Scc2ChanAMSB:
IO ← [rhAddr, address10 + 0D], {Baud Rate Gen, MSB} c1;
MDR ← expected, c2;
Noop, c3;
IO ← [rhAddr, address10 + 0D], {Baud Rate Gen, MSB} c1;
Noop, c2;
found ← MD, c3;
[] ← found xor expected, NZeroBr, c1;
BRANCH[$, Scc2ChanAMSBFailed], c2;
Noop, c3;
FirstScc3:
Noop, c1;
Noop, c2;
rhAddr ← 3, {Misc/Timers: 39000} c3;
IO ← [rhAddr, address+00], {WR0B/A} c1;
MDR ← 2, {Shift Left (ADR0 is ignored)} c2;
Noop, c3;
IO ← [rhAddr, address+09], {WR9x} c1;
MDR ← 0C2, {Reset, NV} c2;
Noop, c3;
Scc3IntVector:
IO ← [rhAddr, address10 + 02], {Interrupt Vector} c1;
MDR ← expected, c2;
Noop, c3;
IO ← [rhAddr, address10 + 02], {Interrupt Vector} c1;
Noop, c2;
found ← MD, c3;
[] ← found xor expected, NZeroBr, c1;
BRANCH[$, Scc3IntVecFailed], c2;
Noop, c3;
Scc3ChanBLSB:
IO ← [rhAddr, address + 0C], {Baud Rate Gen, LSB} c1;
MDR ← expected, c2;
Noop, c3;
IO ← [rhAddr, address + 0C], {Baud Rate Gen, LSB} c1;
Noop, c2;
found ← MD, c3;
[] ← found xor expected, NZeroBr, c1;
BRANCH[$, Scc3ChanBLSBFailed], c2;
Noop, c3;
Scc3ChanBMSB:
IO ← [rhAddr, address + 0D], {Baud Rate Gen, MSB} c1;
MDR ← expected, c2;
Noop, c3;
IO ← [rhAddr, address + 0D], {Baud Rate Gen, MSB} c1;
Noop, c2;
found ← MD, c3;
[] ← found xor expected, NZeroBr, c1;
BRANCH[$, Scc3ChanBMSBFailed], c2;
Noop, c3;
Scc3ChanALSB:
IO ← [rhAddr, address10 + 0C], {Baud Rate Gen, LSB} c1;
MDR ← expected, c2;
Noop, c3;
IO ← [rhAddr, address10 + 0C], {Baud Rate Gen, LSB} c1;
Noop, c2;
found ← MD, c3;
[] ← found xor expected, NZeroBr, c1;
BRANCH[$, Scc3ChanALSBFailed], c2;
Noop, c3;
Scc3ChanAMSB:
IO ← [rhAddr, address10 + 0D], {Baud Rate Gen, MSB} c1;
MDR ← expected, c2;
Noop, c3;
IO ← [rhAddr, address10 + 0D], {Baud Rate Gen, MSB} c1;
Noop, c2;
found ← MD, c3;
[] ← found xor expected, NZeroBr, c1;
BRANCH[$, Scc3ChanAMSBFailed], c2;
Noop, c3;
FirstLoopEnd:
Noop, c1;
expected ← expected + 1, PgCarryBr, c2;
expected ← expected and 0FF, BRANCH[FirstLoop, $], c3;
{------------------------------------------------------------------------------------}
SecondSection:
expected ← 0, c1;
Noop, c2;
Noop, c3;
SecondScc0:
Noop, c1;
Noop, c2;
rhAddr ← 0, {Scc0: 09000} c3;
IO ← [rhAddr, address10 + 02], {Interrupt Vector} c1;
MDR ← expected, c2;
Noop, c3;
SecondScc1:
Noop, c1;
Noop, c2;
rhAddr ← 1, {Scc1: 19000} c3;
IO ← [rhAddr, address10 + 02], {Interrupt Vector} c1;
MDR ← expected, c2;
Noop, c3;
SecondScc2:
Noop, c1;
Noop, c2;
rhAddr ← 2, {Scc2: 29000} c3;
IO ← [rhAddr, address10 + 02], {Interrupt Vector} c1;
MDR ← expected, c2;
Noop, c3;
SecondScc3:
Noop, c1;
Noop, c2;
rhAddr ← 3, {Scc3: 39000} c3;
IO ← [rhAddr, address10 + 02], {Interrupt Vector} c1;
MDR ← expected, c2;
Noop, c3;
SecondLoop:
Noop, c1;
Noop, c2;
Noop, c3;
SecondScc0Test:
Noop, c1;
Noop, c2;
rhAddr ← 0, {Scc0: 09000} c3;
IO ← [rhAddr, address10 + 02], {Interrupt Vector} c1;
Noop, c2;
found ← MD, c3;
[] ← found xor expected, NZeroBr, c1;
BRANCH[$, Scc0IntVecMashed], c2;
Noop, c3;
IO ← [rhAddr, address10 + 02], {Interrupt Vector} c1;
MDR ← expected + 1, c2;
Noop, c3;
SecondScc1Test:
Noop, c1;
Noop, c2;
rhAddr ← 1, {Scc1: 19000} c3;
IO ← [rhAddr, address10 + 02], {Interrupt Vector} c1;
Noop, c2;
found ← MD, c3;
[] ← found xor expected, NZeroBr, c1;
BRANCH[$, Scc1IntVecMashed], c2;
Noop, c3;
IO ← [rhAddr, address10 + 02], {Interrupt Vector} c1;
MDR ← expected + 1, c2;
Noop, c3;
SecondScc2Test:
Noop, c1;
Noop, c2;
rhAddr ← 2, {Scc2: 29000} c3;
IO ← [rhAddr, address10 + 02], {Interrupt Vector} c1;
Noop, c2;
found ← MD, c3;
[] ← found xor expected, NZeroBr, c1;
BRANCH[$, Scc2IntVecMashed], c2;
Noop, c3;
IO ← [rhAddr, address10 + 02], {Interrupt Vector} c1;
MDR ← expected + 1, c2;
Noop, c3;
SecondScc3Test:
Noop, c1;
Noop, c2;
rhAddr ← 3, {Scc3: 39000} c3;
IO ← [rhAddr, address10 + 02], {Interrupt Vector} c1;
Noop, c2;
found ← MD, c3;
[] ← found xor expected, NZeroBr, c1;
BRANCH[$, Scc3IntVecMashed], c2;
Noop, c3;
IO ← [rhAddr, address10 + 02], {Interrupt Vector} c1;
MDR ← expected + 1, c2;
Noop, c3;
SecondLoopEnd:
Noop, c1;
expected ← expected + 1, PgCarryBr, c2;
expected ← expected and 0FF, BRANCH[SecondLoop, $], c3;
ExtCtrl ← 3, {Gets Bumped on rising edge} c1;
ExtCtrl ← 7, c2;
passCount ← passCount + 1, GOTO[MainLoop], c3;
{------------------------------------------------------------------------------------}
WriteLoop:
IO ← [rhAddr, address + 02], {Port A Interrupt Vector} c1;
MDR ← expected, c2;
Noop, c3;
Noop, c1; Noop, c2; Noop, c3;
Noop, c1; Noop, c2; Noop, c3;
Noop, c1; Noop, c2; Noop, c3;
Noop, c1; Noop, c2; Noop, c3;
Noop, c1; Noop, c2; Noop, c3;
Noop, c1;
Noop, c2;
expected ← expected + 1, GOTO[WriteLoop], c3;
{------------------------------------------------------------------------------------}
Scc0IntVecFailed: GOTO[Restart], c3;
Scc0ChanBLSBFailed: GOTO[Restart], c3;
Scc0ChanBMSBFailed: GOTO[Restart], c3;
Scc0ChanALSBFailed: GOTO[Restart], c3;
Scc0ChanAMSBFailed: GOTO[Restart], c3;
Scc1IntVecFailed: GOTO[Restart], c3;
Scc1ChanBLSBFailed: GOTO[Restart], c3;
Scc1ChanBMSBFailed: GOTO[Restart], c3;
Scc1ChanALSBFailed: GOTO[Restart], c3;
Scc1ChanAMSBFailed: GOTO[Restart], c3;
Scc2IntVecFailed: GOTO[Restart], c3;
Scc2ChanBLSBFailed: GOTO[Restart], c3;
Scc2ChanBMSBFailed: GOTO[Restart], c3;
Scc2ChanALSBFailed: GOTO[Restart], c3;
Scc2ChanAMSBFailed: GOTO[Restart], c3;
Scc3IntVecFailed: GOTO[Restart], c3;
Scc3ChanBLSBFailed: GOTO[Restart], c3;
Scc3ChanBMSBFailed: GOTO[Restart], c3;
Scc3ChanALSBFailed: GOTO[Restart], c3;
Scc3ChanAMSBFailed: GOTO[Restart], c3;
Scc0IntVecMashed: GOTO[Restart], c3;
Scc1IntVecMashed: GOTO[Restart], c3;
Scc2IntVecMashed: GOTO[Restart], c3;
Scc3IntVecMashed: GOTO[Restart], c3;
Restart:
Q ← 0FF, c1;
Noop, c2;
RestartLoop:
Noop, c3;
Q ← Q - 1, ZeroBr, c1;
BRANCH[RestartLoop, $], c2;
GOTO[Go], c3;
{------------------------------------------------------------------------------------}