{T1Thrash.mc, HGM, 13-Feb-85 22:15:16} Reserve[0F5F, 0FFF]; {section used by the CP Kernel } SetTask[0]; StartAddress[Go]; RegDef[flag, R, 0]; RegDef[address, R, 1]; RegDef[rhAddr, RH, 1]; RegDef[statusMask, R, 02]; RegDef[length, R, 03]; RegDef[data, R, 04]; RegDef[key, R, 05]; RegDef[wordIncr, R, 06]; RegDef[packetIncr, R, 07]; RegDef[temp, R, 0D]; RegDef[good, U, 40]; RegDef[missedPackets, U, 41]; RegDef[wrongLength, U, 42]; RegDef[wrongData, U, 43]; RegDef[minLength, U, 44]; RegDef[maxLength, U, 45]; RegDef[passCount, U, 46]; {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: good ¬ 0, c1; missedPackets ¬ 0, c2; wrongLength ¬ 0, c3; wrongData ¬ 0, c1; Noop, c2; Noop, c3; passCount ¬ 0, ClrIntErr, c1; ExtCtrl ¬ 5, {Init Incr, Zero, UnBlank} c2; GOTO[Start], c3; {------------------------------------------------------------------------------------} Start: address ¬ 20, c1; address ¬ address LRot8 {2080} c2; rhAddr ¬ 0, c3; Noop, c1; temp ¬ 080, c2; temp ¬ temp LRot8, {8000} c3; IO ¬ [rhAddr, address + 2], {control} c1; MDR ¬ temp, {Reset} c2; Noop, c3; CheckSwitches: IO ¬ [rhAddr, address + 3], {Switches} c1; Noop, c2; Q ¬ MD, c3; [] ¬ Q xor 000, ZeroBr, c1; BRANCH[$, SwitchesAll0s], c2; temp ¬ 0FF, c3; [] ¬ Q xor temp, ZeroBr, c1; BRANCH[$, SwitchesAll1s], c2; Noop, c3; BoardSetup: temp ¬ 098, c1; temp ¬ temp LRot8, {9800} c2; Noop, c3; IO ¬ [rhAddr, address + 2], {control} c1; MDR ¬ temp, {reset, accept, no int} c2; temp ¬ 0, c3; FilterSetup: IO ¬ [rhAddr, address + 3], {Address Filter RAM} c1; MDR ¬ temp, c2; Noop, c3; Noop, c1; temp ¬ temp + 1, PgCarryBr, c2; BRANCH[FilterSetup, $], c3; IO ¬ [rhAddr, address + 2], {control} c1; MDR ¬ 0, {go} c2; Noop, c3; Noop, c1; temp ¬ 030, c2; temp ¬ temp LRot8, {3000} c3; DrainAnotherWord: IO ¬ [rhAddr, address + 0], {data} c1; Noop, c2; Xbus ¬ MD, c3; Noop, c1; temp ¬ temp-1, ZeroBr, c2; BRANCH[DrainAnotherWord, $], c3; NewLength: length ¬ minLength, c1; Noop, c2; Noop, c3; MainLoop: IO ¬ [rhAddr, address + 3], {Switches} c1; Noop, c2; Q ¬ MD, {Clear Tran Int} c3; IO ¬ [rhAddr, address + 2], {status} c1; Noop, c2; Q ¬ MD, c3; Noop, c1; [] ¬ Q, NegBr, c2; BRANCH[$, TranAlreadyInterrupting], c3; SendPacket: IO ¬ [rhAddr, address + 0], {data} c1; MDR ¬ temp ¬ length, c2; data ¬ key, c3; SendAnotherWord: IO ¬ [rhAddr, address + 0], {data} c1; MDR ¬ data, c2; Noop, c3; data ¬ data + wordIncr, c1; temp ¬ temp-1, ZeroBr, c2; BRANCH[SendAnotherWord, $], c3; Noop, c1; temp ¬ 0, c2; temp ¬ temp-1, {FFFF} c3; SendDally: IO ¬ [rhAddr, address + 2], {status} c1; Noop, c2; Q ¬ MD, c3; Noop, c1; [] ¬ Q, NegBr, c2; BRANCH[$, TranInterrupted], c3; Noop, c1; temp ¬ temp-1, ZeroBr, c2; BRANCH[SendDally, NoTranInterrupt], c3; TranInterrupted: Noop, c1; temp ¬ 02, c2; temp ¬ temp LRot8, {0200} c3; TranDally: Noop, {Wait for packet to get around} c1; temp ¬ temp-1, ZeroBr, c2; BRANCH[TranDally, $], c3; CheckPacket: IO ¬ [rhAddr, address + 0], {data} c1; flag ¬ 0, c2; Q ¬ MD, {Should be 8xxx} c3; Noop, c1; [] ¬ Q, NegBr, c2; BRANCH[BuffferNotEmpty, $], c3; IO ¬ [rhAddr, address + 0], {data} c1; Noop, c2; Q ¬ MD, {Should be length+1} c3; Q ¬ Q and ~statusMask, c1; [] ¬ Q, NegBr, c2; BRANCH[$, MissedThePacket], c3; Q ¬ Q - 1, c1; [] ¬ Q xor length, ZeroBr, c2; BRANCH[WrongLength, $], c3; Noop, c1; data ¬ key, c2; temp ¬ length, c3; CheckData: IO ¬ [rhAddr, address + 0], {data} c1; Noop, c2; Q ¬ MD, {Should be data} c3; Noop, c1; [] ¬ Q xor data, ZeroBr, c2; BRANCH[WrongData, $], c3; WrongDataRestart: data ¬ data + wordIncr, c1; temp ¬ temp-1, ZeroBr, c2; BRANCH[CheckData, $], c3; CheckCrc: IO ¬ [rhAddr, address + 0], {data} c1; Noop, c2; Xbus ¬ MD, {Discard CRC} c3; {Delay to keep SUN boards happy} Noop, c1; Noop, c2; Noop, c3; CheckEmptyAgain: IO ¬ [rhAddr, address + 0], {data} c1; Noop, c2; Q ¬ MD, c3; Noop, c1; [] ¬ Q, NegBr, c2; BRANCH[BuffferNotEmptyAgain, $], c3; Noop, c1; [] ¬ flag, ZeroBr, c2; BRANCH[WrongDataThisPacket, $], c3; Q ¬ good, c1; Q ¬ Q + 1, c2; good ¬ Q, c3; Noop, c1; Q ¬ Q and 0F0, c2; ExtCtrl ¬ Q or 7, {DP ¬ good/16} c3; Q ¬ maxLength, c1; [] ¬ length - Q, ZeroBr, c2; length ¬ length + 1, BRANCH[MainLoop, $], c3; Q ¬ key, c1; Q ¬ Q + packetIncr, c2; key ¬ Q, c3; Q ¬ passCount, c1; Q ¬ Q + 1, c2; passCount ¬ Q, c3; Noop, c1; ExtCtrl ¬ 3, {Gets Bumped on rising edge} c2; ExtCtrl ¬ 7, GOTO[NewLength], c3; WrongDataThisPacket: ExtCtrl ¬ 5, {Init Incr, Zero, UnBlank} c1; Noop, c2; GOTO[MainLoop], c3; {------------------------------------------------------------------------------------} SwitchesAll0s: GOTO[Restartc1], c3; SwitchesAll1s: GOTO[Restartc1], c3; TranAlreadyInterrupting: GOTO[Restartc2], c1; NoTranInterrupt: GOTO[Restartc2], c1; NoRecvInterrupt: GOTO[Restartc2], c1; BuffferNotEmpty: GOTO[Restartc2], c1; MissedThePacket: Q ¬ missedPackets, c1; Q ¬ Q + 1, c2; missedPackets ¬ Q, GOTO[Restartc1], c3; WrongLength: Q ¬ wrongLength, c1; Q ¬ Q + 1, c2; wrongLength ¬ Q, GOTO[Restartc1], c3; WrongData: Q ¬ wrongData, c1; Q ¬ Q + 1, c2; wrongData ¬ Q, c3; Noop, c1; Noop, c2; flag ¬ 1, GOTO[WrongDataRestart], c3; BuffferNotEmptyAgain: GOTO[Restartc2], c1; Restartc2: Noop, c2; Restartc3: Noop, c3; Restartc1: Q ¬ 0FF, c1; Noop, c2; RestartLoop: Noop, c3; Q ¬ Q - 1, ZeroBr, c1; BRANCH[RestartLoop, $], c2; ExtCtrl ¬ 5, GOTO[Start], {Init Incr, Zero, UnBlank} c3; {------------------------------------------------------------------------------------} BufferEmptyTest: ExtCtrl ¬ 5, {Init Incr, Zero, UnBlank} c1; temp ¬ 0, c2; Noop, c3; BufferEmptyLoop: IO ¬ [rhAddr, address + 0], {data} c1; Noop, c2; Q ¬ MD, {Should be 8xxx} c3; temp ¬ temp + 1, c1; [] ¬ Q, NegBr, c2; BRANCH[$, BufferEmptyLoop], c3; BufferEmptyBug: temp ¬ 0, c1; ExtCtrl ¬ 3, {Gets Bumped on rising edge} c2; ExtCtrl ¬ 7, GOTO[BufferEmptyLoop], c3; {------------------------------------------------------------------------------------}