Imports BitOps, Dragon; Open BitOps, Dragon; CELLTYPE "MSequencer" PORTS[ Vdd, GndBOOL, MFaultAB>EnumType["Dragon.PBusFaults"], PCmdToMABEnumType["Dragon.MBusCommands"], MCmdDriveC>BOOL, MDataI=INT[32], MParityI=BOOL, MDataDriveC>BOOL, MSharedSenseBOOL, MNSharedDriveLowC>BOOL, MNErrorDriveLow>BOOL, MRqIBA>BOOL, MNewRqIBA>BOOL, MNewRqEnableC>BOOL, MGntSenseAEnumType["CacheOps.PreFetchAdrCmd"], IsCleanBA, LatchSharedBA, MasterBA, MatchRealQuadAB, MatchRealBlockAB, ContinueBA>BOOL, OneDirtyBA, SomeDirtyBA, MDataDriveDelayedAINT[7], ROMSlaveBA>BOOL, ROMCycleBA>INT[7], MRamRegParityOut 020H, WriteQuad => 010H, WriteSingle => 08H, ChangeFlags => 04H, IOReadDone, IOWriteDone, DataTransport, IORead, IOWrite, Reserve9, Reserve10, Reserve11, Reserve12, Reserve13, Reserve14, NoOp => 01H, ENDCASE => ERROR; FOR i:CARDINAL IN [0..6] DO IF EBFW[CurrentPDemandsAB, 7, i] THEN { prioritySequence _ IBIW[TRUE, 0, 7, i]; EXIT; }; ENDLOOP; CmdOutAB _ SELECT prioritySequence FROM 040H => WriteQuad, 020H => IORead, 010H => ReadQuad, 008H => WriteSingle, 004H => IORead, 002H => IOWrite, 001H => NoOp, ENDCASE => NoOp; IF PhBb AND DoneAB THEN CurrentSequenceBA _ IF MGntAB THEN prioritySequence ELSE slaveSequence; IF PhBb THEN { GetAdrCmdBA _ SELECT prioritySequence FROM 040H => VictimReal, 020H => RefVirtual, 010H => IF DidRMBA THEN RefRealMap ELSE RefRealAssemble, 008H => RefRealAssemble, 004H => RefVirtual, 002H => RefVirtual, 001H => RefVirtual, ENDCASE => RefVirtual; }; }; IF PhAb THEN MCmdOutAB _ SELECT TRUE FROM MCmdDriveToDataTransportAB => DataTransport, MCmdDriveToNoOpAB => NoOp, ENDCASE => CmdOutBA; IF PhBb THEN { CmdOutBA _ CmdOutAB; IODoneCommandBA _ MCmdIn=IOReadDone OR MCmdIn=IOWriteDone; }; ROMSequenceBA _ IF (ForceSlaveBA AND NOT IODoneCommandBA) OR Resetb THEN 1 ELSE CurrentSequenceBA; IF ForceSlaveBA THEN ForceSlave _ TRUE; IF PhBb THEN ROMSlaveBA _ IF ForceSlave AND NOT IODoneCommandBA THEN TRUE ELSE NOT MGntAB; Assert[NOT MoreThanOneOf[ForceSlaveBA, IODoneCommandBA]]; IF PhAb AND IODoneCommandBA THEN ForceSlave _ FALSE; IF PhBb THEN MasterBA _ MGntBA AND NOT ForceSlave; IF PhBb THEN ContinueBA _ NOT SenseReadyBA OR MCmdIn=DataTransport; IF Resetb THEN ROMCycleBA _ 20H ELSE IF PhBb THEN ROMCycleBA _ SELECT TRUE FROM NOT DoneAB AND NOT ContinueBA => CycleShifterAB, NOT DoneAB AND ContinueBA => WShift[CycleShifterAB, 7, -1], DoneAB AND NOT (ForceSlave AND IODoneCommandBA) => IBIW[TRUE, 0, 7, 1], DoneAB AND (ForceSlave AND IODoneCommandBA) => IBIW[TRUE, 0, 7, 2], ENDCASE => ERROR; IF PhAb THEN CycleShifterAB _ ROMCycleBA; IF MDataIToFaultsB THEN FaultBitsBA _ LOOPHOLE[ECFD[MDataI, 32, 29, 3]]; IF PhAb THEN MFaultAB _ IF CheckFaultsAB THEN FaultBitsBA ELSE Dragon.None; IF MapBitsToMDataIA THEN { MDataI _ IBID[DidRMBA, MDataI, 32, 24]; -- read the map MDataI _ IBID[DirtyPageBA, MDataI, 32, 25]; -- set the dirty bit MDataI _ ICID[0, MDataI, 32, 26, 6]; -- zero the rest of the bits }; IF BCheckParityB THEN ParityBA _ MRamRegParityOut AND (MatchRealQuadAB OR MasterEnableMBusDriveAB); IF PhAb AND ParityBA THEN MNErrorDriveLow _ TRUE; IF ACheckParityA THEN ParityAB _ MRamRegParityOut AND ContinueBA; IF PhBb AND ParityAB THEN MNErrorDriveLow _ TRUE; EnableMBusDrive _ MatchRealQuadAB OR MasterEnableMBusDriveAB; IF SampleRealMatchA THEN { MatchRealQuadAB _ NOT nRQMatchA; MatchRealBlockAB _ NOT nRealBlockMatchA; }; IF NOT PhC THEN MCmdDriveEnable _ MDataDriveEnable _ DriveSharedHighEnable _ DriveSharedLowEnable _ FALSE; IF MCmdDriveA AND EnableMBusDrive THEN MCmdDriveEnable _ TRUE; IF (MDataDriveA AND EnableMBusDrive) OR MDataDriveDelayedA THEN MDataDriveEnable _ TRUE; IF DriveSharedHighA THEN DriveSharedHighEnable _ TRUE; IF DriveSharedLowA AND EnableMBusDrive THEN DriveSharedLowEnable _ TRUE; MCmdDriveC _ PhC AND MCmdDriveEnable; MDataDriveC _ PhC AND MDataDriveEnable; MNSharedDriveHighC _ PhC AND DriveSharedHighEnable; MNSharedDriveLowC _ PhC AND DriveSharedLowEnable; IF Resetb THEN { HoldingAB _ FALSE; MIdleAB _ TRUE; MNErrorDriveLow _ FALSE; ForceSlave _ FALSE; }; ENDCELLTYPE  CacheMInterfaceMSequencer.rose Last edited by: Barth, July 30, 1984 4:58:19 pm PDT Last edited by: Curry, January 29, 1985 9:30:00 pm PST Timing and housekeeping interface Buffered timing and housekeeping interface Cell control P control <=> M control Internal main memory interface Sequencer ROM interface Control steel wool Intermediate values, not really state bits Master sequencer Bus arbitration MIdleAB indicates that the low level M controller has finished with the last request from P that caused it to become active and so the M bus should be given up. Holding indicates that a series of XHold commands are in progress on P and so the M bus should not be given up. Current sequence Slave control Cycle control Fault and Map Bits Parity M bus control Reset Ê Á˜šœ™Jšœ3™3Jšœ6™6—J˜J˜J˜J˜šœ˜Jšœ˜J˜šœ!™!Jšœ Ïkœ˜—J™šœ*™*Jšœ œ˜Jšœœ˜ —J˜™ Jšœœ˜Jšœ œ˜Jšœœ˜Jšœ&œ˜+—J˜™Jšœœ˜Jšœ'˜'Jšœ*˜*—J˜šœ™Jšœ'˜'Jšœ*˜*Jšœ œ˜Jšœœ˜Jšœ œ˜Jšœ œ˜Jšœ œ˜Jšœœ˜Jšœœ˜Jšœœ˜Jšœœ˜ Jšœ œ˜Jšœœ˜Jšœ œ˜—J˜™JšœÝœ˜âJ˜—™Jšœ0˜0JšœRœ˜WJšœ,œ˜1Jšœœ˜Jšœ œ˜Jšœ œ˜Jšœ˜—Jšœ˜J˜˜JšœœÏc,˜@JšœPœ˜UJšœ(œ˜-Jšœ)œ˜.Jšœ.˜.Jšœ+˜+Jšœ1œ˜6Jšœ1œ˜6Jšœ˜Jšœ˜™*JšœIœ˜NJšœ˜——˜ Jšœœ œ˜Jšœœ œ˜Jšœ œœ ˜Jšœœœœ˜GJšœ,œ ˜;J˜J™J˜˜Jšœœ œœ˜7Jšœœœ˜5Jšœœœœ˜EJšœ œœ˜;Jšœ œœ˜;Jšœœ œœœœœ œ œœœœ˜ÀJ˜Jš œœ œœœœ ˜SJšœœ%˜/Jšœœ'˜3š œ œœœœ˜+šœœœ˜'Jšœœœ˜9Jšœ˜Jšœ˜—Jšœ˜—Jšœ œœœ)˜^Jšœœœœ˜QJ˜Jšœœœœ'˜Bšœœœ˜Jšœœœ ž!˜JJš œœœ œœœ˜uJšœœ œœœœœ˜yJš œœ œœœ˜[Jš œœœœœœ˜[Jšœ œœœ˜HJšœ œœœ˜HJšœ!œœœ˜jJš œœœœœœ˜…Jšœœ ˜&Jšœœ œ˜4Jšœœœ ˜,J˜—J˜Jšœœ˜2JšœœMœ˜^Jšœœ œ˜1Jš œœœœœœ˜yJ™™J™Jšœ ™ J™o—J™šœœ˜Jšœœœ˜8Jšœœœ˜$Jšœ œœœ œ œœœœ ˜sJšœ˜Jš œ œ œ œ œœœ ˜PJšœ˜Jšœ œ œ œ ˜-J˜—šœœ˜Jš œœœœœ ˜?Jšœ˜Jšœ˜Jšœ œœ œœœœœœ ˜nJšœ œœ œœœœœœœ ˜gJšœœ ˜"Jšœ˜J˜—Jšœœ˜J˜J™J˜˜J˜(š œœ œœœ˜FJšœ˜Jšœ˜Jšœ˜Jšœ˜Jšœ†˜†Jšœœ˜—šœœœ˜šœœœ˜'Jšœœœ ˜'Jšœ˜J˜—Jšœ˜—šœ œ˜'Jšœ˜Jšœ˜Jšœ˜Jšœ˜Jšœ˜Jšœ˜Jšœ ˜ Jšœ ˜—Jš œœœœœœ˜_šœœ˜šœœ˜*Jšœ˜Jšœ˜Jšœœ œ œ˜8Jšœ˜Jšœ˜Jšœ˜Jšœ˜Jšœ˜—J˜—J˜—š œœ œœ˜)Jšœ,˜,Jšœ˜Jšœ ˜—šœœ˜Jšœ˜Jšœ$œ˜:J˜—Jš œœœœœœœ˜bJ˜J™ J™Jšœœœ˜'Jšœœœ œœœœœœ˜ZJšœœ/˜9Jšœœœœ˜4Jšœœœœ ˜2J™J™ J˜Jšœœœœ˜Cšœœœœœœœ˜OJšœœœ˜0Jšœœ-˜;Jš œœœ œœœ ˜GJš œœ œœœ ˜CJšœœ˜—Jšœœ˜*J˜Jšœ™J˜Jšœœœœ˜HJš œœ œœ œ ˜Kšœœ˜Jšœ œž˜8Jšœ œ ž˜AJšœ œž˜BJ˜—J˜J™J˜Jšœœœœ˜cJšœœ œœ˜1Jšœœœ ˜AJšœœ œœ˜1J˜J™ J˜Jšœ"œ˜=šœœ˜Jšœœ ˜ Jšœœ˜(J˜—JšœœœUœ˜jJšœ œœœ˜>Jš œœœœœ˜XJšœœœ˜6Jšœœœœ˜HJšœœ˜%Jšœœ˜'Jšœœ˜3Jšœœ˜1J˜J™J˜šœœ˜Jšœ œ˜Jšœ œ˜Jšœœ˜Jšœ œ˜J˜—J˜——Jš ˜ ——…—#1á