//D1Test.bcpl -- machine-dependent part of "Test" overlay // Last edited: 20 November 1979 manifest [ get "d1dmux.d" ] manifest [ get "d1regmem.d" ] manifest [ get "d1instrs.d" ] external [ // OS DoubleAdd // MINIT0 @MBlock // MASM WssCS1; SelfRel // MMENU PrintActionTime // MDEBUG CheckData; ErrorStop; SaveDGen; RestoreDGen; TestAborted; @NDWords // MPATTERN NextData // MTEST LastVal // MDATA @ShouldBe; @BitsChecked; @DataWas // D1I0 @DMuxTab; DMuxSelect // D1TABLES @MEMLEN // D1ASM @Xct; @XctL16; @XctR16; @XctLFF; @XctL16T; @SelectTask; ReadDMux // D1REG PutRegData; GetRegData // D1RW MPutMemData; @SaveMBase; @SaveT // D1VM SetVirtP // D1TESTASM OtherNAM // Defined here ValidateTest // These procedures are called from the OtherProc table in D1TestAsm. ShmvLp; WFLp; RFLp; ProcVALp // These procedures are called from the OtherPrint table in D1TestAsm. ShmvPrint; WFRFPrint; ProcVAPrint ] //X is RegX, MemX+NREGS, or NREGS+NMEMS+OtherX let ValidateTest(X) be [ SetVirtP(false) LastVal = X; DMuxSelect = DMuxTab ] and ShmvLp(X) = valof [ for I = 0 to 49 do [ NextData() let lmask = -1 lshift (16-(ShouldBe!0 & 17B)) let rmask = -1 rshift (16-((ShouldBe!0 rshift 4) & 17B)) PutRegData(SHCx,ShouldBe) let Opx = ShouldBe!0 rshift 14 Xct(table [ SFTN; SFTL; SFTR; SFTB ] ! Opx) ReadDMux(); DataWas!0 = DMuxTab!dSHMV SaveDGen() ShouldBe!0 = selecton Opx into [ case 0: 0 case 1: lmask case 2: rmask case 3: lmask % rmask ] if CheckData() then ErrorStop("shmv wrong after ", selecton Opx into [ case 0: "ShiftNoMask" case 1: "ShiftLMask" case 2: "ShiftRMask" case 3: "ShiftBothMasks" ] ) RestoreDGen() ] if TestAborted then ErrorStop() PrintActionTime(); resultis true ] and ShmvPrint(X) be [ WssCS1("using ShiftNoMask, ShiftLMask, ShiftRMask, and ShiftBothMasks") ] and RFILp(P,S,Val) = valof [ XctL16(LT,Val); Xct(RF); Xct(NOOP) resultis (Val & 30000B)+(((P+S+1) & 17B) lshift 8)+((15-S) & 17B) ] and WFILp(P,S,Val) = valof [ XctL16(LT,Val); Xct(WF); Xct(NOOP) let Z = (15-P-S) & 17B resultis (Val & 30000B)+(Z lshift 8)+(Z lshift 4)+P ] //These two ignore the data pattern, manipulating ShouldBe directly. and RFLp(X) = WFRFLp(X,lv RFILp) and WFLp(X) = WFRFLp(X,lv WFILp) and WFRFLp(X,lvProc) = valof [ let AVec = vec 1; AVec!0 = 0 for P = 0 to 17B do for S = 0 to 17B do [ AVec!1 = (P lshift 4)+S ShouldBe!0 = (rv lvProc)(P,S,AVec!1) GetRegData(SHCx,DataWas) if CheckData() then ErrorStop(SelfRel(OtherNAM+X)," failed for A = ",AVec) ] if TestAborted then ErrorStop() PrintActionTime(); resultis true ] and WFRFPrint(X) be [ WssCS1("for P = 0 to 17B, for S = 0 to 17B") ] and ProcVALp(X) = valof [ let V1,AVec = vec 2,vec 1; AVec!0 = 0; V1!0 = 0 SelectTask(0); PutRegData(MCRx,table [ NoWake+DisHold ] ) for I = 0 to MEMLEN!(BRx+BRx+1)-1 do [ AVec!1 = I; SaveMBase = I; XctLFF(LMB0,I) NextData() MPutMemData(BRx,ShouldBe,AVec) SaveT = ShouldBe!2; XctL16T(SaveT); V1!1 = SaveT DoubleAdd(ShouldBe,V1) Xct(DUMMYFT); Xct(NOOP); ReadDMux() MBlock(DataWas,DMuxTab+dPVAH,2) if CheckData() then ErrorStop(SelfRel(OtherNAM+X)," failed on BR = ",AVec) ] if TestAborted then ErrorStop() PrintActionTime(); resultis true ] and ProcVAPrint(X) be [ WssCS1("with DUMMYREF←T using BR's 0 to 37") ]