-- STDebugMisc.mesa Edited by Bruce, October 14, 1980 10:50 AM
DIRECTORY
Ascii USING [CR, DEL, ESC, FF, LF, SP, TAB],
DebugFormat USING [LongSubString, LongSubStringDescriptor],
DebugTable USING [CompStrDesc, CSRptr],
DebugUsefulDefs USING [ShortREAD],
ErrorTable USING [CompStrDesc],
RESOut USING [Log8, Log10, MakeRoom, PChar, PCr, PDecimal, PNumber, PString],
STDebugDefs USING [
AppendLongSubString, LockTableSegment, PLongSubString, STCopyRead, STRead,
TableBase, TableId, UnlockTableSegment],
String USING [AppendOctal, SubString, SubStringDescriptor],
Symbols USING [
HTIndex, HTNull, HTRecord, htType, ISEIndex, SERecord, seType, ssType,
TransferMode, TypeClass],
Table USING [Base];
STDebugMisc: PROGRAM
IMPORTS DebugUsefulDefs, RESOut, STDebugDefs, String
EXPORTS STDebugDefs =
BEGIN OPEN STDebugDefs, RESOut;
showLinks: PUBLIC BOOLEAN ← FALSE;
csrP: DebugTable.CSRptr;
desc: DebugFormat.LongSubStringDescriptor;
ss: DebugFormat.LongSubString = @desc;
opnames: LONG POINTER TO ARRAY [0..256) OF ErrorTable.CompStrDesc;
mopdesc: DebugFormat.LongSubStringDescriptor;
PutAsMopcode: PUBLIC PROCEDURE [n: CARDINAL] = {
PCr[]; PDecimal[n]; PString[" = z"L]; WriteOpName[n, mopcodes]};
WriteMOpName: PUBLIC PROCEDURE [n: CARDINAL] = {PChar['z]; WriteOpName[n, mopcodes]};
AppendMopcodeName: PUBLIC PROCEDURE [s: STRING, n: CARDINAL] = {
AppendOpcodeName[s, n, mopcodes]};
AppendOpcodeName: PROCEDURE [s: STRING, n: CARDINAL, id: TableId] =
BEGIN
LockMopcodes[id];
[offset: mopdesc.offset, length: mopdesc.length] ← opnames[n];
IF mopdesc.length = 0 THEN String.AppendOctal[s, n]
ELSE AppendLongSubString[s, @mopdesc];
UnlockMopcodes[id];
RETURN
END;
WriteOpName: PUBLIC PROCEDURE [n: CARDINAL, id: TableId] =
BEGIN
LockMopcodes[id];
[offset: mopdesc.offset, length: mopdesc.length] ← opnames[n];
IF desc.length = 0 THEN PNumber[n,[8,TRUE,TRUE,3]]
ELSE PLongSubString[@mopdesc];
UnlockMopcodes[id];
RETURN
END;
LockMopcodes: PROC [id: TableId] = {
opnames ← LockTableSegment[id];
mopdesc.base ← LOOPHOLE[opnames + 256*SIZE[ErrorTable.CompStrDesc], LONG STRING]};
UnlockMopcodes: PROC [id: TableId] = {UnlockTableSegment[id]};
LockDebugTab: PROC = {
csrP ← LockTableSegment[debugtab];
ss.base ← @csrP[csrP.stringOffset]};
UnlockDebugTab: PROC = {UnlockTableSegment[debugtab]};
PutNodeName: PUBLIC PROCEDURE [n: UNSPECIFIED] =
BEGIN
LockDebugTab[];
[offset: desc.offset, length: desc.length] ← csrP.NodePrintName[n];
PLongSubString[ss];
UnlockDebugTab[];
RETURN
END;
PutTypeName: PUBLIC PROCEDURE [n: Symbols.TypeClass] =
BEGIN
LockDebugTab[];
[offset: desc.offset, length: desc.length] ← csrP.TypePrintName[n];
PLongSubString[ss];
UnlockDebugTab[];
END;
PutModeName: PUBLIC PROCEDURE [n: Symbols.TransferMode] =
BEGIN
LockDebugTab[];
[offset: desc.offset, length: desc.length] ← csrP.ModePrintName[n];
PLongSubString[ss];
UnlockDebugTab[];
END;
PRemoteSubString: PUBLIC PROCEDURE [ss: String.SubString] =
BEGIN
i: CARDINAL;
s: PACKED ARRAY [0..1] OF CHARACTER;
p: POINTER ← @s;
len: CARDINAL ← MIN[ss.length, 50];
IF ss.offset MOD 2 # 0 THEN
p↑ ← DebugUsefulDefs.ShortREAD[@ss.base.text+ss.offset/2];
FOR i IN [ss.offset..ss.offset+len) DO
IF i MOD 2 = 0 THEN p↑ ← DebugUsefulDefs.ShortREAD[@ss.base.text+i/2];
PChar[s[i MOD 2]];
ENDLOOP;
IF ss.length > len THEN PString["..."L];
END;
PRemoteString: PUBLIC PROCEDURE [s: STRING] =
BEGIN
desc: String.SubStringDescriptor ← [base: s, offset: 0, length: NULL];
IF s = NIL THEN {PString["NIL"L]; RETURN};
desc.length ← DebugUsefulDefs.ShortREAD[@s.length];
PRemoteSubString[@desc];
END;
HashForSei: PUBLIC PROCEDURE [sei: Symbols.ISEIndex]
RETURNS [hti: Symbols.HTIndex] =
BEGIN OPEN Symbols;
ise: id SERecord;
seb: Table.Base;
seb ← TableBase[seType];
STCopyRead[to: @ise, from: @seb[sei],
nwords: SIZE[id SERecord]];
RETURN[ise.hash];
END;
PutAsChar: PROCEDURE [c: [0..128)] =
BEGIN
SELECT LOOPHOLE [c, CHARACTER] FROM
Ascii.CR => PString["CR"L];
Ascii.DEL => PString["DEL"L];
Ascii.ESC => PString["ESC"L];
Ascii.FF => PString["FF"L];
Ascii.LF => PString["LF"L];
Ascii.SP => PString["SP"L];
Ascii.TAB => PString["TAB"L];
< 40C => BEGIN PString["'↑"L]; PChar['@+c]; END;
ENDCASE => BEGIN PChar['']; PChar[LOOPHOLE[c]]; END;
END;
LengthAsChar: PROCEDURE [c: [0..128)] RETURNS [CARDINAL] =
BEGIN
SELECT LOOPHOLE [c, CHARACTER] FROM
Ascii.CR => RETURN [2];
Ascii.DEL => RETURN [3];
Ascii.ESC => RETURN [3];
Ascii.FF => RETURN [2];
Ascii.LF => RETURN [2];
Ascii.SP => RETURN [2];
Ascii.TAB => RETURN [3];
< 40C => BEGIN RETURN [3]; END;
ENDCASE => BEGIN RETURN [2]; END;
END;
PutAsVariousRep: PUBLIC PROCEDURE [n: UNSPECIFIED] =
BEGIN
r: RECORD [ SELECT OVERLAID * FROM
int => [i: INTEGER],
card => [c: CARDINAL],
bytes => [b1, b2: [0..256)],
nibbles => [n1, n2, n3, n4: [0..16)],
bitaddr => [wd: [0..7777B], bd: [0..17B]],
pdesc => [gfi: [0..1777B], entry: [0..37B], tag: BOOLEAN],
ENDCASE] = n;
AnotherVal: PROCEDURE [len: CARDINAL] =
BEGIN
PString[" ="L];
IF MakeRoom[len+1, 2] THEN PChar[Ascii.SP];
END;
PCr[];
BEGIN OPEN r;
PNumber[c, [base: 8, zerofill: FALSE, unsigned: TRUE, columns: 0]];
PString["B = "L];
PNumber[c, [base: 10, zerofill: FALSE, unsigned: TRUE, columns: 0]];
IF i < 0 THEN
BEGIN
AnotherVal[1+Log10[-i]];
PNumber[c, [base: 10, zerofill: FALSE, unsigned: FALSE, columns: 0]];
END;
IF b1 # 0 THEN
BEGIN
AnotherVal[Log10[b1]+Log10[b2]+2];
PNumber[b1, [base: 10, zerofill: FALSE, unsigned: TRUE, columns: 0]];
PString[",,"L];
PNumber[b2, [base: 10, zerofill: FALSE, unsigned: TRUE, columns: 0]];
IF b1 > 15 OR b2 > 15 THEN
BEGIN
chars: CARDINAL ← Log8[b1]+Log8[b2]+2;
IF b1 > 7 THEN chars ← chars+1;
IF b2 > 7 THEN chars ← chars+1;
AnotherVal[chars];
PNumber[b1, [base: 8, zerofill: FALSE, unsigned: TRUE, columns: 0]];
IF b1 > 7 THEN PChar['B];
PString[",,"L];
PNumber[b2, [base: 8, zerofill: FALSE, unsigned: TRUE, columns: 0]];
IF b2 > 7 THEN PChar['B];
END;
IF b1 < 128 AND b2 < 128 THEN
BEGIN
AnotherVal[LengthAsChar[b1]+ LengthAsChar[b2] + 2];
PutAsChar[b1]; PString[",,"L]; PutAsChar[b2];
END;
END
ELSE IF b2 IN [1..127] THEN
BEGIN AnotherVal[LengthAsChar[b2]]; PutAsChar[b2]; END;
IF n1 # 0 OR n3 # 0 THEN
BEGIN
chars: CARDINAL ← Log10[n4];
IF b1 # 0 THEN
BEGIN
IF n1 # 0 THEN chars ← chars + Log10[n1]+1;
chars ← chars + Log10[n2]+2;
END;
IF n3 # 0 THEN chars ← chars + Log10[n3]+1;
AnotherVal[chars];
IF b1 # 0 THEN
BEGIN
IF n1 # 0 THEN
BEGIN
PNumber[n1, [base: 10, zerofill: FALSE, unsigned: TRUE, columns: 0]];
PChar[':];
END;
PNumber[n2, [base: 10, zerofill: FALSE, unsigned: TRUE, columns: 0]];
PString[",,"L];
END;
IF n3 # 0 THEN
BEGIN
PNumber[n3, [base: 10, zerofill: FALSE, unsigned: TRUE, columns: 0]];
PChar[':];
END;
PNumber[n4, [base: 10, zerofill: FALSE, unsigned: TRUE, columns: 0]];
END;
IF gfi # 0 AND tag THEN
BEGIN
AnotherVal[7 + Log10[gfi] + Log10[entry]];
PString["pd["L];
PNumber[gfi, [base: 10, zerofill: FALSE, unsigned: TRUE, columns: 0]];
PChar[',];
PNumber[entry, [base: 10, zerofill: FALSE, unsigned: TRUE, columns: 0]];
PString[",1]"];
END;
IF b1 # 0 THEN
BEGIN
AnotherVal[5 + Log10[wd] + Log10[bd]];
PString["ba["L];
PNumber[wd, [base: 10, zerofill: FALSE, unsigned: TRUE, columns: 0]];
PChar[',];
PNumber[bd, [base: 10, zerofill: FALSE, unsigned: TRUE, columns: 0]];
PChar[']];
END;
END;
END;
SubStringForHash: PUBLIC PROCEDURE [
ss: String.SubString, hti: Symbols.HTIndex] =
BEGIN OPEN Symbols;
ht: POINTER TO ARRAY HTIndex OF HTRecord;
this, next: HTRecord;
ht ← TableBase[htType];
ss.base ← TableBase[ssType];
STCopyRead[to: @this, from: @ht[hti-1],
nwords: SIZE[HTRecord]];
STCopyRead[to: @next, from: @ht[hti],
nwords: SIZE[HTRecord]];
ss.offset ← this.ssIndex;
ss.length ← next.ssIndex - this.ssIndex;
END;
PutHashString: PUBLIC PROCEDURE [hti: Symbols.HTIndex] =
BEGIN OPEN Symbols;
desc: String.SubStringDescriptor;
IF hti = HTNull THEN
BEGIN PString["Anon"L]; RETURN END;
SubStringForHash[@desc, hti];
PSTSubString[@desc];
END;
PSTSubString: PUBLIC PROCEDURE [ss: String.SubString] =
BEGIN
i: CARDINAL;
s: PACKED ARRAY [0..1] OF CHARACTER;
p: POINTER ← @s;
len: CARDINAL ← MIN[ss.length, 50];
IF ss.offset MOD 2 # 0 THEN
p↑ ← STRead[@ss.base.text+ss.offset/2];
FOR i IN [ss.offset..ss.offset+len) DO
IF i MOD 2 = 0 THEN p↑ ← STRead[@ss.base.text+i/2];
PChar[s[i MOD 2]];
ENDLOOP;
IF ss.length > len THEN PString["..."L];
END;
PSTString: PUBLIC PROCEDURE [s: STRING] =
BEGIN
desc: String.SubStringDescriptor ← [base: s, offset: 0, length: NULL];
desc.length ← STRead[@s.length];
PSTSubString[@desc];
END;
END.