//D1I2.BCPL -- machine-dependent part of Init2() // 11 May 1983 get "mcommon.d" get "d1.d" manifest [ get "d1pe.d" ] manifest [ get "d1regmem.d" ] manifest [ IMstablen = (#20000/BlockSize)+1 //Max size for 16K IMX RMstablen = (RMlen+1)/2 BRstablen = (BRlen+1)/2 TASKNstablen = (NTasks+1)/2 DEVICEstablen = (DEVICElen+1)/2 ] external [ // OS SetBlock; Zero; Resets // MINIT0 @ACTS; MStatus; ConnectStream // MASM GetStorage; Wss; @WssCSS; ResetsCSS; ResetsCS1; @MBlock // MDATA MDATAtab; MADDRtab; @BitsChecked; @HighAddress; @AddrIncrement MCTimeOut; CheckStoppedGlitches // MIOC Wns // MMENU CreateAction; ItemStream; @WsMarkA; MarkMenus // MCMD WnsCSS; QuitCmdOverlay // MGO @QuitF // D1I0 HWStatus // D1TABLES @MEMNAM // D1MICASM @MCXct; MCWaitCnt // D1ASM @DoStrobe; LoadCPReg; @CheckStopped; GetErrs; LoadDMD // D1RES ReadAllRegs // D1VM SetVirtP; IMstab; RMstab; BRstab; TASKNstab; DEVICEstab // D1GO MStopped // D1MICRES ChangeAltoControl // D1CONFIG FixForConfiguration; ShowConnection HaveControl; HaveProcL; HaveProcH; HaveMemC HaveMemD; HaveMemX; HaveIFU; HaveDskEth; HaveDisplay MapICcode; MainICcode; ModuleMask; log2rows NoCacheAParity; log2pgsize; IMXmask // Defined here InitHardware; ConfigUnknown; DefMemName ] static [ ConfigUnknown; DefMemName ] //Result is 0 or an alternate command menu. let InitHardware() = valof [ SetVirtP(false) DefMemName = MEMNAM!VMx //Note: all implementations of Midas must define the MDATA and MADDR //memories used in MTEST and MDEBUG. Zero(MDATAtab,MDATAlen*3) Zero(MADDRtab,MADDRlen*2) let Big = table [ -1; -1; 170000B ] MBlock(BitsChecked,Big,3) SetBlock(HighAddress,-1,2) AddrIncrement!1 = 1 //Initialize inverted tables for SearchBlocks IMstab = GetStorage(IMstablen); Zero(IMstab,IMstablen) RMstab = GetStorage(RMstablen); Zero(RMstab,RMstablen) BRstab = GetStorage(BRstablen); Zero(BRstab,BRstablen) TASKNstab = GetStorage(TASKNstablen); Zero(TASKNstab,TASKNstablen) DEVICEstab = GetStorage(DEVICEstablen); Zero(DEVICEstab,DEVICEstablen) //Serial number not stored in a static (would be smashed by RunProg) ACTS!1 = HWStatus>>HWStatus.ConnectedMachine test ACTS!1 eq -1 //Starting Midas from the Exec or not attached to any machine, in which //case hardware configuration is unknown ifso [ let ND,T = 1,nil //Build in ACTS a 4-word item for each connectable Dorado: 1st word //is the serial number, next two are a decimal string to be used as //an action in the Dorado select menu. MCWaitCnt = 20 //2 msec wait during polling for N = 0 to 255 if ConnectToD1(N) do [ ACTS!ND = N test N < 8 ifso ACTS!(ND+1) = 460B+N //1 char string ifnot test N < 64 ifso //2 char string [ ACTS!(ND+1) = 1060B+(N/8) ACTS!(ND+2) = (60B+(N rem 8)) lshift 8 ] ifnot //3 char string [ ACTS!(ND+1) = 1460B+(N/64) T = N rem 64 ACTS!(ND+2) = 30060B+((T/8) lshift 8)+(T rem 8) ] ND = ND+4 //Give up if more than 20 Doradoes possible if ND > 20*4 then break ] ACTS!0 = (ND-1)/4 switchon ACTS!0 into [ //More than one--show menu and let user choose default: for I = 1 to ND-4 by 4 do [ ACTS!(I+3) = CreateAction(ACTS+I+1,lv ConnectAction,ACTS!I) ] ACTS!(ND+3) = CreateAction("NoHW",lv ConnectAction,-1) resultis FindDorado //Exactly one Dorado--connect to it. case 1: //No Doradoes--come up in Midas test mode, faking a connection case 0: endcase ] //Fire up read/write parts of Midas only when selected Dorado //is halted; if running, menus should come up like they do in a "Go". //*Note: configuration cannot be determined when Dorado is running //because Dorado controls the muffler system when SetRun is true. NewConnect(ACTS!1) ] //Doing RunProg, in which case hardware configuration is recorded in //HWStatus which must be unpacked. It is impossible for the machine //to be running here. ifnot [ HaveControl = HWStatus>>HWStatus.HaveControl ne 0 HaveProcL = HWStatus>>HWStatus.HaveProcL ne 0 HaveProcH = HWStatus>>HWStatus.HaveProcH ne 0 HaveMemC = HWStatus>>HWStatus.HaveMemC ne 0 HaveMemD = HWStatus>>HWStatus.HaveMemD ne 0 HaveMemX = HWStatus>>HWStatus.HaveMemX ne 0 HaveIFU = HWStatus>>HWStatus.HaveIFU ne 0 HaveDskEth = HWStatus>>HWStatus.HaveDskEth ne 0 HaveDisplay = HWStatus>>HWStatus.HaveDisplay ne 0 ConfigUnknown = HWStatus>>HWStatus.ConfigUnknown ne 0 MapICcode = HWStatus>>HWStatus.MapICcode MainICcode = HWStatus>>HWStatus.MainICcode ModuleMask = HWStatus>>HWStatus.ModuleMask log2rows = HWStatus>>HWStatus.log2rows NoCacheAParity = HWStatus>>HWStatus.NoCacheAParity log2pgsize = HWStatus>>HWStatus.log2pgsize IMXmask = HWStatus>>HWStatus.IMXmask MakeConnection(ACTS!1) FixForConfiguration() ReadAllRegs(0) ] ShowConnected(ACTS!1) resultis 0 ] and ShowConnected(N) be [ Resets(ConnectStream) //Probably unnecessary test N eq -1 ifso Wss(ConnectStream,"Disconnected") ifnot [ Wss(ConnectStream,"Serial #") Wns(ConnectStream,N,0,8) ] ] and ConnectToD1(N) = valof [ MCTimeOut!0 = 0 LoadCPReg(BSelD+BCNoop+N); DoStrobe(Clock+BaseBAtten) //MCXct returns 0 on success, -1 on timeout resultis not MCXct(BInt+BCNoop) ] and ConnectAction(N,nil,nil) be [ NewConnect(N); ShowConnected(N); QuitCmdOverlay() ] and NewConnect(N) be [ let ConnectedOK = N ne -1 ? ConnectToD1(N),true //Set HaveControl true so that the first few calls to CheckStopped will //not be distorted--when HaveControl is false, CheckStopped always returns //"running." ConfigUnknown,HaveControl = true,true test MakeConnection(N) ifso if ConnectedOK do //Running [ ShowConnection(); WssCSS(", running") ] ifnot if ConnectedOK do //Halted--print like breakpoint [ QuitF = -1; MStopped(false) ] unless ConnectedOK do [ MStatus>>MStatus.MachRunning = true ResetsCSS(); ResetsCS1() WssCSS("**Serial #"); WnsCSS(N) WssCSS(" connection failed** ") ] ] and MakeConnection(N) = valof [ ChangeAltoControl(BAltoControl+BCNoop+1) HWStatus>>HWStatus.ConnectedMachine = N //Fill out some of HWStatus vector also written by D1Reset; can't do //everything unless Dorado is halted because the mufflers can't be //read while SetRun is true, and don't want to halt it if it is running. CheckStoppedGlitches!0 = 0 let MachRunning = not CheckStopped() MStatus>>MStatus.MachRunning = MachRunning //MIRdebugging is used with LoadDMD(IMAddr2) operations and for //CantContinue indication HWStatus>>HWStatus.MIRdebugging = (GetErrs() & MIRDebugena) ne 0 ? MIRdebug,0 resultis MachRunning ] //Put up connection menu and FindDorado(S,nil) be [ let ND = 1 Wss(ItemStream,"Select Dorado: "); MarkMenus(0) for I = 1 to (ACTS!0)+1 do [ WsMarkA(ACTS!(ND+3)); ND = ND+4 ] return ]