@X @~
~V7 56 2 -5
~D10
~H                    MUSS
~
~
~D10
~H             MTL141
~D10
~MMANCHESTER UNIVERSITY  -  CONFIDENTIAL
~
~
                                                             ISSUE 11~
~V9 -1
~P
~V9 1
~YMTL141
~S~M~OMUTL IMPLEMENTATION DESCRIPTION
~S1~M~OSection 14 Version 1
~S1~OSection 14  High-Level Diagnostics
~S1~O1. General Description
~BThis module provides a set of procedures to debug a user program
and produce diagnostic information.
~S1~O2. Interfaces~
~
Other modules used:~
   Section 10:   (Runtime Diagnostic Primitives)~
~
MUTL Procedures:~
   TL.DUMP~
   TL.DEBUG~
~S1~O2.1 Hardware Interface
~BAny machine.
~S1~O2.2 Software Interface
~S1~O3. Implementation
~S1~O3.1 Outline of Operation
~BThe remaining procedures are used to print out local variables.
~S11) LOCALS()
~BThis procedure selects each variable in turn and calls an
appropriate procedure depending on its type configuration and dimension.
~S12) BASICARRAY()
~BThe current component of the current variable is printed out as an
array of basic type.
~S13) ELS()NO~
4) ELEMENTS(NO)~
~BProcedure ELS will determine the number of elements of an array to
be printed. The online user can ask for any number of elements.
The offline user is given the minimum of 100 elements of the dimension
of the array.
~BThe value returned, NO, is the parameter of ELEMENTS which prints
out the array.
~S15) FELS()PTR~
6) FIELDS(PTR)~
~BProcedure FELS will determine the fields of an aggregate type to
be printed out. The online user is given the choice of fields,
stored in the vector FLDS and the offine user is given all fields.
~BThe value returned, PTR, is the parameter of FIELDS. PTR=-1
indicates all fields are to be printed, otherwise PTR is the
pointer into FLDS of the required fields.
~S17) PRINT.PROC.LINE()
~BThis procedure prints out a line of information regarding the current
position under consideration of the user program.
~S1~O3.2 Data Structures
~S11) FLDS
~BThis vector contains information on the fields of aggregate types to
be printed out. The elements are of type AFE with fields:-~
~T# 8
   :A~Ialternative number~
   :F~Ifield number~
   :E~Inumber of elements if field is a vector.~
~Y
~V9 -1
~P
~D15
~HFLOWCHARTS
~
~
~H                MTL141
~V9 -1
~F
@TITLE MTL14/1(1,11)
@COL 1S-2R-3R-4F
@FLOW 1-2-3-4
@BOX 1.0
MODULE 14 IMPORTS
@BOX 2.0
LSPECS
@BOX 3.0
@BOX 4.0
@BOX 1.1
::MODULE 14 IMPORTS
@BOX 2.1
LSPEC RELEASE.SEGMENT($IN);
LSPEC OUTHEX($LO32,$IN);
LSPEC INBACKSPACE($IN);
LSPEC INI()/ADDR;
LSPEC OUTI($IN32,$IN);
LSPEC SPACES($IN);
LSPEC CAPTION(ADDR[$LO8]);
LSPEC OUTLINENO($IN32);
LSPEC PPC.CMD();
LSPEC ENTER.TRAP($IN,$IN);
LSPEC NEXTCH()/$IN;
LSPEC INCH()/$IN;
LSPEC OUTCH($IN);
LSPEC NEWLINES($IN);
@BOX 3.1
PSPEC TL.SET.TRAPS();
PSPEC TL.RESET.TRAPS();
PSPEC TL.NEXT.PROC($IN)/$IN;
PSPEC TL.YIELD.PROC()/$IN;
PSPEC TL.YIELD.LINE()/$IN32;
PSPEC TL.NEXT.VAR($IN)/$IN;
PSPEC TL.FIND.VAR(ADDR[$LO8])/$IN;
PSPEC TL.SEL.VAR($IN)/$IN;
PSPEC TL.SEL.FLD($IN)/$IN;
PSPEC TL.SEL.EL($IN)/$IN;
PSPEC TL.SEL.ALT($IN)/$IN;
PSPEC TL.UP();
PSPEC TL.YIELD.DIMENSION()/ADDR;
PSPEC TL.YIELD.VAR.REF()/ADDR;
PSPEC TL.YIELD.VEC.REF()/$LO64;
PSPEC TL.SEL.DYN.VAR(ADDR,$IN)/$IN;
PSPEC TL.SEL.DYN.VEC($LO64,$IN)/$IN;
PSPEC TL.PRINT.NAME($IN)/$IN;
PSPEC TL.PRINT.VALUE()/$IN;
PSPEC TL.YIELD.VALUE();
PSPEC TL.SET.VALUE($IN,ADDR);
PSPEC TL.GO($IN32);
PSPEC TL.INSERT.BREAKPOINT();
PSPEC TL.REMOVE.BREAKPOINT();
PSPEC TL.PRINT.PROFILE();
PSPEC TL.PRINT.S.TRACE();
PSPEC GET.NEXT.LINK(ADDR,$IN)/ADDR;
PSPEC TYPECONV($IN)/$IN;
PSPEC SHORTCUT()/$IN;
PSPEC VALIDATE()/$IN;
PSPEC RESTORE.LINE();
PSPEC INIT.10();
@BOX 4.1
$IN32 CUR.LT.PROC,CUR.LT.PAGE,CUR.LT.LINE,TR,RN,CUR.PCS,NB;
ADDR [$LO16] LT,PV;
IMPORT LITERAL NAMESHIFT, MURD.WORK.SEG;
$IN32 MODE,SCREEN,CUR.LINK,INCPC;
@END
@TITLE MTL14(1,6)
@COL 1S-2R-3F
@FLOW 1-2-3
@BOX 1.0
@BOX 2.0
CHART DECLARATIONS
@BOX 3.0
@BOX 1.1
#MTL14/1
MODULE(TL.DUMP,TL.DEBUG,PRINT.PROC.LINE);
@BOX 2.1
*GLOBAL 9;
$IN NEXTPTR;
TYPE AFE IS $IN A,F,E;
AFE [%40] FLDS;
*GLOBAL 0;
PSPEC TL.DEBUG();
PSPEC TL.DUMP();
PSPEC LOCALS();
PSPEC BASICARRAY($IN);
PSPEC ELS()/$IN;
PSPEC FELS()/$IN;
PSPEC ELEMENTS($IN);
PSPEC FIELDS($IN);
PSPEC PRINT.PROC.LINE();
#MTL14.9
#MTL14.8
#MTL14.2
#MTL14.5
#MTL14.3
#MTL14.4
#MTL14.6
#MTL14.7
#MTL14.1
@BOX 3.1
*END
**IN -1
@END

@TITLE MTL14.1(1,7)
@COL 1S-3R-5R-7R-11T-6F
@FLOW 1-3-5-7-11N-6
@FLOW 11Y-3
@BOX 1.0
PROC TL.DUMP
@BOX 3.0
PRINT PROC NAME AND ADDRESS
@BOX 5.0
PRINT LOCAL VARS
@BOX 6.0
END
@BOX 7.0
CHANGE OF SEGMENT-
PRINT OUT GLOBALS
@BOX 11.0
NEXT DYNAMIC PROC EXIST?
@BOX 1.1
PROC TL.DUMP;
@BOX 3.1
PRINT.PROC.LINE();
@BOX 5.1
LOCALS();
@BOX 6.1
CAPTION(%"$LEND OF DIAGNOSTICS DUMP$L");
END;
@BOX 7.1
IF GETNEXTLINK(NB,1) ->>16 /= CUR.PCS THEN
IF TLNEXTPROC(1) /= -1 THEN
CAPTION(%"$LGLOBALS ");
LOCALS() FI FI;
@BOX 11.1
IF TL.NEXT.PROC(0) /= -1,
@END

@TITLE MTL14.2(1,6)
@COL 1S-2T-3T-5R-6R-11T-7R-8F
@COL 9R-10R
@ROW 3-9
@ROW 5-10
@FLOW 1-2N-3N-5-6-11N-7-8
@FLOW 11Y-8
@FLOW 2Y-10-11
@FLOW 3Y-9-10
@BOX 1.0
PROC BASICARRAY
@BOX 2.0
HOW MANY ELEMENTS?
@BOX 3.0
OFFLINE?
@BOX 5.0
PRINT OUT NAME,SIZE.
ASK HOW MANY ELEMENTS
@BOX 6.0
READ IN NO OF ELEMENTS
AND STORE
@BOX 7.0
PRINT OUT REQUIRED
ELEMENTS OF ARRAY
@BOX 8.0
END
@BOX 9.0
ALL ELEMENTS WILL
BE PRINTED
@BOX 10.0
OUTPUT HEADER
@BOX 11.0
NONE WANTED?
@BOX 1.1
PROC BASICARRAY(NO);
$IN N,I,DIM,WIDTH,ACROSS;
@BOX 2.1
IF NO => N >= 0,
@BOX 3.1
IF MODE = 0,
@BOX 5.1
NEWLINES(0);
TL.PRINT.NAME(0);
OUTCH(%5B);
OUTI(TL.YIELD.DIMENSION() => DIM,0);
CAPTION(%"] HOW MANY ELEMENTS REQUIRED?");
@BOX 6.1
INI() => N;
IF N > DIM THEN DIM => N FI;
@BOX 7.1
NEWLINES(0);
TL.SEL.EL(0);
TL.PRINT.VALUE() + 2 /: SCREEN => ACROSS;
1 => WIDTH;
SPACES(2);
FOR N-1 DO
TL.SEL.EL(-1);
1 +> WIDTH;
IF WIDTH > ACROSS THEN
1 => WIDTH;
NEWLINES(0) FI;
TL.PRINT.VALUE();
SPACES(2) OD;
TL.UP();
@BOX 8.1
END;
@BOX 9.1
IF TL.YIELD.DIMENSION() => N > 100
THEN 100 => N FI;
@BOX 10.1
NEWLINES(0);
TL.PRINT.NAME(0);
CAPTION(%"[0->");
OUT.I(N-1,0);
OUT.CH(%5D);
@BOX 11.1
IF N = 0,
@END

@TITLE MTL14.3(1,6)
@COL 10R
@COL 1S-2R-9T-4R-5R-6R-7R-8F
@ROW 10-6
@FLOW 1-2-9N-4-5-6-7-8
@FLOW 9Y-10-7
@BOX 1.0
PROC ELS()NO
@BOX 2.0
INITIALISATION
@BOX 4.0
PRINT OUT <NAME>[<SIZE>]
@BOX 5.0
ASK HOW MANY ELEMENTS
@BOX 6.0
INPUT ANSWER TO NO
@BOX 7.0
CALL ELEMENTS(NO)
@BOX 8.0
END
@BOX 9.0
OFFLINE?
@BOX 10.0
ALL ELEMENTS WILL BE PRINTED OUT
@BOX 1.1
PROC ELS;
@BOX 2.1
$IN DIM,NO;
@BOX 4.1
NEWLINES(0);
TL.PRINT.NAME(0);
OUTCH(%5B);
OUTI(TL.YIELD.DIMENSION() => DIM,0);
@BOX 5.1
CAPTION(%"] HOW MANY ELEMENTS?");
@BOX 6.1
WHILE INCH() /= %A DO OD;
INI() => NO;
IF NO > DIM THEN
DIM => NO FI;
@BOX 7.1
IF SHORTCUT() => DIM < NO THEN
DIM => NO FI;
ELEMENTS(NO);
NO => ELS;
@BOX 8.1
END;
@BOX 9.1
IF MODE = 0,
@BOX 10.1
IF TL.YIELD.DIMENSION() => NO > 100
THEN 100 => NO FI;
@END

@TITLE MTL14.4(1,6)
@COL 1S-2R-14T-4R-5R-6T-7R-8T-9R
@COL 15N-10R-11R-12R-13F
@ROW 7-10
@ROW 9-11
@FLOW 1-2-14N-4-5-6N-7-8N-9-8Y-11-12-13
@FLOW 14Y-10
@FLOW 6Y-10-12
@BOX 1.0
PROC FELS()PTR
@BOX 2.0
INITIALISATION
@BOX 4.0
PRINT OUT ALL FIELDS,
NUMBERED <ALT>.<FLD>
@BOX 5.0
ASK FOR FIELDS REQUIRED
@BOX 6.0
ALL?
@BOX 7.0
SET NEXTPTR TO NO
@BOX 8.0
NEXT CHAR TERMINATOR?
@BOX 9.0
READ IN <ALT>.<FLD>
@BOX 10.0
SET -1 IN NO
@BOX 11.0
PUT TERMINATOR IN FLDS
@BOX 12.0
CALL FIELDS(NO)
@BOX 13.0
END
@BOX 14.0
OFFLINE?
@BOX 1.1
PROC FELS;
@BOX 2.1
$IN COL,I,J,CH,NO;
@BOX 4.1
NEWLINES(0);
-1 => I;
WHILE TL.SEL.ALT(1+>I)=> CH /= -1 DO
0 => J => COL;
CAPTION(%"$LFIELDS");
6 => COL;
BEG:SPACES(1);
OUTI(I,0);
OUTCH(%2E);
OUTI(J,0);
SPACES(1);
TL.PRINT.NAME(0) + 5 +> COL;
IF CH < 0 THEN
OUTCH('[);
OUTI(TL.YIELD.DIMENSION(),0);
OUTCH(']);
5 +> COL FI;
IF COL + 20 > SCREEN THEN
NEWLINES(0=>COL) FI ;
1 +> J;
IF TL.SEL.FLD(-1) => CH /= -1 AND CH /= -2,->BEG;
TL.UP() OD;
@BOX 5.1
WHILE INCH() /= %A DO OD;
CAPTION(%"$LTYPE <ALT>.<FLD>{.<ELS>} FOR EACH FIELD REQ.,");
CAPTION(%"TERMINATED BY *,OR @ FOR ALL");
WHILE NEXTCH()=>CH = %A OR CH = %20 DO INCH() OD;
@BOX 6.1
IF INCH() = %40,
@BOX 7.1
IN.BACKSPACE(1);
NEXTPTR + 1 => NO;
@BOX 8.1
IF NEXTCH() = %2A,
@BOX 9.1
SELECT FLDS[1 +> NEXTPTR];
INI() => A;
INCH();
INI() => F;
IF NEXTCH() = '. THEN
INCH();
INI() => E FI;
WHILE NEXTCH() < %2A DO INCH() OD;
@BOX 10.1
-1 => NO;
@BOX 11.1
INCH();
BEGIN;
SELECT FLDS[1 +> NEXTPTR];
-1 => A => F;
END;
@BOX 12.1
FIELDS(NO);
NO => FELS;
@BOX 13.1
END;
@BOX 14.1
IF MODE = 0,
@END


@TITLE MTL14.5(1,6)
@COL 6R
@COL 1S-2R-3T-4T-5T-7R-11R
@COL 12F-8T-9R
@COL 10R
@ROW 3-12
@ROW 5-8
@ROW 6-7-9-10
@FLOW 1-2-3N-4N-5N-7-11-3
@FLOW 3Y-12
@FLOW 4Y-8N-9-11
@FLOW 5Y-6-3
@FLOW 8Y-10-11
@BOX 1.0
PROC LOCALS
@BOX 2.0
DECLARATIONS
@BOX 3.0
END OF PROC?
@BOX 4.0
VAR VECTOR?
@BOX 5.0
BASIC TYPE?
@BOX 6.0
BASIC SCALAR
@BOX 7.0
TYPED SCALAR
@BOX 8.0
TYPED ARRAY?
@BOX 9.0
BASIC ARRAY
@BOX 10.0
TYPED ARRAY
@BOX 11.0
RESET PAGE WIDTH PTR
@BOX 12.0
END
@BOX 1.1
PROC LOCALS;
@BOX 2.1
$IN32 VTYPE;
$IN WIDTH,COL,VAR,ACROSS,T,V;
NEWLINES(0 => WIDTH);
-1 => VAR => NEXTPTR;
IF SCREEN = 120 THEN
3 => ACROSS ELSE
2 => ACROSS FI;
@BOX 3.1
NEW:IF TL.NEXT.VAR(VAR) => VAR = -1,
@BOX 4.1
0 => V;
TL.SEL.VAR(VAR) => VTYPE;
IF VALIDATE() < 0 ,-> NEW;
IF VTYPE < 0,
@BOX 5.1
GO:IF VTYPE&3=>T /= 0 OR VTYPE & %4000 =0,
@BOX 6.1
TL.PRINT.NAME(0) => COL;
OUTCH(%3D);
TL.PRINT.VALUE() + 1 +> COL;
SPACES(30-COL);
1 +> WIDTH;
IF WIDTH >= ACROSS THEN
0 => WIDTH;
NEWLINES(0);
FI;
IF V = 0 THEN
1 => V;
IF T=1 THEN
TL.SEL.DYN.VAR(TL.YIELD.VAR.REF(),VTYPE) => VTYPE;
IF VALIDATE() < 0 THEN -> NEW
ELSE -> GO FI;
FI;
IF T=3 THEN
TL.SEL.DYN.VEC(TL.YIELD.VEC.REF(),VTYPE);
IF VALIDATE() < 0 THEN -> NEW
ELSE
ELS() FI FI;
FI;
@BOX 7.1
NEWLINES(0);
TL.PRINT.NAME(0);
FELS();
@BOX 8.1
IF TYPECONV(VTYPE) <0,
@BOX 9.1
NEWLINES(1);
IF SHORTCUT() => T > 0 THEN
BASICARRAY(T);
ELSE TL.PRINT.NAME(0);
CAPTION(%" EMPTY");
FI;
@BOX 10.1
IF MODE = 0 THEN
NEWLINES(1);
TL.PRINT.NAME(0);
CAPTION(%"[0->");
OUTI(TL.YIELD.DIMENSION()-1,0);
CAPTION(%"]$L");
FI;
ELS();
@BOX 11.1
NEWLINES(0 => WIDTH);
@BOX 12.1
END;
@END

@TITLE MTL14.6(1,6)
@COL 1S-2R-13T-5T-8R-9T-12R-11F
@COL 7R
@ROW 8-7
@FLOW 1-2-13N-5N-8-9N-12-11
@FLOW 13Y-11
@FLOW 5Y-7-12
@FLOW 9Y-5
@BOX 1.0
PROC ELEMENTS
@BOX 2.0
INITIALISATION
@BOX 5.0
SELECT ELEMENT
BASIC TYPE?
@BOX 7.0
PRINT BASIC ARRAY
@BOX 8.0
PRINT OUT <NAME>[<EL>]
CALL FELS() FOR FIRST ELEMENT,
FIELDS(N) FOR REMAINDER
@BOX 9.0
MORE ELEMENTS?
@BOX 11.0
END
@BOX 12.0
GO BACK TO ARRAY LEVEL
@BOX 13.0
NONE WANTED?
@BOX 1.1
PROC ELEMENTS(NO);
@BOX 2.1
$IN COL,WIDTH,ACROSS,CURRENT,N,I;
$IN32 ETYPE;
IF TL.YIELD.DIMENSION() => I < NO OR NO < 0
THEN I => NO FI;
NEWLINES(0 => CURRENT);
@BOX 5.1
IF TL.SEL.EL(CURRENT) => ETYPE & %4000 =0,
@BOX 7.1
TL.UP();
BASICARRAY(NO);
@BOX 8.1
NEWLINES(0);
TL.PRINT.NAME(0);
OUTCH(%5B);
OUTI(CURRENT,0);
CAPTION(%"]:$L");
IF CURRENT = 0 THEN
FELS() => N ELSE
FIELDS(N) FI;
@BOX 9.1
TL.UP();
IF 1 +> CURRENT < NO,
@BOX 11.1
END;
@BOX 12.1
@BOX 13.1
IF NO = 0,
@END


@TITLE MTL14.7(1,6)
@COL 1S-2R-5T-7T-8R-24T-15T-9T-10R-22R
@COL 11R
@COL 12R-17T-18R-20T-21T-23R-13F
@COL 19R
@ROW 18-19
@ROW 7-12
@ROW 10-11
@ROW 22-23
@FLOW 1-2-5N-7N-8-24N-15N-9N-10-22-7
@FLOW 5Y-12-17N-18-20N-21N-23-13
@FLOW 21Y-12
@FLOW 17Y-19-20Y-17
@FLOW 15Y-7
@FLOW 24Y-7
@FLOW 7Y-13
@FLOW 9Y-11-22
@BOX 1.0
PROC FIELDS
@BOX 2.0
INITIALISATION
@BOX 5.0
EVERYTHING WANTED?
@BOX 7.0
TERMINATOR?
@BOX 8.0
READ IN ALT.FIELD
@BOX 9.0
ARRAY?
@BOX 10.0
PRINT OUT <NAME>=<VALUE>
@BOX 11.0
CALL ELEMENTS
@BOX 12.0
SELECT ALTERNATIVE
@BOX 13.0
END
@BOX 15.0
FIELD NOT EXIST?
@BOX 17.0
ARRAY?
@BOX 18.0
PRINT OUT <NAME>=<VALUE>
@BOX 19.0
CALL ELEMNTS
@BOX 20.0
NEXT FIELD EXIST?
@BOX 21.0
NEXT ALTERNATIVE EXIST?
@BOX 22.0
GO BACK UP A LEVEL
@BOX 23.0
GO BACK UP A LEVEL
@BOX 24.0
ALTERNATIVE NOT EXIST?
@BOX 1.1
PROC FIELDS(PTR);
@BOX 2.1
$IN32 AFTYPE;
$IN COL,N,ALT;
NEWLINES(0=>ALT);
@BOX 5.1
IF PTR = -1,
@BOX 7.1
IF A OF FLDS[PTR] = -1,
@BOX 8.1
SELECT FLDS[PTR];
1 +> PTR;
@BOX 9.1
IF AFTYPE < 0,
@BOX 10.1
TL.PRINT.NAME(0) +> COL;
IF AFTYPE&%4000 =0 OR AFTYPE&3/=0 THEN
OUTCH('=);
TL.PRINT.VALUE() + 3 +> COL;
SPACES(2);
IF COL + 20 > SCREEN THEN
NEWLINES(0=>COL) FI;
ELSE FIELDS(-1) FI;
@BOX 11.1
ELEMENTS(E);
@BOX 12.1
TL.SEL.ALT(ALT) => AFTYPE;
-1 => ALT;
NEWLINES(0=>COL);
@BOX 13.1
END;
@BOX 15.1
IF F > 0 THEN
TL.SEL.FLD(0-F) => AFTYPE FI;
IF AFTYPE = -1 OR AFTYPE = -2,
@BOX 17.1
IF AFTYPE < 0,
@BOX 18.1
TL.PRINT.NAME(0) +> COL;
IF AFTYPE&%4000 =0 OR AFTYPE&3/=0 THEN
OUTCH('=);
TL.PRINT.VALUE() + 3 +> COL;
SPACES(2);
IF COL + 20 > SCREEN THEN
NEWLINES(0=>COL) FI;
ELSE FIELDS(-1) FI;
@BOX 19.1
ELEMENTS(-1);
@BOX 20.1
IF TL.SEL.FLD(-1) => AFTYPE /= -1
AND AFTYPE /= -2,
@BOX 21.1
IF AFTYPE = -2,
@BOX 22.1
TL.UP();
@BOX 23.1
TL.UP();
NEWLINES(0);
@BOX 24.1
IF TL.SEL.ALT(A) => AFTYPE = -1,
@END

@TITLE MTL14.8(1,12)
@COL 4R-5R-6R-17R-18R
@COL 1S-2R-3C-7R-8R-12R-16R-19R-13F
@COL 9R-10R-11R-14R-15R
@ROW 4-7-9
@FLOW 1-2-3
@BOX 1.0
PROC TL.DEBUG
@BOX 2.0
DECLARATIONS
@BOX 3.0
SWITCH ACCORDING TO INPUT
@BOX 4.0
PRINT OUT LOCAL VARS
@BOX 5.0
NEXT PROC DYNAMIC CHAIN
@BOX 6.0
BACK TO FAILURE PROC
@BOX 7.0
TL.DUMP
@BOX 8.0
RESTART PROGRAM
@BOX 9.0
QUIT DIAGNOSTICS
@BOX 10.0
CHANGE VARS
@BOX 11.0
MUSS COMMAND
@BOX 12.0
IGNORE
@BOX 13.0
END
@BOX 14.0
INSERT BREAKPOINT
@BOX 15.0
REMOVE BREAKPOINT
@BOX 16.0
PROFILE/TRACE
@BOX 17.0
NEXT PROC IN
STATIC CHAIN
@BOX 18.0
HELP - NOT FOR USER
@BOX 19.1
HELP-LIST COMMANDS
@BOX 1.1
PROC TL.DEBUG;
@BOX 2.1
$IN CH,J;
DATAVEC CHS ($LO8)
"ANCDGQVIRPESHF*"
END;
@BOX 3.1
IN.BACKSPACE(1);
I:WHILE NEXTCH()/=%A DO INCH() OD;
S:IF NEXTCH()=%A THEN
CAPTION(%"$LDebug command?") FI;
WHILE NEXTCH() => CH = %A OR CH = %20
DO INCH() OD;
INCH() => CH;
-1 => J;
WHILE 1 +> J < 15 AND CHS[J] /= CH DO OD;
SWITCH J\
A,N,C,D,G,Q,V,IB,RB,P,E,ST,H,F,AST,I;
@BOX 4.1
A:LOCALS();
-> S;
@BOX 5.1
N:IF TL.NEXT.PROC(0)  = -1 THEN
CAPTION(%"$LPROC NON-EXISTENT ");
ELSE
PRINT.PROC.LINE();
FI;
-> S;
@BOX 6.1
C:TL.NEXT.PROC(-1);
PRINT.PROC.LINE();
-> S;
@BOX 7.1
D:0 => MODE;
TL.DUMP();
1 => MODE;
-> S;
@BOX 8.1
G:IF INI() => J >0 AND NEXTCH()='. THEN
INCH();
J<<-16 + INI() => J FI;
TL.GO(J);
-> S;
@BOX 9.1
Q: RELEASE.SEGMENT(MURD.WORK.SEG);
ENTER.TRAP(TR,RN);
@BOX 10.1
V:TL.YIELD.VALUE();
->S;
@BOX 11.1
AST:IF INCH() = '* THEN
PPCCMD() FI;
-> S;
@BOX 12.1
@BOX 13.1
E:RESTORE.LINE();
TL.SET.TRAPS();
END;
@BOX 14.1
IB:TL.INSERT.BREAKPOINT();
-> S;
@BOX 15.1
RB:TL.REMOVE.BREAKPOINT();
-> S;
@BOX 16.1
P:TL.PRINT.PROFILE();
TL.PRINT.S.TRACE();
->S;
@BOX 17.1
ST:IF TL.NEXT.PROC(1)=-1 THEN
CAPTION(%"$LNO SURROUNDING BLOCK ");
ELSE
PRINT.PROC.LINE() FI;
->S;
@BOX 18.1
F:CAPTION(%"$LCUR.LT.PAGE,LINE,PROC ");
OUTHEX(CUR.LT.PAGE,8);
SPACES(2);
OUTHEX(CUR.LT.LINE,8);
SPACES(2);
OUTHEX(CUR.LT.PROC,8);
CAPTION(%"$LPROC ENTRY IN PV ");
OUTHEX(LT^[CUR.LT.PROC+1],8);
->S;
@BOX 19.1
H:CAPTION(%"$LQ Quit$LC Current procedure");
CAPTION(%"$LN Next procedure$LS Surrounding block");
CAPTION(%"$LA All local vars$LD Diagnostics dump");
CAPTION(%"$LP Profiles$LV Variable");
CAPTION(%"$LG <n> Go$LE End breakpoint");
CAPTION(%"$LI <n> Insert breakpoint$LR <n> Remove breakpoint");
CAPTION(%"$L** MUSS command");
->S;
@END
@TITLE MTL14.9(1,10)
@COL 1S-2R-3F
@FLOW 1-2-3
@BOX 1.0
PROC PRINT.PROC.LINE
@BOX 2.0
PRINT LINE OF PROC INFORMATION
@BOX 3.0
END
@BOX 1.1
PROC PRINT.PROC.LINE;
@BOX 2.1
CAPTION(%"$LIn Proc or block ");
TLPRINT.NAME(TL.YIELD.PROC());
CAPTION(%" at or after line ");
OUTLINENO(TL.YIELD.LINE());
CAPTION(%"{PC ");
OUTHEX(GET.NEXT.LINK(CUR.LINK,1),8);
CAPTION(%" FP ");
OUTHEX(CUR.LINK->>NAMESHIFT,8);
OUTCH('});
@BOX 3.1
END
@END


