//D1Prin5.bcpl Procedures to prettyprint various registers and memories // Last edited: 20 November 1979 get "d1.d" manifest [ get "d1regmem.d" ] external [ // MASM @WssCSS; PutsCSS; PutsCS1; WssCS1; @OddParity // MIOC DWns // MCMD WnsCSS; WnsCSSD; WnsCS1; WnsCS1D; CmdCommentStream; CmdCS1 PassiveOnly // MPRINS PrinV0; PrinV1; NWss; NWss1 // MPATTERN @PATTERN // D1MEM MGetMemData // D1RES HWShowAddr // D1CONFIG CacheAMask0; CacheAMask1; log2rows // Defined here PrintMAP; PrintCONFIG; PrintPIPE; PrintCACHEA; PrintROW PrintINSSET ] let PrintMAP(X,DVec,AVec,Radix) be [ PATTERN = DVec!0 NWss("MapDirtyb ",#40) NWss("MapParity ") NWss("MapPE ") NWss("Ref ") NWss("WP ") NWss("Dirty ") PrinV0("RP[0:15]",DVec!1) ] //All signals are high-true in DVec and PrintPIPE(X,DVec,AVec,ExtRadix) be [ let Extension = ExtRadix<<lh let AVec1,T = vec 1,nil PATTERN = DVec!0 switchon Extension into [ //Pipe0 and Pipe1 case 0: PrinV0("VA[4:31]",DVec!0); PutsCSS($ ); WnsCSS(DVec!1) HWShowAddr(VMx,DVec); endcase //Pipe2 and Pipe3 case 1: T = PATTERN rshift 14 PrinV0("RefType",T) WssCSS(" (=") WssCSS(selecton T into [ case 0: "undef.)" case 1: "storage read)" case 2: "storage write)" case 3: "Map← or non-storage op)" ] ) PrinV0(", Subtask",(PATTERN rshift 12) & 3B) PrinV0(", Task",PATTERN<<nib1) NWss1("Emulator fault, ",#200) PrinV1("NumFaults",(PATTERN rshift 4) & 7B) PrinV1(", FirstFaultSRN",PATTERN<<nib3) PrinV1(", RP",DVec!1); endcase //Pipe4 and Pipe5 case 2: NWss("Ref ",#100000) NWss("WP ",#20000) NWss("Dirty ") T = ((PATTERN rshift 10) & 3)+((PATTERN rshift 12) & 4) WssCSS(selecton T into [ case 0: "no fault " case 1: "SE " case 2 to 3: "DE " case 4 to 5: "PgFlt " case 6 to 7: "MapPE " ] ) PrinV0("Quadword",(PATTERN rshift 8) & 3) T = PATTERN<<rh PrinV0(" Syndrome",T) switchon T into [ case 1: PrinChkBit($7); endcase //Parity bit case 2: PrinChkBit($6); endcase case 4: PrinChkBit($5); endcase case 8: PrinChkBit($4); endcase case 16: PrinChkBit($3); endcase case 32: PrinChkBit($2); endcase case 64: PrinChkBit($1); endcase case 128: PrinChkBit($0) case 0: endcase default: test OddParity(T,0) ifso //Single error (or odd no. errors) [ let Word = table [ 4; 4; 4; 0; 4; 1; 2; 3 ] ! ((T & 16B) rshift 1) test Word le 3 ifso [ //Mirror image left four bits to get bit number let Bit = table [ #0; #10; #4; #14; #2; #12; #6; #16 #1; #11; #5; #15; #3; #13; #7; #17 ] ! (T rshift 4) WssCSS(" (= SE in bit "); WnsCSSD(Bit) WssCSS(", word "); WnsCSS(Word); WssCSS(") ") ] ifnot WssCSS(" (**Syndrome word code bad**) ") ] ifnot //Even no. errors ge 2 [ WssCSS(" (= multiple error) ") ] ] PATTERN = DVec!1 NWss1("MapBufBusy ",#100000) NWss1("FlushStore ") NWss1("Tag ") NWss1("CacheRef ") NWss1("Store ") NWss1("IFUref ") PrinV1("ColVic",(PATTERN & 1400B) rshift 8) NWss1(" Dirty",#200) NWss1(" Vacant") NWss1(" WP") NWss1(" BL") PrinV1(" NV",(PATTERN rshift 2) & 3) PrinV1(" V",PATTERN & 3) ] ] and PrinChkBit(Char) be [ WssCSS(" (= chk bit "); PutsCSS(Char); WssCSS(" bad) ") ] and PrintCONFIG(X,DVec,AVec,Radix) be [ PATTERN = DVec!0 PrinV0("ProcSRN[0:3]",PATTERN<<nib0) PrinV0(" Asrn[0:3]",PATTERN<<nib1) NWss(" M0",#200) NWss(" M1") NWss(" M2") NWss(" M3") WssCS1("Storage IC size = ") WnsCS1D(table [ 4; 16; 64; 256 ] ! ((PATTERN rshift 2) & 3)) PutsCS1($k) NWss1(" MapDirtyb",#2) NWss1(" MapParity") ] and PrintCACHEA(X,DVec,AVec,Radix) be [ let DV1,AV1 = vec 18,vec 1 AV1!0 = 0; AV1!1 = AVec!1 lshift 4 //Also print the contents of CACHED unless PassiveOnly do [ for I = 0 to 15 do [ MGetMemData(CACHEDx,DV1+I,AV1); AV1!1 = AV1!1+1 ] for I = 0 to 7 do [ DWns(CmdCommentStream,DV1+I,16,0,8,6,$0) PutsCSS($ ) ] for I = 8 to 15 do [ DWns(CmdCS1,DV1+I,16,0,8,6,$0); PutsCS1($ ) ] ] //DVec has zeroes in bits which aren't stored in the cache address //section so simply add in the row bits. DV1!0 = DVec!0 & 7777B DV1!1 = DVec!1 + ((AVec!1 & ((1 lshift log2rows)-1)) lshift 4) WssCSS(" VA="); DWns(CmdCommentStream,DV1,32,0,Radix) PATTERN = DVec!0 NWss1(" Dirty",#100000) NWss1(" Vacant") NWss1(" WP") NWss1(" BL") ] and PrintROW(X,DVec,AVec,ExtRadix) be [ let Extension = ExtRadix<<lh test Extension eq 4 ifso [ PrinV0("NextV",DVec!0 rshift 14) PrinV0(" Victim",(DVec!0 rshift 12) & 3) ] ifnot [ let AVec1 = vec 1; AVec1!0 = 0 AVec1!1 = (AVec!1)+(Extension lshift log2rows) PrintCACHEA(X,DVec,AVec1,ExtRadix<<rh) ] ] and PrintINSSET(X,DVec,AVec,Radix) be [ PrinV0("←Id count",DVec!0 rshift 13) PrinV0(", InsSet",(DVec!0 rshift 11) & 3) ]