{SDLC.mc, HGM, 4-Nov-84 3:01:52} {Transmitter states.} Set[TS.readyToSend, 0]; Set[TS.sendLeft, 1]; Set[TS.sendRight, 2]; Set[TS.waitingForEOP, 3]; Set[TS.readyToResend, 4]; {Receiver states.} Set[RS.readyToRecv, 0]; Set[RS.skipping, 1]; Set[RS.recvLeft, 2]; Set[RS.recvRight, 3]; Set[RS.activeMask, 2]; {on => IOCB valid} Set[IOCB.next, 0]; Set[IOCB.status, 1]; Set[IOCB.bufferLo, 2]; Set[IOCB.bufferHi, 3]; Set[IOCB.bytes, 4]; Set[IOCB.bytesLeft, 05]; {Scratch area for microcode} Set[IOCB.fingerLo, 8]; Set[IOCB.fingerHi, 9]; Set[IOCB.mappedLo, 0A]; Set[IOCB.mappedHi, 0B]; Set[CSB.tState, 00]; Set[CSB.tIOCB, 01]; Set[CSB.tIOCBm, 02]; Set[CSB.tIOCBmh, 03]; Set[CSB.rState, 04]; Set[CSB.rIOCB, 05]; Set[CSB.rIOCBm, 06]; Set[CSB.rIOCBmh, 07]; Set[CSB.tUnder, 08]; Set[CSB.rNoBuffer, 0C]; Set[CSB.rAborted, 0D]; Set[CSB.rAbortIdle, 0E]; Set[CSB.rAbortEx, 0F]; Set[Bump.tUnder, 00]; {Odd} Set[Bump.rNoBuffer, 01]; Set[Bump.rAborted, 02]; Set[Bump.rAbortIdle, 03]; { We need to leave 6*400+200 ns (2.6 microseconds) between references to the SCC chip. With a 16mhz Xtal, 6 clicks takes 2.25 microseconds and 7 clicks takes 2.6 microseconds. Memory reads will take a bit longer.} PhoneInterrupt: {SCCH+SCC ¬ [0,1000] before we get here} IO ¬ [SCCh, SCC+00], {Int Ack} c1; {0} Q ¬ uPhoneCSB, c2; temp ¬ MD, c3; SCC ¬ LShift1 temp and ~07, c1; {1} CSB ¬ SCC + Q, c2; CSB ¬ CSB xor 10, c3; Q ¬ SCC and 010, c1; {2} SCCh ¬ temp LRot12, Ybus ¬ temp, YDisp, c2; SCC ¬ Q or u9000, DISP4[SCCDisp, 9], c3; {Request to send next data byte} TxTranByte: MAR ¬ [CSBh, CSB + CSB.tState], c1, at[09, 10, SCCDisp]; {3} Noop, CANCELBR[$, 0], c2; state ¬ MD, c3; MAR ¬ [CSBh, CSB + CSB.tIOCBm], c1; {4} Noop, CANCELBR[$, 0], c2; IOCB ¬ MD, c3; MAR ¬ [CSBh, CSB + CSB.tIOCBmh], c1; {5} Ybus ¬ state, CANCELBR[$, 0], YDisp, c2; IOCBh ¬ MD, DISP3[TranData], c3; {Start sending new frame} TxStart: IO ¬ [SCCh, SCC+00], {WR0} c1, at[TS.readyToResend, 8, TranData]; {0} MDR ¬ 080, {Reset Tx CRC} c2; Noop, c3; MAR ¬ [CSBh, CSB + CSB.tIOCB], c1, at[TS.readyToSend, 8, TranData]; {1} tempH ¬ 0, CANCELBR[$, 0], c2; temp ¬ MD, c3; Map ¬ [tempH, temp], c1; {2} Q ¬ temp, ZeroBr, c2; IOCBh ¬ IOCB ¬ MD, BRANCH[$, TxNothingToSend], c3; {cycle memory for the side effects of MAR ¬} MAR ¬ IOCB ¬ [IOCBh, temp + 0], c1; {3} Noop, c2; Noop, c3; MAR ¬ [CSBh, CSB + CSB.tIOCBm], c1; {4} MDR ¬ IOCB, CANCELBR[$, 0], c2, LOOPHOLE[wok]; Noop, c3; MAR ¬ [CSBh, CSB + CSB.tIOCBmh], c1; {5} MDR ¬ IOCBh, CANCELBR[$, 0], c2, LOOPHOLE[wok]; Noop, c3; IO ¬ [SCCh, SCC+0A], {WR10} c1; {0} MDR ¬ 084, {CRC¬1, Abort on Underrun} c2; Noop, c3; MAR ¬ [IOCBh, IOCB + IOCB.bufferHi], c1; {1} Noop, CANCELBR[$, 0], c2; tempH ¬ temp ¬ MD, c3; MAR ¬ [IOCBh, IOCB + IOCB.fingerHi], c1; {2} MDR ¬ temp, CANCELBR[$, 0], c2, LOOPHOLE[wok]; Noop, c3; MAR ¬ [IOCBh, IOCB + IOCB.bufferLo], c1; {3} Noop, CANCELBR[$, 0], c2; temp ¬ MD, c3; MAR ¬ [IOCBh, IOCB + IOCB.fingerLo], c1; {4} MDR ¬ temp, CANCELBR[$, 0], c2, LOOPHOLE[wok]; Noop, c3; Map ¬ [tempH, temp], c1; {5} Q ¬ temp, CANCELBR[$, 0], c2; BufferH ¬ Buffer ¬ MD, c3; {cycle memory for the side effects of MAR ¬} MAR ¬ Buffer ¬ [BufferH, temp + 0], c1; {6} Noop, c2; Noop, c3; TxStarting: IO ¬ [SCCh, SCC+00], {WR0} c1; {0} MDR ¬ 0C0, {Reset EOM} c2; Noop, c3; MAR ¬ [IOCBh, IOCB + IOCB.mappedHi], c1; {1} MDR ¬ BufferH, CANCELBR[$, 0], c2, LOOPHOLE[wok]; Noop, c3; MAR ¬ [IOCBh, IOCB + IOCB.mappedLo], c1; {2} MDR ¬ Buffer, CANCELBR[$, 0], c2, LOOPHOLE[wok]; Noop, c3; MAR ¬ [IOCBh, IOCB + IOCB.bytes], c1; {3} [] ¬ state, NegBr, CANCELBR[$, 0], {Flag from TxSent} c2; count ¬ MD, BRANCH[$, TxSendLeftByte], c3; {This is the first-on-the-chain path. The driver has already sent the first byte.} Noop, c1; {4} Noop, c2; count ¬ count - 1, GOTO[TxSendRightByte], c3; TxLeftByte: IO ¬ [SCCh, SCC+00], {RR0} L4 ¬ 01, c1, at[TS.sendLeft, 8, TranData]; {0-3} CALL[TxBufferSetup], c2; TxSendLeftByte: MAR ¬ [BufferH, Buffer + 0], c1, at[01, 04, TxBufferRet]; {4} state ¬ TS.sendRight, c2; temp ¬ MD, c3; temp ¬ temp LRot8, c1; {5} count ¬ count - 1, NegBr, c2; BRANCH[TxSendByte, TxEnd], c3; TxRightByte: IO ¬ [SCCh, SCC+00], {RR0} L4 ¬ 02, c1, at[TS.sendRight, 8, TranData]; {0-3} CALL[TxBufferSetup], c2; TxSendRightByte: MAR ¬ [BufferH, Buffer], Buffer ¬ Buffer + 1, c1, at[02, 04, TxBufferRet]; {4} state ¬ TS.sendLeft, BRANCH[$, TxNewPage, 1], c2; temp ¬ MD, GOTO[TxSaveBuffer], c3; TxNewPage: temp ¬ MD, c3; MAR ¬ [IOCBh, IOCB + IOCB.fingerLo], c1; Q ¬ 0FF + 1, CANCELBR[$, 0], c2; Buffer ¬ MD, c3; MAR ¬ [IOCBh, IOCB + IOCB.fingerHi], c1; Buffer ¬ Buffer + Q, CarryBr, CANCELBR[$, 0], c2; BufferH ¬ MD, BRANCH[TxNoBankCross, $], c3; TxNewBank: Q ¬ BufferH, c1; Q ¬ Q + 1, c2; BufferH ¬ Q LRot0, c3; MAR ¬ [IOCBh, IOCB + IOCB.fingerHi], c1; MDR ¬ BufferH, CANCELBR[$, 0], c2, LOOPHOLE[wok]; Noop, c3; TxNoBankCross: MAR ¬ [IOCBh, IOCB + IOCB.fingerLo], c1; MDR ¬ Buffer, CANCELBR[$, 0], c2, LOOPHOLE[wok]; Noop, c3; Map ¬ [BufferH, Buffer], c1; Noop, c2; BufferH ¬ Buffer ¬ MD, c3; MAR ¬ [IOCBh, IOCB + IOCB.mappedHi], c1; MDR ¬ BufferH, CANCELBR[$, 0], c2, LOOPHOLE[wok]; Buffer ¬ Buffer and ~0FF, c3; TxSaveBuffer: MAR ¬ [IOCBh, IOCB + IOCB.mappedLo], c1; {5} MDR ¬ Buffer, count ¬ count - 1, NegBr, CANCELBR[$, 0], c2, LOOPHOLE[wok]; BRANCH[TxSendByte, TxEnd], c3; TxSendByte: IO ¬ [SCCh, SCC+08], {WR8} c1; {0} MDR ¬ temp, {Transmit Data} c2; Noop, c3; TxSaveCountAndState: MAR ¬ [IOCBh, IOCB + IOCB.bytesLeft], c1; {1} MDR ¬ count, CANCELBR[$, 0], c2, LOOPHOLE[wok]; Noop, c3; TxSaveState: MAR ¬ [CSBh, CSB + CSB.tState], c1; {2} MDR ¬ state, CANCELBR[PreAckInt, 0], c2, LOOPHOLE[wok]; {Finish sending frame} {It could underrun right now. ????} TxEnd: IO ¬ [SCCh, SCC+0A], {WR10} c1; {0} MDR ¬ 080, {Send CRC} c2; Noop, c3; IO ¬ [SCCh, SCC+00], {WR0} c1; {0} MDR ¬ 028, {Reset Tx Int} c2; state ¬ TS.waitingForEOP, GOTO[TxSaveState], c3; {Extra interrupt after packet has been sent.} TxSent: MAR ¬ [IOCBh, IOCB + IOCB.status], c1, at[TS.waitingForEOP, 8, TranData]; {7} MDR ¬ state ¬ state xor ~state, CANCELBR[$, 0], c2, LOOPHOLE[wok]; Q ¬ uWP, c3; TxNextBuffer: MAR ¬ [IOCBh, IOCB + IOCB.next], c1; {8} Q ¬ Q or uIntPhone, CANCELBR[$, 0], c2; temp ¬ MD, c3; MAR ¬ [CSBh, CSB + CSB.tIOCB], c1; {9} MDR ¬ temp, CANCELBR[$, 0], c2, LOOPHOLE[wok]; uWP ¬ Q, GOTO[TxStart], c3; TxBufferSetup: temp ¬ MD, c3; MAR ¬ [IOCBh, IOCB + IOCB.mappedHi], c1; {1} Q ¬ temp and 040, CANCELBR[$, 0], c2; BufferH ¬ MD, c3; MAR ¬ [IOCBh, IOCB + IOCB.mappedLo], c1; {2} [] ¬ Q, NZeroBr, CANCELBR[$, 0], c2; Buffer ¬ MD, BRANCH[$, TxUnderrun], c3; MAR ¬ [IOCBh, IOCB + IOCB.bytesLeft], c1; {3} L4Disp, CANCELBR[$, 0], c2; count ¬ MD, DISP2[TxBufferRet], c3; TxUnderrun: MAR ¬ [IOCBh, IOCB + IOCB.status], c1; {2} MDR ¬ temp, CANCELBR[$, 0], c2, LOOPHOLE[wok]; L4 ¬ Bump.tUnder, c3; {3-4} MAR ¬ Q ¬ [CSBh, CSB + CSB.tUnder], CALL[BumpCSB], c1; Q ¬ uWP, c1, at[Bump.tUnder, 10, BumpRet]; {5} Q ¬ Q or uIntPhone, c2; Noop, c3; MAR ¬ [CSBh, CSB + CSB.tIOCB], c1; MDR ¬ 0, CANCELBR[$, 0], c2, LOOPHOLE[wok]; uWP ¬ Q, c3; TxNothingToSend: IO ¬ [SCCh, SCC+00], {WR0} c1; {0} MDR ¬ 028, {Reset Tx Int} c2; state ¬ TS.readyToSend, GOTO[TxSaveState], c3; ExternalStatusChange: MAR ¬ [CSBh, CSB + CSB.rIOCBm], c1, at[0B, 10, SCCDisp]; {3} Noop, CANCELBR[$, 0], c2; IOCB ¬ MD, c3; MAR ¬ [CSBh, CSB + CSB.rIOCBmh], c1; {4} Noop, CANCELBR[$, 0], c2; IOCBh ¬ MD, c3; MAR ¬ [CSBh, CSB + CSB.rState], c1; {5} Noop, CANCELBR[$, 0], c2; state ¬ MD, c3; IO ¬ [SCCh, SCC+00], {RR0} c1; {0} Noop, c2; temp ¬ MD, c3; IO ¬ [SCCh, SCC+00], {WR0} c1; {0} MDR ¬ 010, {Reset Ext/Sts Int} c2; Q ¬ 80, c3; Q ¬ temp and Q, NZeroBr, {Abort} c1; {1} Q ¬ CSB + CSB.rAbortEx, BRANCH[$, RxAbortedExt], c2; Q ¬ uInts, GOTO[AckInt], c3; {Grab next character of frame} RxDataByte: MAR ¬ [CSBh, CSB + CSB.rState], c1, at[0D, 10, SCCDisp]; {3} Noop, CANCELBR[$, 0], c2; state ¬ MD, c3; MAR ¬ [CSBh, CSB + CSB.rIOCBm], c1; {4} Noop, CANCELBR[$, 0], c2; IOCB ¬ MD, c3; MAR ¬ [CSBh, CSB + CSB.rIOCBmh], c1; {5} Ybus ¬ state, CANCELBR[$, 0], YDisp, c2; IOCBh ¬ MD, DISP3[RecvData], c3; {Here comes a new frame} RxStart: IO ¬ [SCCh, SCC+00], {RR0} c1, at[RS.readyToRecv, 8, RecvData]; {0} Noop, c2; temp ¬ MD, c3; Q ¬ temp and 80, c1; {1} [] ¬ Q, NZeroBr, L4 ¬ Bump.rAbortIdle, c2; BRANCH[$, RxAbortStray], c3; MAR ¬ [CSBh, CSB + CSB.rIOCB], c1; {2} tempH ¬ 0, CANCELBR[$, 0], c2; temp ¬ MD, c3; Map ¬ [tempH, temp], c1; {3} Q ¬ temp, ZeroBr, L4 ¬ Bump.rNoBuffer, c2; IOCBh ¬ IOCB ¬ MD, BRANCH[$, RxNoBuffer], c3; {cycle memory for the side effects of MAR ¬} MAR ¬ IOCB ¬ [IOCBh, temp + 0], c1; {4} Noop, c2; Noop, c3; MAR ¬ [CSBh, CSB + CSB.rIOCBm], c1; {5} MDR ¬ IOCB, CANCELBR[$, 0], c2, LOOPHOLE[wok]; Noop, c3; MAR ¬ [CSBh, CSB + CSB.rIOCBmh], c1; {6} MDR ¬ IOCBh, CANCELBR[$, 0], c2, LOOPHOLE[wok]; Noop, c3; MAR ¬ [IOCBh, IOCB + IOCB.bufferHi], c1; {7} Noop, CANCELBR[$, 0], c2; tempH ¬ temp ¬ MD, c3; MAR ¬ [IOCBh, IOCB + IOCB.fingerHi], c1; {8} MDR ¬ temp, CANCELBR[$, 0], c2, LOOPHOLE[wok]; Noop, c3; MAR ¬ [IOCBh, IOCB + IOCB.bufferLo], c1; {9} Noop, CANCELBR[$, 0], c2; temp ¬ MD, c3; MAR ¬ [IOCBh, IOCB + IOCB.fingerLo], c1; {10} MDR ¬ temp, CANCELBR[$, 0], c2, LOOPHOLE[wok]; Noop, c3; Map ¬ [tempH, temp], c1; {11} Q ¬ temp, CANCELBR[$, 0], c2; BufferH ¬ Buffer ¬ MD, c3; {cycle memory for the side effects of MAR ¬} MAR ¬ Buffer ¬ [BufferH, temp + 0], c1; {12} Noop, c2; Noop, c3; MAR ¬ [IOCBh, IOCB + IOCB.mappedHi], c1; {13} MDR ¬ BufferH, CANCELBR[$, 0], c2, LOOPHOLE[wok]; Noop, c3; MAR ¬ [IOCBh, IOCB + IOCB.mappedLo], c1; {14} MDR ¬ Buffer, CANCELBR[$, 0], c2, LOOPHOLE[wok]; Noop, c3; MAR ¬ [IOCBh, IOCB + IOCB.bytes], c1; {15} Noop, CANCELBR[$, 0], c2; count ¬ MD, GOTO[RxGrabLeftByte], c3; RxLeftByte: IO ¬ [SCCh, SCC+00], {RR0} L4 ¬ 00, c1, at[RS.recvLeft, 8, RecvData]; {0-3} CALL[RxBufferSetup], c2; RxGrabLeftByte: IO ¬ [SCCh, SCC+08], {RR8} c1, at[00, 04, RxBufferRet]; {0} Noop, c2; temp ¬ MD, c3; {1} count ¬ count - 1, NegBr, c1; state ¬ RS.skipping, BRANCH[$, RxOverflowLeft], c2; temp ¬ temp LRot8, c3; MAR ¬ [BufferH, Buffer + 0], c1; {2} MDR ¬ temp, c2; state ¬ RS.recvRight, c3; RxSaveCountAndState: MAR ¬ [IOCBh, IOCB + IOCB.bytesLeft], c1; {3} MDR ¬ count, CANCELBR[$, 0], c2, LOOPHOLE[wok]; Noop, c3; RxSaveState: MAR ¬ [CSBh, CSB + CSB.rState], c1; {4} MDR ¬ state, CANCELBR[PreAckInt, 0], c2, LOOPHOLE[wok]; RxRightByte: IO ¬ [SCCh, SCC+00], {RR0} L4 ¬ 01, c1, at[RS.recvRight, 8, RecvData]; {0-3} CALL[RxBufferSetup], c2; RxRecvRightByte: MAR ¬ [BufferH, Buffer + 0], c1, at[01, 04, RxBufferRet]; {4} count ¬ count - 1, NegBr, c2; temp ¬ MD, BRANCH[$, RxOverflowRight], c3; IO ¬ [SCCh, SCC+08], {RR8} c1; {0} state ¬ RS.recvLeft, c2; temp ¬ temp or MD, c3; MAR ¬ [BufferH, Buffer], Buffer ¬ Buffer + 1, c1; {2} MDR ¬ temp, BRANCH[$, RxNewPage, 1], c2; GOTO[RxSaveBuffer], c3; RxNewPage: {Rats, write canceled} Noop, c3; MAR ¬ [BufferH, Buffer + 0FF], c1; MDR ¬ temp, CANCELBR[$, 0], c2, LOOPHOLE[wok]; Noop, c3; MAR ¬ [IOCBh, IOCB + IOCB.fingerLo], c1; Q ¬ 0FF + 1, CANCELBR[$, 0], c2; Buffer ¬ MD, c3; MAR ¬ [IOCBh, IOCB + IOCB.fingerHi], c1; Buffer ¬ Buffer + Q, CarryBr, CANCELBR[$, 0], c2; BufferH ¬ MD, BRANCH[RxNoBankCross, $], c3; RxNewBank: Q ¬ BufferH, c1; Q ¬ Q + 1, c2; BufferH ¬ Q LRot0, c3; MAR ¬ [IOCBh, IOCB + IOCB.fingerHi], c1; MDR ¬ BufferH, CANCELBR[$, 0], c2, LOOPHOLE[wok]; Noop, c3; RxNoBankCross: MAR ¬ [IOCBh, IOCB + IOCB.fingerLo], c1; MDR ¬ Buffer, CANCELBR[$, 0], c2, LOOPHOLE[wok]; Noop, c3; Map ¬ [BufferH, Buffer], c1; Noop, c2; BufferH ¬ Buffer ¬ MD, c3; MAR ¬ [IOCBh, IOCB + IOCB.mappedHi], c1; MDR ¬ BufferH, CANCELBR[$, 0], c2, LOOPHOLE[wok]; Buffer ¬ Buffer and ~0FF, c3; RxSaveBuffer: MAR ¬ [IOCBh, IOCB + IOCB.mappedLo], c1; {6} MDR ¬ Buffer, CANCELBR[$, 0], c2, LOOPHOLE[wok]; GOTO[RxSaveCountAndState], c3; {Buffer ended before packet} RxOverflowRight: Noop, c1; {-} state ¬ RS.skipping, c2; RxOverflowLeft: temp ¬ 1, GOTO[RxNextBuffer], c3; RxNoBuffer: MAR ¬ Q ¬ [CSBh, CSB + CSB.rNoBuffer], CALL[BumpCSB], c1; MAR ¬ [CSBh, CSB + CSB.rState], c1, at[Bump.rNoBuffer, 10, BumpRet]; {6} MDR ¬ state ¬ RS.skipping, CANCELBR[$, 0], c2, LOOPHOLE[wok]; GOTO[RxDiscardDataByte], c3; RxSkipByte: IO ¬ [SCCh, SCC+00], {RR0} c1, at[RS.skipping, 8, RecvData]; {0} Noop, c2; temp ¬ MD, c3; Q ¬ temp and 80, c1; {1} [] ¬ Q, NZeroBr, c2; Q ¬ CSB + CSB.rAborted, BRANCH[$, RxAbortedSkip], c3; RxDiscardDataByte: IO ¬ [SCCh, SCC+08], {RR8}, c1; {0} Q ¬ uInts, c2; temp ¬ MD, GOTO[AckInt], c3; RxBufferSetup: temp ¬ MD, c3; MAR ¬ [IOCBh, IOCB + IOCB.mappedHi], c1; {1} Q ¬ temp and 80, CANCELBR[$, 0], c2; BufferH ¬ MD, c3; MAR ¬ [IOCBh, IOCB + IOCB.mappedLo], c1; {2} [] ¬ Q, NZeroBr, CANCELBR[$, 0], c2; Buffer ¬ MD, BRANCH[$, RxAborted], c3; MAR ¬ [IOCBh, IOCB + IOCB.bytesLeft], c1; {3} L4Disp, CANCELBR[$, 0], c2; count ¬ MD, DISP2[RxBufferRet], c3; RxAborted: Q ¬ CSB + CSB.rAborted, c1; Noop, c2; RxAbortedExt: Noop, c3; RxAbortedSkip: MAR ¬ [CSBh, CSB + CSB.rState], L4 ¬ Bump.rAborted, c1; {4} MDR ¬ state ¬ RS.readyToRecv, CANCELBR[$, 0], c2, LOOPHOLE[wok]; Noop, c3; MAR ¬ Q ¬ [CSBh, Q + 0], CALL[BumpCSB], c1; IO ¬ [SCCh, SCC+00], {WR0} c1, at[Bump.rAborted, 10, BumpRet]; ResetExtStatus: {0} MDR ¬ 010, {Reset Ext/Sts Int} GOTO[PreAckInt], c2; RxAbortStray: {2} MAR ¬ Q ¬ [CSBh, CSB + CSB.rAbortIdle], CALL[BumpCSB], c1; IO ¬ [SCCh, SCC+00], {WR0} GOTO[ResetExtStatus],c1, at[Bump.rAbortIdle, 10, BumpRet]; {RecvChar is "special", hopefully it's the End of a frame} RxSpecial: MAR ¬ [CSBh, CSB + CSB.rIOCBm], c1, at[0F, 10, SCCDisp]; {3} Noop, CANCELBR[$, 0], c2; IOCB ¬ MD, c3; MAR ¬ [CSBh, CSB + CSB.rIOCBmh], c1; {4} Noop, CANCELBR[$, 0], c2; IOCBh ¬ MD, c3; MAR ¬ [CSBh, CSB + CSB.rState], c1; {5} Noop, CANCELBR[$, 0], c2; state ¬ MD, c3; IO ¬ [SCCh, SCC+00], {RR0} c1; {0} Noop, c2; temp ¬ MD, c3; IO ¬ [SCCh, SCC+01], {RR1} c1; {0} temp ¬ temp LRot8, c2; temp ¬ temp or MD, c3; IO ¬ [SCCh, SCC+08], {RR8} c1; {0} Noop, c2; Xbus ¬ MD, c3; {Discard shifted last byte of the CRC.} IO ¬ [SCCh, SCC+00], {WR0} c1; {0} MDR ¬ 030, {Reset Errs} c2; Noop, c3; [] ¬ state and RS.activeMask, ZeroBr, c1; {2} BRANCH[$, RxSpecialNoBuffer], c2; state ¬ RS.readyToRecv, GOTO[RxNextBuffer], c3; RxSpecialNoBuffer: state ¬ RS.readyToRecv, GOTO[RxSaveState], c3; {Store final status and chain to next recv buffer. state has new state (RS.skipping or RS.readyToRecv) temp has status} RxNextBuffer: MAR ¬ [IOCBh, IOCB + IOCB.status], c1; {1} MDR ¬ temp, CANCELBR[$, 0], c2, LOOPHOLE[wok]; Q ¬ uWP, c3; MAR ¬ [IOCBh, IOCB + IOCB.next], c1; {2} Q ¬ Q or uIntPhone, CANCELBR[$, 0], c2; temp ¬ MD, c3; MAR ¬ [CSBh, CSB + CSB.rIOCB], c1; {3} MDR ¬ temp, CANCELBR[$, 0], c2, LOOPHOLE[wok]; uWP ¬ Q, GOTO[RxSaveState], c3; PreAckInt: Q ¬ uInts, c3; AckInt: IO ¬ [SCCh, SCC+00], {WR0x} c1; {0} MDR ¬ 38, {Reset Highest IUS} c2; Q ¬ Q and ~u800, c3; uInts ¬ Q, c1; {1} temp ¬ u800, c2; TT ¬ TT and ~temp, GOTO[NoPhoneInterrupt], c3; {-----------------------------------------------------------} BumpCSB: {1+} CANCELBR[$, 0], c2; temp ¬ MD, c3; MAR ¬ [CSBh, Q + 0], c1; {2+} MDR ¬ temp + 1, L4Disp, c2; DISP4[BumpRet], c3;