// D1Prin4.bcpl -- DWrong print routine
// Last edited: 4 May 1980
manifest [ get "d1dmux.d" ]
manifest [ get "d1regmem.d" ]
external [
// OS
Puts
// MASM
Wss; ResetsCSS; ResetsCS1
// MIOC
Wns
// MCMD
@WssCSS; WnsCSSD; WssCS1; CmdCommentStream; CmdCS1
// D1I0
DWrong
// D1PRIN4ASM1
DWPtab //For DMux addresses 0 to 57B
// D1PRIN4ASM2
DWPtab1 //For DMux addresses 60B to 144B
// D1PRIN4ASM3
DWPtab2 //For DMux addresses 160B to 175B
// Defined here
PrintDWrong; PrinDMww
]
// Subroutine to print bad bits in DWrong
let PrintDWrong() be
[ let ECSS,ECS1 = 1,0
ResetsCSS(); ResetsCS1(); WssCSS("Errors:")
for I = 0 to DMUXlen - 1 do
[ let W = DWrong!I
if W ne 0 do
[ PrinDMww(I,W,lv ECSS,lv ECS1,true)
]
]
]
//DMux signal name strings are pointed to by self-relative pointers
//in DWPtab or DWPtab1 tables. For isolated signals, the self-relative
//pointer in the table is to a string; for signal groups like
//"FOO.1", "FOO.2", ..., "FOO.n" the thing pointed at is another
//self-relative pointer back to "FOO.0".
//ECSS and ECS1 are counters of the number of names printed on
//each of the comment lines.
and PrinDMww(Addr,Val,lvECSS,lvECS1,PrintModule) be
[ let DAddr = Addr lshift 4
let Tabl = DWPtab
//Above 175B there are only counters, which aren't printed this way.
if Addr > 175B then return
if Addr ge 60B then
test Addr le dRESON
ifso
[ Tabl = DWPtab1; Addr = Addr-60B
]
ifnot
[ Tabl = DWPtab2; Addr = Addr-dTEMP
]
//Note that Addr is negative for addresses 145B to 157B, currently unused.
let X = Tabl+(Addr lshift 4)
let Bit = 100000B
for I = 0 to 17B do
[ if (Val & Bit) ne 0 do
[ let P,S = X+I,nil
test (rv lvECSS) ge 6
ifso test (rv lvECS1) ge 6
ifso return
ifnot
[ S = CmdCS1; rv lvECS1 = (rv lvECS1)+1
]
ifnot
[ S = CmdCommentStream; rv lvECSS = (rv lvECSS)+1
]
Puts(S,$ )
test (Addr < 0) % (P!0 eq 0) //Table entry 0 = no name
ifso
[ Wns(S,DAddr+I,0,8)
]
ifnot test rv(P+P!0) ge 200B //Point at a string?
ifso Wss(S,P+P!0)
ifnot
[ Wss(S,P+P!0+1); Wns(S,-P!0-(rv(P+P!0)),0,10)
]
let Z,TermCh = DAddr+I,nil
//This is the code I would like, but it doesn't compile
// TermCh = selecton Z into
// [
// case 0B to 117B: $A //ContA
// case 120B to 177B: $B //ContB
// case 200B to 237B: $A
// case 240B to 257B: $B
// case 260B to 377B: $A
// case 400B to 777B: (I ge 10B ? $L,$H)
// case 1000B to 1177B: $C //MemC
// case 1200B to 1357B: $D //MemD
// case 1360B to 1374B: $C
// case 1375B to 1777B: $X //MemX
// case 2000B to 2117B: $K //Disk control
// case 2120B to 2177B: $E //Ethernet
// case 2200B to 2377B: $Z //Baseboard
// case 2400B to 2777B: $I //IFU & junk io
// case 3000B to 3377B: $V //Display control
// case 3400B: $B //Temperature stuff
// case 3401B: $Z
// case 3402B: $H
// case 3403B: $L
// case 3404B: $I
// case 3420B to 3457B: $C //AAD and MEMB
// 3460B to 3517B are BMUX and ESTAT from direct readouts
// case 3540B to 3543B: $B //MIR stuff divided between A and B
// case 3544B to 3547B: $A
// case 3550B to 3563B: $B
// case 3564B to 3567B: $A
// case 3570B to 3603B: $B
// case 3604B to 3610B: $A
// case 3620B to 3623B: $B
// case 3624B to 3637B: $A
// case 3640B to 3737B: $B //IMOUT
// default: 0
// ]
//So this ugly code is used instead
TermCh = Z < 2000B ?
(Z < 1000B ?
//0 to 777B
(Z < 400B ?
((Z < 120B) % (Z ge 260B) ? $A,
(((Z < 200B) % (Z > 237B)) ? $B,$A)
),(I ge 10B ? $L,$H)
),
//1000B to 1777B
(Z < 1200B ? $C,
(Z < 1360B ? $D,(Z < 1375B ? $C,$X))
)
),
//2000 up
(Z < 2400B ?
//2000B to 2377B
(Z < 2200B ? (Z < 2120B ? $K,$E),$Z),
//2400B up
(Z < 3400B ? (Z < 3000B ? $I,$V),
(Z < 3420B ? table [ $B; $Z; $H; $L; $I; 0; 0; 0;
0; 0; 0; 0; 0; 0; 0; 0 ] ! (Z-3400B),
//3420 up
(Z < 3460B ? $C,
//3460 up
(Z < 3540B ? 0,
//3540 up
(Z < 3570B ?
//3540 to 3567
(Z < 3550B ?
(Z < 3544B ? $B,$A),
(Z < 3564B ? $B,$A)
),
//3570 up
(Z < 3620B ?
(Z < 3604B ? $B,$A),
(Z < 3624B ? $B,(Z < 3640B ? $A,$B))
)
)
)
)
)
)
)
if (TermCh ne 0) & PrintModule do
[ Puts(S,$/); Puts(S,TermCh)
]
]
Bit = Bit rshift 1
]
]