// D1res.bcpl -- resident procedures // Last edited: 1 May 1980 get "mcommon.d" get "d1.d" manifest [ get "d1instrs.d" ] manifest [ get "d1dmux.d" ] manifest [ get "d1regmem.d" ] manifest [ get "d1pe.d" ] external [ // MIDAS MidasSwat // MINIT0 MStatus // MMPRGN UpdateMPDValues // MCMD ErrorAbort; PassiveOnly // D1I0 @SaveMIR; HWStatus; @DMuxTab; DChecked // D1TABLES @REGCON // D1ASM @MCXct; LoadMIR; LoadCPReg; @Xct; @XctR16; @XctR16C; @XctL16Q @XctL16T; @XctLFF; @DoStrobe; ReadDMux; LoadDMD; @SelectTask IMtoMIR; MIRtoIM; @D1Out; stReadOnly; stPassive; stRunning // D1MEM GetMic2; FixClock; ClearIMBDAddr DMuxSelect; @OldTask; @SaveTask; @SaveQ; SaveSTKP @SaveT; @SaveSRN; @SaveMCR // D1VM LookUpVA // Defined here GetRegData; MGetChecks; MGetRegData PutRegData; MPutChecks; MPutRegData ] static [ SaveVA ] //DMux items read out from the current, old, wrong, or checked versions //of DMuxTab according to the last button action on DMux let GetRegData(RegX,DVec) = valof [ let T = nil switchon RegX into [ case CPREGx: XctR16C(RLINK,DVec); endcase case MIRx: MIRtoIM(DVec,DMuxSelect+dSaveMIR); endcase case IMOUTx: MIRtoIM(DVec,DMuxSelect+dIMOUT); endcase case Qx: XctR16(RQ,DVec); endcase case CNTx: Xct(TFCNT); XctR16(RT,DVec); endcase case SHCx: Xct(TFSHC); XctR16(RT,DVec); endcase case MEMBXx: Xct(TFPTRS); DVec!0 = (XctR16C(RT,DVec) lshift 1) & 140000B endcase case STKPx: Xct(TFTIOA); T = XctR16(RT,DVec) lshift 8 Xct(TFPTRS); DVec!0 = T+(XctR16(RT,DVec) & 300B) endcase case TASKx: DVec!0 = SaveTask lshift 12; endcase case MCRx: DVec!0 = DMuxSelect!dMCR; endcase case PROCSRNx: DVec!0 = XctR16(RCONFG,DVec) & 170000B; endcase case CONFIGx: XctR16(RCONFG,DVec); endcase case PCXx: XctR16(RPCX,DVec); endcase case INSSETx: DVec!0 = #174000 & XctR16(RIFH,DVec); endcase case TESTSYNx: case STROBEx: case D1OUTx: resultis false //write-only case UPTIMEx: case TGLITCHx: T = RegX eq UPTIMEx ? 82,88 MCXct(BCLdHi+BHoldInt+BInt); MCXct(BCLdLo+BHoldInt+BInt+T) GetMic2(DVec); GetMic2(DVec+1); GetMic2(DVec+2) MCXct(BInt+BCNoop); FixClock(); endcase case EVCNTAx: XctR16(REVA,DVec); endcase case EVCNTBx: XctR16(REVB,DVec); endcase case AATOVAx: DVec!0 = SaveVA; endcase case ESTATx: DVec!0 = DMuxSelect!dESTAT; endcase default: MidasSwat(UndefRegXRead) ] resultis true ] and MGetChecks(CON) = valof [ let MachRunning = MStatus>>MStatus.MachRunning if MachRunning then unless CON<>HWStatus.MIRdebugging = (D & MIRDebugena) ne 0 ? MIRdebug,0 ClearIMBDAddr() //Enable/disable MIRdebug feature ReadDMux(); resultis true ] ifnot test DMuxSelect eq DChecked ifso [ DMuxSelect!dESTAT = D; resultis true ] ifnot resultis false default: MidasSwat(UndefRegXWrite) ] LoadMIR(SaveMIR); ReadDMux(); resultis true ] and MPutChecks(CON) be [ if CON<>MStatus.MachRunning let PassiveWrite = CON<