{InterruptsDicentra.mc, HGM, 4-Nov-84 2:58:45 Dicentra specific Portions of Refill.mc and Process.mc, HGM, 13-Oct-82 20:20:20} Set[rhInt.Refill, 0]; Set[rhInt.Block, 1]; Set[rhInt.Idle, 2]; Set[rhInt.LP, 3]; Set[rhInt.IOCopy, 4]; Set[rhInt.Scan, 5]; Set[rhInt.Reschedule, 6]; Set[rhInt.Enqueue, 7]; {Buffer refill got a MessIntTrap} RefillInt: rhInt ← rhInt.Refill, GOTO[CheckInterrupts], c3; {BLT, CHKSUM, ... or BITBLT noticed an interrupt} BlockInt: rhInt ← rhInt.Block, GOTO[CheckInterrupts], c3, at[restore.int,10,RestoreCallers]; {Idle loop noticed a MesaInt} IdleInt: rhInt ← rhInt.Idle, GOTO[CheckInterrupts3], c2; {LoadProcess noticed a MesaInt} LoadProcessInt: rhInt ← rhInt.LP, GOTO[CheckInterrupts3], c2; {IOCopy noticed an interrupt} IOCopyDoInt: rhInt ← rhInt.IOCopy, GOTO[CheckInterrupts], c3; {Process timeout Scan noticed an interrupt} ScanInt: rhInt ← rhInt.Scan, CANCELBR[CheckInterrupts3, 1], c2; {Reschedule noticed an interrupt} RescheduleInt: rhInt ← rhInt.Reschedule, CANCELBR[CheckInterrupts2, 3], c1; {Enqueue noticed an interrupt} EnqueueInt: rhInt ← rhInt.Enqueue, GOTO[CheckInterrupts3], c2; CheckInterrupts2: Noop, c2; CheckInterrupts3: Noop, c3; CheckInterrupts: T ← uInts, ClrIntErr, c1; TT ← ExtStat, XC2npcDisp, c2; uInts ← TT, BRANCH[CyclesOutOfPhaseInt, $, 0D], c3; TT ← TT and ~0FF, {Discard trash} c1; TT ← TT and ~T {New hardware interrupts}, NZeroBr, c2; BRANCH[$, NewHardwareInterrupts], c3; NoMoreInts: [] ← uInts, NegBr, c1; [] ← uWDC, NZeroBr, BRANCH[$, MiscBoardStillInterrupting], c2; [] ← uWP, ZeroBr, BRANCH[$, IntsDisabled], c3; IntsEnabled: Xbus ← rhInt, XDisp, BRANCH[ProcessPendingWakeups, NoIntExit], c1; IntsDisabled: Xbus ← rhInt, XDisp, CANCELBR[$], c1; NoIntExit: DISP3[NoIntExits], c2; NoWakeups: {Hook used by Block.mc} GOTO[IgnoreInt {in Refill}], c3, at[rhInt.Refill, 8, NoIntExits]; Rx ← pInt, push, GOTO[BlockInterrupt], c3, at[rhInt.Block, 8, NoIntExits]; T ← 77{pIdle}, GOTO[IdleLoopBranch] {in Process}, c3, at[rhInt.Idle, 8, NoIntExits]; GOTO[LoadProcess] {in Process}, c3, at[rhInt.LP, 8, NoIntExits]; PC ← PC + 1, GOTO[IOCopyFalseInt] {in IOCopy}, c3, at[rhInt.IOCopy, 8, NoIntExits]; Q ← PC + PC, GOTO[TSd] {in Process}, c3, at[rhInt.Scan, 8, NoIntExits]; L3Disp, GOTO[SaveProcess {in Process}], c3, at[rhInt.Reschedule, 8, NoIntExits]; GOTO[Enqueue {in Process}], c3, at[rhInt.Enqueue, 8, NoIntExits]; NewHardwareInterrupts: { TT has new hardware interrupts Rx holds index/counter Bit 0 of uWP is reserved for Process timeouts} [] ← uPhoneFlag, ZeroBr, c1; Xbus ← ~TT LRot8, XDisp, BRANCH[$, NoPhoneCSB], {Int4} c2; SCCh ← SCC ← u1000, BRANCH[PhoneInterrupt, NoPhoneInterrupt, 07], c3; NoPhoneCSB: CANCELBR[$, 0F], c3; NoPhoneInterrupt: Q ← uWP, c1; TT ← TT LShift1, NegBr, c2; Rx ← 8, BRANCH[MoreHardwareInterrupts, MiscBoardInterrupt], c3; MiscBoardInterrupt: {8000 in ExtStat => INT0} Rio ← u9000, c1; rhRio ← 5, {EProms CIO: Process timer} c2; T ← Rio + 01F, c3; IO ← [rhRio, T + 0], {Current Vector} c1; uTickCount ← 0, {Avoid divide by 4} c2; T ← MD, c3; {Int Vec initialized to 00. 00 => 1 Tick. 06 => Error = 2+ ticks. (Happens during Breakpoints.) FF => No Interrupt.} Noop, c1; Xbus ← T LRot0, XLDisp, c2; BRANCH[MiscProcessInterrupt, NextMiscInterrupt, 02], c3; MiscProcessInterrupt: IO ← [rhRio, Rio + 0C], {Counter 3 Cntrl} c1; MDR ← 0B4, {Reset IP, GCB} c2; Q ← Q or u8000, c3; MoreHardwareInterrupts: Noop, c1; GOTO[MoreInterruptsTest], c2; SkipThisBit: Rx ← Rx + 1, BRANCH[$, NoMoreInterrupts], c1; TT ← TT LShift1, NegBr, c2; MoreInterruptsTest: [] ← TT, ZeroBr, BRANCH[SkipThisBit, $], c3; TakeThisBit: Ybus ← Rx, AltUaddr, CANCELBR[$] c1; Q ← Q or uInterruptMasks, GOTO[MoreInterruptsTest], c2; NoMoreInterrupts: uWP ← Q, CANCELBR[CheckInterrupts3], c2; ProcessPendingWakeups: DISP3[NewIntExits], c2; Rx ← pInt, push, GOTO[RefillInterrupt], c3, at[rhInt.Refill, 8, NewIntExits]; Rx ← pInt, push, GOTO[BlockInterrupt], c3, at[rhInt.Block, 8, NewIntExits]; GOTO[Interrupt {in Process}], c3, at[rhInt.Idle, 8, NewIntExits]; MesaIntRq, GOTO[LoadProcess] {in Process}, c3, at[rhInt.LP, 8, NewIntExits]; Rx ← pInt, push, GOTO[RefillInterrupt], c3, at[rhInt.IOCopy, 8, NewIntExits]; Q ← PC + PC, GOTO[TSd {in Process}], c3, at[rhInt.Scan, 8, NewIntExits]; L3Disp, MesaIntRq, GOTO[SaveProcess {in Process}], c3, at[rhInt.Reschedule, 8, NewIntExits]; MesaIntRq, GOTO[Enqueue {in Process}], c3, at[rhInt.Enqueue, 8, NewIntExits]; RefillInterrupt: STK ← TOS, pop, GOTO[SaveRegs] {in Process}, c1; BlockInterrupt: TOS ← STK, pop, GOTO[SaveRegs] {in Process}, c1; {This can actually happen if NXMs are allowed, and the process clock ticks while we are ignoring a NXM.} MiscBoardStillInterrupting: uInts ← 0, CANCELBR[CheckInterrupts, 1], c3; NextMiscInterrupt: Noop, c1; rhRio ← 4, {Timer CIO: ONEs Catcher on TOXACK} c2; T ← Rio + 01F, c3; IO ← [rhRio, T + 0], {Current Vector} c1; Noop, c2; T ← MD, c3; {Int Vec initialized to 0. FF => No Interupt Pending} Xbus ← T LRot0, XLDisp, c1; BRANCH[$, UnknownMiscInterrupt, 02], c2; Noop, c3; XACKTimeout: IO ← [rhRio, Rio + 0E], {Port B Data} c1; MDR ← 000, {Clear caught 1} c2; Xbus ← uNxmExpected, XDisp, c3; IO ← [rhRio, Rio + 09], BRANCH[NXM, $], {Port B Command} c1; MDR ← 0B0, GOTO[MoreInterruptsTest], {Reset IP} c2;