@X @~
~V7 56 2 -5
~V9 -1
~D10
~H                       MUSS
~
~
~H          VOLUME     19
~D 10
~M~OSOURCE LANGUAGE DEBUGGER
~
~
This volume contains the implementation of the MUSS source language
debugger.  The reader is recommended to read the description of the
user interface of the source language debugger in the MUSS user manual.~
~
~
~
~
~MUNIVERSITY OF MANCHESTER
~V9 -1
~P
~D10
~S~MCONTENTS
~T# 10
~
~
~
#DEB011  -  Debugger Command Processor~
~
#DEB021  -  Lexical and Syntax Analyser~
~
#DEB081  -  Terminal Driver~
~
#DEB091  -  Fault Monitor~
~V9 -1
~P
~D10
~H                    MUSS
~
~
~D10
~H             DEB011
~D10
~MMANCHESTER UNIVERSITY  -  CONFIDENTIAL
~
~
                                                            ISSUE 11~
~V9 -1
~P
~V9 1
~YDEB011
~S~M~ODEB IMPLEMENTATION DESCRIPTION
~S~M~OSection 1 Version 1
~S~OSection 1.1 Debugger Command Processor
~S~O1. General Description
~BThis section implements the library procedure INIT.DEBUG which
activates the source language debugger; and DEBUG which is the
debugger command processor.
~BWhile the Debugger is being implemented, extensions to other
components of MUSS that are required but not yet in the current
MUSS system are described below.
~S11) Extension to Basic Library LIB03
~BPPC.SEQ to be modified to have 2 parameters.~
~
~MPPC.SEQ (MODE,PROCEDURE)
~
MODE extended to allow PPC.SEQ to execute a single command and then
return control to caller.  New parameter PROCEDURE to enable debugger
to set traps to debugger trap handler.
~BExtention permits debugging of library procedures.
~S12) Extension of Basic Library LIB04
~BAdd new procedure I.PROMPT() [PROMPT].  This procedure returns
the 'prompt message' for the current input stream.
~BExtension needed so that debugger can reset after a breakpoint.
~S~O2. Interfaces
~
Other Modules Used:~
   Section 2  (Hexical and Syntax Analyser)~
   Section 9  (Fault Monitor)~
~
Library Procedures:~
   INIT.DEBUG~
   DEBUG~
~
Interface Data Structures:~
   CMD.FLT.LB~
   F.LINE~
   PAR.NAME~
   PAR.INT~
   PAR.REAL~
   F.SOURCE~
~S11) INIT.DEBUG
~BThis procedure activates the debugger and its specification
is given in the Source Language Debugger description in Chapter
7 of the MUSS User Manual.
~S12) DEBUG
~BThis procedure processes debugger commands and its specification
is given in the Source Language Debugger description in Chapter 7
of the MUSS User Manual.
~S13) CMD.FLT.LB
~BLabel variable containing address within DEBUG.CMDS to which
control is returned from the fault monitor to process next
debug command.
~S14) F.ITEM
~BThis variable contains a bounded pointer to itemised line.
~S15) F.SOURCE
~BThis variable contains a bounded pointer to source line.
~S16) PAR.NAME, PAR.REAL, PAR.INT
~BThese vectors contain the parameters of the debug commands that are not
suitable for storage in the analysis record itself.
~S~O3. Implementation
~S~OInternal Procedures
~
~
~
~G1. FORM.SL(INDEX)VA~G
~BThis procedure forms an absolute source line from an analysis
record description and returns the corresponding virtual address.
P1 is an index to the relevant portion of the analysis record, AS.
If the result is zero, the source line is invalid.
~
~
~
~G2. FORM.SP(INDEX,START,LIMIT,LIB.ID,PROC.ID)~G
~BThis procedure forms a source procedure from an analysis
record description and returns the virtual address of the
start and finish of the procedure.  P1 is an index to the relevant
portion of the analysis record, AS.  P2 is the address of the start of
the procedure and P3 is the address of the end of the procedure.  If
P2 is zero the source procedure is invalid.P3 and P4 are variales where the libr
ary and procedure
identifiers respectively are returned.

~
~
~
~G3. OUT.POS(TYP,LOC)~G
~BThis procedure prints out a message stating that a trap
has occurred.  P1 is the breakpoint type and has the same
encoding as the field B.TYP of BPT.TBL.  It affects the
particular form of the message.  P2 is the location at which
the trap occurred.
~
~
~
~G4. OUT.ACT(ACTION,ENTRY)~G
~BThis procedure prints the details of an action which is
active at the current breakpoint.  P1 is the action currently
under scrutiny, and has the same encoding as B.ACT of BPT.TBL.
P2 is an index into BPT.TBL to the entry corresponding to the
current breakpoint.
~
~
~
~G5. OUT.CODE(KIND,VA)~G
~BThis procedure outputs a portion of code, text or both about
a location specified by P2.  P1 has the following significance:~
~T# 10 13 16
~
#0#-#code~
#1#-#text~
#2#-#both~
~
~
~
~G6. FIND.ENTRY()INDEX~G
~BThis procedure finds a free entry in TRAP.VEC and returns an index to it.
~
~
~
~67. INIT.DATA (NAME,TYPE,DIMENSION,LOCATION)~G
~BThis procedure initialises the variable stack VAR.STACK.P1 is a bounded
pointer to the symbolic name of the variable with which the stack is to be
initialised and P2 is its encoded type.P3 is the size in bytes for an aggregate
type or the number of elements for a vector.Finally P4 is the virtual address
of the variable.
~
~
~
~G8. FIND.COMP (NAME,TYPE,ELEMENT,LOCATION)~G
~BThis procedure returns information about the next basic type component in
a variable after the variable has been initialised using INIT.DATA.P1 is
the address of a byte vector where the symbolic name of the field is to
be returned.P2 is a variable where the encoded type information is requireturned
.
P3 is a variable where the element number is returned for a vector and
finally, P4 is were the virtual address of the component is returned.
~
~
~
~G9. SEL.FLD (FIELD)~G
~BThis procedure sets the variable stack to a field within the variable
with which the stack was last initialised using INIT.DATA.In this way,
the basic components of a sub-field of a aggregate type may be examined.
P1 is a bounded pointer to the field name.
~
~
~
~G10. SEL.ELT (ELEMENT)~G
~BThis procedure performs the same function as 10) for an alement.P1 is the
element number.
~
~
~
~G11. SEL.PTR()~G
~BThis procedure re-initialises the variable stack to the variable pointed
to by the current top-of-stack.
~
~
~
~G12. OUT.DATA (KIND)~G
~BThis procedure prints out the information about each of the basic components
of the variable at the top of the variable stack.If P1 = 1 then the value of
each component may be altered.Otherwise the variable may be examined only.
This procedure refers to the command options contained in CMD.OPT for the
required format in which the informaion is printed.
~
~
~
~G13. PROCESS.OPTIONS (INDEX)~G
~BThis procedure sets each field in CMD.OPT either to the option specified
in the command itself if present, or to the default value contained in
DEF.OPT.P1 is an index into the analysis record of the start of the option
description.
~
~
~
~G14. GET.FID(LID,PID)FID~G
~BThis procedure obtains the frame identifier of a procedure.P1 and P" are the
library and procedure identifieres respectively.If the procedure is not ative
the zero is returned.
~G15. SELECT.DATA (^DATA.NAME)~G
~BThis procedure selects the required component of a variable by calling
SEL.FLD, SEL.ELT and SEL.PTR appropriately.P1 is an index to the portion
of the analysis record which describes the component.~
~
~
~
~G16. SET.WATCH (BREAK.NO, ^DATA.NAME)~G
~BThis procedure establishes a watchpoint.P1 is the number of the breakpoint
which it belongs to, and P2 is an index to the portion of the analysis
record which describes the component to be watched.~
~
~
~
~G17. RESET.WATCH (BREAK.NO)~G
~BThis procedure cancels a watchpoint.P1 is the number of the breakpoint
to which the watchpoint belongs.~
~
~
~
~G18. SET.FORMAT.DATA (KIND, INDEX)~G
~BThis procedure seys the format data option in DEF.OPT if P1 = 0 or
otherwise in CMD.OPT.P2 is an index into the analysis record to the
portion descibing the data formats required.~
~
~
~
~G19. NEXT.PROC (KIND, FID, PROC.SPEC)~G
~BThis fins the next procedure.If P1 = 1 then the next procedure in the dynamic
chain is sought and if P1 = 2 the next procedure in the static
chain is sought.P2 is the frame identifier of the "current" procedure.P3
is a pointer to a variable of type PROC.SPEC where the information
about the next procedure is returned.~
~
~
~
~S~O3.1 Outline of Operation
~S~O3.2 Data Structures
~S11. BPT.TBL
~BThis is a vector of 17 entries of type BPT.ENTRY.  It contains
information about all breakpoints currently set.  It consists of
the following fields:~
~T# 9 12
~
B.TYP#-~Ibreakpoint type.  The values have the following meanings:~
~T# 16 20
~
#0~Ientry not occupied~
#1~Isource line~
#2~Isource procedure~
#3~Ivirtual address~
#4~Iafter~
#5~Iprocedure~
#6~Icode~
#7~Itext~
#8~Ibox~
~T# 9 12
~
B.TR#-~IIndex to an element of TRAP.VEC representing the head of a list of
traps.~
~
B.ACT#-~IBit significant field indicating which actions are present.~
~T# 12 16 20
~
#Bit#0~Iwait~
##1~Iwatchpoint~
##2~Itrace~
##3~Iprofile~
##4~Icode~
##5~Itext~
##6~Icode + text~
##7~Iinsert~
##8~Ibreak~
~T# 9 12
~
B.DOC#-~IDocument name for a break action.~
~
B.DID#-~Idata identifier for a watchpoint.~
~
B.DOLD#-~Iindex into WATCH.SPACE for old value of watchpoint.~
~
B.DLOC#-~Iaddress of watchpoint variable.~
~
B.DLEN#-~Ilength in bytes of variable being watched.~
~
B.INS#-~Iinsert name.~
~
B.WAIT#-~Inumber of times breakpoint should be passed before
actions take effect.~
~S12. TRAP.VEC
~BThis is a vector of 200 elements of type TRAP.ENTRY.  Each entry
contains information about a trap in the user program, and consists
of the following fields:~
~T# 11 14
~
TR.ADDR#-~Ilocation of the trap.~
~
TR.IDENT#-~Iinternal trap identifier.~
~
TR.EXEC#-~Ino. of times trap has been executed.If -1 entry unoccupied.~
~
TR.NEXT#-~Iindex into TRAP.VEC of the next trap in the chain or -1
for the end of the chain.~
~S13. TIMER
~BThe number of milliseconds after which the program is to be interrupted.
If zero, no local timer is activated.
~S14. CMD.OPT and DEF.OPT
~BThese data structures represent the options local to a command and the
debugger default options respectively.They are of type opt and contain
the fields:~
~
O.SC#-~IScope for property searches~
~I0 - search only in specified procedure~
~I1 - search in specified procedure and all procedures in the dynamic chain~
~I2 - search in specified procedure and all procedures in the static chain~
~
O.LID#-~ILibrary identifier of search procedure~
~
O.PID#-~IProcedure identifier of specified procedure~
~
O.TY#-~IFormat type~
~
O.TR#-~ITrace option~
~
O.BR#-~IBreak option~
~
O.PF#-~IProfile option~
~
O.SP#-~IStep option~
~
O.VEC#-~INumber of elements printed for vectors~
~
O.TX#-~IVector containing base source address~
~
O.FORMAT#-~IVector containing format information~
~S15) VAR.STACK
~BThis is a vector of elements of type VAR.STK.ENTRY.Each element represents one
component in a level in the hierarchy of a variable.It is used for 'working thro
ugh
a variable.The fields are as follows:~
~
VS.NAME#-~IVariable or field name~
~
VS.ADDR#-~IVirtual address~
~
VS.ENC#-~IEncoded type information~
~
VS.TYPE#-~IType name~
~
VS.DIM#-~INumber of elements for a vector or size in bytes for an aggregate type
~
~
VS.ELT#-~ICurrent element for a vector~
~
VS.FLD#-~IAn integer representing the current sub-field~
~S~O3.3 Special Notes
~S~O4. Job Streams
~BThis section contains job streams for the following:~
~
4.1 Compile jobs for debugger on paged machines.~
~
4.2 Job to process SYNTAB description of debugger commands.
~S~O4.1 Compile Job for Debugger for Paged Machines
~
::BEGIN COMPILE DEB FOR PAGED MACHINES~
DO 0 DEB\?LOG %200~
MUSL 0 DEB\? %405 16~
**TLSEG 0 %0 %390000 -1 0 *FOR MC3*~
**TLSEG 0 %0 %640000 -1 0 *FOR MC5*~
**TLSEG 0 %0 %0000 -1 0 *FOR MC5G*~
**TLSEG 0 %0 %0000 -1 0 *FOR MC7*~
**TLSEG 1 %0 %2D0000 -3 0 *FOR MC3*~
**TLSEG 1 %0 %540000 -3 0 *FOR MC5*~
**TLSEG 1 %0 %0000 -3 0 *FOR MC5G*~
**TLSEG 1 %0 %0000 -3 0 *FOR MC7*~
**TLSEG 2 %0 %00000000 -3 0~
**TLLOAD 1 2~
**TLLOAD 2 3~
MODULE (DATA.SEG,DATA.SEG.Z);~
LITERAL DATA.SEG = 45; *FOR MC3*~
LITERAL DATA.SEG = 21; *FOR MC5*~
LITERAL DATA.SEG = 0; *FOR MC5G*~
LITERAL DATA.SEG = 0; *FOR MC7*~
LITERAL/INTEGER32 DATA.SEG.Z = 0;~
*END~
MUSL 0 0 %C00~
**ED DEB021~
(F D/::VAX/)E *FOR MC3*~
(F D/::MC68000/)E *FOR MC5* *FOR MC5G*~
(F D/::MU6G/)E *FOR MC7*~
**FLIP 0 1~
DEB02~
**DI 5~
**SI 5~
EI 5~
DELETE~
MUSL 0 0 %C00~
**FLIP DEB011 1~
DEB01~
**DI 5~
**SI 5~
EI 5~
DELETE~
MUSL 0 0 %800~
**FLIP DEB091 1~
DEB09~
**DI 5~
**SI 5~
EI 5~
DELETE~
STOP~
::END COMPILE JOB FOR PAGED MACHINES~
~S~O4.2  Job to process SYNTAB description of debugger commands
~
::BEGIN PROCESS SYNTAB~
ED DEB021~
S/BEGIN SYNTAX/~
C/END SYNTAX/~
C+1SFYE~
SYNTAB~
CF DEB021 ODEB021~
ED~
C/**IN -1/S+1~
E~
SAVE TEMP~
DEL~
ED DEB021 DEB021~
C/::INSERT SYNTAB OUTPUT/~
C+1~
M TEMP~
YCF~
M DEB021~
YS/::END OF SYNTAB OUTPUT/~
E~
IN -1~
::END PROCESS SYNTAB~
~Y
~V9 -1
~P
~D15
~HFLOWCHARTS
~
~
~H                DEBO11
~V9 -1
~F
@TITLE DEB01(1,11)
@COL 1S-2R-3R-4R-5R-6F
@FLOW 1-2-3-4-5-6
@BOX 1.0
SYMBOLIC DEBUGGER
COMMAND DRIVER AND SEMANTIC PROCESSOR
@BOX 2.0
IMPORTS AND MODULE
HEADING. [DEB01/1]
@BOX 3.0
TYPE DECLARATIONS
@BOX 4.0
VARIABLES AND DATA
STRUCTURES
@BOX 5.0
PROCEDURES IN MODULE

LIBRARY PROCEDURES
  1. INIT.DEBUG
  2. DEBUG

TRAP PROCEDURES
  11. DB.TRAP

COMMAND PROCEDURES
  21. BREAK
  22. RESET.BREAK
  23. DATA
  24. REGISTER
  25. TYP
  26. SET
  27. INSERT
  28. EXECUTE
  29. CONTINUE
  30. QUIT
  31. LIST
  32. ADD
  33. FIND
  34. OFFLOAD
  35. HELP

INTERNAL PROCEDURES
51.  FORM.SP
52.  FORM.SP
53.  OUT.POS
54.  OUT.ACT
55.  OUT.CODE
56.  FIND.ENTRY
57.  INIT.DATA
58.  FIND.COMP
59.  SEL.FLD
60.  SEL.ELT
61.  SEL.PTR
62.  OUT.DATA
63.  PROCESS.OPTIONS
64.  GET.FID
65.  SELECT.DATA
66.  SET.WATCH
67.  RESET.WATCH
68.  SET.FORMAT.DATA
69.  NEXT.PROC
@BOX 6.0
END
@BOX 1.1
::DEB01
@BOX 2.1
#DEB01/1
MODULE(iNIT.dEbUG, dEbUG, CMD.FLT.LB, F.ITEM, F.SOURCE, PAR.NAME, PAR.REAL, PAR.
INT);
@BOX 3.1
TYPE VAR.STK.ENTRY IS LOGICAL8 [20] VS.NAME, VS.TYPE ADDR VS.LOC
      INTEGER16 VS.ENC INTEGER VS.DIM, VS.ELT, VS.FLD;
TYPE TYPE.STK.ENTRY IS LOGICAL8 [20] TS.NAME INTEGER16 TS.ENC
      INTEGER TS.DIM, TS.FLD;
TYPE OPT IS LOGICAL8 O.SC, O.TY, O.TR, O.BR, O.PF, O.SP
            ADDR O.LID, O.PID INTEGER16 O.VEC
         LOGICAL8 [20] O.TX LOGICAL16 [14] O.FORMAT;
TYPE BPT.ENTRY IS LOGICAL8 B.TYP INTEGER16 B.TR, B.DOLD, B.DLEN
     LOGICAL16 B.ACT LOGICAL8 [15] B.DOC, B.INS LOGICAL8 [20] B.DID
     INTEGER32 B.WAIT ADDR B.DLOC;
TYPE TRAP.ENTRY IS ADDR TR.ADDR LOGICAL64 TR.IDENT INTEGER32 TR.EXEC INTEGER16 T
R.NEXT;
TYPE TEXT.NAME IS LOGICAL8 [20] F.NAME;
@BOX 4.1
*GLOBAL 3;
ADDR PW0, PW1, PW2, PW3, PW4, PW5, PW6;
LOGICAL64 PWW1, PWW2;
*GLOBAL 2;
LITERAL/BPT.ENTRY BPT.EMPTY=0\0\0\0\0\0\0\0\0\0;
LITERAL/ADDR [LOGICAL8] NIL.NAME=;
INTEGER OLD.IP, OLD.OP, AP, VS.BOS;
LABEL CMD.FLT.LB, QUIT.LB, CONT.LB;
ADDR [LOGICAL8] F.ITEM, F.SOURCE;
LOGICAL8 [512] PAR.NAME;
REAL32 [4] PAR.REAL;
INTEGER32 [32] PAR.INT;
OPT DEF.OPT, CMD.OPT;
INTEGER16 [256] AS;
REAL32 TIMER;
BPT.ENTRY [17] BPT.TBL;
TRAP.ENTRY [100] TRAP.VEC;
VAR.STK.ENTRY [20] VAR.STACK;
ADDR VS.LID, VS.PID;
TEXT.NAME [5] TEXT.FILES;
*GLOBAL 0;
@BOX 5.1
LSPEC INIT.DEBUG ();
LSPEC DEBUG ();
PSPEC DB.TRAP (INTEGER, INTEGER);
PSPEC BREAK ();
PSPEC RESET.BREAK ();
PSPEC DATA ();
PSPEC REGISTER ();
PSPEC TYP ();
PSPEC SET ();
PSPEC INSERT ();
PSPEC EXECUTE ();
PSPEC CONTINUE ();
PSPEC QUIT ();
PSPEC LIST ();
PSPEC FIND ();
PSPEC ADD ();
PSPEC OFFLOAD ();
PSPEC HELP ();
PSPEC FORM.SL (INTEGER) / ADDR;
PSPEC FORM.SP (INTEGER, ADDR, ADDR, ADDR, ADDR) / INTEGER;
PSPEC OUT.POS (INTEGER8, ADDR);
PSPEC OUT.ACT (LOGICAL16, INTEGER);
PSPEC OUT.CODE (INTEGER, ADDR);
PSPEC FIND.ENTRY () / INTEGER;
PSPEC INIT.DATA (ADDR, INTEGER, ADDR [LOGICAL8], INTEGER16, ADDR, ADDR);
PSPEC FIND.COMP (LOGICAL8, ADDR [LOGICAL8], INTEGER16, INTEGER, ADDR) / INTEGER;
PSPEC SEL.FLD (ADDR [LOGICAL8]);
PSPEC SEL.ELT (INTEGER);
PSPEC SEL.PTR ();
PSPEC OUT.DATA (LOGICAL8);
PSPEC PROCESS.OPTIONS (INTEGER);
PSPEC GET.FID (ADDR, ADDR) / ADDR;
PSPEC SELECT.DATA (ADDR [LOGICAL8]);
PSPEC SET.WATCH (INTEGER16, INTEGER);
PSPEC RESET.WATCH (INTEGER16);
PSPEC SET.FORMAT.DATA (LOGICAL8, INTEGER);
PSPEC NEXT.PROC (LOGICAL8, ADDR, ADDR PROC.S) /INTEGER;
#DEB01.1
#DEB01.2
#DEB01.11
#DEB01.21
#DEB01.22
#DEB01.23
#DEB01.24
#DEB01.25
#DEB01.26
::#DEB01.27
::#DEB01.28
#DEB01.29
#DEB01.30
::#DEB01.31
#DEB01.32
#DEB01.33
#DEB01.34
#DEB01.51
#DEB01.52
#DEB01.53
#DEB01.54
::#DEB01.55
#DEB01.56
#DEB01.57
#DEB01.58
#DEB01.59
#DEB01.60
#DEB01.61
#DEB01.62
#DEB01.63
::#DEB01.64
::#DEB01.65
::#DEB01.66
::#DEB01.67
#DEB01.68
#DEB01.69
@BOX 6.1
*END
@END
/P/
@TITLE DEB01/1(1,11)
@COL 1S-2R-3R-4R-5R-6F
@FLOW 1-2-3-4-5-6
@BOX 1.0
IMPORTS
@BOX 2.0
LITERALS
@BOX 3.0
TYPES
@BOX 4.0
VARIABLES
@BOX 5.0
PROCEDURES
@BOX 6.0
END
@BOX 1.1
::DEB01 IMPORTS
@BOX 2.1
IMPORT LITERAL DATA.SEG;
IMPORT LITERAL INTEGER32 DATA.SEG.Z;
IMPORT LITERAL INTEGER16 NO.OF.REGS;
@BOX 3.1
TYPE VAR.SPEC IS INTEGER16 V.ENC INTEGER V.DIM ADDR V.LOC
   ADDR [LOGICAL8] V.TYPE;
TYPE VAR.LIST.ENTRY IS ADDR [LOGICAL8] VL.NAME, VL.TYPE ADDR VL.LOC
   INTEGER16 VL.ENC INTEGER VL.DIM;
TYPE TYPE.SPEC.ENTRY IS ADDR [LOGICAL8] T.NAME INTEGER16 T.ENC INTEGER T.DIS, T.
DIM;
TYPE TYPE.LIST.ENTRY IS ADDR [LOGICAL8] TT.NAME INTEGER16 TT.ENC INTEGER TT.DIM;
TYPE PROC.S IS ADDR PS.LID, PS.PID, PS.FID, PS.CALL;
@BOX 4.1
LOGICAL32 [NO.OF.REGS] REG.NAME;
@BOX 5.1
LSPEC READ.SEGMENT.STATUS (INTEGER);
LSPEC SELECT.OUTPUT (INTEGER);
LSPEC SELECT.INPUT (INTEGER);
LSPEC CURRENT.INPUT () / INTEGER;
LSPEC CURRENT.OUTPUT () / INTEGER;
LSPEC CREATE.SEGMENT (INTEGER, ADDR);
LSPEC RELEASE.SEGMENT (INTEGER);
LSPEC SET.TIMER (INTEGER);
LSPEC OUT.M (INTEGER, INTEGER);
PSPEC LEXICAL (ADDR [LOGICAL8], ADDR [LOGICAL8]) / INTEGER;
PSPEC SCAN (ADDR [LOGICAL8], ADDR [INTEGER16], INTEGER) / INTEGER;
PSPEC FAULT (INTEGER, INTEGER);
PSPEC TL.INIT ();
PSPEC TL.INIT.FRAME (INTEGER);
PSPEC TL.TRAP.RETURN (ADDR, LOGICAL64);
PSPEC TL.SET.TRAP (ADDR) / LOGICAL64;
PSPEC TL.RESET.TRAP (ADDR, LOGICAL64);
PSPEC TL.TRAP.LOC () / ADDR;
PSPEC TL.ADD (ADDR [LOGICAL8]);
PSPEC TL.OFFLOAD (ADDR [LOGICAL8]);
PSPEC TL.STRUC (LOGICAL8, ADDR, ADDR) / INTEGER;
PSPEC TL.SOURCE.VA (ADDR [LOGICAL8], ADDR) / INTEGER;
PSPEC TL.PROC.VA (ADDR [LOGICAL8], ADDR, ADDR) / INTEGER;
PSPEC TL.VA.SOURCE (ADDR, ADDR [LOGICAL8]);
PSPEC TL.VA.PROC (ADDR, ADDR [LOGICAL8]);
PSPEC TL.PROC.PROPS (ADDR [LOGICAL8], ADDR [LOGICAL8], ADDR, ADDR) / INTEGER;
PSPEC TL.PROPS.PROC (ADDR, ADDR, ADDR [LOGICAL8], ADDR [LOGICAL8]);
PSPEC TL.VAR (ADDR [LOGICAL8], ADDR, ADDR, ADDR, ADDR VAR.SPEC) / INTEGER;
PSPEC TL.VARS (LOGICAL8, ADDR, ADDR, ADDR, ADDR [VAR.LIST.ENTRY]);
PSPEC TL.ENC.TYPE (ADDR, ADDR, INTEGER16, ADDR [TYPE.SPEC.ENTRY]);
PSPEC TL.TYPE (ADDR [LOGICAL8], ADDR, ADDR, INTEGER16) / INTEGER;
PSPEC TL.TYPES (ADDR, ADDR, ADDR [TYPE.LIST.ENTRY]);
PSPEC TL.REG (INTEGER) / ADDR;
PSPEC TL.STAT.FRAME (ADDR, ADDR PROC.S) / INTEGER;
PSPEC TL.DYN.FRAME (ADDR, ADDR PROC.S) / INTEGER;
PSPEC TL.GO.LABEL (ADDR, ADDR);
@BOX 6.1
::END
@END
/P/
@TITLE DEB01.1(1,11)
@COL 1S-2R-3R-9R-4R-5R-6R-10R-7R-8F
@FLOW 1-2-3-9-4-5
@FLOW 6-10-7-8
@BOX 1.0
INIT.DEBUG
@BOX 2.0
RELEASE AND CREATE
DEBUGGER DATA SEGMENTS
@BOX 3.0
INITIALISATION
SET RETURN LABEL FOR
QUIT COMMAND
@BOX 4.0
INITIALISE PRIMITIVE
PROCESSOR
@BOX 5.0
CALL PPC.SEQ COMMAND
PROCESSOR WITH TRAP
HANDLING SET TO DB.TRAP
@BOX 6.0
QUIT LABEL
@BOX 7.0
RELEASE DATA SEGMENT
@BOX 8.0
END
@BOX 9.0
SAVE CURRENT INPUT AND
OUTPUT STREAMS
@BOX 10.0
RESELECT ORIGINAL INPUT
AND OUTPUT STREAMS
@BOX 1.1
PROC INIT.DEBUG;
@BOX 2.1
RELEASE.SEGMENT (DATA.SEG);
CREATE.SEGMENT (DATA.SEG, DATA.SEG.Z);
@BOX 3.1
-> BX3.1;
BX3.2: -> BX6.1;
BX3.1:;
^BX3.2 => QUIT.LB;
@BOX 4.1
TL.INIT ();
@BOX 5.1
::PPC.SEQ CALL -- PARAMETERS
::TO BE SPECIFIED
@BOX 6.1
BX6.1:;
@BOX 7.1
RELEASE.SEGMENT (DATA.SEG);
@BOX 8.1
END
@BOX 9.1
CURRENT.OUTPUT () => OLD.OP;
CURRENT.INPUT () => OLD.IP;
@BOX 10.1
SELECT.OUTPUT (OLD.OP);
SELECT.INPUT (OLD.IP);
@END
@TITLE DEB01.2(1,11)
@COL 12R
@COL 1S-11T-2R-3R-4T-5R-6R-7C-8R-10F
@COL 9C
@ROW 12-3-9
@FLOW 1-11NO-2-3-4NO-5-6-4
@FLOW 4YES-7
@FLOW 11YES-12-10
@FLOW 9-4
@FLOW 7-8-10
@BOX 1.0
DEBUG
DEBUGGER COMMAND PROCESSOR
@BOX 2.0
INITIALISE
SET UP COMMAND FAULT RETURN LABEL
SET UP CONTINUE COMMAND LABEL
SET UP POINTERS TO ITEMISED LINE AND
    SOURCE LINE FOR FAULT MONITOR
@BOX 3.0
READ AND NOTE CURRENT PROMPT
SET PROMPT TO "newline*>"
@BOX 4.0
LEXICALLY ANALYSE NEXT COMMAND [DEB02]
END OF INPUT REACHED ?
@BOX 5.0
SYNTACTICALLY ANALYSE NEXT COMMAND [DEB02]
@BOX 6.0
CALL SEMANTIC PROCESSING PROCEDURE FOR COMMAND
[DEB01.21 -> DEB01.36]
@BOX 7.0
CONTINUE
@BOX 8.0
RESET PREVIOUS PROMPT
@BOX 9.0
COMMAND
FAULT
@BOX 10.0
END
@BOX 11.0
DEBUGGER SEGMENT NOT
AVAILABLE ?
@BOX 12.0
FAULT
@BOX 1.1
PROC DEBUG;
INTEGER CMD.L;
ADDR [LOGICAL] OLD.PROMPT;
LOGICAL8 [256] SOURCE, ITEM;
OPT CMD.OPT;
@BOX 2.1
-> BX2.3;
BX2.1: ->BX9.1;
BX2.2: ->BX7.1;
BX2.3:;
^BX2.1 => CMD.FLT.LB;
^BX2.2 => CONT.LB;
^SOURCE => F.SOURCE;
^ITEM => F.ITEM;
@BOX 3.1
::I.PROMPT () => OLD.PROMPT; ::LIB EXTENSION
PROMPT (%"$L*>");
@BOX 4.1
LEXICAL (^SOURCE, ^ITEM) => CMD.L;
IF ITEM [0] = '$L
@BOX 5.1
SCAN (^ITEM, ^AS, CMD.L) => AP;
@BOX 6.1
ALTERNATIVE AS [AP] FROM
BREAK ();    ::0
DATA ();
REGISTER ();
TYP ();
SET ();    ::4
INSERT ();
EXECUTE ();
CONTINUE ();
QUIT ();    ::8
LIST ();
FIND ();
ADD ();
OFFLOAD ();    ::12
HELP ();
RESET.BREAK ();    ::14
END
@BOX 7.1
BX7.1:;
@BOX 8.1
::PROMPT (OLD.PROMPT);  ::LIB EXTENSION
@BOX 9.1
BX9.1:;
@BOX 10.1
END
@BOX 11.1
READ.SEGMENT.STATUS (DATA.SEG);
IF PW1 & %7A /= %1A
@BOX 12.1
FAULT (1, -1);
@END
@TITLE DEB01.11(1,11)
@COL 11T-17N
@COL 1S-2R-3T-15N-4R-5T-6T-16N-7T-8R-9R-10R-14F
@COL 12R-13R
@ROW 7-17
@ROW 15-12
@ROW 11-16
@ROW 6-13
@FLOW 1-2-3YES-12-4
@FLOW 3NO-15-4
@FLOW 4-5YES-13-9
@FLOW 5NO-6YES-11
@FLOW 11YES-16
@FLOW 11NO-17-9
@FLOW 6NO-16
@FLOW 16-7YES-9
@FLOW 7NO-8-7
@FLOW 9-10-14
@BOX 1.0
DB.TRAP
@BOX 2.0
INITIALISE STACK
FRAME [MTL50]
@BOX 3.0
BREAKPOINT ??
@BOX 4.0
PRINT MONITORING
INFORMATION
@BOX 5.0
WAIT BIT SET ?
@BOX 6.0
WATCHPOINT BIT
SET ?
@BOX 7.0
NO MORE ACTIONS TO
BE PROCESSED ?
@BOX 8.0
PROCESS NEXT
ACTION [DEB01.11.1]
@BOX 9.0
SET TIMER IF NECESSARY
@BOX 10.0
RETURN FROM TRAP
[MTL50]
@BOX 11.0
HAS THE WATCHPOINT
ALTERED ?
@BOX 12.0
INCREMENT NUMBER OF
TIMES BREAKPOINT PASSED
SAVE LOCATION AND
BREAKPOINT IDENTIFIER
@BOX 13.0
IF BREAKPOINT HAS
NOW BEEN PASSED
ENOUGH TIMES THEN
RESET WAIT BIT
@BOX 14.0
END
@BOX 1.1
PROC DB.TRAP (CL, RE);
INTEGER ENT, TR;
INTEGER16 ACT, COUNT;
ADDR TRAP.LOC;
@BOX 2.1
0 =>ENT => COUNT;
%1 => ACT;
TL.TRAP.LOC () => TRAP.LOC;
TL.INIT.FRAME(1);
@BOX 3.1
IF CL = 0 AND RE = 256
@BOX 4.1
SELECT BPT.TBL [ENT];
OUT.M (CL, RE);
OUT.POS (B.TYP, TRAP.LOC);
@BOX 5.1
IF ACT & B.ACT = 1
@BOX 6.1
IF %2 & B.ACT = %2
@BOX 7.1
ACT <<- 1;
WHILE ACT & B.ACT = 0 AND
    ACT =< %100 DO
ACT <<- 1;
  1 +> COUNT;
OD;
IF ACT > %100
@BOX 8.1
#DEB01.11.1
@BOX 9.1
IF TIMER /= 0 THEN SET.TIMER (TIMER) FI;
@BOX 10.1
IF CL = 0 AND RE = 256 THEN
   TL.TRAP.RETURN (TRAP.LOC, TR.IDENT OF TRAP.VEC [TR])
   ELSE TL.TRAP.RETURN (0, 0) FI;
@BOX 11.1
:: TBC
::  SEE IF WATCHPOINT
::  HAS ALTERED.
@BOX 12.1
FOR ENT < 17 DO
  B.TR OF BPT.TBL [ENT] => TR;
  WHILE TR.ADDR OF TRAP.VEC [TR] /= TRAP.LOC DO
    IF TR.NEXT OF TRAP.VEC [TR] = -1 THEN  -> ES
    ELSE TR.NEXT OF TRAP.VEC [TR] => TR FI;
  OD;
-> EX;
ES:;
OD;
EX:;
@BOX 13.1
IF 1 -> B.WAIT OF BPT.TBL [ENT] = 0 THEN
  %FFFE &> B.ACT FI;
@BOX 14.1
END;
@END
@TITLE DEB01.11.1(1,11)
@COL 2C-3R-19N-23N
@COL 1S-4C-5R-20N-10C-11R-12T-13R
@COL 6C-7R-21N-14R-18F
@COL 8C-9R-22N-15C-17R
@ROW 23-13
@ROW 19-20-21-22
@ROW 2-4-6-8
@ROW 3-5-7-9
@ROW 10-15
@ROW 13-14
@FLOW 2-3-19
@FLOW 4-5-20-19
@FLOW 6-7-21-20-19
@FLOW 8-9-22-21-20-19
@FLOW 19-23-18
@FLOW 10-11-12YES-14-18
@FLOW 12NO-13-18
@FLOW 15-17-18
@BOX 1.0
SWITCH ON ACTION
@BOX 2.0
TR (TRACE)
@BOX 3.0
OUTPUT CURRENT
ACTION [DEB01.54]
@BOX 4.0
PF (PROFILE)
@BOX 5.0
INCREMENT PROFILING
STATISTICS
@BOX 6.0
INS (INSERT)
@BOX 7.0
INTERPRETIVE LIB
CALL TO INSERT
PROCEDURE
@BOX 8.0
WA (WATCHPOINT)
@BOX 9.0
OUTPUT CURRENT
ACTION [DEB01.54]
@BOX 10.0
BR (BREAK)
@BOX 11.0
OUTPUT CURRENT
ACTION [DEB01.54]
@BOX 12.0
DOCUMENT GIVEN ?
@BOX 13.0
CALL COMMAND
PROCESSOR
[DEB01.2]
@BOX 14.0
PROCESS EACH
COMMAND
@BOX 15.0
CODE (CD,TX,CX)
@BOX 17.0
OUTPUT CODE
[DEB01.55]
@BOX 18.0
@BOX 1.1
SWITCH ACT \ WA,TRACE,PF,CODE,CODE,CODE,INS,BR;
@BOX 2.1
TRACE:;
@BOX 3.1
OUT.ACT (ACT, ENT);
@BOX 4.1
PF:;
@BOX 5.1
1 +> TR.EXEC OF TRAP.VEC [TR];
@BOX 6.1
INS:;
@BOX 7.1
@BOX 8.1
WA:;
@BOX 9.1
OUT.ACT (ACT, ENT);
@BOX 10.1
BR:;
@BOX 11.1
OUT.ACT (ACT, ENT);
@BOX 12.1
IF B.DLOC /= 0
@BOX 13.1
DEBUG ();
@BOX 14.1
::  TO BE COMPLETED
@BOX 15.1
CODE:;
@BOX 17.1
OUT.CODE (ACT, TRAP.LOC);
@END
@TITLE DEB01.21(1,11)
@COL 1S-2R-3R-4R-5F
@FLOW 1-2-3-4-5
@BOX 1.0
PROCEDURE BREAK
@BOX 2.0
CHECK THAT ENTRY
IN BREAKPOINT TABLE
IS FREE.
@BOX 3.0
FORM LIST OF
TRAP ADDRESSES
[DEB01.21.1]
@BOX 4.0
FILL IN DETAILS
OF ACTIONS
[DEB01.21.2]
@BOX 5.0
END
@BOX 1.1
PROC BREAK;
INTEGER16 ACTION, IND, PI, I, SWITCH.COMP;
INTEGER8 ENT, CC;
ADDR L.ID, P.ID, NEXT.ADDR, LIMIT;
@BOX 2.1
IF B.TYP OF BPT.TBL [AS [AP + 1] => ENT] /= 0 THEN FAULT (2 , -1) FI;
@BOX 3.1
#DEB01.21.1
@BOX 4.1
#DEB01.21.2
@BOX 5.1
END;
@END
@TITLE DEB01.21.1(1,11)
@COL 3C-4R-5R
@COL 1S-2R-6C-7R-14C-15R-17T-18R-19N-20F
@COL 9C-10R-12C-13R
@ROW 3-6-9
@ROW 14-12
@FLOW 1-2
@FLOW 3-4-5-19
@FLOW 6-7-5
@FLOW 9-10-5
@FLOW 12-13-19
@FLOW 14-15-17YES-19
@FLOW 17NO-18-17
@FLOW 19-20
@BOX 1.0
ENTER BREAKPOINT
TYPE IN BREAKPOINT
TABLE
@BOX 2.0
SWITCH ON BREAKPOINT
TYPE
@BOX 3.0
SL (SOURCE
LINE)
@BOX 4.0
FORM SOURCE LINE
ADDRESS AND GET
VIRTUAL ADDRESS
[DEB01.51]
@BOX 5.0
SET TRAP
[MTL50]
@BOX 6.0
SP (SOURCE
PROC)
@BOX 7.0
FORM SOURCE PROC
ADDRESS AND GET
VIRTUAL ADDRESS
[DEB01.52]
@BOX 9.0
VA (VIRTUAL
ADRRESS)
@BOX 10.0
PUT ADDRESS IN
BREAKPOINT TABLE
@BOX 12.0
AF (AFTER)
@BOX 13.0
SET TIME
@BOX 14.0
MU (MULTIPLE)
@BOX 15.0
GET BOUNDS OF
PROC [MTL50]
@BOX 17.0
GET ADDRESS OF
NEXT TRAP
[MTL50]
OUT OF RANGE ??
@BOX 18.0
FIND NEW TRAP
ENTRY
@BOX 20.0
END
@BOX 1.1
AS [AP + 2] => IND;
AS [IND] + 1 => B.TYP OF BPT.TBL [ENT];
@BOX 2.1
SWITCH B.TYP OF BPT.TBL [ENT] \ SL,SP,VA,AF,MU,MU,MU,MU;
@BOX 3.1
SL:;
@BOX 4.1
FIND.ENTRY () => B.TR OF BPT.TBL [ENT];
FORM.SL (IND) => TR.ADDR OF TRAP.VEC [B.TR OF BPT.TBL [ENT]];
@BOX 5.1
BEGIN
SELECT TRAP.VEC [B.TR OF BPT.TBL [ENT] ];
TL.SET.TRAP (TR.ADDR) => TR.IDENT;
END
@BOX 6.1
SP:;
@BOX 7.1
BEGIN
 FIND.ENTRY () => B.TR OF BPT.TBL [ENT];
 SELECT TRAP.VEC [B.TR OF BPT.TBL [ENT] ];
 FORM.SP (IND, TR.ADDR, LIMIT, L.ID, P.ID);
END
@BOX 9.1
VA:;
@BOX 10.1
BEGIN
 FIND.ENTRY () => B.TR OF BPT.TBL [ENT];
 SELECT TRAP.VEC [B.TR OF BPT.TBL [ENT] ];
 PAR.INT [AS [IND + 1]] => TR.ADDR;
END
@BOX 12.1
AF:;
@BOX 13.1
PAR.REAL [AS [IND + 1]] => TIMER;
@BOX 14.1
MU:;
@BOX 15.1
 FIND.ENTRY () => B.TR OF BPT.TBL [ENT];
 SELECT TRAP.VEC [B.TR OF BPT.TBL [ENT] ];
 FORM.SP (IND, TR.ADDR, LIMIT, L.ID, P.ID);
@BOX 17.1
TL.STRUC (B.TYP OF BPT.TBL [ENT], TR.ADDR, NEXT.ADDR) => CC;
IF CC = -1 OR NEXT.ADDR > LIMIT
@BOX 18.1
FIND.ENTRY () => TR.NEXT;
SELECT TRAP.VEC [TR.NEXT];
 NEXT.ADDR => TR.ADDR;
@END
@TITLE DEB01.21.2(1,11)
@COL 14F-8C-9R
@COL 1S-2T-3R-4T-5R-6C-7R-31N-32N
@COL 10C-11R
@COL 12C-13R
@ROW 14-3
@ROW 8-6-10-12
@FLOW 1-2YES-14
@FLOW 2NO-3-4YES-2
@FLOW 4NO-5
@FLOW 8-9-31-32
@FLOW 6-7-31-32
@FLOW 10-11-31-32
@FLOW 12-13-31-32
@FLOW 32-2
@BOX 1.0
INITIALISE FOR
ACTION PROCESSING
@BOX 2.0
FIND NEXT ACTION.
END OF ACTIONS ?
@BOX 3.0
SIGNAL ACTION
PRESENT IN
BPT.TBL
@BOX 4.0
IS ACTION A SIMPLE
ONE WHICH REQUIRES
NO FURTHER PROCESSING ?
(TR, PF, CD, TX, CX)
@BOX 5.0
SWITCH ON REMAINING
ACTIONS.
@BOX 6.0
BREAK
@BOX 7.0
IF DOCUMENT NAME
GIVEN ENTER ITS NAME
IN BREAKPOINT TABLE
@BOX 8.0
WATCH
@BOX 9.0
SET WATCHPOINT
[DEB01.66]
@BOX 10.0
INSERT
@BOX 11.0
ENTER INSERT NAME
IN BREAKPOINT TABLE
@BOX 12.0
WAIT
@BOX 13.0
ENTER WAIT NUMBER
IN BREAKPOINT TABLE
@BOX 14.0
END
@BOX 1.1
%1 => ACTION;
0 => PI;
2 => I;
SELECT BPT.TBL [ENT];
@BOX 2.1
1 +> I;
IF AS [AP + I] => IND = -1
@BOX 3.1
WHILE ACTION & AS [IND] = 0 DO
  ACTION <<- 1;
OD;
ACTION &> B.ACT;
@BOX 4.1
IF ACTION /= %1 /=%2 /= %128 /= %256
@BOX 5.1
IF ACTION > 2 THEN ACTION / %128 + 1 => SWITCH.COMP
ELSE ACTION - 1 => SWITCH.COMP FI;
SWITCH SWITCH.COMP \ WT, WA, INS, BR;
@BOX 6.1
BR:;
@BOX 7.1
WHILE PAR.NAME [AS [IND + 1 + PI]] => B.DOC [PI] /= 0 DO
  1 +> PI;
OD;
@BOX 8.1
WA:;
@BOX 9.1
SET.WATCH (ENT, AS [IND + 1]);
@BOX 10.1
INS:;
@BOX 11.1
WHILE PAR.NAME [AS [IND + 1 + PI]] => B.INS [PI] /= 0 DO
  1 +> I;
OD;
@BOX 12.1
WT:;
@BOX 13.1
PAR.INT [AS [IND] + 1] => B.WAIT;
@BOX 14.1
::END
@END
@TITLE DEB01.22(1,11)
@COL 7R
@COL 1S-2R-3T-4R-10R-5R-6T-8F
@ROW 7-4
@FLOW 1-2-3YES-7-10
@FLOW 3NO-4-10-5
@FLOW 10-5-6YES-3
@FLOW 6NO-8
@BOX 1.0
RESET BREAK
@BOX 2.0
IF ALL BREAKPOINTS ARE
TO BE CANCELLED, START
AT THE FIRST ENTRY IN THE
BREAKPOINT TABLE
@BOX 3.0
TIMER BREAKPOINT ?
@BOX 4.0
FOR EACH TRAP ASSOCIATED
WITH THE BREAKPOINT TABLE
RESTORE CODE
@BOX 5.0
CANCEL ENTRY IN BREAKPOINT
TABLE
@BOX 6.0
ANY MORE BREAKPOINTS ?
@BOX 7.0
CANCEL TIMER
@BOX 8.0
END
@BOX 10.0
IF WATCHPOINT SET,
RESET IT [DEB01.67]
@BOX 1.1
PROC RESET.BREAK;
INTEGER E, TR, I;
@BOX 2.1
IF AS [AP + 1] = -1 THEN 0 => E
  ELSE AS [AP+1] => E FI;
@BOX 3.1
IF B.TYP OF BPT.TBL [E] = 4
@BOX 4.1
0 => TR;
B.TR OF BPT.TBL [E] => I;
SELECT TRAP.VEC [I];
WHILE TR = 0 DO
  BEGIN
  TL.RESET.TRAP (TR.ADDR, TR.IDENT);
  0 => TR.ADDR => TR.IDENT;
  IF TR.NEXT = -1 THEN -1 => TR ELSE SELECT TRAP.VEC [TR.NEXT] FI;
  END
OD;
@BOX 5.1
BPT.EMPTY => BPT.TBL [E];
@BOX 6.1
1 +> E;
IF AS [AP + 1] = -1
@BOX 7.1
0 => TIMER;
@BOX 8.1
END;
@BOX 10.1
IF %1 & B.ACT OF BPT.TBL [E] = %1 THEN
  RESET.WATCH (E) FI;
@END
@END
@TITLE DEB01.23(1,11)
@COL 16R-7R-8R
@COL 1S-2R-3T-15T-4R-5T-6R-12N-11F
@COL 9R-10R
@ROW 15-9
@ROW 7-6
@ROW 8-12-10
@ROW 16-4
@FLOW 1-2-3YES-9-10-11
@FLOW 3NO-15NO-4-5YES-7-8-11
@FLOW 15YES-16-8
@FLOW 5NO-6-5
@BOX 1.0
PROCEDURE DATA
@BOX 2.0
PROCESS OPTIONS
[DEB01.63]
@BOX 3.0
CLASS OF VARIABLES
SPECIFIED ?
@BOX 4.0
INITIALISE SEARCH
FOR NAMED VARIABLE
@BOX 5.0
SEARCH FOR VARIABLE
IN SELECTED PROCEDURE
[MTL50]. FOUND ?
@BOX 6.0
SELECT NEXT
PROCEDURE
[DEB01.68]
@BOX 7.0
SELECT REQUIRED
FIELD OF VARIABLE
[DEB01.65]
@BOX 8.0
PRINT VARIABLE
(EXAMINE) OR
PRINT AND MODIFY
(MODIFY)
[DEB01.62]
@BOX 9.0
FIND INFORMATION
ABOUT THE CLASS
OF VARIABLES
[MTL50]
@BOX 10.0
FOR EACH VARIABLE,
SELECT VARIABLE AND
PRINT (EXAMINE) OR
PRINT AND MODIFY
(MODIFY)
[DEB01.62]
@BOX 11.0
END
@BOX 15.0
VIRTUAL ADDRESS
AND TYPE GIVEN ?
@BOX 16.0
FIND TYPE AND
INITIALISE
VARIABLE STACK
@BOX 1.1
PROC DATA;
ADDR [LOGICAL8] PNAME;
PROC.S PROC.SPEC;
INTEGER16 END.CHAIN, I, ENC;
INTEGER I.DID, P.INDEX, DIM;
VAR.SPEC VAR.S;
VAR.LIST.ENTRY [20] VAR.LIST;
@BOX 2.1
PROCESS.OPTIONS (AP + 3);
SELECT PROC.SPEC;
O.LID OF CMD.OPT => PS.LID;
O.PID OF CMD.OPT => PS.PID;
GET.FID (PS.LID, PS.PID) => PS.FID;
@BOX 3.1
IF AS [AP + 2] => I.DID =< 2 AND AS [AP + 2] >= 0
@BOX 4.1
AS [P.INDEX + 1] => P.INDEX;
0 => I;
WHILE PAR.NAME [P.INDEX + 1] /= 0 DO 1 +> I OD;
^PAR.NAME => PNAME;
PART (PNAME, P.INDEX, I);
@BOX 5.1
IF TL.VAR (PNAME, PS.LID, PS.PID, PS.FID, ^VAR.S) /= -1
@BOX 6.1
IF NEXT.PROC (O.SC OF CMD.OPT, PS.FID, ^PROC.SPEC) = -1 THEN
   FAULT (%1006, -1) FI;
@BOX 7.1
SELECT.DATA (^PAR.NAME [I.DID]);
@BOX 8.1
OUT.DATA (AS [AP + 1]);
@BOX 9.1
TL.VARS (AS [AP + 1], PS.LID, PS.PID, PS.FID, ^VAR.LIST);
@BOX 10.1
SELECT VAR.LIST;
WHILE VL.LOC /= 0 DO
  INIT.DATA (VL.LOC, VL.DIM, VL.NAME, VL.ENC, PS.LID, PS.PID);
  OUT.DATA (AS [AP + 1]);
OD;
@BOX 11.1
END;
@BOX 15.1
IF AS [AS [I.DID]] = 2
@BOX 16.1
AS [I.DID] => P.INDEX;
IF AS [P.INDEX + 2] = 1 THEN AS [P.INDEX + 3] => ENC;
ELSE
  AS [P.INDEX + 3] => P.INDEX;
  0 => I;
WHILE PAR.NAME [P.INDEX + I] /= 0 DO 1 +> I OD;
^PAR.NAME => PNAME;
PART (PNAME, P.INDEX, I+P.INDEX);
WHILE TL.TYPE (PNAME, PS.LID, PS.PID, ENC) = -1 DO
   IF NEXT.PROC (O.SC OF CMD.OPT, PS.FID, ^PROC.SPEC) = -1 THEN FAULT (%1007, -1
) FI;
OD;
FI;
INIT.DATA (PAR.INT [AS [P.INDEX + 1] ], DIM, NIL.NAME, ENC, PS.LID, PS.PID);
@END
@TITLE DEB01.24(1,11)
@COL 1S-2R-3R-4R-5R-6T-7F
@FLOW 1-2-3-4-5-6YES-3
@FLOW 6NO-7
@BOX 1.0
PROCEDURE REGISTER
@BOX 2.0
GET REGISTER
IDENTIFIER
@BOX 3.0
GET ADDRESS [MTL50]
AND TYPE OF REGISTER
@BOX 4.0
INITIALISE FOR
PRINTING
[DEB01.57]
@BOX 5.0
OUTPUT DATA (PRINT)
OR OUTPUT AND MODIFY
VALUE (DEPOSIT)
@BOX 6.0
ANY MORE REGISTERS
@BOX 7.0
END
@BOX 1.1
PROC REGISTER;
INTEGER8 REG.ID;
ADDR REG.ADDR;
@BOX 2.1
AS [AP + 2] -1 => REG.ID;
@BOX 3.1
TL.REG (1 +> REG.ID) => REG.ADDR;
@BOX 4.1
INIT.DATA (^REG.NAME [REG.ID], REG.TYPE [REG.ID], 0, REG.ADDR);
@BOX 5.1
OUT.DATA (AS [AP + 1]);
@BOX 6.1
IF AS [AP + 2] = 0 AND REG.ID < SIZE (^REG.NAME)
@BOX 7.1
END;
@END
@TITLE DEB01.25(1,11)
@COL 1S-2R-3T-4R-5R-6R-7T-9F
@COL 8R
@ROW 4-8
@FLOW 1-2-3YES-8-5
@FLOW 3NO-4-5
@FLOW 5-6-7YES-5
@FLOW 7NO-9
@BOX 1.0
PROCEDURE TYP
@BOX 2.0
PROCESS OPTIONS
[DEB01.63]
@BOX 3.0
ALL TYPES REQUIRED ?
@BOX 4.0
GET INFORMATION
ABOUT NAMED TYPE
@BOX 5.0
INITIALISE TYPE
STACK
@BOX 6.0
PRINT OUT TYPE
HIERARCHY
@BOX 7.0
ANY MORE TYPES ?
@BOX 8.0
GET INFORMATION ABOUT
ALL TYPES
@BOX 9.0
END
@BOX 1.1
PROC TYP;
PROC.S PROC.SPEC;
TYPE.LIST.ENTRY [20] TYPE.LIST;
TYPE.STK.ENTRY [20] TYPE.STACK;
LOGICAL8 [20] TYPE.NAME;
INTEGER CP, I, IND;
ADDR [LOGICAL8] P.NAME;
@BOX 2.1
PROCESS.OPTIONS (AP + 2)
SELECT PROC.SPEC;
O.LID OF CMD.OPT => PS.LID;
O.PID OF CMD.OPT => PS.PID;
GET.FID (PS.LID, PS.PID) => PS.FID;
0 => CP;
@BOX 3.1
IF AS [AP + 1] = 0
@BOX 4.1
BEGIN
AS [AP + 1] => IND;
SELECT TYPE.LIST [CP];
0 => I;
WHILE PAR.NAME [IND + I] => TYPE.NAME [I] /= 0 DO 1 +> I OD;
0 => TYPE.NAME [1 + I];
^TYPE.NAME => TT.NAME;
^PAR.NAME => P.NAME;
PART (P.NAME, IND, IND + I);
WHILE TL.TYPE (P.NAME, PS.LID, PS.PID, TT.ENC) /= -1 DO
  IF NEXT.PROC (O.SC OF CMD.OPT, PS.FID, ^PROC.SPEC) = -1 THEN FAULT (%1007, -1)
 FI;
OD;
END
@BOX 5.1
SELECT TYPE.LIST [CP];
0 => I;
WHILE TT.NAME^ [I] => TS.NAME [I] OF TYPE.STACK [0] /= 0 DO 1 +> I OD;
TT.ENC => TS.ENC OF TYPE.STACK [0];
@BOX 6.1
CAPTION (%"$LStructure of the type ");
PRINT.TYPE ();
@BOX 7.1
1 +> CP;
IF AS [AP + 1] = 0 AND TT.NAME^ [0] OF TYPE.LIST [CP] /= -1
@BOX 8.1
TL.TYPES (PS.LID, PS.PID, ^TYPE.LIST);
@BOX 9.1
END;
@END
@TITLE DEB01.26(1,11)
@COL 1S-2R-3R-4F
@FLOW 1-2-3-4
@BOX 1.0
PROCEDURE SET
@BOX 2.0
INITIALISATION
@BOX 3.0
SET DEFAULT OPTIONS
IN DEF.OPT
@BOX 4.0
END
@BOX 1.1
PROC SET;
INTEGER IND, I;
ADDR ST, FIN;
@BOX 2.1
SELECT DEF.OPT;
AP + 2 => IND;
@BOX 3.1
ALTERNATIVE AS [AP + 1] FROM
 BEGIN
   SELECT DEF.OPT;
   AS [IND] => IND;
   IF FORM.SP (IND + 1, ST, FIN, O.LID, O.PID) = -1 THEN FAULT (%1004, -1) FI;
   AS [IND] => O.SC;
 END
 SET.FORMAT.DATA (0, IND);
 AS [IND] => O.VEC;
 AS [IND] => O.TY;
 AS [IND] => O.SP;
 AS [IND] => O.TR;
 AS [IND] => O.BR;
 AS [IND] => O.PF;
 BEGIN
  SELECT DEF.OPT;
   1 +> IND;
   AS [IND] => I;
   WHILE PAR.NAME [I] => O.TX [I] /= 0 DO 1 +> I OD;
   0 => O.TX [1 +> I];
   WHILE AS [1 +> IND] /= -1 DO
     AS [IND] => I;
     WHILE PAR.NAME [I] => O.TX [I] /= 0 DO 1 +> I OD;
     0 => O.TX [1 +> I];
   OD;
   0 => O.TX [1 +> I];
 END;
END;
@BOX 4.1
END;
@END
@TITLE DEB01.29(1,11)
@COL 7R
@COL 1S-2T-3T-4R-5R-6R-9F
@COL 8R
@ROW 7-3
@ROW 4-8
@FLOW 1-2YES-7-9
@FLOW 2NO-3YES-8-5
@FLOW 3NO-4-5
@FLOW 5-6-9
@BOX 1.0
PROCEDURE CONTINUE
@BOX 2.0
CONTINUATION FROM
CURRENT TRAP IN USER
PROGRAM ?
@BOX 3.0
LOCATION SPECIFIED
BY SOURCE LINE ?
@BOX 4.0
RETRIEVE VIRTUAL ADDRESS
FROM PAR.INT
@BOX 5.0
GET FRAME IDENTIFIER
OF LOCATION
@BOX 6.0
NON-LOCAL JUMP TO
LOCATION
@BOX 7.0
GO TO CONTINUE
LABEL IN DEBUG
@BOX 8.0
GET VIRTUAL ADDRESS
CORRESPONDING TO
SOURCE LINE
@BOX 9.0
END
@BOX 1.1
PROC CONTINUE;
INTEGER INDEX;
ADDR LOC, FRAME;
@BOX 2.1
IF AS [AP + 1] => INDEX = 0
@BOX 3.1
IF AS [INDEX] = 0
@BOX 4.1
AS [INDEX +1] => INDEX;
PAR.INT [INDEX] => LOC;
@BOX 5.1
:: TBC
@BOX 6.1
TL.GO.LABEL (LOC, FRAME);
@BOX 7.1
-> CONT.LB;
@BOX 8.1
FORM.SL (INDEX) => LOC;
@BOX 9.1
END;
@END
@TITLE DEB01.30(1,11)
@COL 1S-2R-3F
@FLOW 1-2-3
@BOX 1.0
PROCEDURE QUIT
@BOX 2.0
GO TO QUIT LABEL
@BOX 3.0
END
@BOX 1.1
PROC QUIT ;
@BOX 2.1
-> QUIT.LB;
@BOX 3.1
END;
@END
@TITLE DEB01.32(1,11)
@COL 1S-2R-3R-4R-5T-6F
@FLOW 1-2-3-4-5YES-3
@FLOW 5NO-6
@BOX 1.0
PROCEDURE ADD
@BOX 2.0
INITIALISATION
@BOX 3.0
FORM BOUNDED POINTER
TO FILE NAME
@BOX 4.0
MAKE FILE KNOWN TO
DEBUGGING PRIMITIVES
[MTL50]
@BOX 5.0
ANY MORE FILES ?
@BOX 6.0
END
@BOX 1.1
PROC ADD;
INTEGER IND, I, NAME.IND;
ADDR [LOGICAL8] NAME.ADDR;
@BOX 2.1
1 => IND;
@BOX 3.1
AS [AP + IND] => NAME.IND;
^PAR.NAME => NAME.ADDR;
0 => I;
WHILE PAR.NAME [NAME.IND + I] /= 0 DO 1 +> I OD;
PART (NAME.ADDR, NAME.IND, I + NAME.IND);
@BOX 4.1
TL.ADD (NAME.ADDR);
@BOX 5.1
1 +> IND;
IF AS [AP + IND] /= -1
@BOX 6.1
END;
@END
@TITLE DEB01.33(1,11)
@COL 1S-2R-3R-4R-5T-6F
@FLOW 1-2-3-4-5YES-3
@FLOW 5NO-6
@BOX 1.0
PROCEDURE FIND
@BOX 2.0
INITIALISATION
@BOX 3.0
FIND A FREE ENTRY IN
TEXT.FILES TABLE
@BOX 4.0
COPY IN TEXT FILE
NAME
@BOX 5.0
ANY MORE FILES ?
@BOX 6.0
END
@BOX 1.1
PROC FIND;
INTEGER IND, I, NAME.IND;
@BOX 2.1
1 => IND;
@BOX 3.1
FOR I < SIZE (^TEXT.FILES) DO
  IF F.NAME [0] OF TEXT.FILES [I] /= 0 THEN 1 +> I FI;
OD;
IF I >= SIZE (^TEXT.FILES) THEN FAULT (%1008, -1) FI;
@BOX 4.1
SELECT TEXT.FILES [I];
0 => I;
AS [AP + IND] => NAME.IND;
WHILE PAR.NAME [NAME.IND + I] => F.NAME [1 + I] /= 0 DO 1 +> I OD;
I => F.NAME [0];
@BOX 5.1
IF AS [1 +> IND + AP] /= -1
@BOX 6.1
END
@END
@TITLE DEB01.34(1,11)
@COL 1S-2R-3T-4T-5R-6R-7T-9F
@COL 8R
@ROW 4-8
@FLOW 1-2-3YES-8-7
@FLOW 3NO-4YES-3
@FLOW 4NO-5-6-7
@FLOW 7YES-3
@FLOW 7NO-9
@BOX 1.0
PROCEDURE OFFLOAD
@BOX 2.0
INITIALISE
@BOX 3.0
COMPARE GIVEN FILE
NAME TO NAME IN
TEXT.FILES TABLE.
SAME ?
@BOX 4.0
ANY MORE ENTIES IN
TEXT.FILES TO BE
CONSDERED ?
@BOX 5.0
FORM A BOUNDED
POINTER TO THE
FILE NAME
@BOX 6.0
OFFLOAD FILE
FROM DEBUGGER
PRIMITIVES
[MTL50]
@BOX 7.0
ANY MORE FILES ?
@BOX 8.0
DELETE ENTRY FROM
TEXT.FILES TABLE
@BOX 9.0
END
@BOX 1.1
PROC OFFLOAD;
INTEGER I, J, IND, NAME.INDEX;
ADDR [LOGICAL8] NAME.ADDR;
@BOX 2.1
1 => IND;
0 => I;
AS [AP + IND] => NAME.INDEX;
@BOX 3.1
SELECT TEXT.FILES [I];
0 => J;
WHILE J < F.NAME [0] AND F.NAME [J + 1] = PAR.NAME [NAME.INDEX + J] DO
  1 +> J;
OD;
IF J >= F.NAME [0]
@BOX 4.1
IF 1 +> I =< SIZE (^TEXT.FILES)
@BOX 5.1
^PAR.NAME => NAME.ADDR;
0 => J;
WHILE PAR.NAME [NAME.INDEX + J] /= 0 DO 1 +> J OD;
PART (NAME.ADDR, NAME.INDEX, J + NAME.INDEX);
@BOX 6.1
TL.OFFLOAD (NAME.ADDR);
@BOX 7.1
IF AS [1 +> IND + AP] /= -1
@BOX 8.1
0 => F.NAME [0];
@BOX 9.1
END;
@END
@TITLE DEB01.51(1,11)
@COL 6R
@COL 1S-2T-20N-22N-3T-4T-5R
@COL 7R-21N-8R-9R-10F
@ROW 20-7
@ROW 21-22
@ROW 4-8
@ROW 6-5
@FLOW 1-2YES-7-21-22
@FLOW 2NO-20-22
@FLOW 22-3YES-8-9-10
@FLOW 3NO-4YES-6-22
@FLOW 4NO-5-4
@BOX 1.0
PROCEDURE FORM.SL
(FORM SOURCE LINE)
@BOX 2.0
RELATIVE ADDRESS
GIVEN ??
@BOX 3.0
END OF SOURCE ADDRESS
REACHED ??
@BOX 4.0
GET NEXT CHARACTER.
END OF NAME REACHED ?
@BOX 5.0
STORE CHARACTER
IN BUFFER.
@BOX 6.0
STORE TERMINATING
CHARACTER.
@BOX 7.0
PUT BASE ADDRESS
INTO SOURCE LINE
BUFFER.
@BOX 8.0
TERMINATE SOURCE
LINE
@BOX 9.0
GET VIRTUAL
ADDRESS.
@BOX 10.0
END
@BOX 1.1
PROC FORM.SL (IND);
ADDR VA;
INTEGER NAME.INDEX, SIZE.BASE, I;
LOGICAL8 CH;
LOGICAL8 [40] SL.BUF;
0 => I;
@BOX 2.1
IF AS[1 + IND] /= 0
@BOX 3.1
AS [1 +> IND] => NAME.INDEX;
IF NAME.INDEX = -1
@BOX 4.1
PAR.NAME [NAME.INDEX] => CH;
IF CH = 0
@BOX 5.1
CH => SL.BUF [1 +> I];
1 +> NAME.INDEX;
@BOX 6.1
0 => SL.BUF [1 +> I];
@BOX 7.1
SELECT CMD.OPT;
SIZE (^O.TX) => SIZE.BASE;
FOR I < SIZE.BASE + 1 DO
  O.TX [I] => SL.BUF [I]
OD;
0 => SL.BUF [I];
@BOX 8.1
0 => SL.BUF [1 +> I] => SL.BUF [1 +> I];
@BOX 9.1
IF TL.SOURCE.VA (^SL.BUF, VA) /= 0 THEN FAULT (%1003, 0) FI;
VA => FORM.SL;
@BOX 10.1
END;
@END
@TITLE DEB01.52(1,11)
@COL 7R-8R
@COL 1S-2T-3T-4T-5T-6R
@COL 9T-10R-20N-11R-12R-14F
@COL 13R
@ROW 4-20
@ROW 3-9
@ROW 7-10
@ROW 4-13
@ROW 8-6-12
@ROW 5-11
@FLOW 1-2YES-9YES-13-14
@FLOW 9NO-10-13-14
@FLOW 2N0-3YES-7-4
@FLOW 3NO-4
@FLOW 4YES-11-12-14
@FLOW 4NO-5YES-8-4
@FLOW 5NO-6-5
@BOX 1.0
PROCEDURE FORM.SP (IND, START, FINISH, LID, PID)
(FORM PROCEDURE ADDRESS)
@BOX 2.0
PROCEDURE NUMBER
GIVEN ?
@BOX 3.0
RELATIVE SYMBOLIC
ADDRESS GIVEN ?
@BOX 4.0
END OF SOURCE
PROCEDURE ADDRESS ?
@BOX 5.0
GET NEXT CHAR.
END OF NAME ?
@BOX 6.0
STORE CHAR
IN BUFFER
@BOX 7.0
COPY LIBRARY
NAME TO
BUFFER
@BOX 8.0
STORE TERMINATING
CHARACTER.
@BOX 9.0
PROCEDURE LIST
CURRENTLY VALID ?
@BOX 10.0
FORM NEW PROCEDURE
LIST [DEB01. ]
@BOX 11.0
TERMINATE SOURCE
PROCEDURE ADDRESS
@BOX 12.0
GET VIRTUAL ADDRESS
OF PROCEDURE AND LIB
AND PROC IDENTIFIERS
@BOX 13.0
GET ADDRESSES, LIB
AND PROC IDS
@BOX 14.0
END
@BOX 1.1
PROC FORM.SP (IND, ST, FIN, LID, PID);
LOGICAL8 [40] SP.BUF;
INTEGER16 NAME.INDEX, I;
LOGICAL8 CH;
0 => I;
@BOX 2.1
IF AS [IND + 1] = -1
@BOX 3.1
IF AS [IND + 1] = 0
@BOX 4.1
AS [1 +> IND] => NAME.INDEX;
IF NAME.INDEX = -1
@BOX 5.1
PAR.NAME [NAME.INDEX] => CH;
IF CH = 0
@BOX 6.1
CH => SP.BUF [1 +> I];
1 +> NAME.INDEX;
@BOX 7.1
WHILE O.TX [I] OF CMD.OPT => SP.BUF [I] /= 0 DO
  1 +> I;
OD;
@BOX 8.1
0 => SP.BUF [1 +> I];
@BOX 9.1
IF LIST.VALID = 1
@BOX 10.1
LIST.CHAIN ();
@BOX 11.1
0 => SP.BUF [ 1+> I] => SP.BUF [1 +> I];
@BOX 12.1
TL.PROC.VA (^SP.BUF, ST, FIN);
IF ST = 0 THEN FAULT (%1004, 0) FI;
TL.PROC.PROPS (^SP.BUF, LID, PID);
@BOX 13.1
@BOX 14.1
END;
@END
@TITLE DEB01.53(1,11)
@COL 4C-5R-33N-12C-13R-34N
@COL 1S-2R-3R-6C-7R-32N-14C-15R-20R-21F
@COL 8C-9R-31N-16C-17R
@COL 10C-11R-30N-18C-19R
@ROW 4-6-8-10
@ROW 33-32-31-30
@ROW 12-14-16-18
@FLOW 1-2-3
@FLOW 4-5-33
@FLOW 6-7-32-33
@FLOW 8-9-31-32-33
@FLOW 10-11-30-31-32-33
@FLOW 33-34-21
@FLOW 12-13-20
@FLOW 14-15-20
@FLOW 16-17-20
@FLOW 18-19-20
@FLOW 20-21
@BOX 1.0
OUT.POS (TYP, LOCATION)
(OUTPUT CURRENT
POSITION IN USER
PROGRAM)
@BOX 2.0
PRINT MESSAGE
HEADING
@BOX 3.0
SWITCH ON TYPE
@BOX 4.0
SOURCE LINE
@BOX 5.0
PRINT SOURCE
LINE MESSAGE
@BOX 6.0
SOURCE PROC
PRINT SOURCE
PROC MESSAGE
@BOX 8.0
VIRTUAL ADDRESS
@BOX 9.0
PRINT VIRTUAL
ADDRESS
@BOX 10.0
AFTER
@BOX 11.0
PRINT TIMER
MESSAGE
@BOX 12.0
PROCS
@BOX 13.0
PRINT MULTIPLE
BREAKPOINT (PROC)
MESSAGE
@BOX 14.0
CODE
@BOX 15.0
PRINT MULTIPLE
BREAKPOINT (CODE)
MESSAGE
@BOX 16.0
TEXT
@BOX 17.0
PRINT MULTIPLE
BREAKPOINT (TEXT)
MESSAGE
@BOX 18.0
BOX
@BOX 19.0
PRINT MULTIPLE
BREAKPOINT (BOX)
MESSAGE
@BOX 20.0
PRINT MULTIPLE
BREAKPOINT COMMON
MESSAGE
@BOX 21.0
END
@BOX 1.1
PROC OUT.POS (TYP, LOC);
LOGICAL8 [40] SADDR;
INTEGER16 I;
FOR I < SIZE (^SADDR) DO " " => SADDR [I] OD;
@BOX 2.1
CAPTION (%"$LTrap detected ");
@BOX 3.1
SWITCH TYP - 1 \SL, SP, VA, AF, PR, CO, TX, BO;
@BOX 4.1
SL:;
@BOX 5.1
CAPTION (%"at ");
TL.VA.SOURCE (LOC, ^SADDR);
CAPTION (^SADDR);
@BOX 6.1
SP:;
@BOX 7.1
CAPTION (%"in procedure ");
TL.VA.PROC (LOC, ^SADDR);
CAPTION (^SADDR);
@BOX 8.1
VA:;
@BOX 9.1
CAPTION (%"at virtual address");
OUT.HEX (LOC, 8);
@BOX 10.1
AF:;
@BOX 11.1
CAPTION (%":timer runout at ");
TL.VA.SOURCE(LOC, ^SADDR);
CAPTION (^SADDR);
@BOX 12.1
PR:;
@BOX 13.1
CAPTION (%"due to procedure ");
@BOX 14.1
CO:;
@BOX 15.1
CAPTION (%"due to code ");
@BOX 16.1
TX:;
@BOX 17.1
CAPTION ("%due to text ");
@BOX 18.1
BO:;
@BOX 19.1
CAPTION (%"due to box ");
@BOX 20.1
CAPTION(%"multiple breakpoint at ");
TL.VA.SOURCE (LOC, ^SADDR);
CAPTION (^SADDR);
@BOX 21.1
END;
@END
@TITLE DEB01.54(1,11)
@COL 6R-8R
@COL 1S-2T-3T-4T-5R-9F
@COL 7R-10R
@ROW 3-7
@ROW 6-4
@ROW 8-5-10
@FLOW 1-2YES-7-10-9
@FLOW 2NO-3YES-6-9
@FLOW 3NO-4YES-8-9
@FLOW 4NO-5-9
@BOX 1.0
OUT.ACT (ACTION, ENTRY)
(OUTPUT CURRENT ACTION
DETAILS)
@BOX 2.0
WATCHPOINT ?
@BOX 3.0
TRACEPOINT ?
@BOX 4.0
BREAKPOINT ?
@BOX 5.0
PRINT "INSERT EXECUTED"
@BOX 6.0
PRINT "TRACEPOINT
ENCOUNTERED"
@BOX 7.0
PRINT "WATCHPOINT
MODIFIED"
@BOX 8.0
PRINT "BREAKPOINT
ENCOUNTERED"
@BOX 9.0
END
@BOX 10.0
OUTPUT VALUES OF
OLD AND NEW
WATCHPOINT
@BOX 1.1
PROC OUT.ACT (ACTION, ENTRY);
@BOX 2.1
IF ACTION = %2
@BOX 3.1
IF ACTION = %4
@BOX 4.1
IF ACTION = %100
@BOX 5.1
CAPTION (%"$LInsert executed");
@BOX 6.1
CAPTION (%"$LTracepoint encountered");
@BOX 7.1
CAPTION (%"$LWatchpoint ");
CAPTION (^B.DID OF BPT.TBL [ENTRY]);
CAPTION (%"modified");
@BOX 8.1
CAPTION (%"$LBreakpoint encountered");
@BOX 9.1
END;
@BOX 10.1
SELECT BPT.TBL [ENTRY];
SELECT.DATA (^B.DID);
CAPTION (%"$LNew value of watch variable:$L");
OUT.DATA (0);
^WATCH.SPACE [B.DOLD] => VL.ADDR OF VAR.STACK [0];
CAPTION ("%$LOld value of watch variable:$L");
OUT.DATA (0);
@END
@TITLE DEB01.56(1,11)
@COL 1S-2R-3R-4F
@FLOW 1-2-3-4
@BOX 1.0
FIND.ENTRY () INDEX
(FIND FREE ENTRY IN TRAP.VEC)
@BOX 2.0
FIND NUMBER OF ELEMENTS
IN TRAP.VEC

@BOX 3.0
SEARCH FOR A FREE
ELEMENT
@BOX 4.0
END
@BOX 1.1
PROC FIND.ENTRY;
INTEGER16 TRAP.VEC.Z, I;
@BOX 2.1
SIZE (^TRAP.VEC) => TRAP.VEC.Z;
@BOX 3.1
0 => I;
WHILE I < TRAP.VEC.Z AND TR.EXEC OF TRAP.VEC [I] /= -1 DO
  1 +> I;
OD;
IF I < TRAP.VEC.Z THEN I => FIND.ENTRY
ELSE FAULT (%1005, -1) FI;
@BOX 4.1
END;
@END
@TITLE DEB01.57(1,11)
@COL 1S-2R-3R-4F
@FLOW 1-2-3-4
@BOX 1.0
PROCEDURE INIT.DATA
(INITIALISE VAR.STACK)
@BOX 2.0
RESET DATA STACK
@BOX 3.0
PUT PARAMETERS ONTO
VARIABLE STACK
@BOX 4.0
@BOX 1.1
PROC INIT.DATA (LOC, DIM, NAME, ENC, LIB.ID, PROC.ID);
INTEGER I;
@BOX 2.1
0 => VS.BOS;
LIB.ID => VS.LID;
PROC.ID => VS.PID;
SELECT VAR.STACK [VS.BOS];
@BOX 3.1
FOR I < SIZE (NAME) DO NAME^ [I] => VS.NAME [I] OD;
0 => VS.NAME [I + 1];
LOC => VS.LOC;
DIM => VS.DIM;
ENC => VS.ENC;
-1 => VS.FLD;
0 => VS.ELT;
@BOX 4.1
END;
@END
@TITLE DEB01.58(1,11)
@COL 6T
@COL 1S-2R-3T-4R-5R-7F
@ROW 6-4
@FLOW 1-2-3YES-6
@FLOW 6YES-3
@FLOW 6NO-7
@FLOW 3NO-4-5-7
@BOX 1.0
PROCEDURE FIND.COMP
@BOX 2.0
PROCESS STACK
[DEB01.58.1]
@BOX 3.0
GET REQUIRED COMPONENT
ACCORDING TO P1. NO MORE
COMPONENTS IN THE FIELD ?
@BOX 4.0
PROCESS STACK
[DEB01.58.1]
@BOX 5.0
RETURN COMPONENT
INFORMATION
@BOX 6.0
GO TO PREVIOUS LEVEL.
MORE LEVELS TO BE
PROCESSED.
@BOX 7.0
END
@BOX 1.1
PROC FIND.COMP (KIND, NAME, ENC, DIM, LOC);
INTEGER COMP;
TYPE.SPEC.ENTRY [20] TYPE.VEC;
PSPEC PROCESS.STACK (ADDR [TYPE.SPEC.ENTRY]);
#DEB01.58.1
@BOX 2.1
-1 => FIND.COMP;
IF %4000 & VS.ENC OF VAR.STACK [VS.BOS] /= 0 THEN PROCESS.STACK (^TYPE.VEC) FI;
@BOX 3.1
KIND +> VS.FLD OF VAR.STACK [VS.BOS -1] => COMP;
IF COMP < 0 OR T.NAME OF TYPE.VEC [COMP] = -1
@BOX 4.1
IF %4000 & VS.ENC OF VAR.STACK [VS.BOS] /= 0 THEN
  PROCESS.STACK (^TYPE.VEC)
FI;
@BOX 5.1
SELECT VAR.STACK [VS.BOS];
VS.ENC => ENC;
VS.DIM => DIM;
VS.LOC => LOC;
0 => FIND.COMP;
@BOX 6.1
1 -> VS.BOS;
IF VS.BOS /= 0
@BOX 7.1
END;
@END
@TITLE DEB01.58.1(1,11)
@COL 1S-2R-3R-4F
@FLOW 1-2-3-4
@BOX 1.0
PROCEDURE PROCESS.STACK
@BOX 2.0
INITIALISATION
@BOX 3.0
PROCESS STACK SUCH THAT
BOTTOM OF STACK IS OF
BASIC TYPE.
@BOX 4.0
END
@BOX 1.1
PROC PROCESS.STACK (TV);
INTEGER I;
ADDR [LOGICAL8] NAME.PTR;
@BOX 2.1
SELECT VAR.STACK [VS.BOS];
@BOX 3.1
WHILE %4000 & VS.ENC = %4000 DO
  TL.ENC.TYPE (VS.LID, VS.PID, VS.ENC, TV);
  1 +> VS.BOS;
  BEGIN
  SELECT VAR.STACK [VS.BOS];
  T.NAME OF TV^ [0] => NAME.PTR;
  WHILE I < NAME.PTR^ [0] DO
    NAME.PTR^ [I] => VS.NAME [I];
    1 +> I;
  OD;
  VS.LOC OF VAR.STACK [VS.BOS -1] + T.DIS OF TV^ [0] => VS.LOC;
  -1 => VS.FLD;
  END
OD;
@BOX 4.1
END;
@END
@TITLE DEB01.59(1,11)
@COL 1S-2R-3R-4T-5T-6R-8F
@COL 7R
@ROW 5-7
@FLOW 1-2-3-4YES-7-8
@FLOW 4NO-5YES-4
@FLOW 5NO-6-8
@BOX 1.0
PROCEDURE SEL.FLD
@BOX 2.0
CHECK THAT THE LAST
ENTRY ON THE VARIABLE
STACK IS OF AGGREGATE
TYPE
@BOX 3.0
FIND ENCODED TYPE
INFORMATION
@BOX 4.0
COMPARE REQUIRED FIELD
NAME WITH NAME OF
SUB-FIELD
@BOX 5.0
ANY MORE SUB-FIELDS ?
@BOX 6.0
RETURN ERROR
@BOX 7.0
SELECT FIELD
@BOX 8.0
END
@BOX 1.1
PROC SEL.FLD (FLD);
INTEGER TV, I;
TYPE.SPEC.ENTRY [20] TYPE.V;
@BOX 2.1
0 => TV => I;
IF VS.ENC OF VAR.STACK [VS.BOS] & %4000 = 0 THEN FAULT (%1009, -1) FI;
@BOX 3.1
TL.ENC.TYPE (VS.LID, VS.PID, VS.ENC OF VAR.STACK [VS.BOS], ^TYPE.V);
@BOX 4.1
SELECT TYPE.V [TV];
WHILE T.NAME^ [I] = FLD^ [I] AND I < SIZE (FLD) DO
  1 +> I;
OD;
IF I >= SIZE (FLD)
@BOX 5.1
IF T.NAME^ [0] OF TYPE.V [1 +> TV] = -1
@BOX 6.1
FAULT (%100A, -1);
@BOX 7.1
1 +> VS.BOS;
SELECT VAR.STACK [VS.BOS];
FOR I < SIZE (FLD) DO FLD^ [I] => VS.NAME [I] OD;
VS.LOC OF VAR.STACK [VS.BOS - 1] + T.DIS OF TYPE.V [TV] => VS.LOC;
T.ENC OF TYPE.V [TV] => VS.ENC;
TV => VS.FLD OF VAR.STACK [VS.BOS - 1];
T.DIM OF TYPE.V [TV] => VS.DIM;
@BOX 8.1
END;
@END
@TITLE DEB01.60(1,11)
@COL 1S-2R-3R-4R-5F
@FLOW 1-2-3-4-5
@BOX 1.0
PROC SEL.ELT
@BOX 2.0
CHECK THAT THE LAST
ENTRY ON THE VARIABLE
STACK IS A VECTOR
@BOX 3.0
CHECK THAT ELEMENT
NUMBER IS VALID
@BOX 4.0
PUT NEW ELEMENT
NUMBE INTO
VAR.STACK.ADJUST
LOCAION OF THE
VARIABLE
@BOX 5.0
END
@BOX 1.1
PROC SEL.ELT (ELT);
@BOX 2.1
SELECT VAR.STACK [VS.BOS];
IF VS.ENC & %8000 /= %8000 THEN FAULT (%100B, -1) FI;
@BOX 3.1
IF ELT > VS.DIM THEN FAULT (%100C, -1) FI;
@BOX 4.1
ELT => VS.ELT;
:: TBC
@BOX 5.1
END;
@END
@TITLE DEB01.61(1,11)
@COL 1S-2R-3R-4R-5R-6F
@FLOW 1-2-3-4-5-6
@BOX 1.0
PROCEDURE SEL.PTR
@BOX 2.0
CHECK THAT THE CURRENT
BOTTOM OF STACK IS OF
POINTER TYPE
@BOX 3.0
FIND VALUE OF POINTER
@BOX 4.0
CALCULATE ENCODED TYPE
INFORMATION
@BOX 5.0
FILL IN VARIABLE STACK
ENTRY
@BOX 6.0
END
@BOX 1.1
PROC SEL.PTR;
ADDR ADDR P;
@BOX 2.1
SELECT VAR.STACK [VS.BOS];
IF VS.ENC & %1 = 0 THEN FAULT (%100C, -1) FI;
@BOX 3.1
MAKE (ADDR [LOGICAL8], 0, VS.LOC) => P;
BYTE (P^) => VS.LOC OF VAR.STACK [0];
@BOX 4.1
IF VS.ENC & %2 = 0 THEN
  VS.ENC & %7FFC => VS.ENC OF VAR.STACK [0];
  SIZE (P) => VS.DIM OF VAR.STACK [0];
ELSE
  VS.ENC & %FFFC => VS.ENC OF VAR.STACK [0];
  0 => VS.DIM OF VAR.STACK [0];
FI;
@BOX 5.1
0 => VS.BOS;
0 => VS.ELT OF VAR.STACK [VS.BOS];
-1 => VS.FLD OF VAR.STACK [VS.BOS];
@BOX 6.1
END;
@END
@TITLE DEB01.62(1,11)
@COL 9F-8R
@COL 1S-2T-3R-4R-5R-6T-7R-10N
@ROW 9-3
@ROW 8-7
@FLOW 1-2YES-9
@FLOW 2NO-3-4-5-6YES-8-10-2
@FLOW 6NO-7-10-2
@BOX 1.0
PROCEDURE OUT.DATA
@BOX 2.0
GET NEXT COMPONENT
OF BASIC TYPE [DEB01.58]
END OF DATA STRUCTURE ?
@BOX 3.0
GET SIZE AND TYPE OF
COMPONENT
@BOX 4.0
GET VALUE OF
COMPONENT
@BOX 5.0
PRINT VARIABLE
NAME
@BOX 6.0
VECTOR ??
@BOX 7.0
PRINT INTEGER OR REAL
[DEB01.62.1 OR DEB01.62.2]
@BOX 8.0
PRINT VECTOR
[DEB01.62.3]
@BOX 9.0
END
@BOX 1.1
PROC OUT.DATA (KIND);
LOGICAL64 VAL;
INTEGER16 TY, T.SIZE, T.MODE;
INTEGER I, ELT;
LOGICAL8 [20] NM;
ADDR LOC;
ADDR INTEGER8 PI8;
ADDR INTEGER16 PI16;
ADDR INTEGER32 PI32;
ADDR LOGICAL8 PL8;
ADDR LOGICAL16 PL16;
ADDR LOGICAL32 PL32;
ADDR LOGICAL64 PL64;
ADDR REAL32 PR32;
ADDR REAL64 PR64;
@BOX 2.1
IF FIND.COMP (1, ^NM, TY, ELT, LOC) = -1
@BOX 3.1
TY & %3C => T.SIZE;
TY & %C0 => T.MODE;
@BOX 4.1
ALTERNATIVE T.MODE FROM
  BEGIN
  IF T.SIZE = 3 THEN MAKE (REAL32, 0, LOC) => PR32;
   PR32^ => VAL;
 ELSE MAKE (REAL64, 0, LOC) => PR64;
   PR64^ => VAL;
 FI;
END;
BEGIN
 IF T.SIZE = 0 THEN MAKE (INTEGER8, 0, LOC) => PI8;
   PI8^ => VAL;
 ELSE IF T.SIZE = 1 THEN MAKE (INTEGER16, 0, LOC) => PI16;
   PI16^ => VAL;
   ELSE MAKE (INTEGER32, 0, LOC) => PI32;
     PI32^ => VAL;
 FI FI;
END
BEGIN
  IF T.SIZE = 0 THEN MAKE (LOGICAL8, 0, LOC) => PL8;
    PL8^ => VAL;
  ELSE IF T.SIZE = 1 THEN MAKE (LOGICAL16, 0, LOC) => PL16;
      PL16^ => VAL;
      ELSE IF T.SIZE = 3 THEN MAKE (LOGICAL32, 0, LOC) => PL32;
        PL32^ => VAL;
        ELSE MAKE (LOGICAL64, 0, LOC) => PL64;
          PL64^ => VAL;
 FI FI FI
END;
END
@BOX 5.1
NEW.LINES (1);
FOR I < SIZE (^NM) DO OUT.CH (NM [I]) OD;
SPACES (2);
@BOX 6.1
IF TY & %8000 = %8000
@BOX 7.1
IF T.MODE = 0 THEN PRINT.REAL (VAL, T.SIZE);
ELSE PRINT.INT (VAL, T.MODE-1, T.SIZE) FI;
@BOX 8.1
PRINT.VEC ();
@BOX 9.1
END
@END
@TITLE DEB01.63(1,11)
@COL 33N-22N-26N
@COL 9C-10R-11R-21N-12C-13R-23N
@COL 1S-2R-3T-4R-5C-6R-20N-7C-8R-24N
@COL 16F-14C-15R-25N
@ROW 33-3
@ROW 4-16
@ROW 9-5
@ROW 22-21-20
@ROW 12-7-14
@ROW 26-23-24-25
@FLOW 1-2-3YES-16
@FLOW 3NO-4
@FLOW 9-10-11-21-22
@FLOW 5-6-20-21-22
@FLOW 12-13-23-26-22
@FLOW 7-8-24-23-26-22
@FLOW 14-15-25-24
@FLOW 22-33-3
@BOX 1.0
PROCEDURE PROCESS.OPTIONS
@BOX 2.0
INITIALISATION
@BOX 3.0
FIND NEXT OPTION.
END OF OPTIONS ?
@BOX 4.0
SWITCH ON OPTION
@BOX 5.0
FORMAT DATA
@BOX 6.0
PROCESS FORMAT
DATA OPTION
[DEB01.63.1]
@BOX 7.0
SCOPE
@BOX 8.0
RECORD SCOPE
AND PROCEDURE
INFORMATION
@BOX 9.0
COMMON (TRACE, BREAK
STEP, PROFILE, TYPE)
@BOX 10.0
SELECT CORRECT
FIELD IN COMMAND
OPTIONS
@BOX 11.0
RECORD OPTION
DETAILS
@BOX 12.0
TEXT
@BOX 13.0
RECORD SOURCE
ADDRESS
@BOX 14.0
VECTOR
@BOX 15.0
RECORD NUMBER OF
ELEMENTS OF VECTORS
TO BE PRINTED.
@BOX 16.0
END
@BOX 1.1
PROC PROCESS.OPTIONS (PT);
LOGICAL16 OPT;
INTEGER16 CURRENT.POS, DATA.T, CUR.F, IND;
ADDR LOGICAL8  CO.FLD;
ADDR ST, FIN;
INTEGER8 OPT.COUNT;
@BOX 2.1
SELECT CMD.OPT;
%1 => OPT;
PT => CURRENT.POS;
0 => OPT.COUNT;
DEF.OPT => CMD.OPT;
@BOX 3.1
WHILE OPT & AS [PT] /= OPT AND OPT.COUNT < 9 DO
  OPT <<- 1;
  1 +> OPT.COUNT;
OD;
IF OPT.COUNT >= 9
@BOX 4.1
SWITCH OPT\SC,FD,VE,CO,CO,CO,CO,CO,TX;
@BOX 5.1
FD:;
@BOX 6.1
SET.FORMAT.DATA (1, CURRENT.POS);
@BOX 7.1
SC:;
@BOX 8.1
AS [CURRENT.POS] => IND;
IF FORM.SP (IND+1, ST, FIN, O.LID, O.PID) /= 0 THEN FAULT () FI;
AS [IND] => O.SC;
1 +> CURRENT.POS;
@BOX 9.1
CO:;
@BOX 10.1
ALTERNATIVE OPT.COUNT-3 FROM
^O.TY => CO.FLD;
^O.SP => CO.FLD;
^O.TR => CO.FLD;
^O.BR => CO.FLD;
^O.PF => CO.FLD;
END
@BOX 11.1
AS [CURRENT.POS] => CO.FLD^;
1 +> CURRENT.POS;
@BOX 12.1
TX:;
@BOX 13.1
@BOX 14.1
VE:;
@BOX 15.1
AS [CURRENT.POS] => O.VEC;
1 +> CURRENT.POS;
@BOX 16.1
END;
@END
@TITLE DEB01.68(1,11)
@COL 1S-2T-3T-4R-10N
@COL 6F-5R
@ROW 2-6
@ROW 4-5
@FLOW 1-2YES-6
@FLOW 2NO-3YES-5-10-2
@FLOW 3NO-4-10-2
@BOX 1.0
PROCEDURE SET.FORMAT.DATA
INITIALISATION
@BOX 2.0
GET NEXT DATA
TYPE. NO MORE ?
@BOX 3.0
ALL FORMATS
REQUIRED ?
@BOX 4.0
FOR EACH FORMAT
PRESENT, INDICATE
THAT THIS FORMAT
IS REQUIRED IN
THE VECTOR O.FORMAT
@BOX 5.0
SET ALL FORMATS
IN O.FORMAT
@BOX 6.0
END
@BOX 1.1
PROC SET.FORMAT.DATA (KIND, INDEX);
INTEGER I, J, DATA.TYPE;
IF KIND = 0 THEN SELECT DEF.OPT ELSE SELECT CMD.OPT FI;
-1 => I;
AS [INDEX] => DATA.TYPE;
@BOX 2.1
IF DATA.TYPE = 0 THEN 1 +> I
ELSE
  IF AS [DATA.TYPE] = 0 THEN AS [DATA.TYPE + 1] + 5 => I
  ELSE AS [DATA.TYPE + 1] => I FI;
  2 +> DATA.TYPE;
FI;
IF I > 15 OR AS [DATA.TYPE - 2] = -1
@BOX 3.1
IF AS [INDEX] = 0
@BOX 4.1
0 => O.FORMAT [I];
AS [INDEX + 1] -1 => J;
WHILE AS [1 +> J] /= -1 DO
  AS [J] &> O.FORMAT [I]
OD;
@BOX 5.1
%FFFF => O.FORMAT [I];
@BOX 6.1
END
@END
@TITLE DEB01.69(1,11)
@COL 1S-2R-3F
@FLOW 1-2-3
@BOX 1.0
PROCEDURE NEXT.PROC
@BOX 2.0
GET NEXT PROC
@BOX 3.0
END
@BOX 1.1
PROC NEXT.PROC (KIND, FID, PS);
@BOX 2.1
-1 => NEXT.PROC;
IF KIND = 1 THEN TL.DYN.FRAME (FID, PS) => NEXT.PROC;
ELSE
  IF KIND = 2 THEN TL.STAT.FRAME (FID, PS) => NEXT.PROC FI;
FI;
@BOX 3.1
END;
@END

