Google
 

Trailing-Edge - PDP-10 Archives - SRI_NIC_PERM_SRC_1_19910112 - 6-manuals/ddt.mem
There are 5 other files named ddt.mem in the archive. Click here to see a list.


                             TOPS-20 DDT Manual





                     VERSION 6.0 INTERIM RELEASE DRAFT




                               December, 1984










   OPERATING SYSTEM:                                    TOPS-20 V6.0


   SOFTWARE:                                                 DDT V43


      


                                                           December, 1984



   The information in this document is subject to change  without  notice
   and  should  not  be  construed  as  a commitment by Digital Equipment
   Corporation.  Digital Equipment Corporation assumes no  responsibility
   for any errors that may appear in this document.

   The software described in this document is furnished under  a  license
   and  may  only  be used or copied in accordance with the terms of such
   license.

   No responsibility is assumed for the use or reliability of software on
   equipment that is not supplied by DIGITAL or its affiliated companies.





   Copyright (C),  1984, Digital Equipment Corporation.
                            All Rights Reserved.





   The following are trademarks of Digital Equipment Corporation:

        DEC                 DECnet              IAS
        DECUS               DECsystem-10        MASSBUS
        Digital Logo        DECSYSTEM-20        PDT
        PDP                 DECwriter           RSTS
        UNIBUS              DIBOL               RSX
        VAX                 EduSystem           VMS
                                                VT



                                  CONTENTS

   PREFACE


   CHAPTER 1       INTRODUCTION TO DDT

           1.1     SYMBOLIC DEBUGGING . . . . . . . . . . . . . . . . 1-1
           1.2     TOPS-20 VARIANTS OF DDT  . . . . . . . . . . . . . 1-1


   CHAPTER 2       GETTING STARTED WITH DDT

           2.1     INTRODUCTION . . . . . . . . . . . . . . . . . . . 2-1
           2.2     LOADING DDT  . . . . . . . . . . . . . . . . . . . 2-1
           2.3     BASIC FUNCTIONS  . . . . . . . . . . . . . . . . . 2-2
           2.3.1     Error Conditions . . . . . . . . . . . . . . . . 2-3
           2.3.2     Basic Concepts . . . . . . . . . . . . . . . . . 2-3
           2.3.3     Starting and Stopping the Program  . . . . . . . 2-5
           2.3.4     Examining and Modifying Memory . . . . . . . . . 2-5
           2.3.5     Executing Program Instructions . . . . . . . . . 2-9
           2.4     A SAMPLE DEBUGGING SESSION USING DDT . . . . . .  2-11
           2.5     PROGRAMMING WITH DDT IN MIND . . . . . . . . . .  2-22


   CHAPTER 3       DDT COMMAND FORMAT

           3.1     COMMAND SYNTAX . . . . . . . . . . . . . . . . . . 3-1
           3.2     INPUT TO DDT . . . . . . . . . . . . . . . . . . . 3-2
           3.2.1     Values in DDT Expressions  . . . . . . . . . . . 3-2
           3.2.2     Operators in DDT Expressions . . . . . . . . . . 3-9


   CHAPTER 4       DISPLAYING AND MODIFYING MEMORY

           4.1     DISPLAY MODES  . . . . . . . . . . . . . . . . . . 4-1
           4.1.1     Default Display Modes  . . . . . . . . . . . . . 4-1
           4.1.2     Selecting Display Modes  . . . . . . . . . . . . 4-2
           4.2     DISPLAYING EXPRESSIONS . . . . . . . . . . . . . . 4-6
           4.3     DISPLAYING BYTE POINTERS . . . . . . . . . . . . . 4-7
           4.4     DISPLAYING AND DEPOSITING IN MEMORY  . . . . . . . 4-8
           4.4.1     Commands That Use the Current Location . . . .  4-11
           4.4.2     Commands That Use the Location Sequence Stack   4-15
           4.4.3     Commands That Use an Address Within the Command 4-19
           4.5     DISPLAYING ASCIZ STRINGS . . . . . . . . . . . .  4-27
           4.6     ZEROING MEMORY . . . . . . . . . . . . . . . . .  4-28
           4.7     AUTOMATIC WRITE-ENABLE . . . . . . . . . . . . .  4-28
           4.8     AUTOMATIC PAGE CREATION  . . . . . . . . . . . .  4-29
           4.9     PAGE ACCESS  . . . . . . . . . . . . . . . . . .  4-29
           4.10    WATCHING A MEMORY LOCATION . . . . . . . . . . .  4-31
           4.11    TTY CONTROL MASK . . . . . . . . . . . . . . . .  4-31


                                    iii


   CHAPTER 5       CONTROLLING PROGRAM EXECUTION

           5.1     BEGINNING EXECUTION  . . . . . . . . . . . . . . . 5-1
           5.2     USING BREAKPOINTS  . . . . . . . . . . . . . . . . 5-1
           5.2.1     Setting Breakpoints  . . . . . . . . . . . . . . 5-3
           5.2.2     Proceeding from Breakpoints  . . . . . . . . . . 5-6
           5.2.3     Conditional Breakpoints  . . . . . . . . . . . . 5-8
           5.2.4     The "Unsolicited" Breakpoint . . . . . . . . . . 5-9
           5.3     EXECUTING EXPLICIT INSTRUCTIONS  . . . . . . . . . 5-9
           5.4     SINGLE-STEPPING INSTRUCTIONS . . . . . . . . . .  5-10
           5.5     EXECUTING SUBROUTINES AND RANGES OF INSTRUCTIONS  5-12
           5.5.1     Single-Stepping "Dangerous" Instructions . . .  5-14
           5.6     USER-PROGRAM CONTEXT   . . . . . . . . . . . . .  5-15


   CHAPTER 6       SEARCHING FOR DATA PATTERNS IN DDT


   CHAPTER 7       MANIPULATING SYMBOLS IN DDT

           7.1     OPENING AND CLOSING SYMBOL TABLES  . . . . . . . . 7-1
           7.2     DEFINING SYMBOLS . . . . . . . . . . . . . . . . . 7-2
           7.3     SUPPRESSING SYMBOL TYPEOUT . . . . . . . . . . . . 7-2
           7.4     KILLING SYMBOLS  . . . . . . . . . . . . . . . . . 7-3
           7.5     CREATING UNDEFINED SYMBOLS . . . . . . . . . . . . 7-3
           7.6     SEARCHING FOR SYMBOLS  . . . . . . . . . . . . . . 7-4
           7.7     LISTING UNDEFINED SYMBOLS  . . . . . . . . . . . . 7-4
           7.8     LOCATING SYMBOL TABLES WITH PROGRAM DATA VECTORS . 7-5


   CHAPTER 8       INSERTING PATCHES WITH DDT


   CHAPTER 9       FILDDT

           9.1     INTRODUCTION . . . . . . . . . . . . . . . . . . . 9-1
           9.2     USING FILDDT . . . . . . . . . . . . . . . . . . . 9-1
           9.2.1     FILDDT Commands  . . . . . . . . . . . . . . . . 9-2
           9.2.2     Symbols  . . . . . . . . . . . . . . . . . . . . 9-3
           9.2.3     Commands to Establish Formats and Parameters . . 9-4
           9.2.4     Commands to Access the Target and Enter DDT  . . 9-5
           9.2.5     Exiting FILDDT . . . . . . . . . . . . . . . . . 9-7


   CHAPTER 10      PRIVILEGED MODES OF DDT

           10.1    MDDT . . . . . . . . . . . . . . . . . . . . . .  10-1
           10.2    KDDT . . . . . . . . . . . . . . . . . . . . . .  10-2
           10.3    EDDT . . . . . . . . . . . . . . . . . . . . . .  10-3





                                    iii


   CHAPTER 11      PHYSICAL AND VIRTUAL ADDRESSING COMMANDS


   CHAPTER 12      EXTENDED ADDRESSING

           12.1    LOADING DDT INTO AN EXTENDED SECTION . . . . . .  12-1
           12.2    EXAMINING AND CHANGING MEMORY  . . . . . . . . .  12-1
           12.3    BREAKPOINTS  . . . . . . . . . . . . . . . . . .  12-2
           12.3.1    The Breakpoint Block . . . . . . . . . . . . .  12-2
           12.3.2    Enabling and Disabling Inter-section 
                     Breakpoints  . . . . . . . . . . . . . . . . .  12-2
           12.4    DISPLAYING SYMBOLS IN NONZERO SECTIONS . . . . .  12-4
           12.5    DEFAULT SECTION NUMBERS  . . . . . . . . . . . .  12-5
           12.5.1    Permanent Default Section  . . . . . . . . . .  12-5
           12.5.2    Floating Default Section . . . . . . . . . . .  12-6
           12.6    EXECUTING SINGLE INSTRUCTIONS  . . . . . . . . .  12-7
           12.7    ENTERING PATCHES IN EXTENDED SECTIONS  . . . . .  12-8


   APPENDIX A      ERROR MESSAGES

   GLOSSARY

   INDEX



                                  FIGURES


   FIGURE  2-1     Sample Program X.MAC . . . . . . . . . . . . . .  2-12
           2-2     Annotated Debugging Session  . . . . . . . . . .  2-20
           2-3     Terminal Display of Debugging Session  . . . . .  2-21
           4-1     DDT Session Showing Columnar Output  . . . . . .  4-33
           8-1     Annotated Patching Session . . . . . . . . . . . . 8-5
           8-2     Terminal Display of Patching After an Instruction  8-6
           8-3     Terminal Display of Patching Before an Instruction 8-6



                                   TABLES


   TABLE   3-1     Commands That Return Values  . . . . . . . . . . . 3-4
           3-2     Effects of Operators When Evaluating Expressions  3-10
           4-1     Evaluation of Symbolic Display Mode  . . . . . . . 4-2
           4-2     DDT Display Modes  . . . . . . . . . . . . . . . . 4-5
           4-3     Commands to Display Expressions  . . . . . . . . . 4-7
           4-4     DDT Commands to Display Memory . . . . . . . . .  4-10
           4-5     TTY Control Mask . . . . . . . . . . . . . . . .  4-32
           5-1     Breakpoint Locations of Interest . . . . . . . . . 5-2
           5-2     User-Program Context Values  . . . . . . . . . .  5-16

        



         


                                  PREFACE



   MANUAL OBJECTIVES AND AUDIENCE

   This manual explains and illustrates the features of TOPS-20 DDT,  the
   debugger  for  MACRO-20 programs.  Although TOPS-20 DDT can be used to
   debug the compiled code of programs written in higher-level languages,
   this  manual illustrates only the use of TOPS-20 DDT to debug programs
   written in MACRO-20.

   This manual is both an introduction to the basic functions of  TOPS-20
   DDT and a reference guide to all TOPS-20 DDT commands and functions.

   This manual assumes that the reader is familiar with TOPS-20, has done
   some  programming  in  MACRO-20,  and  is  familiar with the format of
   MACRO-20 instructions.


   STRUCTURE OF THIS DOCUMENT

   This manual has 12 chapters, one appendix, and one glossary.

         o  Chapter 1 introduces the concept of  symbolic  debugging  and
            describes the variants of TOPS-20 DDT.

         o  Chapter 2 describes loading TOPS-20 DDT  with  your  program,
            discusses  basic  TOPS-20  DDT  commands,  and  illustrates a
            sample debugging session.

         o  Chapter 3 explains the syntax of a  DDT  command.   Chapter 3
            also  describes  expressions  to  enter data and explains how
            TOPS-20 DDT evaluates expressions.

         o  Chapter 4 discusses how to examine and modify a program using
            TOPS-20 DDT.

         o  Chapter 5 describes the use of TOPS-20 DDT to control program
            execution:   how to start, stop, and monitor the running of a
            program.

         o  Chapter 6 explains how to perform  searches  of  a  program's
            address space using TOPS-20 DDT.

         o  Chapter 7 discusses the manipulation of program symbols using
            TOPS-20 DDT.

         o  Chapter 8 describes how  to  use  the  TOPS-20  DDT  patching
            function  to  insert and test a new series of instructions in
            your program without reassembling the program.


         o  Chapter 9 describes the use of FILDDT.

         o  Chapter 10 describes the use of the  privileged  DDTs;   KDDT
            and MDDT.

         o  Chapter 11  describes  special-use  commands   that   control
            physical  and  virtual addressing.  These commands are useful
            primarily when running EDDT and FILDDT.

         o  Chapter 12 describes commands that are  used  when  debugging
            programs that use extended addressing.

         o  Appendix A explains DDT and FILDDT error messages.

         o  The glossary defines important TOPS-20 DDT terms.



   OTHER DOCUMENTS

   Other documents to which the reader should have access are:

         o  MACRO Assembler Reference Manual

         o  TOPS-20 LINK Reference Manual

         o  TOPS-20 Commands Reference Manual

         o  DECsystem-10/DECSYSTEM-20 Processor Reference Manual

         o  TOPS-10/TOPS-20 RSX-20F System Reference Manual



   CONVENTIONS

   The following conventions are used in this manual in  the  description
   of DDT commands and concepts.


   {}             Curly brackets (braces) indicate that the
                  enclosed item is optional.


   . (period)     The address contained in DDT's location counter;   also
                  called the current location.


   addr           A  symbolic location  within a program, a  symbolic  or
                  absolute address in memory, an AC, or ".", the  current
                  location.


   c              A single ASCII or SIXBIT character.


   expr           Any expression that is legal in DDT.


   filnam         One or more components of a file specification.


   instr          Any instruction in the PDP-10 (KL10) machine
                  instruction set.


   location sequence stack

                  A circular stack of memory locations that  is  used  to
                  store  the  addresses  of certain previously referenced
                  locations.


   n              A numeric argument.


   page           A page in memory.  A page equals 512 words of memory.


   symbol         A symbol name of up to 6 RADIX50 characters.


   text           Any string of ASCII or SIXBIT characters.


   word           Any 36-bit value occupying one word of memory.


   <ESC>          Represents pressing the ESCAPE or ALTMODE key once.


   <ESC><ESC>     Represents pressing the ESCAPE or ALTMODE key twice.


   <CTRL/X>       Represents pressing a key  (represented  by  X)  at the
                  same time as you press the key labeled CTRL.


   <BKSP>         represents pressing the BACKSPACE key or <CTRL/H>.


   <LF>           Represents pressing the LINE FEED key.


   <RET>          Represents pressing the RETURN key.


   <TAB>          Represents pressing the TAB key or <CTRL/I>.


   Numbers are in octal radix unless otherwise specified.


   Examples of interaction between the user and DDT show  user  input  in
   lowercase and DDT output in uppercase.

   The symbols <BKSP>, <CTRL/x>, <ESC>, <LF>,  <RET>,  and  <TAB>  always
   represent user input.


                                    NOTE

                  The descriptions of  many  DDT  commands
                  list  the  actions  and effects of those
                  commands.  The actions and  effects  may
                  not   occur   in   precisely  the  order
                  specified, but this has no effect on the
                  results.











                                 CHAPTER 1

                            INTRODUCTION TO DDT



   DDT is a utility program for debugging MACRO-20 programs.  This manual
   describes how to use DDT.



   1.1  SYMBOLIC DEBUGGING

   It is sometimes difficult to understand precisely the operation  of  a
   program  by  reading the source code.  DDT is a tool for interactively
   examining the operation of a MACRO-20 program  while  it  is  running.
   DDT  is  useful for finding programming errors (bugs) in programs that
   do not run correctly.  You can also use DDT to  analyze  the  flow  of
   control in a program that is to be revised or rewritten.

   With DDT, you can interrupt the execution of your program at locations
   (breakpoints)  you  choose,  and then examine and modify the program's
   address space as required.  You can execute instructions one-by-one to
   check whether the effect of each instruction is what is intended.  You
   can then set other  breakpoints  in  your  program  before  continuing
   execution.

   When you refer to program locations and values, DDT allows you to  use
   the  symbols  that  are  defined  in  the program rather than absolute
   values and addresses.  This makes it  much  easier  to  refer  to  the
   source listing and to find specific locations in memory.

   After modifying the program's instructions or data, you can  exit  DDT
   and  save  (with  the  EXEC's SAVE command) the changed version of the
   program for further testing.



   1.2  TOPS-20 VARIANTS OF DDT

   There  are  several  variants  of  DDT,  each  useful  under  specific
   circumstances or for specific tasks.



                                    1-1
                            Introduction to DDT


   The variants of TOPS-20 DDT are:

         o  EDDT

         o  FILDDT

         o  KDDT

         o  MDDT

         o  RDDT

         o  SDDT

         o  UDDT

         o  XDDT

   EDDT is used to debug programs that run in  executive  mode  (such  as
   BOOT), and is described in Chapter 10.


   FILDDT is used to examine and patch disk files  and  structures.   You
   can  also  use  FILDDT  to  examine  the  running  monitor.  FILDDT is
   described in Chapter 9.


   KDDT is used to debug and patch monitor .EXE  files  and  the  running
   monitor, and is described in Chapter 10.


   MDDT is used to debug and patch the running monitor, and is  described
   in Chapter 10.


   RDDT is a relocatable variant  of  DDT  that  can  be  used  to  debug
   programs  in  user  mode.   If your program is in memory (and has been
   loaded with RDDT as below), you invoke RDDT by typing in  (at  TOPS-20
   command level):

        START

   You load RDDT with your program by running LINK as follows:

        @LINK
        *MYPROG,SYS:RDDT.REL/GO

   where MYPROG is the name of your program.  Loading RDDT.REL with  your
   program does not prevent you from using other LINK features.  You must
   load RDDT.REL last, or its start address is lost.  RDDT.REL is  useful
   in  situations where you do not wish to have DDT loaded at its default
   location.


                                    1-2
                            Introduction to DDT


   This example shows  only  the  minimal  steps  required  to  load  the
   relocatable  DDT with your program.  See the LINK Reference Manual for
   further information about using LINK.


   SDDT is a "stub" that places XDDT in  its  own  section,  with  system
   symbols  defined  as  in  MONSYM  and MACSYM.  SDDT is the DDT variant
   invoked when, at TOPS-20 command level, you type in:

        SDDT

   SDDT exists so that typing in SDDT will invoke DDT version 43  in  the
   same manner as previous versions.


   UDDT is a "stub" that resides in your user program's  section  if  the
   program  has a TOPS-10-style entry vector and the program entry vector
   is in section zero.  This is done for compatibility with programs that
   use  locations  770000,  770001  and 770002.  If you load a program in
   section zero without RDDT.REL, and the  program  has  a  TOPS-10-style
   entry  vector,  when  you use the DDT command, the EXEC loads the UDDT
   stub into your program's section at address 770000.  UDDT  then  loads
   XDDT  into the highest-numbered free (nonexistent) section (if XDDT is
   not already loaded), and starts XDDT.


   XDDT is the DDT variant normally used to debug user programs.  If  you
   load  your  program  in section zero without RDDT.REL, and the program
   does not have a TOPS-10-style entry vector, the DDT command causes the
   EXEC  to  load  XDDT  directly into the highest-numbered free section.
   XDDT is also invoked by the SDDT and UDDT stubs.  If you type in  XDDT
   while at TOPS-20 command level, the EXEC loads XDDT into section zero,
   with system symbols defined.





















                                    1-3
























































                                    1-4











                                 CHAPTER 2

                          GETTING STARTED WITH DDT



   2.1  INTRODUCTION

   This chapter describes how to load DDT with your program and shows how
   to  perform basic DDT functions.  It then illustrates a sample session
   debugging a simple MACRO-20 program, using basic DDT  functions.   You
   can  debug  programs  using  only  the  DDT commands described in this
   chapter.  Once you are familiar with these commands, you may  wish  to
   learn  how  to use the commands and functions described in the rest of
   the manual to perform more sophisticated debugging.

   The commands used in this chapter are  described  only  in  sufficient
   detail  for  the  debugging  task  being  performed;  all commands are
   thoroughly described in Chapters 3 through 12 of this document.

   The best way to learn is by doing.  You will learn  the  commands  and
   techniques  discussed in this manual if you use them as you read about
   them.  If you have a MACRO-20 program that you wish to debug,  use  it
   to  practice the commands discussed here.  If not, type in the program
   X.MAC listed in Figure 2-1.



   2.2  LOADING DDT

   If your program is already in memory (for  example,  as  a  result  of
   using LINK or the GET command), load DDT with the TOPS-20 DDT command.
   If you have run your  program,  and  it  has  terminated  normally  or
   abnormally, you can also use the DDT command to load DDT.  When DDT is
   loaded, it displays

        DDT

   on your terminal.






                                    2-1
                          Getting Started with DDT


   2.3  BASIC FUNCTIONS

   You must be able to perform certain basic functions to debug a program
   interactively.  Basic DDT functions are:

         o  accepting your commands

         o  deleting incorrect commands

         o  starting the program

         o  stopping the program at specified locations

         o  examining and modifying memory

         o  executing program instructions one at a time

         o  continuing execution of the program

         o  exiting DDT


   You give commands to tell DDT what functions to perform.  DDT does not
   wait for a line terminator (such as a carriage return) to indicate the
   end of your command.  Instead, DDT reads your  commands  character  by
   character as you enter them.  When you enter a DDT command, you almost
   never have to press the RETURN key.  This manual explicitly  indicates
   the occasions when a command requires you to press the RETURN key.


                                    NOTE

                  You must press the ESCAPE key as part of
                  entering many DDT commands.  This manual
                  uses the symbol <ESC> to indicate  where
                  you  press  the  ESCAPE  key.   When you
                  press the ESCAPE  key,  DDT  displays  a
                  dollar  sign  ($)  on  the  screen.  DDT
                  never displays <ESC> when you press  the
                  ESCAPE key.


                                    NOTE

                  This manual uses the character sequences
                  <BKSP>, <ESC>, <LF>, <RET>, and <TAB> as
                  symbols to indicate where you press  the
                  BACKSPACE,  ESCAPE,  LINE  FEED, RETURN,
                  and TAB keys, respectively.  This manual
                  also   uses   the   symbol  <CTRL/X>  to
                  indicate where you simultaneously  press
                  the CONTROL key and the key indicated by
                  X.  These symbols ALWAYS indicate  where

                                    2-2
                          Getting Started with DDT


                  you  press  the  keys  noted  here.  You
                  NEVER enter  the  individual  characters
                  <BKSP>,  <ESC>,  <LF>,  <RET>, <TAB>, or
                  <CTRL/X>, to enter a DDT command.



   Your commands appear on the screen as you type them.  Use  the  DELETE
   key  to  delete partially entered commands character by character.  If
   you try to delete more characters than you have entered, DDT displays:

        XXX

   and waits for your next command.


   You can delete an entire command line with <CTRL/U>.  When you do, DDT
   displays:

        XXX


   To exit DDT, press:

         <CTRL/Z>


   The other basic DDT functions  are  described  in  the  rest  of  this
   chapter.



   2.3.1  Error Conditions

   If DDT cannot execute a command, it displays  a  message  to  let  you
   know.  The message may be only a single character (such as M or U, for
   Multiply-defined symbol or Undefined symbol), a question mark (?),  or
   a  complete  message string.  For most errors, DDT also sets a pointer
   to the error string, so that if DDT does not display it, you can enter
   a  command  to  display  the  error string.  You can display the error
   string at any time before another error  occurs,  at  which  time  DDT
   updates  the  pointer  (to point to the new error string).  To display
   the error string produced by the last DDT error, press the ESCAPE key,
   followed by a question mark.



   2.3.2  Basic Concepts

   A very important DDT concept is that of  the  current  location.   The
   current location is a memory location that you have referenced, either
   implicitly or explicitly, with your last  command,  and  that  is  the
   default point of reference of your next command.  The current location

                                    2-3
                          Getting Started with DDT


   can be thought of as the location "where  you  are."  The  symbol  "."
   (period)  refers  to  the  address of the current location, and can be
   used as an argument in DDT commands.


   The location counter is a DDT pointer that contains the address of the
   current location.  The location counter performs a function similar to
   that of a bookmark.  Some DDT  commands  display  the  contents  of  a
   specific  location  but  do  not  change  the  address  of the current
   location, in order to maintain a specific point of reference for  your
   next  command.   Most  DDT  commands change the address of the current
   location,  and  therefore  also  change  the  location  counter.   The
   commands that do not change the current location are so indicated.


   The open location is a memory location that can be  modified  by  your
   next command.  DDT "opens" a location as a result of most commands you
   give to examine or modify memory.  These commands  often  also  change
   the  current  location  to the word that is "opened", so that the open
   location is usually also the current location.  There  is  never  more
   than one location open at any given time.


   To find the symbolic address of the current location, enter

        ._        (a period followed by an underscore)

   This causes DDT to display the following:

        ADDR1+n

   where ADDR1 is a label defined in your program, and n is the offset of
   the  current  location  from  that  label  (if the current location is
   ADDR1, DDT does not display +0).


   Another important DDT concept is that of the current  quantity.   This
   is  a  value  that  represents  the contents of the last word that DDT
   displayed, or the value  that  you  last  deposited  in  memory.   The
   current  quantity  is  the  most  recent  of  those  values.  Many DDT
   commands take arguments that default to the current quantity.


   The location sequence stack is a DDT storage area for the addresses of
   previous  current  locations.   Certain  DDT  commands that change the
   current location store the address of  the  current  location  on  the
   location sequence stack.  Other DDT commands change the address of the
   current location to an address that has already  been  stored  on  the
   location  sequence  stack.   The  location  sequence  stack  functions
   similarly to inserting place-markers in  a  source  code  listing,  in
   order to return to prior references.



                                    2-4
                          Getting Started with DDT


   2.3.3  Starting and Stopping the Program

   When your program is loaded and DDT is ready to accept  your  commands
   (as indicated by DDT appearing on the terminal display), you can begin
   execution of your program at its start address by entering:

        <ESC>G

   Unless you set one or more breakpoints before you start  the  program,
   your  program  runs  either  to completion or until it commits a fatal
   error.  A breakpoint is a memory location in  a  program's  executable
   code that has been modified so that if the program attempts to execute
   the instruction at that location, control passes  to  DDT  before  the
   instruction is executed.

   The command to set a breakpoint is:

        addr<ESC>B

   where addr is  the  address  at  which  to  stop  execution.   If  the
   user-program  PC reaches addr, DDT interrupts execution of the program
   before the program executes the instruction at the specified  address.
   When  DDT  interrupts program execution at a breakpoint, DDT opens the
   breakpoint, and the breakpoint becomes the current location.


   While program execution is stopped at a breakpoint,  you  can  display
   and  change  the  contents  of  instruction  and  data  words,  remove
   breakpoints, set new breakpoints, and execute instructions  one  at  a
   time   (single-step).    As  you  examine  memory,  you  may  find  an
   instruction that is incorrect, and modify it.  You  can  also  examine
   and   modify   data   words  in  memory.   After  modifying  incorrect
   instructions and data in  memory,  you  can  immediately  execute  the
   instructions to check the effects of the modifications, without having
   to reassemble the source code.

   Once you have made your changes, you can continue program execution at
   the  place where execution was interrupted, restart the program at the
   beginning, or start execution at any other location you  choose.   The
   program  will  run  to  completion  unless  it reaches a breakpoint or
   commits a fatal error.



   2.3.4  Examining and Modifying Memory

   One command you can use to examine memory is:

        addr/

   where addr is the address of the  memory  word  you  wish  to  examine
   (display),  and can be numeric or symbolic.  DDT displays the contents
   of the word located at addr.  If the opcode field (bits  0-8)  of  the

                                    2-5
                          Getting Started with DDT


   memory  word  matches  a recognized instruction or user-defined OPDEF,
   DDT displays the contents of addr as an instruction  (or  OPDEF).   If
   DDT finds (in the symbol table) any of the values to be displayed, DDT
   displays those symbols rather than the numeric values.   For  example,
   either  of  the  following display lines might appear on your terminal
   (depending on the address and contents of the word):

        ADDR1/   MOVE 2,SYM1

        ADDR1+5/   SYM1,,SYM2

   where ADDR1, SYM1, and SYM2 have been defined in the program.

   If you enter a symbol that DDT does not find in the symbol table,  DDT
   sounds  the terminal buzzer or bell, and displays U on the screen.  If
   you enter a symbol that is defined as a local symbol in more than  one
   module,  DDT  sounds  the terminal buzzer or bell and displays M.  You
   can eliminate the multiply-defined symbol  problem  by  "opening"  the
   symbol  table  of  the  module in which the correct symbol is defined.
   See Chapter 7 (Manipulating Symbols in DDT) for more information.

   When searching for a symbol to display, DDT  uses  global  symbols  in
   preference  to local symbols.  However, DDT searches the "open" symbol
   table first, and treats local symbols found in the open  symbol  table
   as  global  symbols.   If DDT finds only a local symbol that is not in
   the open symbol table, DDT appends a number sign  (#)  to  the  symbol
   when displaying it.  For example, DDT might display:

        ADDR/   MOVE 2,SYM1#

   See Chapter 7 (Manipulating Symbols in DDT) for  more  information  on
   symbols and symbol tables.


   The command addr/ changes the current location to addr and  opens  the
   word at addr.


   If you omit addr from an examine-memory command, such  as  addr/,  DDT
   uses  the current quantity to determine the address of the location to
   display.  For example, after DDT displays the contents of  ADDR1+5  as
   above,  if  you enter /, DDT displays the contents of the word located
   at SYM2.  The display line then appears:

        ADDR1+5/   SYM1,,SYM2   /   VALUE

   where VALUE is the contents of the word located at SYM2.  By  default,
   DDT displays VALUE symbolically if it can.

   The command / by itself (without addr) does  not  change  the  current
   location.  Both forms of the / command open the location displayed (by
   /), enabling you to modify the location with your next command.


                                    2-6
                          Getting Started with DDT


   Another very useful command  for  examining  memory  is  <TAB>.   This
   command  changes  the  current  location  to  addr  (whether  given or
   defaulted), opens the  location  at  addr,  and  changes  the  current
   quantity  to  the  contents  of addr.  <TAB> also starts a new display
   line before displaying the contents of addr, making the display easier
   to  read.   For  example,  if  you  enter <TAB> after DDT displays the
   address and contents of ADDR1+5  (as  above)  on  your  terminal,  the
   terminal display appears:

        ADDR1+5/   SYM1,,SYM2   <TAB>
        SYM2/   VALUE

   where VALUE is the contents of the word located at SYM2.  The  current
   location  is  SYM2,  which  is  open.   (<TAB>  does not appear on the
   screen, but is shown above to indicate where you press the <TAB> key.)

   <TAB> also stores the address of the current location (ADDR1+5) on the
   location  sequence  stack  before changing the current location to the
   location just displayed (SYM2).  DDT uses the location sequence  stack
   to  "remember" previous values of the location counter.  To "get back"
   to the previous current location, enter

        <ESC><RET>


   In the above example, after you press <TAB> at ADDR1+5,  DDT  displays
   the  contents  of SYM2 and changes the current location to SYM2.  When
   you enter <ESC><RET>, DDT changes the  current  location  to  ADDR1+5,
   opens  the  location  at  ADDR1+5,  and again displays the contents of
   ADDR1+5.  The terminal display then appears as follows:

        ADDR1+5/   SYM1,,SYM2   <TAB>
        SYM2/   VALUE   <ESC><RET>
        ADDR1+5/   SYM1,,SYM2

   If you use the command  addr<TAB>,  DDT  deposits  addr  in  the  open
   location  (if there is one) and closes the location before opening the
   location at addr and displaying its contents.  <TAB>  by  itself  does
   not  deposit  anything,  but  does  save  the  current location on the
   location sequence stack, making <TAB> more useful than /, depending on
   what you do next.


   You can display and open  the  word  after  the  current  location  by
   entering:

        <LF>

   DDT changes the current location to the next word in memory, starts  a
   new line, displays the address of the (new) current location, displays
   the contents of the current location, and opens the current  location.
   DDT displays the address as a symbol or a symbol plus an offset, if it
   can find a corresponding symbol in the symbol table.  For example,  to

                                    2-7
                          Getting Started with DDT


   display the next word in memory after ADDR1+5, enter

        <LF>

   DDT changes the current location to ADDR1+6, starts a  new  line,  and
   displays the address and contents of ADDR1+6.  The screen display then
   appears as follows:

        ADDR1+5/   SYM1,,SYM2   <LF>
        ADDR1+6/   -1,,SYM3

   Note that DDT does not display the characters  <LF>.   <LF>  does  not
   affect the location sequence stack.

   Entering another <LF> causes DDT to display and open the next word.


   To display and open the word previous to the current location, enter

        <BKSP>

   DDT changes the current location to the previous word,  starts  a  new
   line, displays the address and contents of the (new) current location,
   and opens the current location.  <BKSP> does not affect  the  location
   sequence stack.  DDT also displays:

        ^H

   to indicate that you pressed <BKSP>.  For example, if you enter <BKSP>
   to  open  and  display  the word before ADDR1+5, the screen appears as
   follows:

        ADDR1+5/   SYM1,,SYM2   ^H
        ADDR1+4/   -3,,SYM2


   To change the contents of the open location, enter

        value<RET>

   where value can be an instruction, a symbol, or a numeric  expression.
   For  example,  if  you  enter  the  command  LABL2/,  DDT displays the
   contents of the memory word at LABL2, and "opens" that word.   If  the
   word at LABL2 contains:

        MOVE 1,SYM1

   and you wish to change SYM1 to SYM2, enter

        MOVE 1,SYM2<RET>

   DDT stores the new instruction in the location at LABL2  and  "closes"
   the  location.   DDT  does  NOT  display  <RET>.  The terminal display

                                    2-8
                          Getting Started with DDT


   appears as follows (your input is in lowercase):

        labl2/   MOVE 1,SYM1   move 1,sym2<RET>

   The current location is still LABL2, but there is  no  open  location.
   To check whether the instruction is now correct, you can enter

        ./

   DDT displays the contents of the  current  location,  and  the  screen
   display now appears (your input is in lowercase):

        labl2/   MOVE 1,SYM1   move 1,sym2<RET>
        ./   MOVE 1,SYM2


   After entering a command to display and open a location, if you enter

        value<LF>

   DDT stores the new value in the open location, as for value<RET>.  DDT
   then  changes  the  current  location  to the next location in memory,
   starts a new display line and displays the address and contents of the
   (new)  current  location.   DDT  also opens the current location.  The
   example  above  would  then  appear  as  follows  (your  input  is  in
   lowercase):

        labl2/   MOVE 1,SYM1   move 1,sym2<LF>
        LABL2+1/   CONTENTS

   where CONTENTS is the value stored at LABL2+1.


   Similarly, after opening a location, if you enter

        value<BKSP>

   DDT stores the new value in the open location, and changes the current
   location  to  the  previous location in memory.  DDT then starts a new
   display line,  displays  the  address  and  contents  of  the  current
   location, and opens the current location.



   2.3.5  Executing Program Instructions

   When you have interrupted program execution at a breakpoint,  you  can
   execute the next instruction by entering:

        <ESC>X

   DDT executes the instruction, displays the results  of  executing  the
   instruction,  and  displays  the  address  and  contents  of  the next

                                    2-9
                          Getting Started with DDT


   instruction to be executed.  If you have not begun  program  execution
   with  the  <ESC>G  command,  the  <ESC>X  command  is illegal, and DDT
   displays ?  and sounds the terminal buzzer or  bell.   <ESC>X  changes
   the  current  location  to  the  next instruction to be executed.  For
   example, assume that the next instruction to be executed is located at
   LABEL1, which contains:

        MOVE 1,VARIBL

   If the word at VARIBL contains SYM1, when you enter <ESC>X, DDT starts
   a new line and displays:

           1/   SYM1   VARIBL/   SYM1
        LABEL1+1/   instr

   where instr is the contents of LABEL1+1, and is the  next  instruction
   to  be  executed.   You  can continue to execute instructions one at a
   time by  entering  successive  <ESC>X  commands.   This  is  known  as
   single-stepping.


   If instr is a call to a subroutine, such as:

        PUSHJ P,SUBRTN

   you  can  execute  the   subroutine   without   single-stepping   each
   instruction in the subroutine.  Enter

         <ESC><ESC>X

   and DDT executes the subroutine.  If the program  does  not  commit  a
   fatal  error  before the user-program PC returns to a location +1, +2,
   or +3 from the instruction that calls the subroutine, DDT displays the
   address  and  contents  of  the location where the program returns and
   waits for your next command.  DDT also changes the current location to
   the  address  of  the next instruction to be executed.  If the PC does
   not return to a location +1, +2, or +3 from the instruction that calls
   the  subroutine,  the  program runs until it commits a fatal error, or
   until it completes normally.

   Note that  DDT  performs  a  lot  of  overhead  while  executing  this
   instruction,  which  can make it appear that nothing is happening.  To
   verify that DDT is still executing the subroutine, enter

        ?

   DDT responds by displaying:

        Executing:  ADDR/   INSTR

   where ADDR is the address of the next instruction to be executed,  and
   INSTR is the instruction at ADDR.


                                    2-10
                          Getting Started with DDT


                                    NOTE

                  If the subroutine begins at  a  location
                  that   is   +1,   +2,  or  +3  from  the
                  instruction that calls  the  subroutine,
                  DDT  returns control to you at the first
                  instruction of the  subroutine,  without
                  executing the subroutine.




   To continue execution of the program  until  the  next  breakpoint  or
   until program completion, enter

        <ESC>P

   DDT  starts  the  program  running  again,  beginning  with  the  next
   instruction   to   be  executed.   If  you  did  not  single-step  any
   instructions, the program begins by executing the instruction  at  the
   breakpoint.  If you have executed any instructions by single-stepping,
   the program continues where you stopped.  The  effect  is  as  if  the
   program were running without DDT in control.  If the program reaches a
   breakpoint, DDT again interrupts execution.  You can then examine  and
   modify memory, set and remove breakpoints, and continue execution.



   2.4  A SAMPLE DEBUGGING SESSION USING DDT

   This section describes a debugging session  using  DDT.   The  program
   being  debugged  is  X.MAC,  shown in Figure 2-1.  The program and the
   sample session are for illustration only.  There are  many  styles  of
   programming  and  debugging, and these examples are descriptive rather
   than prescriptive in intent.

   You will understand this section and learn the commands described more
   easily  if  you  type  in the program listed in Figure 2-1 and use the
   commands as they are described.















                                    2-11
                          Getting Started with DDT


   The sample program in Figure 2-1 is designed to pass the address of  a
   table  to  a  subroutine.   The  table  contains  three elements.  The
   subroutine is to add the first two elements of the table and store the
   result  in  the  third  element  before returning to the main program.
   There are no input or output routines in the program.   The  table  is
   initialized using DDT, and the result is checked while in DDT.


           SEARCH  MONSYM
           TITLE   X
   R0=0                            ;AC0
   IDX=6                           ;INDEX REGISTER
   P=17                            ;STACK COUNTER
   START:: MOVE    P,PWORD         ;Set up stack counter
           MOVEI   IDX,TABLE1      ;Address of table with X & Y
           PUSHJ   P,ADDEM         ;Do the addition
           MOVEI   IDX,TABLE1      ;Address of table
           MOVE    R0,ANSWER(IDX)  ;Answer to R0
           JFCL    0
           HALTF%                  ;All done!
   ADDEM:  MOVE    R0,X(IDX)       ;Load X
           ADD     R0,Y(IDX)       ;X + Y
           MOVE    R0,ANSWER(IDX)  ;Store answer
           POPJ    P,              ;Return
   TABLE1: BLOCK   3               ;3 words
   X==0                            ;Offset for X
   Y==1                            ;Offset for Y
   ANSWER==2                       ;Offset for answer
   STKSIZ==10                      ;Stack size
   PWORD:  IOWD STKSIZ,STACK       ;Stack pointer
   STACK:  BLOCK   STKSIZ          ;Stack
           END     START


   Figure 2-1:  Sample Program X.MAC


   Figure 2-2 is an annotated session debugging  X.MAC,  the  program  in
   Figure  2-1.  In the annotated session, the DDT terminal display is on
   the left, user input is in the center in  lowercase,  and  explanatory
   comments  about  the session are on the right.  This is not always the
   way it appears on the terminal.  Figure 2-3 shows the  session  as  it
   actually appears on the terminal.

   Note that DDT does not display the AC field of an instruction if it is
   zero.   This  means  that  if  your  program  contains the instruction
   MOVE R0,LABL1, where R0=0, DDT displays the instruction as MOVE LABL1.







                                    2-12
                          Getting Started with DDT


                                    NOTE

                  DDT does not  display  <LF>,  <RET>,  or
                  <TAB>.   These  are  shown in the sample
                  session to indicate user input.


   Screen Display            User Input        Explanation

   @                                       TOPS-20 prompt.

                            debug x<RET>   Begin the session by typing in
                                           "debug x<RET>", where x is the
                                           name of your MACRO program.

   MACRO:  X                               MACRO reassembles your program
   LINK:   Loading                         (if needed), and LINK loads
   [LNKDEB DDT execution]                  your program with DDT. DDT
   DDT                                     displays the "DDT" prompt.

                               start/      Begin examining code at
                                           label "START".

   MOVE P,PWORD#                           DDT displays the instruction
                                           at START. 

                               <LF>        Press <LF> to display the next
                                           instruction. 

   .JBDA+1/   MOVEI IDX,TABLE1#            The first symbol in this
                                           program happens to coincide
                                           with .JBDA, a JOBDAT symbol.
                                           When DDT scans the symbol
                                           table, it finds .JBDA before
                                           it finds START, and displays
                                           .JBDA instead.  DDT still
                                           accepts START as an input
                                           symbol.

                                           Also note the number sign
                                           appended to TABLE1 and
                                           PWORD. A number sign means
                                           that PWORD and TABLE1 are
                                           local symbols that are  not
                                           in the open symbol table.

                             .jbda<ESC>k   Type in  .jbda<ESC>k
                                           to suppress DDT typeout of
                                           symbol .JBDA.  DDT will
                                           display START rather than
                                           .JBDA from now on. See
                                           Chapter 7 (Manipulating
                                           Symbols is DDT) for more

                                    2-13
                          Getting Started with DDT


                                           information.

                               x<ESC>:     Type in the module name (X)
                                           followed by <ESC> and a
                                           colon to open the symbol
                                           table associated with
                                           X. DDT will not append any
                                           more number signs.

                               <TAB>       Press <TAB> to start a new
                                           display line, evaluate the
                                           current quantity as if it
                                           were an instruction, and
                                           display the contents of the
                                           location addressed by the Y
                                           field of the instruction.
                                           (Typing in / (slash) displays
                                           the same word as <TAB>, but
                                           does not start a new line.)
                                           <TAB> also saves your place
                                           (like a bookmark) on the
                                           location sequence stack, so
                                           you can get back here easily.

   TABLE1/   0                             When you type in the <TAB>
                                           command, DDT displays the
                                           address and the contents of
                                           the location.  The first
                                           element of the table contains
                                           zero. The <TAB> command also
                                           opens the location.

                               2<LF>       Type in "2" followed by <LF>
                                           to deposit the value "2" in 
                                           the first element, and to open
                                           and display the second 
                                           element.

   TABLE1+1/   0                           The second element contains
                                           zero.

                               3<LF>       Type in "3" followed by <LF>
                                           to deposit the value "3" in 
                                           the second element and open 
                                           and display the third element.
                                           The addition to be performed
                                           by the program is 2+3.

   TABLE1+2/   0                           The third element (the answer)
                                           contains zero.




                                    2-14
                          Getting Started with DDT


                               <ESC><RET>  Press <ESC>, then press <RET>
                                           to return to the address you
                                           saved on the location sequence
                                           stack with the <TAB> command,
                                           above.

   START+1/   MOVEI IDX,TABLE1             DDT displays the address and
                                           contents of the last location
                                           you displayed before you
                                           typed in <TAB>.

                               <LF>        Press <LF> to look at the 
                                           next location.

   START+2/   PUSHJ P,ADDEM                This is the call to the
                                           subroutine that does the
                                           computation.

                               .<ESC>b     Type in ".", press <ESC>, and
                                           type in "b" to set a
                                           breakpoint at the current
                                           location.

                               <ESC>g      Type in <ESC>g to start
                                           program execution.

   $1B>>START+2/   PUSHJ P,ADDEM           DDT displays the breakpoint
                                           number, the address of the
                                           breakpoint, and the
                                           instruction at the breakpoint.
                                           This instruction has not yet
                                           been executed.

                            <ESC><ESC>x    Press <ESC> twice, then
                                           type in "x" to let DDT
                                           execute the subroutine.

   START+3/   MOVEI IDX,TABLE1             DDT returns from the
                                           subroutine at the next
                                           instruction, and displays the
                                           address and contents of the
                                           instruction.  If there is a
                                           "skip return," DDT displays
                                           "<SKIP>" if the program
                                           skipped one instruction.  If
                                           the program skips 2 or 3
                                           instructions, DDT displays
                                           "<SKIP n>", where n is the
                                           number of instructions
                                           skipped.




                                    2-15
                          Getting Started with DDT


                               <ESC>x      Press <ESC> and type in "x"
                                           to execute the instruction.

      IDX/   TABLE1   TABLE1               DDT displays the address and
                                           contents of IDX (the result of
                                           executing the instruction),
                                           and also displays "TABLE1"
                                           (the result of evaluating the
                                           effective address of the
                                           instruction).

   START+4/   MOVE 2(IDX)                  DDT then starts a new line and
                                           displays the address and
                                           contents of the next
                                           instruction. Note that
                                           DDT does not display the
                                           zero in the AC field of
                                           the instruction.

                              <ESC><TAB>   Press <ESC>, then <TAB> to
                                           display the contents of the
                                           location addressed by the
                                           instruction, using any
                                           indexing and indirection.
                                           (If you omit <ESC>, DDT uses
                                           only the Y field, without
                                           indexing and indirection.)

   TABLE1+2/   0                           The location addressed by the
                                           instruction is TABLE1+2, which
                                           contains zero.  This is the 
                                           table element that contains 
                                           the answer, which should be 5.

                               <BKSP>      Press <BKSP> to see the 
                                           previous element in the table 
                                           (DDT echoes <BKSP> as ^H).

   TABLE1+1/   3                           This element contains 3.  That
                                           is correct.

                               <BKSP>      Press <BKSP> again to check 
                                           the previous element.

   TABLE1/   2                             This element contains 2.  That
                                           is also correct.  One way to
                                           find the error is to
                                           single-step through the
                                           program.





                                    2-16
                          Getting Started with DDT


                             start<ESC>b   Type in "start", press <ESC>,
                                           and type in "b" to set a
                                           breakpoint at the beginning of
                                           the program.

                               <ESC>g      Press <ESC> and type in "g" to
                                           start the program again.

   $2B>>START/   MOVE P,PWORD              DDT displays the breakpoint
                                           number, and the address and 
                                           contents of the instruction
                                           at the breakpoint.

                               <ESC>x      Press <ESC>, then type in "x" 
                                           to execute the instruction.
                                           This instruction moves a 
                                           memory word to a register.

      P/   -10,,PWORD   PWORD/   -10,,PWORD 

                                           DDT displays the address and
                                           new contents of the register,
                                           and the address and contents
                                           of the memory word.

   START+1/   MOVEI IDX,TABLE1             DDT then displays the address
                                           and contents of the next
                                           instruction.

                               <ESC>x      Press <ESC>, then type in "x" 
                                           to execute this instruction,
                                           which moves an immediate value
                                           to a register.

      IDX/   TABLE1   TABLE1               DDT displays the address and
                                           new contents of the register,
                                           and the immediate value.

   START+2/   PUSHJ P,ADDEM                DDT then displays the address
                                           and contents of the next
                                           instruction. Note that when
                                           you reach a breakpoint by
                                           single-stepping, DDT does not
                                           display the breakpoint number.

                               <ESC>x      Press <ESC>, then type in "x"
                                           to execute the instruction.

      P/   -7,,STACK                       DDT displays the address and
                                           new contents of the stack
                                           pointer used by the PUSHJ.



                                    2-17
                          Getting Started with DDT


   <JUMP>                                  DDT displays "<JUMP>" if the
                                           change in PC is less than one
                                           or greater than 4.

   ADDEM/   MOVE 0(IDX)                    DDT displays the address and
                                           contents of the next
                                           instruction to be executed.

                               <ESC>x      Press <ESC> and type in "x" to
                                           execute the instruction.

      0/   2   TABLE1/   2                 The instruction moved the
                                           contents of the word at 
                                           TABLE1 (which is 2) to AC0.

   ADDEM+1/   ADD 1(IDX)                   DDT displays the next
                                           instruction.  

                               <ESC>x      Press <ESC> and type in "x"
                                           to execute the instruction.

      0/   5   TABLE1+1/   3               The instruction added the
                                           contents of the word at 
                                           TABLE1+1 (which is 3) to AC0,
                                           which now contains 5.  OK.

   ADDEM+2/   MOVE 2(IDX)                  DDT displays the next
                                           instruction.

                               <ESC>x      Press <ESC> and type in "x"
                                           to execute the instruction.

      0/   0   TABLE1+2/   0               The instruction moved the
                                           contents of the word at 
                                           TABLE1+2 to AC0.  The MOVE
                                           instruction at ADDEM+2 should
                                           be MOVEM.

   ADDEM+3/   POPJ P,0                     DDT displays the next
                                           instruction (as a result of
                                           the <ESC>x).

                               <BKSP>      Press <BKSP> to display and
                                           open the location with the
                                           incorrect instruction.

   ADDEM+2/   MOVE 2(IDX)                  DDT displays the previous
                                           instruction.  This is the
                                           incorrect instruction.





                                    2-18
                          Getting Started with DDT


                      movem r0,answer(idx)<RET>

                                           Type in the new instruction
                                           and press <RET>.

                               ./          Check the current location
                                           to see what you deposited.

   MOVEM 2(IDX)                            Looks OK.

                               .<ESC>b     Set a breakpoint at 
                                           ".", the current location.

                               <ESC>g      Restart the program at
                                           the beginning.

   $2B>>START/   MOVE P,PWORD              DDT displays the breakpoint
                                           information.

                               <ESC>p      Press <ESC> and type in "p" to
                                           proceed from breakpoint 2
                                           to the next breakpoint.

   $1B>>START+2/   PUSHJ P,ADDEM           DDT displays the breakpoint
                                           information.

                               <ESC>p      Proceed from breakpoint 1.

   $3B>>ADDEM+2/   MOVEM 2(IDX)            DDT displays the breakpoint
                                           information.  This is the
                                           instruction you changed.

                               <ESC>x      Single-step the instruction
                                           to watch what it does.

      0/   5   TABLE1+2/   5               The instruction moves the
                                           contents of AC0 to the word
                                           at TABLE1+2.  OK!!

   ADDEM+3/   POPJ P,0                     DDT also displays the address
                                           and contents of the next 
                                           instruction.

                           start+4<ESC>b   Set a breakpoint at
                                           START+4 to check the results.

                               <ESC>p      Proceed from breakpoint 3.

   $4B>>START+4/   MOVE 2(IDX)             DDT displays the breakpoint
                                           information.




                                    2-19
                          Getting Started with DDT


                               <ESC>x      Single-step the instruction.

      0/   5   TABLE1+2/   5               The instruction moves the
                                           contents of the word at
                                           TABLE1+2 to AC0.  The new
                                           value of AC0 is 5.  OK!

   START+5/   JFCL 0                       DDT displays the address and
                                           contents of the next
                                           instruction.

                               <CTRL/Z>    Quit.

   @                                       You are now back at TOPS-20
                                           command level.


   Figure 2-2:  Annotated Debugging Session


   Figure 2-3 shows the session as it actually appears on  the  terminal.
   Again,  user  input  is  in lowercase.  Comments on the right indicate
   where you type in characters that do not echo.































                                    2-20
                          Getting Started with DDT


   @debug x
   MACRO:  X
   LINK:   Loading
   [LNKDEB DDT execution]
   DDT
   start/   MOVE P,PWORD#                             Type in <LF>.
   .JBDA+1/   MOVEI IDX,TABLE1   .jbda$k   x$:        Type in <TAB>.
   TABLE1/   0   2                                    Type in <LF>.
   TABLE1+1/   0   3                                  Type in <LF>.
   TABLE1+2/   0   $                                  Type in <ESC><RET>.
   START+1/   MOVEI IDX,TABLE1                        Type in <LF>.
   START+2/   PUSHJ P,ADDEM   .$b   $g
   $1B>>START+2/   PUSHJ P,ADDEM   $$x
   START+3/   MOVEI IDX,TABLE1   $x
      IDX/   TABLE1   TABLE1
   START+4/   MOVE 2(IDX)   $                         Type in <ESC><TAB>.
   TABLE1+2/   0   ^H                                 Type in <BKSP>.
   TABLE1+1/   3   ^H                                 Type in <BKSP>.
   TABLE1/   2   start$b   $g
   $2B>>START/   MOVE P,PWORD   $x
      P/   -10,,PWORD   PWORD/   -10,,PWORD           
   START+1/   MOVEI IDX,TABLE1   $x
      IDX/   TABLE1   TABLE1
   START+2/   PUSHJ P,ADDEM   $x
      P/   -7,,STACK
   <JUMP>
   ADDEM/   MOVE 0(IDX)   $x
      0/   2   TABLE1/   2
   ADDEM+1/   ADD 1(IDX)   $x
      0/   5   TABLE1+1/   3
   ADDEM+2/   MOVE 2(IDX)   $x
      0/   0   TABLE1+2/   0
   ADDEM+3/   POPJ P,0   ^H                           Type in <BKSP>.
   ADDEM+2/   MOVE 2(IDX)   movem r0,answer(idx)      Type in <RET>.
   ./   MOVEM 2(IDX)   .$b   $g
   $2B>>START/   MOVE P,PWORD   $p
   $1B>>START+2/   PUSHJ P,ADDEM   $p
   $3B>>ADDEM+2/   MOVEM 2(IDX)   $x
      0/   5   TABLE1+2/   5
   ADDEM+3/   POPJ P,0   start+4$b   $p
   $4B>>START+4/   MOVE 2(IDX)   $x
      0/   5   TABLE1+2/   5
   START+5/   JFCL 0   ^Z
   @


   Figure 2-3:  Terminal Display of Debugging Session







                                    2-21
                          Getting Started with DDT


   2.5  PROGRAMMING WITH DDT IN MIND

   There are a few MACRO-20 programming techniques  that  make  debugging
   with DDT easier.  These techniques primarily concern the use of labels
   and symbols.


   Labels that  meaningfully  describe  (perhaps  mnemonically,  such  as
   GETCHR  for "get character") the function of the code are more helpful
   when examining code and  setting  breakpoints  than  labels  that  are
   alphanumerically coded (such as A0001).


   When using symbols as offsets into tables, you can  prevent  DDT  from
   displaying the offset symbol in place of the symbol's numeric value if
   you define the symbol in this way:

        symbol==expression

   The symbol table still contains symbol, and  you  can  use  symbol  as
   input to DDT, but DDT does not display symbol on output.

   For example, if you have defined:

        OFFSET==3

   DDT displays the contents of a word that contains the value of 3 as:

        addr/   3

   rather than:

        addr/   OFFSET

   where addr is the address  of  the  word.   See  the  MACRO  Assembler
   Reference Manual for more information about defining symbols.


















                                    2-22











                                 CHAPTER 3

                             DDT COMMAND FORMAT



   3.1  COMMAND SYNTAX

   The complete syntax of a DDT command is:


        {arg1<}{arg2>}{arg3}{<ESC>{<ESC>}{arg4}}c{arg5}


   where arg1, arg2, arg3, arg4, and arg5 are arguments to the command c;
   arg1,  arg2,  and  arg3 can be any legal DDT expression;  arg1 must be
   followed by a left angle bracket (<), and arg2 must be followed  by  a
   right  angle  bracket (>);  arg4 can only be a number;  arg5 is a text
   argument of the form:

        /text/     or     c<ESC>

   where text is a string of characters (not beginning with  <ESC>),  the
   slashes  (/) are delimiters that can be any character not contained in
   text, and c is a single character.

   DDT commands never use all five arguments.  Each argument is  optional
   or required according to the syntax of the specific command.  Most DDT
   commands are as simple as:

           arg3<ESC>c     or     arg3<ESC>arg4c


   You can enter alphabetic commands and text arguments in  uppercase  or
   lowercase.

   An argument to a command  can  be  the  result  of  executing  another
   command.   For  example,  you  can  enter a command to evaluate a text
   string, and then enter another command to deposit in memory the result
   of the evaluation.  The entire command line would be:

           "/abcd/<RET>

   where /abcd/ is the argument to the command " (quotation  mark).   The

                                    3-1
                             DDT Command Format


   function  of  the  quotation  mark  command  is to evaluate the string
   (abcd) within the delimiters (/) as  a  left-justified  ASCII  string.
   The  left-justified  ASCII  string  abcd  is  then the argument to the
   command <RET> (entered by pressing the RETURN key).  The  function  of
   the  <RET> command is to deposit an argument (in this case, the string
   abcd) into the open location.  The "  command  is  described  in  this
   chapter,  and  the <RET> command is described in Chapter 4 (Displaying
   and Modifying Memory).


   Most commands produce  results  that  are  immediately  visible;   for
   example,  commands  that  display  the  contents  of memory locations.
   However, commands such  as  those  that  invoke  search  functions  or
   execute  a  range  of instructions may not produce immediately visible
   results.  If you enter a question mark (?) while DDT is  performing  a
   function invoked by one of these commands, DDT displays a message that
   tells you what it is currently doing.  For  example,  such  a  message
   might be:

           Searching: ADDR/   VALUE

   where ADDR is the address that DDT is  to  next  test  as  part  of  a
   search,  and  VALUE  is  the  contents of the memory location at ADDR.
   Still other commands return values that DDT does not display, but  can
   use as arguments to other commands.



   3.2  INPUT TO DDT

   You enter arguments to DDT as expressions.  An  expression  can  be  a
   single  value, or a combination of one or more values with one or more
   operators.



   3.2.1  Values in DDT Expressions

   Values in DDT expressions can be:

         o  octal or decimal integers

         o  floating point numbers

         o  symbols

         o  values that are returned by commands

         o  text


   To enter an octal integer value, simply enter  the  integer  in  octal
   digits.  For example:

                                    3-2
                             DDT Command Format


           70707065


   To enter a decimal integer value, enter the integer in decimal  digits
   and follow the value with a decimal point.  For example:

           9876.


   To enter a floating point number, use regular or scientific  notation.
   For example, you can enter the value .034 as one of the following:

                  .034
                  3.4E-2

   Note that 1.  is a decimal integer, while  1.0  is  a  floating  point
   number.


   To enter a symbol as a value in an expression, type in the symbol name
   as defined in your program.  To enter an undefined symbol that you can
   define later, enter

        symbol#

   where symbol is the symbol that you will later define.  See Chapter  7
   (Manipulating  Symbols  in  DDT)  for  more  information  about  using
   undefined symbols.


   You can enter a command  that  returns  a  value  as  a  value  in  an
   expression.   DDT  commands  that  return  values, and the values they
   return are listed in Table 3-1.





















                                    3-3
                             DDT Command Format


                  Table 3-1:  Commands That Return Values



       Command                  Value Returned               Value Also
                                                              Known As

          .        The address of the current location.           .

        <ESC>.     The  address  of  the next user program       $.
                   instruction to be executed.

     <ESC><ESC>.   The previous value of "<ESC>.".               $$.

       <ESC>nB     The  address  of  the DDT location that       $nB
                   contains the address of breakpoint n.

       <ESC>nI     The  address  of  the DDT location that
                   contains the saved machine state  flags
                   (user-program context).

       <ESC>nM     The address of DDT "mask" n.

        <ESC>Q     The current quantity.                         $Q

     <ESC><ESC>Q   The   current   quantity,  with  halves       $$Q
                   swapped.

       <ESC>nU     The  address  of  the DDT location that
                   contains the argument (or default) that
                   was given  in  the  virtual  addressing
                   command: expr<ESC>nU.



   The commands <ESC>nB, <ESC>nI, <ESC>nM, and <ESC>nU (<ESC>nU is  legal
   only  in  EDDT, KDDT and FILDDT), return values that are the addresses
   of locations internal to DDT, which contain information that  you  can
   use and modify.  For brevity, these commands are said to address those
   internal DDT locations.

   For example, the command <ESC>nB returns (but does  not  display)  the
   address of the DDT location that contains the address of breakpoint n,
   and the  command  addr/  (address  followed  by  slash)  displays  the
   contents  of  the  location  at  addr.   To  display  the  address  of
   breakpoint n, enter

        <ESC>nB/

   where you enter the command <ESC>nB  as  the  expression  for  DDT  to
   evaluate as addr.



                                    3-4
                             DDT Command Format


   You can enter text to be interpreted in the following ways:

         o  left-justified text strings of byte-size n, where 6<=n<=9

         o  left-justified 7-bit ASCII strings

         o  left-justified SIXBIT strings

         o  single right-justified text characters of byte-size n,  where
            6<=n<=9

         o  single right-justified 7-bit ASCII characters

         o  single right-justified SIXBIT characters

         o  Radix-50 words


   You can  enter  text  expressions  in  uppercase  or  lowercase.   DDT
   translates  strings  to  uppercase  for  SIXBIT  or  Radix-50  text as
   required.


   The term long text string refers to an expression  in  a  DDT  command
   that is a string of text characters that requires more than one 36-bit
   expression for full evaluation.  You can enter long  text  strings  in
   SIXBIT and ASCII as DDT expressions.  If you use a long text string as
   an expression, DDT assumes that you will enter a command that deposits
   the expression in memory.

   DDT evaluates the string one  36-bit  expression  at  a  time.   After
   evaluating the first 36-bit expression, DDT deposits the expression in
   the open location, closes  the  open  location,  and  opens  the  next
   location.

   DDT then evaluates the next 36-bit expression contained in the string,
   and deposits that expression in the (new) open location.  This process
   continues until you enter c, the command.  If you enter a command that
   does  deposit  to  memory, DDT deposits the final 36-bit expression in
   the open location, and updates the location counter according  to  the
   rules  of  that  particular command.  The current quantity is the last
   36-bit expression that DDT evaluated.

   If you do not enter a command that deposits to memory,  DDT  uses,  as
   the  argument  to  the  command,  the  36-bit expression that was last
   evaluated.  All other 36-bit expressions that were evaluated  as  part
   of  the string have been deposited, and the current and open locations
   were updated accordingly.  The  current  quantity  is  then  the  last
   36-bit expression that DDT evaluated.

   If there is no open location when  you  begin  typing  the  long  text
   string,  DDT  evaluates  only the first 36-bit expression, ignores the
   rest of the string, and  uses  the  first  36-bit  expression  as  the

                                    3-5
                             DDT Command Format


   argument  to  the  command.   The  current  quantity is then the first
   36-bit expression that DDT evaluated in the string.  If  you  enter  a
   command that deposits to memory, it has no effect because there was no
   open location.


   The syntax to enter a left-justified text string with bytes of size  n
   is:

        <ESC>n"/text/

   where 6<=n<=9 (default = 6), text is the string, and the  slashes  (/)
   represent  any  printing  character that is not contained within text.
   DDT evaluates the string as a series of 36-bit expressions,  in  n-bit
   ASCII   format   with   all  unused  bits  zero.   Each  character  is
   right-justified  within  the  byte;    each   string   of   bytes   is
   left-justified within the 36-bit expression.  No expression contains a
   partial byte.  If n = 6, DDT evaluates the  text  string  as  for  the
   command to enter a SIXBIT string (<ESC>"/text/), below.  If n = 7, DDT
   evaluates the text string as for the command to enter  a  7-bit  ASCII
   string ("/text/), below.

   For example, if you enter

        <ESC>8"+abc/def+

   DDT evaluates one 36-bit expression as the 8-bit ASCII string abc/  in
   bits  0-31,  and  bits  32-35 zero.  If there is no open location, DDT
   uses that  expression  as  the  argument  to  the  command,  and  that
   expression becomes the current quantity.

   If there is an open location, DDT deposits abc/ in the open  location,
   closes  it, and opens the next location in memory.  DDT then evaluates
   a second 36-bit expression as the 8-bit ASCII string def in bits 0-23,
   and bits 24-35 zero.  The last 36-bit expression evaluated becomes the
   current quantity.


                                    NOTE

                  You cannot use this format  to  enter  a
                  string   that  begins  with  the  ESCAPE
                  character, because <ESC> terminates  the
                  command    that    enters    a    single
                  right-justified n-bit character (in this
                  case, your intended delimiter).


   For compatibility with previous versions of DDT, you can enter a 7-bit
   ASCII string with the command:

        "/text/


                                    3-6
                             DDT Command Format


   where text is the string, and the slashes (/) represent  any  printing
   character that is not contained within text.  DDT evaluates the string
   as a  series  of  36-bit  expressions,  each  in  7-bit  ASCII  format
   (left-justified), with all unused bits zero.

   For example, if you enter

        "+abc/def+

   DDT evaluates one 36-bit expression as the 7-bit ASCII string abc/d in
   bits  0-34,  and  bit 35 zero.  If there is no open location, DDT uses
   that expression as the argument to the command,  and  that  expression
   becomes the current quantity.

   If there is an open location, DDT deposits abc/d in the open location,
   closes  it, and opens the next location in memory.  DDT then evaluates
   a second 36-bit expression as the 7-bit ASCII string ef in bits  0-13,
   and bits 14-35 zero.  The last 36-bit expression evaluated becomes the
   current quantity.


                                    NOTE

                  You cannot use this format to  enter  an
                  ASCII string that begins with the ESCAPE
                  character, because <ESC> terminates  the
                  command    that    enters    a    single
                  right-justified ASCII character (in this
                  case, your intended delimiter).


   For compatibility with previous versions  of  DDT,  you  can  enter  a
   SIXBIT string with the command:

                  <ESC>"/text/

   where text is the string, and the slashes (/) represent  any  printing
   character that is not contained within text.  DDT evaluates the string
   as  a  series  of  36-bit   expressions,   each   in   SIXBIT   format
   (left-justified),  with  any unused bits in the last 36-bit expression
   cleared (zero).  DDT translates  lowercase  characters  to  uppercase;
   all  other  non-SIXBIT  characters  cause  DDT  to sound your terminal
   buzzer or bell and display a question mark.

   For example, if you enter

        <ESC>">qwertyu>

   DDT evaluates one 36-bit expression as the  SIXBIT  string  QWERTY  in
   bits  0-35.  If there is no open location, DDT uses that expression as
   the argument to the command, and that expression becomes  the  current
   quantity.


                                    3-7
                             DDT Command Format


   If there is  an  open  location,  DDT  deposits  QWERTY  in  the  open
   location,  closes it, and opens the next location in memory.  DDT then
   evaluates a second 36-bit expression as the SIXBIT character U in bits
   0-5,  with  bits  6-35  zero.   The  last  36-bit expression evaluated
   becomes the current quantity.


   The syntax to enter a right-justified character of byte size n is:

        <ESC>n"c<ESC>

   where 6<=n<=9 (default = 6), and c is the character.

   If n = 6, this command  functions  as  for  the  command  to  enter  a
   right-justified   SIXBIT   character  (<ESC>"c<ESC>),  otherwise  this
   command functions as for the command to enter a right-justified  7-bit
   ASCII character ("c<ESC>).  These commands are described below.


   For compatibility with previous versions  of  DDT,  you  can  enter  a
   right-justified 7-bit ASCII character with the command:

        "c<ESC>

   where c is the character.  DDT evaluates this as one 36-bit expression
   with the 7-bit ASCII character c in bits 29-35, and bits 0-28 zero.


   For compatibility with previous versions  of  DDT,  you  can  enter  a
   right-justified SIXBIT character with the command:

        <ESC>"c<ESC>

   where c is the character.  DDT evaluates one  36-bit  expression  with
   the  SIXBIT  character  c  in  bits  30-35,  and  bits 0-29 zero.  DDT
   translates lowercase characters to uppercase;   all  other  non-SIXBIT
   characters cause DDT to sound your terminal buzzer or bell and display
   a question mark.


   The syntax to enter a Radix-50 word is:

        text<ESC>5"

   where text is any string of Radix-50 characters up to  six  characters
   long.   DDT  evaluates  one  36-bit  expression  with bits 0-3 cleared
   (zero) and the Radix-50 string text in bits  4-35.   DDT  ignores  any
   characters in text after the sixth.






                                    3-8
                             DDT Command Format


   For example, if you enter

        poiuytr<ESC>5"

   DDT evaluates one 36-bit expression with bits 0-3 cleared  (zero)  and
   the Radix-50 string POIUYT in bits 4-35.  DDT ignores the character r.
   DDT translates lowercase characters to uppercase.  If a  character  in
   text  is  not  in the Radix-50 character set but is a DDT command, DDT
   tries to execute the  command.   DDT  uses,  as  an  argument  to  the
   command,  the  characters  in  text  that  precede  or  follow  it, as
   appropriate to the command.  If DDT cannot  execute  the  command,  it
   will  sound  your terminal buzzer or bell, and display the appropriate
   error message.  If DDT can execute the command, it is possible that  a
   Radix-50  evaluation  of some remaining characters can take place, but
   the results will not be what you intend.

   Characters in text not in the Radix-50 character set that are not  DDT
   commands cause DDT to sound your terminal buzzer or bell and display a
   question mark.



   3.2.2  Operators in DDT Expressions

   When you enter an expression, DDT evaluates the expression to create a
   36-bit  quantity  but  does  not  necessarily  use all 36 bits when it
   executes the command.  For example, you can  enter  a  complete  MACRO
   instruction  when  giving  an  argument  to a command that requires an
   address, but DDT uses only the address specified  by  the  instruction
   (and  ignores  the  rest of the evaluated expression) when it executes
   the command.

   Table 3-2 lists DDT's  expression  operators  and  the  effects  those
   operators produce on the evaluation.  The term value so far represents
   the  accumulated  36-bit  value  resulting  from  evaluation  of   the
   expression to that point.


















                                    3-9
                             DDT Command Format


        Table 3-2:  Effects of Operators When Evaluating Expressions



         Operator                    Effect on Evaluation

            +          Adds the 36-bit value on the left to the  36-bit
                       value  on  the  right,  using  two's  complement
                       addition.

            -          Subtracts the 36-bit value on the right from the
                       36-bit value on the left, using two's complement
                       subtraction.

            *          Multiplies  the  36-bit value on the left by the
                       36-bit   value   on   the  right,  using  PDP-10
                       full-word integer multiplication. DDT uses  only
                       the low-order 36 bits of the result.

      ' (apostrophe)   Divides  the  36-bit  value  on  the left by the
                       36-bit   value   on   the  right,  using  PDP-10
                       full-word  integer  division.  DDT  ignores  any
                       remainder.


                                            NOTE

                            Apostrophe   is   DDT's    division
                            operator.    /  (slash)  is  a  DDT
                            command to examine memory,  and  is
                            never   used  in  DDT  to  indicate
                            division.


          space        Adds  the  previous  expression   (normally   an
                       opcode)  to  the  value  so  far,  and  adds the
                       low-order 18 bits of the value at the  right  of
                       the space to the low-order 18 bits of the  value
                       so far. DDT ignores carries resulting  from  the
                       addition,  and  does not change the left half of
                       the value so far.













                                    3-10
                             DDT Command Format


    Table 3-2 (Cont.): Effects of Operators When Evaluating Expressions



        , (comma)      If you are  entering  an  I/O  instruction,  DDT
                       shifts the low-order 18 bits of  the  expression
                       at the left of the comma 26 bits to the left (to
                       the  device field of the instruction), otherwise
                       DDT  shifts  the  low-order  18  bits   of   the
                       expression at the left of the comma 23  bits  to
                       the left (to the A field of an instruction). DDT
                       then  logically ORs the result into the value so
                       far.


                                             NOTE

                            DDT  does  not  check  whether  the
                            value at the left of the comma is a
                            legitimate device  or  AC  address,
                            and  may  overwrite  other parts of
                            the instruction.


     ,, (two commas)   Moves the low-order bits of  the  expression  at
                       the left of the commas to bits 0-17, and  builds
                       a new 18-bit expression in bits 18-35.


            ()         Swaps the halves of the  expression  within  the
                       parentheses and adds the resulting expression to
                       the  value  so  far.  This  makes it possible to
                       enter   an   instruction   that  uses  an  index
                       register.


                                             NOTE

                            DDT  does  not  check  whether  the
                            value  within  the parentheses is a
                            legitimate  AC  address,  and   may
                            overwrite   other   parts   of  the
                            instruction.


            @          Assumes  the  expression  is  an instruction and
                       sets the indirect bit (bit 13) of the  value  so
                       far.






                                    3-11
                             DDT Command Format


   The  nonarithmetic  operators  allow  you  to  enter  expressions   in
   instruction format as well as as in data format.


   To enter an instruction, format the instruction  as  you  would  in  a
   MACRO-20 program.  For example:

        MOVE R4,@VAR1+OFFSET(R5)


                                    NOTE

                  Follow an opcode (such as MOVE)  with  a
                  space, not a <TAB>.


   To enter halfwords, enter the values (numbers or symbols) separated by
   two  commas  (,,).   The halfwords can be symbolic or absolute values.
   For example:

        -1,,SYM1


                                    NOTE

                  DDT  is   not   designed   to   evaluate
                  complicated arithmetic expressions.  The
                  nonarithmetic operators are  implemented
                  to  enable  DDT  to evaluate expressions
                  you enter as MACRO-20  instructions  and
                  halfwords.   Using  values and operators
                  for other purposes may not  produce  the
                  results you intend.





















                                    3-12











                                 CHAPTER 4

                      DISPLAYING AND MODIFYING MEMORY



   4.1  DISPLAY MODES

   A major function of DDT is displaying the contents  of  memory  words,
   both  data  and  instructions.   You can choose whether to display the
   contents of memory words as symbols or as  numeric  values.   You  can
   also select the radix in which DDT displays numeric values.

   DDT displays symbols, labels, and most messages in uppercase.



   4.1.1  Default Display Modes

   There is no sure way for DDT to distinguish  between  instruction  and
   data words, or between data words of different formats.

   DDT displays memory words in symbolic mode by default.  Symbolic  mode
   is  described  in Table 4-1.  DDT tests for the condition on the left,
   and if the condition is met, displays the word in the format described
   on  the  right.   DDT  performs the tests in descending order (as they
   appear in the table).


















                                    4-1
                      Displaying and Modifying Memory


              Table 4-1:  Evaluation of Symbolic Display Mode



                Condition                DDT Displays        Example

     Bits 0-18 are all set.           A  negative number       -45
                                      in   the   current
                                      radix.

     The 36-bit value is defined in   The symbol.             SYMBL1
     the user program symbol table.                            HALT

     The opcode field is zero.        Halfwords.             345,,-27

     The  opcode  and  I,  X, and Y   The OPDEF.             CORE 6,
     fields, or the  opcode  and  A
     fields match an OPDEF  in  the
     user program symbol table.

     The    opcode    matches     a   The instruction.     MOVE 3,SYMBL
     definition in  DDT's  internal
     hardware instruction table.

     No match.                        Halfwords.            3445,,-23



   By default, DDT displays numeric values in octal.  Leading  zeros  are
   always suppressed.



   4.1.2  Selecting Display Modes

   You can select display modes to control:

         o  the format in which DDT tries to interpret  the  contents  of
            memory  locations;   for  example,  as  instructions,  or  as
            floating-point numbers.

         o  whether  addresses  are  displayed  as  symbolic  or  numeric
            values.

         o  the radix in which numeric values are displayed.

   In addition, you can specify these modes on  a  short-term  (temporary
   mode) or long-term (prevailing mode) basis.

   A prevailing display mode remains in effect until you  select  another
   prevailing  mode,  but may be overridden by a temporary mode until you
   enter a command  that  restores  the  prevailing  display  mode.   DDT
   commands that restore the prevailing display mode are:

                                    4-2
                      Displaying and Modifying Memory


         o  {expr}<RET>               (deposit expr and close location)

         o  <ESC>G                    (start program execution)

         o  <ESC>P                    (proceed from a breakpoint)

         o  <ESC>W, <ESC>E, <ESC>N    (perform a search)

         o  <ESC>Z                    (zero memory)

         o  instr<ESC>X               (execute instr)

         o  <ESC>V                    (watch a location)


   The syntax of commands that set the prevailing mode is:

        <ESC><ESC>mode

   where mode is one of the display modes shown in Table 4-2.


   The syntax of commands that set a temporary mode is:

        <ESC>mode

   where mode is one of the display modes shown in Table 4-2.


   The current display mode is the  mode  (prevailing  or  temporary)  in
   which  DDT  will  display the next word (unless you enter a command to
   change the display mode).


   DDT has two "masks" that control the action  of  two  of  the  display
   modes.

   <ESC>3M is a command that addresses a DDT location that  contains  the
   output  byte  size mask.  When the current display mode is O, each bit
   that is set in the mask indicates the position of a low order bit of a
   byte  in  the  word  being  displayed.  In this mode, bit 35 is always
   assumed to be  set.   For  example,  if  the  output  byte  size  mask
   contains:

        510410100400  (octal)

   the byte sizes specified are, from left to right, 1, 2, 3, 4, 5, 6, 7,
   and 8.  When displaying a word in O mode that contains 777777,,777777,
   and the current radix is 8, DDT displays:

        1,3,7,17,37,77,177,377

   The default value of the output byte size mask is zero, specifying one

                                    4-3
                      Displaying and Modifying Memory


   36-bit byte.

   You can set the output byte size mask with the command:

        expr<ESC>3M

   where expr evaluates to the bit pattern required.

   You can also examine and change the output byte  size  mask  with  the
   examine  and  deposit  commands described later in this chapter.  This
   manual uses the symbol $3M to refer  to  the  mask  addressed  by  the
   command <ESC>3M.


   <ESC>2M is a command that addresses a DDT location that  contains  the
   maximum  symbolic  offset.  When DDT displays an address in R(elative)
   mode, it displays the address symbolically, that is, as a  symbol,  or
   as a symbol + the numeric offset of the address from that symbol.  The
   maximum symbolic  offset  (minus  1)  determines  the  maximum  offset
   address  that DDT displays symbolically, and defaults to 1000 (octal).
   DDT displays addresses beyond that offset  in  A(bsolute)  mode.   For
   example,  assume  that  the maximum symbolic offset is 2, and that you
   are examining subroutine ADDEM in program X.MAC (refer to Figure 2-1),
   using <LF> to display instructions in sequence.  DDT displays:

        ADDEM/   MOVE 0(6)
        ADDEM+1/   ADD 1(6)
        addr/   MOVE 2(6)

   where addr is  the  absolute  address  (for  example,  14414)  of  the
   location.

   You can set the maximum symbolic offset with the command:

        expr<ESC>2M

   where expr evaluates to the offset required.   This  manual  uses  the
   symbol $2M to refer to the mask addressed by the command <ESC>2M.

   You can also examine and change the maximum symbolic offset  with  the
   examine and deposit commands described later in this chapter.


   DDT display modes and the commands that select them are  described  in
   Table 4-2.









                                    4-4
                      Displaying and Modifying Memory


                       Table 4-2:  DDT Display Modes



                                Format Modes

        Mode                              Effect

          C       Displays  memory word as numbers in the current radix
                  (see Radix Modes).

          F       Displays memory word  as  a  floating  point  decimal
                  number.

         2F       Displays two contiguous  memory  words  as  a  double
                  precision floating point decimal number.

          H       Displays memory word as two halfword  addresses  (see
                  Address Modes) separated by two commas (,,).

          O       Displays  memory  word as numeric bytes of sizes that
                  are specified by the $3M mask.


         nO       Displays   memory   word   as   n-bit  numeric  bytes
                  (left-justified, with  trailing  remainder  byte,  as
                  required).

          S       Displays memory word in symbolic mode (default).

         1S       Searches  DDT's internal hardware opcode table before
                  searching  the user's symbol table, otherwise follows
                  rules for S (symbolic) mode.

         1T       Displays memory word(s) as a byte  pointer  (one-word
                  local, one-word global, or two-word byte pointer,  as
                  specified by the byte pointer format).

         nT       Displays memory word as ASCII text, using n-bit bytes
                  (5<=n<=9).


                     n=5: RADIX50

                     n=6: SIXBIT

                     n=7: 7-bit ASCII (1),(2)

                     n=8: 8-bit ASCII (1)

                     n=9: 9-bit ASCII (1)



                                    4-5
                      Displaying and Modifying Memory


                    Table 4-2 (Cont.): DDT Display Modes



                                Address Modes

        Mode                              Effect

          A       Displays addresses as absolute values in the  current
                  radix.

          R       Displays  addresses  as  values  relative  to symbols
                  (default). DDT displays the offsets  in  the  current
                  radix.  The maximum offset is controlled by the value
                  stored in the $2M mask, and defaults to 1000 (octal).


                                 Radix Modes

        Mode                              Effect

         nR       Displays numeric values in radix n (default=8), where
                  n  is  a  decimal  number greater than 1. If n=8, DDT
                  displays the word as octal halfwords,  otherwise  DDT
                  displays  the  word as one number. If n=10 (decimal),
                  DDT displays a decimal point after the value.


     (1) Characters are right-justified within  the  byte;   bytes  are
          left-justified within the word.

     (2) If bit 35 is set, DDT displays  @  immediately  following  the
          five 7-bit ASCII characters.



   4.2  DISPLAYING EXPRESSIONS

   DDT has three commands you can use to display expressions in different
   modes.  They are:

            ; (semicolon)

            = (equal sign)

            _ (underscore)


   The syntax of these commands is:

        {expr}c

   where expr is the expression to be displayed  (expr  defaults  to  the

                                    4-6
                      Displaying and Modifying Memory


   current quantity), and c is one of the above commands.  These commands
   are useful for redisplaying the current quantity without affecting the
   current  display  mode.   Table  4-3  lists  the  commands  to display
   expressions and their effects.




                Table 4-3:  Commands to Display Expressions



       Command                            Effect

          ;       Displays the current quantity in the current  display
                  mode.

        expr;     Displays expr in the current display mode.

          =       Displays  the  current  quantity  as  a number in the
                  current radix.

        expr=     Displays expr as a number in the current radix.

          _       Displays the current quantity in 1S mode.

        expr_     Displays expr in 1S mode.



   4.3  DISPLAYING BYTE POINTERS

   If you set the display mode to 1T, DDT displays the  contents  of  the
   memory  location  as  a byte pointer.  DDT can display one-word local,
   one-word global, and two-word byte pointers.  DDT displays the P and S
   fields, and the address as determined by the I, X, and Y fields of the
   byte pointer.

   In section zero, DDT displays only one-word byte pointers  (local  and
   global).

   For example, if the contents of the location at ADDR2 is 100702,,addr,
   where  addr  is  the  value of symbol LABL2, the following illustrates
   one-word local byte pointer display:

        addr2/   100702,,addr   <ESC>1t;   10 7 LABL2(2)


   The following illustrates one-word global byte pointer display,  where
   addr is the value of symbol LABL2:

        1,,addr2/   610002,,LABL2   <ESC>1t;   44&7 2,,LABL2


                                    4-7
                      Displaying and Modifying Memory


   The following illustrates two-word global byte pointer display,  where
   addr is the value of symbol LABL2 (DDT echoes <BKSP> as ^H):

        1,,addr2/   440740,,0   <LF>
        1,,addr2+1/   3,,addr   <ESC>1t^H
        1,,addr2/   44 7 3,,MAIN. <2>



   4.4  DISPLAYING AND DEPOSITING IN MEMORY

   DDT allows you to display the contents of memory locations and deposit
   a  new value in the open location.  In performing these functions, you
   must  understand  the  concept  of  the  open  location,  the  current
   location, the location sequence stack, and the current quantity.


   The open location is a memory location (or AC) that can be modified by
   the  next  command.   There  is never more than one location open at a
   time.  DDT always closes the open location before opening another.


   The location counter contains the address of a word in memory that has
   been  referenced  (implicitly  or explicitly) by the previous command,
   and that is the default point of reference for the next command.  That
   word  is  known  as the current location.  DDT uses the address of the
   current location as the default address in most commands.  The current
   location is often, but not always, the open location.

   Most DDT commands change the current location to a word  specified  by
   an  address given (explicitly or by default) in the command.  Commands
   that do not are so indicated.

   "." (period) is a command that returns  (but  does  not  display)  the
   address of the current location.

   When you first enter DDT, the current location is zero.


   The location sequence stack is  a  "ring"  of  seventeen  words,  each
   containing  the  address  of  a  prior current location, or of a match
   found during a search.  The present value of the current  location  is
   not placed in the ring.

   Entries are made to and retrieved from the location sequence stack  in
   a  last-in,  first-out manner.  Most commands that change the location
   counter by values other than +1 and -1 cause DDT to place the  address
   of  the  current location (before the change) on the location sequence
   stack.  Addresses of matching locations found during searches are also
   placed on the location sequence stack.  When DDT enters a new value in
   the next word on the stack, the new value becomes the current location
   stack entry.  This is similar to PUSHing entries on a stack.  When the
   current location stack entry is the  last  location  on  the  location

                                    4-8
                      Displaying and Modifying Memory


   sequence  stack,  DDT  enters  a  new  value on the stack by "wrapping
   around" to the beginning of the stack and overwriting the value in the
   first  location  on  the  stack.  The first location on the stack then
   contains the current location stack entry.

   Certain DDT commands change the address of the current location to the
   current  location  stack  entry,  and then change the current location
   stack entry to the previous entry.  This is similar to POPping entries
   off  a  stack,  and  allows  you  to  "return"  to locations that have
   previously been the current location.  When the first location on  the
   location  sequence stack contains the current location stack entry and
   DDT changes the  address  of  the  current  location  to  the  current
   location  stack entry, DDT "wraps around" to the end of the stack, and
   the value contained in the last word of the stack becomes the  current
   location stack entry (whether or not the stack was previously "full").


   The current quantity is a value that is the most recent of:

         o  the last 36-bit quantity that DDT displayed (an expression or
            the contents of a memory location)

         o  the last expression that you entered  as  an  argument  to  a
            command that deposits to memory

   This value is also known as the last value typed.  <ESC>Q is a command
   that  returns (but does not display) the current quantity.  DDT issues
   an implicit <ESC>Q to  return  this  value  for  use  as  the  default
   argument for some commands.

   You can give the current quantity as  an  argument  to  a  command  by
   entering the command <ESC>Q as the argument.

   The command <ESC><ESC>Q returns the current quantity  with  the  right
   and left halves swapped.

   This manual uses the term $Q to refer to the value that is returned by
   the  command  <ESC>Q,  and  the term $$Q to refer to the value that is
   returned by the command <ESC><ESC>Q.


   Some commands calculate the address of the location to be opened  from
   an  expression  given or defaulted in the command.  Other commands use
   the address of  the  current  location  or  entries  on  the  location
   sequence stack.

   The general syntax of these commands is:

        {expr}{<ESC>}c

   where expr is any legal DDT expression, and c  is  the  command.   See
   Section  3.2.1,  Values  in  DDT Expressions, for a discussion of long
   text strings as values in DDT expressions.

                                    4-9
                      Displaying and Modifying Memory


   Table  4-4  summarizes  the  commands  and  their  effects.   Complete
   descriptions of the commands follow the table.


                 Table 4-4:  DDT Commands to Display Memory



     Command   Display     Mode      Open    Change   Deposit     Use
               Content      of        the      "."      Expr    Loc/Seq
                          Display    Loc.?                       Stack

        /        Yes      Current     Yes    Yes(1)      No     PUSH(1)

        [        Yes      Numeric     Yes    Yes(1)      No     PUSH(1)

        ]        Yes     Symbolic     Yes    Yes(1)      No     PUSH(1)

        !         No     Suppress     Yes    Yes(1)      No     PUSH(1)

        \       Yes(2)    Current     Yes      No      Yes(1)      No

      <TAB>     Yes(2)    Current     Yes      Yes     Yes(1)     PUSH

      <RET>       No      Restore     No       No      Yes(1)      No

       <LF>     Yes(2)    Current     Yes      Yes     Yes(1)      No
                                               .+1

      <BKSP>    Yes(2)    Current     Yes      Yes     Yes(1)      No
       or ^                                    .-1

      <ESC>      Yes      Current     Yes      Yes     Yes(1)     POP
      <TAB>

      <ESC>      Yes      Restore     No       Yes     Yes(1)     POP
      <RET>               Current

      <ESC>      Yes      Current     Yes      Yes     Yes(1)     POP
       <LF>                                  Old.+1

      <ESC>      Yes      Current     Yes      Yes     Yes(1)     POP
      <BKSP>                                 Old.-1
        or
      <ESC>^

     (1)  If you enter expr.

     (2)  If not suppressed by !.





                                    4-10
                      Displaying and Modifying Memory


   4.4.1  Commands That Use the Current Location

   The commands <RET>, <LF>, and <BKSP> use the address  of  the  current
   location to determine the next address of the current location.  These
   commands do not make entries to the location sequence stack.

   These commands are described in detail on the next pages.















































                                    4-11
                      Displaying and Modifying Memory


                                {expr}<RET>


         o  deposits expr (if given) in the open location

         o  closes the open location

         o  starts a new display line

         o  resets the current typeout mode  to  the  prevailing  typeout
            mode

         o  does not change the address of the current location









































                                    4-12
                      Displaying and Modifying Memory


                                 {expr}<LF>


         o  deposits expr (if given) in the open location

         o  closes the open location

         o  increments the location counter

         o  opens the current location

         o  starts a new line  and  displays  the  address  of  the  open
            location, followed by:

             >  [  (left square bracket), if the current display mode  is
                C (numeric), and the prevailing mode is not

             >  ]  (right square bracket), if the current display mode is
                S (symbolic), and the prevailing display mode is not

             >  !  (exclamation point), if display has been suppressed by
                !

             >  /  (slash), in all other cases

         o  the contents of the open location (unless  display  has  been
            suppressed by !)



























                                    4-13
                      Displaying and Modifying Memory


                         {expr}<BKSP>  and  {expr}^


         o  deposit expr (if given) in the open location

         o  close the open location

         o  decrement the location counter

         o  open the current location

         o  start a  new  line  and  display  the  address  of  the  open
            location, followed by:

             >  [  (left square bracket), if the current display mode  is
                C (numeric), and the prevailing mode is not

             >  ]  (right square bracket), if the current display mode is
                S (symbolic), and the prevailing display mode is not

             >  !  (exclamation point), if display has been suppressed by
                !

             >  /  (slash), in all other cases

         o  the contents of the open location (unless  display  has  been
            suppressed by !)



























                                    4-14
                      Displaying and Modifying Memory


   4.4.2  Commands That Use the Location Sequence Stack

   The commands <ESC><RET>, <ESC><LF>, and <ESC><BKSP>  use  the  current
   location  stack  entry  to  determine  the next address of the current
   location.

   Repetitions of these commands refer to successively earlier entries on
   the stack, until you again address the most recent entry.

   These commands do not make entries to the location sequence stack.

   These commands are described in detail on the following pages.










































                                    4-15
                      Displaying and Modifying Memory


                              {expr}<ESC><RET>


         o  deposits expr (if given) in the open location

         o  closes the open location

         o  changes the value contained in the location  counter  to  the
            current location stack entry

         o  opens the current location

         o  starts a new line and displays the address  and  contents  of
            the open location in the current display mode

         o  causes the previous entry on the location sequence  stack  to
            become the current location stack entry


                                    NOTE

                  If display is suppressed as a result  of
                  using   the   !   command,  the  command
                  {expr}<ESC><RET>  restores  the  current
                  display  mode,  which  can  be  either a
                  temporary or prevailing display mode.




























                                    4-16
                      Displaying and Modifying Memory


                              {expr}<ESC><LF>


         o  deposits expr (if given) in the open location

         o  closes the open location

         o  changes the value contained in the location  counter  to  the
            current location stack entry

         o  increments the location counter

         o  opens the current location

         o  starts a new line  and  displays  the  address  of  the  open
            location, followed by:

             >  [  (left square bracket), if the current display mode  is
                C (numeric), and the prevailing mode is not

             >  ]  (right square bracket), if the current display mode is
                S (symbolic), and the prevailing display mode is not

             >  !  (exclamation point), if display has been suppressed by
                !

             >  /  (slash), in all other cases

         o  displays the contents of the open  location  (unless  display
            has been suppressed by !)

         o  causes the previous entry on the location sequence  stack  to
            become the current location stack entry





















                                    4-17
                      Displaying and Modifying Memory


                    {expr}<ESC><BKSP>  and  {expr}<ESC>^


         o  deposit expr (if given) in the open location

         o  close the open location

         o  change the value contained in the  location  counter  to  the
            current location stack entry

         o  decrement the location counter

         o  open the current location

         o  start a  new  line  and  display  the  address  of  the  open
            location, followed by:

             >  [  (left square bracket), if the current display mode  is
                C (numeric), and the prevailing mode is not

             >  ]  (right square bracket), if the current display mode is
                S (symbolic), and the prevailing display mode is not

             >  !  (exclamation point), if display has been suppressed by
                !

             >  /  (slash), in all other cases

         o  display the contents of the open location (unless display has
            been suppressed by !)

         o  cause the previous entry on the location  sequence  stack  to
            become the current location stack entry





















                                    4-18
                      Displaying and Modifying Memory


   4.4.3  Commands That Use an Address Within the Command

   The commands:

        /      (slash)
        [      (left square bracket)
        ]      (right square bracket)
        !      (exclamation point)
        \      (backslash)
      <TAB>

   use an expression given  in  the  command  (either  explicitly  or  by
   default)  to  determine  the addresses of the current location and the
   open location.


   The complete syntax of these commands is:

        {expr}{<ESC>{<ESC>}}c

   where expr may be an address, ".", a symbol, or any expression that is
   legal in DDT, and c is the command.

   When you use the commands /, [, ], !, \, and <TAB>:

         o  If you omit expr

             >  DDT uses the current quantity as a default.

             >  <TAB> enters the address of the current location  on  the
                location  sequence stack and changes the current location
                to the address determined from the current quantity.

         o  If you enter expr, DDT enters  the  address  of  the  current
            location on the location sequence stack (except \).

         o  DDT treats expr (whether given or defaulted) as if it were in
            instruction   format   and  performs  the  effective  address
            calculation as follows:

             >  If you omit <ESC>,  DDT  does  not  perform  indexing  or
                indirection.

             >  If you include one <ESC>, DDT  treats  expr  as  an  IFIW
                (instruction  format indirect word), and uses the I and Y
                fields of expr to perform indexing and  indirection  when
                appropriate.

             >  If you use <ESC><ESC> in a nonzero section, DDT  utilizes
                EFIWs  (extended  format indirect words), as appropriate,
                when performing effective address calculations,  and  can
                thereby calculate 30-bit addresses.


                                    4-19
                      Displaying and Modifying Memory


             >  If you use <ESC><ESC> in section  zero,  DDT  treats  the
                command  as if you had entered one <ESC>.  See Chapter 12
                (Extended Addressing), for a description of this form  of
                these commands.


   The commands /, [, ], !, \, and <TAB> always do the following:

         o  close the open location

         o  open the location at the address indicated by expr

         o  change the current  quantity  to  the  value  displayed  (all
            commands except !)


   The following pages describe the effects of each of these commands.





































                                    4-20
                      Displaying and Modifying Memory


                                     /


         o  closes the open location

         o  opens the location at the address calculated from the current
            quantity

         o  displays the contents of the open  location  in  the  current
            display mode

         o  sets the current quantity to the value displayed



                                   expr/


         o  closes the open location

         o  opens the location at the address calculated from expr

         o  enters the address of the current location  on  the  location
            sequence stack

         o  changes the current location to the location at  the  address
            calculated from expr

         o  displays the contents of the open  location  in  the  current
            display mode

         o  sets the current quantity to the value displayed






















                                    4-21
                      Displaying and Modifying Memory


                                     [


         o  closes the open location

         o  opens the location at the address calculated from the current
            quantity

         o  displays the contents of the open location in numeric mode in
            the current radix

         o  sets the current display mode to numeric mode in the  current
            radix

         o  sets the current quantity to the value displayed



                                   expr[


         o  closes the open location

         o  opens the location at the address calculated from expr

         o  enters the address of the current location  on  the  location
            sequence stack

         o  changes the current location to the location at  the  address
            calculated from expr

         o  displays the contents of the open location in numeric mode in
            the current radix

         o  sets the current display mode to numeric mode in the  current
            radix

         o  sets the current quantity to the value displayed
















                                    4-22
                      Displaying and Modifying Memory


                                     ]


         o  closes the open location

         o  opens the location at the address calculated from the current
            quantity

         o  displays the contents of the open location in symbolic mode

         o  sets the current display mode to symbolic mode

         o  sets the current quantity to the value displayed



                                   expr]


         o  closes the open location

         o  opens the location at the address calculated from expr

         o  enters the address of the current location  on  the  location
            sequence stack

         o  changes the current location to the location at  the  address
            calculated from expr

         o  displays the contents of the open location in symbolic mode

         o  sets the current display mode to symbolic mode

         o  sets the current quantity to the value displayed




















                                    4-23
                      Displaying and Modifying Memory


                                     !


         o  closes the open location

         o  opens the location at the address calculated from the current
            quantity

         o  does not display the contents of the open location

         o  suppresses display of the open  location  by  the  \,  <TAB>,
            <LF>, and <BKSP> commands (any other display command restores
            the current display mode)

         o  does not change the current quantity



                                   expr!


         o  closes the open location

         o  opens the location at the address calculated from expr

         o  enters the address of the current location  on  the  location
            sequence stack

         o  changes the current location to the location at  the  address
            calculated from expr

         o  does not display the contents of the open location

         o  suppresses display of the open  location  by  the  \,  <TAB>,
            <LF>, and <BKSP> commands (any other display command restores
            the current display mode)

         o  does not change the current quantity
















                                    4-24
                      Displaying and Modifying Memory


                                     \


         o  closes the open location

         o  opens the location at the address calculated from the current
            quantity

         o  displays the contents of the open  location  in  the  current
            display mode (unless display has been suppressed by !)

         o  sets the current quantity to the value displayed



                                   expr\


         o  deposits expr in the open location

         o  closes the open location

         o  opens the location at the address calculated from expr

         o  does not change the address of the current location (and does
            not enter the address of the current location on the location
            sequence stack)

         o  displays the contents of the open  location  in  the  current
            display mode (unless display has been suppressed by !)

         o  sets the current quantity to the value displayed






















                                    4-25
                      Displaying and Modifying Memory


                                   <TAB>


         o  closes the open location

         o  opens the location at the address calculated from the current
            quantity

         o  enters the address of the current location  on  the  location
            sequence stack

         o  changes the current location to the location at  the  address
            calculated from the current quantity

         o  starts a new line  and  displays  the  address  of  the  open
            location (which is also the current location)

         o  displays the contents of the open  location  in  the  current
            display mode (unless display has been suppressed by !)

         o  sets the current quantity to the value displayed



                                 expr<TAB>


         o  deposits expr in the open location

         o  closes the open location

         o  opens the location at the address calculated from expr

         o  enters the address of the current location  on  the  location
            sequence stack

         o  changes the current location to the location at  the  address
            calculated from expr

         o  starts a new line  and  displays  the  address  of  the  open
            location (which is also the current location)

         o  displays the contents of the open  location  in  the  current
            display mode (unless display has been suppressed by !)

         o  sets the current quantity to the value displayed








                                    4-26
                      Displaying and Modifying Memory


   You can treat expr as an IFIW (instruction format indirect word),  and
   use  any  indexing  and  indirection  specified by expr to compute the
   effective address of the location to be opened.  Use the command form:

        {expr}<ESC>c

   where c is /, [, ], !, \, or <TAB>.


   For example, assume the  following  conditions  as  indicated  by  the
   display commands:

   Command           Display            Explanation

   LABL1/             SYM1      Displays contents of LABL1.
   LABL1+1/           SYM2      Displays contents of LABL1+1.
   SYM2/              SYM3      Displays contents of SYM2.
   2/                 1         Displays contents of AC 2.
   @LABL1(2)/         SYM1      DDT uses Y field only.
   @LABL1(2)<ESC>/    SYM3      <ESC> causes indexing and indirection.


   Note that DDT does not start a new line unless you enter <TAB>, <RET>,
   <LF> or <BKSP>, or until the display wraps around the end of the line.
   DDT also displays three spaces (or a tab, depending on the TTY control
   mask)  before  and  after  its  output.   Thus, an actual DDT terminal
   display might be the following (user input  is  lowercase;   <LF>  and
   <TAB> do not appear on the screen, but are shown to indicate where you
   pressed the corresponding keys):

   2/   1   labl1/   SYM1   <LF>
   LABL1+1/   SYM2   <TAB>
   SYM2/   SYM3   sym4/   MOVE 1,@LABL1(2)   <ESC><TAB>
   SYM2/   SYM3


   You can treat expr as an EFIW (extended format indirect word) and  use
   any indexing and indirection specified by expr to compute the (global)
   effective address of the location to be opened.  Use the command form:

        {expr}<ESC><ESC>c

   where c is /, [, ], !, \, or <TAB>.



   4.5  DISPLAYING ASCIZ STRINGS

   You can display memory as an ASCIZ string.  The command

        addr<ESC>0T

   where addr defaults to the open location (if there is  one,  otherwise

                                    4-27
                      Displaying and Modifying Memory


   addr  defaults  to  the  current location), displays memory, beginning
   with addr, as an ASCIZ string.  The display stops  when  DDT  finds  a
   zero  byte, or when you type in any character, which DDT displays, but
   otherwise ignores.  The current location remains unchanged.



   4.6  ZEROING MEMORY

   To deposit the same value in each of  a  string  of  memory  locations
   (useful for initializing memory to zero), enter

        addr1<addr2>{expr}<ESC>Z

   where expr is any legal DDT expression, addr1 is  the  first  word  to
   receive  expr,  and addr2 is the last.  Follow addr1 with a left angle
   bracket (<) and addr2 with a right angle bracket (>).  Both addr1  and
   addr2  are required.  If you omit expr, it defaults to zero.  Prior to
   execution, DDT enters the address  of  the  current  location  on  the
   location  sequence  stack  and closes the open location.  When DDT has
   completed execution of the command, the current location is  the  word
   at  addr2.   There  is  no  open  location.  This command restores the
   prevailing display mode.


   If you enter

        ?

   while DDT is executing the <ESC>Z command, DDT displays:

        Depositing:  addr/   value

   where addr is the location where DDT will make the next  deposit,  and
   value is the contents of addr before the deposit.

   If you enter any other  character,  DDT  stops  executing  the  <ESC>Z
   command, and waits for your next command.  The current location is the
   last memory location that  received  a  deposit.   There  is  no  open
   location.   The  character  that  you  enter  to  terminate the <ESC>Z
   command is otherwise ignored.



   4.7  AUTOMATIC WRITE-ENABLE

   If  you  attempt  to  deposit  a  value  in   a   location   that   is
   write-protected, DDT returns the message:

        ?NOT WRITABLE

   This is the TOPS-20 default condition.


                                    4-28
                      Displaying and Modifying Memory


   To allow DDT to modify write-protected memory, enter

        <ESC>{0}W

   If you  now  attempt  to  deposit  a  value  in  a  location  that  is
   write-protected,  DDT  removes the protection, deposits the value, and
   then reinvokes the protection.

   Note that you cannot use this command to enable patching in FILDDT.

   To prevent DDT from modifying write-protected memory, enter

        <ESC><ESC>{0}W


   The zero in the above commands is optional and has no  effect  on  the
   operation of the commands.  DDT allows the zero for compatibility with
   prior versions of DDT.



   4.8  AUTOMATIC PAGE CREATION


   If you attempt to deposit a value in a location within  a  nonexistent
   page,  DDT creates the page and deposits the value.  If you attempt to
   deposit a value within a nonexistent section, DDT creates the  section
   as well as the page.  This is the default condition.

   To prevent DDT from creating a page when  you  attempt  to  deposit  a
   value within a nonexistent page, enter

        <ESC><ESC>1W

   If you now  attempt  to  deposit  a  value  in  a  location  within  a
   nonexistent page, DDT returns the error message:

        CAN'T CREATE PAGE

   To allow DDT to create the page (and the section,  as  required)  when
   you attempt to deposit a value within a nonexistent page, enter

        <ESC>1W



   4.9  PAGE ACCESS

   You can get information about the access  requirements  of  pages  and
   sections  in  the  program  you  are  debugging.   This information is
   similar in form and content to the information produced when  you  use
   the TOPS-20 INFORMATION (ABOUT) MEMORY-USAGE command.


                                    4-29
                      Displaying and Modifying Memory


   The command syntax is:

        {{arg1<}arg2}{<ESC>}<ESC>L

   where arg1 and arg2 are section numbers.   One  <ESC>  causes  DDT  to
   display  access  information  about  the  section and about individual
   pages, two <ESC>s causes DDT to display only access information  about
   the  section(s).   If you include both arg1 and arg2, DDT displays the
   information for all sections that your program and DDT are  using,  in
   the  range  arg1  to  arg2,  inclusive.  If you include only arg2, DDT
   displays access information for that section only.  If you  omit  both
   arg1  and  arg2, DDT displays access information for all sections that
   your program and DDT are using.

   For example, the command <ESC>L might produce the following display:

         Section 0   Read, Write, Execute, Private
        000-012   Read, Copy-on-write, Execute
        014-025   Read, Copy-on-write, Execute
        770       Read, Execute
        771       Read, Write, Execute, Private
         Section 37   Read, Write, Execute, Private
        700-701   Read, Copy-on-write, Execute
        703-727   Read, Copy-on-write, Execute
        736-737   Read, Write, Execute, Private
        740-753   Read, Execute

   The command <ESC><ESC>L might produce the following display:

         Section 0   Read, Write, Execute, Private
         Section 37   Read, Write, Execute, Private

   The text for each kind of access is:

        TEXT    EXPLANATION

        Read    page is readable
        Write   page is writable
        Copy-on-write page is copy-on-write
        Execute  page is executable
        Private  page is private
        Zero    page is allocated but zero (FILDDT only)

   See the SET PAGE-ACCESS command  in  the  TOPS-20  Commands  Reference
   Manual for more information about access to pages.









                                    4-30
                      Displaying and Modifying Memory


   4.10  WATCHING A MEMORY LOCATION

   If you wish to have DDT monitor or "watch"  a  memory  location  while
   your  program  is  running,  and  display  the  location  whenever its
   contents change, enter

        addr<ESC>V

   where addr is the address of the location to be watched, and  defaults
   to the current location.  When you enter the command, DDT starts a new
   line and displays:

        ADDR/   VALUE

   where ADDR is the address of the location being watched, and VALUE  is
   the  contents  of  the  location.   DDT  displays VALUE in the current
   display mode.  This command restores the prevailing display mode  when
   you terminate the watch.

   DDT checks ADDR every "jiffy" (about 20  milliseconds),  and  displays
   the  address  and  contents  of  ADDR  whenever those contents change.
   (Executive mode EDDT and KDDT watch ADDR continuously.)

   If you enter a question mark (?) while DDT is watching, DDT displays:

        Watching: ADDR/   VALUE

   where ADDR is the address of the location being watched, and VALUE  is
   the contents of ADDR.

   To  terminate  the  watch,  enter  any  other  character.   DDT  stops
   monitoring  the  location,  starts  a  new  display  line,  echoes the
   character you enter, starts another line, and waits  for  more  input.
   The  character  that  you  enter  to  terminate the watch is otherwise
   ignored.

   Because any input character terminates the watch, you cannot  continue
   execution  and  watch  your  own  user program.  The <ESC>V command is
   useful to watch activity in a separate process (such  as  the  running
   monitor  or  other  job,  for  which  you must be using EDDT, MDDT, or
   FILDDT).  The page that contains the location you wish to  watch  must
   be  mapped  into  your own process (the one that contains DDT and your
   program).



   4.11  TTY CONTROL MASK

   You can control certain aspects of DDT's display by setting DDT's  TTY
   control mask.  The command <ESC>1M returns a value that is the address
   of the DDT location that contains this mask.  Table 4-5 summarizes the
   features controlled by the bits in the TTY control mask.


                                    4-31
                      Displaying and Modifying Memory


                        Table 4-5:  TTY Control Mask



       Bit    Value                         Effect

       16       0     When  interrupting   program   execution   at   a
                      breakpoint, DDT displays the address and contents
                      of the breakpoint (default).

                1     When  interrupting   program   execution   at   a
                      breakpoint, DDT displays only the address of  the
                      breakpoint.

       17       0     DDT displays 3 spaces when spacing output (1).

                1     DDT displays output fields at tab stops (1).

       34       0     The terminal does not have a tab mechanism (2).

                1     The terminal has a tab mechanism (2).

       35       0     DDT echoes deleted characters (3).

                1     DDT backspaces over deleted characters (3).

      (1) If bit 17 is zero (default), DDT displays 3  spaces  between
           output  fields  (such  as between the address of a location
           and the contents of  the  location),  and  at  the  end  of
           display  lines.   If bit 17 is set, DDT lines up the output
           fields in columns beginning at tab stops (see bit 34).

      Figure 4-1 illustrates the two different modes.

      (2) If bit 34 is set, DDT displays a  tab  character  (<CTRL/I>)
           between  fields.   If  bit  34 is zero, DDT displays enough
           spaces to start the field  at  the  next  tab  stop.   When
           starting  up,  DDT  checks whether your terminal can handle
           TAB characters (<CTRL/I>), and sets this bit accordingly.

      (3) When starting up,  DDT  checks  whether  your  terminal  can
           backspace   to   delete   characters,  and  sets  this  bit
           accordingly.



   To change the settings of the TTY control mask, use the command:

        expr<ESC>1M

   where expr evaluates to the required bit pattern.

   You can also open the location addressed by <ESC>1M with  one  of  the

                                    4-32
                      Displaying and Modifying Memory


   DDT  display commands, and deposit an expression that contains the new
   bit settings.


   Figure 4-1 is an illustration of the effects of  bit  17  in  the  TTY
   control  mask.   The  code  being  examined  is the first few lines of
   X.MAC, listed in Figure 2-1.  The example is not a complete  debugging
   session;   only enough is shown to illustrate the effects of bit 17 of
   the TTY control mask.  The numbers at the  left  of  the  DDT  display
   lines are to assist you in following the commentary below.  User input
   is in lowercase.


   Figure 4-1:  DDT Session Showing Columnar Output


                               Screen Display

   1.       DDT
   2.       start/   MOVE P,PWORD   x$:   .$b   $g
   3.       $1B>>START/   MOVE P,PWORD   $x
   4.          P/   -10,,STACK   PWORD/   -10,,STACK
   5.       START+1/   MOVEI IDX,TABLE1   $x
   6.          IDX/   TABLE1   TABLE1   $1m/   2   1,,2
   7.       start$g
   8.       $1B>>START/     MOVE P,PWORD    $x
   9.               P/      -10,,STACK      PWORD/  -10,,STACK
   10.      START+1/        MOVEI IDX,TABLE1        $x
   11.              IDX/    TABLE1  TABLE1


                                 COMMENTARY


        Line 1:

            DDT is loaded and waiting for a command.

        Line 2:

            Enter start/ to examine location start.

            Enter x<ESC>:  to open the symbol table for module X.

            Enter .<ESC>b to set breakpoint at location START.

            Enter <ESC>g to begin execution.

        Line 3:

            DDT displays breakpoint information.



                                    4-33
                      Displaying and Modifying Memory


            Enter <ESC>x to execute the next instruction.

        Line 4:

            DDT displays results of executing the instruction.

        Line 5:

            DDT displays the next instruction.

            Enter <ESC>x to execute the instruction.

        Line 6:

            DDT displays the results of executing the instruction.

            Enter <ESC>1m/ to display and open the TTY control mask.

            DDT displays the mask.  Bit 34 is set.

            Enter 1,,2<RET> to set bits 17 and 34.

        Line 7:

            Enter start<ESC>g to restart the program.

        Line 8:

            DDT displays the breakpoint information.

            Enter <ESC>x to execute the instruction.

        Line 9:

            DDT displays the results of executing the instruction.

        Line 10:

            DDT displays the next instruction.

            Enter <ESC>x to execute the next instruction.

        Line 11:

            DDT displays the results of executing the instruction.









                                    4-34











                                 CHAPTER 5

                       CONTROLLING PROGRAM EXECUTION



   5.1  BEGINNING EXECUTION

   To begin execution of your program, enter

        <ESC>G


   Your program will run, beginning at its start address.   If  you  have
   not  set any breakpoints, your program runs to completion, or until it
   makes a fatal error.  You can then use  the  TOPS-20  DDT  command  to
   reenter DDT and examine your program.

   You can start or continue program execution at any  address  with  the
   command:

        addr<ESC>G



   5.2  USING BREAKPOINTS

   A breakpoint is a program location that has been altered such that  if
   your  program  PC  reaches the address of the breakpoint, your program
   transfers control to DDT.

   When you set a breakpoint with DDT, DDT  stores  the  address  of  the
   breakpoint  in  an  internal  table.  When you command DDT to begin or
   continue program execution,  DDT  stores  the  instructions  from  all
   breakpoints in the table, and replaces them with JSRs into a DDT entry
   table.

   While program execution is suspended at a breakpoint, you can  examine
   and modify memory, remove breakpoints, insert new breakpoints, execute
   individual instructions, and continue program execution.

   During this time, the command "<ESC>." returns the value that  is  the
   address   of  the  next  instruction  to  be  executed.   The  command
   "<ESC><ESC>." returns a value that is the previous value  returned  by

                                    5-1
                       Controlling Program Execution


   "<ESC>.".

   When you first receive control at the breakpoint, "<ESC>." returns the
   address  of the breakpoint and "<ESC><ESC>." returns zero.  Before you
   start execution with <ESC>G, "<ESC>." and  "<ESC><ESC>."  are  illegal
   commands.   If you try to execute them, DDT sounds the terminal buzzer
   or bell and displays a question mark.


                                    NOTE

                  This  manual  uses  the  term  "$."   to
                  represent  the  value  returned  by  the
                  command "<ESC>.", and the term "$$."  to
                  represent  the  value  returned  by  the
                  command "<ESC><ESC>.".


   You can set up to 12 breakpoints at a time (this  is  a  DDT  assembly
   parameter)  in your program.  These breakpoints are numbered 1 through
   12.   There  is  also  one  breakpoint  (the  unsolicited  breakpoint,
   numbered zero) that can be used by your MACRO program to "call" DDT.

   Each breakpoint has several internal DDT locations associated with it,
   which  contain  information  to control DDT action with respect to the
   breakpoint.  You can examine and modify these DDT locations  with  the
   same DDT commands that you use to examine and modify locations in your
   user program.  <ESC>nB is a command that returns the value that is the
   address  of  the  first  DDT  word  associated with breakpoint n.  The
   symbol $nB is used here to represent that address.

   Table 5-1 contains a list of the breakpoint locations of  interest  to
   you, and their contents.


                Table 5-1:  Breakpoint Locations of Interest



     Location     Contents

         $nB      Address of breakpoint n.

        $nB+1     Instruction for conditional breakpoint n.

        $nB+2     Proceed count for conditional breakpoint n.

        $nB+3     Address of a location to be opened and displayed when
                  the breakpoint is reached.





                                    5-2
                       Controlling Program Execution


   When your user-program PC reaches a breakpoint, your program  executes
   the JSR into DDT.  When this occurs, DDT does the following:

         o  saves your user-program context

         o  replaces the JSR instructions at  all  breakpoints  with  the
            original program instructions

         o  displays the breakpoint number, breakpoint address,  and  the
            contents  of  the  breakpoint (depending on bit 16 of the TTY
            control mask)

         o  sets "$." to the breakpoint address

         o  sets "$$." to zero

         o  enters the address of the current location  (set  before  you
            started  the  program  or proceeded from a breakpoint) on the
            location sequence stack

         o  changes the current location to the breakpoint

         o  waits for you to give a DDT command


   When you command DDT to restart or  continue  program  execution,  DDT
   does the following:

         o  saves the program instructions from all breakpoints

         o  replaces the program instructions at all breakpoints with JSR
            instructions to DDT

         o  if you have not executed the instruction  at  the  breakpoint
            with  <ESC>X,  simulates  execution of the instruction at the
            breakpoint

         o  restores your user-program context

         o  performs a JRSTF (if in section zero,  otherwise  XJRSTF)  to
            the next instruction to be executed



   5.2.1  Setting Breakpoints

   To set a breakpoint, enter

        addr<ESC>{n}B

   where addr is the address where you want to  suspend  execution  (addr
   can  be  ".",  the  command  that  returns  the address of the current
   location), and n is the number of the breakpoint (and defaults to  the

                                    5-3
                       Controlling Program Execution


   lowest unused breakpoint number).

   If you do not specify n, it defaults to the lowest  available  (unset)
   breakpoint.   If you have already set twelve breakpoints, DDT displays
   "?" and sounds the terminal buzzer or bell.

   If you specify n, it must be greater than zero and less than 13.   DDT
   restores  the  original  contents  of  any (previously set) breakpoint
   designated as breakpoint n before setting new breakpoint n.

   You cannot set more than one breakpoint  at  the  same  address.   DDT
   simply  sets the same breakpoint again, even if you explicitly specify
   a breakpoint number the second time.

   You cannot set a breakpoint at AC zero.


   Assume the following conditions:

         o  location LABL1+3 contains the instruction MOVE 1,LABL2

         o  breakpoint 2 is set at LABL1+3


   If your program reaches LABL1+3 it executes the JSR to  DDT,  and  DDT
   does the following:

         o  saves your user-program context

         o  restores the original program instructions to the breakpoints

         o  sets "$." to LABL1+3

         o  sets "$$." to zero

         o  enters the address of the current location  on  the  location
            sequence stack

         o  changes the current location to LABL1+3 (the breakpoint)

         o  opens location LABL1+3

         o  displays:   $2B>>LABL1+3/   MOVE 1,LABL2


   To set a breakpoint and have DDT display an additional  location  when
   your program reaches the breakpoint, enter

        addr1<addr2<ESC>{n}B

   where addr1 is the location to be displayed, and addr2 is the location
   of the breakpoint.  Follow addr1 with a left angle bracket (<).


                                    5-4
                       Controlling Program Execution


   Assume the following conditions:

         o  location LABL1+3 contains the instruction MOVE 1,LABL2

         o  location LABL3 contains value SYMBL1

         o  breakpoint 2 was set by the command:

               LABL3<LABL1+3<ESC>B


   If your program reaches LABL1+3 it executes the JSR to  DDT,  and  DDT
   does the following:

         o  saves your user-program context

         o  restores the original program instructions to the breakpoints

         o  sets "$." to LABL1+3

         o  sets "$$." to zero

         o  enters the address of the current location  on  the  location
            sequence stack

         o  changes the current location to LABL1+3 (the breakpoint)

         o  enters the address of the current location  (the  breakpoint)
            on the location sequence stack

         o  changes the current location to LABL3

         o  opens location LABL3

         o  displays:   $2B>>LABL1+3/   MOVE 1,LABL2   LABL3/   SYMBL1


   Note that, because DDT placed the breakpoint address on  the  location
   sequence  stack,  you  can  enter  <ESC><RET>  to  change  the current
   location back to the breakpoint.




   To display the address of any breakpoint, enter

        <ESC>nB/

   where n is the address of the breakpoint.  DDT displays the address of
   breakpoint n, and you can use the examine commands to open and display
   the instruction at breakpoint n.  If breakpoint  n  is  not  set,  DDT
   displays zero.


                                    5-5
                       Controlling Program Execution


   To remove breakpoint n, enter

        0<ESC>nB

   To remove all breakpoints, enter

        <ESC>B



   5.2.2  Proceeding from Breakpoints

   After  your  program  has  reached  a  breakpoint,  you  can  continue
   execution at "$." by entering:

        <ESC>P


   DDT saves the program instructions from all breakpoints, replaces  the
   program  instructions  with  JSRs  to  DDT, restores your user-program
   context, and if you have not executed any  program  instructions  with
   the  <ESC>X  command,  simulates  execution  of the instruction at the
   breakpoint.  DDT then executes a JRSTF (in section zero, otherwise DDT
   executes an XJRSTF) to the next instruction to be executed.

   You can cause the program to start execution at a  different  location
   with  the  {addr}<ESC>G  command, where addr defaults to the program's
   start address.


   Once your program has reached a breakpoint  and  DDT  has  interrupted
   execution,  you  can  cause  DDT to continue execution but NOT stop at
   that breakpoint until your  program  has  reached  that  breakpoint  a
   specified number of times.  To do this, enter

        expr<ESC>P

   where expr is the proceed count.  DDT places expr at  location  $nB+2,
   where  n  is  the  number  of the breakpoint at which your program has
   stopped.  DDT resumes execution  of  your  program.   Each  time  your
   program  reaches breakpoint n, DDT decrements the proceed count stored
   at $nB+2.  Your program continues execution until:

         o  it reaches a different breakpoint

         o  it terminates normally

         o  it commits a fatal error

         o  the proceed count reaches zero


   Each breakpoint has an associated automatic  proceed  flag.   If  this

                                    5-6
                       Controlling Program Execution


   flag is set and the program reaches the breakpoint, DDT decrements the
   proceed count at $nB+2 (where n is the number of the  breakpoint)  and
   displays  the breakpoint information if the proceed count is less than
   one.  DDT then automatically continues program execution.

   The <ESC>P command clears the automatic proceed flag  associated  with
   the breakpoint at which DDT has suspended program execution.


   To set a breakpoint and set the  associated  automatic  proceed  flag,
   enter

        {addr1<}addr2<ESC><ESC>{n}B

   where addr2 is the address of the breakpoint and may be ".", addr1  is
   an  (optional)  additional location to be displayed, and n is optional
   and defaults to the lowest unused breakpoint.

   Each time your  program  reaches  breakpoint  n,  DDT  decrements  the
   associated  proceed  count,  and  if  the  result  is  less  than one,
   displays:

        $nB>>addr2/   instr

   where n is  the  breakpoint  number,  addr2  is  the  address  of  the
   breakpoint, and instr is the contents of the word at addr2.

   If you entered addr1< when you gave the command, DDT displays:

        $nB>>addr2/   instr   addr1/   contents

   where n is  the  breakpoint  number,  addr2  is  the  address  of  the
   breakpoint,  instr  is the contents of the word at addr2, addr1 is the
   additional location to be displayed, and contents is the  contents  of
   the word at addr1.

   DDT then automatically continues program execution until:

         o  your program reaches a different breakpoint

         o  your program terminates normally

         o  your program commits a fatal error

         o  you enter any character while your program is at breakpoint n


   You can interrupt the  automatic  proceed  function  if  you  enter  a
   character  while your program is at breakpoint n.  DDT then resets the
   automatic  proceed  flag  and  suspends  program  execution   at   the
   breakpoint.   DDT  echoes  the  character  that  you entered, which is
   otherwise ignored.


                                    5-7
                       Controlling Program Execution


   To proceed from a breakpoint and set the associated automatic  proceed
   flag, give the command:

        {expr}<ESC><ESC>P

   where expr is the proceed count.  DDT  stores  the  proceed  count  at
   $nB+2.



   5.2.3  Conditional Breakpoints

   To cause DDT to interrupt program execution at a breakpoint only if  a
   specific  condition  is  satisfied,  you  must  store  a  single  test
   instruction or a call to a test routine  in  DDT's  breakpoint  table.
   You  can  use a test routine in your program, or one that you enter in
   DDT's patching area.  See Chapter 8 (Inserting Patches with  DDT)  for
   more   information  about  the  patching  area.   To  enter  the  test
   instruction (or the call to the test routine), open the  DDT  location
   addressed by the command <ESC>nB+1 by entering:

        <ESC>nB+1/

   where n is the number of the breakpoint.  You must  enter  n,  or  DDT
   interprets  the  command  as  <ESC>B,  and  removes  all  breakpoints.
   Deposit the test instruction or the call to the test subroutine.   The
   instruction  must  result  in  a  PC  (program  counter) skip when the
   condition to trigger the breakpoint is true.  If your program  reaches
   breakpoint  n,  DDT  executes  the  instruction  at  $nB+1.   DDT then
   proceeds as follows:

         o  If  a  program  counter  skip  does  occur,  DDT   interrupts
            execution at breakpoint n.

         o  If the instruction does not cause a program counter skip, DDT
            decrements the proceed count at $nB+2.  If the result is zero
            or less, DDT interrupts execution at breakpoint n.

         o  If the conditional instruction is a call to a subroutine that
            returns  by  skipping  over  two  instructions,  DDT does not
            interrupt program execution.


   If DDT interrupts execution because the test instruction resulted in a
   program  counter  skip,  DDT displays only one angle bracket after the
   breakpoint identification, as:

        $3B>LABL1/   MOVE 1,LABL2






                                    5-8
                       Controlling Program Execution


   5.2.4  The "Unsolicited" Breakpoint

   You can cause your MACRO  program  to  "call"  DDT  by  inserting  the
   following instruction in your program:

        JSR $0BPT##

   The two number signs (##) appended to  $0BPT  in  your  MACRO  program
   declare the symbol as EXTERNAL.


                                    NOTE

                  "$"   represents   the    dollar    sign
                  character,  which is part of the symbol,
                  and is not the DDT echo  of  the  ESCAPE
                  key.


   For your program to "call" DDT,  you  must  load  RDDT.REL  with  your
   program  or  you  will  get  a  LINK  error when you load your program
   (?LNKUGS  undefined global symbol).  Load RDDT.REL with  your  program
   as  follows  (your  input is in lowercase;  MYPROG is the name of your
   program;  the last line indicates that DDT  is  loaded  and  ready  to
   accept your commands):

        @link
        *sys:rddt.rel,myprog/go
        @save myprog.exe

   Load your program after RDDT.REL to  ensure  that  the  saved  program
   module  has  your program's start address.  Start your program running
   with the START or RUN commands.  If  your  program  executes  the  JSR
   instruction, DDT interrupts program execution and displays:

        $0B>>addr+1/   instr

   where addr+1 is the first location after  the  JSR $0BPT  instruction,
   and instr is the contents of that location.



   5.3  EXECUTING EXPLICIT INSTRUCTIONS

   To execute a specific instruction, enter the instruction  followed  by
   <ESC>X, as follows:

        instr<ESC>X

   For example:

        MOVE 1,@LABL1(3)<ESC>X


                                    5-9
                       Controlling Program Execution


   After executing the instruction, DDT starts a new line and displays:

        o  <>         if in-line execution of instr would result in
                      skipping no instructions.

        o  <SKIP>     if in-line execution of instr would result in
                      skipping 1 instruction.

        o  <SKIP 2>   if in-line execution of instr would result in
                      skipping 2 instructions.

        o  <SKIP 3>   if in-line execution of instr would result in
                      skipping 3 instructions.


                                    NOTE

                  "In-line execution" means  execution  of
                  the   instruction   as  part  of  normal
                  program   flow.    The   execution    of
                  instructions  with  this  command has no
                  effect on your user-program PC.


   This command restores the prevailing display mode.



   5.4  SINGLE-STEPPING INSTRUCTIONS

   After your program has transferred control to DDT from  a  breakpoint,
   you  can  execute  program instructions one at a time.  This is called
   "single-stepping."

   "<ESC>." is a command that returns the address of the next instruction
   to be executed.

   To execute the instruction whose  address  is  returned  by  "<ESC>.",
   enter

        <ESC>X


   For example, breakpoint 3 is set  at  LABL1+3.   If  your  program  PC
   reaches LABL1+3, control passes to DDT, which displays:

        $3B>>LABL1+3/   ADD 1,LABL2(2)

   Examining the environment, you learn the following:

         o  AC 1 contains 1



                                    5-10
                       Controlling Program Execution


         o  AC 2 contains 3

         o  LABL1+4 contains MOVEM 1,@LABL2(3)

         o  LABL2+3 contains SYM3

   as shown by the following terminal display (DDT does not display  <LF>
   or <ESC>):

        $3B>>LABL1+3/   ADD 1,LABL2(2)   <ESC>\   SYM3   <LF>
        LABL1+4/   MOVEM 1,@LABL2(3)   1/   1   <LF>
        2/   3      


   If you now enter the command <ESC>X, DDT does the following:

         o  changes "$$." to LABL1+3

         o  executes the instruction at LABL1+3

         o  changes "$." to LABL1+4

         o  changes the current location to LABL1+4

         o  opens LABL1+4

         o  displays:

                1/   SYM3+1   LABL2+3/   SYM3
             LABL1+4/   MOVEM 1,@LABL2(3)


   If single-stepping an instruction results in a value of ($. minus $$.)
   not equal to 1, DDT also begins a new line and displays:

         o  <SKIP>    if ($. minus $$.) = 2

         o  <SKIP 2>  if ($. minus $$.) = 3

         o  <SKIP 3>  if ($. minus $$.) = 4

         o  <JUMP>    if ($. minus $$.) is greater than 4 or less than 1

   before displaying the address and contents of the next instruction  to
   be  executed.   For  example,  the  following shows a typical terminal
   display where you enter <ESC>X to single-step the first instruction at
   a breakpoint (DDT echoes <ESC> as $):

        $4B>>LABL1+5/   AOSN 3   /   0    <ESC>x
           3/   1
        <SKIP>
        LABL1+7/   MOVEM 1,LABL2


                                    5-11
                       Controlling Program Execution


   If the instruction that you execute is followed  by  an  ERCAL  or  an
   ERJMP  instruction  and DDT executes the instruction successfully, DDT
   displays  <ERSKP>  before  displaying  the  next  instruction  to   be
   executed.  For example:

        ADDR1/   GTJFN   <ESC>x
           <ERSKP>
        ADDR1+2/   instr

   where instr is the instruction at location ADDR1+2.

   If DDT does not execute the instruction successfully, it displays  (in
   the case of an ERJMP):

        ADDR1/   GTJFN   <ESC>x

        ADDR1+1/   ERJMP   EROUTN
           EROUTN
        <JUMP>
        EROUTN/   instr

   where instr is the instruction at location EROUTN.



   5.5  EXECUTING SUBROUTINES AND RANGES OF INSTRUCTIONS

   To execute a series of n instructions beginning with  the  instruction
   whose address is returned by the command "<ESC>.", enter

        n<ESC>X

   where n is the number of instructions to execute.

   DDT then does the following for each instruction:

         o  starts a new display line

         o  executes the instruction

         o  displays the address  of  any  register  or  memory  location
            referenced  by  the  execution  of  the  instruction, and the
            contents  of  those  locations   after   execution   of   the
            instruction

         o  changes the current location to the next  instruction  to  be
            executed

         o  opens the current location

         o  displays the address and contents of the next instruction  to
            be executed


                                    5-12
                       Controlling Program Execution


         o  changes "$." to the address of the  next  instruction  to  be
            executed

         o  changes "$$." to the address of the instruction just executed


   To suppress typeout of all but the last instruction executed, use  the
   command:

        n<ESC><ESC>X

   where n is the number of instructions to execute.


   To continue program execution until the PC (program counter) enters  a
   range of instructions, enter

        {addr1<}{addr2>}<ESC><ESC>X

   where addr1 is the lower end of the range, and addr2 is the upper end.
   Addr1  defaults  to  1 + "$." and addr2 defaults to addr1 + 3.  Follow
   addr1 with a left angle bracket (<)  and  addr2  with  a  right  angle
   bracket (>).

   This command also indicates skips and jumps.

   This command is useful for executing  a  loop  or  a  subroutine  call
   quickly and without typeout.

   For example, breakpoint 3 is at location LABL1.

         $3B>>LABL1/   PUSHJ 17,SUBRTN   <ESC><ESC>X  ;Enter <ESC><ESC>X
         <SKIP>                                       ;SUBRTN returns + 2
         LABL1+2/   ADD 1,2


   If you enter a question mark (?) while DDT is executing an <ESC><ESC>X
   command, DDT displays:

         Executing: addr/   instr

   where addr is the address of the next instruction to be executed,  and
   instr is the instruction.











                                    5-13
                       Controlling Program Execution


   To terminate the execution of the series of  instructions,  enter  any
   character other than ?  (question mark).  DDT does the following:

         o  echoes the character

         o  displays  <SKIP>,  <SKIP  2>,  <SKIP  3>,   or   <JUMP>,   as
            appropriate

         o  starts a new display line

         o  changes the current location  to  the  address  of  the  next
            instruction to be executed

         o  displays the address and contents of the current location

         o  opens the current location

         o  waits for your next command



   5.5.1  Single-Stepping "Dangerous" Instructions

   DDT classifies the following as "dangerous" instructions:

         o  instructions that can modify memory

         o  instructions that can cause an arithmetic trap

         o  instructions that can cause a stack overflow

         o  a monitor call or I/O instruction


   Before single-stepping  one  of  these  instructions,  DDT  saves  and
   replaces  the  original  instructions  at the breakpoints with JSRs to
   DDT, and restores the full user-program context  (including  interrupt
   system and terminal characteristics) before executing the instruction.
   After  executing  the  instruction,  DDT  replaces  the  JSRs  at  the
   breakpoints with the original program instructions, and saves the full
   user-program context.

   DDT does not check whether the instruction actually results in one  of
   these  conditions,  only  whether  the  opcode  is  in  the  class  of
   instructions that can cause these effects.  This  can  make  executing
   subroutines  and  ranges  of  instructions under DDT control extremely
   time-consuming.

   To execute a subroutine or series of instructions without checking for
   dangerous instructions, use the command:

         {addr1<}{addr2>}<ESC><ESC>1X


                                    5-14
                       Controlling Program Execution


   where addr1 is the lower end of the range, and addr2 is the upper end.
   Addr1  defaults  to  1 + "$." and addr2 defaults to 3 + addr1.  Follow
   addr1 with a left angle bracket (<), and  addr2  with  a  right  angle
   bracket  (>).  This command executes much faster than <ESC><ESC>X, but
   if the execution of an instruction causes a  software  interrupt,  the
   error  and  trap  handling  mechanism  may not function correctly.  In
   addition, program instructions that change or rely on terminal or  job
   characteristics  that  are  also  used  by DDT can cause unpredictable
   results.



   5.6  USER-PROGRAM CONTEXT

   When DDT interrupts your program's  execution  at  a  breakpoint,  and
   after  it  has  executed  a  dangerous instruction during an <ESC>X or
   <ESC><ESC>X command, it saves the user-program context.   The  command
   <ESC>I+n, where 0<=n<=10 (octal), returns the address of the word that
   contains the information for "function" n (if n = 0, you can omit "+n"
   from  the  command).   You  can use this address to display and modify
   these values.  Most of these values are useful only in executive mode.
   DDT displays the address of the word that contains the information for
   function n as:

         $I+n

   where 1<=n<=10 (octal).  If n = 0, DDT displays only $I.  This command
   is illegal in FILDDT.


   Table 5-2 lists the functions.























                                    5-15
                       Controlling Program Execution


                  Table 5-2:  User-Program Context Values




      FUNCTION                            VALUE

          0       Executive mode CONI PI.

          1       Executive mode PI channels turned off.

          2       Executive mode CONI APR.

          3       User PC flags.

          4       User PC address.

          5       EPT page address.

          6       UPT page address.

          7       CST base virtual address.

         10       SPT base virtual address.



   DDT restores the user-program context  whenever  you  execute  <ESC>G,
   <ESC>P,  and  when  you  execute  <ESC>X,  or <ESC><ESC>X of dangerous
   instructions.

   Functions 5 through 10 (octal) affect  DDT's  interpretation  of  your
   program's  virtual  address space.  You can alter DDT's interpretation
   of your program's virtual address space with the physical and  virtual
   addressing  (<ESC>nU)  commands  described in Chapter 11 (Physical and
   Virtual Addressing Commands).  However, any alterations that you  make
   do  not  become  part  of your user-program context, and do not affect
   TOPS-20's interpretation of your program's virtual address space.


   DDT also saves and restores  the  user-program  ACs  as  part  of  the
   user-program  context.   DDT  stores  the  contents  of  the ACs in an
   internal "register" block.  Any references you make to addresses  0-17
   refer  to  the  relative  locations  in DDT's internal register block.
   These actions are totally transparent to you.









                                    5-16











                                 CHAPTER 6

                     SEARCHING FOR DATA PATTERNS IN DDT



   With DDT you can search for memory locations that contain  a  specific
   value, and conversely, for words that do not contain a specific value.
   You can also set a mask to indicate to DDT that  only  specified  bits
   are to be considered when performing the search.  In addition, you can
   search for words that reference a specific address.  You can specify a
   range  within which to perform the search, or default the range to all
   of your program's address space.  In either  case,  DDT  compares  the
   contents of each location within the range with the specified value.


   To search for words that match a specific value, enter

        {addr1<}{addr2>}expr<ESC>W

   where expr is the value for which DDT is to search (expr  can  be  any
   legal  DDT expression), and addr1 and addr2 delimit the range in which
   the search is to be conducted.  Follow addr1 with a left angle bracket
   (<)  and addr2 with a right angle bracket (>).  Addr1 defaults to zero
   and addr2 defaults to 777777 in the current section, unless you are in
   FILDDT, and:

         o  the target is an .EXE file and you are using  normal  virtual
            addressing OR

         o  the target is a disk structure or data file.

   In these cases, addr2 defaults to the last word of  the  target.   See
   Chapter  9  (FILDDT),  and Chapter 11 (Physical and Virtual Addressing
   Commands), for more information.

   DDT does the following:

         o  compares each location (after ANDing it with the search mask)
            within  the search range with the 36-bit value resulting from
            evaluating expr




                                    6-1
                     Searching for Data Patterns in DDT


         o  starts the search by comparing the  contents  of  addr1  with
            expr

         o  stops the search after comparing the contents of  addr2  with
            expr

         o  displays (on a new line) the address  and  contents  of  each
            location that matches expr

         o  enters the address of each matching location on the  location
            sequence stack

         o  sets the current location to addr2

         o  displays a blank line to indicate the search is over

         o  restores the prevailing display mode


                                    NOTE

                  If DDT  finds  more  matching  locations
                  than  there  are  words  on the location
                  sequence   stack,   each    new    entry
                  overwrites the earliest entry.


   To search for words that do NOT match a specified value, enter

        {addr1<}{addr2>}expr<ESC>N

   where expr is the value that is not to be matched  (expr  can  be  any
   legal  DDT  expression),  and addr1 and addr2 delimit the range within
   which DDT is to search.  Follow addr1 with a left  angle  bracket  (<)
   and  addr2 with a right angle bracket (>).  Addr1 defaults to zero and
   addr2 defaults to 777777 in the current  section  unless  you  are  in
   FILDDT, and:

         o  the target is an .EXE file and you are using  normal  virtual
            addressing OR

         o  the target is a disk structure or data file.

   In these cases, addr2 defaults to the last word of  the  target.   See
   Chapter  9  (FILDDT),  and Chapter 11 (Physical and Virtual Addressing
   Commands), for more information.

   DDT functions as for the <ESC>W command, except:

         o  DDT searches for and displays the address and contents of any
            word  within the address range that does NOT match the 36-bit
            value resulting from evaluating expr.


                                    6-2
                     Searching for Data Patterns in DDT


         o  DDT  enters  the  locations  of  non-matching  words  on  the
            location sequence stack.


   To search for references to an address, enter

        {addr1<}{addr2>}expr<ESC>E

   where addr1 and addr2 delimit  the  range  of  the  search,  and  expr
   contains  the address for which DDT is to search.  Follow addr1 with a
   left angle bracket (<) and addr2  with  a  right  angle  bracket  (>).
   Addr1  defaults  to  zero  and addr2 defaults to 777777 in the current
   section.  Expr is any legal DDT expression.

   DDT performs an  IFIW  effective  address  calculation  on  the  value
   contained in each word within the range, and uses the 30-bit result to
   determine whether there is a match.

   Thus, if bits 14-17 (the X field of an instruction) or bit 13  (the  I
   field  of  an  instruction)  are  nonzero, indexing or indirection may
   result in DDT finding different search results at different times.

   DDT does not check whether the value is actually an instruction before
   performing the effective address calculation.


   If you enter a question mark (?) while DDT is performing  any  of  the
   above searches, DDT displays:

        Searching: addr/   value

   where addr is the address of the location that will next compare,  and
   value is the contents of addr.


   To abort the search, enter any character other than question mark (?).
   DDT stops searching, and waits for more input.  The character that you
   enter to terminate the search is otherwise ignored.

   Each of the above search  commands  restores  the  prevailing  display
   mode.


   <ESC>M is a command that addresses a  DDT  location  that  contains  a
   search  mask  used  to  prevent specified bits in the memory word from
   being considered during the search.  This mask is used only by  <ESC>W
   and  <ESC>N,  not  by <ESC>E.  DDT logically ANDs the search mask with
   the memory word before making the comparison, but does not change  the
   memory word.  If DDT finds a match, it displays the entire word.

   DDT sets the search mask to 777777,,777777 (compare all  36  bits)  by
   default.


                                    6-3
                     Searching for Data Patterns in DDT


   To set the search mask, enter

        expr<ESC>M

   where expr evaluates to the required bit pattern.

   For example, to search for all of  the  RADIX50  references  to  MAIN.
   (user input is in lowercase):

        <ESC><ESC>5t             ;Set typeout mode to RADIX50.
        37777,,777777<ESC>m      ;Ignore the left 4 bits.
        main.<ESC>5"<ESC>w       ;Enter RADIX50 symbol, start search.
        4112/   4 MAIN.          ;DDT displays match found.
        4775/   0 MAIN.          ;DDT displays match found.
                                 ;Search over, DDT displays blank line.


   You can also examine and modify the search mask with the  examine  and
   deposit  commands  described  in  Chapter  4 (Displaying and Modifying
   Memory).


































                                    6-4











                                 CHAPTER 7

                        MANIPULATING SYMBOLS IN DDT



   7.1  OPENING AND CLOSING SYMBOL TABLES

   Each  separate  program  module  has  its  own  symbol  table.    When
   displaying  a  value  symbolically, if more than one symbol is defined
   with that value, DDT displays the first  global  symbol  found.   When
   searching  for  a  symbol, DDT searches the "open" symbol table first.
   For display purposes, DDT treats  local  symbols  found  in  the  open
   symbol  table  as  global  symbols.   DDT appends a number sign (#) to
   local symbol names that it finds in a symbol table that is  not  open.
   For example, DDT might display:

        SYMBL1#

   where SYMBL1 is a local symbol that DDT found in a symbol  table  that
   is not open.

   If you enter an expression that contains a symbol that is  defined  in
   more  than  one  of  your  program  modules, DDT uses the value of the
   symbol that is contained in the open symbol table.  If the  symbol  is
   not  defined  in  the open symbol table, or if there is no open module
   and no global definition of the symbol, DDT displays:

        M


   To open the symbol table of a program module, enter

        name<ESC>:

   where name is the name of the program module as specified by the TITLE
   pseudo-op  in  your MACRO-10 program (or the equivalent mechanism in a
   higher-level language program).  DDT closes any currently open  symbol
   table and opens the symbol table associated with module name.


   To find the name of the module associated with the open symbol  table,
   enter


                                    7-1
                        Manipulating Symbols in DDT


        <ESC>1:

   If there is an open symbol table, DDT  displays  the  name  of  module
   associated  with  the  open  symbol table.  For example, if the symbol
   table for module X is open, the screen  display  is  as  follows  (DDT
   echoes <ESC> as $, and does not display any spaces between the command
   and the module name):

        $1:/X

   If there is no open symbol table, DDT displays three spaces (or a tab,
   depending on the TTY control mask), and waits for your next command.


   To close the open symbol table, enter

        <ESC>:



   7.2  DEFINING SYMBOLS

   To redefine a symbol or to create a new symbol in the  current  symbol
   table, enter

        expr<symbol:

   where expr is any legal DDT expression, and symbol is the symbol name.

   To define symbol as the local address of the open location, enter  the
   command

        symbol:


   DDT defines symbol with a value of 0,,addr, where addr is the  address
   of  the  open  location.   If  there is no open location, DDT uses the
   address of the last location that was open.  DDT defines symbol  as  a
   global  symbol.  If you previously used symbol as an undefined symbol,
   DDT inserts the correct value in all the places you referenced symbol,
   and removes symbol from the undefined symbol table.



   7.3  SUPPRESSING SYMBOL TYPEOUT

   To prevent a symbol from being displayed, enter

        symbol<ESC>K

   where symbol is the symbol to be suppressed.  DDT still accepts symbol
   as input, but no longer displays symbol as output.


                                    7-2
                        Manipulating Symbols in DDT


   To suppress the last symbol that DDT displayed (in an address, in  the
   contents  of  a  memory  word, or in the evaluation of an expression),
   enter

        <ESC>D

   DDT suppresses the last symbol  displayed,  and  then  redisplays  the
   current quantity.  DDT does not display its usual three spaces between
   the command and the displayed value.

   In the following example, assume that symbol SIZE  is  defined  as  3.
   User  typein  is  lowercase  (<LF>  does  not  appear  on the terminal
   screen).

        start/   JFCL 0   <LF>
        LOOP/   AOS 1   <LF>
        LOOP+1/   MOVE 2,1   <ESC>dMOVE 2,1   <LF>
        START+3/   MULI 2,SIZE   <ESC>dMULI 2,3


   To reactivate a symbol for typeout, redefine the symbol.  For example,
   to reactivate the display of symbol SIZE, above, enter

        size<size:

   Note that SIZE is now defined as a  global  symbol,  even  if  it  was
   previously a local symbol.



   7.4  KILLING SYMBOLS

   To remove a symbol from the symbol table, enter

        symbol<ESC><ESC>K

   DDT removes symbol from the  symbol  table,  and  no  longer  displays
   symbol or accepts symbol as input.



   7.5  CREATING UNDEFINED SYMBOLS

   It is sometimes convenient to use  symbols  that  have  not  yet  been
   defined.  To create an undefined symbol, enter

        symbol#

   where symbol is the undefined symbol name.  DDT enters symbol  in  the
   undefined  symbol table.  When you later define the symbol, DDT enters
   it into the defined symbol table, removes it from the undefined symbol
   table,  and  enters  the  correct  value  in  all  locations where you
   referenced the symbol.

                                    7-3
                        Manipulating Symbols in DDT


   You can use undefined symbols only as parts of  expressions  that  you
   are depositing to memory.  Undefined symbols can be either fullword or
   right-halfword values;  they cannot be used as the A or X fields of an
   instruction, or as the left-halfword of an expression.



   7.6  SEARCHING FOR SYMBOLS

   To determine the modules in which a symbol is defined, enter

        symbol?

   where symbol is the name of the symbol.  DDT displays the name of each
   program  module in which symbol is defined.  If the symbol is a global
   symbol, DDT displays a "G", as:

        sym?
        MAIN.  G


   DDT does not display G following a local  symbol  found  in  the  open
   symbol  table.   When  DDT  has  searched  the entire symbol table, it
   displays a blank line.  To search for all the symbols that begin  with
   a specific character pattern, use the command:

        sym<ESC>?

   where sym is the character pattern for which you  are  searching,  and
   may  be  one  to six characters long.  DDT searches your symbol tables
   and displays all symbols that  begin  with  that  pattern.   DDT  also
   displays  all modules in which the symbol is found, whether the symbol
   is global, and the value of the symbol.  In addition,  if  the  symbol
   represents  a  value  in  which  only one bit is set, DDT displays the
   number of the bit.

   For example, the command fdb<ESC>?

   might cause the following display:

        FDBIN    INOUT   G   3
        FDBOUT   INOUT   G   2   (1B34)
        FDB   MOD1      7



   7.7  LISTING UNDEFINED SYMBOLS

   To get a list of all currently undefined symbols, enter

        ?

   DDT displays a list containing each undefined symbol.

                                    7-4
                        Manipulating Symbols in DDT


   7.8  LOCATING SYMBOL TABLES WITH PROGRAM DATA VECTORS

   DDT Version 43 can access symbol tables pointed to by JOBDAT, by  PDVs
   (program data vectors) and by values you store in DDT.

   The command <ESC>5M  returns  the  address  of  a  DDT  location  that
   contains  information  to direct DDT to the current symbol table.  The
   symbol $5M refers to the memory location at the  address  returned  by
   the <ESC>5M command.

   If the value contained  in  $5M  is  negative  (bit  0  is  set),  the
   right-halfword  contains  the  number of the section that contains the
   JOBDAT area.

   If the value contained in $5M is positive (bit zero is clear, and  the
   value  in  $5M is nonzero), $5M contains the 30-bit address of the PDV
   currently in use by DDT.

   If $5M contains zero, DDT uses values (which  can  be  stored  by  the
   user)  pointed to by locations 770001 and 770002 of UDDT, to determine
   which symbol  table(s)  to  use.   The  algorithm  that  DDT  uses  is
   described below.

   To set $5M to a PDV address, enter

        addr<ESC>5M

   where addr is the the PDV address.  If you know the PDV name, you  can
   enter

        <ESC><ESC>:/name/

   where name is the name of the PDV, and the slashes (/)  represent  any
   characters  that do not appear in name.  If name is a null string, DDT
   searches for a PDV with no name or  a  null  name.   DDT  ignores  any
   characters in name beyond a length of 39.

   DDT searches for a PDV named name, and places its address in $5M.   If
   DDT  does  not  find  the  PDV, it displays ?  and sounds the terminal
   buzzer or bell.

   You can learn the names of the PDVs associated with  your  program  by
   using the TOPS-20 commands:

        @GET program-name
        @INFORMATION VERSION

   To display the name of the PDV addressed by $5M, enter

        <ESC><ESC>1:

   If $5M contains the address of a PDV, DDT displays  the  name  of  the
   PDV;  otherwise, it does nothing.

                                    7-5
                        Manipulating Symbols in DDT


   Whenever DDT is entered from its start address or from  a  breakpoint,
   if $5M is zero, DDT initializes $5M according to the following rules:

         o  If XDDT was started  by  the  UDDT  stub,  AND  the  location
            addressed by location 770001 in the stub has bit zero set:

             >  DDT uses the location addressed by  location  770001  (in
                the  stub)  as  an  IOWD pointer to a symbol table in the
                section that contains the stub.

             >  DDT uses the location addressed by  location  770002  (in
                the  stub)  as  as  IOWD  pointer to the undefined symbol
                table in the section that contains the stub.

         o  If XDDT was not started by the UDDT  stub,  OR  the  location
            addressed by location 770001 in the stub has bit zero clear:

             >  If no PDVs exist, DDT sets $5M to -1,,n, where n is:

                 *  the section that contains the UDDT stub (if the  stub
                    exists)  OR

                 *  the section that contains the  entry  vector  (if  an
                    entry vector exists)  OR

                 *  section zero.

             >  If there is one (only) PDV, DDT sets $5M to  the  address
                of the PDV.

             >  If there is more than one PDV, DDT examines  word  .PVSYM
                of each PDV in ascending memory order (DDT first looks at
                the PDV closest to 0,,0).  DDT then sets $5M to:

                 *  the address of the first (lowest in memory) PDV  that
                    contains a .PVSYM word that contains a global address
                    (if there is one).

                 *  the address of the first (lowest in memory) PDV  that
                    exists  in  or above the section containing the entry
                    vector (if there is one).

                 *  the address of the first (lowest in memory) PDV.


                                    NOTE

                  DDT ignores its  own  PDV  when  setting
                  $5M.





                                    7-6











                                 CHAPTER 8

                         INSERTING PATCHES WITH DDT



   To replace the instruction at the  open  location  with  a  series  of
   instructions  and  test the new instructions without reassembling your
   program, you can use the DDT  patch  function.   DDT  deposits  (in  a
   patching   area)   the   replaced   instruction,  the  new  series  of
   instructions, and one or more JUMPA instructions back to the main line
   of your program.  DDT also deposits (in the location that contains the
   replaced instruction) a JUMPA instruction to the  first  word  of  the
   patch.

   To insert a patch that will be executed before the instruction at  the
   open location, enter

        {expr}<ESC><

   where expr is the start of the patching location, and  defaults  first
   to  PAT..,  then  to  PATCH.   KDDT  and  MDDT default to FFF (an area
   created during the monitor build), PAT.., and PATCH,  in  that  order.
   If  you  do not enter expr, and DDT finds none of the default symbols,
   DDT uses the value contained in JOBDAT location .JBFF as  the  address
   to begin the patch.  If expr is a symbol (or the default), DDT updates
   the symbol table when you terminate the  patch,  so  that  the  symbol
   identifies the first word after the patch that you just terminated.

   If the left half of expr is zero, DDT  defaults  the  section  to  the
   section  that contains the open location.  If the left half of expr is
   a value that is not the section that contains the open  location,  DDT
   displays the message:

        ?CAN'T PATCH ACROSS SECTIONS

   If there is no open location when you initiate the patch, DDT displays
   "?" and sounds the terminal buzzer or bell.


                                    NOTE

                  If expr is an AC address, or resolves to
                  a  value  less than 0,,140, DDT displays

                                    8-1
                         Inserting Patches with DDT


                  "?" and sounds the  terminal  buzzer  or
                  bell.


   When you issue a command to start a patch, DDT saves  the  address  of
   the  open  location,  closes  the  open  location, changes the current
   location to the first word in the patching area, and opens that  word.
   DDT  also  displays  the address and contents of the first word of the
   patching area.  For example:

        <ESC><
        PAT../   0

   You can now enter the patch, using deposit instructions (the  expr<LF>
   format  is  probably  most  useful).  DDT updates the current and open
   locations according to the rules for the command that you use.


   To terminate the patch, enter

        {expr}<ESC>{n}>

   where expr is the last word of the patch you are entering,  and  n  is
   the  number  of  returns  possible  from  execution of the patch.  The
   default for n is 2, allowing for a return to 1 + the  address  of  the
   instruction being replaced, and for a "skip return" to 2 + the address
   of the instruction being replaced.

   When you terminate the  patch,  DDT  deposits  the  instruction  being
   replaced  into  the  first  location  following  the current location,
   unless:

         o  display is not suppressed by !  AND

         o  the current location is zero  AND

         o  the current location is closed  OR  you omitted expr

   in which case DDT deposits the instruction  being  replaced  into  the
   current  location.  This prevents the patch from containing unintended
   null words.

   DDT  deposits  n  JUMPA  instructions  in  the  locations  immediately
   following   the  one  in  which  it  deposited  the  original  program
   instruction.  The first JUMPA instruction has 1 in its  A  field,  and
   jumps to 1 + the address of the replaced instruction, the second JUMPA
   instruction has 2 in its A field and jumps to 2 + the address  of  the
   replaced  instruction,  and  so  on.   The  AC  numbers  are  used for
   identification  purposes  only.   Any  JUMPA  instruction  beyond  the
   sixteenth contains 17 in its A field.

   DDT then changes the current location to the location  that  was  open
   when you initiated the patch, deposits in the current location a JUMPA

                                    8-2
                         Inserting Patches with DDT


   instruction to the first word of  the  patch  that  you  entered,  and
   displays  the  address,  original  contents,  and  new contents of the
   current location.  The current location is "open", and can be modified
   by your next command.

   If you default expr, or enter a symbol in  the  {expr}<ESC><  command,
   when you terminate the patch, DDT redefines the symbol that identifies
   the start of the patch.  If DDT used the  value  contained  in  JOBDAT
   location  .JBFF  as  the address of the patching area, DDT changes the
   values contained in .JBFF and the left half of JOBDAT location  .JBSA.
   In  all  cases,  the  new  value is the address of the memory location
   after the last word of the patch.

   By default, there are 100 (octal) words in  the  patching  area.   DDT
   does  not  check  whether your patch overflows the patching area.  You
   can control the size of the patching area with the  /PATCHSIZE  switch
   in LINK.


                                    NOTE

                  DDT allows you to use other DDT commands
                  while you are in the process of entering
                  a patch.  DDT does not check whether the
                  current  and  open  locations are in the
                  patching  area,  or  whether   you   are
                  entering patch instructions in sequence.
                  When  you  terminate  the   patch,   DDT
                  deposits  the instruction being replaced
                  in the current  location  regardless  of
                  whether  the  current location is in the
                  patching area.


   To insert a patch that will be executed after the instruction  at  the
   open location, enter

        {expr}<ESC><ESC><

   where expr is the address of the  patching  location  (PAT..   is  the
   default).   The results are the same as inserting the patch before the
   instruction as above, except:

         o  When you open the patch DDT deposits the replaced instruction
            in the first word of the patch.

         o  When you terminate the patch, DDT deposits  the  first  JUMPA
            instruction  (rather  than the instruction being replaced) in
            the first location following the current location unless:

             >  display is not suppressed by !  AND



                                    8-3
                         Inserting Patches with DDT


             >  the current location is zero  AND

             >  the current location is closed  OR  you omitted expr

            in which case DDT deposits the first JUMPA instruction in the
            current   location.   This  is  to  prevent  the  patch  from
            containing unintended null words.


                                    NOTE

                  If expr is an AC address, or resolves to
                  a  value  less than 0,,140, DDT displays
                  "?" and sounds the  terminal  buzzer  or
                  bell.


   Figure 8-1 illustrates  the  patching  function.   The  program  being
   patched  is  X.MAC  (see  Figure  2-1).   The  patch  inserts  a SKIPN
   instruction that is to be executed after the instruction at START+4.


      DDT Output             User Input        Explanation

   START+4/   MOVE 2(IDX)                  As a result of your last
                                           command, DDT displays the
                                           contents of START+4.

                            <ESC><ESC><    Enter <ESC><ESC>< to start
                                           the patch.

   PAT../   0   MOVE 2(IDX)                DDT displays the address
                                           and contents of the first word
                                           word of the patch area, and
                                           deposits the instruction from
                                           START+4 in the first word of
                                           the patch.

   PAT..+1/   0                            DDT displays the address
                                           and contents of the next word
                                           of the patch area.

                               pat..=      Check the address of PAT.."
                                           (the first word of the patch
                                           area).

   176                                     DDT displays the current
                                           address of PAT...

                         skipn 1,0<ESC>2>  Enter the new instruction,
                                           and terminate the patch with 
                                           a normal return and one skip
                                           return by entering <ESC>2>.

                                    8-4
                         Inserting Patches with DDT


   PAT..+2/   0   JUMPA 1,START+5          DDT displays the next word
                                           of the patch area, then
                                           deposits a JUMPA instruction
                                           to 1 + the address of the
                                           replaced instruction.

   PAT..+3/   0   JUMPA 2,START+6          DDT displays the address
                                           and contents of the next word
                                           of the patch area, then 
                                           deposits a JUMPA instruction
                                           to 2 + the address of the
                                           replaced instruction.

   START+4/   MOVE 2(IDX)   JUMPA STACK+17

                                           DDT displays the address
                                           and original contents of the
                                           replaced instruction, then
                                           deposits and displays a
                                           JUMPA instruction to the
                                           first word of the patch.
                                           START+4 is the current
                                           location, and is "open".

                               pat..=      Check the address of the
                                           patch area.


   202                                     DDT updated "PAT..".


   Figure 8-1:  Annotated Patching Session


   Figure 8-2 shows the terminal display as it actually appears when  you
   insert the patch described above.  Your input is in lowercase.


















                                    8-5
                         Inserting Patches with DDT


        START+4/   MOVE 2(IDX)   $$<
        PAT../   0   MOVE 2(IDX)
        PAT..+1/   0   pat..=176   skipn 1,0$2>
        PAT..+2/   0   JUMPA 1,START+5
        PAT..+3/   0   JUMPA 2,START+6
        START+4/   MOVE 2(IDX)   JUMPA STACK+17   pat..=202


   Figure 8-2:  Terminal Display of Patching After an Instruction


   Figure 8-3 shows the terminal display when inserting  the  same  patch
   before  the  instruction at START+4.  You enter the instruction in the
   form expr<LF> (user input is lowercase).  Note the use  of  the  patch
   termination command without expr and without n.
        START+4/   MOVE 2(IDX)   $<
        PAT../   0   .=176   skipn 1,0
        PAT..+1/   0   $>
        PAT..+1/   0   MOVE  2(IDX)
        PAT..+2/   0   JUMPA 1,START+5
        PAT..+3/   0   JUMPA 2,START+6
        START+4/   MOVE 2(IDX)   JUMPA STACK+17   pat..=202


   Figure 8-3:  Terminal Display of Patching Before an Instruction


   To abort the patch you are entering, enter

        <ESC>0<

   DDT displays 3 spaces (or a tab, depending on the  TTY  control  mask)
   and  changes  the  current location to the location that was open when
   you initiated the patch.  The symbol that denotes  the  start  of  the
   patching area is unchanged.  Any deposits that you made as part of the
   patch remain in the patching area.  This allows  you  to  restart  the
   same patch, or to write over the patch with a new one.

















                                    8-6











                                 CHAPTER 9

                                   FILDDT



   9.1  INTRODUCTION

   FILDDT is a utility used to examine and change disk files and physical
   disk  blocks.  You can also use FILDDT to examine monitor crash dumps,
   and to examine the running monitor.  With FILDDT, you can look at .EXE
   files  as  if they had been loaded with the monitor GET command, or as
   if they were binary data files.

   In selecting a disk file, a disk, or the monitor with FILDDT, you  are
   really  establishing  the  virtual address space that FILDDT accesses.
   When discussing the contents of that virtual address space, where  the
   contents  can  be any of the above objects, this chapter uses the term
   target.

   Once you have accessed a target, you can examine and  modify  it  with
   the  DDT  examine  and  modify commands (you cannot modify the running
   monitor with FILDDT), and then save it with your  modifications.   You
   can  use all of DDT's commands for examining and modifying memory, but
   you cannot use any  commands  that  cause  the  execution  of  program
   instructions,  such  as  <ESC>X, <ESC>G, and so on.  If you attempt to
   execute a program instruction, FILDDT sounds the  terminal  buzzer  or
   bell.



   9.2  USING FILDDT

   There are two command levels in FILDDT.  This document refers to these
   two levels as FILDDT command level and DDT command level.

   FILDDT command  level  accepts  FILDDT  commands  to  control  session
   parameters  and  to  select  the target.  FILDDT command level employs
   TOPS-20 command recognition and help.  When at FILDDT  command  level,
   FILDDT displays the prompt:

        FILDDT>



                                    9-1
                                   FILDDT


   Once you access a target, FILDDT enters DDT  command  level.   At  DDT
   command level, use DDT commands to examine and modify the target.


   The syntax of a FILDDT command-level command is:

        command {file-spec{/switch...}}

   where command is  a  FILDDT  command-level  command,  file-spec  is  a
   TOPS-20  file specification, and switch invokes a specific function or
   parameter about the function that you can  perform  (enable  patching,
   for  example).   You  can  use FILDDT commands to invoke functions and
   parameters that are invoked by analogous FILDDT switches.

   With a FILDDT command you can:

         o  request HELP on FILDDT

         o  specify the target to be examined

         o  invoke FILDDT functions

         o  establish certain parameters about the functions that you can
            perform

         o  enter DDT command level

         o  exit FILDDT

   A FILDDT command can have more than one of the above effects.


   The commands and switches are described below.

   At TOPS-20 command level, start FILDDT by entering:

        FILDDT

   FILDDT enters FILDDT command level and prompts:

        FILDDT>



   9.2.1  FILDDT Commands

   There are two classes of FILDDT-level commands;  those that select the
   target that FILDDT is to access and those that establish what function
   FILDDT is to perform for the target (enable patching, extract symbols,
   and treat an .EXE file as data).

   The following are the targets (virtual address spaces) that FILDDT can
   access, and the commands that select them:

                                    9-2
                                   FILDDT


         o  disk files                          GET

         o  disk structures                     DRIVE, STRUCTURE

         o  the running monitor                 PEEK


   To examine and patch disk structures, you must have  WHEEL,  OPERATOR,
   or  MAINTENANCE  privileges  enabled.  To examine the running monitor,
   you must have WHEEL or OPERATOR privileges enabled.


   Following are the parameters you can invoke for  the  target  and  the
   commands and switches that select them:


         o  treat file as pure binary data     ENABLE DATA-FILE   /DATA

         o  enable patching                    ENABLE PATCHING    /PATCH

         o  enable thawed access               ENABLE THAWED      /THAWED

         o  load symbol table only from file   LOAD               /SYMBOL


   To get HELP, enter

        HELP

   FILDDT displays a very brief description of the  FILDDT  commands  and
   redisplays the FILDDT> prompt.


   To return to TOPS-20 command level from FILDDT command level, enter

        EXIT



   9.2.2  Symbols

   To enhance performance, FILDDT uses a symbol table that it  builds  in
   its  own  address  space,  rather  than one which exists in the target
   address space.

   FILDDT automatically extracts symbols to  build  its  internal  symbol
   table from the first .EXE file it loads during a session.  Once FILDDT
   has an internal symbol table, it ignores any symbols  in  subsequently
   loaded  .EXE  files unless you use the LOAD command or the GET command
   with the SYMBOL switch.




                                    9-3
                                   FILDDT


   9.2.3  Commands to Establish Formats and Parameters

   ENABLE DATA-FILE

        If you specify an .EXE file, DDT (by default) loads the  file  in
        virtual  memory  as  if  it were to be executed.  You can use the
        ENABLE DATA-FILE command to look at an .EXE file as if it were  a
        data file.  FILDDT then loads the entire file (including the .EXE
        directory block) as a binary file, starting at  virtual  location
        zero.   You  can accomplish the same thing by appending the /DATA
        switch to the file-spec when you use the GET command.


   ENABLE PATCHING

        The ENABLE PATCHING lets you modify the  target.   You  can  also
        enable  patching  by appending the /PATCH switch to the file-spec
        when you use the GET command.  If you do not enable patching, you
        can only examine the target.  If you attempt to modify the target
        but have not enabled patching, FILDDT displays the message:

             ? Patching is not enabled

        Note that you cannot enable patching in FILDDT  with  the  <ESC>W
        command.


   ENABLE THAWED

        The ENABLE THAWED command lets you examine  and  modify  (if  you
        enable  patching) files that require thawed access.  You can also
        use the /THAWED  switch  when  loading  the  file  with  the  GET
        command.


   LOAD

        The LOAD command tells FILDDT to copy the symbol table  from  the
        file  named  by  file-spec.   Once  FILDDT has built its internal
        symbol table, FILDDT displays the message:

             [n symbols loaded from file]

        where n is the number of symbols that FILDDT extracted  from  the
        file.  FILDDT then again prompts you with FILDDT>.

        You can also load symbols from the file you specify  in  the  GET
        command by appending the /SYMBOL switch to the file-spec.

        If the file you specify is not an .EXE file, FILDDT displays  the
        message:

             % Not in .EXE format -- Data file assumed.

                                    9-4
                                   FILDDT


             ? Symbols cannot be extracted from a data file

        FILDDT then redisplays its prompt.



   9.2.4  Commands to Access the Target and Enter DDT

   DRIVE

        The DRIVE command allows  you  to  access  a  physical  structure
        directly.  This may be useful if the home block has been damaged.
        To access disk structures  with  FILDDT,  you  must  have  WHEEL,
        OPERATOR, or MAINTENANCE privileges enabled.

        If you wish to be able to patch the disk structure, you must give
        the ENABLE PATCHING command before using the DRIVE command.


        To access the disk structure, enter

             DRIVE c k u

        where c is the channel, k is the controller, and u is the unit.

        If the unit is part of a mounted structure, FILDDT displays:

             [Unit is part of structure name]

        where name is the logical name of the disk structure.

        If FILDDT successfully access the unit, FILDDT enters DDT command
        level and displays:

             [Looking at unit u on controller k on channel c]

        where c is the channel, k is the controller, and u is the unit.


   GET

        The GET command tells FILDDT to load the file  you  name,  invoke
        any  parameters  for  which  you  specify switches, and enter DDT
        command level.  Legal switches are /DATA,  /PATCH,  /SYMBOL,  and
        /THAWED, and correspond to the ENABLE DATA-FILE, ENABLE PATCHING,
        LOAD, and ENABLE THAWED commands, respectively.

        If FILDDT extracts symbols and builds an internal  symbol  table,
        it displays:

             [n symbols loaded from file]

        where n is the number of symbols loaded.

                                    9-5
                                   FILDDT


        When FILDDT has loaded the file, it displays:

             [Looking at file file-spec]

        where file-spec is the TOPS-20 file specification of the file.

        If FILDDT does  not  find  the  file,  it  displays  one  of  the
        following:

             ? Invalid file specification, message

        where message is a TOPS-20 error string.


   PEEK

        Use the PEEK command to examine  the  running  monitor.   To  use
        FILDDT  to  examine  the  running monitor, you must have WHEEL or
        OPERATOR privileges enabled.

        Once you have invoked FILDDT, if you  wish  to  be  able  to  use
        monitor symbols when looking at the running monitor, you must use
        the LOAD command first:

             LOAD SYSTEM:MONITR.EXE

        You cannot patch the running monitor with FILDDT.

        To examine the running monitor, enter

             PEEK

        FILDDT displays:

             [Looking at running monitor]

        and enters DDT command level.


                                      NOTE

            You cannot use FILDDT to  PEEK  at  the  running  monitor
            unless  you  are using normal virtual addressing.  If you
            are PEEKing the monitor and change memory  mapping  to  a
            mode  other  than  normal  virtual  addressing  with  the
            n<ESC>0U, n<ESC>1U, n<ESC>2U,  or  $$U  commands,  FILDDT
            does  not  give  an  error.   However,  every page in the
            monitor then appears to DDT to be non-existent.  In  this
            case,  most  attempts  to  reference memory causes DDT to
            display ?, sound the terminal buzzer or bell, and set the
            error  string  to "CAN'T PEEK PHYSICAL".  Searches do not
            cause errors, but never discover matches.


                                    9-6
                                   FILDDT


   STRUCTURE

        The STRUCTURE command allows you to access a  disk  structure  by
        its  logical  name.   To  access disk structures with FILDDT, you
        must have WHEEL, OPERATOR, or MAINTENANCE privileges enabled.

        If you wish to be able to patch the disk structure, you must give
        the ENABLE PATCHING command before using the STRUCTURE command.

        To examine a disk structure, enter

             STRUCTURE name

        where name  is  the  logical  name  of  the  structure.   If  the
        structure  contains  more  than one physical disk, you can access
        the entire logical structure.

        If FILDDT successfully accesses  the  structure,  it  enters  DDT
        command level and displays:

             [Looking at file structure name]

        where name is the logical name of the structure.



   9.2.5  Exiting FILDDT

   When you are through examining and  modifying  the  target,  save  the
   modified file by entering:

        <CTRL/E>

   FILDDT closes the file, saving any changes that  you  have  made,  and
   returns to FILDDT command level.

   Any symbol table that you  have  loaded  (explicitly  or  by  default)
   remains  loaded until you specify another with the LOAD command or the
   /SYMBOL switch.

   If you have modified symbols, FILDDT also modifies the symbol table of
   the disk file, if one of the following occurred:

         o  FILDDT automatically loaded the symbol table.

         o  you loaded the symbol table and entered DDT command level  by
            entering:

            GET file-spec/SYMBOL


   To close the file, save all modifications (as  with  <CTRL/E>,  above)
   and exit from FILDDT, enter

                                    9-7
                                   FILDDT


        <CTRL/Z>


   When you exit FILDDT, you can save FILDDT  with  its  internal  symbol
   table.   This  saves  time if you often use FILDDT to debug a specific
   file (such as the monitor) that has a very large symbol table.

   Start FILDDT, load the symbol table, then exit.  Use the TOPS-20  SAVE
   command to create a copy of FILDDT to be used with that specific file.

   For example (your input is in lowercase):

        @filddt
        FILDDT>load system:monitr.exe
        [34472 symbols loaded from file]
        FILDDT>exit
        @save
         FILDDT.EXE.1 Saved




































                                    9-8











                                 CHAPTER 10

                          PRIVILEGED MODES OF DDT





                                    NOTE

                  This chapter makes no attempt to explain
                  internal   monitor   mechanisms.    This
                  chapter assumes that you  are  aware  of
                  various   monitor   contexts.    Certain
                  monitor contexts may interfere  with  or
                  be   interfered   with  by  DDT  context
                  switching.  It is up to you to be  aware
                  of   these.   Note  also  that  internal
                  monitor  locations  that  are  used   in
                  examples  in this chapter are subject to
                  change in subsequent monitor releases.





   10.1  MDDT

   MDDT  is  used  to  debug  and  patch  the  running   monitor   during
   timesharing, and is an integral part of the swappable monitor.  To run
   MDDT, you must have WHEEL or OPERATOR privileges enabled.

   To invoke MDDT, start DDT  and  then  execute  the  MDDT%  JSYS.   For
   example (user input is lowercase):

        @enable
        $ddt
        DDT
        mddt%<ESC>x
        MDDT

   You can also invoke MDDT by running a MACRO-20 program  that  executes
   the MDDT% JSYS.


                                    10-1
                          Privileged Modes of DDT


   MDDT runs in the executive virtual address space of the  process  that
   executed the MDDT% JSYS.  While in MDDT, you are still running in user
   context, you are  running  under  timesharing,  and  your  process  is
   subject to being swapped out, as is any other user process.

   If for some reason you cannot access system files, you can enter  MDDT
   through the MEXEC, as follows:

        @enable
        $<CTRL/E>QUIT
        MX>/

   where the / (slash) command to MEXEC enters MDDT.


   To exit MDDT, enter

        mretn<ESC>g

   or enter <CTRL/Z>.



   10.2  KDDT

   You can run KDDT in executive mode or in user mode.  KDDT in executive
   mode  is  used to debug parts of the monitor which can not be debugged
   interactively such as those modules that deal with physical memory  or
   paging.  KDDT in user mode is used to debug and patch the monitor .EXE
   file, which you can then save for BOOTing at a later time.

   KDDT is part of the resident monitor.  When running KDDT in  executive
   mode,  you  can  exercise  any  normal DDT functions, such as changing
   memory and setting breakpoints.  When you stop  at  a  breakpoint  and
   control passes to KDDT, timesharing (if in effect) ceases.


   To run KDDT in executive mode use the  /E  command  when  BOOTing  the
   monitor.  For example (user input is in lowercase):

        BOOT>/e             ;Enter /e
        [BOOT: LOADING] [OK]
        EDDT                ;EDDT is loaded and waiting for your command

   Your debugging may be easier if you  lock  the  swappable  monitor  in
   core.  You can do this by executing the instruction that calls monitor
   routine SWPMLK.  For example:

        CALL SWPMLK<ESC>X



   To run KDDT in user mode:

                                    10-2
                          Privileged Modes of DDT


        @get system:monitr.exe
        @start 140
        DDT

   You can use KDDT in user mode to patch the monitor (.EXE  file)  which
   will be booted the next time the system is BOOTed up.

   After you have started KDDT as above, use the DDT patching commands to
   insert  your  patch.   When  your  patch  is  complete, exit KDDT with
   <CTRL/Z> and use the TOPS-20 SAVE command to save the patched  version
   of the monitor.  For example:

        <ESC><                   ;ESCAPE key followed by a left angle 
                                 ;bracket.
         ....
         ....                    ;Enter the patch.
        <ESC>>                   ;ESCAPE key followed by right angle 
                                 ;bracket.
        <CTRL/Z>                 ;Exit KDDT
        @save system:monitr.exe  ;Save the new version.



   10.3  EDDT

   You can use EDDT to debug user programs that run  in  executive  mode.
   You must load EDDT.REL with your program, as follows:

        @LINK
        *SYS:EDDT.REL,PROG/GO
        @SAVE PROG

   where PROG is the name of your MACRO-20 program.





















                                    10-3
























































                                    10-4











                                 CHAPTER 11

                  PHYSICAL AND VIRTUAL ADDRESSING COMMANDS





   FILDDT, EDDT and KDDT can do their own  page  mapping.   The  commands
   described  in  this  chapter allow you to set parameters to govern the
   interpretation of the address space that you are examining.   You  can
   control the mapping of the address space you are examining by choosing
   to use or bypass the user process table (UPT) or the executive process
   table  (EPT).   You can choose which special pages table (SPT) to use,
   and which hardware register block to use.  Other commands allow you to
   emulate either KI-paging or KL-paging, control address relocation, and
   set memory protection limits.  These commands are  available  only  in
   FILDDT  and  KDDT.   In  each  of the following commands, the argument
   (page, addr, n) defaults to zero.

   Note that the DDT  commands  <ESC>G,  <ESC>P,  and  <ESC>X  have  side
   effects that affect your control over physical and virtual addressing.
   In addition to their normal functions,  these  commands  also  do  the
   following:

         o  restore normal virtual addressing as if <ESC>U had been given
            (<ESC>X does NOT do this)

         o  set the FAKEAC flag (as if <ESC>U had been given)

         o  clear the relocation factor (as if 0<ESC>8U had been given)

         o  reset   the   address-protection    address    to    infinity
            (377777,,777777)

         o  restore the active hardware register block to the one in  use
            before any <ESC>4U command was given








                                    11-1
                  Physical and Virtual Addressing Commands


   Command                  Description

   <ESC>U

        This command enables memory mapping by standard  TOPS-20  virtual
        addressing.  When you give this command, DDT restores the virtual
        addressing  conditions   that   were   in   effect   before   any
        {<ESC>}<ESC>nU  (where  0<=n<=2)  commands  were  given, and sets
        DDT's FAKEAC  flag,  thereby  forcing  DDT  to  interpret  memory
        addresses  0-17  as  DDT's own internal "registers", in which the
        user's registers were saved.


   <ESC><ESC>U

        This command enables DDT to use actual  physical  addresses  when
        accessing  memory,  and  clears DDT's FAKEAC flag, causing DDT to
        interpret memory addresses 0-17 as the hardware  registers  0-17.
        This  command  is  meaningful  only  when using KDDT in executive
        mode, or when using FILDDT to look at the running  monitor  or  a
        core dump.  Although DDT accepts <ESC><ESC>U at other times, this
        command then produces the same effect as <ESC>U.


   The general syntax of the following virtual addressing commands is:

        arg<ESC>nU

   where n is the function number of the command, and arg is dependent on
   the function (see the function descriptions below).


   Functions 0, 1,  and  2  enable  you  to  control  memory  mapping  by
   selecting the executive process table (EPT), user process table (UPT),
   or the section map through which mapping occurs.   Setting  a  mapping
   condition  with  any one of these functions (0, 1, and 2) also has the
   effect of clearing the effects of  any  prior  use  of  one  of  these
   functions (0, 1, and 2).

   You can also specify the offset into the  special  pages  table  (SPT)
   with functions 0, 1, and 2 by using the following command:

        arg<ESC><ESC>nU

   where arg is the SPT offset, and 0<=n<=2.  This form is legal only  if
   KL-paging is in effect.


                                    NOTE

                  All  forms  of  <ESC>B  and  <ESC>X  are
                  illegal   if  you  have  used  the  page
                  mapping functions (0, 1, or 2) and  have

                                    11-2
                  Physical and Virtual Addressing Commands


                  not  restored  standard mapping with the
                  <ESC>U command.



     Command                Description

   page<ESC>0U

        This command causes memory mapping to occur through the executive
        process table (EPT) that is located at physical page page.


   offset<ESC><ESC>0U

        This command produces the same  effect  as  page<ESC>0U  (above),
        except that offset is an offset (in words) into the SPT.


   page1<page2<ESC>0U

        This command is an exception to the general syntax, and is  legal
        only  under  KI-paging.   You can select both the user page table
        (UPT) and the executive page table (EPT) with this command, where
        page1 is the page number of the UPT, and page2 is the page number
        of the EPT.  Follow page1 with a left angle bracket (<).


   page<ESC>1U

        This command causes memory mapping  to  occur  through  the  user
        process  table (UPT) that is located at physical page page.  With
        this command, you can bypass the EPT.


   offset<ESC><ESC>1U

        This command produces the same  effect  as  page<ESC>1U  (above),
        except that offset is an offset (in words) into the SPT.


   page<ESC>2U

        This command causes mapping to occur through the section  map  at
        physical  page  page.  This command is legal only if KL-paging is
        in effect.


   offset<ESC><ESC>2U

        This command produces the same  effect  as  page<ESC>2U  (above),
        except  that  offset  is an offset (in words) into the SPT.  This
        command is legal only if KL-paging is in effect.

                                    11-3
                  Physical and Virtual Addressing Commands


   n<ESC>3U

        This command determines  whether  DDT  interprets  references  to
        memory  locations 0-17 as references to hardware registers, or to
        DDT's  own  internal  "registers"  (which  normally  contain  the
        user-program ACs), by setting or resetting DDT's FAKEAC flag.

        If n=0, reset FAKEAC flag (use the hardware registers 0-17).
        If n is nonzero, set FAKEAC flag (use  DDT's  internal  registers
        0-17).

        If you enter a nonzero value for n, DDT stores the value -1.


   n<ESC>4U

        This  command  tells  DDT  to  copy  hardware  register  block  n
        (0<=n<=7)  to  its  own  internal  register block, set the FAKEAC
        flag, and use hardware register block n as its own registers.  If
        the  FAKEAC  flag  is  set  when you give this command, DDT first
        restores the contents of  its  internal  register  block  to  the
        hardware  register  block  from  which  they  were  copied.  This
        command is legal in executive mode EDDT and KDDT only.  Note that
        the  microcode uses register block 7, and any attempt to use this
        block produces an almost immediate system crash.


   addr<ESC>5U

        This command copies the 20 (octal) word block located at addr  to
        DDT's internal "registers" and sets the FAKEAC flag.


   addr<ESC>6U

        This command sets the special pages table (SPT) to addr.


   addr<ESC>7U

        This command sets the core status table address (CST) to addr.


   addr<ESC>8U

        This command sets the address relocation  factor  to  addr.   DDT
        adds addr to all user addresses that you enter.


   addr<ESC>9U

        This command read-and-write-protects  all  addresses  above  addr
        (before adding relocation factor).

                                    11-4
                  Physical and Virtual Addressing Commands


   n<ESC>10U

        This command controls whether KI paging is enabled or cleared.

        If n is nonzero, KI paging is enabled.
        If n=0, KI paging is cleared.

        If you enter a nonzero value for n, DDT stores the value -1.


   n<ESC>11U

        This command controls whether KL paging is enabled or cleared.

        If n is nonzero, KL paging is enabled.
        If n=0, KL paging is cleared.

        If you enter a nonzero value for n, DDT stores the value -1.



   You can interrogate DDT  to  determine  the  last  virtual  addressing
   command that was given for a specific function.  The command:

        <ESC>nU

   where 0<=n<=11, returns the address of a DDT  location  that  contains
   the argument that was given if the command for that function was used,
   and returns the default value if that function was not used.   If  you
   entered  a nonzero argument to a command that requires zero or nonzero
   values (or if the default is nonzero), this location contains -1.  You
   can use DDT commands to examine this location.


   The command:

        <ESC><ESC>nU

   where 0<=n<=2, returns the address of a  DDT  location  that  contains
   information  that  indicates  which function you used, and whether you
   set a page address or an offset.  You can use DDT commands to  examine
   this  location.   This command is illegal for all functions where n>2.
   If you did not enter any commands affecting functions  0-2  since  the
   last <ESC>U command, the right half of this DDT location word contains
   zero.  Otherwise, the right half contains n+1, where n is  the  number
   of  the  command  function  you used.  If you set a page address (with
   arg<ESC>nU), bit 1 of this word is reset.  If you set an offset  (with
   arg<ESC><ESC>nU), bit 1 of the word is set.






                                    11-5











                                 CHAPTER 12

                            EXTENDED ADDRESSING



   12.1  LOADING DDT INTO AN EXTENDED SECTION

   If your program is loaded in a nonzero section, merge  DDT  with  your
   program with the usual command:

        @DDT

   DDT is loaded into the highest-numbered  free  (nonexistent)  section.
   If  your program has a TOPS-10-style entry vector in section zero, the
   EXEC merges the UDDT stub into the section  that  contains  the  entry
   vector, and places that section's JOBDAT symbol table pointers (.JBSYM
   and .JBUSY) into the DDT locations pointed to by UDDT locations 770001
   and  770002.   UDDT  then  loads  XDDT  into the highest-numbered free
   section.  You can load DDT into a specific  section  with  the  EXEC's
   /USE-SECTION switch:

        @DDT/USE-SECTION:n

   where n is the (octal) section number  of  a  section  that  does  not
   already exist.

   You can load DDT into an existing section with  the  /USE-SECTION  and
   /OVERLAY  switches.   You  must be careful, however, that your program
   does not use any pages  that  DDT  uses.   See  the  TOPS-20  COMMANDS
   REFERENCE MANUAL for more information about the use of these switches.



   12.2  EXAMINING AND CHANGING MEMORY

   The commands /, [, ], !, \ and <TAB> (see Section 4.4.3) open a memory
   location  at  an  address  calculated  from  an  expression entered or
   defaulted in the command.  The syntax of the command is:

        {expr}{<ESC>{<ESC>}}c

   where c is the command, and expr is any  legal  DDT  expression  (expr
   defaults to $Q, the current quantity).

                                    12-1
                            Extended Addressing


   In nonzero sections, you can cause DDT to utilize all indirection  and
   indexing  indicated  by  EFIWs  (extended  format  indirect  words) to
   calculate 30-bit global addresses by using the format:

        {expr}<ESC><ESC>c

   This format also recognizes and utilizes instruction  format  indirect
   words  (IFIW).   These  commands are thoroughly described in Chapter 4
   (Displaying and Modifying Memory).



   12.3  BREAKPOINTS

   If DDT is running in a nonzero section, breakpoints can be set in  any
   section.



   12.3.1  The Breakpoint Block

   To set breakpoints in a section external to the  one  containing  DDT,
   DDT  requires  an area of contiguous storage in the section containing
   the breakpoint.  This area is known as the  "breakpoint  block".   The
   extra  storage is required for saving global addresses for transfer of
   control between your program and DDT, and also for  the  execution  of
   single-stepped  instructions  that reference memory locations that are
   not in their section.

   Each section within your program space that contains a breakpoint must
   have  one breakpoint block.  Breakpoint blocks are located at the same
   relative local address within each section (the  default  is  777700),
   and are 100 (octal) words in size.

   Each  breakpoint  block  is  always  contiguous  within  one  section.
   Breakpoint  blocks  never  extend  across section boundaries and never
   "wrap around" the end of a section to the beginning of the section.

   DDT creates a  breakpoint  block  in  each  section  as  required,  if
   inter-section breakpoints are enabled (see below).

   You (or your program) can reference memory within a breakpoint  block,
   but any information stored there can be overwritten by DDT.



   12.3.2  Enabling and Disabling Inter-section Breakpoints

   The section-relative (18-bit) address of the  breakpoint  block(s)  is
   stored  in  an internal DDT location.  The command <ESC>4M returns the
   address of that DDT location.   The  symbol  $4M  refers  to  the  DDT
   location   at   the   address   returned  by  <ESC>4M.   Inter-section
   breakpoints are enabled as long as $4M contains  the  address  of  the

                                    12-2
                            Extended Addressing


   breakpoint  block.   At startup, DDT enables inter-section breakpoints
   by default.

   To change the address of the breakpoint block, enter

        n<ESC>4M

   where n is the address of the breakpoint block, and can be  any  legal
   DDT  expression  (20<=n<=777700).   DDT uses only the right half of n,
   and changes only the right half of the DDT location at $4M.

   By default, the section-relative breakpoint block address  is  777700,
   placing  the  breakpoint  block at the top of the section.  To display
   the address of the breakpoint block, enter

        <ESC>4M/


   Inter-section breakpoints are disabled when $4M contains zero.


                                    NOTE

                  In MDDT, $4M  defaults  to  MDDBLK.   In
                  KDDT,  $4M  defaults  to  EDDBLK.   Each
                  symbol denotes the start of  a  100-word
                  (octal)  block contained in page zero of
                  the monitor.  Page zero of  the  monitor
                  is   mapped   into  every  section  that
                  contains monitor code.


   To disable inter-section breakpoints, enter

        0<ESC>4M

   While  inter-section  breakpoints  are  disabled,  you  cannot  set  a
   breakpoint  in  a section external to DDT, and any breakpoints already
   set in such a section are lost when you begin program  execution  with
   <ESC>G,  or  continue program execution with <ESC>P.  DDT displays the
   following error message for each breakpoint lost:

        % CAN'T INSERT $nB - IN NON-DDT SECTION

   where n is the breakpoint number.

   While inter-section breakpoints are disabled, DDT cannot  execute  the
   <ESC>X command when:

         o  you try to execute the instr<ESC>X command, and  the  default
            section is not the section that contains DDT,  OR



                                    12-3
                            Extended Addressing


         o  you try  to  single-step  a  dangerous  instruction  and  the
            user-program PC is not in the section that contains DDT

   When this occurs, DDT displays the error message:

        % CAN'T $X, NO $4M



   12.4  DISPLAYING SYMBOLS IN NONZERO SECTIONS

   DDT normally uses right-halfword values when searching  symbol  tables
   for symbols to display.  However, code linked in a nonzero section has
   symbols defined with the section number  in  the  left-halfword.   DDT
   uses  a  30-bit  value  when  searching  for a symbol in the following
   circumstances:

         o  when displaying the address of a location

         o  when displaying the contents of a location as an address

         o  when displaying the Y field of an instruction

   When displaying an address, DDT searches for a symbol defined with the
   30-bit  value  of  the  address.   If  such a symbol is not found, DDT
   displays the address in halfword format.

   When displaying the Y field of an  instruction,  DDT  searches  for  a
   symbol defined with a 30-bit value consisting of:

         o  the section number of the address of the word being displayed

         o  the section-relative address contained in the Y field of  the
            instruction

   If DDT does not find a symbol defined with that 30-bit value, it looks
   for a symbol defined with the 18-bit value contained in the Y field of
   the instruction.

   Assume a program with the following definitions:

        Symbol LABL1 is defined as 0,,300
        Symbol LABL2 is defined as 3,,300
        Location 1,,300 contains 3,,300
        Location 1,,301 contains 2,,300
        Location 3,,400 contains 200040,,300
               (MOVE contents of location 300 to AC 1)

   When displaying the contents of location 1,,300, DDT displays:

        1,,LABL1/   LABL2

   When displaying the contents of location 1,,301, DDT displays:

                                    12-4
                            Extended Addressing


        1,,LABL1+1/   2,,LABL1

   When displaying the contents of location 3,,400, DDT displays:

        LABL2+100/   MOVE 1,LABL2



   12.5  DEFAULT SECTION NUMBERS

   To reduce the need to enter the section number as part of the  address
   when  you  specify  a location, DDT uses a default section number when
   you do not specify one.  DDT has two section defaulting options:

         o  permanent default section

         o  floating default section


   The command <ESC>6M returns the address of an  internal  DDT  location
   that  contains  section default information.  The symbol $6M refers to
   the DDT location at the address returned by the command <ESC>6M.

   When DDT is in section zero, the  default  section  number  is  always
   zero, regardless of the contents of $6M.


                                    NOTE

                  When you  use  KDDT  in  user-mode,  $6M
                  defaults  to  0,,0.  In all other cases,
                  $6M defaults to 1,,0.



   12.5.1  Permanent Default Section

   If the value contained in $6M is positive (bit  zero  is  reset),  the
   permanent  default  section  option  is in effect.  DDT then takes the
   left half of $6M as the section number of any address that you type in
   without a section number.

   Set the permanent default section by entering:

        n,,0<ESC>6M

   where n is the section number, and can be any legal DDT expression.







                                    12-5
                            Extended Addressing


   12.5.2  Floating Default Section

   If the value contained in $6M is  negative  (bit  zero  is  set),  the
   floating  default  section  option  is in effect.  This is the default
   option (at start-up, DDT initializes $6M  to  -1).   DDT  selects  the
   floating default section as follows:

         o  If you enter DDT from its normal start address, DDT sets  the
            default section to:

             >  the section that contains the program  entry  vector  (if
                there is one)  OR

             >  section zero.


         o  If you enter DDT from a  breakpoint,  DDT  sets  the  default
            section to the section that contains the breakpoint.

         o  If you open a local address between 20 and 777777,  DDT  sets
            the  default  section  to  the section that contains the open
            address.

         o  If you type in an address  that  contains  a  section  number
            (including  a  symbol that is defined with a section number),
            DDT sets the default section to the one in  the  address  you
            typed in.

   If you exit DDT with <CTRL/C> or <CTRL/Z>, and then reenter  DDT,  the
   current  location  does  not change.  If you give a command that takes
   the current location as its default address  argument,  DDT  sets  the
   floating default section to the section of the current location.

   In the following example, the DDT screen display is on the  left,  and
   explanatory  comments  are  on  the  right.   The  entry  vector is in
   section 1.  Symbol START is not defined with a section  number.   User
   typein is in lowercase.

   Screen Display            User Input        Explanation


                               3,,place/   Examine location 3,,PLACE.

   LABL1                                   DDT displays the contents.

                               <LF>        Type in <LF> to examine
                                           the next location.

   3,,PLACE+1/   LABL1+2                   DDT displays the next
                                           location. The floating
                                           default section = 3.

                               <CTRL/C>    Exit with <CTRL/C>.

                                    12-6
                            Extended Addressing


                                           The current location is
                                           3,,PLACE+1.

   @                                       TOPS-20 prompts you.

                               @ddt        Reenter DDT.

   DDT                                     DDT is loaded and ready
                                           for your command. The 
                                           floating default section is
                                           1, because the entry vector
                                           is in section 1.

                               <LF>        Type in <LF> to examine
                                           the next location.

   3,,START+2/   LABL1+4                   DDT displays the address
                                           and contents of the next
                                           location. DDT doesn't use
                                           the floating default section,
                                           because your <LF> command
                                           defaults addr to the current 
                                           location, and uses its 
                                           section number (3).

                               start/      Examine location START.
                                           DDT uses the floating default 
                                           section number because symbol
                                           START is defined with no
                                           section number.

   JFCL 0                                  DDT displays the contents.

                               <LF>        Type in <LF> to examine
                                           the next location.

   1,,START+1/   MOVE 1,LABL1              DDT displays the address
                                           and contents of the location.



   12.6  EXECUTING SINGLE INSTRUCTIONS

   Instructions that are executed by means of the command

        instr<ESC>X

   where instr is the instruction for DDT to execute, are executed within
   the  current  default  section.   If  that section is not the one that
   contains DDT, DDT uses the breakpoint block in that section to execute
   instr.   If  the  floating default section option is in effect and you
   are unsure of the current default section, use the  addr/  command  to
   open a location in the section in which you wish DDT to execute instr.

                                    12-7
                            Extended Addressing


   This sets the default section to the section specified by addr.

   If DDT is to execute the instruction in a section other than  the  one
   that contains DDT, inter-section breakpoints must be enabled.

   If you try to execute instr outside DDT's section  while  intersection
   breakpoints  are  disabled,  DDT  sounds  the terminal buzzer or bell,
   displays "?" and sets its error string to:

        CAN'T $X, NO $4M




   12.7  ENTERING PATCHES IN EXTENDED SECTIONS

   You cannot enter a patch if a patching area  does  not  exist  in  the
   section  that  contains the word to be replaced.  To ensure that there
   is a patching area for each section that contains  user-program  code,
   do one of the following:

         o  reserve the same part of each section for patches, and define
            the patch symbol as 0,,addr, where addr is the address of the
            patching area

         o  define a different symbol for each section's  patching  area,
            and use the symbol appropriate to the section being patched

         o  use only one patching area and map it into all  the  sections
            that contain user-program code


   If the left half of expr is zero, DDT  defaults  the  section  to  the
   section  that contains the open location.  If the left half of expr is
   a value that is not the section that contains the open  location,  DDT
   displays the message:

        ?CAN'T PATCH ACROSS SECTIONS
















                                    12-8











                                 APPENDIX A

                               ERROR MESSAGES



   If DDT or FILDDT  do  not  successfully  execute  your  command,  they
   indicate  this  by  displaying  an  error message.  DDT sometimes (and
   FILDDT usually) displays these messages on the terminal, and at  other
   times  displays  only  a  question mark.  When only a question mark is
   displayed, a location internal to DDT usually points to a text  string
   that  is  the  error message.  To display the error message, enter the
   command:

        <ESC>?


   Following is a list of DDT messages together with explanations of what
   the messages indicate.


   ? ABOVE PROTECTION REGISTER LIMIT

        The address of the location you tried to  display  or  modify  is
        above the protection register limit, which is set by n<ESC>9U.


   ? ACTUAL REFERENCE FAILED

        A memory reference failed unexpectedly (the page  exists  and  is
        readable, but the reference failed anyway).


   ? ADDRESS GREATER THAN 777777

        An address to be mapped through a section  table  has  a  nonzero
        section  number.   This can occur only if you specified a section
        table with the n<ESC>{<ESC>}2U command.







                                    A-1
                               Error Messages


   ? Bad format for .EXE file

        You specified a file that appears to have an .EXE directory,  but
        the directory is badly formatted or DDT cannot read it because of
        some other reason.


   ? BAD $4M VALUE

        You used the n<ESC>4M command where 777700<n<20.


   ? BAD POINTER ENCOUNTERED

        DDT does not recognize the type code  contained  in  a  page  map
        pointer.   This  can  occur only if you are trying to do your own
        virtual address mapping, and used the expr<ESC>{<ESC>}nU command,
        where 0<=n<=2.


   ? CAN'T BE WRITE ENABLED

        Even though you have automatic write-enable  turned  on,  DDT  is
        unable to write-enable a page that exists and is write-protected.


   ? CAN'T CREATE PAGE

        DDT attempted to create a page and failed, or else cannot attempt
        to create the page (see the <ESC>1W command).


   ? CAN'T DEPOSIT INTO SYMBOL TABLE BECAUSE .....

        You tried to define or kill a  symbol,  but  DDT  was  unable  to
        modify  the  symbol  table.  Look up the second part of the error
        message in this appendix.


   ? CAN'T DEPOSIT INTO SYMBOL TABLE BECAUSE DEPOSIT FAILED

        You tried to define or kill a  symbol,  but  DDT  was  unable  to
        modify the symbol table, and cannot identify the specific reason.


   % CAN'T INSERT $nB BECAUSE .....

        DDT is not able to access the location where  you  inserted  your
        breakpoint.  Look up the second part of the error message in this
        appendix.  This situation occurs  before  DDT  tries  to  execute
        <ESC>G, <ESC>P, <ESC>X, or <ESC><ESC>X.



                                    A-2
                               Error Messages


   % CAN'T INSERT $nB BECAUSE IS IN DIFFERENT SECTION

        DDT is not able to access the location where  you  inserted  your
        breakpoint  because  inter-section  breakpoints  are  not enabled
        (<ESC>4M contains zero).  This error occurs before DDT  tries  to
        execute  <ESC>G,  <ESC>P,  <ESC>X,  or  <ESC><ESC>X.   To  enable
        inter-section breakpoints, deposit the breakpoint  block  address
        in the location addressed by the command <ESC>4M.


   % CAN'T INSERT $nB BECAUSE MEM REF FAILED

        DDT is not able to access the location where  you  inserted  your
        breakpoint.  DDT is not able to identify the reason.  This occurs
        before  DDT  tries  to  execute  <ESC>G,   <ESC>P,   <ESC>X,   or
        <ESC><ESC>X.   A typical occurrence is when you have a breakpoint
        set in the swappable monitor (set in KDDT in executive mode), but
        the swappable monitor is not locked in memory.


   ? CAN'T PATCH ACROSS SECTIONS

        You tried to insert a patch in a section other than the one  that
        contains the patching area.


   ? CAN'T PEEK PHYSICAL

        You attempted to PEEK at the monitor  but  have  specified  other
        than normal virtual addressing (FILDDT only).


   % CAN'T REMOVE $nB BECAUSE .....

        DDT is not able to access the location where  you  inserted  your
        breakpoint.  Look up the second part of the error message in this
        appendix.  This error occurs when your program enters DDT from  a
        breakpoint.


   % CAN'T REMOVE $nB BECAUSE IS IN DIFFERENT SECTION

        DDT is not able to access the location where  you  inserted  your
        breakpoint.   because  inter-section  breakpoints are not enabled
        (<ESC>4M contains zero).  This error  occurs  when  your  program
        enters   DDT   from   a   breakpoint.   To  enable  inter-section
        breakpoints, deposit the breakpoint block address in the location
        addressed by the command <ESC>4M.


   % CAN'T REMOVE $nB BECAUSE MEM REF FAILED

        DDT is not able to access the location where  you  inserted  your

                                    A-3
                               Error Messages


        breakpoint.   DDT is not able to identify the reason.  This error
        occurs when your program enters DDT from a breakpoint.  A typical
        occurrence  is  when  you  have a breakpoint set in the swappable
        monitor (set in  KDDT  in  executive  mode),  but  the  swappable
        monitor is not locked in memory.


   % CAN'T SET BREAKPOINT, $4M NOT SET

        You attempted to set a breakpoint in a section other than the one
        containing DDT while inter-section breakpoints were not enabled.


   ? CAN'T $X, NO $4M

        Inter-section breakpoints are not enabled, and:

         o  you tried to execute the command instr<ESC>X but the  default
            section is not the section that contains DDT,  OR

         o  you tried to single-step  a  dangerous  instruction  but  the
            user-program PC is not in the section that contains DDT


   ? Garbage at end-of-command

        FILDDT encountered extra text at a place  in  the  command  where
        there should have been only <RET>.


   ? I/O error

        Some kind of I/O error occurred when FILDDT attempted to read  or
        write to the unit specified in a DRIVE or STRUCTURE command.


   ? Illegal channel number

        You entered a DRIVE command that  contained  an  illegal  channel
        number.


   ? Illegal controller number

        You entered a DRIVE command that contained an illegal  controller
        number.


   ? Illegal unit number

        You entered a  DRIVE  command  that  contained  an  illegal  unit
        number.


                                    A-4
                               Error Messages


   ? Incorrect symbol table pointer

        FILDDT is unable to read the symbol table specified by the symbol
        table pointer in the file.


   ? Input device must be a disk

        The device you specified is not a disk.


   ? Insufficient memory to read EXE file directory

        FILDDT does not have enough free memory to read in the  directory
        section of the .EXE file that you specified.


   ? Insufficient memory to read PDV list

        FILDDT does not have enough free memory to read in  the  list  of
        PDVs in the .EXE file that you specified.


                                      NOTE

            FILDDT sometimes runs out of  memory  when  you  use  the
            <CTRL/E>  command  to  save files without exiting FILDDT.
            If this is the case, exit with the <CTRL/Z> command,  and
            then restart FILDDT with the TOPS-20 FILDDT command.




   ? INVALID DDT INTERNAL ADDRESS

        You addressed an internal location that is not defined.  This  is
        most likely to occur after you use a command that returns a value
        (such as <ESC>M) to examine a DDT location and then use  <LF>  or
        <BKSP> to look at nearby memory.


   ? Invalid file specification, message

        where message is a TOPS-20 error string.  FILDDT could not  parse
        a filespec given to a LOAD or GET command.


   ? Invalid guide phrase input

        where input is a guide (or noise) phrase that you typed  in,  and
        does not match FILDDT's guide phrase.



                                    A-5
                               Error Messages


   M

        You entered a symbol that is defined in  more  than  one  module.
        You  can  select  the  correct symbol by opening the symbol table
        associated with that module, using the module<ESC>:  command.


   ? MDDT BREAKPOINT BLOCK ALREADY IN USE

        Only one fork may have breakpoints set in MDDT at one time.   You
        attempted  to  set  a  breakpoint  in MDDT while another fork had
        already set an MDDT breakpoint.


   ? Missing or extra units in structure

        The number of units with the name supplied in a STRUCTURE command
        does  not  agree  with the number of units in the first structure
        with that name returned by MSTR%.


   ? No keyword input

        where input is a word that you  typed  in.   You  entered  ENABLE
        without the DATA, PATCHING, or THAWED qualifier.


   ? NO READ ACCESS

        You tried to display a word in a page to which you  do  not  have
        read access.


   ? No such command as input

        where input is a word that you typed in.  You entered  a  command
        that FILDDT does not recognize.


   ? No such file structure

        COMND% and DEVST% think you supplied a disk name in  a  STRUCTURE
        command, but no unit with that name was returned by MSTR%.


   ? Not enough memory for file pages

        FILDDT does not  have  enough  free  memory  for  its  file  page
        buffers.





                                    A-6
                               Error Messages


                                    NOTE

                  FILDDT sometimes runs out of memory when
                  you  use  the  <CTRL/E>  command to save
                  files without exiting FILDDT.   If  this
                  is  the  case,  exit  with  the <CTRL/Z>
                  command, and then  restart  FILDDT  with
                  the TOPS-20 FILDDT command.


   ? Not enough memory for symbols

        FILDDT does not have enough free memory to  read  in  the  symbol
        table from the specified .EXE file.  See the note above.


   ? NOT IN CORE

        You tried to map through a page map pointer (in a  UPT,  SPT,  or
        section  table)  that addresses a page that is swapped out.  This
        can occur only if you are trying to do your own  virtual  address
        mapping, and used the expr<ESC>{<ESC>}nU command, where 0<=n<=2.


   % Not in .EXE format -- Data file assumed.

        A GET command  without  a  /DATA  switch  or  a  previous  ENABLE
        DATA-FILE  command  specified  a  file  which is not in .EXE file
        format.  FILDDT assumes it is a data file.


   ? NOT WRITABLE

        You tried to modify a word in a write-protected page.  To  enable
        writing on protected pages, use the <ESC>0W command.


   ? PAGE DOES NOT EXIST

        You tried to display a word in a nonexistent page.


   ? Patching is not enabled

        You attempted to modify a file, a disk, or the monitor,  but  did
        not use the /PATCH switch or the ENABLE PATCHING command.


   % Patching the running monitor is illegal

        You entered an ENABLE PATCHING  command  and  then  gave  a  PEEK
        command.


                                    A-7
                               Error Messages


   ? PEEK FAILED

        You tried to PEEK at the  monitor,  but  do  not  have  WHEEL  or
        OPERATOR privileges enabled.


   % Symbols cannot be extracted from a data file

        You  used  the  command  GET  filnam/SYMBOL.   Either  the   file
        specified  by  filnam is not an .EXE file, or you previously used
        the command ENABLE DATA-FILE.


   ? Symbols cannot be extracted from a data file

        You used the command LOAD  filnam,  and  the  file  specified  by
        filnam is not an .EXE file.


   U

        You entered a symbol that DDT cannot locate in any symbol  table.
        Cure  this  by  entering  the  correct symbol, or by defining the
        symbol with the {expr<}symbol:  command.


   ? UNEXPECTED MOVEM FAILURE

        DDT could not deposit to  memory  even  though  the  page  exists
        exists and is write-enabled.


                                    NOTE

                  In the following messages, unit  is  one
                  of the following:

                   o  "Unit"  (if  you  used   the   DRIVE
                      command)

                   o  "Unit u on controller k  on  channel
                      c"   (if   you  used  the  STRUCTURE
                      command, where u, k, and c  are  the
                      arguments you entered)



   % Unit has a bad BAT block

        The unit that you specified in a DRIVE or STRUCTURE command has a
        bad BAT block.



                                    A-8
                               Error Messages


   % Unit has a bad HOME block

        The unit that you specified in a DRIVE or STRUCTURE command has a
        bad HOME block.


   ? Unit is off line

        The unit that you specified in a DRIVE or  STRUCTURE  command  is
        off line.


   % Unit is write locked

        You  used  an  ENABLE  PATCHING  command  and  then  specified  a
        write-locked unit in a DRIVE or STRUCTURE command.


   % Update of file's symbol table failed

        FILDDT was unable to write the modified symbol table back to  the
        file  after  you  gave  a <CTRL/Z> or <CTRL/E> command.  This may
        also occur when you use the n<ESC>5M command.































                                    A-9


                                  GLOSSARY



   bit

          Bit is a contraction of "binary digit".  A bit is the  smallest
          unit  of information in a binary system of notation.  It is the
          choice between two possible states, usually designated as  zero
          and  one.   Bits  of  data  are often used as flags to indicate
          on/off or yes/no conditions.

   breakpoint

          A breakpoint is a location in a program's executable code  that
          has  been  modified  so that if the program attempts to execute
          the instruction at that location, control passes to DDT  before
          the instruction is executed.

   breakpoint block

          The breakpoint block is a contiguous block of  memory  required
          by  DDT  for  utilizing  inter-section breakpoints in a program
          running under extended addressing.

   current display mode

          The current display mode is the mode in which DDT displays  the
          next  word (unless there is an intervening command that changes
          the current display mode).  Also known as the  current  typeout
          mode.

   current quantity

          The current quantity is the most recent of:

           o  the last 36-bit quantity that DDT displayed

           o  the 36-bit evaluation  of  the  last  expression  that  you
              entered as an argument to a command that deposits to memory

          This value is often used as the default argument for  the  next
          command.  Also known as the last value typed.

   current typeout mode

          See current display mode.

   current location

          The current location is a memory word that has been  referenced
          by an earlier DDT command.  The address of the current location
          is the default address for most DDT commands.

                                  GLOSS-1
                                  GLOSSARY


   current radix

          The current radix is the radix in which  DDT  displays  numeric
          values.

   debugging

          Debugging is the process of finding  and  removing  programming
          errors from programs.

   EDDT

          EDDT is the DDT variant that is used  to  debug  executive-mode
          programs.

   FILDDT

          FILDDT is the DDT variant that is used to  examine  and  modify
          disk files and disk structures.  FILDDT is also used to examine
          (but not modify) the running monitor.

   jiffy

          A jiffy is a unit  of  time  defined  as  one  AC  (alternating
          current)  cycle.  If your line power has a frequency of 60 Hz.,
          a jiffy is one sixtieth of a second  (about  16  milliseconds).
          If  your  line  power has a frequency of 50 Hz., a jiffy is one
          fiftieth of a second (20 milliseconds).

   KDDT

          KDDT is the DDT variant used to debug the monitor.  You can set
          breakpoints,  single-step  instructions,  and perform any other
          DDT function.

   last value typed

          See current quantity.

   location

          A location is a numbered or named place in  storage  or  memory
          where  a  unit  of  data or an instruction can be stored.  This
          manual also uses the terms word and memory word.

   location counter

          The location counter is a memory word that contains the address
          of the current location.

   location sequence stack

          The location sequence stack is a stack in which DDT stores  the

                                  GLOSS-2
                                  GLOSSARY


          addresses  of  locations  used  earlier.  DDT uses the stack to
          access these locations  again  without  having  you  explicitly
          enter  the  address  of  each of the locations.  DDT references
          these addresses in a last-in, first-out manner.

   MDDT

          MDDT is the DDT mode used to  examine  and  patch  the  running
          monitor.

   open location

          The open location is a memory word that  you  can  modify  with
          your next DDT command.

   prevailing display mode

          The prevailing display mode is a user-defined  default  display
          mode.   DDT displays memory words in the prevailing mode unless
          you specify a temporary display  mode.   You  can  restore  the
          prevailing   mode  with  the  <RET>  command.   See  Chapter  4
          (Displaying and Modifying Memory) for a list of other  commands
          that restore the prevailing display mode.

   reset

          Reset refers to the zero condition of a bit  or  flag.   A  bit
          that  is  zero  is said to be reset.  To reset is the verb that
          refers to the act of turning the bit off, "clearing"  the  bit,
          or making it zero.

   set

          Set refers to the nonzero condition of a bit or  flag.   A  bit
          that  is  nonzero  is  said to be set.  To set is the verb that
          refers to the act of turning the bit on, or making it nonzero.

   single-stepping

          Single-stepping   is   the   process   of   executing   program
          instructions  one  at a time using DDT, to verify the result of
          each instruction.

   target

          Target refers to the contents of the virtual address space that
          FILDDT  is  accessing.  The virtual address space may contain a
          disk structure, a disk file, or the running monitor.

   temporary display mode

          The temporary  display  mode  is  a  short-term,  user-selected
          display  mode  which  overrides  the  prevailing  display mode.

                                  GLOSS-3
                                  GLOSSARY


          Temporary display mode remains in effect until you enter  <RET>
          or <TAB>.  Also known as the temporary typeout mode.

   temporary typeout mode

          See temporary display mode.
















































                                  GLOSS-4
                                   INDEX



   $, 2-2                              Commands
   $., 5-2, 5-3                          DDT (Cont.)
   $$., 5-2, 5-3                           ., 4-8
   $$Q, 4-9                                /, 4-10, 4-19, 4-21, 12-1
   $0BPT, 5-9                              ;, 4-6
   $nB, 5-2                                =, 4-6
   $2M, 4-4                                ?, 4-28, 4-31, 5-13, 6-3, 7-4
   $3M, 4-4                                [, 4-10, 4-19, 4-22, 12-1
   $4M, 12-2                               \, 4-10, 4-19, 4-25, 12-1
   $5M, 7-5                                ], 4-10, 4-19, 4-23, 12-1
   $6M, 12-5                               _, 4-6, 4-10
   $Q, 4-9                                 Backslash, 4-10, 4-19, 4-25,
                                               12-1
               -A-                         <BKSP>, 2-2, 4-10
                                           <CTRL/U>, 2-3
   Access, page, 4-30                      <CTRL/Z>, 2-3
   Automatic page-creation, 4-29           deleting, 2-3
   Automatic proceed                       Equal sign, 4-6
     terminating, 5-7                      <ESC>, 2-2, 4-18
   Automatic proceed flag, 5-6             <ESC>", 3-7
   Automatic write-enable, 4-28            <ESC>5", 3-8
                                           <ESC>"c<ESC>, 3-8
               -B-                         <ESC>., 5-1
                                           <ESC>1:, 7-2
   BACKSPACE key, 2-2                      <ESC>:, 7-1, 7-2
   <BKSP>, 2-2                             <ESC><, 8-1
   $0BPT, 5-9                              <ESC>0<, 8-6
   Breakpoint block, 12-2                  <ESC>>, 8-2
   Breakpoints, 2-5, 5-1                   <ESC>B, 5-6, 11-2
     conditional, 5-8                      <ESC><BKSP>, 4-15, 4-18
     DDT action at, 5-3                    0<ESC>nB, 5-6
     display additional location at,       <ESC>nB, 3-4, 5-3, 5-4, 5-5,
         5-4                                   11-2
     display address of, 5-5               <ESC>C, 4-5
     executing instructions at, 5-9        <ESC>D, 7-3
     executing subroutines at, 5-12        <ESC>E, 6-3
     inter-section, 12-2                   <ESC>F, 4-5
     proceeding from, 5-3, 5-6             <ESC>G, 5-1, 5-6, 5-16, 11-1
     removing, 5-6                         <ESC>H, 4-5
     setting, 5-3                          <ESC>I, 3-4, 5-15
     single-stepping at, 5-10              <ESC>K, 7-2
     unsolicited, 5-9                      <ESC>L, 4-30
                                           <ESC><LF>, 4-15, 4-17
               -C-                         <ESC>M, 3-4, 6-3
                                           <ESC>1M, 4-31, 4-32
   Commands                                <ESC>2M, 4-4
     DDT                                   <ESC>3M, 4-3
       !, 4-10, 4-19, 4-24, 4-25,          <ESC>4M, 12-2
           4-26, 12-1                      <ESC>5M, 7-5
       ", 3-6                              <ESC>6M, 12-5
       "c<ESC>, 3-8                        <ESC>N, 6-2


                                  Index-1
   Commands                            Commands
     DDT (Cont.)                         DDT (Cont.)
       <ESC>O, 4-5                         Reverse slash, 4-10, 4-19,
       <ESC>P, 5-6, 5-7, 5-16, 11-1            4-25, 12-1
       <ESC>Q, 4-9                         Right square bracket, 4-10,
       <ESC><RET>, 4-15, 4-16                  4-19, 4-23, 12-1
       <ESC>S, 4-5                         Semicolon, 4-6
       <ESC>1S, 4-5                        Slash, 4-10, 4-19, 4-21, 12-1
       <ESC>0T, 4-27                       <TAB>, 2-2, 4-10, 4-19, 4-26,
       <ESC>5T, 4-5                            12-1
       <ESC>6T, 4-5                        Underscore, 4-6
       <ESC>7T, 4-5                    CONTROL key, 2-2
       <ESC>8T, 4-5                    Current display mode, 4-3
       <ESC>9T, 4-5                    Current location, 2-3, 4-8
       <ESC>U, 3-4, 5-16, 11-2         Current location stack entry, 4-8
       <ESC>nU, 11-2                   Current quantity, 2-4, 4-9
       <ESC>V, 4-31
       <ESC>W (search), 6-1
       <ESC>W (write-protect), 4-29                -D-
       <ESC>1W, 4-29
       <ESC>X, 5-9, 5-10, 5-12, 5-15,  Dangerous instructions, 5-14
           5-16, 11-1, 11-2            Default section
       <ESC>Z, 4-28                      floating, 12-6
       <ESC><ESC>., 5-1                  permanent, 12-5
       <ESC><ESC>:, 7-5                Display mode
       <ESC><ESC>1:, 7-5                 A, 4-6
       <ESC><ESC><, 8-3                  C, 4-5
       <ESC><ESC>C, 4-5                  current, 4-3
       <ESC><ESC>F, 4-5                  F, 4-5
       <ESC><ESC>H, 4-5                  H, 4-5
       <ESC><ESC>K, 7-3                  O, 4-5
       <ESC><ESC>L, 4-30                 prevailing, 4-2
       <ESC><ESC>O, 4-5                  R, 4-6
       <ESC><ESC>P, 5-8                  1S, 4-5
       <ESC><ESC>Q, 4-9                  S, 4-5
       <ESC><ESC>S, 4-5                  symbolic, 4-1
       <ESC><ESC>1S, 4-5                 0T, 4-5
       <ESC><ESC>5T, 4-5                 5T, 4-5
       <ESC><ESC>6T, 4-5                 6T, 4-5
       <ESC><ESC>7T, 4-5                 7T, 4-5
       <ESC><ESC>8T, 4-5                 8T, 4-5
       <ESC><ESC>9T, 4-5                 9T, 4-5
       <ESC><ESC>U, 11-2                 temporary, 4-2
       <ESC><ESC>nU, 11-2
       <ESC><ESC>W, 4-29
       <ESC><ESC>1W, 4-29
       <ESC><ESC>X, 5-13, 5-15, 5-16               -E-
       <ESC><ESC>1X, 5-14
       Exclamation point, 4-10, 4-19,  EFIW, 4-19, 4-27
           4-24, 4-25, 4-26, 12-1      <ESC>, 2-2
       Left square bracket, 4-10,      ESCAPE key, 2-2
           4-19, 4-22, 12-1            Expression operators, 3-9
       <LF>, 2-2, 4-10                 Expressions, 3-2
       Period, 4-8                     Extended format indirect word,
       <RET>, 2-2, 4-10, 4-11              4-19


                                  Index-2
               -I-                     Patch
                                         abort, 8-6
   IFIW, 4-19, 4-27                      before instruction, 8-1
   Initializing memory, 4-28             following instruction, 8-3
   Input                                 terminate, 8-2, 8-3
     ASCII character, 3-8              Prevailing display mode, 4-2
     ASCII string, 3-6                 Proceed count, 5-6
     decimal integer, 3-3
     floating point, 3-3                           -Q-
     halfwords, 3-12
     instructions, 3-12                $$Q, 4-9
     left-justified text string, 3-6   $Q, 4-9
     long text string, 3-5
     octal integer, 3-2                            -R-
     Radix-50 word, 3-8
     right-justified n-bit character,  <RET>, 2-2
         3-8                           RETURN key, 2-2
     SIXBIT character, 3-8
     SIXBIT string, 3-7                            -S-
     text, 3-5
     value returned by a command,      Search
         3-3                             for address, 6-3
   Input to DDT, 3-2                     for matching value, 6-1
   Instruction format indirect word,     for non-matching value, 6-2
       4-19                              terminate, 6-3
                                       Search mask, 6-3
               -L-                     Single-stepping, 5-10
                                       Symbol table
   Last quantity typed, 4-9              closing, 7-2
   <LF>, 2-2                             finding name of, 7-2
   LINE FEED key, 2-2                    opening, 7-1
   Location counter, 2-4, 4-8          Symbolic debugging, 1-1
   Location sequence stack, 2-4, 4-8   Symbols
                                         creating undefined, 7-3
               -M-                       defining new, 7-2
                                         deleting, 7-3
   Mask                                  listing undefined, 7-4
     output byte size, 4-3               locating, 7-4
     search, 6-3                         multiply-defined, 7-1
     TTY control, 4-31                   reactivating typeout of, 7-3
   Maximum symbolic offset, 4-4          redefining old, 7-2
   Memory protection, 4-28               suppressing typeout of, 7-2
   Memory watch, 4-31
                                                   -T-
               -O-
                                       TAB key, 2-2
   Open location, 2-4, 4-8             <TAB>, 2-2
   Operators                           Temporary display mode, 4-2
     in expressions, 3-9               TTY control mask, 4-31
   Output byte size mask, 4-3
    
                                                   -U-
               -P-
                                       Unsolicited breakpoint, 5-9
   Page access, 4-30                   User-program context, 5-15


                                  Index-3
               -W-                                 -Z-
    
   Watching memory, 4-31               Zeroing memory, 4-28






















































                                  Index-4