// MICRO Listing and Errors
// last edited July 7, 1980 9:24 AM
// Copyright Xerox Corporation 1979, 1980
get "micdecl.d"
external // O.S.
[ Puts
]
// Static Storage
static [
abortflag = false
]
let lcrlf() be
// Lists carriage return, line feed.
[ Puts(lchan, $*N)
Puts(lchan, $*L)
]
and lstr(s) be
// Write BCPL Format string on listing.
[ for i = 1 to s>>BS.length do Puts(lchan, s>>BS.char↑i)
]
and llstr(s) be
// List literal string. Separate routine to enhance
// system independence.
[ llstr = lstr // overwrite static
lstr(s)
]
and lchr(ch) be
Puts(lchan, ch)
and lblnks(n) be
// List n blanks.
for i = 1 to n do
Puts(lchan,$*S)
and lsym(ep) = valof
// Write symbol on listing.
[ let i = sname*2
[ let ch = ep>>BS.char↑i
if ch eq 0 break
Puts(lchan,ch)
i = i+1
] repeat
resultis i-sname*2
]
and lblk(addr, nc) be
// Write unpacked string on listing.
[ let len = expandlength(addr, nc)
test len eq -1
ifso for i = 0 to nc-1 do Puts(lchan, addr!i)
ifnot
[ expand(lv addr)
lblk(addr, nc)
dalloctemp(addr)
]
]
and lval(n) be
// Write value on listing.
[ let s = vec 6
let nc = num2blk(s,n,8)
lblk(s, nc)
]
and ldec(n) be
// Write decimal value.
[ if n ls 0 then [ lchr($-); n = -n ]
let s = vec 6
let nc = num2blk(s,n,10)
lblk(s, nc)
]
and lloc(sym,inc) be
// Write location.
[ if sym ne 0 then
[ lsym(sym)
if inc gr 0 then lchr($+)
]
if inc ne 0 then ldec(inc)
]
and error(s) be
// Internal error procedure.
[ lchan = ettchan
llstr(s)
lcrlf()
if s>>BS.char↑1 ne $** then // not called from errx
[ llstr("****** Fatal error, abnormal termination")
lcrlf()
]
if errcnt eq 0 then errcnt = 1 // to warn user
endmic()
]
and errx(es,aflag,par1,nil,nil,nil,nil,nil;numargs na) be
[ if na ls 2 then aflag = false
lchan = ettchan
printstat(lchan)
errm(es, lv par1, true)
if aflag then error("**** Fatal error, abort")
errcnt = errcnt+1
if errcnt gr errmax then error("**** Too many errors, abort")
lchan = lstchan
]
and errm(es, ap, locflag) be
[ if locflag then
[ lloc(lbsym,stlct-lblct)
llstr("........")
]
for i = 1 to es>>BS.length do
[ let ch = es>>BS.char↑i
if ch ne $@ then
[ Puts(lchan,ch)
loop
]
i = i+1
ch = es>>BS.char↑i
switchon ch into
[ case $S:
lsym(@ap)
endcase
case $V:
lval(@ap)
endcase
case $D:
ldec(@ap)
endcase
case $B:
lblk(@ap,ap!1)
ap = ap+1
endcase
case $L:
lstr(@ap)
endcase
default:
Puts(lchan,ch)
loop
]
ap = ap+1
]
lcrlf()
]
// Produce expanded listing of word
let lstword(awd, axlb, mem, loc, opt) be
[ let vs = vec 6
let nb = mem!mswidth
let n = num2blk(vs, loc, 8)
let pos = lsym(mem)+n+1
lchr($*S)
lblk(vs, n)
let ep = mem!msltag + fstop
if (ep ne 0) & (ep!asval eq loc) then
[ llstr(" (")
pos = lsym(ep)+pos+3
lchr($))
]
if (opt & LFbinary) ne 0 then
[ lblnks((pos ge 19 ? 1, 19-pos))
let bn, map = 0, mem!mslfields + fstop
let dnb = ((opt & LF16bit) ne 0? 16, 12)
while bn ne nb do
[ let nm = @map
until nm eq 0 do
[ let n1 = nm rem dnb
if n1 eq 0 then n1 = dnb
Puts(lchan, $*S)
let val = getbits(awd, bn, n1)
for sh = ((n1-1)/3)*3 by -3 to 0 do
Puts(lchan, ((val rshift sh) & 7)+$0)
bn, nm = bn+n1, nm-n1
]
map = map+1
]
lcrlf()
pos = 0
]
if (opt & LFfields) eq 0 then return
let f = true
for bitno = 0 to nb-1 do
[ let ep = axlb!bitno
if ep ne 0 then
[ let width = ep!fsbits & #377
let vp = getbits(awd,bitno,width)
let n = num2blk(vs,vp,8)
let nc = lenname(ep)+n+3
test f ifso
[ f = false
let k = (pos gr 14 ? 2,16-pos)
lblnks(k)
pos = pos+k
]
ifnot test pos+nc gr lllength ifso
[ llstr(",*N ")
pos = 13
]
ifnot llstr(", ")
lsym(ep)
lchr($←)
lblk(vs, n)
pos = pos + nc
]
]
if pos ne 0 then llstr(";*N")
]