//D1Prin2.bcpl Procedures to prettyprint various registers and memories // Last edited: 21 July 1980 get "d1.d" manifest [ get "d1regmem.d" ] structure IFU: [ g0 bit 5 PA bit 1 IFaddrx bit 10 Sign bit 1 Par bit 3 Lengthx bit 2 RBaseBx bit 1 MemB bit 3 Typex bit 2 N bit 4 ] external [ // MASM @WssCSS; PutsCSS; WssCS1; PutsCS1; GetField // MRGN CharInputRoutine // MTXTBUF ClearInText // MSYM SearchBlocks // MIOC DWns; Wns // MCMD WnsCSS; WnsCS1; WnsCS1D; CmdCommentStream; CmdCS1 // MPRINS PrinV0; PrinV1; NWss; NWss1 // MPATTERN @PATTERN // D1ASM stNotInVM // D1VM LookUpVA; LookUpAA; @VirtualP // D1GO PrCCV // D1CONFIG IMXmask // D1PRIN4 PrinDMww // Defined here PrintWrdByt; PrintD1OUT; PrintShC; PrintSTKP; PrintPCX PrintTLINK; PrintAATOVA; PrintIFUM; PrintMADDR; PrintBR ] let PrintTLINK(X,DVec,AVec,Radix) be [ let Val = DVec!0 let X = VirtualP ? IMx,IMXx PrCCV(DVec-1,X) if VirtualP & (Val ge 0) do [ WssCSS(" = abs. "); WnsCSS(LookUpAA(Val)) ] //Put VA on input line for ease of examining that value // for N = 4 to 13 by 3 do CharInputRoutine(GetField(N,3,lv Val)+60B) // ClearInText() ] and PrintAATOVA(X,DVec,AVec,Radix) be [ test DVec!0 ge 0 ifso [ let AVec1 = vec 1; AVec1!0 = 0; AVec1!1 = DVec!0 & IMXmask SearchBlocks(CmdCommentStream,IMx,AVec1,-1,0) WssCSS(" = abs. "); WnsCSS(LookUpAA(AVec1!1)) ] ifnot WssCSS(stNotInVM) ] and PrintIFUM(X,DVec,AddrVec,Radix) be [ let IFaddr = (DVec>>IFU.IFaddrx xor 1777B) lshift 2 let Sign = DVec>>IFU.Sign let PA = DVec>>IFU.PA let Par = DVec>>IFU.Par let Length = (DVec>>IFU.Lengthx) xor 3 let RBaseB = (DVec>>IFU.RBaseBx) xor 1 let MemB = (DVec>>IFU.MemB) let Type = DVec>>IFU.Typex xor 3 let N = DVec>>IFU.N let AVec = vec 1; AVec!0 = 0 test Length eq 0 ifso WssCSS("?0?") ifnot [ test ((Type & 1) ne 0) & (Length eq 3) ifso WssCSS("?3?") ifnot WnsCSS(Length) ] WssCSS("-byte ") WssCSS(selecton Type into [ case 0: "regular" case 1: "jump" case 2: "pause" case 3: "?jump&pause?" ] ) WssCSS(" to ") PrCCV((lv IFaddr)-1,IMXx) // CharInputRoutine($I); CharInputRoutine($M) // CharInputRoutine($X); CharInputRoutine($ ) // for I = 4 to 13 by 3 do // [ CharInputRoutine(GetField(I,3,lv IFaddr)+60B) // ] // ClearInText() test (Type & 1) ne 0 //Jump? ifso [ WssCS1("Displacement=") test Length eq 1 ifso [ let Disp = (PA lshift 4)+(Sign eq 0 ? N,N+177740B) PutsCS1($.); DWns(CmdCS1,lv Disp,16,0,-8) ] ifnot [ if Sign ne 0 then WssCS1("Sign-ext ") WssCS1("alpha") ] ] ifnot [ test N eq 17B ifso WssCSS(", no N") ifnot [ WssCSS(", N="); WnsCSS(N) ] WssCS1("PackedAlpha="); WnsCS1(PA) WssCS1(", Sign="); WnsCS1(Sign) ] WssCS1(", MemBase=") test MemB ge 4 ifso //BR 34 to 37 [ AVec!1 = MemB+30B SearchBlocks(CmdCS1,BRx,AVec,-1,0) ] ifnot //BRX 0 to 3 [ AVec!1 = MemB SearchBlocks(CmdCS1,BRXx,AVec,-1,0) ] WssCS1(", RBaseB=") WnsCS1(RBaseB) test Par eq 0 ifso WssCS1(", Parity ok") ifnot [ if (Par & 4) ne 0 then WssCS1(", PE0 bad") if (Par & 2) ne 0 then WssCS1(", PE1 bad") if (Par & 1) ne 0 then WssCS1(", PE2 bad") ] ] and PrintShC(X,DVec,AVec,Radix) be [ PATTERN = DVec!0 WssCSS(((PATTERN & 20000B) ne 0 ? "T.","R.")) WssCSS(((PATTERN & 10000B) ne 0 ? "T","R")) PrinV0(" Count",(PATTERN rshift 8) & 17B) PrinV0(" RMask",(PATTERN rshift 4) & 17B) PrinV0(" LMask",PATTERN & 17B) WssCSS(" = "); PrintWrdByt(X,DVec,AVec,Radix) ] and PrintSTKP(X,DVec,AVec,Radix) be [ PATTERN = DVec!0 NWss("Stack ovf ",#200) NWss("Stack und ") PrinV0("StkP",DVec>>lh) ] and PrintD1OUT(X,DVec,AVec,Radix) be [ PATTERN = DVec!0 let data = PATTERN rshift 7 let datar1 = data rshift 1 switchon (PATTERN rshift 3) & 7B into [ case 0: WssCSS("Control[") NWss("ClrStop",ClrStop) NWss(" StopAtt1") NWss(" Jam") NWss(" Freeze") NWss(" ClrMIR") NWss(" ClrCT") NWss(" SetRun") NWss(" SetSS"); endcase case 1: WssCSS("Clock[") NWss(" DAddrBit",DAddrBit) NWss(" ShiftDMux") NWss(" GetTLINK",GetTLINK) NWss(" UseCPReg") NWss(" UseDMD") NWss(" BaseBAtten"); endcase case 2: WssCSS("CPReg0["); WnsCSS(datar1); endcase case 3: WssCSS("CPReg1["); WnsCSS(datar1); endcase case 4: WssCSS("Mir0["); WnsCSS(data); endcase case 5: WssCSS("Mir1["); WnsCSS(data); endcase case 6: WssCSS("Mir2["); WnsCSS(data); endcase case 7: WssCSS("Mir3["); WnsCSS(data); endcase ] PutsCSS($]) NWss(100B," Strobe") ] and PrintWrdByt(X,DVec,AVec,Radix) be [ Wns(CmdCommentStream,DVec!0,0,Radix); WssCSS(" = ") Wns(CmdCommentStream,DVec>>lh,0,Radix); WssCSS(",,") Wns(CmdCommentStream,DVec>>rh,0,Radix) ] and PrintPCX(X,DVec,AVec,Radix) be [ PrinV0("Word",DVec!0 rshift 1); PrinV0(" byte",DVec!0 & 1) ] and PrintMADDR(X,DVec,AVec,Radix) be [ switchon AVec!1 into [ case 2B: WssCSS("No. test iterations="); endcase //**Microcomputer smashes this; should pretty-print signal name case 3B: [ PrinV0("DMux signal addressed when running",DVec!1) WssCSS(" =") let Addr = (DVec!1 rshift 4) & 377B let Mask = 100000B rshift ((DVec+1)>>nib3) let ECSS,ECS1 = 0,0 PrinDMww(Addr,Mask,lv ECSS,lv ECS1,true) return ] case 6B: WssCSS("Address bits always 1 on failures="); endcase case 7B: WssCSS("Union of address bits that were 1 on failures="); endcase case 11B: PrinV0("No. false halts detected by CheckStopped",DVec!0) PrinV1("No. microcomputer timeouts",DVec!1); return case 12B: PrinV0("Count of PE's in MIR[21:41]",DVec!1) PrinV1("Count of PE's in MIR[0:20]",DVec!0); return default: endcase ] DWns(CmdCommentStream,DVec,32,0,Radix) ] //Used for both BR and BRX and PrintBR(X,DVec,AVec,Radix) be [ DWns(CmdCommentStream,DVec) ]