//D1Speed.bcpl -- set clock speed. // Last edited: 20 November 1979 get "mcommon.d" get "d1.d" manifest [ get "d1regmem.d" ] manifest [ get "d1dmux.d" ] manifest [ get "d1instrs.d" ] external [ // MASM @WssCSS; PutsCSS; WssCS1; Wait // MDISP Blink // MRGN UpdateDisplay // MMENU @WsMarkA; CreateAction // MCMD WnsCSS; WnsCSSD; QuitCmdOverlay; CmdAbort; SetAbort; ErrorExit @CmdAbortAct; CmdCommentStream; CmdCS1; LoadDone // MGO @CantContinue // MINIT0 @ACTS // D1I0 @DMuxTab; HWStatus // D1ASM @DoStrobe; @Xct; @XctR16; LoadDMD; ReadDMux; @SetALUF // D1MEM SaveALUFM0; SaveALUFM16 // D1RES ReadAllRegs // Defined here D1ClockSpeed ] let D1ClockSpeed(nil,nil) = valof [ SetAbort(lv CmdAbort,nil) //LoadDMD value = 2000./T DefSpeed("20",144B,0); DefSpeed("21",137B,1) DefSpeed("22",133B,2); DefSpeed("23",127B,3) DefSpeed("24",123B,4); DefSpeed("25",120B,5) DefSpeed("26",115B,6); DefSpeed("27",112B,7) DefSpeed("28",107B,8); DefSpeed("29",105B,9) DefSpeed("30",103B,10); DefSpeed("31",101B,11) DefSpeed("32",77B,12); DefSpeed("33",75B,13) DefSpeed("34",73B,14); DefSpeed("35",71B,15) DefSpeed("40",62B,16); DefSpeed("45",55B,17) DefSpeed("50",50B,18); DefSpeed("55",44B,19) DefSpeed("60",41B,20) resultis D1ClkMenu ] and DefSpeed(String,X,I) be [ ACTS!I = CreateAction(String,lv SetSpeed,X) ] and D1ClkMenu(S,nil) be [ WssCSS("Change clock rate from ") PrinClkRate((DMuxTab+dCLKRUN)>>lh) WssCSS(" to:") WsMarkA(CmdAbortAct) for I = 0 to 20 do WsMarkA(ACTS!I) ] and SetSpeed(X,nil,nil) be [ let OldRate = (DMuxTab+dCLKRUN)>>lh //Keep IOReset on during speed change and restore afterwards. //**CantContinue because of IOReset. // let T = HWStatus>>HWStatus.RunControl & // (EnRefreshPeriodx+RunRefresh) //Turn on ECLup while preserving old values of EnRefreshPeriod' and //RunRefresh. IOReset is true during transient. // LoadDMD(RunEnable+ECLup+T) LoadDMD(ClkRate0+(X<<nib2)) LoadDMD(ClkRate1+(X<<nib3)) HWStatus>>HWStatus.ClkRate = X CantContinue = CantContinue % didSetClock LoadDone = false // DoStrobe(Control) Wait(5000) // LoadDMD(RunEnable+ECLup+IOResetx+T) let oldSaveALUFM0,oldSaveALUFM16 = SaveALUFM0,SaveALUFM16 ReadDMux(); ReadAllRegs(1) SaveALUFM0,SaveALUFM16 = oldSaveALUFM0,oldSaveALUFM16 let SomeError = false let ActRate = (DMuxTab+dCLKRUN)>>lh if ActRate ne X do [ WssCSS("DMux read clock rate as "); WnsCSS(ActRate) WssCSS(", but should be "); WnsCSS(X) SomeError = true ] unless SomeError do [ WssCSS("Changed clock from "); PrinClkRate(OldRate) WssCSS(" to "); PrinClkRate(ActRate) ] // let ActEnables = (DMuxTab+dCLKRUN)>>nib2 // if ActEnables ne (ECLup+IOResetx+T) do // [ WssCSS(" Run enables wrong"); SomeError = true // ] let DVec,DVec1 = vec 2,vec 2 Xct(TFAF0); XctR16(RT,DVec) Xct(SetALUF(TFAF0,16B)); XctR16(RT,DVec1) if DVec>>rh ne 25B do [ SomeError = true WssCS1("Failed to load ALUFM[0] ") ] if DVec1>>rh ne 1B do [ SomeError = true WssCS1("Failed to load ALUFM[16] ") ] if SomeError then ErrorExit("") QuitCmdOverlay() ] and PrinClkRate(Rate) be [ let T = 20000/Rate; WnsCSSD(T/10); PutsCSS($.) WnsCSSD(T rem 10); WssCSS(" ns") ]