{ClockTest.mc, HGM, 4-Nov-84 2:29:29} Reserve[0F5F, 0FFF]; {section used by the CP Kernel } SetTask[0]; StartAddress[Go]; RegDef[LoopCount, R, 0]; RegDef[address, R, 1]; RegDef[rhAddr, RH, 1]; RegDef[found, R, 4]; RegDef[status, R, 5]; RegDef[oldClockLo, R, 06]; RegDef[oldClockHi, R, 07]; RegDef[clockLo, R, 08]; RegDef[clockHi, R, 09]; RegDef[clockP, R, 0A]; RegDef[ticks, R, 0B]; RegDef[ints, R, 0C]; RegDef[temp, R, 0D]; RegDef[LSB, R, 0E]; RegDef[oldLSB, U, 00]; RegDef[u16, U, 016]; RegDef[u17, U, 017]; RegDef[u18, U, 018]; RegDef[u19, U, 019]; 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, {Timers} c1; address ← 90, c2; address ← address LRot8 {9000}, c3; Restart: LoopCount ← 0, ClrIntErr, c1; ExtCtrl ← 5, {Init Incr, Zero, UnBlank} c2; GOTO[MainLoop], c3; MainLoop: ticks ← 0, c1; Noop, c2; ExtCtrl ← 5, {Init Incr, Zero, UnBlank} c3; IO ← [rhAddr, address + 0], {Master Interrupt Control} c1; MDR ← 0, {UnReset} c2; temp ← address + 10, c3; IO ← [rhAddr, address + 0], {Master Interrupt Control} c1; MDR ← 0, {UnReset} c2; temp ← address + 10, c3; IO ← [rhAddr, temp + 06], {Cnt1 MSB} c1; MDR ← 0, c2; Noop, c3; IO ← [rhAddr, temp + 07], {Cnt1 LSB} c1; MDR ← 0, c2; Noop, c3; IO ← [rhAddr, temp + 08], {Cnt2 MSB} c1; MDR ← 0, c2; Noop, c3; IO ← [rhAddr, temp + 09], {Cnt2 LSB} c1; MDR ← 0, c2; Noop, c3; {PClk = 400ns. Counter runs off PClk/2. 50ms => count should be 62500 = F424.} IO ← [rhAddr, temp + 0A], {Cnt3 MSB} c1; MDR ← 0F4, c2; Noop, c3; IO ← [rhAddr, temp + 0B], {Cnt3 LSB} c1; MDR ← 24, c2; Noop, c3; IO ← [rhAddr, temp + 0C], {Cnt 1 Mode} c1; MDR ← 0A0, {Ext In, Pulse} c2; Noop, c3; IO ← [rhAddr, temp + 0D], {Cnt 2 Mode} c1; MDR ← 080, {Pulse} c2; Noop, c3; IO ← [rhAddr, temp + 0E], {Cnt 3 Mode} c1; MDR ← 080, {Pulse} c2; temp ← address + 20, c3; IO ← [rhAddr, temp + 0B], {Port B Direction} c1; MDR ← 0FF, {All in} c2; temp ← address + 10, c3; IO ← [rhAddr, address + 06], {Port C Direction} c1; MDR ← 0F, {All in. Beware of Boot'} c2; Noop, c3; IO ← [rhAddr, address + 1], {Master Config Control} c1; MDR ← 0F3, {Enables, Link Timers} c2; Noop, c3; IO ← [rhAddr, address + 0A], {Counter 1 Cntrl} c1; MDR ← 06, {Trgr} c2; Noop, c3; IO ← [rhAddr, address + 0B], {Counter 2 Cntrl} c1; MDR ← 06, {Trgr} c2; Noop, c3; IO ← [rhAddr, address + 0C], {Counter 3 Cntrl} c1; MDR ← 0C6, {Set IE, Trgr} c2; Noop, c3; IO ← [rhAddr, address + 0], {Master Interrupt Control} c1; MDR ← 080, {MIE} c2; temp ← address + 10, c3; LoadOldClock: IO ← [rhAddr, address + 0B], {Counter 2 Cntrl} c1; MDR ← 0C, {RCC and GCB} c2; oldClockLo ← found, c3; IO ← [rhAddr, temp + 02], {Cnt 2 MSB} c1; Noop, c2; found ← MD, c3; IO ← [rhAddr, temp + 03], {Cnt 2 LSB} c1; found ← found LRot8, c2; found ← found or MD, c3; Noop, c1; Noop, c2; clockHi ← found, c3; WaitForTick: {Ouch, this isn't needed at 16MHZ, but it is at 10.} IO ← [rhAddr, address + 0C], {Counter 3 Cntrl} c1; MDR ← 0A4, {Reset IP, GCB} c2; Noop, c3; IO ← [rhAddr, address + 0A], {Counter 1 Cntrl} c1; MDR ← 0C, {RCC and GCB} c2; Noop, c3; IO ← [rhAddr, temp + 00], {Cnt 1 MSB} c1; Noop, c2; found ← MD, c3; IO ← [rhAddr, temp + 01], {Cnt 1 LSB} c1; found ← found LRot8, c2; found ← found or MD, c3; Noop, c1; Noop, c2; oldClockLo ← found, c3; IO ← [rhAddr, address + 0B], {Counter 2 Cntrl} c1; MDR ← 0C, {RCC and GCB} c2; Noop, c3; IO ← [rhAddr, temp + 02], {Cnt 2 MSB} c1; Noop, c2; found ← MD, c3; IO ← [rhAddr, temp + 03], {Cnt 2 LSB} c1; found ← found LRot8, c2; found ← found or MD, c3; Noop, c1; Noop, c2; oldClockHi ← found, c3; Noop, c1; [] ← clockHi - oldClockHi, ZeroBr, c2; BRANCH[$, WaitForTick], c3; Noop, c1; Noop, c2; Noop, c3; ClockLoop: IO ← [rhAddr, address + 0A], {Counter 1 Cntrl} c1; MDR ← 0C, {RCC and GCB} c2; Noop, c3; IO ← [rhAddr, temp + 00], {Cnt 1 MSB} c1; Noop, c2; found ← MD, c3; IO ← [rhAddr, temp + 01], {Cnt 1 LSB} c1; found ← found LRot8, c2; found ← found or MD, c3; IO ← [rhAddr, address + 0B], {Counter 2 Cntrl} c1; MDR ← 0C, {RCC and GCB} c2; clockLo ← found, c3; IO ← [rhAddr, temp + 01], {Cnt 1 LSB} c1; Noop, c2; LSB ← MD, c3; IO ← [rhAddr, temp + 02], {Cnt 2 MSB} c1; Noop, c2; found ← MD, c3; IO ← [rhAddr, temp + 03], {Cnt 2 LSB} c1; found ← found LRot8, c2; found ← found or MD, c3; Noop, c1; Noop, c2; clockHi ← found, c3; IO ← [rhAddr, address + 0C], {Counter 3 Cntrl} c1; MDR ← 0C, {RCC and GCB} c2; Noop, c3; IO ← [rhAddr, temp + 04], {Cnt 3 MSB} c1; Noop, c2; found ← MD, c3; IO ← [rhAddr, temp + 05], {Cnt 3 LSB} c1; found ← found LRot8, c2; found ← found or MD, c3; IO ← [rhAddr, address + 0C], {Counter 3 Status} c1; clockP ← found, c2; found ← MD, c3; CheckClock: Noop, c1; [] ← oldClockLo - clockLo, ZeroBr, c2; BRANCH[$, ClockLoDidntTick], c3; Q ← oldClockLo - clockLo, c1; [] ← Q and ~07, NZeroBr, c2; BRANCH[$, ClockLoBackwards], c3; Q ← oldClockHi - clockHi, c1; [] ← Q and ~01, NZeroBr, c2; BRANCH[$, ClockHiBackwards], c3; oldLSB ← LSB, c1; oldClockLo ← clockLo, c2; oldClockHi ← clockHi, c3; LoopCount ← LoopCount + 1, c1; MesaIntBr, c2; ints ← ExtStat, BRANCH[ClockLoop, ClockInt], c3; ClockInt: IO ← [rhAddr, address + 0C], {Counter 3 Cntrl} c1; MDR ← 0A4, {Reset IP, GCB} c2; ticks ← ticks + 1, c3; {Beware: If the ClrIntErr happens too soon, we will get 2 interrupts on each tick.} ExtCtrl ← 3, {Gets Bumped on rising edge} c1; ExtCtrl ← 7, c2; ClrIntErr, GOTO[ClockLoop], c3; {------------------------------------------------------------------------------------} ClockSpin: IO ← [rhAddr, temp + 01], {Cnt 1 LSB} c1; ExtCtrl ← 5, {Init Incr, Zero, UnBlank} c2; clockLo ← MD, c3; ClockSpinAgain: IO ← [rhAddr, address + 0A], {Counter 1 Cntrl} c1; MDR ← 0C, {RCC and GCB} c2; Noop, c3; IO ← [rhAddr, temp + 01], {Cnt 1 LSB} c1; oldClockLo ← clockLo, c2; clockLo ← MD, 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; 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; Q ← oldClockLo - clockLo, ZeroBr, c2; Q ← Q and 0FF, BRANCH[$, ClockSpinAgain], c3; Noop, c1; [] ← Q and ~7, NZeroBr, c2; BRANCH[$, ClockSpinQuirk], c3; ClockSpinTicked: Noop, c1; Noop, c2; LoopCount ← LoopCount + 1, GOTO[ClockSpinAgain], c3; ClockSpinQuirk: ExtCtrl ← 3, {Gets Bumped on rising edge} c1; ExtCtrl ← 7, c2; LoopCount ← 0, GOTO[ClockSpinAgain], c3; {------------------------------------------------------------------------------------} ClockLoDidntTick: LoopCount ← 0, c1; ExtCtrl ← 5, {Init Incr, Zero, UnBlank} c2; GOTO[LoadOldClock], c3; ClockLoBackwards: LoopCount ← 0, c1; ExtCtrl ← 5, {Init Incr, Zero, UnBlank} c2; GOTO[LoadOldClock], c3; ClockHiBackwards: LoopCount ← 0, c1; ExtCtrl ← 5, {Init Incr, Zero, UnBlank} c2; GOTO[LoadOldClock], c3; RCCAlreadySet: LoopCount ← 0, c1; ExtCtrl ← 5, {Init Incr, Zero, UnBlank} c2; GOTO[LoadOldClock], c3; RCCNotSet: LoopCount ← 0, c1; ExtCtrl ← 5, {Init Incr, Zero, UnBlank} c2; GOTO[LoadOldClock], c3; SnarfGoodies: IO ← [rhAddr, temp + 06], {Cnt1 MSB} c1; Noop, c2; Q ← MD, c3; IO ← [rhAddr, temp + 07], {Cnt1 LSB} c1; u16 ← Q, c2; Q ← MD, c3; IO ← [rhAddr, temp + 08], {Cnt2 MSB} c1; u17 ← Q, c2; Q ← MD, c3; IO ← [rhAddr, temp + 09], {Cnt2 LSB} c1; u18 ← Q, c2; Q ← MD, c3; Noop, c1; u19 ← Q, c2; Noop, c3; SnarfedGoodies: Noop, c1; Noop, c2; GOTO[Restart], c3; ResetTheChip: IO ← [rhAddr, address + 0], {Master Interrupt Control} c1; MDR ← 1, {Reset} c2; temp ← address + 10, c3; IO ← [rhAddr, address + 0], {Master Interrupt Control} c1; MDR ← 0, {UnReset} c2; GOTO[Restart], c3; {------------------------------------------------------------------------------------}