{ LatchTest.mc, HGM, 12-Feb-85 5:10:29 } Reserve[0F5F, 0FFF]; {section used by the CP Kernel } SetTask[0]; StartAddress[Go]; { Test the 6 latches that remember what's on the BUS when an XackTimeout happens. This test assumes: Main memory location FFxxxx doesn't exist. IO location xx0000 doesn't exist. Both the CP and Misc are n slots with P2 connectors. } {Used to access CIO chips} RegDef[address, R, 2]; RegDef[rhAddr, RH, 2]; RegDef[address10, R, 3]; RegDef[address20, R, 4]; {Used to generate troubles} RegDef[what, R, 8]; RegDef[where, R, 9]; RegDef[rhWhere, RH, 9]; {Data returned from Latches} RegDef[toCommand, R, 0A]; RegDef[toData, R, 0B]; RegDef[toAddr, R, 0C]; RegDef[toAddrHi, RH, 0C]; RegDef[temp, R, 0E]; Set[Get0, 0]; Set[Get1, 1]; Set[Get2, 2]; Set[Get3, 3]; Set[Get4, 4]; Set[Get5, 5]; Set[Get6, 6]; Set[Get7, 7]; Set[Get8, 8]; 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: rhAddr ← 4, {Misc CIO Chip} c1; address ← 090, c2; address ← address LRot8, {9000} c3; address10 ← address + 10, c1; address20 ← address + 20, c2; ExtCtrl ← 5, {Init Incr, Zero, UnBlank} c3; MainLoop: {Setup for Interrupt on XackTimeout} IO ← [rhAddr, address + 0], {Master Control} c1; MDR ← 1, {Reset} c2; Noop, c3; IO ← [rhAddr, address + 0], {Master Control} c1; MDR ← 000, {Clear Reset} c2; Noop, c3; IO ← [rhAddr, address + 0], {Master Control} c1; MDR ← 080, {MIE} c2; Noop, c3; IO ← [rhAddr, address20 + 3], {Port A Direction} c1; MDR ← 0FF, {All Bits Input} c2; Noop, c3; IO ← [rhAddr, address + 0E], {Port B Data} c1; MDR ← 0F, {Disable all outputs} c2; Noop, c3; IO ← [rhAddr, address20 + 0B], {Port B Direction} c1; MDR ← 0F0, {Output on low 4 bits} c2; Noop, c3; IO ← [rhAddr, address + 1], {Master Config Control} c1; MDR ← 084, {Enable Ports A+B} c2; Noop, c3; IO ← [rhAddr, address20 + 0C], {Port B Special IO} c1; MDR ← 40, {ONEs Catcher for TOXack} c2; Noop, c3; IO ← [rhAddr, address20 + 0D], {Port B Polarity} c1; MDR ← 40, c2; Noop, c3; IO ← [rhAddr, address20 + 0F], {Port B Mask} c1; MDR ← 40, c2; Noop, c3; IO ← [rhAddr, address + 09], {Port B Command} c1; MDR ← 0C0, {Set Interrupt Enable} c2; Noop, c3; IO ← [rhAddr, address20 + 08], {Port B Mode} c1; MDR ← 4, {Bit Port, OR Matcher} c2; ClrIntErr, c3; StartTesting: Q ← ExtStat, MesaIntBr, c1; BRANCH[$, MesaIntAlreadySet], c2; Noop, c3; what ← 0, c1; rhWhere ← 0, c2; where ← 0, c3; DataLoop: IO ← [rhWhere, where + 0], c1; MDR ← what, c2; Noop, c3; {Argh, the silly chip is very slow} Noop, c1; Noop, c2; Noop, c3; Noop, c1; Noop, c2; Noop, c3; Noop, c1; Noop, c2; Noop, c3; Noop, c1; Noop, c2; Noop, c3; temp ← ExtStat, MesaIntBr, c1; BRANCH[MesaIntNotSet, $], c2; Noop, c3; IO ← [rhAddr, address + 0E], {Port B Data} c1; MDR ← 000, {Clear caught 1} c2; Noop, c3; IO ← [rhAddr, address + 09], {Port B Command} c1; MDR ← 0B0, {Reset IP} c2; Noop, c3; ClrIntErr, c1; Noop, c2; Noop, c3; temp ← ExtStat, MesaIntBr, c1; BRANCH[$, MesaIntStillSet], c2; Noop, c3; L0 ← Get0, c1; CALL[GetInfo], c2; Noop, c3, at[Get0, 10, GetRet]; [] ← toData xor what, NZeroBr, c1; BRANCH[$, DataNotLatched], c2; Noop, c3; DataLoopEnd: Noop, c1; what ← what + 1, CarryBr, c2; BRANCH[DataLoop, $], c3; rhWhere ← 0FF, c1; where ← 0, c2; Noop, c3; AddrLoop: MAR ← [rhWhere, where + 0], RawRef, c1; MDR ← what, c2; Noop, c3; L0 ← Get1, c1; CALL[GetInfo], c2; Noop, c3, at[Get1, 10, GetRet]; [] ← toAddr xor where, NZeroBr, c1; BRANCH[$, AddressNotLatched], c2; Noop, c3; AddrLoopEnd: Noop, c1; where ← where + 1, CarryBr, c2; BRANCH[AddrLoop, $], c3; rhWhere ← 0, c1; where ← 0, c2; Noop, c3; AddrHiLoop: IO ← [rhWhere, where + 0], c1; MDR ← what, c2; Noop, c3; L0 ← Get2, c1; CALL[GetInfo], c2; Q ← rhWhere, c3, at[Get2, 10, GetRet]; [] ← Q xor toAddrHi, NZeroBr, c1; BRANCH[$, AddrHiNotLatched], c2; Noop, c3; AddrHiLoopEnd: Q ← rhWhere, c1; Q ← Q + 1, c2; rhWhere ← Q LRot0, c3; {The Multibus only supports 23 bits of word addressing. Thus we have to stop sooner than you might expect.} Q ← Q and 080, c1; [] ← Q, NZeroBr, c2; BRANCH[AddrHiLoop, $], c3; CommandTests: rhWhere ← 0, c1; where ← 0, c2; Noop, c3; IO ← [rhWhere, where + 0], c1; MDR ← what, c2; Noop, c3; L0 ← Get3, c1; CALL[GetInfo], c2; Q ← 058, c3, at[Get3, 10, GetRet]; [] ← Q xor toCommand, NZeroBr, c1; BRANCH[$, IOWCFailed], c2; Noop, c3; IO ← [rhWhere, where + 0], c1; Noop, c2; what ← MD, c3; L0 ← Get4, c1; CALL[GetInfo], c2; Q ← 054, c3, at[Get4, 10, GetRet]; [] ← Q xor toCommand, NZeroBr, c1; BRANCH[$, IORCFailed], c2; Noop, c3; rhWhere ← 0FF, c1; where ← 0, c2; Noop, c3; MAR ← [rhWhere, where + 0], RawRef, c1; MDR ← what, c2; Noop, c3; L0 ← Get5, c1; CALL[GetInfo], c2; Q ← 051, c3, at[Get5, 10, GetRet]; [] ← Q xor toCommand, NZeroBr, c1; BRANCH[$, MRWTFailed], c2; Noop, c3; MAR ← [rhWhere, where + 0], RawRef, c1; Noop, c2; what ← MD, c3; L0 ← Get6, c1; CALL[GetInfo], c2; Q ← 052, c3, at[Get6, 10, GetRet]; [] ← Q xor toCommand, NZeroBr, c1; BRANCH[$, MRDCFailed], c2; Noop, c3; MAR ← [rhWhere, where + 0], RawRef, ADR0, c1; MDR ← what, c2; Noop, c3; L0 ← Get7, c1; CALL[GetInfo], c2; Q ← 071, c3, at[Get7, 10, GetRet]; [] ← Q xor toCommand, NZeroBr, c1; BRANCH[$, ADR0Failed], c2; Noop, c3; MAR ← [rhWhere, where + 0], RawRef, BHEN, c1; Noop, c2; what ← MD, c3; L0 ← Get8, c1; CALL[GetInfo], c2; Q ← 042, c3, at[Get8, 10, GetRet]; [] ← Q xor toCommand, NZeroBr, c1; BRANCH[$, BHENFailed], c2; Noop, c3; AllDone: ExtCtrl ← 3, {Gets Bumped on rising edge} c1; ExtCtrl ← 7, c2; GOTO[MainLoop], c3; {------------------------------------------------------------------------------------} GetInfo: Noop, c3; IO ← [rhAddr, address + 0E], {Port B Data} c1; MDR ← 08, {RdTOAdrH} c2; Noop, c3; IO ← [rhAddr, address + 0D], {Port A Data} c1; Noop, c2; toAddrHi ← MD, c3; IO ← [rhAddr, address + 0E], {Port B Data} c1; MDR ← 09, {RdTOAdrM} c2; Noop, c3; IO ← [rhAddr, address + 0D], {Port A Data} c1; Noop, c2; toAddr ← MD, c3; IO ← [rhAddr, address + 0E], {Port B Data} c1; MDR ← 0A, {RdTOAdrL} c2; Noop, c3; IO ← [rhAddr, address + 0D], {Port A Data} c1; toAddr ← toAddr LRot8, c2; toAddr ← toAddr or MD, c3; IO ← [rhAddr, address + 0E], {Port B Data} c1; MDR ← 0B, {RdTOCmd} c2; Noop, c3; IO ← [rhAddr, address + 0D], {Port A Data} c1; Noop, c2; toCommand ← MD, c3; IO ← [rhAddr, address + 0E], {Port B Data} c1; MDR ← 0C, {RdTODatH} c2; Noop, c3; IO ← [rhAddr, address + 0D], {Port A Data} c1; Noop, c2; toData ← MD, c3; IO ← [rhAddr, address + 0E], {Port B Data} c1; MDR ← 0D, {RdTODatL} c2; Noop, c3; IO ← [rhAddr, address + 0D], {Port A Data} c1; toData ← toData LRot8, c2; toData ← toData or MD, c3; L0Disp, c1; DISP4[GetRet], c2; {------------------------------------------------------------------------------------} MesaIntAlreadySet: GOTO[Restart], c3; MesaIntNotSet: GOTO[Restart], c3; MesaIntStillSet: GOTO[Restart], c3; DataNotLatched: GOTO[Restart], c3; AddressNotLatched: GOTO[Restart], c3; AddrHiNotLatched: GOTO[Restart], c3; IOWCFailed: GOTO[Restart], c3; IORCFailed: GOTO[Restart], c3; MRDCFailed: GOTO[Restart], c3; MRWTFailed: GOTO[Restart], c3; ADR0Failed: GOTO[Restart], c3; BHENFailed: GOTO[Restart], c3; Restart: Q ← 0FF, c1; Noop, c2; RestartLoop: Noop, c3; Q ← Q - 1, ZeroBr, c1; BRANCH[RestartLoop, $], c2; GOTO[Go], c3;