-- XXDebugPC.mesa Edited by Bruce, October 14, 1980 10:52 AM
DIRECTORY
AltoDefs: FROM "altodefs",
DebugUsefulDefs: FROM "debugusefuldefs",
PrincOps: FROM "princops",
RESOut: FROM "resout",
STDebugDefs USING [showLinks],
StringDefs: FROM "stringdefs",
Symbols: FROM "symbols",
XXDebugDefs: FROM "xxdebugdefs";
XXDebugPC: PROGRAM
IMPORTS STDebugDefs, DebugUsefulDefs, RESOut, StringDefs, XXDebugDefs
EXPORTS XXDebugDefs =
BEGIN OPEN RESOut, XXDebugDefs;
-- defs copied from PCPack
ItemNull: Item = LAST[Item];
CacheLimit: CARDINAL =
(AltoDefs.PageSize/SIZE[ItemObject])*SIZE[ItemObject];
CacheBase: TYPE = BASE POINTER TO UNSPECIFIED;
Item: TYPE = CacheBase RELATIVE POINTER [0..256) TO ItemObject;
ItemObject: TYPE = RECORD [
link: Item,
ep: [0..128), -- EntryPoint,
gf: CARDINAL, -- GFHandle,
start, end: CARDINAL, -- BytePC,
hasSons: BOOLEAN,
inner: BOOLEAN,
dCbti: Symbols.CBTIndex,
userCbti: Symbols.CBTIndex];
PrintCacheItem: PUBLIC PROCEDURE [item: Item] =
BEGIN
cache: CacheBase = PCCache[];
io: ItemObject;
lastItemPrinted ← item;
DebugUsefulDefs.ShortCopyREAD[
to: @io, from: @cache[item], nwords: SIZE[ItemObject]];
PCr[];
PString["cache["L]; PUnsigned[LOOPHOLE[item]]; PString["] = gf: "L];
POctal[io.gf];
PNextOctal["ep"L, io.ep];
PNextOctal["start"L, io.start];
PNextOctal["end"L, io.end];
PNextUnsigned["dBti"L, io.dCbti];
PNextUnsigned["uBti"L, io.userCbti];
IF io.inner THEN PNext["inner"L];
IF io.hasSons THEN PNext["hasSons"L];
IF STDebugDefs.showLinks THEN PNextUnsigned["link"L, io.link];
END;
lastItemPrinted: Item ← ItemNull;
PrintNextCacheItem: PUBLIC PROCEDURE =
BEGIN
cache: CacheBase = PCCache[];
io: ItemObject;
IF lastItemPrinted = ItemNull THEN
{Complain["No valid previous"L]; ERROR cancelAction};
DebugUsefulDefs.ShortCopyREAD[
to: @io, from: @cache[lastItemPrinted], nwords: SIZE[ItemObject]];
PrintCacheItem[io.link];
END;
PrintPCCache: PUBLIC PROCEDURE =
BEGIN
item: Item ← PCHead[];
IF item = ItemNull THEN
{PCr[]; PString["PC Cache empty"]}
ELSE PrintCacheItem[item];
END;
-- generalized list chasing
nodeSizeString: PUBLIC STRING ← NIL;
nodeLinkString: PUBLIC STRING ← NIL;
ConvertStrings: PRIVATE PROCEDURE RETURNS [size, link: CARDINAL] =
BEGIN
problems: BOOLEAN ← FALSE;
size ← link ← 0;
BEGIN -- to set up badSize label
IF nodeSizeString = NIL THEN GO TO badSize;
size ← StringDefs.StringToNumber[nodeSizeString, 10 !
StringDefs.InvalidNumber => GO TO badSize];
IF size NOT IN [2..10] THEN GO TO badSize;
EXITS
badSize =>
BEGIN
problems ← TRUE;
Complain["set size IN [2..8] "L];
END;
END;
BEGIN -- to set up badSize label
IF nodeLinkString = NIL THEN GO TO badSize;
link ← StringDefs.StringToNumber[nodeLinkString, 10 !
StringDefs.InvalidNumber => GO TO badSize];
IF link NOT IN [0..size) THEN GO TO badSize;
EXITS
badSize =>
BEGIN
problems ← TRUE;
Complain["set link IN [0..size)"L, ~problems];
END;
END;
IF problems THEN ERROR cancelAction;
END;
lastNode: POINTER ← NIL;
PrintNextListNode: PUBLIC PROCEDURE =
BEGIN
node: ARRAY [0..8) OF POINTER;
size, link: CARDINAL;
[size: size, link: link] ← ConvertStrings[];
IF lastNode = NIL THEN
{Complain["No valid previous"L]; ERROR cancelAction};
DebugUsefulDefs.ShortCopyREAD[from: lastNode, to: BASE[node], nwords: size];
PrintListNode[node[link]];
END;
PrintListNode: PUBLIC PROCEDURE [p: POINTER] =
BEGIN
i: CARDINAL;
node: ARRAY [0..8) OF POINTER;
size: CARDINAL ← ConvertStrings[].size;
IF p = NIL THEN RETURN;
DebugUsefulDefs.ShortCopyREAD[from: p, to: BASE[node], nwords: size];
PCr[]; POctal[p]; PString["↑ = "L];
POctal[node[0]];
FOR i IN [1..size) DO
PNext[""L, Log8[LOOPHOLE[node[i]]]]; -- enough slop for probable B
POctal[node[i]];
ENDLOOP;
lastNode ← p;
END;
END.