MODULE Trace;
IMPORT SYSTEM;
TYPE
CharProc*= PROCEDURE (c:CHAR);
VAR
Char*: CharProc;
Color*: PROCEDURE (c: SHORTINT);
PROCEDURE Send*(CONST buf: ARRAY OF CHAR; ofs, len: LONGINT; propagate: BOOLEAN; VAR res: LONGINT);
BEGIN INC (len, ofs); WHILE ofs # len DO Char (buf[ofs]); INC (ofs); END; res := 0;
END Send;
PROCEDURE Ln*;
BEGIN Char (0DX); Char (0AX);
END Ln;
PROCEDURE String* (CONST s: ARRAY OF CHAR);
VAR i: LONGINT;
BEGIN i := 0; WHILE (i< LEN(s)) & (s[i] # 0X) DO Char (s[i]); INC (i) END;
END String;
PROCEDURE StringLn* (CONST s: ARRAY OF CHAR);
BEGIN String (s); Ln;
END StringLn;
PROCEDURE Int* (x, w: LONGINT);
VAR i, x0: LONGINT; a: ARRAY 12 OF CHAR;
BEGIN
IF x < 0 THEN
IF x = MIN (LONGINT) THEN
DEC (w, 11);
WHILE w > 0 DO Char (' '); DEC (w) END;
String ("-2147483648");
RETURN
ELSE
DEC (w); x0 := -x
END
ELSE
x0 := x
END;
i := 0;
REPEAT
a[i] := CHR (x0 MOD 10 + 30H); x0 := x0 DIV 10; INC (i)
UNTIL x0 = 0;
WHILE w > i DO Char (' '); DEC (w) END;
IF x < 0 THEN Char ('-') END;
REPEAT DEC (i); Char (a[i]) UNTIL i = 0
END Int;
PROCEDURE Boolean* (x : BOOLEAN);
BEGIN IF x THEN String ("TRUE") ELSE String ("FALSE") END
END Boolean;
PROCEDURE IntSuffix* (x, w: LONGINT; CONST suffix: ARRAY OF CHAR);
CONST K = 1024; M = K*K; G = K*M;
VAR mult: CHAR;
BEGIN
IF x MOD K # 0 THEN
Int (x, w)
ELSE
IF x MOD M # 0 THEN mult := 'K'; x := x DIV K
ELSIF x MOD G # 0 THEN mult := 'M'; x := x DIV M
ELSE mult := 'G'; x := x DIV G
END;
Int (x, w-1); Char (mult)
END;
String (suffix)
END IntSuffix;
PROCEDURE Hex*(x: HUGEINT; w: LONGINT );
VAR i: LONGINT;
buf: ARRAY 2*SYSTEM.SIZEOF(HUGEINT)+2 OF CHAR;
neg: BOOLEAN;
c: HUGEINT;
BEGIN
IF w >= 0 THEN
i:= 0;
IF x < 0 THEN neg := TRUE; x :=-x ELSIF x=0 THEN buf := "0" ELSE neg := FALSE END;
i := 0;
REPEAT
c := x MOD 10H;
IF c < 10 THEN buf[i] := CHR(c+ORD("0")) ELSE buf[i] := CHR(c-10+ORD("A")) END;
x := x DIV 10H;
INC(i);
UNTIL (i = 2 * SYSTEM.SIZEOF(HUGEINT)) OR (x=0);
IF c > 9 THEN buf[i] := "0"; INC(i) END;
IF neg THEN buf[i] := "-"; INC(i) END;
WHILE(w > i) DO Char(" "); DEC(w); END;
REPEAT DEC(i); Char(buf[i]); UNTIL i=0;
ELSE
w := -w;
WHILE(w>2*SYSTEM.SIZEOF(HUGEINT)) DO
Char(" "); DEC(w);
END;
buf[w] := 0X;
REPEAT
DEC(w);
c := x MOD 10H;
IF c <10 THEN buf[w] := CHR(c+ORD("0")) ELSE buf[w] := CHR(c-10+ORD("A")) END;
x := x DIV 10H;
UNTIL w = 0;
String(buf);
END;
END Hex;
PROCEDURE Address* (x: SYSTEM.ADDRESS);
BEGIN
Hex(x,-2*SYSTEM.SIZEOF(SYSTEM.ADDRESS));
END Address;
PROCEDURE HIntHex* (x: HUGEINT; w: LONGINT);
BEGIN Hex (x, w);
END HIntHex;
PROCEDURE Memory* (adr: SYSTEM.ADDRESS; size: SYSTEM.SIZE);
VAR i, j: SYSTEM.ADDRESS; ch: CHAR;
BEGIN
size := adr+size-1;
FOR i := adr TO size BY 16 DO
Address (i); Char (' ');
FOR j := i TO i+15 DO
IF j <= size THEN
SYSTEM.GET (j, ch);
Char(' ');
Hex (ORD (ch), -2)
ELSE
Char (' ');
END
END;
Char (' ');
FOR j := i TO i+15 DO
IF j <= size THEN
SYSTEM.GET (j, ch);
IF (ch < ' ') OR (ch >= CHR (127)) THEN ch := '.' END;
Char (ch)
END
END;
Ln
END;
END Memory;
PROCEDURE Buffer* (CONST buf: ARRAY OF CHAR; ofs, len: LONGINT);
BEGIN Memory (SYSTEM.ADR (buf[ofs]), len)
END Buffer;
PROCEDURE Bits* (x: SET; ofs, n: LONGINT);
BEGIN
REPEAT
DEC (n);
IF (ofs+n) IN x THEN Char ('1') ELSE Char ('0') END
UNTIL n = 0
END Bits;
PROCEDURE Blue*;
BEGIN Color (9);
END Blue;
PROCEDURE Green*;
BEGIN Color (10);
END Green;
PROCEDURE Red*;
BEGIN Color (12);
END Red;
PROCEDURE Yellow*;
BEGIN Color (14);
END Yellow;
PROCEDURE Default*;
BEGIN Color (7);
END Default;
PROCEDURE NullChar(c: CHAR);
BEGIN
END NullChar;
PROCEDURE NullColor(c: SHORTINT);
BEGIN
END NullColor;
PROCEDURE Init*;
BEGIN
Char := NullChar;
Color := NullColor;
END Init;
(*
BEGIN
Char := NullChar;
Color := NullColor;
*)
END Trace.