{DSRTest.mc, HGM, 21-Oct-85 22:33:55 Simple Test for DTR => DSR and RTS => CTS. Also activates LoopBack clocks so everything flaps if you are looking with a scope.} Reserve[0F5F, 0FFF]; {section used by the CP Kernel } SetTask[0]; StartAddress[Go]; RegDef[address, R, 0]; RegDef[rhAddr, RH, 0]; RegDef[modem, R, 1]; RegDef[rhModem, RH, 1]; RegDef[mask, R, 0C]; RegDef[temp, R, 0D]; RegDef[line, R, 0E]; RegDef[chanA, U, 10]; RegDef[chanB, U, 11]; RegDef[chanC, U, 12]; RegDef[chanD, U, 13]; RegDef[chanE, U, 14]; RegDef[chanF, U, 15]; RegDef[chanG, U, 16]; RegDef[chanH, U, 17]; Trap: temp ¬ RRot1 ErrnIBnStkp, ClrIntErr, 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; GOTO[Go], c3; {Initialize all those registers} Go: line ¬ 0, c1; Noop, c2; ExtCtrl ¬ 5, {Init Incr, Zero, UnBlank} c3; address ¬ 090, c1; address ¬ address LRot8, {9000} c2; Noop, c3; Q ¬ address + 10, c1; chanA ¬ Q, c2; Noop, c3; Q ¬ address + 00, c1; chanB ¬ Q, c2; Noop, c3; Q ¬ address + 11, c1; chanC ¬ Q, c2; Noop, c3; Q ¬ address + 01, c1; chanD ¬ Q, c2; Noop, c3; Q ¬ address + 12, c1; chanE ¬ Q, c2; Noop, c3; Q ¬ address + 02, c1; chanF ¬ Q, c2; Noop, c3; Q ¬ address + 13, c1; chanG ¬ Q, c2; Noop, c3; Q ¬ address + 03, c1; chanH ¬ Q, c2; Noop, c3; InitFirstClock: {Clock for first chip runs at 56KB. 56KB => 17.857 microseconds/bit. A count of 00BH gives 56,846 bits/second. (measured)} rhModem ¬ 2, {Modem drives LCa'} c1; modem ¬ 10, c2; modem ¬ modem LRot8 {21000}, c3; IO ¬ [rhModem, modem + 0], {Master Interrupt Control} c1; MDR ¬ 0, c2; Noop, c3; IO ¬ [rhModem, modem + 1], {Master Config Control} c1; MDR ¬ 014, {Enable PortA, PortC, and Cnt3} c2; temp ¬ modem + 10, c3; IO ¬ [rhModem, temp + 0A], {Cnt3 MSB} c1; MDR ¬ 0, c2; Noop, c3; IO ¬ [rhModem, temp + 0B], {Cnt3 LSB} c1; MDR ¬ 0B, c2; Noop, c3; IO ¬ [rhModem, temp + 0E], {Cnt3 Mode} c1; MDR ¬ 0C2, {Sq out} c2; Noop, c3; IO ¬ [rhModem, modem + 0C], {Cnt3 Cmd} c1; MDR ¬ 06, {Go} c2; Noop, c3; IO ¬ [rhModem, modem + 06], {Port C Direction} c1; MDR ¬ 0FE, {Bit 0 ¬ output} c2; Q ¬ 23, c3; IO ¬ [rhModem, modem + Q], {Port A Direction} c1; MDR ¬ 0FF, {All In} c2; Q ¬ 22, c3; IO ¬ [rhModem, modem + Q], {Port A Polarity} c1; MDR ¬ 0FF, {All Inverted} c2; Q ¬ 20, c3; IO ¬ [rhModem, modem + Q], {Port A Mode} c1; MDR ¬ 00, {Simple Bit Port} c2; Noop, c3; InitSecondClock: {Clock for second chip runs at 9600. 9600 => 104 microseconds/bit. A count of 041H gives 9,621 bits/second. (measured)} rhAddr ¬ 4, {Dialer0 drives LCb'} c1; address ¬ 10, c2; address ¬ address LRot8 {41000}, c3; IO ¬ [rhAddr, address + 0], {Master Interrupt Control} c1; MDR ¬ 0, c2; Noop, c3; IO ¬ [rhAddr, address + 1], {Master Config Control} c1; MDR ¬ 010, {Enable PortC and Cnt3} c2; temp ¬ address + 10, c3; IO ¬ [rhAddr, temp + 0A], {Cnt3 MSB} c1; MDR ¬ 0, c2; Noop, c3; IO ¬ [rhAddr, temp + 0B], {Cnt3 LSB} c1; MDR ¬ 041, c2; Noop, c3; IO ¬ [rhAddr, temp + 0E], {Cnt3 Mode} c1; MDR ¬ 0C2, {Sq out} c2; Noop, c3; IO ¬ [rhAddr, address + 0C], {Cnt3 Cmd} c1; MDR ¬ 06, {Go} c2; Noop, c3; IO ¬ [rhAddr, address + 06], {Port C Direction} c1; MDR ¬ 0FE, {Bit 0 ¬ output} c2; Noop, c3; InitThirdClock: {Clock for third chip runs at 9600. 9600 => 104 microseconds/bit. A count of 041H gives 9,621 bits/second. (measured)} rhAddr ¬ 5, {Dialer1 drives LCc'} c1; address ¬ 10, c2; address ¬ address LRot8 {51000}, c3; IO ¬ [rhAddr, address + 0], {Master Interrupt Control} c1; MDR ¬ 0, c2; Noop, c3; IO ¬ [rhAddr, address + 1], {Master Config Control} c1; MDR ¬ 010, {Enable PortC and Cnt3} c2; temp ¬ address + 10, c3; IO ¬ [rhAddr, temp + 0A], {Cnt3 MSB} c1; MDR ¬ 0, c2; Noop, c3; IO ¬ [rhAddr, temp + 0B], {Cnt3 LSB} c1; MDR ¬ 041, c2; Noop, c3; IO ¬ [rhAddr, temp + 0E], {Cnt3 Mode} c1; MDR ¬ 0C2, {Sq out} c2; Noop, c3; IO ¬ [rhAddr, address + 0C], {Cnt3 Cmd} c1; MDR ¬ 06, {Go} c2; Noop, c3; IO ¬ [rhAddr, address + 06], {Port C Direction} c1; MDR ¬ 0FE, {Bit 0 ¬ output} c2; Noop, c3; InitLastClock: {Clock for 4th chip runs at 9600. 9600 => 104 microseconds/bit. A count of 041H gives 9,621 bits/second. (measured)} rhAddr ¬ 6, {Dialer2 drives LCd'} c1; address ¬ 10, c2; address ¬ address LRot8 {61000}, c3; IO ¬ [rhAddr, address + 0], {Master Interrupt Control} c1; MDR ¬ 0, c2; Noop, c3; IO ¬ [rhAddr, address + 1], {Master Config Control} c1; MDR ¬ 010, {Enable PortC and Cnt3} c2; temp ¬ address + 10, c3; IO ¬ [rhAddr, temp + 0A], {Cnt3 MSB} c1; MDR ¬ 0, c2; Noop, c3; IO ¬ [rhAddr, temp + 0B], {Cnt3 LSB} c1; MDR ¬ 041, c2; Noop, c3; IO ¬ [rhAddr, temp + 0E], {Cnt3 Mode} c1; MDR ¬ 0C2, {Sq out} c2; Noop, c3; IO ¬ [rhAddr, address + 0C], {Cnt3 Cmd} c1; MDR ¬ 06, {Go} c2; Noop, c3; IO ¬ [rhAddr, address + 06], {Port C Direction} c1; MDR ¬ 0FE, {Bit 0 ¬ output} c2; Noop, c3; ScopeSyncPoint: address ¬ chanB, rhAddr ¬ chanB, c1; address ¬ address and ~0FF, c2; rhAddr ¬ 6, {DES Chip, Byte mode} c3; IO ¬ [rhAddr, address+01], {Command} c1; MDR ¬ 00, {Reset} c2; Noop, c3; InitScc0: address ¬ chanB, rhAddr ¬ chanB, c1; address ¬ address and ~0F, c2; Noop, 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 ¬ 0C9, {Reset, MIE, V, VIS} c2; Noop, c3; IO ¬ [rhAddr, address+02], {WR2x} c1; MDR ¬ 080, {Int Vector} c2; Noop, c3; InitScc1: address ¬ chanD, rhAddr ¬ chanD, c1; address ¬ address and ~0F, c2; Noop, 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 ¬ 0C9, {Reset, MIE, V, VIS} c2; Noop, c3; IO ¬ [rhAddr, address+02], {WR2x} c1; MDR ¬ 090, {Int Vector} c2; Noop, c3; InitScc2: address ¬ chanF, rhAddr ¬ chanF, c1; address ¬ address and ~0F, c2; Noop, 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 ¬ 0C9, {Reset, MIE, V, VIS} c2; Noop, c3; IO ¬ [rhAddr, address+02], {WR2x} c1; MDR ¬ 0A0, {Int Vector} c2; Noop, c3; InitScc3: address ¬ chanH, rhAddr ¬ chanH, c1; address ¬ address and ~0F, c2; Noop, 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 ¬ 0C9, {Reset, MIE, V, VIS} c2; Noop, c3; IO ¬ [rhAddr, address+02], {WR2x} c1; MDR ¬ 0B0, {Int Vector} c2; Noop, c3; InitAllChips: temp ¬ 01, L0 ¬ 07, {WR1X} c1; Q ¬ 12, {Rx All Int, Tx Int En} c2; CALL[SendToAll], c3; temp ¬ 04, L0 ¬ 08, {WR4x} c1, at[07,10,SendAllRet]; Q ¬ 04A, {16xClock, 2 Stop Bits} c2; CALL[SendToAll], c3; temp ¬ 03, L0 ¬ 09, {WR3x} c1, at[08,10,SendAllRet]; Q ¬ 0C1, {8bits/char, RxE} c2; CALL[SendToAll], c3; temp ¬ 05, L0 ¬ 0A, {WR5x} c1, at[09,10,SendAllRet]; Q ¬ 0EA, {DTR, 8bits/char, TxE, RTS} c2; CALL[SendToAll], c3; {TC ¬ (PClk/(2*F))-2, Can't set it if it's active} temp ¬ 0C, L0 ¬ 0B, {WR12x} c1, at[0A,10,SendAllRet]; Q ¬ 06, {Low byte of time constant} c2; CALL[SendToAll], c3; temp ¬ 0D, L0 ¬ 0C, {WR13x} c1, at[0B,10,SendAllRet]; Q ¬ 0, {High byte of time constant ¬ 0} c2; CALL[SendToAll], c3; temp ¬ 0E, L0 ¬ 0D, {WR14x} c1, at[0C,10,SendAllRet]; Q ¬ 3, {Enable Baud Rate Gen from PClk} c2; CALL[SendToAll], c3; temp ¬ 0B, L0 ¬ 0E, {WR11x} c1, at[0D,10,SendAllRet]; Q ¬ 050, {Clocks from BR Gen} c2; CALL[SendToAll], c3; temp ¬ 0F, L0 ¬ 0F, {WR15x} c1, at[0E,10,SendAllRet]; Q ¬ 000, {No ints (let CTS flow through)} c2; CALL[SendToAll], c3; mask ¬ 80, c1, at[0F,10,SendAllRet]; Noop, c2; GOTO[MainLoop], c3; {-------------------------------------------} MainLoop: Ybus ¬ line, AltUaddr, c1; temp ¬ chanA, c2; Noop, c3; address ¬ temp, rhAddr ¬ temp LRot0, c1; address ¬ address and ~0F, c2; Noop, c3; SetRTS: IO ¬ [rhAddr, address+05], {WR5} c1; MDR ¬ 0EA, {DTR, 8bits/char, TxE, RTS} c2; Noop, c3; CheckCTSSet: IO ¬ [rhAddr, address+00], {RR0} c1; Noop, c2; Q ¬ MD, c3; temp ¬ Q and 020, c1; [] ¬ temp, ZeroBr, c2; BRANCH[$, CTSNotSet], c3; ClearRTS: IO ¬ [rhAddr, address+05], {WR5} c1; MDR ¬ 0E8, {DTR, 8bits/char, TxE, ~RTS} c2; Noop, c3; CheckCTSClear: IO ¬ [rhAddr, address+00], {RR0} c1; Noop, c2; Q ¬ MD, c3; temp ¬ Q and 020, c1; [] ¬ temp, NZeroBr, c2; BRANCH[$, CTSNotClear], c3; SetDTR: IO ¬ [rhAddr, address+05], {WR5} c1; MDR ¬ 0EA, {DTR, 8bits/char, TxE, RTS} c2; Noop, c3; CheckDSRSet: IO ¬ [rhModem, modem+0D], {Port A Data} c1; Noop, c2; Q ¬ MD, c3; temp ¬ Q and mask, c1; [] ¬ temp, ZeroBr, c2; BRANCH[$, DSRNotSet], c3; ClearDTR: IO ¬ [rhAddr, address+05], {WR5} c1; MDR ¬ 06A, {~DTR, 8bits/char, TxE, RTS} c2; Noop, c3; CheckDSRClear: IO ¬ [rhModem, modem+0D], {Port A Data} c1; Noop, c2; Q ¬ MD, c3; temp ¬ Q and mask, c1; [] ¬ temp, NZeroBr, c2; BRANCH[$, DSRNotClear], c3; line ¬ line + 1, c1; line ¬ line and 7, ZeroBr, c2; mask ¬ mask RShift1, BRANCH[MainLoop, $], c3; ExtCtrl ¬ 3, {Gets Bumped on rising edge} c1; ExtCtrl ¬ 7, c2; mask ¬ 80, GOTO[MainLoop], c3; {-------------------------------------------} CTSNotSet: Noop, c1; Noop, c2; GOTO[MainLoop], c3; CTSNotClear: Noop, c1; Noop, c2; GOTO[MainLoop], c3; DSRNotSet: Noop, c1; Noop, c2; GOTO[MainLoop], c3; DSRNotClear: Noop, c1; Noop, c2; GOTO[MainLoop], c3; {-------------------------------------------} SendToAll: address ¬ chanA, rhAddr ¬ chanA, c1; address ¬ address and ~0F, c2; Noop, c3; IO ¬ [rhAddr, address+temp], c1; MDR ¬ Q, c2; Noop, c3; address ¬ chanB, rhAddr ¬ chanB, c1; address ¬ address and ~0F, c2; Noop, c3; IO ¬ [rhAddr, address+temp], c1; MDR ¬ Q, c2; Noop, c3; address ¬ chanC, rhAddr ¬ chanC, c1; address ¬ address and ~0F, c2; Noop, c3; IO ¬ [rhAddr, address+temp], c1; MDR ¬ Q, c2; Noop, c3; address ¬ chanD, rhAddr ¬ chanD, c1; address ¬ address and ~0F, c2; Noop, c3; IO ¬ [rhAddr, address+temp], c1; MDR ¬ Q, c2; Noop, c3; address ¬ chanE, rhAddr ¬ chanE, c1; address ¬ address and ~0F, c2; Noop, c3; IO ¬ [rhAddr, address+temp], c1; MDR ¬ Q, c2; Noop, c3; address ¬ chanF, rhAddr ¬ chanF, c1; address ¬ address and ~0F, c2; Noop, c3; IO ¬ [rhAddr, address+temp], c1; MDR ¬ Q, c2; Noop, c3; address ¬ chanG, rhAddr ¬ chanG, c1; address ¬ address and ~0F, c2; Noop, c3; IO ¬ [rhAddr, address+temp], c1; MDR ¬ Q, c2; Noop, c3; address ¬ chanH, rhAddr ¬ chanH, c1; address ¬ address and ~0F, c2; Noop, c3; IO ¬ [rhAddr, address+temp], c1; MDR ¬ Q, L0Disp, c2; DISP4[SendAllRet], c3;