Google
 

Trailing-Edge - PDP-10 Archives - BB-PBQUC-BM_1990 - 7-documentation/jsys_users.mem
There are no other files named jsys_users.mem in the archive.















                                  TOPS-20
                         Monitor Calls User's Guide
|  
|  
|                        Electronically Distributed
|  
|  
|  
|            This manual describes the use of  TOPS-20  monitor
|            calls,  which  provide  user  programs with system
|            services such as  input/output,  process  control,
|            file handling, and device control.
|  
|            This manual supersedes the TOPS-20  Monitor  Calls
|            User's  Guide  published  in June 1988.  The order
|            number  for  that   document,   AA-D859DM-TM,   is
|            obsolete.

             Change bars in the margins indicate material  that
             has  been  added  or  changed  since  the previous
             printing of this manual.



             Operating System:              TOPS-20 Version 7.0










   digital equipment corporation                   maynard, massachusetts


|  TOPS-20 Software Update Tape No. 04, November 1990

   First Printing, May 1976
   Revised, April 1982
   Revised, September 1985
   Revised, June 1988
|  Revised, November 1990



   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 Equipment Corporation or its
   affiliated companies.
|  
|  
|  
|  Copyright C 1976,   1982,   1985,   1988,   1990   Digital   Equipment
|  Corporation.

   All Rights Reserved.



   The following are trademarks of Digital Equipment Corporation:

   CI             DECtape     LA50             SITGO-10
   DDCMP          DECUS       LN01             TOPS-10
   DEC            DECwriter   LN03             TOPS-20
   DECmail        DELNI       MASSBUS          TOPS-20AN
   DECnet         DELUA       PDP              UNIBUS
   DECnet-VAX     HSC         PDP-11/24        UETP
   DECserver      HSC-50      PrintServer      VAX
   DECserver 100  KA10        PrintServer 40   VAX/VMS
   DECserver 200  KI          Q-bus            VT50
   DECsystem-10   KL10        ReGIS
   DECSYSTEM-20   KS10        RSX              d i g i t a l


                                      CONTENTS



   PREFACE


   CHAPTER 1       INTRODUCTION

           1.1     OVERVIEW . . . . . . . . . . . . . . . . . . . . . 1-1
           1.2     MONITOR CALLS  . . . . . . . . . . . . . . . . . . 1-2
           1.2.1     Calling Sequence . . . . . . . . . . . . . . . . 1-3
           1.2.2     Error Returns  . . . . . . . . . . . . . . . . . 1-4
           1.3     PROGRAM ENVIRONMENT  . . . . . . . . . . . . . . . 1-6


   CHAPTER 2       INPUT AND OUTPUT USING THE TERMINAL

           2.1     OVERVIEW . . . . . . . . . . . . . . . . . . . . . 2-1
           2.2     PRIMARY I/O DESIGNATORS  . . . . . . . . . . . . . 2-2
           2.3     PRINTING A STRING  . . . . . . . . . . . . . . . . 2-3
           2.4     READING A NUMBER . . . . . . . . . . . . . . . . . 2-4
           2.5     WRITING A NUMBER . . . . . . . . . . . . . . . . . 2-5
           2.6     INITIALIZING AND TERMINATING THE PROGRAM . . . . . 2-7
           2.6.1     RESET% Monitor Call  . . . . . . . . . . . . . . 2-8
           2.6.2     HALTF% Monitor Call  . . . . . . . . . . . . . . 2-8
           2.7     READING A BYTE . . . . . . . . . . . . . . . . . . 2-8
           2.8     WRITING A BYTE . . . . . . . . . . . . . . . . . . 2-8
           2.9     READING A STRING . . . . . . . . . . . . . . . . . 2-9
           2.10    SUMMARY  . . . . . . . . . . . . . . . . . . . .  2-14


   CHAPTER 3       USING FILES

           3.1     OVERVIEW . . . . . . . . . . . . . . . . . . . . . 3-1
           3.2     JOB FILE NUMBER  . . . . . . . . . . . . . . . . . 3-2
           3.3     ASSOCIATING A FILE WITH A JFN  . . . . . . . . . . 3-3
           3.3.1     GTJFN% Monitor Call  . . . . . . . . . . . . . . 3-4
           3.3.1.1     Short Form of GTJFN% . . . . . . . . . . . . . 3-4
           3.3.1.2     Long Form of GTJFN%  . . . . . . . . . . . .  3-12
           3.3.1.3     Summary of GTJFN%  . . . . . . . . . . . . .  3-15
           3.4     OPENING A FILE . . . . . . . . . . . . . . . . .  3-16
           3.4.1     OPENF% Monitor Call  . . . . . . . . . . . . .  3-16
           3.5     TRANSFERRING DATA  . . . . . . . . . . . . . . .  3-19
           3.5.1     File Pointer . . . . . . . . . . . . . . . . .  3-20
           3.5.2     Source and Destination Designators . . . . . .  3-20
           3.5.3     Transferring Sequential Bytes  . . . . . . . .  3-21
           3.5.4     Transferring Strings . . . . . . . . . . . . .  3-22
           3.5.5     Transferring Nonsequential Bytes . . . . . . .  3-24
           3.5.6     Mapping Pages  . . . . . . . . . . . . . . . .  3-24
           3.5.6.1     Mapping File Pages to a Process  . . . . . .  3-26
           3.5.6.2     Mapping Process Pages to a File  . . . . . .  3-27


           3.5.6.3     Unmapping Pages in a Process . . . . . . . .  3-28
           3.5.7     Mapping File Sections to a Process . . . . . .  3-28
           3.6     CLOSING A FILE . . . . . . . . . . . . . . . . .  3-30
           3.6.1     CLOSF% Monitor Call  . . . . . . . . . . . . .  3-30
           3.7     ADDITIONAL FILE I/O MONITOR CALLS  . . . . . . .  3-31
           3.7.1     GTSTS% Monitor Call  . . . . . . . . . . . . .  3-31
           3.7.2     JFNS% Monitor Call . . . . . . . . . . . . . .  3-33
           3.7.3     GNJFN% Monitor Call  . . . . . . . . . . . . .  3-36
           3.8     SUMMARY  . . . . . . . . . . . . . . . . . . . .  3-40
           3.9     FILE EXAMPLES  . . . . . . . . . . . . . . . . .  3-40


   CHAPTER 4       USING THE SOFTWARE INTERRUPT SYSTEM

           4.1     OVERVIEW . . . . . . . . . . . . . . . . . . . . . 4-1
           4.2     INTERRUPT CONDITIONS . . . . . . . . . . . . . . . 4-4
           4.3     SOFTWARE INTERRUPT CHANNELS AND PRIORITIES . . . . 4-4
           4.4     SOFTWARE INTERRUPT TABLES  . . . . . . . . . . . . 4-6
           4.4.1     Specifying the Software Interrupt Tables . . . . 4-6
           4.4.2     Channel Table  . . . . . . . . . . . . . . . . . 4-7
           4.4.3     Priority Level Table . . . . . . . . . . . . . . 4-8
           4.5     ENABLING THE SOFTWARE INTERRUPT SYSTEM . . . . . . 4-9
           4.6     ACTIVATING INTERRUPT CHANNELS  . . . . . . . . . . 4-9
           4.7     GENERATING AN INTERRUPT  . . . . . . . . . . . .  4-10
           4.8     PROCESSING AN INTERRUPT  . . . . . . . . . . . .  4-10
           4.8.1     Dismissing an Interrupt  . . . . . . . . . . .  4-11
           4.9     TERMINAL INTERRUPTS  . . . . . . . . . . . . . .  4-12
           4.10    ADDITIONAL SOFTWARE INTERRUPT MONITOR CALLS  . .  4-14
           4.10.1    Testing for Enablement . . . . . . . . . . . .  4-14
           4.10.2    Obtaining Interrupt Table Addresses  . . . . .  4-15
           4.10.2.1    The RIR% Monitor Call  . . . . . . . . . . .  4-15
           4.10.2.2    The XRIR% Monitor Call . . . . . . . . . . .  4-15
           4.10.3    Disabling the Interrupt System . . . . . . . .  4-16
           4.10.4    Deactivating a Channel . . . . . . . . . . . .  4-16
           4.10.5    Deassigning Terminal Codes . . . . . . . . . .  4-17
           4.10.6    Clearing the Interrupt System  . . . . . . . .  4-17
           4.11    SUMMARY  . . . . . . . . . . . . . . . . . . . .  4-17
           4.12    SOFTWARE INTERRUPT EXAMPLE . . . . . . . . . . .  4-18


   CHAPTER 5       PROCESS STRUCTURE

           5.1     USES FOR MULTIPLE PROCESSES  . . . . . . . . . . . 5-2
           5.2     PROCESS COMMUNICATION  . . . . . . . . . . . . . . 5-3
           5.2.1     Direct Process Control . . . . . . . . . . . . . 5-4
           5.2.2     Software Interrupts  . . . . . . . . . . . . . . 5-4
           5.2.3     IPCF and ENQ/DEQ Facilities  . . . . . . . . . . 5-4
           5.2.4     Memory Sharing . . . . . . . . . . . . . . . . . 5-5
           5.3     PROCESS IDENTIFIERS  . . . . . . . . . . . . . . . 5-5
           5.4     OVERVIEW OF MONITOR CALLS FOR PROCESSES  . . . . . 5-7
           5.5     CREATING A PROCESS . . . . . . . . . . . . . . . . 5-8
           5.5.1     Process Capabilities . . . . . . . . . . . . .  5-11


           5.6     SPECIFYING THE CONTENTS OF THE ADDRESS SPACE OF A 
                   PROCESS  . . . . . . . . . . . . . . . . . . . .  5-11
           5.6.1     GET% Monitor Call  . . . . . . . . . . . . . .  5-11
           5.6.2     PMAP% Monitor Call . . . . . . . . . . . . . .  5-14
           5.7     STARTING AN INFERIOR PROCESS . . . . . . . . . .  5-15
           5.8     INFERIOR PROCESS TERMINATION . . . . . . . . . .  5-16
           5.9     INFERIOR PROCESS STATUS  . . . . . . . . . . . .  5-17
           5.10    PROCESS COMMUNICATION  . . . . . . . . . . . . .  5-19
           5.11    DELETING AN INFERIOR PROCESS . . . . . . . . . .  5-20
           5.12    PROCESS EXAMPLES . . . . . . . . . . . . . . . .  5-21


   CHAPTER 6       ENQUEUE/DEQUEUE FACILITY

           6.1     OVERVIEW . . . . . . . . . . . . . . . . . . . . . 6-1
           6.2     RESOURCE OWNERSHIP . . . . . . . . . . . . . . . . 6-2
           6.3     PREPARING FOR THE ENQ/DEQ FACILITY . . . . . . . . 6-3
           6.4     USING THE ENQ/DEQ FACILITY . . . . . . . . . . . . 6-6
           6.4.1     Requesting Use of a Resource . . . . . . . . . . 6-6
           6.4.1.1     ENQ% Functions . . . . . . . . . . . . . . . . 6-6
           6.4.1.2     ENQ% Argument Block  . . . . . . . . . . . . . 6-8
           6.4.2     Releasing a Resource . . . . . . . . . . . . .  6-12
           6.4.2.1     DEQ% Functions . . . . . . . . . . . . . . .  6-13
           6.4.2.2     DEQ% Argument Block  . . . . . . . . . . . .  6-14
           6.4.3     Obtaining Information About Resources  . . . .  6-14
           6.5     SHARER GROUPS  . . . . . . . . . . . . . . . . .  6-17
           6.6     AVOIDING DEADLY EMBRACES . . . . . . . . . . . .  6-19


   CHAPTER 7       INTER-PROCESS COMMUNICATION FACILITY

           7.1     OVERVIEW . . . . . . . . . . . . . . . . . . . . . 7-1
           7.2     QUOTAS . . . . . . . . . . . . . . . . . . . . . . 7-1
           7.3     PACKETS  . . . . . . . . . . . . . . . . . . . . . 7-2
           7.3.1     Flags  . . . . . . . . . . . . . . . . . . . . . 7-3
           7.3.2     PIDs . . . . . . . . . . . . . . . . . . . . . . 7-5
           7.3.3     Length and Address of Packet Data Block  . . . . 7-6
           7.3.4     Directories and Capabilities . . . . . . . . . . 7-6
           7.3.5     Packet Data Block  . . . . . . . . . . . . . . . 7-6
           7.4     SENDING AND RECEIVING MESSAGES . . . . . . . . . . 7-7
           7.4.1     Sending a Packet . . . . . . . . . . . . . . . . 7-7
           7.4.2     Receiving a Packet . . . . . . . . . . . . . . . 7-9
           7.5     SENDING MESSAGES TO <SYSTEM>INFO . . . . . . . .  7-12
           7.5.1     Format of <SYSTEM>INFO Requests  . . . . . . .  7-13
           7.5.2     Format of <SYSTEM>INFO Responses . . . . . . .  7-14
           7.6     PERFORMING IPCF UTILITY FUNCTIONS  . . . . . . .  7-15


   CHAPTER 8       USING EXTENDED ADDRESSING

           8.1     OVERVIEW . . . . . . . . . . . . . . . . . . . . . 8-1
           8.2     ADDRESSING MEMORY AND ACS  . . . . . . . . . . . . 8-2


           8.2.1     Instruction Format . . . . . . . . . . . . . . . 8-3
           8.2.2     Indexing . . . . . . . . . . . . . . . . . . . . 8-4
           8.2.3     Indirection  . . . . . . . . . . . . . . . . . . 8-5
           8.2.3.1     Instruction Format Indirect Word (IFIW)  . . . 8-5
           8.2.3.2     Extended Format Indirect Word (EFIW) . . . . . 8-6
           8.2.3.3     Macros for Indirection . . . . . . . . . . . . 8-6
           8.2.4     AC References  . . . . . . . . . . . . . . . . . 8-6
           8.2.5     Extended Addressing Examples . . . . . . . . . . 8-7
           8.2.6     Immediate Instructions . . . . . . . . . . . . . 8-8
           8.2.6.1     XMOVEI . . . . . . . . . . . . . . . . . . . . 8-8
           8.2.6.2     XHLLI  . . . . . . . . . . . . . . . . . . . . 8-9
           8.2.7     Other Instructions . . . . . . . . . . . . . . . 8-9
           8.2.7.1     Instructions that Affect the PC  . . . . . .  8-10
           8.2.7.2     Stack Instructions . . . . . . . . . . . . .  8-10
           8.2.7.3     Byte Instructions  . . . . . . . . . . . . .  8-10
           8.3     USING MONITOR CALLS  . . . . . . . . . . . . . .  8-11
           8.3.1     Mapping Memory . . . . . . . . . . . . . . . .  8-12
           8.3.1.1     Mapping File Sections to a Process . . . . .  8-12
           8.3.1.2     Mapping Process Sections to a Process  . . .  8-13
           8.3.1.3     Creating Sections  . . . . . . . . . . . . .  8-14
           8.3.1.4     Unmapping a Process Section  . . . . . . . .  8-15
           8.3.2     Starting a Process in Any Section  . . . . . .  8-16
           8.3.3     Setting the Entry Vector in Any Section  . . .  8-16
           8.3.4     Obtaining Information About a Process  . . . .  8-17
           8.3.4.1     Memory Access Information  . . . . . . . . .  8-17
           8.3.4.2     Entry Vector Information . . . . . . . . . .  8-19
           8.3.4.3     Page-Failure Information . . . . . . . . . .  8-19
           8.3.5     Program Data Vectors . . . . . . . . . . . . .  8-19
           8.3.5.1     Manipulating PDV Addresses . . . . . . . . .  8-20
           8.3.5.2     PDV Names  . . . . . . . . . . . . . . . . .  8-20
           8.3.5.3     Version Number . . . . . . . . . . . . . . .  8-21
           8.4     MODIFYING EXISTING PROGRAMS  . . . . . . . . . .  8-21
           8.4.1     Data Structures  . . . . . . . . . . . . . . .  8-21
           8.4.1.1     Index Words  . . . . . . . . . . . . . . . .  8-22
           8.4.1.2     Indirect Words . . . . . . . . . . . . . . .  8-22
           8.4.1.3     Stack Pointers . . . . . . . . . . . . . . .  8-22
           8.5     WRITING MULTISECTION PROGRAMS  . . . . . . . . .  8-22


   INDEX


   FIGURES

           4-1     Basic Operational Sequence of the Software 
                   Interrupt System . . . . . . . . . . . . . . . . . 4-3
           6-1     Deadly Embrace Situation . . . . . . . . . . . . . 6-5
           6-2     Use of Sharer Groups . . . . . . . . . . . . . .  6-18
           7-1     IPCF Packet  . . . . . . . . . . . . . . . . . . . 7-2
           8-1     Program Counter Address Fields . . . . . . . . . . 8-2
           8-2     Instruction Word Address Fields  . . . . . . . . . 8-4
           8-3     Instruction Format Indirect Word . . . . . . . . . 8-5


           8-4     Extended Format Indirect Word  . . . . . . . . . . 8-6


   TABLES

           2-1     NOUT% Format Option  . . . . . . . . . . . . . . . 2-6
           2-2     RDTTY% Control Bits  . . . . . . . . . . . . . .  2-10
           3-1     Standard System Values for File Specifications . . 3-3
           3-2     GTJFN% Flag Bits . . . . . . . . . . . . . . . . . 3-5
           3-3     Bits Returned on GTJFN% Call . . . . . . . . . .  3-10
           3-4     Long Form GTJFN% Argument Block  . . . . . . . .  3-13
           3-5     OPENF% Access Bits . . . . . . . . . . . . . . .  3-17
           3-6     PMAP% Access Bits  . . . . . . . . . . . . . . .  3-26
           3-7     SMAP% Access Bits  . . . . . . . . . . . . . . .  3-29
           3-8     CLOSF% Flag Bits . . . . . . . . . . . . . . . .  3-30
           3-9     Bits Returned on GTSTS% Call . . . . . . . . . .  3-31
           3-10    JFNS% Format Options . . . . . . . . . . . . . .  3-34
           3-11    GNJFN% Return Bits . . . . . . . . . . . . . . .  3-37
           4-1     Software Interrupt Channel Assignments . . . . . . 4-5
           4-2     Terminal Codes and Conditions  . . . . . . . . .  4-12
           5-1     Process Handles  . . . . . . . . . . . . . . . . . 5-6
           5-2     Inferior Process Characteristic Bits . . . . . . . 5-9
           5-3     GET% Flag Bits . . . . . . . . . . . . . . . . .  5-12
           5-4     GET% Argument Block  . . . . . . . . . . . . . .  5-13
           5-5     GET% Argument Block Flags  . . . . . . . . . . .  5-13
           5-6     Process Status Word  . . . . . . . . . . . . . .  5-17
           5-7     RFSTS% Status-Return Block . . . . . . . . . . .  5-18
           6-1     ENQ% Functions . . . . . . . . . . . . . . . . . . 6-7
           6-2     ENQ% Argument Block  . . . . . . . . . . . . . . . 6-8
           6-3     Lock Specification Flags . . . . . . . . . . . .  6-10
           6-4     DEQ% Functions . . . . . . . . . . . . . . . . .  6-13
           6-5     DEQ% Argument Block  . . . . . . . . . . . . . .  6-14
           6-6     ENQC% Flag Bits  . . . . . . . . . . . . . . . .  6-16
           7-1     Packet Descriptor Block Flags  . . . . . . . . . . 7-3
           7-2     Flags Meaningful on a MSEND% Call  . . . . . . . . 7-8
           7-3     Flags Meaningful on a MRECV% Call  . . . . . . .  7-10
           7-4     MRECV% Return Bits . . . . . . . . . . . . . . .  7-12
           7-5     <SYSTEM>INFO Functions and Arguments . . . . . .  7-14
           7-6     <SYSTEM>INFO Responses . . . . . . . . . . . . .  7-15
           7-7     MUTIL% Functions . . . . . . . . . . . . . . . .  7-16















                                  PREFACE



   The TOPS-20 Monitor Calls User's Guide is  written  for  the  assembly
   language  user  who is unfamiliar with the DECSYSTEM-20 monitor calls.
   The manual introduces the user to the functions that he can request of
   the  monitor  from  within his assembly language programs.  The manual
   also teaches him how to use the basic  monitor  calls  for  performing
   these functions.

   This  manual  is  not  a  reference  document,  nor  is  it   complete
   documentation  of  the  entire  set of monitor calls.  It is organized
   according to functions, starting with the simple and proceeding to the
   more advanced.

   Each chapter should be read from beginning to end.  A user  who  skips
   around  in  his reading will not gain the full benefit of this manual.
   Once the user has a working knowledge of the  monitor  calls  in  this
   document,  he should then refer to the TOPS-20 Monitor Calls Reference
   Manual for the complete descriptions of all the calls.

   To understand the examples in this manual, the user must  be  familiar
   with  the  MACRO  language  and the DECSYSTEM-20 machine instructions.
   The TOPS-20 MACRO  Assembler  Reference  Manual  documents  the  MACRO
   language.   The  TOPS-20  LINK  Reference Manual describes the linking
   loader.   The  DECsystem-10/DECSYSTEM-20  Processor  Reference  Manual
   contains  the  information  on  the machine instructions.  These three
   manuals should be used together with the Monitor Calls  User's  Guide,
   and  should  be referred to when questions arise on the MACRO language
   or the instruction set.  Another useful reference is  Introduction  to
   DECSYSTEM-20   Assembly  Language  Programming  by  Ralph  E.   Gorin,
   published by the Digital Press.  It provides a thorough  treatment  of
   assembly  language  programming  for the DECSYSTEM-20, emphasizing the
   analysis of programs and various methods of program synthesis.

   In addition, some of the examples in this manual  contain  macros  and
   symbols  (MOVX,  TMSG,  JSERR,  or JSHLT, for example) from the MACSYM
   system file.  This file is a universal file of  definitions  available


                                    iii


   to the user as a means of producing consistent and readable programs.

   Finally, the user should be familiar with the TOPS-20 Command Language
   to enter and run the examples.  The TOPS-20 User's Guide describes the
   TOPS-20 commands and system programs.  The TOPS-20 Commands  Reference
   Manual  describes  all  operating  system  commands  available  to the
   nonprivileged user of TOPS-20.















































                                     4











                                 CHAPTER 1

                                INTRODUCTION



   1.1  OVERVIEW

   A program written in MACRO assembly language consists of a  series  of
   statements,  each  statement  usually  corresponding  to  one  or more
   machine language instructions.  Each statement in  the  MACRO  program
   may be one of the following types:

        1.  A MACRO assembler directive, or pseudo-operation (pseudo-op),
            such  as SEARCH or END.  These pseudo-ops are commands to the
            MACRO  assembler  and  are  performed  when  the  program  is
            assembled.    Refer   to  the  DECSYSTEM-20  MACRO  Assembler
            Reference Manual  for  detailed  descriptions  of  the  MACRO
            pseudo-ops.

        2.  A  MACRO  assembler  direct  assignment   statement.    These
            statements are in the form

                 symbol=value

            and are  used  to  assign  a  specific  value  to  a  symbol.
            Assignment  statements  are  processed by the MACRO assembler
            when the program  is  assembled.   These  statements  do  not
            generate instructions or data in the assembled program.

        3.  A MACRO assembler constant declaration statement, such as

                 ONE:  EXP 1

            These statements are processed when the program is assembled.

        4.  An instruction mnemonic, or symbolic instruction  code,  such
            as  MOVE  or ADD.  These symbolic instruction codes represent
            the operations performed by the central  processor  when  the
            program  is executed.  Refer to the DECsystem-10/DECSYSTEM-20
            Processor Reference Manual for detailed descriptions  of  the
            symbolic instruction codes.



                                    1-1
                                INTRODUCTION


        5.  A monitor call, or JSYS, such as RESET or BIN.   These  calls
            are  commands  to  the  monitor  and  are  performed when the
            program is executed.  This manual describes the commonly-used
            monitor calls.  However, the user should refer to the TOPS-20
            Monitor Calls Reference Manual for detailed  descriptions  of
            all the calls.

   When the MACRO program is assembled, the MACRO assembler processes the
   statements in the program by

         o  translating symbolic instruction codes to binary codes.

         o  relating symbols to numeric values.

         o  assigning relocatable or absolute memory addresses.

   The MACRO assembler also converts each symbolic call  to  the  monitor
   into a Jump-to-System (JSYS) instruction.



   1.2  MONITOR CALLS

   Monitor calls are used to request monitor functions, such as input  or
   output  of  data (I/O), error handling, and number conversions, during
   the execution of the program.  These calls are accomplished  with  the
   JSYS  instruction  (operation  code 104), where the address portion of
   the instruction indicates the particular function.

   Each monitor call has a predefined symbol  indicating  the  particular
   monitor  function  to  be  performed  (for example, OPENF% to indicate
   opening a file).  The symbols are defined  in  a  system  file  called
   MONSYM.   Monitor  calls  defined  in  Release  4  and later require a
   percent sign (%) as the final character in the call  symbol.   Monitor
   calls  defined  prior to Release 4 do not require the %, but do accept
   it.  The current convention is that all monitor calls  use  the  %  as
   part of the call symbol.  This manual follows that convention.  To use
   the symbols and to cause them to  be  defined  correctly,  the  user's
   program must contain the statement

        SEARCH MONSYM

   at the beginning of the program.  During the assembly of the  program,
   the  assembler  replaces  the  monitor call symbol with an instruction
   containing the operation code 104 in the left half and the appropriate
   function code in the right half.

   Arguments for a JSYS instruction are  placed  in  accumulators  (ACs).
   Any  data  resulting  from  the  execution of the JSYS instruction are
   returned in the accumulators or in an address in memory  to  which  an
   accumulator  points.   Therefore,  before  the JSYS instruction can be
   executed, the appropriate arguments must be  placed  in  the  specific
   accumulators.

                                    1-2
                                INTRODUCTION


   The system file MACSYM.MAC contains a number of useful macros for  the
   assembly  language  programmer.   To  use  MACSYM  macros,  the user's
   program must contain the statements

        SEARCH MACSYM
        .REQUIRE SYS:MACREL      ;include support routines

   at the beginning of the program.  Since most bits defined for use with
   the  monitor  have  symbolic  names,  macros  enable the programmer to
   utilize these bits without knowledge of their exact position.  Several
   MACSYM  macros  that  are  especially valuable to the TOPS-20 assembly
   language programmer are MOVX, TXnn (where nn indicates one of  the  64
   test  instructions  provided by the hardware), and FLD.  MOVX loads an
   AC with a constant using the proper MOVE  instructions,  depending  on
   the  constant's position in the word.  The TXnn macros expand to allow
   all combinations of modification  and  testing  to  be  defined.   For
   example

        TXNN AC1,GS%EOF

   tests AC1 for the presence of GS%EOF, no modification, and skip if not
   equal  to  zero.   This instruction will work regardless of the actual
   bit position of GS%EOF.  The FLD macro causes  a  value  to  be  right
   justified in a field.  For example

        FLD(7,OF%BSZ)

   places the value 7 in  position  OF%BSZ,  right  justified  at  bit  5
   (OF%BSZ   is  defined  as  bits  0-5).   These  macros  will  be  used
   consistently throughout this document.



   1.2.1  Calling Sequence

   Arguments for the  calls  are  placed  in  accumulators  1  through  4
   (AC1-AC4).   If more than four arguments are required for a particular
   call, the arguments are placed in  a  list  to  which  an  accumulator
   points.   The  arguments  for  the  calls are specific bit settings or
   values.  These bit settings and values  are  defined  in  MONSYM  with
   symbol  names,  which  can  be  used  in  the program.  In fact, it is
   recommended that the user write his  program  using  symbols  whenever
   possible.  This makes the program easier to read by another user.  Use
   of symbols also allows the values  of  the  symbols  to  be  redefined
   without  requiring the  program  to be changed.  In  this manual,  the
   arguments for the monitor  calls  are  described  with  both  the  bit
   settings and the symbol names.  All program examples are written using
   the symbol names.






                                    1-3
                                INTRODUCTION


   The set of instructions that place the arguments in  the  accumulators
   is  followed  by  one  line of code giving the particular monitor call
   symbol.  During the program's execution, control is transferred to the
   monitor when this line of code is reached.



   1.2.2  Error Returns

   TOPS-20 provides a consistent way to handle all JSYS errors.  For most
   monitor  calls upon a successful return, the instruction following the
   call is executed.  If an error occurs  during  the  execution  of  the
   call, the monitor examines the instruction following the call.  If the
   instruction is a JUMP instruction  with  the  AC  field  specified  as
   12-17,  the monitor transfers control to a user-specified address.  If
   the instruction is not a JUMP instruction, the  monitor  generates  an
   illegal  instruction trap indicating an illegal instruction, which the
   user's program can process via the software interrupt system (refer to
   Chapter  4).   If  the  user's  program is not prepared to process the
   instruction trap, the program execution halts, and a message is output
   stating the reason for failure.

   To place a JUMP instruction in his program, the  user  can  include  a
   statement using one of six predefined symbols.  These symbols are

        ERJMPR  address   (= JUMP 12,address)
        ERCALR  address   (= JUMP 13,address)
        ERJMPS  address   (= JUMP 14,address)
        ERCALS  address   (= JUMP 15,address)
        ERJMP   address   (= JUMP 16,address)
        ERCAL   address   (= JUMP 17,address)

   and cause the assembler to generate  a  JUMP  instruction.   The  JUMP
   instruction  is  a non-operation instruction (that is, a no-op) as far
   as the hardware is concerned.  However, the monitor executes the  JUMP
   instruction by transferring control to the address specified, which is
   normally the beginning of an error processing routine written  by  the
   user.   If  the user includes the ERJMP symbol, control is transferred
   as though a JUMPA instruction had been executed, and control does  not
   return  to  his  program  after the error routine is finished.  If the
   user includes the ERCAL symbol, control is  transferred  as  though  a
   PUSHJ 17, address instruction had been executed.  If the error routine
   executes a POPJ 17, instruction, control returns to the user's program
   at the location following the ERCAL.

   If the user includes the ERJMPR symbol, the monitor behaves  the  same
   as  it  would  if  the ERJMP symbol had been included, except that the
   last error encountered by the process is stored  in  the  user's  AC1.
   (Refer to Appendix B of the TOPS-20 Monitor Calls Reference Manual for
   the list of error codes, mnemonics, and message strings.)  The  ERCALR
   symbol  functions  the same as ERCAL except the error code encountered
   is returned in the user's AC1.  ERJMPS and ERCALS  function  similarly
   except the monitor suppresses the storing of the error code in the

                                    1-4
                                INTRODUCTION


   user's AC1.   Instead,  AC1  is  preserved  and  contains  either  the
   original contents from when the monitor call was given, or a partially
   updated value prior to the error.

   Prior to the implementation of  the  ERJMP/ERCAL  facilities,  certain
   monitor  calls  returned  control  to  the  user's  program at various
   locations after the calling address.  Approximately one third  of  the
   JSYSs  return  to  the +1 address only on failure, and to the location
   immediately following that (the +2 address) on successful execution of
   the  call.   A  few  calls  return +1, +2, or +3, dependent on varying
   conditions of success or failure (for examples, see ERSTR%  or  GACTF%
   in  the TOPS-20 Monitor Calls Reference Manual); and some calls do not
   return at all (see HALTF% or  WAIT%).   Refer  to  Chapter  3  of  the
   TOPS-20  Monitor  Calls  Reference Manual for the possible returns for
   each monitor call.

   When a failure occurs during the execution  of  a  monitor  call,  the
   monitor  stores  an error code.  The error code indicates the cause of
   the failure.  This error code is usually stored in the right  half  of
   AC1,  but  can  also  be stored in the monitor's data base or a user's
   data block.  In either case, you can  obtain  the  message  associated
   with the error by using the GETER% or ERSTR% call.

   The ERJMP/ERCAL facilities  can  also  be  used  following  a  machine
   instruction, and will trap for the following conditions:

         o  Illegal instruction

         o  Illegal memory read

         o  Illegal memory write

         o  Pushdown list overflow

   The ERJMP/ERCAL facilities  can  be  used  after  all  monitor  calls,
   regardless  of  whether  the  call  has one or two returns.  To handle
   errors consistently, users are encouraged to employ either the ERJMPR,
   ERCALR,  ERJMPS,  or  ERCALS  symbol  with  all calls.  All of the six
   predefined jump symbols are no-ops, unless they immediately  follow  a
   monitor  call  or instruction that fails.  Error codes can be obtained
   by the program and translated into their corresponding error  mnemonic
   and message strings with the GETER% and ERSTR% monitor calls.

   TOPS-20  provides  convenient  macros  and  subroutines  for  handling
   monitor  call  error  routines.   They can be found in the system file
   MACSYM.MAC.  Two such macros are EJSERR and EJSHLT.  EJSERR prints out
   an error message and returns control to the next instruction following
   the failing monitor call.  EJSHLT prints  out  an  error  message  and
   halts processing of the program.

   The following is an example of executing the BIN%  monitor  call  (see
   Chapter 3 for more information on this monitor call) that has a single


                                    1-5
                                INTRODUCTION


   return.  If the execution of the call is successful, the program reads
   and  stores  a  character.   If  the  execution  of  the  call  is not
   successful, the program transfers control to an error  routine.   This
   routine  processes the error and then returns control back to the main
   program sequence.  Note that ERCALS stores the return address  on  the
   stack.

   DOIT:    MOVE    T1,INJFN     ;obtain JFN for input file
            BIN%                 ;input one character
             ERCALS ERROR        ;call error routine if problem
            MOVEM   T2,CHAR      ;store character
            JRST    DOIT         ;and get another
   ERROR:   GTSTS%               ;read file status
            TXNE    T2,GS%EOF    ;end of file?
            JRST    EOF          ;yes, process end-of-file condition
            HRROI   T1,[ASCIZ/   
   ?INPUT ERROR, CONTINUING
   /]                      ;no, data error 
            PSOUT%               ;print message
            RET                  ;return to program (POPJ 17,)

   The ASCIZ pesudo-op specifies a left-justified ASCII string terminated
   with a null (that is, a byte containing all bits equal to zero) byte.



   1.3  PROGRAM ENVIRONMENT

   The user program environment in the TOPS-20 operating system  consists
   of  a  job  structure that can contain many processes.  A process is a
   runnable or schedulable entity capable of performing  computations  in
   parallel  with other processes.  This means that a runnable program is
   associated with at least one process.

   Each process has its own address space for storing  its  computations.
   This  address  space  is called virtual space because it is actually a
   "window" into physical storage.  The address space is divided into  32
   (decimal) sections.  Each section is divided into 512 (decimal) pages,
   and each page contains 512 (decimal) words.   Each  word  contains  36
   bits.

   A process can communicate with other processes in the following ways:

         o  explicitly, by software interrupts or system facilities  (the
            inter-process communication facility, or IPCF, for example).

         o  implicitly, by changing parts of its environment (its address
            space,  for  instance)  that  are  being  shared  with  other
            processes.

   A process can create other processes inferior to it, but there is  one
   control  process  from which the chain of creations begins.  A process


                                    1-6
                                INTRODUCTION


   is said to exist when a superior process creates it and is said to end
   when  a  superior  process  deletes  it.   Refer to Chapter 5 for more
   information on the process structure.

   A set of one or more related processes, normally under  control  of  a
   single user, is a job.  Each active process is part of some job on the
   system.  A job is defined by a user name, an account number, some open
   files,  and a set of running and/or suspended processes.  A job can be
   composed of several running or suspended programs.

   The following diagram illustrates a job structure consisting  of  four
   processes.


                              -----------------
                              |               |
                              |  TOP PROCESS  |
                              |               |
                              -----------------
                                      |
                                      | 
                                      |
                         ---------------------------
                         |                         |
                 ----------------           ---------------
                 |              |           |             |
                 |  PROCESS A   |           |  PROCESS B  |
                 |              |           |             |
                 ----------------           ---------------
                                                   |
                                                   |
                                                   |
                                            ---------------
                                            |             |
                                            |  PROCESS C  |
                                            |             |
                                            ---------------


   Both process A and 1 process B are created by the TOP PROCESS and thus
   are  directly  inferior  to it.  Process C is created by process B and
   thus is directly inferior to process B only.  Process C is  indirectly
   inferior to the TOP PROCESS.

   In summary, processes can be considered as  independent  virtual  jobs
   with  well-defined relationships to other processes in the system, and
   a job is a collection of these processes.







                                    1-7
























































                                    2-1











                                 CHAPTER 2

                    INPUT AND OUTPUT USING THE TERMINAL



   One of the main reasons for using monitor calls is  to  transfer  data
   from  one  location to another.  This chapter discusses moving data to
   and from the user's terminal.



   2.1  OVERVIEW

   Data transfers to and from the terminal are  in  the  form  of  either
   individual  bytes  or  text  strings.  The bytes are 7-bit bytes.  The
   strings are ASCII strings ending with a 0  byte.   These  strings  are
   called ASCIZ strings.

   To designate the desired string, the user's  program  must  include  a
   statement  that  points  to  the beginning of the string being read or
   written.  The MACRO pseudo-op, POINT, can  be  used  to  set  up  this
   pointer, as shown in the following sequence of statements:

               MOVE AC1,PTR
                    .
                    .
                    .
        PTR:   POINT 7,MSG
        MSG:   ASCIZ/TEXT MESSAGE/

   Accumulator 1 contains the symbolic address (PTR) of the pointer.   At
   the  address  specified  by PTR is the pointer to the beginning of the
   string.  The pointer is set up by the POINT  pseudo-op.   The  general
   format of the POINT pseudo-op is:

        POINT decimal-byte-size,address,decimal-byte-position

   (Refer to the  TOPS-20  MACRO  Assembler  Reference  Manual  for  more
   information  on  the POINT pseudo-op.) In the example above, the POINT
   pseudo-op has been written to indicate 7-bit bytes starting before the
   left-most bit in the address specified by MSG.



                                    2-1
                    INPUT AND OUTPUT USING THE TERMINAL


   Another way of setting up an accumulator to contain the address of the
   pointer is with the following statement:

        HRROI AC1,[ASCIZ/TEXT MESSAGE/]

   The instruction mnemonic HRROI causes a -1 to be placed  in  the  left
   half  of  accumulator  1 and the address of the string to be placed in
   the right half.  However, in the above statement, a literal  (enclosed
   in  square brackets) has been used instead of a symbolic address.  The
   literal causes the MACRO assembler to:

         o  store data within brackets (the string) in a table.

         o  assign an address to the first word of the data.

         o  insert that address as the operand to the HRROI instruction.

   Literals have the advantage of showing the data at the  point  in  the
   program where it will be used, instead of showing it at the end of the
   program.

   As far as the I/O monitor calls are concerned, a word in  this  format
   (-1  in the left half and an address in the right half) designates the
   system's standard pointer (that is, a pointer to a 7-bit ASCIZ  string
   beginning  before the leftmost byte of the string).  The result of the
   HRROI  statement  is  interpreted  by  the  monitor  as   functionally
   equivalent to the word assembled by the POINT 7, address pseudo-op and
   is the recommended statement to use in preparation for a monitor call.
   However,  byte  manipulation  instructions  (for  example,  ILDB, IBP,
   ADJBP) will not operate properly with this type of pointer.

   After a string is read, the  pointer  is  advanced  to  the  character
   following  the terminating character of the string.  After a string is
   written, the pointer is advanced to the character following  the  last
   non-null character written.

   Most TOPS-20 monitor calls accept one-word global byte  pointers  when
   executed  from  a  nonzero  section  (see  Section  8.3).  Global byte
   pointers are used with extended addressing and are fully explained  in
   Chapter  8  of  this  document.   Unless  specifically stated, TOPS-20
   monitor calls do not accept two-word global byte pointers.



   2.2  PRIMARY I/O DESIGNATORS

   To transfer data from one location to another, the user's program must
   indicate  the  source  from  which  the data is to be obtained and the
   destination where the data is to be placed.  By  default,  the  user's
   terminal is defined as the source and destination.  The default can be
   overridden by using the SPJFN% monitor  call  (refer  to  the  TOPS-20
   Monitor  Calls  Reference  Manual).   Examples in this book assume the


                                    2-2
                    INPUT AND OUTPUT USING THE TERMINAL


   user's terminal to be the  source  (input)  and  destination  (output)
   device.  Two designators are used to represent the user's terminal:

        1.  The symbol .PRIIN to represent the  user's  terminal  as  the
            source (input) device.

        2.  The symbol .PRIOU to represent the  user's  terminal  as  the
            destination (output) device.

   These symbols are called the primary input and output designators  and
   by  default  are  used  to represent the terminal running the program.
   They are defined in the system file MONSYM.MAC and do not have  to  be
   defined  in  the  user's  program  as long as the program contains the
   statement

        SEARCH MONSYM



   2.3  PRINTING A STRING

   Many times a program may need to print an error message or some  other
   string,  such  as  a  prompt  to  request  input  from the user at the
   terminal.  The PSOUT% (Primary String Output) monitor call is used  to
   print  such a string on the terminal.  This call copies the designated
   string from the program's address space.  Thus, the source of the data
   is  the  program's  address space, and the destination for the data is
   the terminal.  The program need only supply the pointer to the  string
   being printed.

   Accumulator 1 (AC1) is used to contain the  address  of  the  pointer.
   After  AC1  is set up with the pointer to the string, the next line of
   code is the PSOUT% call.  Thus, an example of the PSOUT% call is:

        HRROI AC1,[ASCIZ/TEXT MESSAGE/]    ;string to print
        PSOUT%                             ;print TEXT MESSAGE

   The PSOUT% call prints on the  terminal  all  the  characters  in  the
   string  until  it  encounters  a  null  byte.  Note that the string is
   printed exactly as it is  stored  in  the  program,  starting  at  the
   current  position  of  the  terminal's print head or cursor and ending
   with the last character in the string.  If a carriage return and  line
   feed  are  to  be  output,  either  before  or after the string, these
   characters should be inserted as part of the string.  For example,  to
   print  TEXT  MESSAGE  on one line and to output a carriage return-line
   feed after it, the user's program includes the call

             HRROI AC1,[ASCIZ/TEXT MESSAGE
        /]
             PSOUT%




                                    2-3
                    INPUT AND OUTPUT USING THE TERMINAL


   After the string is printed, the instruction following the PSOUT% call
   in  the  user's  program  is  executed.   Also,  the pointer in AC1 is
   updated  to  point  to  the  character  following  the  last  non-null
   character written.

   The macro TMSG, found in the system file MACSYM, does the  same  thing
   as  the  example above.  This macro offers the programmer a convenient
   way for printing messages on the terminal.  For example

        TMSG <TEXT MESSAGE
        >

   caused  the  text  message  contained  between  the  angle   brackets,
   including the carriage return and line feed, to print on the terminal.
   The TMSG macro, along with others previously mentioned, will  be  used
   consistently  in  examples  throughout  this  document.   Refer to the
   system file MACSYM.MAC for further information on MACSYM macros.

   Refer to Section 1.2.2 for information concerning error returns.



   2.4  READING A NUMBER

   The NIN% (Number Input) monitor call is used to read an integer.  This
   call does not assume the terminal as the source designator; therefore,
   the user's program must specify  this.   The  NIN%  call  accepts  the
   number from any valid source designator, including a string in memory.
   This section discusses reading a number directly  from  the  terminal.
   Refer to Section 2.9 for an example of using the NIN% call to read the
   number from a string in memory.  The destination  for  the  number  is
   AC2, and the NIN% call places the binary value of the number read into
   this accumulator.  The user's program also specifies a number  in  AC3
   that  represents the radix of the number being input.  The radix given
   can be in the range 2-36.

   Thus, the setup for the NIN% monitor call is the following:

        MOVEI AC1,.PRIIN    ;AC1 contains the primary input designator
                            ;(the user's terminal)

        MOVEI AC3,^D10      ;AC3 contains the radix of the number being
                            ;input (in this case a decimal number)

        NIN%                ;The call to input the number

   After completion of the NIN% call, control returns to the  program  at
   one of two places (refer to Section 1.2.2).  If an error occurs during
   the  execution  of  the  call,  control  returns  to  the  instruction
   following   the   call.    This  instruction  should  be  a  jump-type
   instruction to an error processing routine (see Section 1.2.2).  Also,
   an  error  code  is  placed in AC3 (refer to Appendix B of the TOPS-20
   Monitor Calls Reference Manual for the error codes).  If the execution

                                    2-4
                    INPUT AND OUTPUT USING THE TERMINAL


   of the  NIN%  call  is  successful,  control  returns  to  the  second
   instruction following the call.  The number input from the terminal is
   placed in AC2.

   The NIN% call terminates when it encounters a nondigit character  (for
   example,  a  letter, a punctuation character, or a control character).
   This means that if 32X1 were typed on  the  terminal,  on  return  AC2
   contains  a  40  (octal) because the NIN% call terminated when it read
   the X.

   The following program prints a message  and  then  accepts  a  decimal
   number  from  the  user  at  the  terminal.   Note  that the NIN% call
   terminates reading on any  nondigit  character;  therefore,  the  user
   cannot edit his input with any of the editing characters (for example,
   DELETE, CTRL/W).  The RDTTY% call (refer to  Section  2.9)  should  be
   used  in  programs  that  read from the terminal because it allows the
   user to edit his input as he is typing it.

          SEARCH MONSYM
          HRROI AC1,[ASCIZ/
   Enter # of seconds:  /]
          PSOUT%               ;output a prompt message
          MOVEI AC1,.PRIIN     ;input from the terminal
          MOVEI AC3,^D10       ;use the decimal radix
          NIN%                 ;input a decimal number
           ERJMP NINERR        ;error-go to error routine
          MOVEM AC2, NUMSEC    ;save number entered
            .
            .
            .
   NUMSEC:BLOCK 1
            .
            .
            .



   2.5  WRITING A NUMBER

   The NOUT% (Number Output) monitor call is used to output  an  integer.
   The  user's  program  moves  the  number  to  be output into AC2.  The
   program must specify the destination for the number  in  AC1  and  the
   radix  in  which  the  number is to be output in AC3.  The radix given
   cannot be greater than base 36.  In addition, the user's  program  can
   specify  certain  formatting  options  to  be  used  when printing the
   number.

   Thus, the general setup for the NOUT% monitor call is as follows:

        AC1:   output designator
        AC2:   number being output
        AC3:   format options in left half and radix in right half


                                    2-5
                    INPUT AND OUTPUT USING THE TERMINAL


   The format options that can be specified in the left half of  AC3  are
   described in Table 2-1.


   Table 2-1:  NOUT% Format Option

   ______________________________________________________________________

     Bit       Symbol       Meaning
   ______________________________________________________________________

      0        NO%MAG       Print  the  number  as  a  positive  36-bit
                            number.   For  example, -1 would be printed
                            as 777777 777777 if radix=8).

      1        NO%SGN       Print the appropriate sign (+ or -)  before
                            the  number.  If bits NO%MAG and NO%SGN are
                            both on, a plus sign is always printed.

      2        NO%LFL       Print leading filler.  If this bit  is  not
                            set,  trailing  filler  is  printed and bit
                            NO%ZRO is ignored.

      3        NO%ZRO       Use  0's  as  the  leading  filler  if  the
                            specified number of columns allows filling.
                            If this bit is not set, blanks are used  as
                            the leading filler if the number of columns
                            allows filling.

      4        NO%OOV       Output on column  overflow  and  return  an
                            error.   If  this  bit  is  not set, column
                            overflow is not output.

      5        NO%AST       Print asterisks when the column  overflows.
                            If  this bit is not set, and bit 4 (NO%OOV)
                            is set, all necessary  digits  are  printed
                            when the columns overflow.

      6-10                  Reserved for Digital (must be 0).

     11-17     NO%COL       Print  the  number  of  columns  indicated.
                            This  value  includes  the sign column.  If
                            this  field  is  0,  as  many  columns   as
                            necessary are printed.
   ______________________________________________________________________


   The following instruction sequence is an example of the NOUT%  monitor
   call.   This sequence prints a number, stored in location NUMB, on the
   user's terminal.  The number can be positive, negative or  zero,  with
   no special formatting.



                                    2-6
                    INPUT AND OUTPUT USING THE TERMINAL


           MOVX AC1,.PRIOU                 ;use primary output
           MOVE AC2,NUMB                   ;get number from location NUMB
           MOVX AC3,^D10                   ;no special format
                                           ;decimal radix
           NOUT%                           ;print number
            EJSHLT                         ;unexpected fatal error. Halt
                                           ;and print message.

   Refer to Section 1.2.2 for information concerning error returns.   The
   following  example  illustrates  the  use  of  the three monitor calls
   described so far, as well as the TMSG macro.  The  RESET%  and  HALTF%
   monitor calls are described in Section 2.6.

           SEARCH MONSYM
           SEARCH MACSYM
           .REQUIRE SYS:MACREL
           AC1==1
           AC2==2
           AC3==3
   START:  RESET%                          ;prepare program environment
           HRROI AC1,[ASCIZ/PLEASE TYPE A DECIMAL NUMBER: /]
           PSOUT%
           MOVEI AC1,.PRIIN                ;source designator
           MOVEI AC3,^D10                  ;decimal radix
           NIN%
            ERJMPS ERROR                   ;if input error print message 
                                           ;halt.
           TMSG <THE OCTAL EQUIVALENT IS >
           MOVEI AC1,.PRIOU                ;destination designator
           MOVEI AC3,^D8                   ;octal radix
           NOUT%
            EJSHLT                         ;fatal error. 
                                           ;Same as ERJMPS ERROR.
           HALTF%                          ;return to command language
           JRST START                      ;begin again, if continued
   ERROR:  TMSG<
   ?ERROR-TYPE START TO BEGIN AGAIN>
           HALTF%
           JRST START                      ;user types continue-start 
                                           ;again
           END START



   2.6  INITIALIZING AND TERMINATING THE PROGRAM

   Two monitor calls that have not yet been described were  used  in  the
   above program - RESET% and HALTF%.






                                    2-7
                    INPUT AND OUTPUT USING THE TERMINAL


   2.6.1  RESET% Monitor Call

   A good programming practice is to include the RESET% monitor  call  at
   the  beginning  of  every assembly language program.  This call closes
   any existing open files and releases their JFNs,  kills  any  inferior
   processes,  clears  the software interrupt system (see Chapter 4), and
   performs  various  other  process  initilization  functions.   For   a
   complete  list  of  the functions provided by the RESET% monitor call,
   refer to the description of the call  in  the  TOPS-20  Monitor  Calls
   Reference Manual.  The format of the call is

        RESET%

   and control always returns to the next instruction following the call.



   2.6.2  HALTF% Monitor Call

   To stop the execution of a program and return control to  the  TOPS-20
   Command Language, the user must include the HALTF% monitor call as the
   last instruction performed in the program.  The user can  then  resume
   execution  of the program at the instruction following the HALTF% call
   by typing the CONTINUE command after control has returned  to  command
   level.



   2.7  READING A BYTE

   The PBIN% (Primary Byte Input) monitor call is used to read  a  single
   byte  (that  is, one character) from the terminal.  The user's program
   does not have to specify the  source  and  destination  for  the  byte
   because  this  call  uses  the  primary input designator (that is, the
   user's terminal) as the source and accumulator 1 as  the  destination.
   After  execution of the PBIN% call, control returns to the instruction
   following the PBIN%.  If execution of the call is successful, the byte
   read from the terminal is right-justified in AC1.  If execution of the
   call is not successful, an illegal instruction trap is  generated,  as
   explained in Section 1.2.2.



   2.8  WRITING A BYTE

   The PBOUT% (Primary Byte Output) monitor  call  is  used  to  write  a
   single  byte  to  the  terminal.   This  call  uses the primary output
   designator (that is, the user's terminal) as the destination  for  the
   byte;   thus,  the  user's  program  does  not  have  to  specify  the
   destination.  The source of the byte being written is  accumulator  1;
   therefore,  the  user's program must place the byte right-justified in
   AC1 before the call.


                                    2-8
                    INPUT AND OUTPUT USING THE TERMINAL


   After execution of the PBOUT% call, control returns to the instruction
   following  the  PBOUT%.   If  execution of the call is successful, the
   byte is written to the user's terminal.  If execution of the  call  is
   not successful, an illegal instruction trap is generated, as explained
   in Section 1.2.2.



   2.9  READING A STRING

   Up to this point, monitor calls have been  presented  for  printing  a
   string,  reading  and  writing  an  integer, and reading and writing a
   byte.  The next call  to  be  discussed  obtains  a  string  from  the
   terminal and, in addition, allows the user at the terminal to edit his
   input as he is typing it.

   The RDTTY% (Read from Terminal) monitor  call  reads  input  from  the
   user's  terminal  (that  is,  from  .PRIIN) into the program's address
   space.  Input is read until  the  user  either  types  an  appropriate
   terminating   (break)  character  or  inputs  the  maximum  number  of
   characters allowed in the  string,  whichever  occurs  first.   Output
   generated  as  a  result of character editing is printed on the user's
   terminal (that is, output to .PRIOU).

   The RDTTY% call handles the following editing functions:

        1.  Delete the last character in the string if the  user  presses
            the DELETE key while typing his input.

        2.  Delete back to the last punctuation character in  the  string
            if the user types CTRL/W while typing his input.

        3.  Delete the current line if the user types CTRL/U while typing
            his input.

        4.  Retype the current line if the user types CTRL/R while typing
            his input.

   Because the RDTTY% call can handle these editing functions, a  program
   can  accept  input  from  the  terminal  and  allow  this  input to be
   corrected by the user as he is typing it.  For this reason, the  RDTTY
   call  should be used to read input from the terminal before processing
   that input with calls such as NIN%.

   The RDTTY% call accepts three words of arguments in AC1 through AC3.

        AC1:   pointer to area in program's address space where input  is
               to be placed.  This area is called the text input buffer.

        AC2:   control bits in the left half, and maximum number of bytes
               in the text input buffer in the right half.



                                    2-9
                    INPUT AND OUTPUT USING THE TERMINAL


        AC3:   pointer to buffer for text to be output before the  user's
               input  if the user types a CTRL/R, or 0 if only the user's
               input is to be output on a CTRL/R.

   The control bits in the left half of AC2  specify  the  characters  on
   which to terminate the input.  These bits are described in Table 2-2.


   Table 2-2:  RDTTY% Control Bits

   ______________________________________________________________________

     Bit       Symbol            Meaning
   ______________________________________________________________________

      0        RD%BRK            Terminate  input  when  user  types  a
                                 CTRL/Z or presses the ESC key.

      1        RD%TOP            Terminate input when user types one of
                                 the following:

                                 CTRL/G
                                 CTRL/L
                                 CTRL/Z
                                 ESC key
                                 RETURN key
                                 Line feed key

      2        RD%PUN            Terminate input when user types one of
                                 the following:

                                 CTRL/A-CTRL/F
                                 CTRL/H-CTRL/I
                                 CTRL/K
                                 CTRL/N-CTRL/Q
                                 CTRL/S-CTRL/T
                                 CTRL/X-CTRL/Y
                                 ASCII codes 34-36
                                 ASCII codes 40-57
                                 ASCII codes 72-100
                                 ASCII codes 133-140
                                 ASCII codes 173-176

                                 The ASCII codes listed above represent
                                 the   punctuation  characters  in  the
                                 ASCII character  set.   Refer  to  the
                                 ASCII  character set table in Appendix
                                 A  of  the   TOPS-20   Monitor   Calls
                                 Reference Manual for these characters.

      3        RD%BEL            Terminate input when  user  types  the
                                 RETURN  or line feed key (that is, end
                                 of line).

                                    2-10
                    INPUT AND OUTPUT USING THE TERMINAL


      4        RD%CRF            Store only the line feed in the  input
                                 buffer   when  the  user  presses  the
                                 RETURN key.  A  carriage  return  will
                                 still be output to  the  terminal  but
                                 will  not be stored in the buffer.  If
                                 this bit  is  not  set  and  the  user
                                 presses   the  RETURN  key,  both  the
                                 carriage return and the line feed will
                                 be stored as part of the input.

      5        RD%RND            Return to program if the user attempts
                                 to  delete  past  the beginning of his
                                 input.  This  allows  the  program  to
                                 take  control  if  the  user  tries to
                                 delete all of his input.  If this  bit
                                 is not set, the program waits for more
                                 input.

      6                          Reserved for Digital (must be 0).

      7        RD%RIE            Return to program  when  there  is  no
                                 input  (that is, the text input buffer
                                 is empty).  If this bit  is  not  set,
                                 the program waits for more input.

      8                          Reserved for Digital (must be 0).

      9        RD%BEG            Return to user  program  if  the  user
                                 attempts  to edit beyond the beginning
                                 of the input buffer.

      10       RD%RAI            Convert  lower  case  input  to  upper
                                 case.

      11       RD%SUI            Suppress the CTRL/U indication on  the
                                 terminal when a CTRL/U is typed by the
                                 user.  This means  that  if  the  user
                                 types   a  CTRL/U,  XXX  will  not  be
                                 printed and, on display terminals, the
                                 characters  will  not  be deleted from
                                 the screen.  If this bit  is  not  set
                                 and  the user types a CTRL/U, XXX will
                                 be printed and,  if  appropriate,  the
                                 characters  will  be  deleted from the
                                 screen.  In neither case is the CTRL/U
                                 stored in the input buffer.








                                    2-11
                    INPUT AND OUTPUT USING THE TERMINAL


      15       RD%NED            Disable  editing  characters  in  user
                                 break  mask.  If this bit is set, then
                                 any editing character (^R, ^U, ^V, ^W,
                                 and DELETE) in the user supplied break
                                 mask  does  not   have   its   editing
                                 function.
   ______________________________________________________________________


   If no control bits are set in the left half of AC2, the input will  be
   terminated when the user presses the RETURN or line feed key (that is,
   terminated on an end-of-line condition only).

   The count in the right half of  AC2  specifies  the  number  of  bytes
   available  for storing the string in the program's address space.  The
   input is terminated when this count is exhausted, even if a  specified
   break character has not yet been typed.

   The pointer in AC3 is to the beginning of a buffer containing the text
   to  be output if the user types a CTRL/R.  When this happens, the text
   in this separate buffer is output, followed by any text that has  been
   typed  by the user.  The text in this buffer cannot be edited with any
   of the editing characters (that is, DELETE, CTRL/W,  or  CTRL/U).   If
   the  contents  of  AC3 is zero, then no such buffer exists, and if the
   user types CTRL/R, only the text in the input buffer will be output.

   If execution of the RDTTY% call is successful, the  input  is  in  the
   specified  area  in  the  program's address space.  The character that
   terminated the input is also stored.  (If the terminating character is
   a  carriage  return  followed  by  a  line feed, the line feed is also
   stored.) Control returns to the user's program at the second  location
   following  the  call.  The pointer in AC1 is advanced to the character
   following the last character stored.  The count in the right  half  of
   AC2  is  updated  to  reflect  the  remaining bytes in the buffer, and
   appropriate bits are set in the left half of AC2.  The bits  that  can
   be set on a successful return are:

        Bit 12    RD%BTM         The input was terminated because one  of
                                 the   specified   break  characters  was
                                 typed.  This break character  is  placed
                                 in the input buffer.  If this bit is not
                                 set, the input  was  terminated  because
                                 the byte count was exhausted.

        Bit 13    RD%BFE         Control  was  returned  to  the  program
                                 because  there  is  no  more  input  and
                                 RD%RIE was set in the call.







                                    2-12
                    INPUT AND OUTPUT USING THE TERMINAL


        Bit 14    RD%BLR         The limit to which the user  can  backup
                                 for editing his input was reached.

   For consistent handling of error returns refer to Section 1.2.2.

   The following example illustrates the recommended method  for  reading
   data  from  the terminal.  This example is essentially the same as the
   one in Section 2.5; however, the RDTTY%  call  is  used  to  read  the
   number  before  the  NIN%  call processes it.  This program stores the
   last error encountered in  location  LASTER  and  therefore  uses  the
   ERJMPR pseudo-op.


           SEARCH MONSYM
           SEARCH MACSYM
           .REQUIRE SYS:MACREL
           AC1==1
           AC2==2
           AC3==3
   START:  RESET%                  ;prepare program environment
           HRROI AC1,PROMPT
           PSOUT%                  ;type prompt
           HRROI AC1,BUFFER        ;location to store number
           MOVEI AC2,BUFLEN*5      ;size of buffer
           HRROI AC3,PROMPT        ;pointer to prompt
           RDTTY%                  ;read number from term. with editing
            ERJMPR ERROR           ;save error code, print message 
           HRROI AC1,BUFFER        ;and halt source designator
           MOVEI AC3,^D10          ;decimal radix
           NIN%                    
            ERJMPR ERROR           ;if input error, print message 
           TMSG <THE OCTAL EQUIVALENT IS >
           MOVEI AC1,.PRIOU        ;and halt destination designator
           MOVEI AC3,^D8           ;octal radix
           NOUT%
            ERJMPR ERROR           ;save error code, print message 
           HALTF%                  ;and halt return to command 
           JRST START              ;language begin again, if continued
   PROMPT: ASCIZ/PLEASE TYPE A DECIMAL NUMBER: /
           BUFLEN==10
   BUFFER: BLOCK BUFLEN
   LASTER: BLOCK 1
   ERROR:  MOVEM AC1,LASTER        ;save error code
           TMSG <
   ?ERROR-TYPE START TO BEGIN AGAIN>;print general error message
           HALTF%                  ;halt
           JRST START              ;start over if continued
           END START






                                    2-13
                    INPUT AND OUTPUT USING THE TERMINAL


   2.10  SUMMARY

   Data transfers of sequential bytes or text strings can be made to  and
   from the terminal.  The monitor calls for transferring bytes are PBIN%
   and PBOUT% and for transferring strings are PSOUT%  and  RDTTY%.   The
   NIN%  and  NOUT%  monitor  calls can be used for reading and writing a
   number.  In general, the user's program must  specify  a  source  from
   which  the  data is to be obtained and a destination where the data is
   to be placed.   In  the  case  of  terminal  I/O,  the  symbol  .PRIIN
   represents  the  user's  terminal as the source, and the symbol .PRIOU
   represents the user's terminal as the destination.











































                                    2-14











                                 CHAPTER 3

                                USING FILES



   3.1  OVERVIEW

   All information stored in the DECSYSTEM-20  is  kept  in  files.   The
   basic  unit  of storage in a file is a page containing bytes from 1 to
   36 bits in length.  Thus, a sequence of pages constitutes a file.   In
   most  cases,  files have names.  Although all files are handled in the
   same  manner,  certain  operations  are  unavailable  for   files   on
   particular devices.

   Programs can reference files by several methods:

         o  In a sequential byte-by-byte manner.

         o  In a multiple byte or string manner.

         o  In  a  random   byte-by-byte   manner   if   the   particular
            file-storage device allows it.

         o  In a page-mapping or  section-mapping  manner  for  files  on
            disk.

   Byte and string input/output are the most common types of operations.

   Generally, all programs perform I/O by moving bytes of data  from  one
   location  to  another.   For example, programs can move bytes from one
   memory area to another, from memory to  a  disk  file,  and  from  the
   user's  terminal  to  memory.  In addition, a program can map multiple
   512-word pages or 512-page sections from a disk file  into  memory  or
   vice versa.

   Data transfer operations on files require four steps:

        1.  Establishing a correspondence between a file and a  Job  File
            Number (JFN), because all files are referenced by JFNs.

        2.  Opening the file to establish the data mode, access mode, and
            byte  size  and to set up the monitor tables that permit data
            to be accessed.

                                    3-1
                                USING FILES


        3.  Transferring data either to or from the file.

        4.  Closing the file to complete any I/O, to update the directory
            if  the file is on the disk, and to release the monitor table
            space used by the file.

   Some operations on files do not require  the  execution  of  all  four
   steps  above.  Examples of these operations are:  deleting or renaming
   a file, or changing the access code or account of  a  file.   Although
   these  operations  do not require all four steps, they do require that
   the file has a JFN associated with it (step 1 above).

   It is possible for disk files on the DECSYSTEM-20 to be simultaneously
   read  or written by any number of processes.  To make sharing of files
   possible, all instances of opening  a  specific  file  in  a  specific
   directory cause a reference to the same data.  Therefore, data written
   into a file by one process can immediately be seen by other  processes
   reading the file.

   Access to files is controlled by the 6-digit (octal) file access  code
   assigned  to a file when it is created.  This code indicates the types
   of access allowed to the file for the three  classes  of  users:   the
   owner  of  the  file, the users with group access to the file, and all
   other users.  (Refer to the TOPS-20 User's Guide for more  information
   on the file access codes.) If the user is allowed access to a file, he
   requests the type of access desired when opening  the  file  with  the
   OPENF%  monitor  call (refer to Section 3.4.1) in his program.  If the
   access requested in the OPENF% call does not conflict with the current
   access  to  the  file,  the  user is granted access.  Essentially, the
   current access to the file is set by the first user who opens it.

   Thus, for a user  to  be  granted  access  to  a  specific  file,  two
   conditions must be met:

        1.  The file access code must allow the user to access  the  file
            in the desired manner (for example, read, write).

        2.  The file must not be opened for a conflicting type of access.



   3.2  JOB FILE NUMBER

   The Job File Number (JFN) is one of the more important concepts in the
   operating  system  because it serves as the identifier of a particular
   file on a particular device during a  process'  execution.   It  is  a
   small  integer  assigned  by the system upon a request from the user's
   program.  JFNs are usually assigned sequentially starting with 1.






                                    3-2
                                USING FILES


   The JFN is valid for the job in which it is assigned and may  be  used
   by  any  process in the job.  The system uses the JFN as an index into
   the table of files associated with the job and always  assigns  a  JFN
   that  is  unique  within the job.  Even though a particular JFN within
   the job can refer to only one file, a single file  can  be  associated
   with  more  than  one JFN.  This occurs when two or more processes are
   using the same file concurrently.  In this case, each of the processes
   will  probably  have a different JFN for the file, but all of the JFNs
   will be associated with the same file.



   3.3  ASSOCIATING A FILE WITH A JFN

   In order to reference a file, the first step  the  user  program  must
   complete  is  to  associate  the  specific  file  with  a  JFN.   This
   correspondence is established with the GTJFN% (Get  Job  File  Number)
   monitor  call.   One  of  the  arguments  to  this  call is the string
   representing the desired file.  The string can be specified within the
   program  (that  is, come from memory) or can be accepted as input from
   the user's terminal or from another file.  The  string  can  represent
   the complete specification for the file:

   dev:<directory>name.typ.gen;T(temporary);P(protection);A(account);
        (device dependent attributes)

   If you omit any fields of the specification, the  system  can  provide
   values  for  all  except  the name field.  Refer to the TOPS-20 User's
   Guide for a complete explanation of the specification for a file.

   Table 3-1 lists the values  the  system  will  assign  to  fields  not
   specified by the input string.


   Table 3-1:  Standard System Values for File Specifications

   ______________________________________________________________________

     Field                       Value
   ______________________________________________________________________

     Device                      DSK:

     Directory                   Directory to which user  is  currently
                                 connected.

     Name                        No  default;  this   field   must   be
                                 specified.

     Type                        Null.




                                    3-3
                                USING FILES


     Generation number           The highest existing generation number
                                 if  the  file  is  an input file.  The
                                 next higher generation number  if  the
                                 file is an output file.

     Protection                  Protection of next lower generation of
                                 file,   if   one   exists;  otherwise,
                                 protection   as   specified   in   the
                                 directory.

     Account                     Account specified when user logged in.
   ______________________________________________________________________


   If the string specified identifies a single file, the monitor  returns
   a  JFN that remains associated with that file until either the process
   releases the JFN or the job logs off the system.  After the assignment
   of  the  JFN  is  complete,  the  user's  program  uses the JFN in all
   references to that file.

   The user's program can set up either the short or the long form of the
   GTJFN%  monitor  call.   The  long form of the GTJFN% call requires an
   argument block; the short form does not.  The long form of GTJFN%  has
   functions and flexibility not available in the short form of the call.
   The short form of GTJFN% allows a file specification  to  be  obtained
   from a string in memory or from a file, but not from both.  Fields not
   specified by the input are taken from the standard system  values  for
   those  fields  (refer to Table 3-1).  This form is sufficient for most
   uses of the call.  The long form allows a  file  specification  to  be
   obtained  from  both a string in memory and a file.  If both are given
   as arguments, the string is used first, and then the file is  used  if
   more  fields are needed to complete the specification.  This form also
   allows the user's program to specify nonstandard values to be used for
   fields not given and to request the assignment of a specific JFN.



   3.3.1  GTJFN% Monitor Call

   The GTJFN% monitor call assigns a  JFN  to  the  specified  file.   It
   accepts  two  words  of arguments.  These argument words are different
   depending on the form  of  GTJFN%  being  used.   The  user's  program
   indicates  the desired GTJFN% form by setting bit 17(GJ%SHT) of AC1 to
   1 for the short form or by clearing bit 17(GJ%SHT) for the long form.



   3.3.1.1  Short Form of GTJFN% - The short form of the  GTJFN%  monitor
   call requires the following two words of arguments.





                                    3-4
                                USING FILES


                 0                        17 18                       35
                !=======================================================!
        AC1     !         flag bits         ! default generation number !
                !=======================================================!


                 0                                                    35
                !=======================================================!
        AC2     !     source designator for file specification per      !
                !          bit 16  (GJ%FNS) of AC1                      !
                !=======================================================!


   The flag bits that can be specified in AC1 are described in Table 3-2.


   Table 3-2:  GTJFN% Flag Bits

   ______________________________________________________________________

     Bit       Symbol            Meaning
   ______________________________________________________________________

      0        GJ%FOU            The file specification given is to  be
                                 assigned  the  next  higher generation
                                 number.  This bit indicates that a new
                                 version of a file is to be created and
                                 is normally set if  the  file  is  for
                                 output use.

      1        GJ%NEW            The file specification given must  not
                                 refer  to  an  existing file (that is,
                                 the file must be a new file).

      2        GJ%OLD            The  file  specification  given   must
                                 refer  to  an existing file.  This bit
                                 has no effect  on  a  parse-only  JFN.
                                 (See bit GJ%OFG.)

      3        GJ%MSG            One of the appropriate messages is  to
                                 be     printed    after    the    file
                                 specification   is   obtained.     The
                                 message  is  printed  only if the user
                                 types the ESC  key  to  end  his  file
                                 specification  (that  is,  he is using
                                 recognition input).

                                 [NEW FILE]
                                 [NEW GENERATION]
                                 [OLD GENERATION]
                                 [OK] if GJ%CFM (bit 4) is off
                                 [CONFIRM] if GJ%CFM (bit 4) is on


                                    3-5
                                USING FILES


      4        GJ%CFM            Confirmation from  the  user  will  be
                                 required   to  verify  that  the  file
                                 specification obtained is correct.  To
                                 confirm  the  file  specification, the
                                 user can press the RETURN key.

      5        GJ%TMP            The  file  specified  is   to   be   a
                                 temporary file.

      6        GJ%NS             Only the first file specification in a
                                 multiple logical name assignment is to
                                 be searched for the file.

      7        GJ%ACC            The  JFN  specified  is  not   to   be
                                 accessed by inferior processes in this
                                 job.  However, any process can  access
                                 the file by acquiring a different JFN.
                                 To  prevent  the   file   from   being
                                 accessed   by   other  processes,  the
                                 user's program can set OF%RTD (bit 29)
                                 in  the  OPENF  call (refer to Section
                                 3.4.1).

      8        GJ%DEL            The  file  specified  is  not  to   be
                                 considered  as  deleted, even if it is
                                 marked as deleted.

      9-10     GJ%JFN            These bits are off in the  short  form
                                 of  the  GTJFN  call (refer to Section
                                 3.3.1.2 for their description).

     11        GJ%IFG            The  file   specification   given   is
                                 allowed  to  have  one  or more of its
                                 fields  specified  with   a   wildcard
                                 character  (* or %).  This bit is used
                                 to process a group  of  files  and  is
                                 generally  used  for input files.  The
                                 monitor verifies  that  at  least  one
                                 value   exists  for  each  field  that
                                 contains a wildcard  and  assigns  the
                                 JFN to the first file in the group.

                                 The monitor also verifies that  fields
                                 not  containing  wildcards represent a
                                 new  or  old  file  according  to  the
                                 setting of GJ%NEW and GJ%OLD.

     12        GJ%OFG            The JFN is to be associated  with  the
                                 given  file  specification string only
                                 and  not  to  the  actual  file.   The
                                 string    may   contain   a   wildcard
                                 character (* or %) in one or  more  of


                                    3-6
                                USING FILES


                                 its fields.  It is checked for correct
                                 punctuation between fields, but is not
                                 checked for the validity of any field.
                                 This bit allows a JFN to be associated
                                 with  a file specification even if the
                                 file specification does not  refer  to
                                 an  actual  file.   The  JFN  returned
                                 cannot be used to refer to  an  actual
                                 file  (for  example, cannot be used in
                                 an OPENF call) but  can  be   used  to
                                 obtain  the  original input string via
                                 the  JFNS  monitor  call   (refer   to
                                 Section 3.7.2).

     13        GJ%FLG            Flags are to be returned in  the  left
                                 half of AC1 on a successful return.

     14        GJ%PHY            Logical  names   specified   for   the
                                 current  job are to be ignored and the
                                 physical device is to be used.

     15        GJ%XTN            This bit is off in the short  form  of
                                 the   GTJFN  call  (refer  to  Section
                                 3.3.1.2 for its description).

     16        GJ%FNS            The  contents  of  AC2   are   to   be
                                 interpreted as follows:

                                 1.  If this bit is on, AC2 contains an
                                     input  JFN in the left half and an
                                     output JFN in the right half.  The
                                     input  JFN  is  used to obtain the
                                     file    specification    to     be
                                     associated   with  the  JFN.   The
                                     output JFN is used to indicate the
                                     destination for printing the names
                                     of any  fields  being  recognized.
                                     To  omit  either  JFN,  the user's
                                     program must  specify  the  symbol
                                     .NULIO (377777).

                                 2.  If this bit is off, AC2 contains a
                                     pointer to a string in memory that
                                     specifies   the   file    to    be
                                     associated with the JFN.

     17        GJ%SHT            This bit must  be  on  (set)  for  the
                                 short form of the GTJFN% call; it must
                                 be off for the long form of the call.





                                    3-7
                                USING FILES


     18-35                       The  generation  number  of  the  file
                                 (between  1  and 377777) or one of the
                                 following:

                                 0(.GJDEF)   to indicate that the  next
                                             higher  generation  number
                                             of the file is to be  used
                                             if  GJ%FOU  (bit 0) is on,
                                             or to  indicate  that  the
                                             highest           existing
                                             generation number  of  the
                                             file  is  to  be  used  if
                                             GJ%FOU  is   off.    (This
                                             value  is  usually used in
                                             this field.)

                                 -1(.GJNHG)  to indicate that the  next
                                             higher  generation  number
                                             of the file is to be  used
                                             if no generation number is
                                             supplied.

                                 -2(.GJLEG)  to   indicate   that   the
                                             lowest existing generation
                                             number of the file  is  to
                                             be used.

                                 -3(.GJALL)  to   indicate   that   all
                                             generation  numbers (*) of
                                             the file are  to  be  used
                                             and  that the JFN is to be
                                             assigned to the first file
                                             in the group.  (Bit GJ%IFG
                                             must be set.)
   ______________________________________________________________________



















                                    3-8
                                USING FILES


   If the GTJFN% call is given with the appropriate flag bit set  (GJ%IFG
   or  GJ%OFG), the file specification given as input can have a wildcard
   character (either an asterisk or a  percent  sign)  appearing  in  the
   directory,  name, type, or generation number field.  (The percent sign
   cannot appear in the generation number field.) The wildcard  character
   is  interpreted as matching any existing occurrence of the field.  For
   example, the specification

        <LIBRARY>*.MAC

   identifies all the files with the file  type  .MAC  in  the  directory
   named <LIBRARY>.  The specification

        <LIBRARY>MYFILE.FO%

   identifies all the files in directory <LIBRARY> with the  name  MYFILE
   and  a three-character file type in which the first two characters are
   .FO.   Upon  completion  of  the  GTJFN  call,  the  JFN  returned  is
   associated  with  the  first  file found in the group according to the
   following:

         o  in numerical order by directory number

         o  in alphabetical order by filename

         o  in alphabetical order by file type

         o  in ascending numerical order by generation number

   The GNJFN% (Get Next JFN) monitor call can then be given to assign the
   JFN to the next file in the group (refer to Section 3.7.3).  Normally,
   a program that accepts wildcard characters  in  a  file  specification
   will  successively reference all files in the group using the same JFN
   and not obtain another JFN for each one.

   If execution of the GTJFN% call is  not  successful  because  problems
   were  encountered  in performing the call, the JFN is not assigned and
   an error code is returned in the right half of AC1.  The execution  of
   the program continues at the instruction following the GTJFN% call.

   If execution of the GTJFN% call is successful,  the  JFN  assigned  is
   returned in the right half of AC1 and various bits are set in the left
   half, if flag bits 11, 12, or 13 were  on  in  the  call.   (The  bits
   returned  on a successful call are described in Table 3-3.) If bit 11,
   12, or 13 was not on in the call, the left half of AC1 is  zero.   The
   execution of the program continues at the second instruction after the
   GTJFN% call.







                                    3-9
                                USING FILES


   Table 3-3:  Bits Returned on GTJFN% Call

   ______________________________________________________________________

     Bit       Symbol            Meaning
   ______________________________________________________________________

      0        GJ%DEV            The   device   field   of   the   file
                                 specification     contains    wildcard
                                 characters.

      1        GJ%UNT            The   unit   field   of    the    file
                                 specifications    contains    wildcard
                                 characters.  This  bit  is  never  set
                                 because  wildcard  characters  are not
                                 allowed in unit fields.

      2        GJ%DIR            The  directory  field  of   the   file
                                 specification     contains    wildcard
                                 characters.

      3        GJ%NAM            The  filename  field   of   the   file
                                 specification     contains    wildcard
                                 characters.

      4        GJ%EXT            The  file  type  field  of  the   file
                                 specification     contains    wildcard
                                 characters.

      5        GJ%VER            The generation  number  field  of  the
                                 file  specification  contains wildcard
                                 characters.

      6        GJ%UHV            The  file   used   has   the   highest
                                 generation number because a generation
                                 number of 0 was given in the call.

      7        GJ%NHV            The file  used  has  the  next  higher
                                 generation number because a generation
                                 number of 0 or -1  was  given  in  the
                                 call.

      8        GJ%ULV            The   file   used   has   the   lowest
                                 generation number because a generation
                                 number of -2 was given in the call.

      9        GJ%PRO            The  protection  field  of  the   file
                                 specification was given.

     10        GJ%ACT            The  account   field   of   the   file
                                 specification was given.



                                    3-10
                                USING FILES


     11        GJ%TFS            The  file  specification  is   for   a
                                 temporary file.

     12        GJ%GND            Files  marked  for  deletion  are  not
                                 considered   when  assigning  JFNs  in
                                 subsequent calls.  This bit is set  if
                                 GJ%DEL was not set in the call.

     13        GJ%NOD            The  node  name  field  of  the   file
                                 specification was given.

     17        GJ%GIV            Invisible files  were  not  considered
                                 when assigning JFNs.
   ______________________________________________________________________


   Examples of the short form of the GTJFN% monitor call are shown in the
   following paragraphs.

   The following sequence of instructions is used  to  obtain,  from  the
   user's terminal, the specification of an existing file.

        MOVX AC1,GJ%OLD+GJ%FNS+GJ%SHT
        MOVE AC2,[.PRIIN,,.PRIOU]
        GTJFN%

   The bits specified for AC1 indicate that the file specification  given
   must  refer  to an existing file (GJ%OLD), that the file specification
   is to be accepted from the input JFN in AC2  (GJ%FNS),  and  that  the
   short  form  of  the  GTJFN% call is being used (GJ%SHT).  Because the
   right half of AC1 is zero, the standard  generation  number  algorithm
   will be used.  In this GTJFN% call, the file with the highest existing
   generation number is used.  Because GJ%FNS is set in AC1, the contents
   of  AC2  are interpreted as containing an input JFN and an output JFN.
   In this example, the file specification is obtained from the  terminal
   (.PRIIN).

   The following sequence of instructions is used  to  obtain,  from  the
   user's  terminal,  the  specification of an output file and to require
   confirmation from the  user  once  the  file  specification  has  been
   obtained.

        MOVX AC1,GJ%FOU+GJ%MSG+GJ%CFM+GJ%FNS+GJ%SHT
        MOVE AC2,[.PRIIN,,.PRIOU]
        GTJFN%

   In this example, the bits specified for AC1 indicate that

         o  the file obtained is to be an output file (GJ%FOU),

         o  after the file specification is obtained, a message is to  be
            typed (GJ%MSG),


                                    3-11
                                USING FILES


         o  the user is required to confirm the file  specification  that
            was obtained (GJ%CFM),

         o  the file specification is to be obtained from the  input  JFN
            in AC2 (GJ%FNS),

         o  the short form of the GTJFN% call is being used (GJ%SHT).

   Because the right half of AC1 is zero, the generation number given  to
   the  file  will  be  one  greater  than  the highest generation number
   existing for the  file.   The  contents  of  AC2  are  interpreted  as
   containing  an  input  JFN  and an output JFN because GJ%FNS is set in
   AC1.

   The following sequence of instructions is used to obtain the  name  of
   an existing file from a location in the user's program.

        MOVX AC1,GJ%OLD+GJ%SHT
        MOVE AC2,[POINT 7,NAME]
        GTJFN%
           .
           .
           .

   NAME:ASCIZ/MYFILE.TXT/

   The bits specified for AC1 indicate that the file obtained is to be an
   existing  file  (GJ%OLD) and that the short form of the GTJFN% call is
   being used (GJ%SHT).  Since the right half of AC1 is  zero,  the  file
   with  the  highest  generation number will be used.  Because GJ%FNS is
   not set, the contents of AC2 are interpreted as containing  a  pointer
   to  a  string  in memory that specifies the file to be associated with
   the JFN.  The setup  of  AC2  indicates  that  the  string  begins  at
   location  NAME in the user's program.  The file specification obtained
   from location NAME is MYFILE.TXT.

   An alternate way of specifying the same file is the sequence

        MOVX AC1,GJ%OLD+GJ%SHT
        HRROI AC2,[ASCIZ/MYFILE.TXT/]
        GTJFN%



   3.3.1.2  Long Form of GTJFN% - The long form  of  the  GTJFN%  monitor
   call requires the following two words of arguments:


              0                        17 18                       35
             !=======================================================!
      AC1    !             0             ! address of argument table !
             !=======================================================!


                                    3-12
                                USING FILES


              0                                                    35
             !=======================================================!
      AC2    !   pointer to ASCIZ file specification string, or 0    !
             !=======================================================!


   The argument block for the long form is described in Table 3-4.


   Table 3-4:  Long Form GTJFN% Argument Block

   ______________________________________________________________________

     Word      Symbol            Meaning
   ______________________________________________________________________

      0        .GJGEN            Flag bits appear in the left half  and
                                 generation number appears in the right
                                 half.

      1        .GJSRC            An input JFN appears in the left  half
                                 and an output JFN appears in the right
                                 half.  To omit either JFN, the  user's
                                 program must specify the symbol .NULIO
                                 (377777).

      2        .GJDEV            Pointer to ASCIZ string that specifies
                                 the  device  to  be  used when none is
                                 given.  If this word is 0, DSK will be
                                 used.

      3        .GJDIR            Pointer to ASCIZ string that specifies
                                 the  directory to be used when none is
                                 given.  If this word is 0, the  user's
                                 connected directory will be used.

      4        .GJNAM            Pointer to ASCIZ string that specifies
                                 the  filename  to be used when none is
                                 given.  If this word is 0,  the  input
                                 must specify the filename.

      5        .GJEXT            Pointer to ASCIZ string that specifies
                                 the  file type to be used when none is
                                 given.  If this word is 0, a null type
                                 will be used.

      6        .GJPRO            Pointer to ASCIZ string  or  3B2+octal
                                 protection  code.  This word indicates
                                 the protection to be used when none is
                                 given.    If   this  word  is  0,  the
                                 protection   as   specified   in   the
                                 directory will be used.


                                    3-13
                                USING FILES


      7        .GJACT            Pointer to ASCIZ string or 3B2+decimal
                                 account  number.   This word indicates
                                 the account to be used  when  none  is
                                 given.  If this word is 0, the account
                                 specified when the user logged in will
                                 be used.

     10        .GJJFN            The  JFN  to  assign   to   the   file
                                 specification  if  flag  bit GJ%JFN is
                                 set in word .GJGEN  (word  0)  of  the
                                 argument block.

     11-17                       Additional words allowed if  flag  bit
                                 GJ%XTN  (bit 15) is set in word .GJGEN
                                 (word 0) of the argument block.  These
                                 additional   words   are   used   when
                                 performing command input  parsing  and
                                 are  described  in the TOPS-20 Monitor
                                 Calls Reference Manual.
   ______________________________________________________________________


   The flag bits accepted in the left half of  .GJGEN  (word  0)  of  the
   argument block are the same as those accepted in the short form of the
   GTJFN% call.  The entire set of flag bits is listed in Table 3-2.

   The generation number values accepted in  the  right  half  of  .GJGEN
   (word  0)  of  the argument block can be 0, -1, -2, -3, or a specified
   number, although 0 is the normal case.  Refer to Bits 18-35  of  Table
   3-2 for explanations of these values.

   If execution of the GTJFN% call is successful,  the  JFN  assigned  is
   returned in the right half of AC1 and various bits are set in the left
   half if flag bits 11, 12 or 13 were on in the call.   Refer  to  Table
   3-3  for  the  explanations  of  the  bits returned.  Execution of the
   program continues at the second instruction following the call.

   If execution of the GTJFN call is  not  successful,  the  JFN  is  not
   assigned  and an error code is returned in the right half of AC1.  The
   execution of the program continues at the  instruction  following  the
   GTJFN% call.

   The following sequence of instructions obtains a specification for  an
   existing  file  from  the user's terminal, assigns the JFN to the next
   higher generation of that file, and specifies  default  fields  to  be
   used if the user omits a field when he gives his file specification.

             MOVEI AC1,JFNTAB
             SETZ AC2,
             GTJFN%
              .
              .
              .

                                    3-14
                                USING FILES


   JFNTAB:   GJ%FOU
             XWD .PRIIN,.PRIOU
             0
             POINT 7,[ASCIZ/TRAIN/]   ;default directory
             0
             POINT 7,[ASCIZ/MEM/]     ;default file type
             0
             0
             0


   The address of the argument table for  the  GTJFN%  call  (JFNTAB)  is
   given  in  the  right  half  of  AC1.   AC2 contains 0, which means no
   pointer to a string is given; thus, fields for the file  specification
   will  be  taken  only from the user's terminal.  The first word of the
   argument block contains a flag bit for  the  GTJFN%  call.   This  bit
   (GJ%FOU)  indicates  that  the  next higher generation number is to be
   assigned to the file.  The second word of the argument block indicates
   that  the  file  specification  is  to  be  obtained  from  the user's
   terminal, and any output  generated  because  of  the  user  employing
   recognition  is  to  be printed on his terminal.  If the user does not
   supply a directory  name  as  part  of  his  file  specification,  the
   directory  <TRAIN> will be used.  And if the user does not give a file
   type, the type MEM will be used.  If the user omits other fields  from
   his specification, the system standard value (refer to Table 3-1) will
   be used.



   3.3.1.3  Summary of GTJFN% - The GTJFN% monitor call  is  required  to
   associate a JFN with a particular file.  In most cases, the short form
   of the GTJFN% call is sufficient for  establishing  this  association.
   However, the long form is more powerful because it provides the user's
   program more control over the file  specification  that  is  obtained.
   The following summary compares the characteristics of the two forms of
   the GTJFN% monitor call.


           Short Form                         Long Form

        Assigns a JFN to a file.           Assigns a JFN to a file.
           System decides the JFN             User program may request
           to assign.                         a particular JFN.

        Accepts the file specification     Accepts the file specification
           from a string in memory            from a string in memory
           or a file.                         and a file.

        Uses standard system values        Allows user-supplied values
           for fields not given               to be used for fields not
           in the file                        given in the file
           specification.                     specification.


                                    3-15
                                USING FILES


   3.4  OPENING A FILE

   Once a JFN has been obtained for a file, the user's program must  open
   the  file  in order to transfer data.  The user's program supplies the
   JFN of the file to be opened and a word of bits indicating the desired
   byte size, data mode, and access to the file.

   The desired access to the file is specified by a separate bit for each
   type  of  access.  The file is successfully opened only if the desired
   access does not conflict with the current access to the file (refer to
   Section  3.1).   For example, if the user requests both read and write
   access to the file, but write access is not allowed, then the file  is
   not opened for this user.  The allowed types of access to a file are:

         o  Read access.  The file can be  read  with  byte,  string,  or
            random input.

         o  Write access.  The file can be written with byte, string,  or
            random output.

         o  Append access.  The file can be written only with  sequential
            byte  or  dump output, and the current byte pointer (refer to
            Section 3.5.1) cannot be changed.  The  initial  position  of
            the file pointer is at the end of the file.

         o  Frozen access.  The file can be concurrently accessed  by  at
            most  one  user  writing the file, but by any number of users
            reading the file.  This is the default access to a file.

         o  Thawed access.  The file can be accessed even if other  users
            are reading and writing the file.

         o  Restricted access.  The file cannot be  accessed  if  another
            user already has opened the file.

         o  Unrestricted read access.  The file can be read regardless of
            what other users might be doing with the file.



   3.4.1  OPENF% Monitor Call

   The OPENF% (Open File)  monitor  call  opens  a  specified  file.   It
   requires the following two words of arguments.










                                    3-16
                                USING FILES


              0                        17 18                       35
             !=======================================================!
      AC1    !             0             ! JFN of file to be opened  !
             !=======================================================!


             0       5 6   9             18               30 31   35
             !=======================================================!
      AC2    !  byte   !data !     0     !    access bits    !   0   !
             !  size   !mode !           !                   !       !
             !=======================================================!


   If the left half of AC1 is not 0, the contents of AC1  is  interpreted
   as  a  pointer  to  a  string,  not  as  a JFN.  If the user's program
   requests bits returned in AC1 from the GTJFN% call, these bits must be
   cleared before executing the OPENF% call.

   The byte size (OF%BSZ) in AC2 specifies the number  of  bits  in  each
   byte of the file and can be between 1 and 36 (decimal).  If this field
   is 0 a byte size of 36 (decimal) is assumed.

   The file data mode field (OF%MOD) usually has one of two values:

        Value                                   Meaning

          0                 Normal data mode of the file (that  is,  byte
                            I/O).  Dump I/O is illegal.

          17                Dump mode (that  is,  unbuffered  word  I/O).
                            Byte  I/O  is  illegal  and  the byte size is
                            ignored.

   The access bits are described in Table 3-5.


   Table 3-5:  OPENF% Access Bits

   ______________________________________________________________________

     Bit       Symbol            Meaning
   ______________________________________________________________________

     0-5       OF%BSZ            Byte size (maximum of 36 decimal).

     6-9       OF%MOD            Data mode in which to open file.

     18        OF%HER            Halt  on  the  occurrence  of  an  I/O
                                 device    or   medium   error   during
                                 subsequent I/O to the file.   If  this
                                 bit  is  not set, a software interrupt
                                 is generated if  a  device  or  medium
                                 error occurs during subsequent I/O.

                                    3-17
                                USING FILES


     19        OF%RD             Allow read access.

     20        OF%WR             Allow write access.

     21        OF%EX             Allow execute access.

     22        OF%APP            Allow append access.

     23        OF%RDU            Allow unrestricted read access.

     24                          Reserved for Digital.

     25        OF%THW            Allow thawed access.  If this  bit  is
                                 not set, the file is opened for frozen
                                 access.

     26        OF%AWT            Block (that is,  temporarily  suspend)
                                 the  program  until access to the file
                                 is permitted.

     27        OF%PDT            Do not update the access dates of  the
                                 file.

     28        OF%NWT            Return an error if access to the  file
                                 cannot be permitted.

     29        OF%RTD            Allow access to the file to  only  one
                                 process (that is, restricted access).

     30        OF%PLN            Do not check for line numbers  in  the
                                 file.

     31        OF%DUD            Suppress system updating  of  modified
                                 pages  in  memory  to  thawed files on
                                 disk unless CLOSF or UFPGS issued.

     32        OF%OFL            Open device even if off-line.

     33        OF%FDT            Force update of .FBREF (last read)  in
                                 FDB and increment RH of .FBCNT (number
                                 of references).

     34        OF%RAR            Wait if file off-line.
   ______________________________________________________________________


   If bits OF%AWT and OF%NWT are both off, an error code is  returned  if
   access  to  the file cannot be permitted (that is, the action taken is
   identical to OF%NWT being on).





                                    3-18
                                USING FILES


   If execution of the OPENF% monitor call is  successful,  the  file  is
   opened,  and  the  execution  of  the  program continues at the second
   instruction after the OPENF% call.

   If execution of the OPENF% call is not successful,  the  file  is  not
   opened,  and  an  error code is returned in AC1.  The execution of the
   program continues at the next instruction after the OPENF% call.

   Two samples of the OPENF% call follow.

   The sequence of instructions below opens a file for input.

        HRRZ AC1,JFNEXT
        MOVX AC2,FLD(44,OF%BSZ)+OF%RD+OF%PLN
        OPENF%

   The JFN of the  file  to  be  opened  is  contained  in  the  location
   indicated  by the address in AC1 (JFNEXT).  The bits specified for AC2
   indicate that the byte size is  one  word  FLD(44,OF%BSZ),  that  read
   access  is being requested to the file (OP%RD), and that no check will
   be made for line numbers in the file; that is, the line  numbers  will
   not  be  discarded  (OF%PLN).  Because bit OF%THW is not set, the file
   can be accessed for reading by any number of processes.

   The following sequence of instructions can be used to open a file  for
   output.

        MOVE AC1,JFN
        MOVX FLD(7,OF%BSZ)+OF%HER+OF%WR+OF%AWT
        OPENF%

   The right half of AC1 contains the address that has  the  JFN  of  the
   file  to be opened.  The bits specified for AC2 indicate that the byte
   size is 7-bit bytes FLD(7,OF%BSZ), that the program is  to  be  halted
   when  an  I/O  error occurs in the file (OF%HER), that write access is
   being requested to the file (OF%WR), and that the  program  is  to  be
   blocked  if  access cannot be granted (OF%AWT).  Because bit OF%THW is
   not set, if another user has been granted write access  to  the  file,
   this user's program will be blocked until access can be granted.



   3.5  TRANSFERRING DATA

   Data transfers of  sequential  bytes  are  the  most  common  form  of
   transfer and can be used with any file.  For disk files, nonsequential
   bytes and entire pages can also be transferred.







                                    3-19
                                USING FILES


   3.5.1  File Pointer

   Every open file is associated with a pointer that indicates  the  last
   byte  read  from  or  written to the file.  When the file is initially
   opened, this pointer is normally positioned before  the  beginning  of
   the  file  so  that  the first data operation will reference the first
   byte in the file.  The pointer is then advanced through  the  file  as
   data  is  transferred.  However, if the file is opened for append-only
   access (bit OF%APP set in the OPENF% call), the pointer is  positioned
   after  the  last  byte  of  the  file.   This  allows  the first write
   operation to append data to the end of the file.

   For disk files, the pointer may be repositioned arbitrarily throughout
   the  file,  such as in the case of nonsequential data transfers.  When
   the pointer is positioned beyond the end of the file,  an  end-of-file
   indication  is  returned  when  the  program attempts a read operation
   using byte input.  When the program performs a write operation  beyond
   the  end  of  the file using byte output, the end-of-file indicator is
   updated to point to the end of the new data.  However, if the  program
   writes  pages  beyond  the end of the file with the PMAP% monitor call
   (refer to section 3.5.6), the byte count is not  updated.   Therefore,
   it  is  possible  for  a  file  to  contain  pages  of data beyond the
   end-of-file indicator.  To allow sequential I/O to be performed  later
   to  the  file, the program should update the byte count before closing
   the file.  (Refer to  the  CHFDB%  monitor  call  description  in  the
   TOPS-20 Monitor Calls Reference Manual.)



   3.5.2  Source and Destination Designators

   Because I/O operations occur by  moving  data  from  one  location  to
   another, the user's program must supply a source and a destination for
   any I/O operation.  The  most  commonly-used  source  and  destination
   designators are the following:

        1.  A JFN associated with a particular file.   The  JFN  must  be
            previously  obtained  with  the GTJFN% or GNJFN% monitor call
            before it can be used.

        2.  The primary input and output designators .PRIIN  and  .PRIOU,
            respectively  (refer  to  Section  2.2).   These  designators
            should be used when referring to the terminal.

        3.  A byte pointer to the beginning of the string of bytes in the
            program's  address  space that is being read or written.  The
            byte pointer can take one of two forms:

             o  A word with a -1 in the left half and an address  in  the
                right half.  This form is used to designate a 7-bit ASCIZ
                string starting in the left-most byte  of  the  specified
                address.   A word in this form is functionally equivalent
                to a word assembled by the POINT 7,ADR pseudo-op.

                                    3-20
                                USING FILES


             o  A full word byte pointer with a byte size of 7 bits.

   Most monitor calls dealing with strings deal specifically  with  ASCII
   strings.  Normally, ASCII strings are assumed to terminate with a byte
   of 0 (that is, are assumed to be ASCIZ strings).  However  some  calls
   optionally  accept  an  explicit  byte  count and/or terminating byte.
   These calls are generally ones that handle non-ASCII strings and  byte
   sizes other than 7 bits.



   3.5.3  Transferring Sequential Bytes

   The BIN% (Byte Input) and BOUT% (Byte Output) monitor calls  are  used
   for sequential byte transfers.  The BIN% call takes the next byte from
   the given source and places it in AC2.  The BOUT% call takes the  byte
   from AC2 and writes it to the given destination.  The size of the byte
   is that given in the OPENF% call for the file.

   The BIN% monitor call accepts a source designator  in  AC1,  and  upon
   successful  execution of the call, the byte is right-justified in AC2.
   If execution of the call is not  successful,  an  illegal  instruction
   trap  is  generated.   Control  returns  to  the user's program at the
   instruction following the BIN% call.   If  the  end  of  the  file  is
   reached,  AC2  contains  0 instead of a byte.  The program can process
   this end-of-file condition if a jump style error return  is  the  next
   instruction following the BIN% call.

   The BOUT% monitor call accepts a destination designator in AC1 and the
   byte  to be output, right-justified in AC2.  Upon successful execution
   of the call, the byte is written to the destination.  If execution  of
   the  call  is not successful, an illegal instruction trap is generated
   Control returns to the user's program at the instruction following the
   BOUT% call.

   The following sequence shows the transferring of bytes from  an  input
   file to an output file.  The bytes are read from the file indicated by
   INJFN and written to the file indicated by OUTJFN.

        LOOP:  MOVE 1,INJFN      ;get source designator from INJFN
               BIN%              ;read a byte from the source
               ERJMP DONE        ;check for end of file, if 0
        LOOP2: MOVE 1,OUTJFN     ;get destination from OUTJFN
               BOUT%             ;write the byte to the destination
               JRST LOOP         ;continue until 0 byte is found
        DONE:  GTSTS%            ;obtain status of source
               TXNN 2,GS%EOF     ;test for end of file
               JRST NOTYET       ;no, test for 0 in input file
               :                 ;yes, process end of file condition
        NOTYET:MOVEI 2,0         ;0 in input file
               JRST LOOP2



                                    3-21
                                USING FILES


   3.5.4  Transferring Strings

   The SIN% (String Input) and SOUT% (String Output)  monitor  calls  are
   used  for string transfers.  These calls transfer either a string of a
   specified number of bytes or a string terminated with a specific byte.

   The SIN% monitor call reads a string from the  specified  source  into
   the program's address space.  The call accepts four words of arguments
   in AC1 through AC4.

        AC1:   source designator

        AC2:   pointer to area in program's address space

        AC3:   count of number of bytes to read, or 0

        AC4:   byte on which to terminate input (optional)

   The contents of AC3 are interpreted as the  number  of  characters  to
   read.

         o  If AC3 is 0, then reading continues until a 0 byte  is  found
            in the input.

         o  If AC3 is positive, then reading continues until  either  the
            specified  number  of  bytes is read, or a byte equal to that
            given in AC4 is found in the input, whichever occurs first.

         o  If AC3 is negative, then reading continues  until  minus  the
            specified number of bytes is read.

   The contents of AC4 needs to be specified only if the contents of  AC3
   is a positive number.  The byte in AC4 is right-justified.

   The input is terminated when one of the following occurs:

         o  The byte count becomes zero.

         o  The specified terminating byte is reached.

         o  The end of the file is reached.

         o  An error occurs during the  transfer  (for  example,  a  data
            error occurs).

   Control returns to the user's program at the instruction following the
   SIN%  call.   If  an  error  occurs  (including the end of the file is
   reached), an illegal instruction  trap  is  generated.   In  addition,
   several locations are updated:





                                    3-22
                                USING FILES


        1.  The position of the file's pointer is updated for  subsequent
            I/O to the file.

        2.  The pointer to the string in AC2 is updated  to  reflect  the
            last  byte read or, if AC3 contained 0, the last nonzero byte
            read.

        3.  The count in AC3 is updated, if pertinent, by subtracting the
            number  of  bytes  actually  read  from  the  number of bytes
            requested to be read (that is, the count  is  updated  toward
            zero).  From this count, the user's program can determine the
            number of bytes actually transferred.

   The SOUT% monitor call writes a  string  from  the  program's  address
   space  to  the  specified  destination.  Like the SIN% call, this call
   accepts four words of arguments in AC1 through AC4.

        AC1:   destination designator

        AC2:   pointer to string to be written

        AC3:   count of the number of bytes to write, or 0

        AC4:   byte on which to terminate output (optional)

   The contents of AC3 and AC4 are interpreted in the same manner as they
   are in the SIN% monitor call.

   The transfer is terminated when one of the following occurs.

         o  The byte count becomes zero.

         o  The specified terminating byte is reached.  This  terminating
            byte is written to the destination.

         o  An error occurs during the transfer.

   Control returns to the user's program at the instruction following the
   SOUT%  call.   If  an  error  occurs,  an  illegal instruction trap is
   generated.  In addition, the  position  of  the  file's  pointer,  the
   pointer  to the string in AC2, and the count in AC3, if pertinent, are
   also updated in the same manner as in the SIN% monitor call.

   The following code sequence shows transferring a string from an  input
   file  to  an  output file.  The procedure is the same as at the end of
   Section 3.5.3, using SIN% and SOUT% calls instead of BIN% and BOUT%.

        LOOP:  MOVE 1,INJFN      ;get source from INJFN
               HRROI 2,BUF128    ;pointer to string to read into (128 
                                 ;word buffer)




                                    3-23
                                USING FILES


               MOVNI 3,^D128*5   ;input a maximum of 640 bytes
               SIN%              ;transfer until end of buffer or end of 
                                 ;file
                ERCAL EOFQ       ;error occurred
                   
               ADDI 3,^D128*5    ;determine negative number of 
                                 ;bytes transferred
               MOVN 3,3          ;convert to positive
               MOVE 1,OUTJFN     ;get destination from OUTJFN
               HRROI 2,BUF128    ;pointer to string to write from
               SOUT%             ;transfer as many bytes as read
        EOFQ:  MOVE 1,INJFN
               GTSTS%            ;obtain status of source
               TXNN 2,GS%EOF     ;test for end of file
               RET               ;no, continue copying



   3.5.5  Transferring Nonsequential Bytes

   As discussed in Section 3.5.3, the BIN% and BOUT% calls transfer bytes
   sequentially,  starting at the current position of the file's pointer.
   The RIN% (Random Input) and ROUT% (Random Output) monitor calls  allow
   the  user's  program  to  specify  where  the  transfer  will begin by
   accepting a byte number within the file.  The size of the byte is  the
   size  given in the OPENF% call for the file.  The RIN% and ROUT% calls
   can only be used when transferring data to or from disk files.

   The RIN% monitor call takes a byte from the specified location in  the
   file  and places it into the accumulator.  The call accepts the JFN of
   the file in AC1 and the byte number within  the  file  in  AC3.   Upon
   successful completion of the call, the byte is right-justified in AC2,
   and the file's pointer is updated to point to the byte  following  the
   one  just  read.   If  an error occurs, an illegal instruction trap is
   generated.  Control returns to the user's program at  the  instruction
   following the RIN% call.

   The ROUT% monitor call takes a byte from the accumulator and writes it
   into  the specified location in the file.  The call accepts the JFN of
   the file in AC1, the byte to write right-justified  in  AC2,  and  the
   byte number within the file in AC3.  Upon successful completion of the
   call, the byte is written into the specified byte in the file, and the
   file's  pointer is updated to point to the byte following the one just
   written.   If  an  error  occurs,  an  illegal  instruction  trap   is
   generated.   Control  returns to the user's program at the instruction
   following the ROUT% call.



   3.5.6  Mapping Pages

   Up to this point, monitor calls have been presented  for  transferring


                                    3-24
                                USING FILES


   bytes  and  strings of data.  The next call to be discussed is used to
   transfer entire pages of data between a file and a process.

   Both files and process  address  spaces  are  divided  into  pages  of
   512(decimal)  words.   A  page  within a file can be identified by one
   word, where the JFN of the file is in  the  left  half  and  the  page
   number  within the file is in the right half.  A page within a process
   address space can also be identified by one word, where the identifier
   of the process (refer to Section 5.3) is in the left half and the page
   number within the process' address space is in the right  half.   Each
   one-word  identifier  for  the pages in  the  process address space is
   placed in what is called the process page map.  When  identifiers  for
   file  pages  are  placed  in  the  process page map, references to the
   process page actually refer to the file page.  The  following  diagram
   illustrates  a  process  map  that  has identifiers for pages from two
   files.


                                                File 1
                                                __________
                                               |          |
                  Process Map                  |          |
                  _____________                |          |
                 |             |               |          |
                 |             |               |          |
                 |-------------|               |----------|
                 |JFN1  |Page 1|-------------->| Page 1   |
                 |-------------|               |----------|
                 |             |               |          |
                 |             |               |          |
                 |-------------|               |__________|
                 |             |
                 |             |
                 |             |                File 2
                 |             |                __________
                 |             |               |          |
                 |             |               |          |
                 |-------------|               |----------|
                 |JFN2  |Page 2|-------------->| Page 2   |
                 |-------------|               |----------|
                 |             |               |          |
                 |             |               |          |
                 |_____________|               |          |
                                               |          |
                                               |          |
                                               |__________|


   The PMAP% (Page Mapping) monitor call is  used  to  map  one  or  more
   entire pages from a file to a process (for input), from a process to a
   file (for output),  or  from  one  process  to  another  process.   In
   general, this call changes the entries in the process map by accepting


                                    3-25
                                USING FILES


   file page identifiers  and  process  page  identifiers  as  arguments.
   Mapping pages between a file and a process is described below; mapping
   pages between two processes is described in Chapter 5.



   3.5.6.1  Mapping File Pages to a Process - This use of the PMAP%  call
   changes  the  map  of  the  process so that references to pages in the
   process reference pages in a file.  This does not actually cause  data
   to  be  transferred; it simply changes the contents of the map.  Later
   when changes are made to the actual page in the process,  the  changes
   will  also  be  made to the page in the file, if write access has been
   specified for the file.

   Note that you cannot map file pages to pages in a process section that
   does not exist in the the process map.  If you use PMAP% to input file
   pages to pages in a nonexistent section  of  a  process,  the  monitor
   generates an illegal instruction trap.

   In addition, you can map one or more file sections (of 512 pages each)
   into a process.  See Section 8.3.1 for details.

   The PMAP% call accepts three words of arguments in AC1 through AC3.

        AC1:   JFN of the file in the left half, and the page  number  in
               the file in the right half

        AC2:   process identifier (refer to  Section  5.3)  in  the  left
               half, and page number in the process in the right half

        AC3:   repetition count and access

   The repetition count and access bits that can be specified in AC3  are
   described in Table 3-6.


   Table 3-6:  PMAP% Access Bits

   ______________________________________________________________________

     Bit       Symbol    Meaning
   ______________________________________________________________________

      0        PM%CNT    Repeat the mapping  operation  the  number  of
                         times specified by the right half of AC3.  The
                         file page number and the process  page  number
                         are  incremented  by 1 each time the operation
                         is performed.

      2        PM%RD     Allow read access to the page.

      3        PM%WR     Allow write access to the page.


                                    3-26
                                USING FILES


      4        PM%EX     Reserved.
                         The symbol PM%RWX can be used to set B2-4.

      5        PM%PLD    Preload  page  being  mapped  (move  the  page
                         immediately  instead  of  waiting  until it is
                         referenced).

      9        PM%CPY    Create a private  copy  of  the  page  if  the
                         process  writes into the page.  This is called
                         copy-on-write and causes the map to be changed
                         so  that it identifies the copy instead of the
                         original.  Write access is allowed to the copy
                         even  if  it  was not allowed to the original.
                         This allows a process to change a page of data
                         without  changing the data for other processes
                         that have also mapped the page.

     10        PM%EPN    Bits 18-35 of AC2  contain  extended  (18-bit)
                         process   page   number.    If   the   section
                         containing the page does not exist, a  private
                         section is created.

     11        PM%ABT    Unmap  page  and   discard   (abort)   changed
                         contents.

     18-35     PM%RPT    The number of  times  to  repeat  the  mapping
                         operation if bit 0(PM%CNT) is set.
   ______________________________________________________________________


   With this use of the PMAP% call, the present contents of the  page  in
   the  process  are  removed.   If  the  page  in  the file is currently
   nonexistent, it will be created when it is written.

   This use of the PMAP% call is valid only if the file is opened for  at
   least read access.  If write access is requested in the PMAP% call, it
   is not granted unless it was also specified in the  OPENF%  call  when
   the file was opened.

   A file cannot be closed while any of its pages  are  mapped  into  any
   process.   Thus,  before  a file is closed, its pages must be unmapped
   (refer to Section 3.5.6.3).

   After execution of the PMAP%  call,  control  returns  to  the  user's
   program at the instruction following the call.  If an error occurs, an
   illegal instruction trap is generated.



   3.5.6.2  Mapping Process Pages to a File - This use of the PMAP%  call
   actually transfers data by moving the specified page in the process to
   the specified page in the file.  The process map for the page  is  now


                                    3-27
                                USING FILES


   empty.   Both the page in the process and the page in the file must be
   private; that is, no other process can have the page mapped  into  its
   address  space.   The  ownership of the process page is transferred to
   the file page.  The previous contents of the  page  in  the  file  are
   deleted.

   The three words of arguments are as follows:

        AC1:   process identifier (refer to  Section  5.3)  in  the  left
               half, and page number in the process in the right half

        AC2:   JFN of the file in the left half, and the page  number  in
               the file in the right half

        AC3:   repetition count and access (refer to Section 3.5.6.1)

   The access requested in the PMAP% call is granted only if it does  not
   conflict  with  the  access specified in the OPENF% call when the file
   was opened.

   This use of the PMAP% call does not  automatically  update  the  files
   byte count and the byte size.  To allow the file to be read later with
   sequential I/O monitor calls, the program  should  update  the  file's
   byte  count  and  the byte size.  (Refer to the CHFDB% monitor call in
   the TOPS-20 Monitor Calls Reference Manual).



   3.5.6.3  Unmapping Pages in a Process - As stated previously,  a  file
   cannot  be  closed  if any of its pages are mapped in any process.  To
   unmap a file's pages from a process,  the  program  must  execute  the
   SMAP% call, or the following form of the PMAP% call:

        AC1:   -1

        AC2:   process identifier in the left half, and  page  number  in
               the process in the right half.

        AC3:   the repeat count for the number of pages  to  remove  from
               the process (refer to Section 3.5.6.1).



   3.5.7  Mapping File Sections to a Process

   A section of memory is a unit of 512 pages of process  address  space.
   File  sections  also  contain  512 pages.  The first page of each file
   section has a page number that is an integral multiple of  512.   Like
   memory pages, sections can be mapped from one process to another, from
   a process to itself, or from a file to a process.  Chapter 8 describes
   the SMAP% call completely.



                                    3-28
                                USING FILES


   The SMAP% (Section Mapping) monitor call is similar to the PMAP% call.
   The SMAP% call maps one or more sections from a file to a process (for
   input), or from one process to another  process.   To  map  a  process
   section to a file, you must use the PMAP% call as described in Chapter
   5 to map each page.

   Mapping a file section to a process section with SMAP% does not  cause
   data  to  move  from  the  disk to memory.  Instead, SMAP% changes the
   contents of the process memory map so that the process section pointer
   points  to  a file section.  The monitor transfers data only when your
   program references a memory page to which a file page is mapped.

   To map a file section to  a  process  section,  SMAP%  requires  three
   arguments:

        AC1:   source identifier:  a JFN in the left  half,  and  a  file
               section  number  in the right half.  If several contiguous
               sections are to be mapped, the number in the right half is
               that  of  the  first  section  in  the group of contiguous
               sections.

        AC2:   destination identifier:  process identifier  in  the  left
               half,  and a process section number in the right half.  If
               several contiguous sections are to be mapped,  the  number
               in  the right half is the number of the first section into
               which SMAP% maps a file section.

        AC3:   flags that control access to the process  section  in  the
               left  half, and, in the right half, the number of sections
               to map into the process.  The number of  sections  to  map
               cannot be less than 1 nor more than 32 (decimal).

   The flags in the left half of AC3 are described in Table 3-7.


   Table 3-7:  SMAP% Access Bits

   ______________________________________________________________________

     Bit       Symbol    Meaning
   ______________________________________________________________________

      2        SM%RD     Allow read access.

      3        SM%WR     Allow write access.

      4        SM%EX     Allow execute access.

      6        SM%IND    Map the destination section using an  indirect
                         section pointer.
   ______________________________________________________________________



                                    3-29
                                USING FILES


   3.6  CLOSING A FILE

   Once data has been transferred to or from a file, the  user's  program
   must  close the file.  When a file is closed, the system automatically
   performs the following:

        1.  Updates the directory information for the file.  For example,
            for  a  file  to which sequential bytes had been written, the
            byte size and byte count are updated when the file is closed.

        2.  Releases the JFN associated  with  the  file.   However,  the
            user's  program can request to close the file, but retain the
            JFN assignment.  This is  useful  if  the  program  plans  to
            reopen  the  same  file  later,  but does not want to execute
            another GTJFN% call.



   3.6.1  CLOSF% Monitor Call

   The CLOSF% (Close File) monitor call closes either the specified  file
   or  all files that are opened for the process executing the call.  The
   CLOSF% call accepts one word of arguments in AC1 - flag  bits  in  the
   left half and the JFN of the file to be closed in the right half.  The
   flag bits are described in Table 3-8.


   Table 3-8:  CLOSF% Flag Bits

   ______________________________________________________________________

     Bit      Symbol   Meaning
   ______________________________________________________________________

      0       CO%NRJ   Do not release the JFN from the file.

      6       CZ%ABT   Abort  any  output  operations  currently  being
                       done.   That  is,  close  the  file  but  do not
                       perform normal cleanup operations (for  example,
                       do   not   output  any  data  remaining  in  the
                       buffers).  If output to a new disk file that has
                       not  been  closed is aborted, the file is closed
                       and then deleted.

      7       CS%NUD   Do not update the copy of the directory  on  the
                       disk  (refer  to  the  CHFDB% description in the
                       TOPS-20 Monitor Calls Reference Manual for  more
                       information).
   ______________________________________________________________________


   If the contents of AC1 is -1, all  files  that  are  opened  for  this
   process are closed.

                                    3-30
                                USING FILES


   If the execution of the CLOSF% call is successful, the specified  file
   is  closed, and the JFN associated with the file is released if CO%NRJ
   was not set  in  the  call.   The  execution  of  the  user's  program
   continues at the second location after the CLOSF% call.

   If the execution of the CLOSF% call is not successful, the file is not
   closed  and  an  error code is returned in the right half of AC1.  The
   execution of the user's program continues at the instruction following
   the CLOSF% call.

   The following sequence illustrates the closing of two files.

        CLOSIF:  HRRZ 1,INJFN    ;obtain input JFN
                 CLOSF%          ;close input file
                  ERJMP FATAL    ;if error, print message and stop
        CLOSOF:  HRRZ 1,OUTJFN   ;obtain output JFN
                 CLOSF%          ;close output file
                  ERJMP FATAL    ;if error, print message and stop



   3.7  ADDITIONAL FILE I/O MONITOR CALLS



   3.7.1  GTSTS% Monitor Call

   The GTSTS% (Get Status) monitor call obtains the  status  of  a  file.
   This call accepts one argument word - the JFN of the file in the right
   half of the AC1.  The left half of AC1 is zero.

   Control always returns  to  the  user's  program  at  the  instruction
   following  the  GTSTS% call.  Upon return, appropriate bits reflecting
   the status of the specified JFN are set in AC2.  These bits, and their
   meanings, are described in Table 3-9.  Note that if the JFN is illegal
   or unassigned, bit 10 (GS%NAM) will not be set.


   Table 3-9:  Bits Returned on GTSTS% Call

   ______________________________________________________________________

     Bit       Symbol            Meaning
   ______________________________________________________________________

      0        GS%OPN            The file is open.  If this bit is  not
                                 set, the file is not open.

      1        GS%RDF            If the  file  is  open  (for  example,
                                 GS%OPN  is  set),  it is open for read
                                 access.



                                    3-31
                                USING FILES


      2        GS%WRF            If the file is open, it  is  open  for
                                 write access.

      3        GS%XCF            File is open for execute access.

      4        GS%RND            If the file is open, it  is  open  for
                                 non-append   access   (that   is,  its
                                 pointer can be reset).

      5-6                        Reserved for Digital.

      7        GS%LNG            File has  pages  in  existence  beyond
                                 page number 511.

      8        GS%EOF            The last read operation  to  the  file
                                 was at the end of the file.

      9        GS%ERR            The file may be in error (for example,
                                 the bytes read may be erroneous).

     10        GS%NAM            A  file  specification  is  associated
                                 with  this  JFN.  This bit will not be
                                 set if the JFN is in any way illegal.

     11        GS%AST            One  or  more  fields  of   the   file
                                 specification associated with this JFN
                                 contain a wildcard character.

     12        GS%ASG            The JFN is  currently  being  assigned
                                 (that is, a process other than the one
                                 executing the GTSTS call is  assigning
                                 this JFN).

     13        GS%HLT            An I/O error is  considered  to  be  a
                                 terminating  condition  for  this JFN.
                                 That is, the OPENF% call for this  JFN
                                 had bit OF%HER set.

     14-16                       Reserved for Digital.

     17        GS%FRK            Access to the file  is  restricted  to
                                 only one process.

     18        GS%PLN            If on, file line  numbers  are  passed
                                 during  input;  if  zero, line numbers
                                 are stripped before input.

     19-31                       Reserved for Digital.

     32-35     GS%MOD            The data mode of the  file  (refer  to
                                 the OPENF% call).



                                    3-32
                                USING FILES


                                 Value  Symbol  Meaning

                                   0    .GSNRM  Normal (sequential) I/O
                                   1    .GSSMB  Small buffer mode
                                   10   .GSIMG  Image (binary) I/O
                                   17   .GSDMP  Dump I/O
   ______________________________________________________________________


   An example of the GTSTS% call is shown in the first program in Section
   3.9.



   3.7.2  JFNS% Monitor Call

   The JFNS% (JFN to String) monitor call returns the file  specification
   currently  associated  with the specified JFN.  The call accepts three
   words of arguments in AC1 through AC3.

        AC1:   destination  designator  where  the   file   specification
               associated   with   the   JFN  is  to  be  written.   This
               specification is an ASCIZ string.

        AC2:   JFN or pointer to string (see below)

        AC3:   format to be used when returning  the  specification  (see
               below)

   The contents of AC1 can be any valid destination designator (refer  to
   Section 3.5.2).

   The contents of AC2 can be one of two formats.  The first format is  a
   word  with  either  flag bits or 0 in the left half and the JFN in the
   right half.  The bits that can be given in the left half  of  AC2  are
   the ones returned from the GTJFN% call (refer to Table 3-3).  When the
   left half of AC2 is nonzero (that is, contains the bits returned  from
   the GTJFN% call), the string returned will contain wildcard characters
   for appropriate fields and 0, -1, or -2 as a generation number if  the
   corresponding  bit is on in the JFNS% call.  When the left half of AC2
   is 0, the string returned is the exact specification for the file (for
   example, wildcard characters are not returned for any fields).  If the
   JFN is associated only with a  file  specification  and  not  with  an
   actual  file  (that  is,  bit  GJ%OFG was set in the GTJFN% call), the
   string returned will contain null fields for  unspecified  fields  and
   the actual values for specified fields.  The second format allowed for
   AC2 is a pointer to the string in the program's address space that  is
   to  be  returned  upon  execution  of  the call.  Refer to the TOPS-20
   Monitor Calls Reference Manual for the explanation of this format.





                                    3-33
                                USING FILES


   The contents of AC3 specify the format in which the  specification  is
   written  to the destination.  Bits 0 through 20 are divided into 3-bit
   bytes, each byte representing a field in the file specification.   The
   value  of  the byte indicates the format for that field.  The possible
   values are:

        Value     Symbol     Meaning

          0       .JSNOF     Do not return this field when returning  the
                             file specification.

          1       .JSAOF     Always return this field when returning  the
                             file specification.

          2       .JSSSD     Suppress this field if it  is  the  standard
                             system  value for this field (refer to Table
                             3-1).

   If the contents of AC3 is zero, the file specification is  written  in
   the format

        dev:<directory>name.typ.gen;T

   with fields the same as the standard system value (see Table 3-1)  not
   returned  and protection and account fields returned only if bit 9 and
   bit 10 in AC2 are on, respectively.  The temporary attribute  (;T)  is
   returned only if the file is temporary.

   Table 3-10 describes the bits that can be set in AC3.


   Table 3-10:  JFNS% Format Options

   ______________________________________________________________________

     Bit       Symbol            Meaning
   ______________________________________________________________________

      0        JS%NOD            Print  node  name  if  node  name   is
                                 present.

      1-2      JS%DEV            Format for device field.

      3-5      JS%DIR            Format for directory field.

      6-8      JS%NAM            Format for filename field.  A value of
                                 2  (that is, bit 7 set) for this field
                                 is illegal.

      9-11     JS%TYP            Format for file type field.   A  value
                                 of  2  (that  is, bit 10 set) for this
                                 field is illegal.


                                    3-34
                                USING FILES


     12-14     JS%GEN            Format for generation number field.

      0-14     JS%SPC            Output  for  all  file   specification
                                 fields named above.  This field should
                                 have the same bits set as would be set
                                 in   the   fields   above.   (See  B35
                                 (JS%PAF) below.)

     15-17     JS%PRO            Format for protection field.

     18-20     JS%ACT            Format for account field.

     21        JS%TMP            Return temporary file indication ;T if
                                 the   file   specification  is  for  a
                                 temporary file.

     22        JS%SIZ            Return size  of  file  in  pages  (see
                                 below).

     23        JS%CDR            Return  creation  date  of  file  (see
                                 below).

     24        JS%LWR            Return date of last write operation to
                                 file (see below).

     25        JS%LRD            Return date  of  last  read  operation
                                 from file (see below).

     26        JS%PTR            AC2 contains a pointer to  the  string
                                 containing  the  field  to be returned
                                 (refer to the  TOPS-20  Monitor  Calls
                                 Reference  Manual for a description of
                                 this use of the JFNS% call).

     27        JS%ATR            Return file  specification  attributes
                                 if appropriate.

     28        JS%AT1            Return     specification     attribute
                                 referenced in AC4.

     29        JS%OFL            Return the "OFF-LINE" attribute.

     30-31                       Reserved for Digital.

     32        JS%PSD            Punctuate the  size  and  date  fields
                                 (see  below) in the file specification
                                 returned.

     33        JS%TBR            Place a tab before all fields returned
                                 (that  is, fields whose value is given
                                 as 1 in the 3-bit field) in  the  file
                                 specification,  except  for  the first
                                 field.

                                    3-35
                                USING FILES


     34        JS%TBP            Place a tab before all fields that may
                                 be  returned  (that  is,  fields whose
                                 value is given as 1 or 2 in the  3-bit
                                 field)   in  the  file  specification,
                                 except for the first field.

     35        JS%PAF            Punctuate  all  fields   (see   below)
                                 returned  in  the  file  specification
                                 from the device field through  the  ;T
                                 field.

                                 If bits 32 through 35 are not set,  no
                                 punctuation   is   used   between  the
                                 fields.
   ______________________________________________________________________


   The punctuation used on each field is shown below.

        dev:<directory>name.typ.gen;A(account);P(protection);T(temporary)
        ,size,creation date,write date,read date

   Refer to Section 1.2.2 for information on error returns.



   3.7.3  GNJFN% Monitor Call

   Occasionally a program may be written to perform similar operations on
   a  group  of  files instead of only on one file.  However, the program
   should not require the user to give  a  file  specification  for  each
   file.   Because the GTJFN% call associates a JFN with only one file at
   a time, the program needs a method of assigning a JFN to all the files
   in  the  group.   By using the GTJFN% call to initially obtain the JFN
   and the GNJFN% call to assign the same JFN to each subsequent file  in
   the  group,  a program can accept a specification for a group of files
   and process each file in the group individually.  After the user gives
   the  initial  file  specification,  the program requires no additional
   input.

   Before an example showing the interaction of these two calls is given,
   a   description   of  the  GNJFN%  (Get  Next  JFN)  monitor  call  is
   appropriate.

   The GNJFN% monitor call assigns a JFN to the next file in a  group  of
   files  that  have  been  specified with wildcard characters.  The next
   file is determined by searching the directory in the  order  described
   in  Section  3.3.1.1  using  the current file as the first item.  This
   call accepts one argument word in AC1 - the flags  returned  from  the
   GTJFN%  call in the left half and  the JFN of the  current file in the
   right half.  In other words, the information returned in AC1 from  the
   GTJFN%  call  is  given as an argument to the GNJFN% call.  Therefore,
   the program must save this information for use with the GNJFN% call.

                                    3-36
                                USING FILES


   If execution of the  GNJFN%  call  is  successful,  the  same  JFN  is
   assigned to the next file in the group.  The left half of AC1 contains
   various flags and the right half contains the JFN.  The  execution  of
   the program continues at the second instruction after the GNJFN% call.

   Table 3-11 describes the bits  that  can  be  returned  in  AC1  on  a
   successful GNJFN% call.


   Table 3-11:  GNJFN% Return Bits

   ______________________________________________________________________

     Bit       Symbol            Meaning
   ______________________________________________________________________

     13        GN%STR            A change in structure occurred between
                                 the previous file and this file.

     14        GN%DIR            A change in directory occurred between
                                 the previous file and this file.

     15        GN%NAM            A change in filename occurred  between
                                 the previous file and this file.

     16        GN%EXT            A change in file type occurred between
                                 the  previous  file and this file.  If
                                 GN%NAM is on, this bit will also be on
                                 because the system considers two files
                                 with different filenames but with  the
                                 same file type as a change in both the
                                 name and type.
   ______________________________________________________________________


   If execution of the GNJFN% call is not successful, an  error  code  is
   returned in the right half of AC1.  Conditions that can cause an error
   return are:

        1.  The file currently associated with the JFN  must  be  closed,
            and  it  is  not.  This means that the program must execute a
            CLOSF% call (with  CO%NRJ  set  to  retain  the  JFN)  before
            executing a GNJFN% call.

        2.  There are no more files in this group.  This return occurs on
            the  first GNJFN% call after all files in the group have been
            stepped through.  The JFN is released when there are no  more
            files.   (Note:   This  error may occur if the file currently
            associated with the JFN is deleted or renamed.)





                                    3-37
                                USING FILES


   The execution of the program continues at the next  instruction  after
   the GNJFN% call.

   Consider the following situation.  The user wants to write  a  program
   that  will  accept  from  his  terminal a specification for a group of
   files and then perform an operation on each file individually  without
   requiring  additional  input.   Assume  the  user's  directory <TRAIN>
   contains the following files:

        FIRST.MAC.1
        FIRST.REL.1
        SECOND.REL.1
        THIRD.EXE.1

   As discussed in Section 3.3.1.1, a group of files can be given to  the
   GTJFN  call  by  supplying  a  specification  that  contains  wildcard
   characters in one or more of its fields.  Thus, the specification

        <TRAIN>*.*

   would refer to all four files in the user's directory <TRAIN>.

   In his program, the user includes a GTJFN% call that will  accept  the
   above specification.

   The call is

        MOVX AC1,GJ%OLD+GJ%IFG+GJ%FLG+GJ%FNS+GJ%SHT
        MOVE AC2,[.PRIIN,,.PRIOU]
        GTJFN%

   and indicates that

        1.  The file specification given must refer to an  existing  file
            (GJ%OLD).

        2.  The file specification given is allowed to  contain  wildcard
            characters (GJ%IFG).

        3.  Flags will be returned in AC1 on a successful call  (GJ%FLG).
            The  flags must be returned because they will be given to the
            GNJFN% call as arguments.

        4.  The contents of AC2 will  be  interpreted  as  containing  an
            input and output JFN (GJ%FNS).

        5.  The short form of the GTJFN% call is being used (GJ%SHT).

        6.  The file specification is to be read from the user's terminal
            (.PRIIN,,.PRIOU).




                                    3-38
                                USING FILES


   When the user types the specification <TRAIN>*.* as input, the  system
   associates  the  JFN  with  one file only.  This file is the first one
   found when searching the directory in the order specified  in  Section
   3.3.1.1.    Thus   the  JFN  returned  is  associated  with  the  file
   FIRST.MAC.1.

   After  the  GTJFN%  call  is  successfully  executed,   AC1   contains
   appropriate  flags  in the left half and the JFN assigned in the right
   half.  The flags that will be returned in  this  particular  situation
   are:

        GJ%NAM (bit 3)      A wildcard character  appeared  in  the  name
                            field of the file specification given.

        GJ%EXT (bit 4)      A wildcard character  appeared  in  the  type
                            field of the file specification given.

        GJ%GND (bit 12)     Any files marked for  deletion  will  not  be
                            considered.

   These flags inform the program of the fields that  contained  wildcard
   characters.   The  user's  program  must  now save the contents of AC1
   because this word will be used as the argument  to  the  GNJFN%  call.
   The  program  then  performs  its desired operation on the first file.
   Once its processing  is  completed,  the  program  is  ready  for  the
   specification  of  the  next  file.   But  instead  of  requesting the
   specification from the user, the program executes the GNJFN%  call  to
   obtain  it.   The  argument  to the GNJFN% call is the contents of AC1
   returned from the previous GTJFN% call.  Thus, the call in  this  case
   is equivalent to:

        MOVE AC1,[GJ%NAM+GJ%EXT+GJ%GND,,JFN]
        GNJFN%

   Upon  successful  execution  of  the  GNJFN%  call,  the  JFN  is  now
   associated  with  the  next  file in the group (that is, FIRST.REL.1).
   AC1 contains appropriate flags in the left half and the  same  JFN  in
   the right half.  In this example, the flag returned is GN%EXT (bit 16)
   to indicate that the file type changed between the two files.

   After processing the second file, the user's program executes  another
   GNJFN%  call  using  the  original  contents  of AC1 returned from the
   GTJFN% call.  The original contents must be  used  because  this  word
   indicates  the  fields containing wildcard characters.  If the current
   contents of AC1 (that is, the flags returned from the GNJFN% call) are
   used,  a  subsequent GNJFN% call would fail because there are no flags
   set indicating fields containing  wildcard  characters.   This  second
   GNJFN%  call associates the JFN with the file SECOND.REL.1.  The flags
   returned in AC1 are GN%NAM (bit 15) and  GN%EXT  (bit  16)  indicating
   that  the  filename  and  file  type  changed  between  the two files.
   (Remember that a change in filename implies a change in file type even
   if the two file types are the same.)


                                    3-39
                                USING FILES


   After processing this third file, the user's program executes  another
   GNJFN% call using the original contents of AC1.  Upon execution of the
   call, the JFN is  now  associated  with  THIRD.EXE.1,  and  the  flags
   returned  are  GN%NAM  and GN%EXT, indicating a change in the filename
   and file type.

   After processing the file THIRD.EXE.1, the user's program  executes  a
   final  GNJFN%  call.   Since there are no more files in the group, the
   call returns an error code and releases the  JFN.   Execution  of  the
   user's program continues at the instruction following the GNJFN% call.



   3.8  SUMMARY

   To read from or write to a file, the user's program must:

        1.  Obtain a JFN on the file with the GTJFN% monitor call  (refer
            to Section 3.3.1).

        2.  Open the file with the OPENF% monitor call (refer to  Section
            3.4.1).

        3.  Transfer the data with byte,  string,  or  page  I/O  monitor
            calls (refer to Section 3.5).

        4.  Close the file with the CLOSF% monitor call (refer to Section
            3.6.1).



   3.9  FILE EXAMPLES

   Example 1 - This program assigns JFNs, opens  an  input  file  and  an
   output  file,  and copies data from the input file to the output file.
   Data is copied until the end of the input file is reached.   Refer  to
   the  TOPS-20  Monitor  Calls  Reference  Manual for explanation of the
   ERSTR% monitor call.

   ;*** PROGRAM TO COPY INPUT FILE TO OUTPUT FILE. ***
   ;       (USING BIN%/BOUT% AND IGNORING NULLS)

           TITLE FILEIO            ;TITLE OF PROGRAM
           SEARCH MONSYM           ;SEARCH SYSTEM JSYS-SYMBOL LIBRARY
           SEARCH MACSYM
           .REQUIRE SYS:MACREL

   ;*** IMPURE DATA STORAGE AND DEFINITIONS ***


   INJFN:  BLOCK 1                 ;STORAGE FOR INPUT JFN
   OUTJFN: BLOCK 1                 ;STORAGE FOR OUTPUT JFN


                                    3-40
                                USING FILES


           PDLEN=3                 ;STACK HAS LENGTH 3
   PDLST:  BLOCK PDLEN             ;SET ASIDE STORAGE FOR STACK

           STDAC.                  ;DEFINE STANDARD ACs. SEE MACSYM.

   ;*** PROGRAM INITILIZATION ***

   START:  RESET%                  ;CLOSE FILES, ETC.
           MOVE P,[IOWD PDLEN,PDLST] ;ESTABLISH STACK

   ;***  GET INPUT FILE ***

   INFIL:                          ;PROMPT FOR INPUT FILE
           TMSG <
   INPUT FILE: >                   ;ON CONTROLLING TERMINAL
           MOVX T1,GJ%OLD+GJ%FNS+GJ%SHT ;SEARCH MODES FOR GTJFN
                                   ;EXISTING FILE ONLY, FILE-NRs IN B
                                   ;SHORT CALL
           MOVE T2,[.PRIIN,,.PRIOU] ;GTJFN'S I/O WITH CONTROLLING TERM
           GTJFN%                  ;GET JOB FILE NUMBER (JFN)
            ERJMPS [ PUSHJ P,WARN  ;IF ERROR, GIVE WARNING
                     JRST INFIL]   ;AND LET HIM TRY AGAIN
           MOVEM T1,INJFN          ;SUCCESS, SAVE THE JFN

   ;*** GET OUTPUT FILE ***

   OUTFIL:                         ;PRINT PROMPT FOR
           TMSG <
   OUTPUT FILE: >                  ;OUTPUT FILE
           MOVX T1,GJ%FOU+GJ%MSG+GJ%CFM+GJ%FNS+GJ%SHT ;GTJFN SEARCH MODES
                                   ;[DEFAULT TO NEW GENERATION, PRINT
                                   ; MESSAGE, REQUIRE CONFIRMATION
                                   ; FILE-NR'S IN T2, SHORT CALL ]
           MOVE T2,[.PRIIN,,.PRIOU] ;I/O WITH CONTROLLING TERMINAL
           GTJFN%                  ;GET JOB FILE NUMBER
            ERJMPS [ PUSHJ P,WARN  ;IF ERROR, GIVE WARNING
                    JRST OUTFIL]   ;AND LET HIM TRY AGAIN
           MOVEM T1,OUTJFN         ;SAVE THE JFN

   ;NOW, OPEN THE FILES WE JUST GOT

   ;   INPUT

           MOVE T1,INJFN           ;RETRIEVE THE INPUT JFN
           MOVX T2,FLD(7,OF%BSZ)+OF%RD ;MODES FOR OPENF 
                                   ;[7-BIT BYTES + INPUT]
           OPENF%                  ;OPEN THE FILE
            ERJMPS FATAL           ;IF ERROR, GIVE MESSAGE AND STOP

   ;   OUTPUT

           MOVE T1,OUTJFN          ;GET THE OUTPUT JFN


                                    3-41
                                USING FILES


           MOVX T2,FLD(7,OF%BSZ)+OF%WR ;MODES FOR OPENF 
                                   ;[7-BIT BYTES + OUTPUT]
           OPENF%                  ;OPEN THE FILE
            ERJMPS FATAL           ;IF ERROR, GIVE MESSAGE AND STOP


   ;*** MAIN LOOP: COPY BYTES FROM INPUT TO OUTPUT ***

   LOOP:   MOVE T1,INJFN           ;GET THE INPUT JFN
           BIN%                    ;TAKE A BYTE FROM THE SOURCE
           JUMPE T2,DONE           ;IF 0, CHECK FOR END OF FILE
           MOVE T1,OUTJFN          ;GET THE OUTPUT JFN
           BOUT                    ;OUTPUT THE BYTE TO DESTINATION
            ERCALS ERROR
           JRST LOOP               ;LOOP, STOP ONLY ON A 0 BYTE
                                   ;(FOUND AT LOOP+2)


   ;*** TEST FOR END OF FILE, ON SUCCESS FINISH UP ***

   DONE:   GTSTS%                  ;GET THE STATUS OF INPUT FILE
           TXNN T2,GS%EOF          ;AT END OF FILE?
           JRST LOOP               ;NO, FLUSH NULL AND CONTINUE COPY

   CLOSIF: MOVE T1,INJFN           ;YES, RETRIEVE INPUT JFN
           CLOSF%                  ;CLOSE INPUT FILE
            ERJMPS FATAL           ;IF ERROR, GIVE MESSAGE AND STOP

   CLOSOF: MOVE T1,OUTJFN          ;RETRIEVE OUTPUT JFN
           CLOSF%                  ;CLOSE OUTPUT FILE
            ERJMPS FATAL           ;IF ERROR, GIVE MESSAGE AND STOP
           TMSG <
   [DONE]>                         ;SUCCESSFULLY DONE
           JRST ZAP                ;STOP

   ;*** ERROR HANDLING ***

   FATAL:  TMSG <
   ?>                              ;FATAL ERRORS PRINT ? FIRST
           PUSHJ P,ERROR           ;THEN PRINT ERROR MESSAGE
           JRST ZAP                ;AND STOP

   WARN:   TMSG <
   %>                              ;WARNINGS PRINT % FIRST
                                   ;AND FALL THRU 'ERROR' 
                                   ;BACK TO CALLER

   ERROR:  MOVEI T1,.PRIOU         ;DECLARE PRINCIPAL OUTPUT DEVICE
                                   ;FOR ERROR MESSAGE
           MOVE T2,[.FHSLF,,-1]    ;CURRENT FORK,, LAST ERROR
           SETZ T3,                ;NO LIMIT,, FULL MESSAGE
           ERSTR%                  ;PRINT THE MESSAGE


                                    3-42
                                USING FILES


            JFCL                   ;IGNORE UNDEFINED ERROR NUMBER
            JFCL                   ;IGNORE ERROR DURING EXE OF ERSTR
           POPJ P,                 ;RETURN TO CALLER

   ZAP:    HALTF%                  ;STOP
           JRST START              ;WE ARE RESTARTABLE
           END START               ;TELL LINKING LOADER START ADDRESS


   Example 2 - This program accepts input from a user at the terminal and
   then  outputs  the data to the line printer.  Refer to Section 2.9 for
   explanation of the RDTTY% call.

           TITLE LPTPNT            ;PROGRAM TO PRINT TERMINAL INPUT 
                                   ;ON PRINTER
           SEARCH MONSYM           ;SEARCH SYSTEM JSYS-SYMBOL LIBRARY
           SEARCH MACSYM
           .REQUIRE SYS:MACREL

           STDAC.                  ;DEFINE STANDARD ACs

   BUFSIZ==200
   PDLEN==50

   COUNT:  BLOCK 1
   LPTJFN: BLOCK 1
   BUFFER: BLOCK BUFSIZ
   PDL:    BLOCK PDLEN

   START:  RESET%                  ;RESET I/O, ETC.
           MOVE P,[IOWD PDLEN,PDL] ;SET UP STACK
           TMSG <ENTER TEXT TO BE PRINTED (END WITH ^Z):
   >                               ;OUTPUT PROMPTING TEXT
           HRROI T1,BUFFER         ;GET POINTER TO BUFFER
           MOVE T2,[RD%BRK+BUFSIZ*5] ;GET FLAG AND MAX # OF CHARS TO READ
           SETZM T3                ;NO RE-TYPE BUFFER
           RDTTY%                  ;INPUT TEXT FROM TERMINAL
            EJSHLT                 ;ERROR, STOP
           HRRZS T2                ;GET CHARS REMAINING IN BUFFER
           MOVEI T1,BUFSIZ*5       ;COMPUTE NUMBER OF CHARS READ = 
           SUB T1,T2               ;BUFFERSIZE MINUS CHARS REMAINING
           SOS T1                  ;DON'T INCLUDE ^Z
           MOVEM T1,COUNT          ;SAVE # OF CHARS INPUT
   ;GET A JFN FOR THE PRINTER AND OPEN THE PRINTER

           MOVX T1,GJ%SHT!GJ%FOU   ;OUTPUT FILE, SHORT CALL
           HRROI T2,[ASCIZ /LPT:/] ;GET POINTER TO NAME OF FILE
           GTJFN%                  ;GET A JFN FOR THE PRINTER
            ERJMPS JFNERR          ;ERROR, PRINT ERROR MESSAGE
           MOVEM T1,LPTJFN         ;REMEMBER PRINTER JFN
           MOVX T2,FLD(7,OF%BSZ)+OF%WR ;7-BIT BYTES, 
                                   ;WRITE ACCESS WANTED


                                    3-43
                                USING FILES


           OPENF%                  ;OPEN THE PRINTER FOR OUTPUT
            ERJMPS OPNERR          ;ERROR, PRINT ERROR MESSAGE

   ;NOW OUTPUT THE TEXT THAT WAS INPUT FROM THE TERMINAL
           
           HRROI T2,BUFFER         ;GET POINTER TO TEXT 
                                   ;(PRINTER JFN STILL IN T1)
           MOVN T3,COUNT           ;GET NUMBER OF CHARS TO OUTPUT
           SOUT%                   ;OUTPUT STRING OF CHARS TO 
                                   ;THE PRINTER
            ERJMPS DATERR          ;ERROR, PRINT ERROR MESSAGE
           TMSG <
   OUTPUT HAS BEEN SENT TO THE PRINTER...
   >                               ;OUTPUT CONFIRMATION MESSAGE
           MOVE T1,LPTJFN          ;GET PRINTER JFN
           CLOSF%                  ;CLOSE IT
            ERJMPS DATERR          ;UNEXPECTED ERROR, PRINT ERROR MESSAGE
           HALTF%                  ;FINISHED
           JRST START              ;IF CONTINUED, GO BACK TO START

   ;ERROR ROUTINES

   JFNERR: TMSG<
   ? COULD NOT GET A JFN FOR THE PRINTER
   >
           HALTF%
           JRST START              ;IF CONTINUED, GO BACK TO START

   OPNERR: TMSG<
   ? COULD NOT OPEN THE PRINTER FOR OUTPUT
   >
           HALTF%
           JRST START              ;IF CONTINUED, GO BACK TO START

   DATERR: TMSG<
   ? DATA ERROR DURING OUTPUT TO PRINTER
   >
           HALTF%
           JRST START              ;IF CONTINUED, GO BACK TO START

           END START













                                    3-44











                                 CHAPTER 4

                    USING THE SOFTWARE INTERRUPT SYSTEM



   4.1  OVERVIEW

   Program  execution  usually  occurs  in  a  sequential  manner,  where
   instructions  are executed one after another.  But sometimes a program
   must be able to  receive  asynchronous  signals  from  terminals,  the
   monitor,  or  other programs, or as a result of its own execution.  By
   using the software interrupt system, the user can  specify  conditions
   that  will  cause his program to deviate from its sequential method of
   execution.

   An interrupt is defined as a break  in  the  normal  flow  of  control
   during  a  program's execution.  The break, or interrupt, is caused by
   the  occurrence  of  a  prespecified  condition.   By  specifying  the
   conditions that can cause an interrupt, the program has the capability
   of dynamically responding to external events and error conditions  and
   of  generating requests for services.  Because the program can respond
   to special conditions as they occur, it does not  have  to  explicitly
   and repeatedly test for them.  In addition, the program's execution is
   faster because the program does not have to  include  a  special  test
   after the possible occurrence of the condition.

   When an interrupt occurs, the system transfers control from  the  main
   program  sequence  to a previously-specified routine that will process
   the interrupt.  After the routine has completed its processing of  the
   interrupt,  the system can transfer control back to the program at the
   point it was interrupted, and execution can continue.  See Figure 4-1.













                                    4-1
                    USING THE SOFTWARE INTERRUPT SYSTEM


     -----------------
     | User Program  |
     |     is        |
     | Executing     |
     -----------------
             |
             V
     -----------------
     | Interrupt     |
     | Condition     |
     | Occurs        |
     -----------------
             |
             V
             ^                          ^
            / \                        / \
           /   \                      /   \
          / Has \                    /Is An\
         /Program\                  /Inter- \          
        / Enabled \                /rupt of  \          -----------------
       /for Condi- \  Yes         /Higher Pri-\ No      | Execute       |
      <tion on this >----------->< ority Being >------->| User's Inter- |
       \ Channel   /      ^       \ Processed /         | rupt Routine  |
        \   ?     /       |        \    ?    /          --------|--------
         \       /        |         \       /                   |
          \     /         |          \     /                    |
           \   /          |           \   /                     |
            \ /           |            \ /                      |
             V            |             V                       |
             | No         |             | Yes                   |
             |            |             V                       |
             |            |     ----------------------          |
             V            |     | Wait Until         |          |
     -----------------    |     | Higher Priority    |          |
     | Perform System|    |     | Interrupt Finishes |          |
     | Default Action|    |     --------|-------------          |        
     | (e.g., stops  |    |             |                       |
     | job, print    |    \-------------/                       |
     | message)      |                                          |
     --------|--------                                          |
             | <------------------------------------------------/
             V
     -----------------
     | User Program  |
     | Continues if  |
     | Job Has Not   |
     | Not Been      |
     | Terminated    |
     -----------------





                                    4-2
                    USING THE SOFTWARE INTERRUPT SYSTEM


   Figure 4-1:  Basic Operational  Sequence  of  the  Software  Interrupt
                System




















































                                    4-3
                    USING THE SOFTWARE INTERRUPT SYSTEM


   4.2  INTERRUPT CONDITIONS

   Conditions that cause the program to be interrupted when the interrupt
   system is enabled are:

        1.  Conditions generated when specific terminal keys  are  typed.
            There   are   36  possible  codes;  each  one  specifies  the
            particular  terminal  character  or  condition  on  which  an
            interrupt  is  to  be  initiated.  Refer to Table 4-2 for the
            possible codes.

        2.  Invalid instructions (for example, I/O instructions given  in
            user  mode)  or  privileged  monitor  calls  issued  by a non
            privileged user.

        3.  Memory conditions, such as illegal memory references.

        4.  Arithmetic processor conditions, such as arithmetic  overflow
            or underflow.

        5.  Certain file or device conditions, such as end of file.

        6.  Program-generated software interrupts.

        7.  Termination of an inferior process.

        8.  System resource unavailability.

        9.  Interprocess   communication   (IPCF)   and   Enqueue/Dequeue
            interrupts.



   4.3  SOFTWARE INTERRUPT CHANNELS AND PRIORITIES

   Each condition  is  associated  with  one  of  36  software  interrupt
   channels.   Most  conditions  are  permanently  assigned  to  specific
   channels; however, the user's program can  associate  some  conditions
   (for  example,  conditions generated by specific terminal keys) to any
   one of the assignable channels.  (Refer to Table 4-1 for  the  channel
   assignments.) When the condition associated with a channel occurs, and
   that channel has been activated, an interrupt is  generated.   Control
   can  then  be  transferred  to  the routine responsible for processing
   interrupts on that channel.

   The user program assigns each channel to one of three priority levels.
   Priority levels allow the occurrence of some conditions to suspend the
   processing of other conditions.  The levels are referred to  as  level
   1, 2, or 3 with level 1 having the highest priority.  Level 0 is not a
   legal priority level.[1]




                                    4-4
                    USING THE SOFTWARE INTERRUPT SYSTEM


   Table 4-1:  Software Interrupt Channel Assignments

   ______________________________________________________________________

     Channel      Symbol         Meaning
   ______________________________________________________________________

      0-5                        Assignable by user program

      6           .ICAOV         Arithmetic overflow

      7           .ICFOV         Arithmetic floating point overflow

      8                          Reserved for Digital

      9           .ICPOV         Pushdown list (PDL) overflow*

      10          .ICEOF         End of file condition

      11          .ICDAE         Data error file condition*

      12          .ICQTA         Disk quota exceeded

      13-14                      Reserved for Digital

      15          .ICILI         Illegal instruction*

      16          .ICIRD         Illegal memory read*

      17          .ICIWR         Illegal memory write*

      18                         Reserved for Digital

      19          .ICIFT         Inferior process termination

      20          .ICMSE         System resources exhausted*

      21                         Reserved for Digital

      22          .ICNXP         Nonexistent page reference

      23-35                      Assignable by user program
   ______________________________________________________________________


   ---------------

    [1]  If an interrupt is generated in a  process  where  the  priority
         level  is  0,  the  system  considers  that  the  process is not
         prepared to handle the interrupt.  The process is then suspended
         or terminated according to the setting of bit 17 (SC%FRZ) in its
         capability word.


                                    4-5
                    USING THE SOFTWARE INTERRUPT SYSTEM


   *  These  channels  (called  panic  channels)  cannot  be   completely
      deactivated.   An  interrupt  generated  on  one  of these channels
      terminates the process if the channel is not activated.


   The  software  interrupt  system  processes  interrupts  on  activated
   channels  only,  and  each  channel  can  be activated and deactivated
   independently of other channels.   When  activated,  the  channel  can
   generate an interrupt for its associated priority level.  An interrupt
   for any priority level is initiated only if there are no interrupts in
   progress  for  the  same or higher priority levels.  If there are, the
   system remembers the interrupt request  and  initiates  it  after  all
   equal  or  higher priority level interrupts finish.  This means that a
   higher priority level request can suspend a routine processing a lower
   level  interrupt.  Thus, the user must be concerned with several items
   when he assigns his priority levels.  He must  consider  1)  when  one
   interrupt  request  can  suspend the processing of another and 2) when
   the processing of a second interrupt  cannot  be  deferred  until  the
   completion of the first.



   4.4  SOFTWARE INTERRUPT TABLES

   To process interrupts, the user includes,  as  part  of  his  program,
   special  service  routines for the channels he will be using.  He must
   then specify the addresses of these routines to the system by  setting
   up  a  channel  table.   In  addition,  the  user  must also include a
   priority level table as part of his program.  Finally, he must declare
   the addresses of these tables to the system.



   4.4.1  Specifying the Software Interrupt Tables

   Before using the software interrupt system, the  user's  program  must
   set up the contents of the channel table and the priority level table.
   The program must then specify their addresses with either the SIR%  or
   XSIR% monitor calls.

   These calls are similar, but their  differences  are  important.   The
   SIR%  call  can be used in single-section programs, but the XSIR% call
   must be used in programs that use more than  one  section  of  memory.
   The SIR% call works in non-zero sections only if the tables are in the
   same section as the code that makes the call.  The  code  that  causes
   the  interrupt  must  also  be  in that section, as must the code that
   processes the interrupt.  Because of the limitations of the SIR% call,
   you should use the XSIR% call.

   The SIR% monitor call accepts two words of arguments:  the  identifier
   for  the  program (or process) in AC1, and the table addresses in AC2.
   Refer to Section 5.3 for the description of process identifiers.


                                    4-6
                    USING THE SOFTWARE INTERRUPT SYSTEM


   The following example shows the use of the SIR% call.

        MOVEI 1,.FHSLF           ;identifier of current process
        MOVE 2,[LEVTAB,,CHNTAB]  ;addresses of the tables
        SIR%

   The  XSIR%  call  accepts  the  following  arguments:   in  AC1,   the
   identifier  of  the process for which the interrupt channel tables are
   to be set; in AC2, the address of the argument block.

   The argument block is  a  three-word  block  that  has  the  following
   format:


           !======================================================!
           !   Length of the argument block, including this word  !
           !------------------------------------------------------!
           !          Address of the interrupt level table        !
           !------------------------------------------------------!
           !             Address of the channel table             !
           !======================================================!


   Control always returns  to  the  user's  program  at  the  instruction
   following  the  SIR%  and XSIR% calls.  If the call is successful, the
   table addresses are stored  in  the  monitor.   If  the  call  is  not
   successful, an illegal instruction trap is generated.

   Any changes made to the contents of the tables after the XSIR% or SIR%
   calls  have  been  executed  will be in effect at the time of the next
   interrupt.



   4.4.2  Channel Table

   The channel table, CHNTAB,[2]  contains  a  one-word  entry  for  each
   channel;  thus, the table has 36 entries.  Each entry corresponds to a
   particular channel, and each channel is associated at any  given  time
   with  only  one  interrupt  condition.   (Refer  to  Table 4-1 for the
   interrupt conditions associated with each channel.)

   The CHNTAB table is indexed by the channel number (0 through 35).  The
   general format, for use with the XSIR% and XRIR% monitor calls, can be
   used in any section of memory.  The left half of each  entry  contains
   the  priority  level  (1,  2,  or 3) in bits 0-5 (SI%LEV) to which the
   channel is assigned.  Bits 6-35 (SI%ADR) of  each  entry  contain  the
   starting  address  of  the  routine to process interrupts generated on
   ---------------

    [2]  The user can  call  his  priority  channel  table  any  name  he
         desires; however, it is good practice to call it CHNTAB.


                                    4-7
                    USING THE SOFTWARE INTERRUPT SYSTEM


   that channel.  If a particular channel is not used, the  corresponding
   entry in the channel table should be zero.

   In the older format, for use with the  SIR%  and  RIR%  calls  by  any
   single-section  program,  the  left  half  of  each  word contains the
   priority level (1, 2, or 3) for that channel.  The right half contains
   the  address  of  the interrupt routine that will handle interrupts on
   that channel.

   The following example is for use with the XSIR% monitor call.

   CHNTAB: FLD(2,SI%LEV)+FLD(CHN0SV,SI%ADR)        ;channel 0
           FLD(2,SI%LEV)+FLD(CHN1SV,SI%ADR)        ;channel 1
           FLD(2,SI%LEV)+FLD(CHN2SV,SI%ADR)        ;channel 2
           FLD(2,SI%LEV)+FLD(CHN3SV,SI%ADR)        ;channel 3
           0                                       ;channel 4
           0                                       ;channel 5
           FLD(1,SI%LEV)+FLD(APRSRV,SI%ADR)        ;channel 6
           0                                       ;channel 7
           0                                       ;channel 8
           FLD(1,SI%LEV)+FLD(STKSRV,SI%ADR)        ;channel 9
           0                                       ;channel 10
            .                                        .
            .                                        .
            .                                        .
           0                                       ;channel 35

   In this example, channels 0 through 3 are assigned to  priority  level
   2,  with  the  interrupt  routine  at  CHN0SV servicing channel 0, the
   routine at CHN1SV servicing channel 1, the routine at CHN2SV servicing
   channel  2, and the routine at CHN3SV servicing channel 3.  Channels 6
   and 9 are assigned to priority level 1, with  the  routine  at  APRSRV
   servicing  channel  6  and  the routine at STKSRV servicing channel 9.
   All remaining channels are not assigned.



   4.4.3  Priority Level Table

   The priority level table, LEVTAB,[3] The priority level table, LEVTAB,
   [3] is a three-word table, containing a one-word entry for each of the
   three priority levels.  In the general form, each  word  contains  the
   30-bit  address of the first word of the two-word block in the process
   address space.  The block addressed by word n of  LEVTAB  is  used  to
   store  the  global PC flags and address when an interrupt of level n+1
   occurs.

   The PC flags are stored in the first word of the PC block, and the  PC
   ---------------

    [3]  The user can call his priority level table any name he  desires;
         however, it is good practice to call it LEVTAB.


                                    4-8
                    USING THE SOFTWARE INTERRUPT SYSTEM


   address  is stored in the second.  This form of the table must be used
   with the XSIR% and XRIR%  monitor  calls,  and  can  be  used  in  any
   section.

   The older form of the  interrupt  level  table  can  be  used  in  any
   single-section program, and must be used with the SIR% and RIR% calls.
   This table also contains three words, indexed by  the  priority  level
   minus  1.   Each  word  contains zero in the left half, and the 18-bit
   address of the word in which to store the one-word section-relative PC
   in  the right half.  This address is assumed to be in the same program
   section that contained the SIR% monitor call.  (For  more  information
   see  Chapter 8.) The system must save the value of the program counter
   so that it can return control at the appropriate point in the  program
   once  the interrupt routine has completed processing an interrupt.  If
   a particular priority level is not used, its  corresponding  entry  in
   the level table should be zero.

   The following is a sample of a level table.

        LEVTAB:   0,,PCLEV1       ;Addresses to save PC for interrupts
                  0,,PCLEV2       ;occurring on priority levels 1 and 2.
                  0,,0            ;No priority level 3 interrupts are
                                  ;planned



   4.5  ENABLING THE SOFTWARE INTERRUPT SYSTEM

   Once the interrupt tables have been set up and their addresses defined
   with  the  XSIR%  monitor  call,  the  user's  program must enable the
   interrupt system.  When the interrupt system  is  enabled,  interrupts
   that occur on activated channels are processed by the user's interrupt
   routines.   When  the  interrupt  system  is  disabled,  the   monitor
   processes  interrupts as if the channels for these interrupts were not
   activated.

   The EIR%  monitor  call,  used  to  enable  the  system,  accepts  one
   argument:  the identifier for the process in AC1.

        MOVEI 1,.FHSLF           ;identifier of current process
        EIR%

   Control always returns to the instruction following the EIR call.



   4.6  ACTIVATING INTERRUPT CHANNELS

   Once the software interrupt system is enabled, the channels  on  which
   interrupts  can  occur  must  be activated (refer to Table 4-1 for the
   channel assignments).  The channels to be  activated  have  a  nonzero
   entry in the appropriate word in the channel table.


                                    4-9
                    USING THE SOFTWARE INTERRUPT SYSTEM


   The AIC% monitor call activates  one  or  more  of  the  36  interrupt
   channels.   This  call accepts two words of arguments - the identifier
   for the process in AC1, and the channels to be activated in AC2.

   The channels are indicated by setting bits  in  AC2.   Setting  bit  n
   indicates  that channel n is to be activated.  The AIC% call activates
   only those channels for which bits are set.

        MOVEI 1,.FHSLF                     ;identifier of current process
        MOVE 2,[1B<.ICAOV>+1B<.ICPOV>]     ;activate channels 6 and 9
        AIC%

   Control always returns to the instruction following the AIC% call.

   Some  channels,  called  panic  channels,  cannot  be  deactivated  by
   disabling the channel or the entire interrupt system.  (Refer to Table
   4-1 for these  channels.)  This  is  because  the  occurrence  of  the
   conditions associated with these channels cannot be completely ignored
   by the monitor.

   If one of these conditions occurs, an interrupt is  generated  whether
   the channel is activated or not.  If the channel is not activated, the
   process is terminated, and usually a message is output before  control
   returns to the monitor.  If the channel is activated, control is given
   to the user's interrupt routine for that channel.



   4.7  GENERATING AN INTERRUPT

   A process generates an interrupt by producing a condition for which an
   interrupt channel is enabled, such as arithmetic overflow, or by using
   the IIC% monitor call.  This call can generate an interrupt on any  of
   the   36  interrupt  channels  of  the  process  the  calling  process
   specifies.  See Section 5.10 for a description of the IIC% call.



   4.8  PROCESSING AN INTERRUPT

   When a software interrupt  occurs  on  a  given  priority  level,  the
   monitor  stores  the  current program counter (PC) word in the address
   indicated in the priority level table (refer to Section  4.4.3).   The
   monitor  then  transfers  control  to the interrupt routine associated
   with the channel on which the interrupt occurred.  The address of this
   routine is specified in the channel table (refer to Section 4.4.2).

   Since the user's program  cannot  determine  when  an  interrupt  will
   occur, the interrupt routine must preserve the state of the program so
   the program can be resumed properly.  First, the  routine  stores  the
   contents  of  any  user  accumulators  for  use  while  processing the
   interrupt.  After the accumulators are saved,  the  interrupt  routine
   processes the interrupt.

                                    4-10
                    USING THE SOFTWARE INTERRUPT SYSTEM


   Occasionally, an interrupt routine may need to alter locations in  the
   main  section  of  the program.  For example, a routine may change the
   stored PC word to resume execution at a location different from  where
   the  interrupt  occurred.   Or  it  may  alter a value that caused the
   interrupt.  It is important that care be used  when  writing  routines
   that  alter  data  because  any  changes  will  remain when control is
   returned to the main program.  For example, if data  is  inadvertently
   stored in the PC word, return to the main section of the program would
   be incorrect when the system attempted to use the word as the value of
   the program counter.

   If a higher-priority interrupt  occurs  during  the  execution  of  an
   interrupt  routine,  the  execution  of  the lower-priority routine is
   suspended.  The value of its program counter is stored at the location
   indicated in the priority level table for the new interrupt.  When the
   routine for this new interrupt is  completed,  the  suspended  routine
   resumes.

   If an interrupt of the  same  or  lower  priority  occurs  during  the
   execution  of  a  routine,  the  monitor holds the interrupt until all
   higher or equal level interrupts have been processed.

   The system considers the user's program unable to process an interrupt
   on an activated channel if any of the following is true:

        1.  The priority level associated with the channel is 0.

        2.  The program has not defined its interrupt tables by executing
            an XSIR% or SIR% monitor call.

        3.  The process has not enabled the interrupt system by executing
            an  EIR% monitor call, and the channel on which the interrupt
            occurs is a panic channel.

   In any of these cases, an interrupt on a panic channel terminates  the
   user's program.  All other interrupts are ignored.



   4.8.1  Dismissing an Interrupt

   Once the processing of an interrupt is complete, the interrupt routine
   should restore the user accumulators to their initial values.  Then it
   should return control to the interrupted  code  by  using  the  DEBRK%
   monitor call.  This call restores the PC word and resumes the program.
   The call has no arguments, and must  be  the  last  statement  in  the
   interrupt routine.

   If the interrupt-processing routine has not  changed  the  PC  of  the
   user's program, the DEBRK% call restores the program to the same state




                                    4-11
                    USING THE SOFTWARE INTERRUPT SYSTEM


   the program was in just before the interrupt occurred.  If the program
   was  interrupted  while  waiting for I/O to complete, for example, the
   program will again be waiting for I/O  to  complete  when  it  resumes
   execution after the DEBRK% call.

   If the PC word was changed, the program resumes execution at  the  new
   PC location.  The state of the program is unchanged.



   4.9  TERMINAL INTERRUPTS

   The user's program can associate channels 0 through 5 and channels  24
   through  35  with  occurrences  of  various  conditions,  such  as the
   occurrence of a particular character typed  at  the  terminal  or  the
   receipt   of   an  IPCF  message.   This  section  discusses  terminal
   interrupts; refer to Chapters 6 and 7 for other  types  of  assignable
   interrupts.

   There are 36 codes used to specify terminal characters  or  conditions
   on  which  interrupts can be initiated.  These codes, along with their
   associated conditions, are shown in Table 4-2.


   Table 4-2:  Terminal Codes and Conditions

   ______________________________________________________________________

     Code         Symbol                   Character or Condition
   ______________________________________________________________________

      0           .TICBK                   CTRL/@  or break

      1           .TICCA                   CTRL/A

      2           .TICCB                   CTRL/B

      3           .TICCC                   CTRL/C

      4           .TICCD                   CTRL/D

      5           .TICCE                   CTRL/E

      6           .TICCF                   CTRL/F

      7           .TICCG                   CTRL/G

      8           .TICCH                   CTRL/H

      9           .TICCI                   CTRL/I

     10           .TICCJ                   CTRL/J


                                    4-12
                    USING THE SOFTWARE INTERRUPT SYSTEM


     11           .TICCK                   CTRL/K

     12           .TICCL                   CTRL/L

     13           .TICCM                   CTRL/M

     14           .TICCN                   CTRL/N

     15           .TICCO                   CTRL/O

     16           .TICCP                   CTRL/P

     17           .TICCQ                   CTRL/Q

     18           .TICCR                   CTRL/R

     19           .TICCS                   CTRL/S

     20           .TICCT                   CTRL/T

     21           .TICCU                   CTRL/U

     22           .TICCV                   CTRL/V

     23           .TICCW                   CTRL/W

     24           .TICCX                   CTRL/X

     25           .TICCY                   CTRL/Y

     26           .TICCZ                   CTRL/Z

     27           .TICES                   ESC key

     28           .TICRB                   Delete (or rubout) key

     29           .TICSP                   Space

     30           .TICRF                   Dataset carrier off

     31           .TICTI                   Typein

     32           .TICTO                   Typeout

     33           .TITCE                   Two-character escape sequence

     34-35                                 Reserved
   ______________________________________________________________________


   To cause terminal interrupts to be generated, the user's program  must
   assign the desired terminal code to one of the assignable channels.


                                    4-13
                    USING THE SOFTWARE INTERRUPT SYSTEM


   The ATI% monitor call is used to assign this code.  This call  accepts
   one  word of arguments:  the terminal code in the left half of AC1 and
   the channel number in the right half.

        MOVE 1,[.TICCE,,INTCH1]  ;assign CTRL/E to channel INTCH1
        ATI%

   Control always returns to the instruction following the ATI% call.  If
   the  current  job  is not attached to a terminal (there is no terminal
   controlling the job), the terminal code  assignments  are  remembered;
   they will be in effect when a terminal is attached.

   The monitor handles the receipt of a terminal interrupt  character  in
   either  immediate  mode  or  deferred  mode.   In  immediate mode, the
   terminal character causes the system to initiate an interrupt as  soon
   as  the  user  types  the  character  (that  is, as soon as the system
   receives it).  In deferred mode, the terminal character is  placed  in
   either  immediate  mode  or  deferred  mode.   In  immediate mode, the
   terminal character causes the system to initiate an interrupt as  soon
   as  the  user types the character (as soon as the system receives it).
   In deferred mode, the terminal character is placed in the input stream
   in sequence with other characters of the input, unless two of the same
   character are typed in succession.  In this case, an interrupt  occurs
   at the time the second one is typed.  If only one character enabled in
   deferred mode is typed, the system initiates an  interrupt  only  when
   the  program  attempts  to  read  the character.  Deferred mode allows
   interrupt actions to occur in sequence with other actions specified in
   the  input  (for  example, when characters are typed ahead of the time
   that the  program  actually  requests  them).   In  either  mode,  the
   character  is  not  passed to the program as data.  The system assumes
   that interrupts are to be handled immediately  unless  a  program  has
   issued  the  STIW% (Set Terminal Interrupt Word) monitor call.  (Refer
   to TOPS-20 Monitor Calls Reference Manual for a  description  of  this
   call.)



   4.10  ADDITIONAL SOFTWARE INTERRUPT MONITOR CALLS

   Additional monitor calls are available that allow the  user's  program
   to  check and to clear various parts of the software interrupt system.
   Also, there is a call useful for interprocess communication (refer  to
   the IIC% call in Section 5.10).



   4.10.1  Testing for Enablement

   The SKPIR% monitor call tests the software interrupt system to see  if
   it is enabled.  The call accepts in AC1 the identifier of the process.
   After execution of the call, control returns to the  next  instruction
   if  the  system is off, and to the second instruction if the system is
   on.

                                    4-14
                    USING THE SOFTWARE INTERRUPT SYSTEM


        MOVEI 1,.FHSLF           ;identifier of current process
        SKPIR%                   ;test interrupt system
         return                  ;system is off
        return                   ;system is on



   4.10.2  Obtaining Interrupt Table Addresses

   The RIR% and XRIR% monitor calls obtain the channel and priority level
   table  addresses  for  a process.  These calls are useful when several
   routines in one process want to share the interrupt tables.



   4.10.2.1  The RIR% Monitor Call - The RIR% monitor call can be used in
   any  section  of  memory,  but  is  only  useful  for  obtaining table
   addresses if those tables are in the same section  of  memory  as  the
   code  that  makes  the  call.   Furthermore,  it can only obtain table
   addresses that have been set by the SIR call.

   The call accepts the identifier of the process in AC1.  It returns the
   table   addresses   in  AC2.   The  left  half  of  AC2  contains  the
   section-relative address of the priority level table,  and  the  right
   half  contains  the section-relative address of the channel table.  If
   the process has not set the table  addresses  with  the  SIR%  monitor
   call, AC2 contains zero.

   Control always returns to the instruction following the RIR% call.

   The following example shows the use of the RIR% call.

        MOVEI 1,.FHSLF           ;identifier of current process
        RIR%                     ;return the table addresses




   4.10.2.2  The XRIR% Monitor Call - This call obtains the addresses  of
   the  interrupt tables defined for a process.  The tables can be in any
   section of memory.  The code that makes the call can also  be  in  any
   section.   This  call  can only obtain addresses that have been set by
   the XSIR% call.

   The call accepts the identifier of the process in AC1, and the address
   of the argument block in AC2.  The argument block is three words long,
   word zero must contain the number 3.  The call returns  the  addresses
   into words one and two.  The block has the following format:






                                    4-15
                    USING THE SOFTWARE INTERRUPT SYSTEM


           !=======================================================!
           !   Length of the argument block, including this word   !
           !-------------------------------------------------------!
           !          Address of the interrupt level table         !
           !-------------------------------------------------------!
           !             Address of the channel table              !
           !=======================================================!


   Control always returns to the instruction following  the  XRIR%  call.
   If  the process has not set the table addresses with the XSIR% monitor
   call, words one and two of the argument block contain zero.



   4.10.3  Disabling the Interrupt System

   The DIR% monitor call disables the software interrupt system  for  the
   process.  It accepts the identifier of the process in AC1.

        MOVEI 1,.FHSLF           ;identifier of current process
        DIR%                     ;disable system

   Control always returns to the instruction following the DIR% call.

   If interrupts occur while the interrupt system is disabled,  they  are
   remembered   until  the  system  is  reenabled.   At  that  time,  the
   interrupts take effect unless an intervening CIS% monitor call  (refer
   to Section 4.10.6) has been issued.

   Software interrupts assigned to  panic  channels  are  not  completely
   disabled  by  the  DIR% call.  These interrupts terminate the process,
   and the superior process is notified if it has enabled channel .ICIFT.
   In addition, if the terminal code for CTRL/C (.TICCC) is assigned to a
   channel, it causes an interrupt that cannot be disabled  by  the  DIR%
   call.   However,  the CTRL/C interrupt can be disabled by deactivating
   the channel assigned to the CTRL/C terminal code.



   4.10.4  Deactivating a Channel

   The DIC% monitor call is used to deactivate interrupt  channels.   The
   call  accepts  two words of arguments:  the process identifier in AC1,
   and the channels to be deactivated in  AC2.   Setting  bit  n  in  AC2
   indicates that channel n is to be deactivated.

        MOVEI 1,.FHSLF                     ;identifier of current process
        MOVE 2,[1B<.ICAOV>+1B<.ICPOV>]     ;deactivate channels 6 and 9
        DIC%

   Control always returns to the instruction following the DIC% call.


                                    4-16
                    USING THE SOFTWARE INTERRUPT SYSTEM


   When a channel is deactivated, interrupt requests for that channel are
   ignored  except  for  interrupts generated on panic channels (refer to
   Section 4.6).



   4.10.5  Deassigning Terminal Codes

   The DTI% monitor call deassigns a terminal code.   This  call  accepts
   one argument word:  the terminal code in AC1.

        MOVEI 1,.TICCE           ;deassign CTRL/E
        DTI%

   Control always returns to the instruction  following  the  DTI%  call.
   This  monitor  call  is ignored if the specified terminal code has not
   been defined by the current job.



   4.10.6  Clearing the Interrupt System

   The CIS% monitor call clears the  interrupt  system  for  the  current
   process.   This  call  clears  interrupts  in progress and all waiting
   interrupts.  This call  requires  no  arguments,  and  control  always
   returns to the instruction following the CIS call.  The RESET% monitor
   call (refer to Section 2.6.1) performs these same actions as  part  of
   its initializing procedures.



   4.11  SUMMARY

   To use the software interrupt system, the user's program must:

        1.  Supply routines that will process the interrupts.

        2.  Set up a  channel  table  containing  the  addresses  of  the
            routines  (refer to Section 4.4.2) and a priority level table
            containing the addresses for storing the program counter (PC)
            values (refer to Section 4.4.3).

        3.  Specify the addresses of the tables with  the  XSIR%  monitor
            call (refer to Section 4.4.3).

        4.  Enable the software interrupt system with  the  EIR%  monitor
            call (refer to Section 4.5).

        5.  Activate the desired channels  with  the  AIC%  monitor  call
            (refer to Section 4.6).




                                    4-17
                    USING THE SOFTWARE INTERRUPT SYSTEM


   4.12  SOFTWARE INTERRUPT EXAMPLE

   This program copies one file to another.  It  accepts  the  input  and
   output  filenames  from  the  user.   The end of file is detected by a
   software interrupt, and CTRL/E is enabled as an escape character.

           TITLE SOFTWARE INTERRUPT EXAMPLE
           SEARCH MONSYM
           SEARCH MACSYM
           .REQUIRE SYS:MACREL

           STDAC.                  ;DEFINE STANDARD ACs
           INTCH1=1

   START:  RESET%                  ;RELEASE FILES, ETC.
           XHLLI T1,EOFINT         ;GET CURRENT PROCESS SECTION NUMBER
           HLLZS T1                ;ISOLATE SECTION NUMBER ONLY
           IORM T1,CHNTAB+INTCH1   ; AND ADD IT TO SERVICE ROUTINE 
           IORM T1,CHNTAB+.ICEOF   ;ADDRESSES FOR OUR ROUTINES
           IORM T1,LEVTAB+1        ; AND LEVTAB
           MOVEI T1,.FHSLF         ;CURRENT PROCESS
           MOVEI T2,3              ;NUMBER OF WORDS IN ARG BLOCK
           MOVEM T2,ARGBLK         ;PUT NUMBER IN WORD ZERO
           XMOVEI T2,LEVTAB        ;GLOBAL ADDRESS OF LEVEL TABLE
           MOVEM T2,ARGBLK+1       ;MOVE IT TO ARGBLK WORD ONE
           XMOVEI T2,CHNTAB        ;GLOBAL ADDRESS OF CHANNEL TABLE
           MOVEM T2, ARGBLK+2      ;MOVE IT TO ARGBLK WORD TWO
           XMOVEI T2,ARGBLK        ;GLOBAL ADDRESS OF ARGUMENT BLOCK
           XSIR%
           EIR%                    ;ENABLE SYSTEM
           MOVE T2,[1B<INTCH1>+1B<.ICEOF>] ;ACTIVATE CHANNELS
           AIC%
           MOVE T1,[.TICCE,,INTCH1] ;ASSIGN CTRL/E TO CHANNEL 1
           ATI%
   GETIF:  TMSG <INPUT FILE: >
           MOVX T1,GJ%OLD+GJ%MSG+GJ%CFM+GJ%FNS+GJ%SHT
           MOVE T2,[.PRIIN,,.PRIOU]
           GTJFN%                  ;GET FILENAME FROM USER
            ERJMP ERROR1
           MOVEM T1,INJFN
   GETOF:  TMSG <OUTPUT FILE: >
           MOVX T1,GJ%FOU+GJ%MSG+GJ%CFM+GJ%FNS+GJ%SHT
           MOVE T2,[.PRIIN,,.PRIOU]
           GTJFN%                  ;GET FILENAME FROM USER
            ERJMP ERROR2
           MOVEM T1,OUTJFN








                                    4-18
                    USING THE SOFTWARE INTERRUPT SYSTEM


   OPNIF:  MOVE T1,INJFN
           MOVX T2,FLD(7,OF%BSZ)+OF%RD
           OPENF%                  ;OPEN INPUT FILE
            ERJMP ERROR3
   OPNOF:  MOVE T1,OUTJFN
           MOVX T2,FLD(7,OF%BSZ)+OF%WR
           OPENF%                  ;OPEN OUTPUT FILE
            ERJMP ERROR3
   CPYBYT: MOVE T1,INJFN
           BIN%                    ;READ INPUT BYTE
           MOVE T1,OUTJFN
           BOUT%                   ;WRITE OUTPUT BYTE
           JRST CPYBYT             ;LOOP UNTIL EOF
   DONE:   MOVE T1,INJFN
           CLOSF%                  ;CLOSE INPUT FILE
            JFCL
           MOVE T1,OUTJFN
           CLOSF%                  ;CLOSE OUTPUT FILE
            JFCL
           HALTF%
   ;ROUTINE TO HANDLE ^E - ABORTS OPERATION

   CTRLE:  MOVEI T1,.PRIOU
           CFOBF%                  ;CLEAR OUTPUT BUFFER
           TMSG <ABORTED.>         ;INFORM USER
           CIS%                    ;CLEAR SYSTEM
           JRST START

   ;ROUTINE TO HANDLE EOF - COMPLETES OPERATION NORMALLY

   EOFINT: MOVEM T1,INTAC1         ;SAVE ACs
           XMOVEI T1,DONE          ;CHANGE PC
           MOVEM T1,PC2+1          ;TO DONE
           MOVE T1,INTAC1          ;RESTORE ACs
           DEBRK%                  ;DISMISS INTERRUPT

   ;LEVEL TABLE
   LEVTAB: 0
           PC2
           0
   PC2:    BLOCK 2













                                    4-19
                    USING THE SOFTWARE INTERRUPT SYSTEM


   ;CHANNEL TABLE
   CHNTAB: 0
           FLD(2,SI%LEV)!FLD(CTRLE,SI%ADR)
           REPEAT ^D8,<0>
           FLD(2,SI%LEV)!FLD(EOFINT,SI%ADR)
           REPEAT ^D25,<0>
   ARGBLK: BLOCK 3
   INJFN:  BLOCK 1
   OUTJFN: BLOCK 1
   INTAC1: BLOCK 1
   ERROR1: TMSG <
   ?INVALID FILE SPECIFICATION>
           HALTF%
   ERROR2: TMSG <
   ?INVALID FILE SPECIFICATION>
           HALTF%
   ERROR3: TMSG <
   ?CANNOT OPEN FILE>
           HALTF%
           LIT
           END START

































                                    4-20











                                 CHAPTER 5

                             PROCESS STRUCTURE



   As stated in Chapter 1, the TOPS-20 operating system allows  each  job
   to  have multiple processes that can run simultaneously.  Each process
   has its own environment called its address space.  Associated with the
   environment  is  the  program  counter  (PC)  of  the  process  and  a
   well-defined  relationship  with  other  processes  in  the  job.   In
   TOPS-20, the term fork is synonymous with the term process.

   The TOPS-20 operating system schedules the running of  processes,  not
   entire  jobs.   A  process  can  be  scheduled  independent  of  other
   processes because it has a definite existence:  its beginning  is  the
   time  at  which  it is created, and its end is the time at which it is
   killed.  At any point in its existence, a process can be described  by
   its  state, which is represented by a status word and a PC word (refer
   to Section 5.9).

   The relationships among processes in a job are shown  in  the  diagram
   below.   Each  process  has one immediate superior process (except for
   the top-level process) and can have one or  more  inferior  processes.
   Two  processes  are parallel if they have the same immediate superior.
   A process can create  an  inferior  process  but  not  a  parallel  or
   superior process.


                               --------------
                               |  Top-Level |
                               |   Process  |
                               --------------
                                      |
                ----------------------|--------------------
                |                     |                   |
           -------------         -------------       -------------
           | Process 1 |         | Process 2 |       | Process 3 |
           -------------         -------------       -------------
                |                                         |
           -------------                            -------------
           | Process 4 |                            | Process 5 |
           -------------                            -------------


                                    5-1
                             PROCESS STRUCTURE


   Process 1 is the superior process of process 4, and process 3  is  the
   superior  of  process  5.   Processes  4  and  5  are the inferiors of
   processes 1 and 3, respectively.  Process 2 has no  inferior  process.
   Processes  1, 2 and 3 are parallel because they have the same superior
   process (the top-level process).  Processes 4 and 5, although  at  the
   same depth in the structure, are not parallel because they do not have
   the same superior process.  Process 1 created process 4 but could  not
   have created any other process shown in the structure above.



   5.1  USES FOR MULTIPLE PROCESSES

   A multiple-process job structure allows:

        1.  One job to have more than one program runnable  at  the  same
            time.   These  programs can be independent programs, each one
            compiled, debugged, and loaded separately.  Each program  can
            then be placed in a separate process.  These processes can be
            parallel to each other, but are inferior to the main  process
            that created them.  This use allows parallel execution of the
            individual programs.

        2.  One process to wait for an event to occur (for  example,  the
            completion   of  an  I/O  operation)  while  another  process
            continues its computations.  Communication  between  the  two
            processes  is  such  that  when the event occurs, the process
            that is computing can be notified via the software  interrupt
            system.   This  use  allows  two  processes  within  a job to
            overlap I/O with computations.

   One application of a multiple-process job structure is  the  following
   situation:  a superior process is responsible for accepting input from
   various terminals.  After receiving this input, the process  sends  it
   to  various  inferior processes as data.  These inferior processes can
   then initiate other processes, for example, to write  reports  on  the
   data that was received.

















                                    5-2
                             PROCESS STRUCTURE


                         ------------------
          ---------      |                |     ---------
          |       |      | Process that   |     |       |
          |  TTY  |------| Accepts input  |-----|  TTY  |
          |       |      | from Terminals |     |       |
          ---------      |                |     ---------
                         ------------------
                                  |
                     -------------|-------------
                     |            |            |
                     |            |            |
                  -------      -------      -------
                  |     |      |     |      |     | Processes that
                  |     |      |     |      |     | Receive the
                  |     |      |     |      |     | input as Data
                  -------      -------      -------
                     |            |            |
                     |            |            |
                  -------      -------      -------
                  |     |      |     |      |     | Processes that
                  |     |      |     |      |     | Write Reports
                  |     |      |     |      |     | on the Data
                  -------      -------      -------


   Another application is  that  used  for  the  user  interface  on  the
   DECSYSTEM-20.   On  the DECSYSTEM-20, the top-level process in the job
   structure is the Command Language.  This process services the user  at
   the  terminal  by  accepting input.  When the user runs a program (for
   example, MACRO, FORTRAN), the  Command  Language  process  creates  an
   inferior process, places the requested program in it, and executes it.
   The Command Language can then wait for an event to occur, either  from
   the  program  or  from the user.  An event from the program can be its
   completion, and an event from the user can be the typing of a  certain
   terminal key (CTRL/C, for example).



   5.2  PROCESS COMMUNICATION

   A process can communicate with  or  control  other  processes  in  the
   system in several ways:

         o  direct process control

         o  software interrupts

         o  IPCF and ENQ/DEQ facilities

         o  memory sharing




                                    5-3
                             PROCESS STRUCTURE


   5.2.1  Direct Process Control

   A process can create and control other processes inferior to it within
   the  job  structure.   The  superior  process  can  cause the inferior
   process to begin execution  and  then  to  suspend  and  later  resume
   execution.   After  the  inferior process has completed its tasks, the
   superior process can delete the inferior from the job structure.

   Some of the  monitor  calls  used  for  direct  process  control  are:
   CFORK%,  to  create  a process; SFORK%, to start a process; WFORK%, to
   wait for a process to terminate; RFSTS%, to obtain  the  status  of  a
   process;  and  KFORK%,  to  delete  a  process.   Refer to the TOPS-20
   Monitor Calls Reference Manual for descriptions of additional  monitor
   calls dealing with process control.



   5.2.2  Software Interrupts

   The  software  interrupt  facility  enables  a  process   to   receive
   asynchronous signals from other processes, the system, or the terminal
   user or to receive signals as a result  of  its  own  execution.   For
   example, a superior process can enable the interrupt system so that it
   receives an interrupt  when  one  of  its  inferiors  terminates.   In
   addition,  processes  within  a  job structure can explicitly generate
   interrupts to each other for communication purposes.

   Some of the monitor calls  used  when  communication  occurs  via  the
   software interrupt system are:  SIR%, to specify the interrupt tables;
   EIR%, to enable the interrupt system; AIC%, to activate the  interrupt
   channels;  and  IIC%, to initiate an interrupt on a channel.  Refer to
   Chapter 4 and Section 5.10 for more information.



   5.2.3  IPCF and ENQ/DEQ Facilities

   The Inter-Process Communication Facility (IPCF) enables processes  and
   jobs  to  communicate by sending and receiving informational messages.
   The MSEND% call is used to send a message, the MRECV% call is used  to
   receive  a  message,  and  the  MUTIL% call is used to perform utility
   functions.  Refer to Chapter 7 for descriptions of these calls.

   The ENQ/DEQ facility allows cooperating processes to  share  resources
   and facilitates dynamic resource allocation.  The ENQ% call is used to
   obtain a resource, the DEQ% call is used to release  a  resource,  and
   the  ENQC%  call  is used to obtain status about a resource.  Refer to
   Chapter 6 for descriptions of these calls.






                                    5-4
                             PROCESS STRUCTURE


   5.2.4  Memory Sharing

   Each page or section in a process' address space is either private  to
   the  process  or  shared with other processes.  Pages are shared among
   processes when the same page is represented in more than one  process'
   address space.  This means that two or more processes can identify and
   use the same page of physical storage.  Even  when  several  processes
   have  identified  the  same  page,  each  process can have a different
   access to that page, such as access to read or write that page.

   A type of page access that facilitates sharing  is  the  copy-on-write
   access.   A  page  with  this  access  remains  shared  as long as all
   processes read the page.  As soon as a process writes to the page, the
   system  makes  a  private  copy  of the page for the process doing the
   writing.  Other processes continue to read and  execute  the  original
   page.   This  access  provides  the  capability  of sharing as much as
   possible but still allows the  process  to  change  its  data  without
   changing  the  data  of  other  processes.   A  monitor call used when
   sharing memory is PMAP%.  Refer to Section 5.6.2 for more information.



   5.3  PROCESS IDENTIFIERS

   In order for processes to communicate with each other, a process  must
   have  an identifier, or handle, for referencing another process.  When
   a process creates an inferior process, it is given a  handle  on  that
   inferior.   This  handle is a number in the range 400001 to 400777 and
   is meaningful only to the process to which it is given  (that  is,  to
   the  superior  process).  For example, if process A creates process B,
   process A is given a  handle  (for  example,  400003)  on  process  B.
   Process  A  then specifies this handle when it uses monitor calls that
   refer to process B.  However, process B is not known by this handle to
   any  other  process  in  the  structure, including itself.  The handle
   400003 may in fact be known to process B,  but  it  would  describe  a
   process  inferior  to process B.  For this reason, process handles are
   sometimes called "relative fork handles" because they are relative  to
   the process that created them.

   There are several standard process handles that are never assigned  by
   the system but have a specific meaning when used by any process in the
   structure.  These handles are used when a process needs to communicate
   with  a  process  other  than  its immediate inferior or with multiple
   processes at once.  These handles are described in Table 5-1.










                                    5-5
                             PROCESS STRUCTURE


   Table 5-1:  Process Handles

   ______________________________________________________________________

     Number       Symbol         Meaning
   ______________________________________________________________________

     400000       .FHSLF         The current process (or self).

     400000+n                    Process n,  relative  to  the  current
                                 process.

     200000       FH%EPN         Extended page number  (see  PM%EPN  in
                                 PMAP%).  When used in conjunction with
                                 the  above   two   forms,   this   bit
                                 indicates  that  addresses and/or page
                                 numbers are interpreted  as  absolute,
                                 not  relative to the PC section of the
                                 program executing the JSYS.  This  bit
                                 has  no  meaning  for programs that do
                                 not use extended addressing.

       -1         .FHSUP         The immediate superior of the  current
                                 process.

       -2         .FHTOP         The  top-level  process  in  the   job
                                 structure.

       -3         .FHSAI         The current process  and  all  of  its
                                 inferiors.

       -4         .FHINF         All of the inferiors  of  the  current
                                 process.

       -5         .FHJOB         All processes in the job structure.
   ______________________________________________________________________


   Consider the job structure below.















                                    5-6
                             PROCESS STRUCTURE


                                   -------
                                   |  A  |
                                   -------
                                      |
                       ---------------|---------------
                       |              |              |
                    -------        -------        -------
                    |  B  |        |  C  |        |  D  |
                    -------        -------        -------
                                                     |
                                             --------|-------
                                             |              |
                                          -------        -------
                                          |  E  |        |  F  |
                                          -------        -------
                                             | 
                                      -------|--------
                                      |              |
                                   -------        -------
                                   |  G  |        |  H  |
                                   -------        -------


   The following  indicates  the  specific  process  or  processes  being
   referenced if process E gives the handle:

        .FHSLF    refers to process E
        .FHSUP    refers to process D
        .FHTOP    refers to process A
        .FHSAI    refers to processes E, G, and H
        .FHINF    refers to processes G and H
        .FHJOB    refers to processes A through H

   The process must  have  the  appropriate  capability  enabled  in  its
   capability  word  to use the handles .FHSUP, .FHTOP, and .FHJOB (refer
   to Section 5.5.1).

   Process E can reference one of its inferiors (for example, G) with the
   handle  it  was  given  when  it  created the inferior.  Process E can
   reference other  processes  in  the  structure  (for  example,  F)  by
   executing  the  GFRKS%  monitor call to obtain a handle on the desired
   process.  Refer to the TOPS-20 Monitor Calls Reference  Manual  for  a
   description of the GFRKS% call.



   5.4  OVERVIEW OF MONITOR CALLS FOR PROCESSES

   Monitor calls  exist  for  creating,  loading,  starting,  suspending,
   resuming,  interrupting,  and  deleting  processes.  When a process is
   created, its address space is assigned, and the process  is  added  to
   the  job  structure  of  the  creating  process.   The contents of its


                                    5-7
                             PROCESS STRUCTURE


   address space can be specified at the time the process is  created  or
   at  a  later  time.  The process can also be started at the time it is
   created.   A  process  remains  potentially  runnable  until   it   is
   explicitly deleted or its superior is deleted.

   A process may be suspended if one of the following conditions occurs:

        1.  The process executes an instruction that  causes  a  software
            interrupt  to  occur,  and  it is not prepared to process the
            interrupt.

        2.  The process executes the HALTF% monitor call.

        3.  The superior process requests suspension of its inferior.

        4.  The  superior  process  is  suspended.   When  a  process  is
            suspended, all of its inferior processes are also suspended.

        5.  A monitor call is trapped.  (Refer to TFORK% monitor call  in
            the TOPS-20 Monitor Calls Reference Manual).



   5.5  CREATING A PROCESS

   A process creates an inferior process by executing the CFORK%  (Create
   Process) monitor call.  This monitor call allows the caller to specify
   the address space, capabilities, initial contents of the ACs,  and  PC
   for the inferior process and to start the execution of the inferior.

   The CFORK% call accepts two words of arguments in AC1 and AC2.

        AC1:   characteristics for the inferior in the left half, and  PC
               address for the inferior in the right half.

        AC2:   address of a 20  (octal)  word  block  containing  the  AC
               values for the inferior.

   The characteristics for the inferior process are  described  in  Table
   5-2.














                                    5-8
                             PROCESS STRUCTURE


   Table 5-2:  Inferior Process Characteristic Bits

   ______________________________________________________________________

     Bit       Symbol       Meaning
   ______________________________________________________________________

      0        CR%MAP       Set the map of the inferior process to  the
                            same  as the map of the superior (creating)
                            process.  This means that the superior  and
                            the  inferior  will  share the same address
                            space.  Changes made by one process will be
                            seen by the other process.

                            If this bit is not  on  in  the  call,  the
                            inferior's  map will contain all zeros.  If
                            desired, the creating process can then  use
                            PMAP  or GET to add pages to the inferior's
                            map.

      1        CR%CAP       Set the capability  word  of  the  inferior
                            process  to the same as the capability word
                            of the superior process.  (Refer to Section
                            5.5.1 for the description of the capability
                            word.)

                            If this bit is not  on  in  the  call,  the
                            inferior will have no special capabilities.

      2                     Reserved for Digital (must be 0).

      3        CR%ACS       Set the ACs of the inferior process to  the
                            values  beginning  at  the address given in
                            AC2.

                            If this bit is not  on  in  the  call,  the
                            inferior's ACs will be set to zero, and the
                            contents of AC2 is ignored.

      4        CR%ST        Set the PC for the inferior process to  the
                            address  given in the right half of AC1 and
                            start execution of the inferior.

                            If this bit is not  on  in  the  call,  the
                            right  half  of  AC1  is  ignored,  and the
                            inferior is not started.  If  desired,  the
                            creating  process  can  then  use SFORK% or
                            XSFRK% to start the newly created process.

      18-35    CR%PCV       PC value for inferior process if  CR%ST  is
                            on.
   ______________________________________________________________________


                                    5-9
                             PROCESS STRUCTURE


   If execution of the  CFORK%  call  is  not  successful,  the  inferior
   process  is not created and an error code is returned, as described in
   Section 1.2.2.

   If execution of the CFORK% call is successful, the inferior process is
   created  and  its process handle is returned in the right half of AC1.
   This handle is then used by the superior  process  when  communicating
   with  its  inferior  process.   The  execution  of  the program in the
   superior process continues at the  second  instruction  following  the
   CFORK%  call.  The inferior begins execution at the location contained
   in bits 18-35 (CR%PCV) if CR%ST is specified.

   Assume that process A executes the CFORK% monitor call twice to create
   two  parallel  inferior  processes.   This  is represented pictorially
   below.


                       -------------------------
                       | Process A             |
                       | Creates Process B     |
                       | by Executing a CFORK  |
                       -------------------------
                                   |
                                   |
                       -------------------------
                       | Process B is Created  |
                       | and Its Handle is     |
                       |                       |
                       -------------------------
       
   --  --  --  --  --  --  --  --  --  --  --  --  --  --  --  --  --  --
       
                       -------------------------
                       | Process A Executes    |
                       | Another CFORK to      |
                       | Create Process C      |
                       -------------------------
                                   |
              ---------------------|---------------------
              |                                         |
   -------------------------                ------------------------
   |                       |                | Process C is Created |
   |      Process B        |                | and Its Handle       |
   |                       |                | Given to Process A   |
   -------------------------                ------------------------


   Note that process A has been given two handles, one for process B  and
   one  for process C.  Process A can refer to either of its inferiors by
   giving the appropriate handle or to both of its inferiors by giving  a
   handle of -4 (.FHINF).



                                    5-10
                             PROCESS STRUCTURE


   5.5.1  Process Capabilities

   When a new process is created, it is given the  same  capabilities  as
   its  superior,  or  it  is  given  no  special  capabilities.  This is
   indicated by the setting of the CR%CAP bit in the  CFORK%  call.   The
   capabilities for a process are indicated by two capability words.  The
   first word indicates if the capability is available  to  the  process,
   and  the  second  word  indicates if the capability is enabled for the
   process.  This second word is the one being set by the CR%CAP  bit  in
   the CFORK% call.

   Types of capabilities represented in the  capability  words  are  job,
   process,  and  user  capabilities.   Each  capability corresponds to a
   particular bit in the capability words and thus can be  activated  and
   protected  independently  of  the  other  capabilities.   Refer to the
   TOPS-20 Monitor Calls Reference Manual for  more  information  on  the
   capability words.



   5.6  SPECIFYING THE CONTENTS OF THE ADDRESS SPACE OF A PROCESS

   Once a process is created, the contents of its address  space  can  be
   specified.   This  can  be  accomplished  in  one  of  three ways.  As
   mentioned in Section 5.5, bit CR%MAP can be set in the CFORK% call  to
   indicate  that the address space of the  inferior process is to be the
   same as the address space of the creating process.  In  addition,  the
   creating  process  can  execute the GET% monitor call to map specified
   pages from a file into the address  space  of  the  inferior  process.
   Finally,  the  creating  process can execute the PMAP% monitor call to
   map specified pages from another process into the address space of the
   inferior process.

   If  the  creating  process  does  not  specify  the  contents  of  the
   inferior's address space, the address space will be filled with zeros.



   5.6.1  GET% Monitor Call

   The GET% monitor call gets a save file, copying or mapping it into the
   process  as  appropriate.   It updates the monitor's data base for the
   process by copying the entry vector  and  the  list  of  program  data
   vector addresses (PDVAs) from the save file.  (See the .POADD function
   of the PDVOP% monitor call.)

   This call can be executed for  either  sharable  or  nonsharable  save
   files  that  were  created  with  the  SSAVE%  or  SAVE% monitor call,
   respectively.  The file must not be open by any process in the  user's
   job.   (Refer  to  the TOPS-20 Monitor Calls Reference Manual for more
   information regarding the PDVOP%, SSAVE%, and SAVE% monitor calls.)



                                    5-11
                             PROCESS STRUCTURE


   The GET% monitor call accepts two words of arguments in AC1  and  AC2.
   The first word specifies the handle of the desired process, flag bits,
   and the JFN of the desired file.  The second word specifies where  the
   pages  from  the  file  are  to  be placed in the address space of the
   process.  Thus,

        AC1:   process handle,,flag bits and a JFN

        AC2:   lowest process page  number  in  left  half,  and  highest
               process  page  number  in right half; or the address of an
               argument block.  If this AC contains page  numbers,  those
               page  numbers  control the parts of memory that are loaded
               when GT%ADR is on in AC1.

   Table 5-3 describes the bits that can be set in AC1.


   Table 5-3:  GET% Flag Bits

   ______________________________________________________________________

     Bit       Symbol       Meaning
   ______________________________________________________________________

      19       GT%ADR       Use the memory address limits given in AC2.
                            If  this  bit is off, all existing pages of
                            the file (according to its  directory)  are
                            mapped.

      20       GT%PRL       Preload the pages being  mapped  (move  the
                            pages immediately.) If this bit is off, the
                            pages are read in from the disk  when  they
                            are referenced.

      21       GT%NOV       Do not overlay existing pages and do return
                            an  error.   If  this  bit is off, existing
                            pages will be overlaid.

      22       GT%ARG       If this bit is on, AC2 contains the address
                            of an argument block.

      24-25    GT%JFN       JFN of the save file.
   ______________________________________________________________________


   The format of the argument block is described in Table 5-4.








                                    5-12
                             PROCESS STRUCTURE


   Table 5-4:  GET% Argument Block

   ______________________________________________________________________

     Word      Symbol       Meaning
   ______________________________________________________________________

      0        .GFLAG       Flags that indicate how  the  rest  of  the
                            argument block is to be used.

      1        .GLOW        Number of the lowest page  in  the  process
                            into  which  a file page gets loaded.  This
                            page must be within the  section  specified
                            by .GBASE.

      2        .GHIGH       Number of the highest page in  the  process
                            into  which  a file page gets loaded.  This
                            page must be within the  section  specified
                            by .GBASE.

      3        .GBASE       Number of the section into which  the  file
                            pages  are  loaded.   You  can  specify the
                            section for single-section save files only;
                            use  of  this  word with a multiple-section
                            save file causes an error.  The file  pages
                            are  loaded  into  this  section  of memory
                            regardless of the section specified in  the
                            save file.
   ______________________________________________________________________


   Table 5-5 describes the flag bits defined for use in .GFLAG.


   Table 5-5:  GET% Argument Block Flags

   ______________________________________________________________________

     Bit       Symbol       Meaning
   ______________________________________________________________________

      0        GT%LOW       .GLOW contains the  number  of  the  lowest
                            page within the process to use.

      1        GT%HGH       .GHIGH contains the number of  the  highest
                            page within the process to use.

      2        GT%BAS       .GBASE contains the number of  the  section
                            to use.
   ______________________________________________________________________




                                    5-13
                             PROCESS STRUCTURE


   When the pages of the file are mapped  into  pages  in  the  process's
   address  space,  the  previous  contents  of  the  process  pages  are
   overwritten.  Any full pages in the process that are  not  overwritten
   are  unchanged.   Any  portions of process pages for which there is no
   data in the file are filled with zeros.

   For example, a GET% call executed for a file that contains 2 1/2 pages
   sets up the process' address space as shown in the following diagram.


                  Process                       File
                 ------------  - - - - - - - - ---------
          Page 1 | Data     |   /              | Data  |  Page 1
                 |          |   |              |       |
                 |          |   |              |       |
                 |          |   /  GET         |       |
                 |----------|   \  Call        |-------|
          Page 2 | Data     |   |              | Data  |  Page 2
                 |          |   |              |       |
                 |----------|   |              |-------|
          Page 3 | Data     |   \              | Data  |  Page 3
                 |----------|  - - - - - - - - |-------|
                 |          |                  | EOF   |
                 |          |                  |       |
                 | 0        |                  |       |
                 |----------|                  ---------
                 |          |
        Page 4 - |Unchanged |
        Page 512 |          |
                 ------------


   After execution of the  GET%  call,  control  returns  to  the  user's
   program  at the instruction following the call.  If an error occurs, a
   software interrupt is generated, which the program can process via the
   software interrupt system.



   5.6.2  PMAP% Monitor Call

   The PMAP% monitor call is used to map pages from one  process  to  the
   address  space of a second process.  Data is not actually transferred;
   only the contents of the page map of the second (that is, destination)
   process are changed.

   The PMAP% monitor call accepts three words of arguments in AC1 through
   AC3.   The first word contains the handle and page number of the first
   page to be mapped in the source process (that is,  the  process  whose
   pages are being mapped).  The second word contains the handle and page
   number of the first page to be mapped in the destination process (that
   is, the process into which the pages are being mapped).  The third


                                    5-14
                             PROCESS STRUCTURE


   word contains a  count  of  the  number  of  pages  to  map  and  bits
   indicating  the  access  that the destination process will have to the
   pages mapped.  Thus,

        AC1:  source process handle in the left half, and page number  in
              the process in the right half.

        AC2:  destination process handle  in  the  left  half,  and  page
              number in the process in the right half.

        AC3:  count of number of pages to map and the access bits.

   The count and access bits that can be specified in AC3  are  described
   in Section 3.5.6.1.

   Upon  successful  execution  of  the  PMAP%  call,  addresses  in  the
   destination process actually refer to addresses in the source process.
   The contents of the destination page previous to the execution of  the
   call  have  been  deleted.   The access requested in the PMAP% call is
   granted if it does  not  conflict  with  the  current  access  of  the
   destination  page  (that is, an AND operation is performed between the
   specified access and the current  access).   Control  returns  to  the
   user's  program  at  the  instruction following the PMAP% call.  If an
   error occurs, an illegal instruction  trap  is  generated,  which  the
   program can process via the software interrupt system or with an ERJMP
   or ERCAL instruction.



   5.7  STARTING AN INFERIOR PROCESS

   A program in an inferior process can be started in one  of  two  ways.
   As  mentioned  in Section 5.5, the superior process can specify in the
   CFORK% call the PC for the inferior process and start  its  execution.
   Alternatively,  the  superior process, after executing the CFORK% call
   to create an inferior process, can execute the SFORK% (Start  Process)
   monitor call to start it.

   The SFORK% monitor call accepts two words of arguments in AC1 and AC2.

        AC1:  flags,,process handle

              Flags:

                 SF%CON(1B0)   Used  to  continue  a  process  that   has
                               previously  halted.  If SF%CON is set, the
                               address in AC2 is ignored, and the process
                               continues from where it was halted.

        AC2:  the PC of the process being started.  The PC contains flags
              in  the  left  half and the process starting address in the
              right half.  This call obtains the section number of the PC
              from the entry vector of the process.

                                    5-15
                             PROCESS STRUCTURE


   There are two  alternative  ways  to  start  processes:   XSFRK%  (see
   Section  8.3.2)  or  SFRKV%  (see  the TOPS-20 Monitor Calls Reference
   Manual).

   The process handle given in AC1 cannot refer to a superior process, to
   more  than one process (for example, .FHINF), or to a process that has
   already been started.

   After execution of the SFORK% call,  control  returns  to  the  user's
   program  at the instruction following the call.  If an error occurs, a
   software interrupt is generated, which the program can process via the
   software interrupt system.



   5.8  INFERIOR PROCESS TERMINATION

   The superior process has one of two ways in which it can  be  notified
   when  one  or  more  of  its  inferiors  terminate execution:  via the
   software interrupt system or by executing the WFORK% monitor call.  An
   inferior  process  will  terminate  normally when it executes a HALTF%
   monitor call.  Alternatively, the process  will  terminate  abnormally
   when  it  executes an instruction that generates a software interrupt,
   such  as  an  illegal  instruction,  and  it  has  not  activated  the
   appropriate channel.

   By  activating  channel  .ICIFT  (channel  19)  for  inferior  process
   termination  and  enabling the software interrupt system, the superior
   process  will  receive  an  interrupt  when  one  of   its   inferiors
   terminates.   (Refer  to  Section  4.6  for  information on activating
   channel .ICIFT.)  The  interrupt  occurs  when  any  inferior  process
   terminates.   Use  of  the  interrupt system allows the superior to do
   other  processing  until  an  interrupt  occurs,  indicating  that  an
   inferior process has terminated.

   In some cases, however, the superior cannot do  additional  processing
   until  either a specific process or all of its inferior processes have
   completed execution.  If this is the case, the  superior  process  can
   execute  the WFORK% (Wait Process) monitor call.  This call blocks the
   superior until one or all of its inferiors have terminated.

   The WFORK% monitor call accepts one argument in AC1, the handle of the
   desired process.  This handle can be .FHINF (-4) to block the superior
   until all inferiors terminate, but cannot be a handle  on  a  superior
   process.

   After execution of the WFORK% monitor call,  control  returns  to  the
   user's  program  at  the  instruction  following  the  call,  when the
   specified process or all of the inferior processes terminate.   If  an
   error occurs, it generates a software interrupt, which the program can
   process via the software interrupt system.



                                    5-16
                             PROCESS STRUCTURE


   5.9  INFERIOR PROCESS STATUS

   The superior process can obtain the status of one of its inferiors  by
   executing  the  RFSTS%  (Read Process Status) monitor call.  This call
   returns the status and PC words of the given inferior process.

   The short form of the RFSTS% monitor call accepts one argument in AC1,
   the  handle  of  the  desired  process.  This handle cannot refer to a
   superior process or to more than one process.  The long  form  accepts
   two  argument words:  flags,, process handle in AC1 and the address of
   the status return block in AC2.  In the long form, RF%LNG (bit  0)  is
   set in AC1 and bits 1-17 are unused (must be zero).

   After execution of the short form of the RFSTS% call, control  returns
   to  the  user's program at the instruction following the call.  If the
   RFSTS% call is successful, AC1 contains the status word of  the  given
   process  and  AC2  contains  the PC word.  The status word is shown in
   Table 5-6.


   Table 5-6:  Process Status Word

   ______________________________________________________________________

     Bit       Symbol       Meaning
   ______________________________________________________________________

     0         RF%FRZ       The process is suspended (that is, frozen).
                            If  this  bit is not on, the process is not
                            suspended.

     1-17      RF%STS       The status of the process.

                            Value     Symbol    Meaning

                              0       .RFRUN    The     process      is
                                                runnable.

                              1       .RFIO     The process  is  halted
                                                waiting for I/O

                              2       .RFHLT    The process  is  halted
                                                by  a  HFORK% or HALTF%
                                                monitor  call  or   was
                                                never started.


                              3       .RFFPT    The process  is  halted
                                                by  the occurrence of a
                                                software interrupt  for
                                                which    it   was   not
                                                prepared   to   handle.


                                    5-17
                             PROCESS STRUCTURE


                                                The  right  half of the
                                                status  word   contains
                                                the   number   of   the
                                                channel  on  which  the
                                                interrupt occurred.

                              4       .RFWAT    The process  is  halted
                                                waiting   for   another
                                                process to terminate.

                              5       .RFSLP    The process  is  halted
                                                for  a specified amount
                                                of time.

                              6       .RFTRP    The     process      is
                                                dismissed   because  it
                                                was intercepted by  its
                                                superior.

                              7       .RFABK    The     process      is
                                                dismissed       because
                                                address    break    was
                                                encountered.

     18-35     RF%SIC       The channel number on  which  an  interrupt
                            occurred,   which   the   process  was  not
                            prepared to handle (see process status code
                            .RFFPT above).
   ______________________________________________________________________


   The RFSTS% call returns with -1 (fullword) in  AC3  if  the  specified
   handle  is  assigned  but  refers  to  a  deleted  process.   The call
   generates  an  illegal  instruction  interrupt  if   the   handle   is
   unassigned.

   In the long form of the RFSTS% monitor call, RF%LNG is set in AC1  and
   AC2 contains the address of a status-return block.  On the return, AC1
   and AC2 are not modified.  The status-return  block  is  described  in
   Table 5-7.


   Table 5-7:  RFSTS% Status-Return Block

   ______________________________________________________________________

     Word      Symbol       Meaning
   ______________________________________________________________________

      0        .RFCNT       Count of words returned in  this  block  in
                            the  left half, and count of maximum number
                            of words to return in right half (including


                                    5-18
                             PROCESS STRUCTURE


                            this word).  The right half of this word is
                            specified by the user.

      1        .RFPSW       Process status word.   This  word  has  the
                            same format as AC1 on a return from a short
                            call.  If a valid, but unassigned,  process
                            handle was specified in AC1, then this word
                            contains  -1  and  no   other   words   are
                            returned.

      2        .RFPFL       Process PC flags.  These are the same flags
                            returned in AC2 on a short call.

      3        .RFPPC       Process PC.  This is the address; no  flags
                            are returned in this word.

      4        .RFSFL       Status flag word.

                            Flags:

                            Bit    Symbol   Meaning

                            B0     RF%EXO   Process is execute-only.
   ______________________________________________________________________


   If an error occurs during execution of the  RFSTS%  call,  a  software
   interrupt  is generated which the program can process via the software
   interrupt system.



   5.10  PROCESS COMMUNICATION

   A superior process can communicate with its inferiors by  sharing  the
   same  pages  of  memory.  This sharing is accomplished with the CFORK%
   (bit CR%MAP) or the PMAP% monitor call.  When  the  superior  executes
   either  of  these  calls, both the superior and the inferior share the
   same pages.  Changes made to the shared pages by either  process  will
   be seen by the other process.

   Alternatively, processes can communicate via  the  software  interrupt
   system.   The  superior  process  can cause a software interrupt to be
   generated in an inferior  process  by  executing  the  IIC%  (Initiate
   Interrupt on Channel) monitor call.  For this type of communication to
   occur, the inferior's interrupt channels must  be  activated  and  its
   interrupt system enabled.

   The IIC% monitor call accepts two words of arguments in AC1  and  AC2.
   The  handle  of  the  process to receive the interrupt is given in the
   right half of  AC1.   AC2  contains  a  36-bit  word,  with  each  bit
   representing  one of the 36 software channels.  If a bit is on in AC2,


                                    5-19
                             PROCESS STRUCTURE


   a software interrupt is initiated on the corresponding  channel.   For
   example,  if  bit 5 is on in AC2, an interrupt is initiated on channel
   5.

   Thus,

        AC1:  process handle in the right half

        AC2:  36-bit word, with bit n on to initiate a software interrupt
              on channel n

   The process handle given cannot refer to a superior process or to more
   than one process.

   After execution of the  IIC%  call,  control  returns  to  the  user's
   program at the instruction following the call.  If an error occurs, it
   generates a software interrupt which the program can process  via  the
   software interrupt system.



   5.11  DELETING AN INFERIOR PROCESS

   A process is deleted from the job structure when the superior  process
   executes  the  KFORK%  (Kill Process) monitor call.  When a process is
   deleted, its address space, its handle, and any JFNs acquired  by  the
   process  are  released.   If  the  process being deleted has processes
   inferior to it, the inferiors are also deleted.  For example,  in  the
   structure:


                              ---------------
                              |  Process A  |
                              ---------------
                                     |
                                     |
                              ---------------
                              |  Process B  |
                              ---------------
                                     |
                                     |
                              ---------------
                              |  Process C  |
                              ---------------


   if process A deletes process B by executing a KFORK% call,  process  C
   is also deleted.

   The KFORK% monitor call accepts one argument in the right half of AC1,
   the  handle of the process to be deleted.  This handle cannot refer to
   a superior process, to more than one process (for example, .FHINF), or


                                    5-20
                             PROCESS STRUCTURE


   to  the  process  executing  the  call  (that is, .FHSLF).  The RESET%
   monitor call is used to reinitialize the  current  process;  refer  to
   Section 2.6.1.

   After execution of the KFORK% call,  control  returns  to  the  user's
   program  at the instruction following the call.  If an error occurs, a
   software interrupt is generated, which the program can process via the
   software interrupt system.



   5.12  PROCESS EXAMPLES

   Example 1 - This program creates an inferior process to provide timing
   interrupts.

           TITLE TIMINT - AN INFERIOR PROCESS PROVIDING TIMING INTERRUPTS

           SEARCH MONSYM
           SEARCH MACSYM
           .REQUIRE SYS:MACREL

           STDAC.                  ;DEFINE STANDARD ACS

   START:  RESET%                  ;RELEASE FILES, ETC.
           MOVE P,[IOWD PDLSIZ,PDL] ;INITIALIZE STACK
           MOVX T1,CR%MAP          ;MAKE NEW PROCESS SHARE THIS 
                                   ;PROCESS'S MEMORY
           CFORK%                  ;CREATE A NEW PROCESS
            EJSHLT                 ;UNEXPECTED FATAL ERROR
           MOVEM T1,HANDLE         ;SAVE PROCESS HANDLE

   ;HERE TO START THE INFERIOR PROCESS

   STPROC: SETZB T4,FLAG           ;INITIALIZE COUNTER AND FLAG
           MOVE T1,HANDLE          ;GET PROCESS HANDLE
           MOVEI T2,SLEEP          ;GET ADDRESS TO START PROCESS
           SFORK%                  ;START THE NEW PROCESS
            EJSHLT                 ;UNEXPECTED FATAL ERROR

   ; MAIN PROCESSING LOOP

   LOOP:   AOS T4                  ;INCREMENT COUNTER
           SKIPN FLAG              ;HAS TIME ELAPSED YET?
           JRST LOOP               ;NO, GO DO MORE PROCESSING

   ; HERE WHEN LOWER PROCESS HAS INTERRUPTED

           TMSG <
   Counter has reached >           ;OUTPUT FIRST PART OF MESSAGE
           MOVX T1,.PRIOU          ;GET PRIMARY OUTPUT DESIGNATOR
           MOVE T2,T4              ;GET VALUE OF COUNTER


                                    5-21
                             PROCESS STRUCTURE


           MOVEI T3,^D10           ;USE DECIMAL RADIX
           NOUT%                   ;OUTPUT CURRENT COUNTER VALUE
            EJSERR                 ;PRINT ERROR MESSAGE AND CONTINUE
           TMSG <
   >                               ;MOVE TO A NEW LINE
           JRST STPROC             ;CONTINUE COUNTING

   ; PROGRAM PERFORMED BY INFERIOR PROCESS TO WAIT FOR ONE-HALF MINUTE

   SLEEP:  MOVX T1,^D30*^D1000     ;ONE-HALF MINUTE IN MILLISECONDS
           DISMS%                  ;WAIT FOR SPECIFIED TIME
           SETOM FLAG              ;TELL SUPERIOR TIME HAS ELAPSED
           HALTF%                  ;FINISHED

   ; CONSTANTS AND STORAGE

           PDLSIZ==50              ;SIZE OF THE STACK
   PDL:    BLOCK PDLSIZ            ;STACK
   HANDLE: BLOCK 1                 ;INFERIOR PROCESS HANDLE
   FLAG:   BLOCK 1                 ;INTERRUPT FLAG

           END START

   Example 2 - This program illustrates how an inferior  process  may  be
   used  as  a source of timer interrupts.  The main program increments a
   counter.  It has an inferior process running for the sole  purpose  of
   timing  10 second intervals.  Each time the inferior process has timed
   10 seconds, it stops  and  interrupts  the  main  program.   The  main
   program  then  reports  how  many  more  times  it has incremented the
   counter since the last 10 second interrupt.

           TITLE TRMINT - FORK TERMINATION INTERRUPTS
           SEARCH MONSYM
           SEARCH MACSYM
           .REQUIRE SYS:MACREL

           STDAC.                  ;DEFINE STANDARD ACS

   START:  RESET%                  ;RELEASE FILES, ETC.
           MOVE P,[IOWD PDLSIZ,PDL] ;INITIALIZE STACK

   ; SET UP THE INTERRUPT SYSTEM

           MOVX T1,.FHSLF          ;GET PROCESS HANDLE FOR THIS FORK
           MOVE T2,[LEVTAB,,CHNTAB] ;GET TABLE ADDRESSES
           SIR%                    ;SET INTERRUPT TABLE ADDRESSES
            EJSHLT                 ;UNEXPECTED FATAL ERROR
           MOVX T2,1B<.ICIFT>      ;GET PROCESS TERMINATION CHANNEL BIT
           AIC%                    ;ACTIVATE PROCESS TERMINATION CHANNEL
            EJSHLT                 ;UNEXPECTED FATAL ERROR
           EIR%                    ;ENABLE INTERRUPT SYSTEM
            EJSHLT                 ;UNEXPECTED FATAL ERROR


                                    5-22
                             PROCESS STRUCTURE


   ; CREATE AND START THE INFERIOR PROCESS

           MOVX T1,CR%MAP+CR%ST+SLEEP
           CFORK%                  ;CREATE AND START TIMER AT SLEEP
            EJSHLT                 ;UNEXPECTED FATAL ERROR
           MOVEM T1,HANDLE ;SAVE PROCESS HANDLE

   ;INITIALIZE THE COUNTER

   STPROC: SETZB T4,OLDT4          ;CLEAR COUNTER

   ;MAIN LOOP OF THE PROGRAM WHICH JUST KEEPS COUNTING. (REAL
   ;APPLICATION WOULD PRESUMABLY HAVE A MORE USEFUL MAIN PROGRAM.)

   LOOP:   AOJA T4,LOOP            ;JUST KEEP INCREMENTING
   ; HERE WHEN LOWER PROCESS HAS INTERRUPTED

   PROINT: MOVEM P,IACS+P          ;SAVE STACK POINTER
           MOVEI P,IACS            ;MAKE POINTER FOR REST OF ACS
           BLT P,IACS+CX           ;SAVE REST OF ACS
           MOVE P,IACS+P           ;RESTORE P
           TMSG <NUMBER OF COUNTS: >
           MOVX T1,.PRIOU          ;GET PRIMARY OUTPUT DESIGNATOR
           EXCH T4,OLDT4           ;SAVE NEW COUNTER VALUE
           SUB T4,OLDT4            ;FIND NUMBER OF COUNTS SINCE LAST TIME
           MOVM T2,T4              ;MAKE IT POSITIVE
           MOVEI T3,^D10           ;USE DECIMAL RADIX
           NOUT%                   ;OUTPUT CURRENT COUNTER VALUE
            EJSERR                 ;PRINT ERROR MESSAGE AND CONTINUE
           TMSG <
   >                               ;MOVE TO A NEW LINE
           MOVE T1,HANDLE          ;GET PROCESS HANDLE
           MOVEI T2,SLEEP          ;GET ADDRESS TO START PROCESS
           SFORK%                  ;START THE NEW PROCESS
            EJSHLT                 ;UNEXPECTED FATAL ERROR
           MOVSI P,IACS            ;GET POINTER TO SAVED ACS
           BLT P,P                 ;RESTORE SAVED ACS
           DEBRK%                  ;DISMISS INTERRUPT
   ;THE FOLLOWING IS EXECUTED AS A LOWER PROCESS TO DO THE
   ;TIMING.  IT SLEEPS FOR 10 SECONDS AND THEN STOPS.

   SLEEP:  MOVX T1,^D10*^D1000     ;10 SECONDS IN MILLISECONDS
           DISMS%                  ;SLEEP
           HALTF%                  ;STOP AND INTERRUPT THE MAIN PROGRAM

   ; CONSTANTS AND STORAGE

           PDLSIZ==50              ;SIZE OF THE STACK
   PDL:    BLOCK PDLSIZ            ;STACK
   CHNTAB: REPEAT ^D19,<EXP 0>     ;CHANNELS 0-18 ARE NOT USED
           1,,PROINT               ;LEVEL 1 PROCESS TERMINATION CHANNEL
           REPEAT ^D15,<EXP 0>     ;REMAINING CHANNELS ARE NOT USED


                                    5-23
                             PROCESS STRUCTURE


   LEVTAB: RETPC1                  ;RETURN PC STORED AT RETPC1 FOR 
                                   ;LEVEL 1
           0                       ;LEVEL 2 NOT USED
           0                       ;LEVEL 3 NOT USED
   HANDLE: BLOCK 1                 ;INFERIOR PROCESS HANDLE
   RETPC1: BLOCK 1                 ;RETURN PC STORED HERE ON INTERRUPTS
   OLDT4:  BLOCK 1                 ;HOLDS TIMER VALUE AT LAST INTERRUPT
   IACS:   BLOCK 20                ;STORAGE FOR ACS DURING INTERRUPTS

           END START

   Example 3 - This program creates an inferior process which waits until
   a line has been typed on the terminal.

           TITLE FRKDOC - AN INFERIOR PROCESS WAITS UNTIL A LINE IS TYPED

           SEARCH MONSYM
           SEARCH MACSYM
           .REQUIRE SYS:MACREL

           STDAC.                  ;DEFINE STANDARD ACS

   START:  RESET%                  ;RELEASE FILES, ETC.
           MOVE P,[IOWD PDLSIZ,PDL] ;INITIALIZE STACK
           MOVX T1,CR%MAP          ;MAKE NEW PROCESS SHARE THIS 
                                   ;PROCESS'S MEMORY
           CFORK%                  ;CREATE A NEW PROCESS
            EJSHLT                 ;UNEXPECTED FATAL ERROR
           SETZB T4,FLAG           ;INITIALIZE COUNTER AND FLAG
           MOVEI T2,GETCOM         ;GET ADDRESS TO START PROCESS
           SFORK%                  ;START THE NEW PROCESS
            EJSHLT                 ;UNEXPECTED FATAL ERROR

   ; MAIN PROCESSING LOOP

   LOOP:   AOS T4                  ;INCREMENT COUNTER
           SKIPN FLAG              ;HAS TIME ELAPSED YET?
           JRST LOOP               ;NO, GO DO MORE PROCESSING

   ; HERE WHEN INFERIOR PROCESS HAS INPUT A LINE OF TEXT

           TMSG <
   Counter has reached >           ;OUTPUT FIRST PART OF MESSAGE
           MOVX T1,.PRIOU          ;GET PRIMARY OUTPUT DESIGNATOR
           MOVE T2,T4              ;GET VALUE OF COUNTER
           MOVEI T3,^D10           ;USE DECIMAL RADIX
           NOUT%                   ;OUTPUT CURRENT COUNTER VALUE
            EJSERR                 ;PRINT ERROR MESSAGE AND CONTINUE
           TMSG <
   Echo Check: >                   ;OUTPUT FIRST PART OF MESSAGE
           HRROI T1,BUFFER         ;GET POINTER TO BUFFER
           PSOUT%                  ;OUTPUT TEXT JUST ENTERED


                                    5-24
                             PROCESS STRUCTURE


           HALTF%                  ;STOP
           JRST START              ;IN CASE PROGRAM CONTINUED

   ; PROGRAM PERFORMED BY INFERIOR PROCESS TO INPUT A LINE OF TEXT

   GETCOM: HRROI T1,BUFFER         ;GET POINTER TO TEXT BUFFER
           MOVEI T2,BUFSIZ*5       ;GET COUNT OF MAX # OF CHARACTERS
           SETZM T3                ;NO RETYPE BUFFER
           RDTTY%                  ;READ A LINE FROM THE TERMINAL
            EJSERR                 ;UNEXPECTED ERROR
           SETOM FLAG              ;TELL SUPERIOR TIME HAS ELAPSED
           HALTF%                  ;FINISHED

   ; CONSTANTS AND STORAGE

           PDLSIZ==50              ;SIZE OF THE STACK
   PDL:    BLOCK PDLSIZ            ;STACK
           BUFSIZ==50              ;BUFFER SIZE
   BUFFER: BLOCK BUFSIZ
   FLAG:   BLOCK 1                 ;INTERRUPT FLAG

           END START
































                                    5-25
























































                                    6-1











                                 CHAPTER 6

                          ENQUEUE/DEQUEUE FACILITY



   6.1  OVERVIEW

   Many times users are placed in situations where they must share  files
   with other users.  Each user wants to be guaranteed that while reading
   a file, other users are reading the same  data  and  while  writing  a
   file,  no users are also writing, or even reading, the same portion of
   the file.

   Consider a data file used by members of an  insurance  company.   When
   many  agents  are reading individual accounts from the data file, they
   can all access the file simultaneously because no one is changing  any
   portion  of  the  data.   However,  when an agent desires to modify or
   replace an individual account, that portion  of  the  file  should  be
   accessed exclusively by that agent.  None of the other agents wants to
   access accounts that are being changed until  after  the  changes  are
   made.

   By using the ENQ/DEQ  facility,  cooperating  users  can  insure  that
   resources  are  shared  correctly and that one user's modifications do
   not interfere with another user's.  Examples of resources that can  be
   controlled  by  this  facility are devices, files, operations on files
   (for example, READ, WRITE), records, and memory pages.  This  facility
   can  be  used  for dynamic resource allocation, computer networks, and
   internal monitor queueing.  However, control of simultaneous  updating
   of files by multiple users is its most common application.

   The ENQ/DEQ facility insures data integrity among processes only  when
   the  processes  cooperate  in  their  use of both the facility and the
   physical  resource.   Use   of   the   facility   does   not   prevent
   non-cooperating  processes  from  accessing  a  resource without first
   enqueueing  it.   Nor  does  the  facility  provide  protection   from
   processes using it in an incorrect manner.

   A resource is defined by the processes using it and not by the system.
   Because  there  is  competition among processes for use of a resource,
   each resource is associated with a queue.  This queue is the  ordering
   of the requests for the resource.  When a request for the resource is


                                    6-1
                          ENQUEUE/DEQUEUE FACILITY


   granted, a lock occurs between the process that made the  request  and
   the resource.  For the duration of the lock, that process is the owner
   of the resource.  Other processes requesting access  to  the  resource
   are  placed  in  the  queue  until  the  owner  relinquishes the lock.
   However, there can be more than one owner of a  resource  at  a  time;
   this  is  called  shared  ownership (refer to Section 6.2).  Processes
   obtain access to a specific resource by placing a request in the queue
   for the resource.  This request is generated by the ENQ% monitor call.
   When finished with the resource, the  process  then  issues  the  DEQ%
   monitor  call.   This  call  releases the lock by removing the request
   from the queue and makes the resource available to  the  next  waiting
   process.   This  cycle  continues until all requests in the queue have
   been satisfied.



   6.2  RESOURCE OWNERSHIP

   Ownership for a resource can  be  requested  as  either  exclusive  or
   shared.   Exclusive  ownership occurs when a process requests sole use
   of the resource.  When a process is granted  exclusive  ownership,  no
   other  process  will  be  allowed  to use the resource until the owner
   relinquishes it.  This type of ownership should be  requested  if  the
   process  plans  on modifying the resource (for example, the process is
   updating a record in a data file).  Shared  ownership  occurs  when  a
   process  requests a resource, specifying that it will share the use of
   the resource with other processes.  When a  process  is  given  shared
   ownership,  other  processes  also  specifying  shared  ownership  are
   allowed to simultaneously use the  resource.   Access  to  a  resource
   should  be  shared  as  long  as  any one process is not modifying the
   resource.

   Two conditions determine when a lock to  a  resource  is  given  to  a
   process:

        1.  The position of the process's request in the  queue  for  the
            resource.

        2.  The type of ownership specified by the process's request.

   Because each resource has only one queue associated with it,  requests
   for  both exclusive and shared ownership of the resource are placed in
   the same queue.  Requests are placed in the  queue  in  the  order  in
   which  the  ENQ  facility  receives them, and the first request in the
   queue will be the first one serviced (except in  the  case  of  single
   requests  for  multiple  resources; refer to Section 6.4.1).  In other
   words, the ENQ facility processes requests on a first  in,  first  out
   basis.   If  this  first request is for shared ownership, that request
   will be serviced along with all following shared ownership requests up
   to  but  not  including the first exclusive ownership request.  If the
   first request is for  exclusive  ownership,  no  other  processes  are
   allowed  use  of the resource until the first process has released the
   lock.

                                    6-2
                          ENQUEUE/DEQUEUE FACILITY


   Consider the following queue for a particular resource.


         !=======================================================!
         !                  request 1 (shared)                   !
         !-------------------------------------------------------!
         !                  request 2 (shared)                   !
         !-------------------------------------------------------!
         !                 request 3 (exclusive)                 !
         !-------------------------------------------------------!
         !                  request 4 (shared)                   !
         !-------------------------------------------------------!
         !                  request 5 (shared)                   !
         !=======================================================!


   Request 1 will be serviced first because it is the  first  request  in
   the  queue.   However,  since  this  request  is for shared ownership,
   request 2 can also be serviced.  Request 3 cannot  be  serviced  until
   the  processes  with  request  1 and request 2 release the lock on the
   resource.  Eventually the lock is released by the two  processes,  and
   the  first two requests are removed from the queue.  The queue now has
   the following entries:


         !=======================================================!
         !                                                       !
         !-------------------------------------------------------!
         !                                                       !
         !-------------------------------------------------------!
         !                 request 3 (exclusive)                 !
         !-------------------------------------------------------!
         !                  request 4 (shared)                   !
         !-------------------------------------------------------!
         !                  request 4 (shared)                   !
         !=======================================================!


   Request 3 is now first in the  queue  and  is  given  a  lock  on  the
   resource.   Because  the  request is for exclusive ownership, no other
   requests will be serviced.  Once the process associated with request 3
   releases  the  lock,  both  request  4  and  request 5 can be serviced
   because they both are for shared ownership.



   6.3  PREPARING FOR THE ENQ/DEQ FACILITY

   Before using the ENQ/DEQ facility, the user must obtain an  ENQ  quota
   from the system administrator and must obtain the name of the resource




                                    6-3
                          ENQUEUE/DEQUEUE FACILITY


   desired, the  type  of  protection  required,  and  the  level  number
   associated with the resource.

   The ENQ quota indicates the total  number  of  requests  that  can  be
   outstanding  for  the  user at any given time.  Any request that would
   cause the quota to be exceeded results in an error.  The  user  cannot
   use the ENQ facility if the quota is set to zero.

   The resource name has a meaning  agreed  upon  by  all  users  of  the
   specific  resource  and  serves as an identifier of the resource.  The
   system makes no association between the resource name and the physical
   resource  itself;  it  is  the responsibility of the user's process to
   make that association.  The system merely uses the  resource  name  to
   process  requests and handles different resource names as requests for
   different resources.

   The resource name has two parts.  In most cases, the first part is the
   JFN  of  the  file being accessed.  Before using the ENQ facility, the
   user must initialize the file  using  the  appropriate  monitor  calls
   (refer  to  Section  3.1).  The second part of the name is a modifier,
   which is either a pointer to a string or  a  33-bit  user  code.   The
   string uniquely identifies the resource to all users.  The pointer can
   either be a standard byte pointer or be in the form

        -1,,ADR

   where ADR is the location of the  left-justified  ASCIZ  text  string.
   The 33-bit user code similarly identifies the resource by representing
   an item such as a record number or block  number.   The  ENQ  facility
   considers  these modifiers as logical  strings and does  not check for
   cooperation among  the  users.   Thus,  users  must  be  careful  when
   assigning  these  modifiers to prevent the occurrence of two different
   modifiers referring to the same resource.

   The type of protection desired for the resource is  indicated  by  the
   first  part of the resource name.  This part of the name can be one of
   four values.  When the user specifies the JFN of the desired file, the
   file is subject to the standard access protection of the system.  This
   is the most typical case.  When the user specifies  -1  instead  of  a
   JFN,  it  means that resources defined within a job are to be accessed
   only by processes of that job.  Other jobs requesting resources of the
   same name are queued to a different resource.  When the user specifies
   -2 instead of a JFN, it means that the resource can be accessed by any
   job  on  the  system.   A  process must have bit SC%ENQ enabled in its
   capability word to specify this  type  of  protection.   If  the  user
   specifies -3 instead of a JFN, it means the same type of protection as
   that given when -2 is specified.   However,  this  requires  that  the
   process  have  WHEEL  or  OPERATOR capability enabled.  Quotas are not
   checked when -3 is given instead of a JFN.

   In addition to specifying the resource name and  type  of  protection,
   the  user  also  assigns  a level number to each resource.  The use of


                                    6-4
                          ENQUEUE/DEQUEUE FACILITY


   level numbers prevents the occurrence of a deadly  embrace  situation:
   the  situation  where  two  or  more processes are waiting for each to
   complete, but none of the processes can obtain a lock on the  resource
   it needs for completion.  This situation is represented by Figure 6-1.


         ---------------------
         | Process A is      |
         | Waiting for a     |
         | Resource Process  |--------------------------\
         | B Has.            |                          |
         ---------------------                          |
                 ^                                      v
                 |                             ---------------------
                 |                             | Process B is      |
                 |                             | Waiting for a     |
                 |                             | Resource Process  |
                 |                             | C Has.            |
                 |                             ---------------------
                 |                                      |
                 |         ---------------------        |
                 |         | Process C is      |        |
                 |         | Waiting for a     |        |
                 \---------| Resource Process  |<-------/
                           | A Has.            |
                           ---------------------


   Figure 6-1:  Deadly Embrace Situation



   Each process is in the queue waiting for the resource it needs, but no
   request   is   being   serviced  because  the  desired  resources  are
   unavailable.

   The use of level numbers forces cooperating processes to  order  their
   use  of  resources by requiring that processes request resources in an
   ascending numerical order and that all processes assign the same level
   number  to  a  specific  resource.  This means that the order in which
   resources are requested is the same for all processes  and  therefore,
   requests  for  the first resource will always precede requests for the
   second one.

   If both of the above requirements are not met, the process  requesting
   the resource receives an error, unless the appropriate flag bit is set
   (refer to Section 6.4.1.2), and the  request  is  not  placed  in  the
   queue.  Thus, instead of waiting for a resource it will never get, the
   process is informed immediately that the resource is not available.





                                    6-5
                          ENQUEUE/DEQUEUE FACILITY


   6.4  USING THE ENQ/DEQ FACILITY

   There are three monitor calls  available  for  the  ENQ/DEQ  facility:
   ENQ%,  to  request  use  of  a  resource; DEQ%, to release a lock on a
   resource; and ENQC%, to obtain information about  the  queues  and  to
   specify access to these queues.



   6.4.1  Requesting Use of a Resource

   The user issues the ENQ% monitor call to place a request in the  queue
   associated  with  the  desired resource.  This call is used to specify
   the resource name, level number, and type of protection required.

   A single ENQ% monitor call can  be  used  to  request  any  number  of
   resources.  In fact, when desiring multiple resources, the user should
   request all of them in one call.  This method of requesting  resources
   guarantees  that  the  user  gets  either none or all of the resources
   requested because the ENQ/DEQ facility never allocates  only  some  of
   the  resources  specified  in  one  call.   Because all resources in a
   single call must be  available  at  the  same  time,  the  first  user
   requesting  a  resource  (that is, the first user in the queue for the
   resource) may not be the first user obtaining it if other resources in
   the request are currently not available.

   A single call for multiple resources is not functionally the same as a
   series  of  single  calls  of  those resources.  In a single call, the
   entire request is rejected if an error is  returned  for  one  of  the
   resources  specified.   In a series of single calls, each request that
   did not return an error will be queued.

   The ENQ% monitor call accepts two words of arguments in AC1  and  AC2.
   The  first  word  contains  the  code of the desired function, and the
   second contains the address of the argument block.  Thus,

        AC1:  function code

        AC2:  address of argument block



   6.4.1.1  ENQ% Functions - The functions that can be requested  in  the
   ENQ% call are described in Table 6-1.










                                    6-6
                          ENQUEUE/DEQUEUE FACILITY


   Table 6-1:  ENQ% Functions

   ______________________________________________________________________

     Code          Symbol        Meaning
   ______________________________________________________________________

      0            .ENQBL        Queue  the  requests  and  block   the
                                 process  until all requested locks are
                                 acquired.  This  function  returns  an
                                 error  code  only  if the ENQ% call is
                                 not correctly specified.

      1            .ENQAA        Queue the  requests  and  acquire  the
                                 locks  only if all requested resources
                                 are  immediately  available.   If  the
                                 resources  are  available, all will be
                                 allocated to the process.  If any  one
                                 of  the resources is not available, no
                                 requests  are  queued,  no  locks  are
                                 acquired,   and   an   error  code  is
                                 returned in AC1.

      2            .ENQSI        Queue the requests for  all  specified
                                 resources.    If   all  resources  are
                                 available, this function is  identical
                                 to   the   .ENQBL  function.   If  all
                                 resources    are    not    immediately
                                 available,  the  requests  are queued,
                                 and a software interrupt is  generated
                                 when all requested resources have been
                                 given to the process.

      3            .ENQMA        Change  the  ownership  access  of   a
                                 previously-queued  request  (refer  to
                                 bit EN%SHR  below).   The  access  for
                                 each  lock in this request is compared
                                 with the access for each lock  in  the
                                 request  already queued.  No action is
                                 taken if  the  two  accesses  are  the
                                 same.   If  the access in this request
                                 is  shared  and  the  access  in   the
                                 previous  request  is  exclusive,  the
                                 ownership access is changed to  shared
                                 access.    Otherwise,   an   error  is
                                 returned if:

                                 1.  There  are  processes  which   are
                                     locking,  or  waiting  on the same
                                     lock, and  the  process  tries  to
                                     change  the  ownership access from
                                     shared to exclusive.  If  this  is


                                    6-7
                          ENQUEUE/DEQUEUE FACILITY


                                     the case, the process should issue
                                     a DEQ% monitor call for the shared
                                     request  and  then  issue  another
                                     ENQ% monitor  call  for  exclusive
                                     ownership.

                                 2.  Any one  of  the  specified  locks
                                     does not have a pending request.

                                 3.  Any one of the specified locks  is
                                     a   pooled   resource   (refer  to
                                     Section 6.4.1.2).

                                 Each lock specified  is  checked,  and
                                 the  access  is  changed for all locks
                                 that   were   correctly   given.    On
                                 receiving an error, the process should
                                 issue  the  ENQC%  monitor   call   to
                                 determine  the  current  state of each
                                 lock (refer to Section 6.4.3).

      4            .ENECL        Set cluster-wide ENQ/DEQ functionality
                                 for  all ENQ/DEQ/ENQC JSYSes performed
                                 by this process.  The contents of  AC2
                                 are  ignored as this function does not
                                 require an argument block.
   ______________________________________________________________________



   6.4.1.2  ENQ% Argument Block - The format of  the  argument  block  is
   described in Table 6-2.


   Table 6-2:  ENQ% Argument Block

   ______________________________________________________________________

     Word      Symbol       Meaning
   ______________________________________________________________________

       0       .ENQLN       Number of locks being requested in the left
                            half,   and   length   of   argument  block
                            (including this word) in the right half.

       1       .ENQID       Number of software interrupt channel in the
                            left  half,  and  request  ID  in the right
                            half.

       2       .ENQLV       Flags and level number in  the  left  half,
                            and  JFN,  -1,  -2  or -3 (refer to Section
                            6.3) in the right half.


                                    6-8
                          ENQUEUE/DEQUEUE FACILITY


       3       .ENQUC       Pointer to string or 5B2+33-bit  user  code
                            (refer to Section 6.3).

       4       .ENQRS       Number of resources in the pool in the left
                            half,  and number of resources requested in
                            the right half.

       5       .ENQMS       Address of a resource mask block.
   ______________________________________________________________________


   Words .ENQLV, .ENQUC, .ENQRS, and  .ENQMS  (words  2  through  5)  are
   repeated  for  each lock being requested.  These four words are called
   the lock specification.

   Software Interrupts

   The software interrupt system is used in conjunction with  the  .ENQSI
   function  (refer  to Section 6.4.1.1).  If all locks are not available
   when the user requests them, the .ENQSI  function  causes  a  software
   interrupt  to  be generated when the locks become available.  The user
   specifies the software channel on which to receive  the  interrupt  by
   placing  the  channel  number  in  the left half of word .ENQID in the
   argument block.

   When the user is waiting for more than one lock to  become  available,
   he  will  receive an interrupt when the last lock is available.  If he
   desires to be informed as each lock becomes available, he  can  assign
   the  locks  to  separate channels by issuing multiple ENQ% calls.  The
   availability of each lock will then be indicated by the occurrence  of
   an interrupt on each channel.

   When the user requests the .ENQSI function,  he  must  initialize  the
   interrupt system first or else an interrupt will not be generated when
   the locks become available (refer to Chapter 4).

   Request ID

   The 18-bit request ID is currently not used  by  the  system,  but  is
   stored  for use by the process.  Thus, the process can supply an ID to
   use as identification for the request.   This  ID  is  useful  on  the
   .DEQID function of the DEQ% monitor call (refer to Section 6.4.2.1).

   Flags and Level Numbers

   Table 6-3 describes the flags that can be used in the left half of the
   first word of each lock specification (.ENQLV).







                                    6-9
                          ENQUEUE/DEQUEUE FACILITY


   Table 6-3:  Lock Specification Flags

   ______________________________________________________________________

     Bit       Symbol            Meaning
   ______________________________________________________________________

      0        EN%SHR            Ownership for this resource is  to  be
                                 shared.    If  this  bit  is  not  on,
                                 ownership for this resource is  to  be
                                 exclusive.

      1        EN%BLN            Ignore  the  level  number  associated
                                 with  this  resource.   If this bit is
                                 set,  sequencing   errors   in   level
                                 numbers  are not considered fatal, and
                                 execution of the call continues.

                                 On successful completion of the  call,
                                 AC1 contains either an error code if a
                                 sequencing error occurred, or zero  if
                                 a sequencing error did not occur.

                                                WARNING

                                     A deadly embrace situation may
                                     occur  when  level numbers are
                                     not  used.    Use   of   these
                                     numbers guarantees that such a
                                     situation  cannot  arise;  for
                                     this  reason bit EN%BLN should
                                     not be set.

      2        EN%NST            Allow ownership of  this  lock  to  be
                                 nested.

      3        EN%LTL            Allow  a  long-term   lock   on   this
                                 resource.

      4-8                        Reserved for Digital.

      9-17     EN%LVL            Level  number  associated  with   this
                                 resource.  This number is specified by
                                 the user and must be  agreed  upon  by
                                 all  users  of the resource.  In order
                                 to   eliminate   a   deadly    embrace
                                 situation,    users    must    request
                                 resources  in  numerically  increasing
                                 order.
   ______________________________________________________________________




                                    6-10
                          ENQUEUE/DEQUEUE FACILITY


   The request is not queued, and an error is given, if EN%BLN is not set
   and

        1.  The user requests a resource with a level number less than or
            equal  to  the  highest numbered resource he has requested so
            far.

        2.  The level number of this request does  not  match  the  level
            number supplied in previous requests for this resource.

   Pooled Resources

   Word .ENQRS of each lock specification is used  to  allocate  multiple
   copies  from  a  pool  of identical resources.  Bit EN%SHR, indicating
   shared ownership, is meaningless for  pooled  resources  because  each
   resource  in  the  pool can be owned by only one process at a time.  A
   process can own one or more resources in the pool; however, it  cannot
   own  more than there are in the pool or more than there are unowned in
   the pool.

   The left half of word .ENQRS contains the total  number  of  resources
   existing  in  the  pool.  This number is previously agreed upon by all
   users of the  pooled  resource.   The  first  user  who  requests  the
   resource  sets  this  number, and all subsequent requests must specify
   the same number or an error is given.

   The right half of word .ENQRS contains the number of  resources  being
   requested by this process.  This number must be greater than zero if a
   pool of resources exists and cannot be greater than the number in  the
   left  half.   This  means that if a pool of resources exists, the user
   must request at least one resource, but cannot request more  than  are
   in the pool.

   Once the number of pooled resources is determined, the  resources  are
   allocated until the pool is depleted or until a request specifies more
   resources than are currently available.  In the latter case, the  user
   making the request is not given any resources until his entire request
   can be satisfied.   Subsequent  requests  from  other  users  are  not
   granted  until  this  request  is  satisfied  even though there may be
   enough resources to  satisfy  these  subsequent  requests.   As  users
   release their resources, the resources are returned to the pool.  When
   all resources have been returned, they cease to exist,  and  the  next
   request completely redefines the number of resources in the new pool.

   The system assumes that the resource is in a pool if the left half  of
   word  .ENQRS  of  the  lock  specification  is nonzero.  Thus the user
   should set the left half to zero if only one resource  of  a  specific
   type exists.  If this is the case, then the right half of this word is
   a number defining the group of users who can simultaneously share  the
   resource.   This  means  that when the resource is allocated to a user
   for shared ownership, only other users  in  the  same  group  will  be
   allowed  access  to  the resource.  The use of sharer groups restricts


                                    6-11
                          ENQUEUE/DEQUEUE FACILITY


   access to a resource to a set of processes smaller than  the  set  for
   shared ownership (which is sharer group 0) but larger than the set for
   exclusive ownership.  (Refer to Section 6.5 for  more  information  on
   sharer groups).



   6.4.2  Releasing a Resource

   The user issues the DEQ% monitor call to remove  a  request  from  the
   queue  associated  with a resource.  The request is removed whether or
   not the user actually owns a lock on the resource or is  only  waiting
   in the queue for the resource.

   The DEQ% monitor call can be used to remove  any  number  of  requests
   from  the  queues.   If  one  of  the  requests cannot be removed, the
   dequeueing procedure continues until all lock specifications have been
   processed.   An error code is then returned for the last request found
   that could not be dequeued.  The process can then  execute  the  ENQC%
   call  (refer  to  Section 6.4.3) to determine the status of each lock.
   Thus, unlike the operation of  the  ENQ%  call,  the  DEQ%  call  will
   dequeue  as many resources as it can, even if an error is returned for
   one of the lock specifications in the argument block.  However, when a
   user  attempts  to  dequeue  more  pooled resources than he originally
   allocated, an error code is returned and none  of  the  resources  are
   dequeued.

   The DEQ% monitor call accepts two words of arguments in AC1  and  AC2.
   The  first  word  contains  the code for the desired function, and the
   second word contains the address of the argument block.  Thus,

        AC1:  function code

        AC2:  address of argument block




















                                    6-12
                          ENQUEUE/DEQUEUE FACILITY


   6.4.2.1  DEQ% Functions - The DEQ% functions are  described  in  Table
   6-4.


   Table 6-4:  DEQ% Functions

   ______________________________________________________________________

     Code     Symbol     Meaning
   ______________________________________________________________________

     0        .DEQDR     Remove the specified requests from the queues.
                         This function is the only one that requires an
                         argument block.

     1        .DEQDA     Remove all requests for this process from  the
                         queues.   This  action  is  taken  on  a RESET
                         monitor call.  An error code  is  returned  if
                         this  process  has not requested any resources
                         (that is, if this process has  not  issued  an
                         ENQ%).

     2        .DEQID     Remove all requests  that  correspond  to  the
                         specified   request   identifier.   When  this
                         function is specified, the user must place the
                         18-bit  request  ID  in  AC2 on the DEQ% call.
                         This function allows the  user  to  release  a
                         class  of  locks in one call without itemizing
                         each lock in an argument block.  The  function
                         should be used when dequeueing in one call the
                         same locks that were  enqueued  in  one  call.
                         For  example,  with this function the user can
                         specify the ID to be the same as the JFN  used
                         in  the ENQ% call and thus remove all locks to
                         that file at once.
   ______________________________________________________________________


















                                    6-13
                          ENQUEUE/DEQUEUE FACILITY


   6.4.2.2  DEQ% Argument Block - The format of the  argument  block  for
   function .DEQDR is described in Table 6-5.


   Table 6-5:  DEQ% Argument Block

   ______________________________________________________________________

     Word      Symbol       Meaning
   ______________________________________________________________________

       0       .ENQLN       Number of locks being requested in the left
                            half,   and   length   of   argument  block
                            (including this word) in the right half.

       1       .ENQID       Number of software interrupt channel in the
                            left  half,  and  request  ID  in the right
                            half.

       2       .ENQLV       Flags and level number in  the  left  half,
                            and  JFN,  -1,  -2  or -3 (refer to Section
                            6.3) in the right half.

       3       .ENQUC       Pointer to string or 5B2+33-bit  user  code
                            (refer to Section 6.3).

       4       .ENQRS       Number of resources in the pool in the left
                            half,  and number of resources requested in
                            the right half.

       5       .ENQMS       Address of a resource mask block.
   ______________________________________________________________________


   Words .ENQLV, .ENQUC, .ENQRS, and  .ENQMS  (words  2  through  5)  are
   repeated for each request being dequeued.  These four words are called
   the lock specification.



   6.4.3  Obtaining Information About Resources

   The user issues the ENQC% monitor call to obtain information about the
   current  status of the given resources.  This call can also be used by
   privileged users to perform various utility  functions  on  the  queue
   structure.   The  format  of the ENQC% call is different for these two
   uses.  (Refer to the TOPS-20 Monitor Calls Reference  Manual  for  the
   explanation of the privileged use of the ENQC% call.)

   The ENQC% monitor call accepts three words of arguments in AC1 through
   AC3:



                                    6-14
                          ENQUEUE/DEQUEUE FACILITY


        AC1:  function code (.ENQCS)

        AC2:  address of argument block

        AC3:  address of area to receive status information

   The format of the argument block is identical to  the  format  of  the
   ENQ%  and DEQ% argument blocks.  The area in which the status is to be
   returned should be  three  times  as  long  as  the  number  of  locks
   specified in the argument block.

   On successful execution of the ENQC% call, the current status of  each
   lock  specified  is  returned  as a three-word entry.  This three-word
   entry has the following format.


         !=======================================================!
         !        Flag bits indicating status of lock            !
         !-------------------------------------------------------!
         !                   36-bit time stamp                   !
         !-------------------------------------------------------!
         !         Reserved          !        Request ID         !
         !=======================================================!


   Table 6-6 describes the flag bits that can be used in a ENQC% call.




























                                    6-15
                          ENQUEUE/DEQUEUE FACILITY


   Table 6-6:  ENQC% Flag Bits

   ______________________________________________________________________

     Bit     Symbol    Meaning
   ______________________________________________________________________

      0      EN%QCE    An error has occurred in the corresponding  lock
                       request.   Bits  18-35  contain  the appropriate
                       error code.

      1      EN%QCO    The process issuing the ENQC% call is the  owner
                       of this lock.

      2      EN%QCQ    The process issuing the ENQC%  call  is  in  the
                       queue  waiting for this resource.  This bit will
                       be on  when  EN%QCO  is  on  because  a  request
                       remains in the queue until a DEQ% call is given.

      3      EN%QCX    The  lock  has  been  allocated  for   exclusive
                       ownership.   When  this  bit is off, there is no
                       way of determining the number of sharers of  the
                       resource.

      4      EN%QCB    The process issuing the ENQC%  call  is  in  the
                       queue  waiting  for  exclusive  ownership to the
                       resource.  This bit will be  off  if  EN%QCQ  is
                       off.

      5      EN%QCC    This is a cluster-wide lock/request.   This  bit
                       exists in both a lock-block and a q-block.

      6      EN%QCN    No future vote is required for this lock.   This
                       bit exists in a lock-block.

      7      EN%QCS    This lock requires a scheduling pass.

      8                Reserved for Digital

     9-17    EN%LVL    The level number of the resource.

    18-35    EN%JOB    The number of the job that owns the lock.   This
                       value  may  be  a  job  number on another system
                       within  the  cluster.   For  locks  with  shared
                       ownership,  this value will be the job number of
                       one of the owners.  However, this value will  be
                       the  current  job's number if the current job is
                       one of the owners.  If this lock is  not  owned,
                       the  value  is  -1.  If EN%QCE is on, this field
                       contains the appropriate error code.
   ______________________________________________________________________



                                    6-16
                          ENQUEUE/DEQUEUE FACILITY


   The 36-bit time stamp indicates the last time  a  process  locked  the
   resource.  The time is in the universal date-time standard.  If no one
   currently has a lock on the resource, this word is zero.

   The request ID returned in the right half of the third word is  either
   the  request ID of the current process if that process is in the queue
   or the request ID of the owner of the lock.



   6.5  SHARER GROUPS

   Processes can specify the sharing of resources by using  sharer  group
   numbers  (refer  to  Section  6.4.1.2).   The  use  of  sharer  groups
   restricts the ownership for a resource to a set of  processes  smaller
   than  the  set  for  shared  ownership  but  larger  than  the set for
   exclusive ownership.

   Sharer group number 0 is used to indicate the group of all cooperating
   processes of the resource.  This group number is assumed when no group
   is specified in the ENQ% call.  To restrict use  of  the  resource,  a
   group number other than 0 must be explicitly specified in the call.

   Consider the following example.  The resource is the  WRITE  operation
   on  a file.  There are four types of uses of this resource as shown in
   Figure 6-2.




























                                    6-17
                          ENQUEUE/DEQUEUE FACILITY


            ---------------------------------------------------
            |\            |              |                |
            | \   Process'|              |                |
            |  \  Own Use |              |                |
            |   \ of the  |              |                |
            |    \Resource|              | Not Allowed    |
            |     \       | Write        | to Write       |
            |      \      |              |                |
            |       \     |              |                |
            | Other  \    |              |                |
            | Process'\   |              |                |
            | Use of   \  |              |                |
            | Resource  \ |              |                |
            |            \|              |                |
            |-------------|--------------|----------------|
            |             | 1            | 2              |
            | Write       |              |                |
            |             | Shared,      | No Need to Use |
            |             | Group 0      | ENQ/DEQ        |
            |-------------|--------------|----------------|
            |             | 3            | 4              |
            | Not Allowed |              |                |
            | to Write    | Exclusive    | Shared,        |
            |             |              | Group 1        |
            -----------------------------------------------


   Figure 6-2:  Use of Sharer Groups


   In block 1 of the figure, the process owning the lock wishes to  allow
   all  cooperating  processes  to  also  lock  the resource (that is, to
   perform the WRITE  operation).   Therefore,  in  the  ENQ%  call,  the
   process  specifies  the  resource  can  be  locked  by all cooperating
   processes.  In block 2 of the figure, the process  does  not  plan  on
   locking  the  resource  and  does not care if other processes lock it.
   Thus, there is no need for the process to use  the  ENQ/DEQ  facility.
   In  block  3  of  the figure, the process desires to lock the resource
   exclusively and does not want other processes to lock it.   Thus,  the
   process  obtains  exclusive ownership for the resource.  In block 4 of
   the figure, the process does not want to lock the resource immediately
   but  also  does  not  want  other processes to lock it because it soon
   plans to request a lock on the resource.  If the process were the only
   one  requesting  this  type  of  use,  exclusive  ownership  would  be
   sufficient, because the resource would be  unavailable  to  others  as
   long  as  the  process  owned  the  lock.  However, if other processes
   desire this same type of use, exclusive ownership is  not  sufficient,
   because  once  one  process  releases the lock, another process with a
   different type of use could  obtain  its  own  lock.   Thus,  in  this
   example,  sharer  group 1 is defined to include all processes with the
   same type of use (that is, all processes who do not want to  lock  the
   resource immediately but also do not want other processes to lock it).


                                    6-18
                          ENQUEUE/DEQUEUE FACILITY


   This elimates the problem of another user obtaining the resource for a
   different type of use.

   Sharer group 0 should be sufficient  for  most  uses  of  the  ENQ/DEQ
   facility.  Additional groups should only be needed in those situations
   where a subset of the cooperating processes must have a  specific  use
   of a resource, as in the above example.



   6.6  AVOIDING DEADLY EMBRACES

   Processes  can  interact  in  many  undesirable   ways   if   improper
   communication   occurs   among  the  processes  or  if  resources  are
   incorrectly shared.  An example of one undesirable  situation  is  the
   occurrence  of  a  deadly embrace:  when two processes are waiting for
   each other to complete but neither one can gain access to the resource
   it needs for completion.  This situation can be avoided when processes
   consider the following guidelines.

        1.  Processes should request resources  at  the  time  they  need
            them.  If possible, processes should request resources one at
            a time and release each resource before requesting  the  next
            one.

        2.  Processes should request shared ownership whenever  possible.
            However,  the  process should not request shared ownership if
            it plans on modifying the resource.

        3.  When a process  needs  more  than  one  resource,  it  should
            request  these resources in one ENQ% call instead of multiple
            calls for each resource.  The process should also release the
            entire set of resources at once with a single DEQ% call.

        4.  When the use of one resource depends on the use of  a  second
            one,  the  process  should define the two resources as one in
            the ENQ% and DEQ% calls.  However, there is no protection  of
            the resources if they are also requested separately.

        5.  Occasionally processes use a set of resources and  require  a
            lock  on  the second resource while retaining the lock on the
            first.  In this case,  the  order  in  which  the  locks  are
            obtained  should  be  the  same  for  all users of the set of
            resources.  The same ordering of locks is accomplished by the
            processes  assigning  level  numbers  to  each resource.  The
            requirements that processes request  resources  in  ascending
            numerical  order  and  that  all processes use the same level
            number for a specific resource ensure that a  deadly  embrace
            situation will not occur.





                                    6-19
























































                                    7-1











                                 CHAPTER 7

                    INTER-PROCESS COMMUNICATION FACILITY



   7.1  OVERVIEW

   The Inter-Process Communication Facility (IPCF)  allows  communication
   among  jobs  and  system  processes.   This  communication occurs when
   processes send and receive information in the form of  packets.   Each
   sender  and  receiver  has  a  Process  ID  (PID)  assigned  to it for
   identification purposes.

   When the sender sends a packet of information to another process,  the
   packet  is placed into the receiver's input queue.  The packet remains
   in the queue until the receiver checks the  queue  and  retrieves  the
   packet.   Instead  of  periodically  checking  its  input  queue,  the
   receiver can enable the software interrupt system (refer to Chapter 4)
   to generate an interrupt when a packet is placed in its input queue.

   The  <SYSTEM>INFO  process  is  the   information   center   for   the
   Inter-Process  Communication  Facility.   This process performs system
   functions related to PIDs and names, and any process can request these
   functions by sending <SYSTEM>INFO a packet.



   7.2  QUOTAS

   Before using IPCF, the user must  acquire  the  ability  to  use  IPCF
   privileges  from  the system administrator:  a send packet quota and a
   receive packet quota.  These quotas designate, on a per process basis,
   the  number  of  sends and receives that can be outstanding at any one
   time.  For example, if the process has a send quota of two and it  has
   sent  two  packets,  it cannot send any more until at least one packet
   has been retrieved by its receiver.  A send packet quota of two and  a
   receive  packet  quota of five are assumed as the standard quotas.  If
   these quotas are zero, the process cannot use IPCF.






                                    7-1
                    INTER-PROCESS COMMUNICATION FACILITY


   7.3  PACKETS

   Information is transferred in the form of  packets.   Each  packet  is
   divided  into  two portions:  a packet descriptor block of four to six
   words and a packet data block the length of the message.   The  format
   of the packet is shown in Figure 7-1.


   Packet Descriptor Block


           !=======================================================!
   .IPCFL  !                         flags                         !
           !-------------------------------------------------------!
   .IPCFS  !                     PID of sender                     !       
           !-------------------------------------------------------!
   .IPCFR  !                    PID of receiver                    !
           !-------------------------------------------------------!
   .IPCFP  !     length of message     !    address of message     !
           !             n             !            ADR            !
           !-------------------------------------------------------!
   .IPCFD  !    sender's connected     !    sender's logged in     !
           !         directory         !         directory         !
           !-------------------------------------------------------!
   .IPCFC  !            enabled capabilities of sender             !
           !-------------------------------------------------------!
   .IPCSD  !             connected directory of sender             !
           !-------------------------------------------------------!
   .IPCAS  !               account string of sender                !
           !-------------------------------------------------------!
   .IPCLL  !              logical location of sender               !
           !=======================================================!


   Packet Data Block


           !=======================================================!
   ADR     !                    message word 1                     !
           !=======================================================!
                                   .
                                   .
                                   .
           !=======================================================!
           !                    message word n                     !
           !=======================================================!


   Figure 7-1:  IPCF Packet





                                    7-2
                    INTER-PROCESS COMMUNICATION FACILITY


   7.3.1  Flags

   There are two types of flags that can be set in  word  .IPCFL  of  the
   packet  descriptor  block.  The flags in the left half of the word are
   instructions to IPCF for packet communication, and the  flags  in  the
   right  half  are  descriptions  of the data message.  The flags in the
   right half are returned as part of the associated variable  (refer  to
   Section  7.4.2).   The  packet descriptor block flags are described in
   Table 7-1.


   Table 7-1:  Packet Descriptor Block Flags

   ______________________________________________________________________

     Bit     Symbol    Meaning
   ______________________________________________________________________

      0      IP%CFB    Do  not  block  the  process  if  there  are  no
                       messages  in  the queue.  If this bit is on, the
                       process  receives  an  error  if  there  are  no
                       messages.

      1      IP%CFS    Use the PID obtained from the  address  in  word
                       .IPCFS  of  the  packet  descriptor block as the
                       sender's PID.

      2      IP%CFR    Use the PID obtained from the  address  in  word
                       .IPCFR  of  the  packet  descriptor block as the
                       receiver's PID.

      3      IP%CFO    Allow the process one send above the send quota.
                       (The standard send quota is two.)

      4      IP%TTL    Truncate the message if it is  longer  than  the
                       area  reserved  for it in the packet data block.
                       If this bit is not on, the process  receives  an
                       error if the message is too long.

      5      IP%CPD    Create a PID to use as the  sender's  PID.   The
                       PID  created  is  returned in word .IPCFS of the
                       packet descriptor block.

      6      IP%JWP    Make the PID created be permanent until the  job
                       logs  out  (if  both  bits IP%CPD and IP%JWP are
                       on).  Make the PID created  be  temporary  until
                       the  process  executes a RESET% monitor call (if
                       bit IP%CPD is on and bit IP%JWP is not on).   If
                       bit IP%CPD is not on, bit IP%JWP is ignored.

      7      IP%NOA    Do not allow other  processes  to  use  the  PID
                       created when bit IP%CPD is on.  If bit IP%CPD is
                       not on, bit IP%NOA is ignored.

                                    7-3
                    INTER-PROCESS COMMUNICATION FACILITY


    8-17               Reserved for Digital.

     18      IP%CFP    The packet is privileged.  This bit can  be  set
                       only by a process with WHEEL capability enabled.
                       Refer to the  TOPS-20  Monitor  Calls  Reference
                       Manual for a description of this bit.

     19      IP%CFV    The packet is a page of 512 (decimal)  words  of
                       data.

     20      IP%CFZ    A zero-length message was sent.

     21                Reserved for Digital.

     22      IP%EPN    Page  number  in  word  .IPCFP  of  the   packet
                       descriptor block is 18 bits long

     23                Reserved for Digital.

     24-29   IP%CFE    Field for  error  code  returned  from  <SYSTEM>
                       INFO.

                       Code  Symbol  Meaning

                       15    .IPCPI  insufficient privileges

                       16    .IPCUF  invalid function

                       66    .IPCKM  PID has been deleted

                       67    .IPCSN  <SYSTEM>INFO needs name

                       72    .IPCFF  <SYSTEM>INFO free space exhausted

                       74    .IPCBP  PID has no name or is invalid

                       75    .IPCDN  duplicate name has been specified

                       76    .IPCNN  unknown name has been specified

                       77    .IPCEN  invalid name has been specified

     30-32   IP%CFC    System and sender code.  This code  can  be  set
                       only by a process with WHEEL capability enabled,
                       but the  monitor  will  return  the  code  so  a
                       nonprivileged process can examine it.

                       Code  Symbol  Meaning

                       1     .IPCCC  Sent by <SYSTEM>IPCF

                       2     .IPCCF  Sent by system-wide <SYSTEM>INFO


                                    7-4
                    INTER-PROCESS COMMUNICATION FACILITY


                       3     .IPCCP  Sent by receiver's <SYSTEM>INFO

                       4     .IPCCG  Sent by monitor for QUEUE% JSYS

     33-35   IP%CFM    Field for special messages.  This  code  can  be
                       set  only  by  a  process  with WHEEL capability
                       enabled, but the monitor will return the code so
                       that a nonprivileged process can examine it.

                       Code  Symbol  Meaning

                       1     .IPCFN  Process' input  queue  contains  a
                                     packet that could not be delivered
                                     to intended PID.
   ______________________________________________________________________



   7.3.2  PIDs

   Any process that wants to send or receive a packet must obtain a  PID.
   The  process  can  obtain  a  PID  by sending a packet to <SYSTEM>INFO
   requesting that a PID be assigned.  The process must  also  include  a
   symbolic name that is to be associated with the assigned PID.

   The symbolic name can be a maximum of 29 characters  and  can  contain
   any  characters  as  long  as  it is terminated by a zero word.  There
   should be mutual understanding among  processes  as  to  the  symbolic
   names  used  in  order  to  initiate  communication.  Once the name is
   defined, any process referring to that name must  specify  it  exactly
   character for character.

   Before a process can send  a  packet,  it  must  know  the  receiver's
   symbolic  name  or  PID.   If  only  the receiver's name is known, the
   sender must ask <SYSTEM>INFO for the PID  associated  with  the  name,
   since all communication is via PIDs.

   The association between a PID and a name is broken:

        1.  On a RESET% monitor call.

        2.  When the process is killed or the job logs off the system.

        3.  When a request to disassociate the PID from the name is  made
            to <SYSTEM>INFO.

   <SYSTEM>INFO will not allow a name already associated with a PID to be
   assigned  again  unless  the owner of the name makes the request.  Nor
   will <SYSTEM>INFO assign a PID once it has  been  used.   This  action
   protects  against  messages  being  sent  to  the  wrong  receiver  by
   accident.



                                    7-5
                    INTER-PROCESS COMMUNICATION FACILITY


   The PIDs of the sender and the receiver are indicated by words  .IPCFS
   and .IPCFR, respectively, of the packet descriptor block.



   7.3.3  Length and Address of Packet Data Block

   Word .IPCFP of the packet descriptor block contains the length and the
   beginning  address of the message.  The length specified is one of two
   types, depending on the type of message (refer to Section 7.3.5).   If
   the  message  is  a  short-form message, the length is the actual word
   length of the message.  If the message is  a  long-form  message,  the
   length is 1000 (octal) words, that is, one page.

   The address specified is either an address or a page number, depending
   on  the  type  of message (refer to Section 7.3.5).  When a message is
   sent, it is taken from this address.  When a message is  received,  it
   is placed in this address.



   7.3.4  Directories and Capabilities

   Words .IPCFD and .IPCFC describe the sender at the  time  the  message
   was sent and are used by the receiver to validate messages sent to it.
   These two words are not used when a message is sent, and if the sender
   of  the  packet  supplies  them,  they  are  ignored.  However, when a
   message is received, if the receiver of the packet has reserved  space
   for  these  words  in the packet descriptor block, the system supplies
   the appropriate values of the sender of the packet.  The  receiver  of
   the  packet  does  not  have  to  reserve  these  words  if  it is not
   interested in knowing the sender's directories and capabilities.



   7.3.5  Packet Data Block

   The packet data block contains the message  being  sent  or  received.
   The message can be either a short-form message or a long-form message.

   A short-form message is one to n words long, where n is defined by the
   installation.   (Usually,  n  is  assumed  to  be  10  words.)  When a
   short-form message is sent or received,  word  .IPCFP  of  the  packet
   descriptor block contains the actual word length of the message in the
   left half and the address of the first word  of  the  message  in  the
   right  half.   A  process  always  uses  the  short  form when sending
   messages to <SYSTEM>INFO.

   A long-form message is one page in length (1000 octal words).  When  a
   long-form  message  is  sent  or  received,  word .IPCFP of the packet
   descriptor block contains 1000 (octal) in the left half and  the  page
   number  of  the  message  in  the  right  half.  To send and receive a


                                    7-6
                    INTER-PROCESS COMMUNICATION FACILITY


   long-form message, both the sender and receiver must have  bit  IP%CFV
   (bit 19) set in the first word of the packet descriptor block, or else
   an error code is returned.



   7.4  SENDING AND RECEIVING MESSAGES

   To send a message, the sending process must  set  up  the  first  four
   words  of  the packet descriptor block.  The process then executes the
   MSEND% monitor call.  After execution of this call, the packet is sent
   to the intended receiver's input queue.

   To receive a message, the receiving process must also set up the first
   four words of the packet descriptor block.  The last two words for the
   directories and capabilities of the sender can be  supplied,  and  the
   system will fill in the appropriate values.  The process then executes
   the MRECV% monitor call.  After execution of this call,  a  packet  is
   retrieved from the receiver's input queue.  The input queue is emptied
   on a first-message-in, first-message-out basis.



   7.4.1  Sending a Packet

   The MSEND% monitor call is used to send a message via IPCF.   Messages
   are  in  the  form  of  packets  of  information  and can be sent to a
   specified PID or to the system process <SYSTEM>INFO.  Refer to Section
   7.5 for information on sending messages to <SYSTEM>INFO.

   The MSEND% call accepts two words of arguments.   The  length  of  the
   packet  descriptor block is given in AC1, and the beginning address of
   the packet descriptor block is given in AC2.  Thus,

        AC1:  length  of packet descriptor block.  The length  cannot  be
              less than 4.

        AC2:  address of packet descriptor block

   The packet descriptor block consists of the following four words:

        .IPCFL         Flags
        .IPCFS         Sender's PID
        .IPCFR         Receiver's PID
        .IPCFP         Pointer to packet data block containing the
                       message being sent.


   Refer to Section 7.3 for the details  on  the  packet  descriptor  and
   packet data blocks.




                                    7-7
                    INTER-PROCESS COMMUNICATION FACILITY


   The flags that are meaningful when sending a packet are  described  in
   Table 7-2.  Refer to Table 7-1 for the complete list of flag bits.


   Table 7-2:  Flags Meaningful on a MSEND% Call

   ______________________________________________________________________

     Bit      Symbol     Meaning
   ______________________________________________________________________

      0       IP%CFB     Do not block process if no messages in  queue;
                         if set, error return if no messages.

      1       IP%CFS     The sender's PID is given in  word  .IPCFS  of
                         the packet descriptor block.

      2       IP%CFR     The receiver's PID is given in word .IPCFR  of
                         the packet descriptor block.

      3       IP%CFO     Allow the sender to send one message above its
                         send quota.

      4       IP%TTL     Truncate  message   if   larger   than   space
                         reserved.

      5       IP%CPD     Create a PID for the sender and return  it  in
                         word  .IPCFS  of  the packet descriptor block.
                         The PID created is to be permanent and useable
                         by other processes according to the setting of
                         bits IP%JWP and IP%NOA.

      6       IP%JWP     The  PID  created  is  to  be  job  wide   and
                         permanent until the job logs out.  If this bit
                         is not on, the PID created is to be  temporary
                         until  the  process executes the RESET monitor
                         call.

      7       IP%NOA     The PID created is not to  be  used  by  other
                         processes.

     18       IP%CFP     The message being sent is privileged (refer to
                         the TOPS-20 Monitor Calls Reference Manual).

     19       IP%CFV     The message being sent is a long-form  message
                         (that  is,  a  page).  The page the message is
                         being sent to cannot be a shared page; it must
                         be a private page.

     22       IP%EPN     Page number  in  word  .IPCFP  of  the  packet
                         descriptor block is 18 bits long.
   ______________________________________________________________________


                                    7-8
                    INTER-PROCESS COMMUNICATION FACILITY


   When bit IP%CFS is on in the flag word, the sender's PID is taken from
   word  .IPCFS of the packet descriptor block.  This word is zero if bit
   IP%CPD is on in the flag word, indicating that a PID is to be  created
   for  the  sender.   In  this case, the PID created is returned in word
   .IPCFS.

   When bit IP%CFR is on in the flag word, the receiver's  PID  is  taken
   from  word  .IPCFR of the packet descriptor block.  If this word is 0,
   then the receiver of the message is <SYSTEM>INFO.   Refer  to  Section
   7.5 for information on sending messages to <SYSTEM>INFO.

   On successful execution of the MSEND% monitor call, the packet is sent
   to  the  receiver's input queue.  Word .IPCFS of the packet descriptor
   block is updated with the  sender's  PID.   Execution  of  the  user's
   program  continues  at  the  second  location  after  the MSEND% call.
   (MSEND%)

   If execution of the MSEND% call is not successful, the message is  not
   sent,  and  an  error  code  is returned in AC1.  The execution of the
   user's program continues at the instruction following the MSEND% call.



   7.4.2  Receiving a Packet

   The MRECV% monitor call  is  used  to  retrieve  a  message  from  the
   process'  input  queue.   Before  a process can retrieve a message, it
   must know if the message is a long-form message and also must set up a
   packet descriptor block.

   The MRECV% monitor call accepts two words of arguments.  The length of
   the packet descriptor block is given in AC1, and the beginning address
   of the packet descriptor block is given in AC2.  Thus,

        AC1:  length of  packet descriptor block.  The length  cannot  be
              less than 4.

        AC2:  address of packet descriptor block

   The packet descriptor block can consist of the following  nine  words.
   The last five words are optional, and if supplied by the receiver, the
   values of the sender will be filled in by the system.


        .IPCFL         Flags
        .IPCFS         Sender's PID
        .IPCFR         Receiver's PID
        .IPCFP         Pointer to packet data block where the message  is
                       to be placed.
        .IPCFD         Connected and logged-in directories of the sender.
        .IPCFC         Enabled capabilities of the sender.
        .IPCSD         Number of sender's connected directory.


                                    7-9
                    INTER-PROCESS COMMUNICATION FACILITY


        .IPCAS         Account string of sender.
        .IPCLL         Byte pointer for destination of sender's node.


   Refer to Section 7.3 for the details  on  the  packet  descriptor  and
   packet data blocks.

   The flags that are meaningful when receiving a packet are described in
   Table 7-3.  Refer to Table 7-1 for the complete list of flag bits.


   Table 7-3:  Flags Meaningful on a MRECV% Call

   ______________________________________________________________________

     Bit      Symbol     Meaning
   ______________________________________________________________________

      0       IP%CFB     If there are  no  packets  in  the  receiver's
                         input  queue,  do  not  block  the process and
                         return an error code if the  queue  is  empty.
                         If this bit is not on, the process waits until
                         a packet arrives, if the queue is empty.

      1       IP%CFS     Use PID referenced in word .IPCFS as  sender's
                         PID.

      2       IP%CFR     The receiver's PID is given in word .IPCFR  of
                         the packet descriptor block.

      3       IP%CFO     Allow one send request above quota.   (Default
                         send quota is 2.)

      4       IP%TTL     Truncate the message if it is larger than  the
                         space  reserved  for  it  in  the  packet data
                         block.  If this bit is not on and the  message
                         is too large, an error code is returned and no
                         message is received.

      5       IP%CPD     Create PID  for  sender  and  return  in  word
                         .IPCFS.

      6       IP%JWP     Make created  PID  job  wide  (ignored  unless
                         IP%CPD set).

      7       IP%NOA     Do not allow other processes  to  use  created
                         PID (ignored unless IP%CPD set).

     18       IP%CFP     Packet is privileged (requires IPCF capability
                         enabled).




                                    7-10
                    INTER-PROCESS COMMUNICATION FACILITY


     19       IP%CFV     The message is  expected  to  be  a  long-form
                         message  (that  is,  a  page).   The  page the
                         message is  being  stored  into  cannot  be  a
                         shared page; it must be a private page.

     22       IP%EPN     Page number  in  word  .IPCFP  of  the  packet
                         descriptor block is 18 bits long.
   ______________________________________________________________________


   The information in word .IPCFS is not supplied by  the  receiver  when
   the  MRECV%  call  is  executed.   The  system fills in the PID of the
   sender of the packet when the packet is retrieved.

   Word .IPCFR is supplied by the receiver.  If bit IP%CFR is on  in  the
   flag word, then the PID receiving the packet is taken from word .IPCFR
   of the packet descriptor block.  If bit IP%CFR is not on in  the  flag
   word, then word .IPCFR contains either -1, to receive a packet for any
   PID belonging to this process, or -2, to receive a packet for any  PID
   belonging  to  this  job.   When  -1  or  -2 is given, packets are not
   received in any particular order except that packets from  a  specific
   PID  are  received  in  the  order in which they were sent.  Any other
   values in this word cause an error code to be returned.

   The information in words .IPCFD and .IPCFC is also not supplied by the
   receiver.  If these two words have been specified by the receiver, the
   system fills in the information when the packet  is  retrieved.   Word
   .IPCFD  contains the sender's connected directory in the left half and
   the sender's logged-in directory  in  the  right  half.   Word  .IPCFC
   contains the enabled capabilities of the sender.  These words describe
   the sender at the time the message was sent.

   On successful execution of the MRECV%  monitor  call,  the  packet  is
   retrieved  and  placed into the packet data block as indicated by word
   .IPCFP of the packet descriptor block.  AC1 contains the length of the
   next  packet  in  the  queue  in the left half and flags from the next
   packet in the right half (see below).  This word returned  in  AC1  is
   called  the  associated  variable of the next packet in the queue.  If
   there  is  not  another  packet  in  the  queue,  AC1  contains  zero.
   Execution  of  the  user's program continues at the second instruction
   after the MRECV% call.

   The flags returned in the right half of AC1 on successful execution of
   the MRECV% monitor call are described in Table 7-4.










                                    7-11
                    INTER-PROCESS COMMUNICATION FACILITY


   Table 7-4:  MRECV% Return Bits

   ______________________________________________________________________

     Bit       Symbol       Meaning
   ______________________________________________________________________

     30-32     IP%CFC       System and  sender  code,  set  only  by  a
                            privileged process.  The packet was sent by
                            <SYSTEM>IPCF if the code is 1(.IPCCC).  The
                            packet   was   sent   by   the  system-wide
                            <SYSTEM>INFO if the code is 2(.IPCCF).  The
                            packet   was   sent   by   the   receiver's
                            <SYSTEM>INFO if the code is 3(.IPCCP).

     33-35     IP%CFM       Field for return of special  messages.   If
                            the  field  contains  1(.IPCFN),  then  the
                            process' input queue contains a packet that
                            was  sent  to another PID, but was returned
                            to the  sender  because  it  could  not  be
                            delivered.
   ______________________________________________________________________


   If execution of the MRECV% call is not successful,  a  packet  is  not
   retrieved, and an error code is returned in AC1.  The execution of the
   user's program continues at the instruction following the MRECV% call.



   7.5  SENDING MESSAGES TO <SYSTEM>INFO

   The <SYSTEM>INFO process is the central information utility for  IPCF.
   It  performs  functions  associated  with  names  and  PIDs,  such as,
   assigning a PID or a name or returning a name associated with a PID.

   A process can request functions to be  performed  by  <SYSTEM>INFO  by
   executing  the  MSEND%  monitor  call  (refer  to Section 7.4.1).  The
   message portion of the packet (that is, the packet data block) sent to
   <SYSTEM>INFO  contains  the  request  being made.  In other words, the
   total request to <SYSTEM>INFO is  a  packet  consisting  of  a  packet
   descriptor block and a packet data block containing the request.












                                    7-12
                    INTER-PROCESS COMMUNICATION FACILITY


   Packet Descriptor Block


           !=======================================================!
           !                       flag word                       !
           !-------------------------------------------------------!
           !                     sender's PID                      !
           !-------------------------------------------------------!
           !                           0                           !
           !-------------------------------------------------------!
           !                  pointer to request                   !
           !=======================================================!


   Packet Data Block


           !=======================================================!
           !           code            !         function          !
           !                           !                           !
           !-------------------------------------------------------!
           !                          PID                          !
           !-------------------------------------------------------!
           !                   function argument                   !
           !=======================================================!

   Refer to Section 7.4.1 for the descriptions of the words in the packet
   descriptor  block.  The receiver's PID (word .IPCFR) is 0 when sending
   a packet to <SYSTEM>INFO.



   7.5.1  Format of <SYSTEM>INFO Requests

   As mentioned previously, the packet data block (that is,  the  message
   portion) of the packet contains the request to <SYSTEM>INFO.

   The first word (word .IPCI0) contains a user-defined code in the  left
   half  and  the  function  being  requested  in  the  right  half.  The
   user-defined code is used to associate the response from  <SYSTEM>INFO
   with  the correct request.  The functions that the process can request
   of <SYSTEM>INFO are described in Table 7-5.

   The second word (word .IPCI1) contains a PID associated with a process
   that  is to receive a duplicate of any response from <SYSTEM>INFO.  If
   this word is zero, the response from <SYSTEM>INFO is sent only to  the
   process making the request.

   The third word (word .IPCI2) contains the argument  for  the  function
   specified in the right half of word .IPCI0.  The argument is different
   depending on the function being  requested.   The  arguments  for  the
   functions are described in Table 7-5.


                                    7-13
                    INTER-PROCESS COMMUNICATION FACILITY


   Table 7-5:  <SYSTEM>INFO Functions and Arguments

   ______________________________________________________________________

     Function     Argument       Meaning
   ______________________________________________________________________

      .IPCIW        name         Return the  PID  associated  with  the
                                 given name (refer to Section 7.3.2 for
                                 the description of the name).

      .IPCIG        PID          Return the name  associated  with  the
                                 given PID.

      .IPCII        name in      Assign the  given name  to  the PID
                    ASCIZ        associated with the process making the
                                 request.   The  PID  is  permanent  if
                                 IP%JWP was set in the flag  word  when
                                 the  PID was originally created (refer
                                 to Table 7-1).

      .IPCIJ        name in      Identical to .IPCII function.
                    ASCIZ
   ______________________________________________________________________



   7.5.2  Format of <SYSTEM>INFO Responses

   Responses from <SYSTEM>INFO are in the form of a packet  sent  to  the
   process  that made the request.  A copy of the response is sent to the
   PID given in word .IPCI1, if any.

   The message portion (that is, the packet data  block)  of  the  packet
   contains  the response from <SYSTEM>INFO.  The format of this response
   is

           !=======================================================!
           !           code            !         function          !
           !                           !                           !
           !-------------------------------------------------------!
           !                       response                        !
           !-------------------------------------------------------!
           !                       response                        !
           !=======================================================!

   The first word (word .IPCI0) contains the  user-defined  code  in  the
   left  half  and  the  function  that  was requested in the right half.
   These values are copied from the values given in the request.

   The second and third words  (words  .IPCI1  and  .IPCI2)  contain  the
   response from the function requested of <SYSTEM>INFO.  The response is


                                    7-14
                    INTER-PROCESS COMMUNICATION FACILITY


   different depending on the function requested.  The responses from the
   functions are described in Table 7-6.

   Table 7-6:  <SYSTEM>INFO Responses

   ______________________________________________________________________

     Function Requested     Response
   ______________________________________________________________________

          .IPCIW            The PID associated with the name  given  in
                            the request is returned in word .IPCI1.

          .IPCIG            The name associated with the PID  given  in
                            the request is returned in word .IPCI1.

          .IPCII            No response is returned.
   ______________________________________________________________________



   7.6  PERFORMING IPCF UTILITY FUNCTIONS

   A process can request various functions to be performed  by  executing
   the  MUTIL%  monitor  call.   Some of these functions are enabling and
   disabling PIDs, creating and  deleting  PIDs,  and  returning  quotas.
   Several  of  the  functions  that  can  be  requested  are  privileged
   functions.  These are described in the TOPS-20 Monitor Calls Reference
   Manual.

   The MUTIL% monitor call accepts two words of argument.  The length  of
   the  argument  block is given in AC1, and the beginning address of the
   argument block is given in AC2.

   The argument block has the following format:

           !=======================================================!
           !                     function code                     !
           !-------------------------------------------------------!
           !                 argument for function                 !
           !-------------------------------------------------------!
           !                 argument for function                 !
           !=======================================================!

   The  arguments  are  different,  depending  on  the   function   being
   requested.   Any  values  resulting  from  the  function requested are
   returned in the argument block, starting at the second word.

   Table 7-7 describes the functions that can be requested, the arguments
   for the functions, and the values returned from the functions.




                                    7-15
                    INTER-PROCESS COMMUNICATION FACILITY


   Table 7-7:  MUTIL% Functions

   ______________________________________________________________________

     Function          Meaning
   ______________________________________________________________________

     .MUENB            Allow the PID given to receive packets.  If  the
                       process  executing  the call is not the owner of
                       the PID, the process must be privileged.

                       Argument
                           PID

                       Value Returned
                           None

     .MUDIS            Disable the PID given  from  receiving  packets.
                       If  the  process  executing  the call is not the
                       owner  of  the  PID,   the   process   must   be
                       privileged.

                       Argument
                           PID

                       Value Returned
                           None

     .MUGTI            Return the PID associated with <SYSTEM>INFO.

                       Argument
                           PID or job number

                       Value Returned
                           PID of <SYSTEM>INFO

     .MUCPI            Create a private copy of  <SYSTEM>INFO  for  the
                       specified   job.   The  caller  must  have  IPCF
                       capability enabled.

                       Argument
                           PID to be assigned to <SYSTEM>INFO
                           PID or number of job creating private copy

     .MUDES            Delete the PID given.  The process executing the
                       call must own the PID being deleted.

                       Argument
                           PID to be deleted

                       Value Returned
                           None


                                    7-16
                    INTER-PROCESS COMMUNICATION FACILITY


     .MUCRE            Create a PID for the process or job  given.   If
                       the  job number given is not that of the process
                       executing  the  call,  the   process   must   be
                       privileged.  The flag bits that can be specified
                       are IP%JWP and IP%NOA (refer to  Table  7-1  for
                       their descriptions).

                       Argument
                           flag  bits  in  the  left  half, and process
                           handle or job number in the right half

                       Value Returned
                           PID that was created

     .MUSSQ            Set send and receive quotas  for  the  specified
                       PID.   The  caller  must  have  IPCF  capability
                       enabled.  The new send quota is  given  in  bits
                       18-26,  and  the  new  receive quota is given in
                       bits 27-35.  The receive quota  applies  to  the
                       specified PID, but the send quota applies to the
                       job to which that PID belongs.

                       Argumemts
                           PID
                           new quotas

     .MUFOJ            Return the number of the job associated with the
                       PID given.

                       Argument
                           PID

                       Value Returned
                           Job number associated with PID given

     .MUFJP            Return all PIDs associated with the job given.

                       Argument
                           job number or PID belonging to the job

                       Values Returned
                           Two-word entries for each PID  belonging  to
                           the job.  The first word of the entry is the
                           PID, and the second word has bits IP%JWP and
                           IP%NOA  set  if  appropriate (refer to Table
                           7-1 for the  descriptions  of  these  bits).
                           The  list  of entries returned is terminated
                           by a zero word.

     .MUFSQ            Return the send quota and the receive quota  for
                       the PID given.



                                    7-17
                    INTER-PROCESS COMMUNICATION FACILITY


                       Argument
                           PID

                       Values Returned
                           Send quota in bits 18-26 and  receive  quota
                           in bits 27-35.

     .MUFFP            Return all PIDs associated with the  process  of
                       the PID given.

                       Argument
                           PID

                       Values Returned
                           Two-word entries for each PID  belonging  to
                           the process.  The first word of the entry is
                           the PID, and the second word has bits IP%JWP
                           and  IP%NOA  set  if  appropriate  (refer to
                           Table 7-1  for  the  descriptions  of  these
                           bits).   The  list  of  entries  returned is
                           terminated by a zero word.

     .MUSPQ            Set the maximum number of PIDs allowed  for  the
                       specified   job.   The  caller  must  have  IPCF
                       capability enabled.

                       Argument
                          job number or PID
                          PID quota

     .MUFPQ            Return the maximum number of  PIDs  allowed  for
                       the job given.

                       Argument
                           Job number or PID belonging to the job

                       Value Returned
                           Number of PIDs allowed for the job given

     .MUQRY            Return the packet descriptor block for the  next
                       packet in the queue of the PID given.

                       Argument
                           PID, -1 to return the next descriptor  block
                           for  the  process,  or -2 to return the next
                           descriptor block for the job

                       Values Returned
                           Packet  descriptor  block of next packet in
                           queue.

     .MUAPF            Associate the PID given with the process given.


                                    7-18
                    INTER-PROCESS COMMUNICATION FACILITY


                       Arguments
                           PID
                           process handle

                       Value Returned
                           None

     .MUPIC            Place the specified PID on a software  interrupt
                       channel.  An interrupt is then generated when:

                       1.  The MUPIC function is issued while  the  PID
                           has  one  or  more  messages  in its receive
                           queue.

                       2.  The PID's receive queue  changes  its  state
                           from   empty   to   containing   a  message.
                           Subsequent entries to a queue  that  is  not
                           empty do not cause an interrupt.

                       If the channel number is given as -1, the PID is
                       removed from its current channel.

                       The calling process and the  process  that  owns
                       the specified PID must belong to the same job.

                       Arguments
                           PID
                           channel number

     .MUDFI            Set the PID of <SYSTEM>INFO.  An error is  given
                       if  <SYSTEM>INFO  already has a PID.  The caller
                       must have IPCF capability enabled.

                       Arguments
                           PID of <SYSTEM>INFO

     .MURSP            Return a PID from the system PID table.  The PID
                       is  returned  in  word  2 of the argument block.
                       The system PID table currently has the following
                       entries:

                         0  .SPIPC  Reserved for Digital
                         1  .SPINF  PID of <SYSTEM>INFO
                         2  .SPQSR  PID of QUASAR
                         3  .SPMDA  PID of QSRMDA
                         4  .SPOPR  PID of ORION

                       Argument

                           index into system PID table




                                    7-19
                    INTER-PROCESS COMMUNICATION FACILITY


     .MUMPS            Return the  maximum  packet  size  for  the  PID
                       given.

                       Argument
                           PID

                       Value Returned
                           Maximum packet size for PID

     .MUSKP            Set PID to receive deleted PID messages.  Allows
                       a  controller  task to be notified if one of its
                       subordinate tasks crashes.  After this  function
                       is  performed,  if  the  subordinate PID is ever
                       deleted  (via  RESET   or   the   .MUDES   MUTIL
                       function), the monitor will send an IPCF message
                       to the controlling PID  notifying  it  that  the
                       subordinate  PID has been deleted.  This message
                       contains .IPCKP in word 0 and the deleted PID in
                       word 1.

                       Argument
                           Source (subordinate) PID
                           Object (controller) PID

     .MURKP            Return controlling PID for this subordinate PID.

                       Argument
                           Source (subordinate) PID
                           Object (controller) PID (returned)
   ______________________________________________________________________


   On successful completion of the  MUTIL%  monitor  call,  the  function
   requested  is performed, and any value is returned are in the argument
   block.  Execution of  the  user's  program  continues  at  the  second
   location following the MUTIL% call.

   If execution  of  the  MUTIL%  monitor  call  is  not  successful,  no
   requested  function is performed and an error code is returned in AC1.
   Execution of the user's program continues at  the  location  following
   the MUTIL% call.













                                    7-20











                                 CHAPTER 8

                         USING EXTENDED ADDRESSING



   The term "extended addressing" refers to the  size  of  the  addresses
   that  TOPS-20 uses on the DECSYSTEM-20 Extended KL10 processor.  Older
   versions of TOPS-20 (Release 4.1 and before)  used  18-bit  addresses;
   newer versions (Release 5 and after) use 30-bit addresses.

   This chapter discusses the two main activities associated  with  using
   TOPS-20 monitor calls with extended addressing:

        1.  Writing new programs for  execution  in  sections  of  memory
            other than section 0

        2.  Converting existing programs so that they can be executed  in
            sections other than section 0

   This chapter also contains information on  hardware  instructions  and
   macros useful to MACRO programmers who use extended addressing.

   The discussion in this chapter depends heavily on the material in  the
   DECsystem-10/DECSYSTEM-20  Processor  Reference Manual.  Refer to that
   manual for a description  of  the  format  of  30-bit  addresses,  the
   algorithm the processor uses to calculate effective addresses, and the
   way that individual machine instructions work.



   8.1  OVERVIEW

   The TOPS-20 extended address space  contains  32  (decimal)  sections.
   Each  section  contains  512 pages of 512 words each (256K words).  An
   18-bit address, called a local address, can reference any  word  in  a
   given section.  A 30-bit, or global, address can reference any word in
   any section of memory.

   In contrast, TOPS-20 V4.1 and earlier provided  an  18-bit,  256K-word
   address  space.   The  Program Counter (PC) register was 18 bits.  For
   each instruction executed, the first action taken was the  computation
   of  an  18-bit  effective  address.  The algorithm for calculating the


                                    8-1
                         USING EXTENDED ADDRESSING


   effective address (including indexing and indirecting rules)  was  the
   same for all instructions.

   Because the TOPS-20 virtual address space is limited to  32  sections,
   and  section  numbers  longer than 5 bits are illegal, legal addresses
   are effectively limited to 23 bits.  When  addressing  data,  you  can
   view this 32-section address space as one large memory area.

   From the point of  view  of  program  execution,  however,  memory  is
   divided  into  32  discrete sections.  A program can have code in more
   than one section of memory, and it can execute that code (assuming the
   constraints  discussed below), but it must change sections explicitly,
   as discussed below.

   Compatibility for existing programs  is  provided  by  section  0.   A
   program  running in section 0 behaves as though it were being executed
   on  a  system  without  extended  addressing,   except   for   certain
   instructions  such  as XJRSTF.  For more information on the actions of
   specific instructions,  see  the  DECsystem-10/DECSYSTEM-20  Processor
   Reference Manual.



   8.2  ADDRESSING MEMORY AND ACS

   The  extended   format   PC   contains   a   section   field   and   a
   word-within-section  field.  When an instruction is executed, only the
   word field is incremented.  Column overflow is never carried from  the
   word  field  to  the  section field.  If the last word of a section is
   executed, and it is not a jump instruction, then the next  instruction
   is  fetched  from word 0 of the same section.  Thus a program can only
   change sections explicitly, by means of a PUSHJ, JRST, XJRST or XJRSTF
   instruction,  and  only  an XJRST or an XJRSTF can change control from
   section 0 to another section.

   Because a whole word cannot contain a 30-bit address and  the  program
   flags,  the  PC and flags are a two-word entity.  The flag bits are in
   the first word, and the  figure  below  represents  the  second  word.
   Figure 8-1 shows the format of the address fields of the PC.


             0     5 6              17 18                    35
             --------------------------------------------------
             ! un-  !      section   !    word-within-        !
             ! used !      number    !    section             !
             --------------------------------------------------


   Figure 8-1:  Program Counter Address Fields





                                    8-2
                         USING EXTENDED ADDRESSING


   The word (word-within-section) field consists  of  18  bits  and  thus
   represents  a  256K-word  address  space similar to the single-section
   address space of release 4 and earlier.  The section number  field  is
   12 bits, of which only the right-hand five bits can be nonzero because
   section numbers greater than 31 are illegal.  The leftmost seven  bits
   of  the  section  number  field  must  be zero.  This provides room to
   address 32 separate sections, each of 256K words.

   Each section is further divided into pages of 512 words,  just  as  in
   earlier   releases.   The  paging  facilities  allow  the  monitor  to
   determine the existence and protection of each section.

   The PC section field determines what section a program is running  in.
   If  the section field contains zero, the program is running in section
   0.  Most extended addressing features are not available to  a  program
   running  in  section  0.   All  quantities (including addresses), when
   calculated from section 0, are considered to be local (18 bits).

        1.  A program executing in section 0 cannot address memory in any
            other   section.   (One-word  global  byte  pointers  are  an
            exception to this rule.  Refer to Chapter 1  of  the  TOPS-20
            Monitor Calls Reference Manual for more information.)

        2.  The program cannot jump from section  0  to  another  section
            unless  it  uses  a  monitor  call  or  the  XJRST  or XJRSTF
            instruction.

        3.  The program runs exactly as it would run on a machine without
            extended addressing.

   If the section  field  contains  a  number  from  1  to  31  (decimal)
   inclusive,  the  program  is executing in a nonzero section (a section
   other than section 0).  The hardware  considers  addresses  to  be  30
   bits, and the program can use extended addressing features.

   A local address is defined as an 18-bit address in the same section as
   the  program  counter  (PC)  of  the instruction.  Local addresses are
   relative to the PC section.  A global address  is  a  30-bit  address,
   which therefore supplies its own section number.

   The following paragraphs  explain  the  way  effective  addresses  are
   calculated  in  nonzero sections.  In addition, see the description in
   the DECsystem-10/DECSYSTEM-20 Processor Reference Manual.



   8.2.1  Instruction Format

   The format of a machine instruction is the same as  on  an  unextended
   machine.   The  effective  address  calculation depends on the address
   field (Y, 18 bits), the index field (X,  4  bits),  and  the  indirect
   field (I, 1 bit).  Figure 8-2 shows these fields.


                                    8-3
                         USING EXTENDED ADDRESSING


             0       8 9  12  13 14   17 18                   35
             ---------------------------------------------------
             !        !     !   !       !                      !
             ! OPCODE ! AC  ! I !   X   !           Y          !
             !        !     !   !       !                      !
             ---------------------------------------------------


   Figure 8-2:  Instruction Word Address Fields


   If  I  and  X  are  0,  the  instruction  uses  neither  indexing  nor
   indirection,  so  the  effective  address is Y (18 bits).  The section
   number, since it is not specified in the address, is  taken  from  the
   section  field of the PC.  The PC section field contains the number of
   the section from which the instruction was fetched.   Such  an  18-bit
   address is called a local address.

   The following is an example of an instruction whose I, X and Y  fields
   evaluate to an 18-bit effective address.

        3,,400/    MOVEM T,1000

   The effective address is  word  1000  of  the  current  section.   The
   section  from  which  the  instruction is fetched is section 3, so the
   instruction moves the contents of register T into memory word 3,,1000.



   8.2.2  Indexing

   The first step in the effective address calculation is  indexing.   If
   the  X  field  is  nonzero,  indexing is used.  The calculation of the
   effective address then depends on the contents of the specified  index
   register.  Indexing may be local or global as follows:

         o  If the left half of the index register  contains  a  negative
            number  or  zero, the contents of the right half (bits 18-35)
            are added to Y (from the instruction word) to yield an 18-bit
            local address.

            This is the way indexing is done on  an  unextended  machine.
            It  allows a program to use the usual AOBJN pointer and stack
            pointer formats for tables and stacks that are  in  the  same
            section as the program.  Note, however, that if the left half
            of the index register contains a positive number, the results
            are not the same.

         o  If the left half of the index register  contains  a  positive
            number,  the  contents of bits 6-35 of the register are added
            to Y to yield a 30-bit global address.



                                    8-4
                         USING EXTENDED ADDRESSING


            This means that instructions can  reference  30-bit  (global)
            addresses  by  means of an index register.  If the Y field is
            0, the instruction refers to the address contained in X.  The
            Y  field  can  contain  a  positive  or  negative  offset  of
            magnitude less than 2^17.



   8.2.3  Indirection

   If the I field contains 1, the instruction specifies indirection.   An
   indirect  word is fetched from the address determined by Y and X.  Two
   types of indirect word exist, Instruction Format Indirect Word  (IFIW)
   and  Extended  Format Indirect Word (EFIW).  They are described in the
   following section.



   8.2.3.1  Instruction Format Indirect Word (IFIW) - This word  contains
   Y,  X,  and  I  fields  of  the  same size and in the same position as
   instructions (in bits 13-35).  Bit 0 must be 1, and bit 1 must  be  0;
   bits 2-12 are not used.

   Figure 8-3 shows an instruction format indirect word.


              0 1 2         12 13 14  17 18                     35
             -----------------------------------------------------
             ! ! !            !  !     !                         !
             !1!0! (not used) !I !  X  !             Y           !
             ! ! !            !  !     !                         !
             -----------------------------------------------------


   Figure 8-3:  Instruction Format Indirect Word



   The effective address calculation continues  with  the  quantities  in
   this  word  just  as  for  the  original instruction.  Indexing can be
   specified and can be local or global depending on the left half of the
   index.  Further indirection can also be specified.

   Note that the default section for any local  addresses  produced  from
   this  indirect  word  is  the  section  from which the word itself was
   fetched.  This means that the default section can  change  during  the
   course of an effective address calculation that uses indirection.  The
   default section is always the section from which the last address word
   was fetched.





                                    8-5
                         USING EXTENDED ADDRESSING


   8.2.3.2  Extended  Format  Indirect  Word  (EFIW) - This   word   also
   contains  Y,  X,  and I fields, but in a different format.  Figure 8-4
   shows an extended format indirect word.


              0 1 2   5 6            17 18                     35
             -----------------------------------------------------
             ! ! !     ! <-------------!- Y -------------------> !
             !0!I!  X  !   (section)   !          (word)         !
             ! ! !     !               !                         !
             -----------------------------------------------------


   Figure 8-4:  Extended Format Indirect Word


   If indexing is specified in this indirect word (bits 2-5 nonzero), the
   contents  of  the  entire  index register are added to the 30-bit Y to
   produce a global address.  This type of indirect word never produces a
   local  address.   The type of address calculation used does not depend
   on the contents of the index register specified in the X field.

   Hence either Y or Y(X) can be used as an address or an  offset  within
   the  extended  address  space,  just  as is done in the 18-bit address
   space.  If further indirection is specified  (bit  1  set),  the  next
   indirect word is fetched from Y as modified by indexing (if any).  The
   next indirect word can be in instruction format  or  extended  format,
   and  its  interpretation does not depend on the format of the previous
   indirect word.



   8.2.3.3  Macros for Indirection - The system file MACSYM.MAC  contains
   several  convenient  macros  for  constructing  indirect words.  Macro
   LFIWM generates local (instruction format) indirect words.   Both  the
   macros EP.  and GFIWM may be used to generate global (extended format)
   indirect words.



   8.2.4  AC References

   A local address in the range 0-17 (octal) references the hardware  ACs
   as memory.  This is true in every section of memory.

   A global address in section 1 in the range 1,,0 to 1,,17 (octal)  also
   refers  to  the  hardware  ACs.  A global address in any other section
   refers to memory.  This means that the following behavior occurs.

        1.  Addresses in the range 0-17 reference ACs as  expected.   The
            instruction

                 MOVE 2,3

                                    8-6
                         USING EXTENDED ADDRESSING


            fetches the contents of hardware  register  3  regardless  of
            what section the instruction executes in.

        2.  To make a global reference to an AC, the global address  must
            contain a section number of 0 or 1.

        3.  Arrays  can  cross  section  boundaries.   Global   addresses
            specifying  any  section  except  section  1  always refer to
            memory,  never  to  the  hardware  ACs.   For  this   reason,
            incrementing  the  address  6,,777777,  for  example,  yields
            address 7,,000000, which is a memory location.

        4.  The ACs are regarded as local to any section; a local address
            (0-17)  references  the  ACs from any section.  Hence, a jump
            instruction which yields a local effective address of 0-17 in
            any section will cause code to be executed from the ACs.



   8.2.5  Extended Addressing Examples

   These  instructions  make  local  references  within  the  current  PC
   section:

             3,,400/   MOVE T,1000              ; fetches from 3,,1000
                       JRST 2000                ; jumps to 3,,2000

   The following instructions scan table TABL, which is  in  the  current
   section:

                       MOVSI X,-SIZ
             LP:       CAMN T,TABL(X)           ; TABL in current section
                       JRST FOUND
                       AOBJN X,LP

   The following instructions scan table TABL, which is in section  TSEC,
   by using a global address:

                       MOVEI X,0
             LP:       CAMN T,@[GFIWM TSEC,TABL(X)] ; extended format
                       JRST FOUND
                       CAIGE X,SIZ-1
                       AOJA X,LP

   Similarly, the EP.  macro can be used for the same purpose:

                       MOVEI X,0
             LP:       CAMN T,@[EP.<TSEC>B17!TABL(X)]
                       JRST FOUND
                       CAIGE X,SIZ-1
                       AOJA X,LP



                                    8-7
                         USING EXTENDED ADDRESSING


   The following examples illustrate  various  aspects  of  indexing  and
   indirection in effective address calculation:

             4/100
             6,,1000/MOVE 1,@2000
             6,,2000/LFIWM @4000
             6,,4000/LFIWM 200(4)

             Effective address = 300 in section 6


             6,,SUB/   MOVE 1,@[LFIWM @ZZZ]

             6,,ZZZ:   LFIWM @XXX
             XXX:      LFIWM ARRAY(4)

             Effective address = ARRAY+100 in section 6


             6/14,,ADDRX
             11,,ROU/MOVE 1,@[LFIWM (6)]

             14,,ADDRX: LFIWM 100

             Effective address = 14,,100




   8.2.6  Immediate Instructions

   Each effective address calculation yields a 30-bit address, defaulting
   the  section  if  necessary.   Immediate  instructions  use  only  the
   low-order 18 bits of this as  their  operand,  however,  and  set  the
   high-order  18  bits  to  0.  Hence instructions such as MOVEI and CAI
   produce identical results regardless of the section in which they  are
   executed.

   Two immediate instructions retain the section field of their effective
   addresses.  These are:

         o  XMOVEI (opcode 415) Extended Move Immediate

         o  XHLLI (opcode 501) Extended Half Word Left to Left Immediate



   8.2.6.1  XMOVEI - The XMOVEI instruction loads  the  30-bit  effective
   address  into  the  AC,  and  sets  bits  0-5 to 0.  If no indexing or
   indirection is used, the number of the current section is copied  from
   the  PC  to  the AC.  This instruction can replace MOVEI when a global
   address is needed.


                                    8-8
                         USING EXTENDED ADDRESSING


   The following example shows the use of the  XMOVEI  instruction  in  a
   subroutine  call.  The subroutine is in section XSEC, but the argument
   list is in the same section as the calling program.

        XMOVEI AP,ARGLIST
        PUSHJ P,@[GFIWM XSEC,SUBR]

   The  subroutine  can  reference  the  arguments  with  the   following
   instruction.

        MOVE T,@1(AP)

   To construct the addresses of arguments, the subroutine  can  use  the
   following instruction.

        XMOVEI T,@2(AP)

   The last  two  instructions  assume  that  register  AP  contains  the
   argument  list  pointer.  If the address the calling program placed in
   AP is an IFIW, the section number in the effective address is that  of
   the  calling program.  If the address the calling program placed in AP
   is an EFIW, the  section  number  in  the  effective  address  of  the
   argument block is determined by the section number the calling program
   placed in AP.

   The argument list would be found in the caller's  section  because  of
   the  global  address  in  AP.  The section of the effective address is
   determined by the caller, and is implicitly the same as the caller  if
   an  IFIW  is used as the arglist pointer, or is explicitly given if an
   EFIW is used.



   8.2.6.2  XHLLI - The XHLLI instruction replaces the left half  of  the
   accumulator  with the section number of the PC, and places zero in the
   right half of the AC.  This instruction  is  useful  for  constructing
   global addresses.



   8.2.7  Other Instructions

   The instructions discussed here are affected by  extended  addressing,
   but  not  necessarily  in  the  way that their effective addresses are
   calculated.  In addition to  the  material  presented  here,  see  the
   DECsystem-10/DECSYSTEM-20  Processor  Reference  Manual  regarding the
   following instructions:  LUUOs, BLT, XBLT, XCT,  XJRSTF,  XJEN,  XPCW,
   SFM.






                                    8-9
                         USING EXTENDED ADDRESSING


   8.2.7.1  Instructions that  Affect  the  PC - These  instructions  are
   PUSHJ,  POPJ,  JRST.   PUSHJ stores a 30-bit PC address, but stores no
   flags.  It sets bits 0-5 of the destination word to 0.

   POPJ restores a 30-bit PC address from the stack, but does not restore
   the flags.  It also sets bits 0-5 of the destination word to 0.

   The JSA and JRA instructions can be used only within  a  section.   In
   section  0  the  JSP and JSR instructions can store flags,,PC but then
   cannot transfer out of section 0.  The JSP and  JSR  instructions  can
   store  flags,,PC  in  nonzero  sections and then can transfer into any
   other  section  (if  the  address  is  specified  with   indexing   or
   indirection).



   8.2.7.2  Stack  Instructions - PUSHJ,  POPJ,  PUSH,  POP,  and  ADJSP.
   These  instructions  use  a  local  or  global  address  for the stack
   according to the contents of the stack  pointer.   Whether  the  stack
   address  is  local  or  global depends on the same rules as those that
   govern  indexing  in  effective  address  calculation.   (See  section
   8.2.2.)  It  is  always best to use the ADJSP instruction when working
   with stacks.  This instruction works in any section and will  indicate
   when a pushdown overflow error occurs.

   In brief, if the left half of the stack pointer is  zero  or  negative
   (prior  to  incrementing  or  decrementing),  the pointer references a
   local address and the address in its right half is the address of  the
   current  item  in  the  stack.   The  stack  pointer is incremented or
   decremented  by  adding  or   subtracting   one   from   both   sides,
   respectively.

   If the left half of the stack pointer is positive, the entire word  is
   taken as a global address.  The stack pointer is incremented by adding
   1, and decremented by subtracting 1.

   A stack that contains global addresses can be  used  the  same  way  a
   local  stack is used.  The global stack, however, can contain pointers
   to routines in other sections.

   To protect against stack overflow and underflow, make the pages before
   and  after the stack inaccessible.  This method must be used because a
   global stack has no room for a count in the left half of the pointer.



   8.2.7.3  Byte Instructions - To reference a byte in  another  section,
   you  must  use  either a one-word, or a two-word, global byte pointer.
   Both global and local byte pointers are  legal  arguments  to  monitor
   calls from nonzero sections but there are some restrictions on the use
   of one-word global byte pointers from section 0.  See Section 8.3  for
   further information.


                                    8-10
                         USING EXTENDED ADDRESSING


   Chapter 1 of the TOPS-20  Monitor  Calls  Reference  Manual  describes
   one-word   global   byte   pointers.    The  DECsystem-10/DECSYSTEM-20
   Processor Reference Manual describes two-word global byte pointers.



   8.3  USING MONITOR CALLS

   If a program runs in a single section, even though that section is not
   section  0,  most  monitor  calls  execute  exactly the way they do in
   section 0.  This is because when no section number is  specified,  the
   current section is the default.

   The GTFDB% call, for example, requires that AC3 contain the address of
   the  block  in  which  to store the data it obtains from the file data
   block.  This address can be  an  18-bit  address  regardless  of  what
   section the monitor call is made from.  When the monitor sees that the
   address is local, it obtains the section number from  the  PC  of  the
   process that makes the call.

   The same is true of calls that accept page numbers.  If a  9-bit  page
   number  is  passed  as  an  argument,  the monitor obtains the section
   number from the PC of the process that made the call.   Monitor  calls
   arguments  are  discussed  in  Chapter  1 of the TOPS-20 Monitor Calls
   Reference Manual.

   It is sometimes desirable to  specify  addresses  in  section  0  when
   executing  a  JSYS  from a nonzero section.  The bit PM%EPN for PMAP%,
   and FH%EPN for JSYSs that accept fork  handles,  prevent  the  current
   section  (the  section  in  which a program is running) from being the
   target section for the monitor call's arguments.

   Another restriction on arguments passed to monitor calls  executed  in
   sections  other  than section 0 concerns universal device designators,
   which have  the  format  5xxxxx,,xxxxxx  or  6xxxxx,,xxxxxx  (.DVDES).
   Universal  device designators are not legal except in section 0.  This
   is because of the existence of one-word global  byte  pointers,  which
   can have the same format.

   Thus monitor calls that accept either a device designator  or  a  byte
   pointer  when  called  from  section  0 do not accept universal device
   designators in any other section.  Other device designators,  such  as
   .TTDES  (0,,4xxxxx),  can  be  used in any section.  Conversely, these
   monitor calls that can accept either universal device  designators  or
   byte  pointers  do not accept one-word global byte pointers in section
   0.

   The calls SIR% and RIR% should not be  used  in  sections  other  than
   section  0.   These  calls work in other sections only if all the code
   associated with these calls exists in the same  section  as  the  code
   that makes the call.



                                    8-11
                         USING EXTENDED ADDRESSING


   For example, if an SIR% call is executed in  section  4,  it  executes
   correctly  if  and only if the code that generates the interrupts, the
   interrupt-processing routines, and  all  associated  tables  are  also
   located  in section 4.  Thus, in programs intended to run in a section
   other than section 0, the XSIR% and XRIR% calls, described in  Chapter
   4,  should  be  used  in  place  of  SIR% and RIR%.  In general, it is
   recommended that the extended form of monitor calls be used since this
   form works in any section, including section 0.



   8.3.1  Mapping Memory

   The PMAP% monitor call accepts an 18-bit page number, half of which is
   a  section  number.   Thus  PMAP%  can  be used to map a page from one
   section to another.  If the destination section does not  exist,  that
   section will be created.

   The SMAP% monitor call maps one or more sections of memory.  It  works
   like  the  PMAP  call,  but  maps  sections  instead of pages.  If the
   destination section does not exist, SMAP% creates the section.

   Access to the sections in a process map  is  determined  by  the  same
   algorithm that determines access to a page within a given section.  If
   a process section and a page in that section have different  accesses,
   the  access  privileges  are  ANDed  together.  The process requesting
   access to the page gains access only if it has access rights at  least
   equal to the ANDed protections.

   For example, if a process has read access to a section and maps a page
   into that section for which the process has read and write access, the
   page is mapped, but the process gets only read access  to  the  mapped
   page.

   The following sections describe the SMAP% functions.



   8.3.1.1  Mapping File Sections to a Process - This function  maps  one
   or  more sections of a file to a process.  All pages that exist in the
   source sections are mapped to the destination sections.  Access to the
   mapped  pages  is  determined by ANDing the access allowed to the file
   and the access specified in the SMAP% call.

   Although files do not actually have section boundaries,  this  monitor
   call  views  them  as  having  sections that consist of 512 contiguous
   pages.  Each file section starts with a page number that is an integer
   multiple of 512.

   This call cannot map a process memory section to a  file.   To  map  a
   process  section  to  a  file,  use  the PMAP% monitor call to map the
   section page-by-page.


                                    8-12
                         USING EXTENDED ADDRESSING


   This function of the SMAP% call requires three words of arguments,  as
   follows:

        AC1: source identifier:  JFN,,file section number

        AC2: destination identifier:  fork handle,,process section number

        AC3: flags,,count

   The flags determine access to the destination section, and  the  count
   is  the number of contiguous sections to be mapped.  The count must be
   between 0 and 37 (octal).  The flags are as follows.

        B2(SM%RD)   Allow read access

        B3(SM%WR)   Allow write access

        B4(SM%EX)   Allow execute access

        B18-35      The number of sections to map.  This number  must  be
                    between 1 and 37 (octal).



   8.3.1.2  Mapping Process Sections to  a  Process - The  SMAP%  monitor
   call  also  maps  sections  from  one  process to another process.  In
   addition, you can map one section of a process to another  section  of
   the  same  process.   The  SMAP% call maps all pages that exist in the
   source section to corresponding pages in the destination section.

   If you map a source section into a  destination  section  with  SM%IND
   set,  SMAP% creates the destination section using an indirect pointer.
   This means that the destination section will contain  all  pages  that
   exist in the source section, and the contents of the destination pages
   will be identical to the contents of the source pages.

   Furthermore, after SMAP% has mapped the destination  section,  changes
   that occur in the source section map cause the same changes to be made
   in the destination section map.  This ensures  that  both  the  source
   section and the destination section contain the same data.

   If SM%IND is not set, SMAP% creates the new  section  using  a  shared
   pointer.  After SMAP% maps the destination section, changes that occur
   in the source section's map do not cause any change in the destination
   section's  map.   Thus  after  a short time the source and destination
   sections might contain different data.

   If you request a shared pointer (SM%IND not set)  to  the  destination
   section,  what  happens  depends on the contents of the source section
   when the SMAP% call executes.  The outcome is one of the following.




                                    8-13
                         USING EXTENDED ADDRESSING


        1.  If the source section does not exist, the SMAP% call  creates
            the section.

        2.  If the source is a private section, a mapping to the  private
            section  is  established,  and  the  destination  process  is
            co-owner of the private section.

        3.  If the source section contains a  file  section,  the  source
            section is mapped to the destination section.

        4.  If the source section map is made by  means  of  an  indirect
            section  pointer, SMAP% follows that pointer until the source
            section is found to be nonexistent, a private section,  or  a
            section of a file.

   This SMAP% function requires three words of arguments in  AC1  through
   AC3.

        AC1:   Source identifier:  fork handle,,section number

        AC2:   Destination identifier:  fork handle,,section number

        AC3:   access flags,,the number of contiguous sections to map.

               The number of sections mapped, the  number  in  the  right
               half of AC3, must be between 1 and 37.

               The flags determine access  to  the  destination  section.
               The flags are as follows:

               B2(SM%RD)   Allow read access

               B3(SM%WR)   Allow write access

               B4(SM%EX)   Allow execute access

               B6(SM%IND)  Map the destination section using an  indirect
                           section pointer.  Once the destination section
                           map is created, the indirect  section  pointer
                           causes  the  destination section map to change
                           in  exactly  the  same  way  that  the  source
                           section map changes.

               B18-35      Count of the number of contiguous sections  to
                           be mapped.



   8.3.1.3  Creating Sections - Before you can use a nonzero  section  of
   memory,  you  must  create  it.   If your program references a nonzero
   section of memory that does  not  exist  (that  is  not  mapped),  the
   instruction that makes the reference fails.


                                    8-14
                         USING EXTENDED ADDRESSING


   This SMAP% function requires three words of arguments in  AC1  through
   AC3, as follows:

        AC1:   0

        AC2:   destination identifier:  fork handle,,section number

        AC3:   flags,,count

   The flags determine access to the destination section, and  the  count
   is  the  number  of  contiguous  private sections to be created.  This
   count must be between 1 and 37.

   The flags in the left half of AC3 are as follows:

        B2(SM%RD)      Allow read access

        B3(SM%WR)      Allow write access

        B4(SM%EX)      Allow execute access

        B6(SM%IND)     Create the section using an indirect pointer

        B18-35         The number of sections  to  create.   This  number
                       must  be  between  1 and 37.  All created sections
                       are contiguous.



   8.3.1.4  Unmapping a Process Section - You can use the  SMAP%  monitor
   call  to  unmap  one  or  more  sections  of memory in a process.  The
   contents of the section are lost.

   If the section contains pages mapped from a file, this  function  does
   not  cause  the  unmapped sections to be written back to the file from
   which they were mapped.  Such pages must be  mapped  to  the  file  by
   means of the PMAP% call.

   This function requires three words of arguments in AC1 through AC3, as
   follows.

        AC1:   -1

        AC2:   Destination identifier:  fork handle,,section number

        AC3:   0,,count
               The count is the  number  of  contiguous  sections  to  be
               unmapped.  This number must be between 1 and 37.






                                    8-15
                         USING EXTENDED ADDRESSING


   8.3.2  Starting a Process in Any Section

   You can use most of the  calls  described  in  Chapter  5  to  control
   programs that run in a nonzero section.  The SFORK% monitor call is an
   exception, and will not start a program in a nonzero section.

   The XSFRK% monitor call starts a process in any section of memory.  If
   the  process  is  frozen (by means of the FFORK% call), XSFRK% changes
   the double-word PC, but does not resume execution of the process.   To
   resume the execution of any frozen fork, use the RFORK% call.

   The XSFRK% call requires three words of arguments in AC1 through AC3.

        AC1:   flags,,process handle

               Flags:

                    SF%CON(1B0)    continue a process  that  has  halted.
                                   If  SF%CON  is set, the address in AC3
                                   is ignored and the  process  continues
                                   from where it was halted.

        AC2:   PC flags,,0

        AC3:   address to which this call is to set the PC

   The XSFRK% call also starts a process in section 0.  To do so, set the
   left  half  of AC3 to zero and the right half of AC3 to the address in
   section 0 at which you want the process to start.

   Most other calls consider an address with a zero in the left  half  to
   be  a  local  address.  The XSFRK% call, however, uses the contents of
   AC3 to set the PC.  A PC with zero  in  the  left  half  indicates  an
   address in section 0.



   8.3.3  Setting the Entry Vector in Any Section

   The SEVEC% monitor call has room  in  its  argument  ACs  for  only  a
   half-word  address, so it cannot be used to set a process entry vector
   to an address in a nonzero section.  The XSVEC%  call,  on  the  other
   hand,  uses  an AC for the address of the entry vector, and another AC
   for the length of the entry vector, and can specify an entry vector in
   any section of memory.

   The XSVEC% call requires three words of arguments in AC1 through AC3.

        AC1:   process handle
        AC2:   length of the entry vector, or 0
        AC3:   address of the beginning of the entry vector



                                    8-16
                         USING EXTENDED ADDRESSING


   The length of the entry vector specified in AC2 must be less than 1000
   words.   If  AC2  contains  0, TOPS-20 assumes a default length of two
   words.



   8.3.4  Obtaining Information About a Process

   Although the monitor calls described in Chapter 5 work in any  section
   of  memory,  several  of  them  can  only return information about the
   section in which they are executed.  The following paragraphs describe
   the  monitor calls you can use to obtain information about any section
   of memory.



   8.3.4.1  Memory  Access  Information - Several  kinds  of  information
   about  memory are important.  Among them are whether a page or section
   exists (is mapped), and, if so, what the access to a page  or  section
   is.  The RSMAP% and XRMAP% calls provide this information.

   The RSMAP% monitor call reads a section map, and provides  information
   about  the  mapping  of one section of the address space of a process.
   RSMAP% requires one word of arguments in AC1:  a fork  handle  in  the
   left  half,  and  a  section number in the right half.  It returns the
   access information in AC2.

   The map information that RSMAP% returns in AC1 can be the following:

        -1     no current mapping present (the section does not exist)

        0      the mapping is a private section

        n,,m   where n is a fork handle or a JFN,  and  m  is  a  section
               number.  If n is a fork handle, the mapping is an indirect
               or shared mapping to another fork's section.  If  n  is  a
               JFN, the mapping is a shared mapping to a file section.

   The access information bits returned in AC2 are the following:

        B2(SM%RD)   Read access is allowed

        B3(SM%WR)   Write access is allowed

        B4(SM%EX)   Execute access is allowed

        B5(PA%PEX)  The section exists

        B6(SM%IND)  The section was created using an indirect pointer.





                                    8-17
                         USING EXTENDED ADDRESSING


   Although the RSMAP% call does not  return  information  on  individual
   pages,  the  data it does return is useful in preventing error returns
   from the XRMAP% monitor call.

   The XRMAP% call returns access information on a page or group of pages
   in any section of memory.  Although the RMAP% call returns access data
   about a page in the current section, and you can use the  RSMAP%  call
   in  any  section  of  memory,  you  must use the XRMAP% call to obtain
   information about pages in any section other than the current section.

   The XRMAP% call requires two words of arguments in AC1 and AC2.

        AC1:   process handle,,0

        AC2:   address of the argument block

   The argument block addressed by AC2 has the following format:

          !=======================================================!
          !   Length of the argument block, including this word   !
          !=======================================================!
          ! number of pages in this group on which to return data !
          !-------------------------------------------------------!
          !        number of the first page in this group         !
          !-------------------------------------------------------!
          !       address at which to return the data block       !
          !=======================================================!
          \                           .                           \
          \                           .                           \
          \                           .                           \
          !=======================================================!
          ! number of pages in this group on which to return data !
          !-------------------------------------------------------!
          !        number of the first page in this group         !
          !-------------------------------------------------------!
          !       address at which to return the data block       !
          !=======================================================!

   The number of words in the argument block is three times the number of
   groups  of pages for which you want access data, plus one.  Each group
   of pages requires three arguments:  the number of pages in the  group,
   the  number  of  the first page in the group, and the address at which
   the monitor is to return the access data.

   Note that the address to which the monitor returns data should be in a
   section of memory that already exists.  If it does not exist, the call
   will fail with an illegal memory reference.

   The access information returned for each group of pages  specified  in
   the argument block is the following:




                                    8-18
                         USING EXTENDED ADDRESSING


        B2(RM%RD)   read access allowed
        B3(RM%WR)   write access allowed
        B4(RM%EX)   execute access allowed
        B5(RM%PEX)  page exists
        B9(RM%CPY)  copy-on-write access

   For each page specified in the argument block  that  does  not  exist,
   XRMAP%  returns  a -1.  It also returns a zero flag word for each such
   page.  The data block to which XRMAP% returns the  access  information
   should  therefore  contain twice as many words as the number of groups
   of pages about which you want information.

   If you execute an XRMAP% call to obtain information about a page in  a
   nonexistent  section,  the  XRMAP%  call  fails with an illegal memory
   reference.  For this reason it is recommended  to  execute  an  RSMAP%
   call  to  determine  that  the section exists before you use XRMAP% to
   obtain information about any page within that section.



   8.3.4.2  Entry Vector Information - To obtain the entry  vector  of  a
   process  in  any  section  of  memory, use the XGVEC% call.  This call
   returns the length of the entry vector in AC2 and the address  of  the
   entry vector in AC3.

   The XGVEC% call requires one word of argument:  in AC1, the handle  of
   the fork for which you want the entry vector.



   8.3.4.3  Page-Failure Information - A page-fail word, described in the
   DECsystem-10/DECSYSTEM-20   Processor   Reference   Manual,   contains
   information that allows a program to determine the  cause  of  a  page
   trap  and  the  address of the instruction that caused the trap.  This
   information allows a program to correct the  cause  of  the  page-fail
   trap.  Once the program has corrected the cause of the page-fail trap,
   the program can continue execution.

   The XGTPW% call obtains the page-fail word  from  the  monitor's  data
   base,  and  returns  it  to  the calling program's address space.  The
   XGTRP% call requires two words of arguments in AC1 and AC2.

        AC1:   process handle

        AC2:   address of the block in which to return data



   8.3.5  Program Data Vectors

   Program Data Vectors (PDVs) are data structures in a process that  are
   known to the monitor by name and location.  They contain information


                                    8-19
                         USING EXTENDED ADDRESSING


   about the program segments within a process.  The PDV is  a  block  of
   data  that LINK writes into memory when loading and linking a program.
   The PDV resides in memory as a part of the program, and  starts  at  a
   program  data  vector  address  (PDVA).   PDVs  are used to allow user
   programs to obtain information about other programs that can be mapped
   into  a  process.   PDVs and PDVAs are manipulated by using the PDVOP%
   monitor call.  (Refer to the TOPS-20 Monitor  Calls  Reference  Manual
   for  a  complete  description  of the PDVOP% monitor call.) The PDVOP%
   monitor call can be used to obtain information about  an  execute-only
   process.

   Certain words in the PDV (for example,  .PVNAM)  point  to  blocks  of
   information.   These  words  are  in  either  IFIW or EFIW format (see
   Sections 8.2.3.1 and 8.2.3.2) except that they  cannot  use  indexing,
   and  any  indirect  chain  pointed to by the word cannot go through an
   accumulator.  This allows a program to find the  address  of  a  block
   pointed  to  by a PDV word by simply using an XMOVEI instruction.  For
   example,

        XMOVEI         AC1,@.PVNAM(AC2)

   puts into AC1 the global address of the name of the PDV whose PDVA  is
   in AC2.



   8.3.5.1  Manipulating PDV Addresses - For  the  process  specified  in
   word  .POPHD  of the argument block, the .POGET function of the PDVOP%
   monitor call returns all PDVAs within the range of addresses specified
   in   words  .POADR  and  .POADE  of  the  argument  block.   (See  the
   description of the PDVOP% monitor call in the  TOPS-20  Monitor  Calls
   Reference  Manual  for  the format of the argument block.) The address
   range supplied by words .POADR and .POADE determines which  PDVAs  are
   affected by any given call.

   The .POADD  function  of  the  PDVOP%  monitor  call  adds  the  PDVAs
   specified  in  the  data  block  to  the  system's  data  base for the
   specified process.  The PDVAs must be in ascending  order  within  the
   data block.

   The .POREM function of the PDVOP% monitor call removes a set of  PDVAs
   from  the system's data base for the specified process.  Those removed
   are the ones within the range specified by words .POADR and .POADE  of
   the argument block.



   8.3.5.2  PDV Names - The .PONAM function of the  PDVOP%  monitor  call
   returns  the  ASCIZ  name  of  a  PDV  in  memory.  Word .POADR of the
   argument block must contain a valid PDVA for  the  specified  process.
   The  name  returned is the one to which word .PVNAM of the PDV points.
   The string returned by .PONAM is placed into the data block.


                                    8-20
                         USING EXTENDED ADDRESSING


   For the specified process, the .POLOC function  returns  in  the  data
   block all the PDVAs of PDVs with the specified name.  The byte pointer
   in AC3 points to  the  PDV  name.   Function  .POLOC  is  affected  by
   .POADR/.POADE words.

   The following rules apply to the assignment of PDV  names.   If  these
   rules  are  followed, it is quite unlikely that two packages that want
   to run in the same process will discover a conflict in PDV names.

        1.  PDV names assigned by DIGITAL will contain the character  "%"
            at  the  end  (or elsewhere).  No PDV names assigned by users
            should contain the "%" character.

        2.  All PDV names containing the character "."  are  reserved  to
            DIGITAL for future use.

        3.  The character "$" is reserved for a special use:   PDV  names
            of  the  form  string1$string2  are  reserved for the special
            class of use named by string1.  Rules 1 and 2 still apply  in
            this case.

   As a general principle, avoid using PDV names that are  insufficiently
   specific; use of such names invites conflicts with other packages.



   8.3.5.3  Version Number - The .POVER function of  the  PDVOP%  monitor
   call  returns  in  the  data block the version of a program in memory.
   Word .POADR must contain a valid PDVA for the specified process.   The
   version returned is the one that word .PVVER of the PDV contains.

   For more information on program data vectors,  including  explanations
   of  the  static  memory map (pointed to by word .PVMEM) and the symbol
   table vector (pointed to by word .PVSYM), refer to  the  TOPS-20  LINK
   Reference Manual.



   8.4  MODIFYING EXISTING PROGRAMS

   Existing programs can be modified to run in  any  section  of  memory,
   including  both  section  0 and all other sections.  The sections that
   follow discuss the changes that must be made to an existing program so
   that it runs in a single nonzero section.



   8.4.1  Data Structures

   Stacks, tables, and other data structures used in the past have  often
   contained  words  with an address in the right half and a count in the
   left half.  The count  could  be  positive  or  negative  because  all


                                    8-21
                         USING EXTENDED ADDRESSING


   programs  ran  only in section 0, and when the contents of a word were
   evaluated for Effective Address calculation or address use in  section
   0, only the right half was considered.

   In all other sections, the entire word is considered to be an address.
   If  the  left  half  of the word is negative, the left half is ignored
   when the address is evaluated, and the address is local.  Thus  for  a
   word  to  contain an address in the right half and a count in the left
   half, the count must be negative.



   8.4.1.1  Index Words - Be sure the left halves of index words  contain
   a  nonpositive quantity.  To use the left half of an index register to
   hold a count, the count must be negative.  If the left half is unused,
   it  must be zero so that the effective address is a local address.  If
   the left half contains a positive number, the indexed address will  be
   global.



   8.4.1.2  Indirect Words - To be  sure  that  an  indirect  word  in  a
   nonzero  section  is evaluated as a local address, always set bit 0 of
   the indirect word.  Argument lists that  produce  local  addresses  in
   section 0, for example, will produce local addresses in any section if
   bit 0 is set.



   8.4.1.3  Stack Pointers - As mentioned above, the left halves of stack
   pointers  must  contain  zero  or  a  negative number to produce local
   addresses.  A negative number in the left half is considered to  be  a
   count.   A  positive  number  in  the  left half is considered to be a
   section number.



   8.5  WRITING MULTISECTION PROGRAMS

   Multisection programs, programs that use  more  than  one  section  of
   memory,  are  similar  to  single-section programs that run in nonzero
   sections.  They allow  you  to  place  tables  needed  for  processing
   interrupts in any section of memory (See Chapter 4), to use very large
   arrays, and to write modules of code that can  be  dynamically  mapped
   into a section of memory and executed.

   In a single-section program, local addresses  and  byte  pointers  are
   sufficient to specify any word or byte in the program's address space.
   In a multisection program, local addresses and  byte  pointers  cannot
   specify any word or byte in the program's address space.  Most monitor
   calls use only one AC per argument, so passing  two-word  global  byte
   pointers is not possible.  Thus, it is necessary to:


                                    8-22
                         USING EXTENDED ADDRESSING


         o  keep monitor call arguments in the same section of memory  as
            the code making the call, or

         o  use global arguments, or

         o  use the global form of the monitor call.

   In many multisection programs it is not  necessary  to  keep  all  the
   arguments  required  by  a  call  in the same section as the code that
   makes the call.  Global arguments are required, and they take  several
   forms.   Chapter 1 of the TOPS-20 Monitor Calls Reference Manual gives
   details on the use of these arguments.

   The following program computes a file checksum by XORing the words  in
   all  file pages.  The program is loaded into section 0 and maps itself
   into section 1.  It then jumps into section 1 to access the file  data
   loaded into section 15.

           TITLE CHKSUM - COMPUTE A FILE CHECKSUM
           SEARCH MONSYM           ;STANDARD UNIVERSAL FILES
           SEARCH MACSYM
           .REQUIRE SYS:MACREL     ;GET JSERR SUPPORT ROUTINES

           STDAC.                  ;DEFINE STANDARD ACS

   ; PROGRAM CONSTANTS

           PDLSIZ==100             ;SIZE OF STACK
           CODSEC==1               ;SECTION TO MAP CODE INTO
           DATSEC==15              ;SECTION TO MAP FILE DATA INTO
           DATPAG==100             ;PAGE WITHIN DATSEC FOR FILE DATA
           PAGSIZ==1000            ;SIZE OF A PAGE

   CHKSUM: RESET%                  ;RESET THE WORLD
           MOVE P,[IOWD PDLSIZ,PDL]
           MOVE T1,[.FHSLF,,0]     ;MAP THIS FORKS SECTION 0
           MOVE T2,[.FHSLF,,CODSEC] ;TO EXTENDED CODE SECTION
           MOVX T3,SM%RD!SM%WR!SM%EX!SM%IND+1 
                                   ;INDIRECT POINTER RD,WR,EX 1 SECTION
           SMAP%
            EJSHLT                 ;UNEXPECTED FATAL ERROR
   GETFIL: SETZM FILJFN            ;SAY NO FILE SEEN
           TMSG <
   ENTER FILE SPEC TO CHECKSUM: >  ;PROMPT USER FOR FILE
           MOVX T1,GJ%SHT!GJ%OLD!GJ%FNS ;OLD FILE
           MOVE T2,[.PRIIN,,.PRIOU] ;READ FILE SPEC FROM TERMINAL
           GTJFN%                  ;GET FILE SPEC
            ERJMPR BADFIL          ;CANNOT GET FILE TELL USER
           MOVEM T1,FILJFN         ;SAVE FILE JFN
           MOVX T2,FLD(^D36,OF%BSZ)!OF%RD 
                                   ;REQUEST READ ACCESS AND 36 BIT BYTES
           OPENF%                  ;OPEN THE FILE


                                    8-23
                         USING EXTENDED ADDRESSING


            ERJMPR BADFIL          ;CANNOT OPEN FILE TELL USER

           XJRST [CODSEC,,DOCHKS]  ;ENTER EXTENDED SECTION 
                                   ;AND DO CHECKSUM

   BADFIL: JSERR                   ;PRINT ERROR MESSAGE
           SKIPE T1,FILJFN         ;IS THERE A JFN
           RLJFN%                  ;YES. RELEASE IT
            EJSERR                 ;PRINT ERROR IF ANY
           JRST GETFIL             ;AND TRY TO GET FILE AGAIN

   ; THE FOLLOWING CODE RUNS IN A NONZERO SECTION AND 
   ; DOES A CHECKSUM OF THE FILE STORED IN FILJFN

   DOCHKS: SETZB Q1,Q2             ;Q1 HOLDS THE CHECKSUM. 
                                   ;INITIALLY ZERO
                                   ;Q2 IS THE CURRENT FILE PAGE NUMBER
   CHKLOP: MOVE T1,Q2              ;GET FILE PAGE NUMBER
           HRL T1,FILJFN           ;AND FILE JFN
           FFUFP%                  ;FIND FIRST USED PAGE
            ERJMPR NOPAGE          ;CAN'T GO ANALYZE ERROR
           HRRZ Q2,T1              ;REMEMBER CURRENT PAGE NUMBER
           AOS Q2                  ;USE NEXT HIGHER PAGE NEXT TIME 
           MOVE T2,[<DATSEC>B26+DATPAG] ;THROUGH LOOP TO DATA PAGE 
           HRLI T2,.FHSLF          ;IN DATA SECTION OF THIS FORK
           MOVX T3,PM%RD           ;READ ACCESS
           PMAP%                   ;MAP THE FILE PAGE
            EJSHLT                 ;UNEXPECTED FATAL ERROR
           HRLI T1,DATSEC          ;T1 IS INDEX INTO DATA PAGE. 
           HRRI T1,DATPAG*PAGSIZ   ;SETUP SECTION AND PAGE ADDRESS
           MOVEI T2,PAGSIZ         ;T2 COUNTS THE WORDS IN A PAGE

   ; THE FOLLOWING LOOP DOES THE CHECKSUM FOR A PAGE

   XORLOP: XOR Q1,(T1)             ;CHECKSUM THIS WORD
           AOS T1                  ;STEP TO NEXT WORD
           SOJG T2,XORLOP          ;DO THE WHOLE PAGE

           SETO T1,                ;UNMAP THE FILE PAGE
           MOVE T2,[<DATSEC>B26+DATPAG] ;TO DATA PAGE IN DATA 
           HRLI T2,.FHSLF          ;SECTION OF THIS FORK
           MOVX T3,PM%RD
           PMAP%
            EJSHLT                 ;UNEXPECTED FATAL ERROR
           JRST CHKLOP             ;LOOP FOR MORE PAGES

   ; HERE WHEN FFUFP% FAILS

   NOPAGE: CAIE T1,FFUFX3          ;NO USED PAGE FOUND?
           JSHLT                   ;NO. UNEXPECTED FATAL ERROR
           
   ; PRINT THE CHECKSUM AND QUIT


                                    8-24
                         USING EXTENDED ADDRESSING


           TMSG <
   THE FILE CHECKSUM IS: >
           MOVX T1,.PRIOU          ;PRINT IT ON THE TERMINAL
           MOVE T2,Q1              ;GET THE CHECKSUM
           MOVX T3,NO%MAG!FLD(^D8,NO%RDX)  ;UNSIGNED OCTAL NUMBER
           NOUT%
            EJSHLT                 ;UNEXPECTED FATAL ERROR

           MOVE T1,FILJFN          ;GET FILE AGAIN
           CLOSF%                  ;CLOSE IT
            EJSHLT                 ;UNEXPECTED FATAL ERROR

           HALTF%                  ;STOP PROGRAM
           XJRST [CHKSUM]          ;JUMP BACK TO SECTION 0 AND 
                                   ;START OVER IF USER CONTINUES

   ; STORAGE

   PDL:    BLOCK PDLSIZ            ;STACK
   FILJFN: BLOCK 1                 ;FILE JFN

           END CHKSUM
































                                    8-25
                                        


                                   INDEX



               -A-                     Arguments (Cont.)
                                         GTJFN% short form, 3-4
   AC, 1-2                               IIC%, 5-19
     global reference, 8-7               JFNS%, 3-33
     references, 8-6                     JSYS, 1-2, 1-3
   Access                                monitor calls, 1-3
     copy-on-write, 5-5                  MRECV%, 7-9
     file, 3-2, 3-16                     MSEND%, 7-7
     file append, 3-16                   MUTIL%, 7-15
     file frozen, 3-16                   OPENF%, 3-16
     file read, 3-16                     PMAP%, 3-26, 3-28, 5-14
     file restricted, 3-16               PMAP% JSYS, 8-15
     file thawed, 3-16                   RDTTY%, 2-9
     file unrestricted, 3-16             SFORK%, 5-15
     file write, 3-16                    SIN%, 3-22
     page, 5-5                           SIR%, 4-6
   Access bits                           SMAP%, 3-29, 8-13, 8-14, 8-15
     OPENF%, 3-17                        SOUT%, 3-23
     PMAP%, 3-26                         XGTPW%, 8-19
   Accumulator (AC), 1-2                 XRIR%, 4-15
   Accumulators, 1-3                     XRMAP% JSYS, 8-18
     global reference, 8-7               XSFRK%, 8-16
     hardware, 8-6                       XSIR%, 4-7
     references, 8-6                     XSVEC% JSYS, 8-16
   Address                             ASCII strings, 2-1, 3-21
     global, 8-1, 8-6                  ASCIZ pseudo-op, 1-6
     local, 8-4, 8-6                   ASCIZ strings, 2-1, 3-21
   Address space, 8-1, 8-2             ATI% JSYS, 4-13
     process, 1-6, 5-1, 5-11
   Addressing                                      -B-
     extended, 8-1
   Addressing ACs, 8-2                 BIN% JSYS, 1-5, 3-21
   Addressing memory, 8-2                example, 1-5
   ADJSP instruction, 2-2, 8-10        Block
   AIC% JSYS, 4-9, 4-17, 5-4             packet data, 7-2
   AOBJN pointer, 8-4                    packet descriptor, 7-2
   Argument block                      BLT instruction, 8-9
     DEQ%, 6-14                        BOUT% JSYS, 3-21
     ENQ%, 6-8                         Byte, 2-1, 3-1
     ENQC%, 6-15                         reading a, 2-8
     GTJFN% long form, 3-13              transferring, 3-21
   Arguments                             writing a, 2-8
     CFORK%, 5-8                       Byte instructions, 8-10
     DEQ%, 6-12                        Byte manipulation instructions,
     DIC%, 4-16                            2-2
     ENQ% JSYS, 6-6                      ADJSP, 2-2
     ENQC%, 6-14                         IBP, 2-2
     GET%, 5-11                          ILDB, 2-2


                                  Index-1
                                        


   Byte pointer, 8-10                  Deferred mode
     global, 8-10                        terminal interrupt, 4-14
     local, 8-10                       Deleting inferior process, 5-20
     one-word global, 2-2, 8-10        DEQ% JSYS, 6-2, 6-6, 6-12
     system standard for JSYS, 2-2       argument block, 6-14
     two-word global, 2-2, 8-10          arguments, 6-12
                                         functions, 6-12
               -C-                     Descriptor block
                                         packet, 7-2
   Calling sequence                    Designator
     monitor calls, 1-3                  destination, 3-20
   Capability words, 5-11                primary input, 2-2, 3-20
   CFORK% JSYS, 5-4, 5-8, 5-15, 5-19     primary output, 2-2, 3-20
     arguments, 5-8                      source, 3-20
     execution, 5-10                     universal device, 8-11
   Changing sections, 8-2              Destination designator, 3-20
   Channel                             Device designator
     deactivating, 4-16                  universal, 8-11
     panic, 4-5, 4-10, 4-11            DIC% JSYS, 4-16
   Channel assignments                   arguments, 4-16
     software interrupt, 4-4           DIR% JSYS, 4-16
   Channel table (CHNTAB), 4-7         Direct process control, 5-4
   CHNTAB, 4-7                         Disabling interrupt system, 4-16
   CIS% JSYS, 4-17                     DTI% JSYS, 4-17
   Clearing interrupt system, 4-17
   CLOSF% JSYS, 3-30                               -E-
     example, 3-31
     execution, 3-31                   Editing functions, 2-9
     flag bits, 3-30                   Effective address, 8-1
   Closing a file, 3-30                Effective address calculation,
   Communication                           8-3, 8-8
     process, 1-6                        example, 8-8
   Communication facility                  indexing, 8-8
     inter-process, 7-1                    indirection, 8-8
   Control bits                          extended, 8-3
     RDTTY%, 2-10                        immediate instructions, 8-8
   Control process, 1-6                  indexing, 8-5
   Copy-on-write access, 5-5             indirection, 8-5
   Counter                               nonzero sections, 8-3
     program, 8-1                      EFIW, 8-6, 8-20
   Creating sections, 8-14             EIR% JSYS, 4-9, 4-11, 4-17, 5-4
                                       EJSERR macro, 1-5
               -D-                     EJSHLT macro, 1-5
                                       ENQ quota, 6-3
   Data block                          ENQ% JSYS, 5-4, 6-2, 6-6, 6-17
     packet, 7-2                         argument block, 6-8
   Data transfer, 2-1                    arguments, 6-6
   Data transfers, 3-19                  functions, 6-6
   Deactivating a channel, 4-16        ENQC% JSYS, 5-4, 6-6, 6-14
   Deadly embrace, 6-4, 6-5, 6-19        argument block, 6-15
   Deassigning terminal codes, 4-17      arguments, 6-14
   DEBRK% JSYS, 4-11                     flag bits, 6-15


                                  Index-2
                                        


   ENQUEUE/DEQUEUE (ENQ/DEQ)           File thawed access, 3-16
       facility, 5-4, 6-1              File unrestricted access, 3-16
     use of, 6-6                       File write access, 3-16
   Entry vector, 8-16                  Files, 3-1
     information, 8-19                 Flag bits
   EP. macro, 8-6, 8-7                   CLOSF%, 3-30
   ERCAL symbol, 1-4, 5-15               ENQC%, 6-15
   ERCALR symbol, 1-4                    GTJFN% long form, 3-14
   ERCALS symbol, 1-4, 1-5               GTJFN% short form, 3-5
   ERJMP symbol, 1-4, 5-15               MRECV%, 7-10
   ERJMPR symbol, 1-4, 2-13              MSEND%, 7-8
   ERJMPS symbol, 1-4                    SMAP%, 3-29
   Error returns                       Flags
     monitor calls, 1-4                  packet descriptor block, 7-3
   ERSTR% JSYS, 1-5                    Format
   Execute-only process, 8-19            extended instruction, 8-3
   Extended addressing, 8-1, 8-3         IPCF packet, 7-2
     examples, 8-7                       <SYSTEM>INFO requests, 7-13
     using monitor calls with, 8-11      <SYSTEM>INFO responses, 7-14
   Extended format indirect word       Format options
       (EFIW), 8-6                       JFNS%, 3-34
   Extended instruction format, 8-3      NOUT%, 2-6
   Extended page number, 8-11          Functions
                                         DEQ%, 6-12
               -F-                       ENQ%, 6-6
                                         MUTIL%, 7-15
   FH%EPN, 8-11                          PDVOP%, 8-20
   File                                  RDTTY%, 2-9
     closing a, 3-30
     examples, 3-40                                -G-
     opening a, 3-16
     pointer, 3-20                     GET% JSYS, 5-11, 5-14
     reading from                        arguments, 5-11
       summary, 3-40                   GETER% JSYS, 1-5
     referencing, 3-3                  GFIWM macro, 8-6
     sharing, 3-2, 6-1                 GFRKS% JSYS, 5-7
     writing to                        Global address, 8-1, 8-4, 8-6
       summary, 3-40                   Global byte pointer, 8-10
   File access, 3-2, 3-16              Global stack, 8-10
     codes, 3-2                        GNJFN% JSYS, 3-9, 3-36
   File append access, 3-16              bits returned, 3-37
   File frozen access, 3-16            GTJFN% JSYS, 3-3, 3-4
   File identifier, 3-2                  arguments
   File page mapping, 3-26                 long form, 3-12
   File pointer, 3-20                      short form, 3-4
   File read access, 3-16                bits returned, 3-10
   File restricted access, 3-16          execution, 3-9, 3-14
   File section                          flag bits
     mapping, 8-12                         long form, 3-14
   File section mapping, 3-28              short form, 3-5
   File specification, 3-3               long form, 3-4, 3-12
     standard, 3-3                         argument block, 3-13


                                  Index-3
                                        


   GTJFN% JSYS (Cont.)                 Input
     short form, 3-4                     terminal, 2-1
       examples, 3-11                  Input designator
     summary, 3-15                       primary, 2-2
   GTSTS% JSYS, 3-31                   Instruction format
     bits returned, 3-31                 extended, 8-3
                                       Instruction format indirect word
               -H-                         (IFIW), 8-5
                                       Instructions
   HALTF% JSYS, 2-8, 5-17                byte, 8-10
     example, 2-7                        stack, 8-10
   Handle section, 8-17                Inter-process communication
   HFORK% JSYS, 5-17                       facility
                                         receive quota, 7-1
               -I-                       send quota, 7-1
                                         utility functions, 7-15
   I/O monitor calls, 2-2              Inter-process communication
   IBP instruction, 2-2                    facility (IPCF), 1-6, 5-4,
   Identifier                              7-1
     file, 3-2                         Interrupt, 4-1
   IFIW, 8-5, 8-20                       generating, 4-10
   IIC% JSYS, 4-10, 5-4, 5-19          Interrupt channel assignments,
     arguments, 5-19                       4-4
   ILDB instruction, 2-2               Interrupt channels
   Illegal instruction trap, 1-4         activating, 4-9
   Immediate instructions, 8-8         Interrupt conditions, 4-4
   Immediate mode                      Interrupt deferred mode
     terminal interrupt, 4-14            terminal, 4-14
   Indexing, 8-4, 8-20                 Interrupt dismissing, 4-11
     example, 8-8                      Interrupt immediate mode
   Indirection, 8-5, 8-20                terminal, 4-14
     example, 8-8                      Interrupt processing, 4-10
     extended format indirect word     Interrupt service routines, 4-6
         (EFIW), 8-6                   Interrupt system
     instruction format indirect         clearing, 4-17
         word (IFIW), 8-5                disabling, 4-16
   Inferior process, 1-6, 5-1          Interrupts
     characteristics, 5-8                terminal, 4-12
     communicating with superior,      IPCF, 1-6, 5-4, 7-1
         5-10                            packet data block, 7-2, 7-6,
     creating, 5-8, 5-10                     7-12
     deleting, 5-20                        address, 7-6
     parallel, 5-10                        length, 7-6
     starting, 5-15                      packet descriptor block, 7-2,
     status, 5-17                            7-12
     termination, 5-16                     flags, 7-3
   Information                           receive quota, 7-1
     about process, 8-17                 send quota, 7-1
     entry vector, 8-19                  utility functions, 7-15
     page-failure, 8-19                IPCF packet format, 7-2
   Initialization
     process, 2-8


                                  Index-4
                                        


               -J-                     JSYS (Cont.)
                                         OPENF%, 3-2, 3-16
   JFN, 3-1, 3-2                         PBIN%, 2-8, 2-14
   JFNS% JSYS, 3-33                      PBOUT%, 2-8, 2-14
     arguments, 3-33                     PDVOP%, 5-11, 8-19
     format options, 3-34                PMAP%, 3-25, 3-26, 3-27, 3-28,
   Job, 1-7                                  5-11, 5-14, 5-15, 5-19,
   Job file number, 3-1, 3-2                 8-12, 8-15
   Job structure, 1-6                    PSOUT%, 2-3, 2-14
     exapmle, 1-7                        RDTTY%, 2-5, 2-9, 2-12, 2-14
   JRA instruction, 8-10                 RESET%, 2-8, 5-21, 7-5
   JRST instruction, 8-2, 8-9            RFSTS%, 5-4, 5-17
   JSA instruction, 8-10                 RFSTS% long form, 5-17, 5-18
   JSP instruction, 8-10                 RFSTS% short form, 5-17
   JSR instruction, 8-10                 RIN%, 3-24
   JSYS, 1-2                             RIR%, 4-15, 8-11
     AIC%, 4-9, 4-17, 5-4                ROUT%, 3-24
     arguments, 1-2, 1-3                 RSMAP%, 8-17
     ATI%, 4-13                          SAVE%, 5-11
     BIN%, 1-5, 3-21                     SEVEC%, 8-16
     BOUT%, 3-21                         SFORK%, 5-4, 5-15
     CFORK%, 5-4, 5-8, 5-10, 5-15,       SFRKV%, 5-16
         5-19                            SIN%, 3-22
     CIS%, 4-17                          SIR%, 4-6, 4-11, 5-4, 8-11
     CLOSF%, 3-30                        SKPIR%, 4-14
     DEBRK%, 4-11                        SMAP%, 3-28, 8-12
     DEQ%, 6-2, 6-6, 6-12                SOUT%, 3-22, 3-23
     DIC%, 4-16                          SPJFN%, 2-2
     DIR%, 4-16                          SSAVE%, 5-11
     DTI%, 4-17                          STIW%, 4-14
     EIR%, 4-9, 4-11, 4-17, 5-4          WFORK%, 5-4, 5-16
     ENQ%, 5-4, 6-2, 6-6, 6-17           XGTPW%, 8-19
     ENQC%, 5-4, 6-6, 6-14               XGVEC%, 8-19
     error returns, 1-4                  XRIR%, 4-15, 8-12
     ERSTR%, 1-5                         XRMAP%, 8-18
     GET%, 5-11, 5-14                    XSFRK%, 5-16, 8-16
     GETER%, 1-5                         XSIR%, 4-6, 4-11, 4-17, 8-12
     GFRKS%, 5-7                         XSVEC%, 8-16
     GNJFN%, 3-9, 3-36                 JUMP instruction symbols, 1-4
     GTJFN%, 3-3, 3-4, 3-9               ERCAL, 1-4, 5-15
     GTSTS%, 3-31                        ERCALR, 1-4
     HALTF%, 2-8, 5-17                   ERCALS, 1-4, 1-5
     HFORK%, 5-17                        ERJMP, 1-4, 5-15
     I/O, 2-2                            ERJMPR, 1-4, 2-13
     IIC%, 4-10, 5-4, 5-19               ERJMPS, 1-4
     JFNS%, 3-33                       JUMP instructions, 1-4
     KFORK%, 5-4, 5-20
     MRECV%, 5-4, 7-7, 7-9
     MSEND%, 5-4, 7-7, 7-12
     MUTIL%, 5-4, 7-15                             -K-
     NIN%, 2-4, 2-13, 2-14
     NOUT%, 2-5, 2-14                  KFORK% JSYS, 5-4, 5-20


                                  Index-5
                                        


               -L-                     MRECV% JSYS (Cont.)
                                         execution, 7-11
   Level number                          flagbits, 7-10
     resource, 6-4                       flags returned, 7-11
   LEVTAB, 4-8                         MSEND% JSYS, 5-4, 7-7, 7-12
   LFIWM macro, 8-6                      arguments, 7-7
   LINK, 8-19                            execution, 7-9
   Literals, 2-2                         flag bits, 7-8
   Local address, 8-4, 8-6             Multiple processes, 5-2
   Local byte pointer, 8-10            Multisection programs, 8-22
   Lock                                MUTIL% JSYS, 5-4, 7-15
     resource, 6-1                       arguments, 7-15
   Long form GTJFN%, 3-12                execution, 7-20
   LUUO instructions, 8-9                functions, 7-15
    
               -M-                                 -N-
    
   MACSYM, 1-3                         NIN% JSYS, 2-4, 2-13, 2-14
   MACSYM macros, 1-3                    example, 2-7
     EJSERR, 1-5                       NOUT% JSYS, 2-5, 2-14
     EJSHLT, 1-5                         example, 2-6, 2-7
     EP., 8-7                            format options, 2-6
     indirection, 8-6                  Number
       EP., 8-6                          reading a, 2-4
       GFIWM, 8-6                        writing a, 2-5
       LFIWM, 8-6
     TMSG, 2-4                                     -O-
   Mapping, 8-12
     file page, 3-26                   One-word global byte pointer, 2-2,
     file section, 3-28                    8-10, 8-11
     file sections to a process,       OPENF% JSYS, 3-2, 3-16, 3-27
         8-12                            access bits, 3-17
     memory, 8-12                        arguments, 3-16
     page, 3-24, 5-14                    examples, 3-19
     process page, 3-27                Opening a file, 3-16
     process section, 8-13             Operation code
     sections, 8-12                      monitor calls, 1-2
   Memory, 8-2                         Output
   Memory sharing, 5-5                   terminal, 2-1
   Messages                            Output designator
     receiving process, 7-7              primary, 2-2
     sending process, 7-7              Ownership, 6-2, 6-17
   Monitor calls, 1-2                    exclusive, 6-2, 6-17
     arguments, 1-2, 1-3                 shared, 6-1, 6-2, 6-17
     calling sequence, 1-3
     error returns, 1-4                            -P-
     for processes, 5-7
     I/O, 2-2                          Packet, 7-1, 7-2
     operation code, 1-2                 receiving a, 7-9
   MONSYM, 1-2, 2-3                      sending a, 7-7
   MRECV% JSYS, 5-4, 7-7, 7-9          Packet data block, 7-2, 7-6, 7-12
     arguments, 7-9                      address, 7-6


                                  Index-6
                                        


   Packet data block (Cont.)           Priority level table (LEVTAB),
     length, 7-6                           4-8
   Packet descriptor block, 7-2,       .PRIOU symbol, 2-2, 2-9, 2-14,
       7-12                                3-20
     flags, 7-3                        Process, 1-6, 1-7
   Packet format                         address space, 1-6, 5-11
     IPCF, 7-2                           capabilities, 5-11
   Page, 3-1                             communication, 1-6, 5-3, 5-19
   Page access, 5-5                      control, 1-6, 5-4
   Page mapping, 5-14                    deleting inferior, 5-20
     file, 3-25                          examples, 5-21
   Page sharing, 5-5                     execute-only, 8-19
   Page-failure information, 8-19        handle, 5-5, 5-10
   Panic channel, 4-5, 4-10, 4-11        identifiers, 5-5
   Parallel inferior processes, 5-10     inferior, 1-6, 5-1
   PBIN% JSYS, 2-8, 2-14                 information about, 8-17
   PBOUT% JSYS, 2-8, 2-14                JSYSs for, 5-7
   PC, 5-1, 8-1, 8-2, 8-9                multiple, 5-2
     address, 8-9                        parallel, 5-1
     address fields, 8-2                 starting in any section, 8-16
   PDV, 8-19                             starting inferior, 5-15
     names, 8-20                         status word, 5-17
       rules, 8-20                       structure, 1-6, 5-1
   PDVA, 8-19                            superior, 1-6, 5-1
     manipulating, 8-20                  terminating inferior, 5-16
   PDVOP% JSYS, 5-11, 8-19               use of resources, 6-5
     functions, 8-20                   Process communication, 1-6, 5-3,
   PID, 7-1, 7-5, 7-11                     5-5, 5-19
   PM%EPN, 8-11                          sharing pages, 5-19
   PMAP% JSYS, 3-25, 3-27, 3-28,         software interrupt, 5-4, 5-19
       5-11, 5-14, 5-15, 5-19, 8-12,   Process control, 5-4
       8-15                            Process handle, 5-5
     access bits, 3-26                 Process ID (PID), 7-1, 7-5, 7-11
     arguments, 3-26, 3-28, 5-14,      Process identifiers, 5-5
         8-15                          Process initialization, 2-8
   POINT pseudo-op, 2-1                Process mapping, 3-27
   Pointer                             Process messages
     file, 3-20                          receiving, 7-7
   Pooled resources, 6-11                sending, 7-7
   POP instruction, 8-10               Process relationships, 5-1
   POPJ instruction, 8-9, 8-10         Process section, 3-28
   .PRIIN symbol, 2-2, 2-9, 2-14,        unmapping, 8-15
       3-20                            Process status word, 5-17
   Primary input designator (.PRIIN),  Process structure, 1-6, 5-1
       2-2, 3-20                       Process unmapping, 3-28
   Primary output designator           Program counter, 8-2
       (.PRIOU), 2-2, 3-20               address fields, 8-2
   Printing a string, 2-3              Program counter (PC), 5-1, 8-1,
   Priority level                          8-9
     interrupt, 4-11                     address, 8-9
     software interrupt, 4-4           Program data vector (PDV), 8-19
                                         address (PDVA), 8-19


                                  Index-7
                                        


   Program data vector (PDV) (Cont.)   Resource (Cont.)
     manipulating PDVAs, 8-20            use by process, 6-5
     names, 8-20                       Resource lock, 6-1
       rules, 8-20                     Resource name, 6-4
     program version number, 8-21      Resource ownership, 6-2
   Programs                            RFSTS% JSYS, 5-4, 5-17
     multisection, 8-22                  long form, 5-17, 5-18
   Protection                              status-return block, 5-18
     resource, 6-4                       process status word, 5-17
   Pseudo-ops                            short form, 5-17
     ASCIZ, 1-6                        RIN% JSYS, 3-24
     POINT, 2-1                        RIR% JSYS, 4-15, 8-11
   PSOUT% JSYS, 2-3, 2-14                example, 4-15
     example, 2-7                      ROUT% JSYS, 3-24
   PUSH instruction, 8-10              RSMAP% JSYS, 8-17
   PUSHJ instruction, 8-2, 8-9, 8-10     information returned, 8-17
    
               -Q-
    
   Queue, 6-1, 6-2                                 -S-
   Quota, 7-1
     receive, 7-1                      SAVE% JSYS, 5-11
     send, 7-1                         Section
                                         changing, 8-2
               -R-                       creating, 8-14
                                         nonzero, 8-14, 8-16
   RDTTY% JSYS, 2-5, 2-9, 2-12, 2-14     zero, 8-3, 8-11
     arguments, 2-9                    Section handle, 8-17
     control bits, 2-10                Section mapping, 8-12
     editing functions, 2-9              file, 3-28
     example, 2-13                       file to process, 8-12
   Reading a byte, 2-8                   process, 8-13
   Reading a number, 2-4               Sections, 8-2
   Reading a string, 2-9               Send quota, 7-1
   Reading from a file                 Sending a packet, 7-7
     summary, 3-40                     SEVEC% JSYS, 8-16
   Receive quota, 7-1                  SFM instruction, 8-9
   Receiving a packet, 7-9             SFORK% JSYS, 5-4, 5-15
   Referencing a file, 3-3               arguments, 5-15
   Releasing a resource, 6-12          SFRKV% JSYS, 5-16
   RESET% JSYS, 2-8, 5-21, 7-5         Sharer groups, 6-17
     example, 2-7                        use of, 6-17, 6-18
   Resource, 6-1                       Sharing files, 3-2, 6-1
     level number, 6-4                 Sharing pages, 5-19
     obtaining information about,      Sharing resources, 6-1, 6-17
         6-14                          Short form GTJFN%, 3-4
     ownership, 6-2, 6-17                examples, 3-11
     pooled, 6-11                      SIN% JSYS, 3-22
     protection, 6-4                     arguments, 3-22
     releasing a, 6-12                 SIR% JSYS, 4-6, 4-11, 5-4, 8-11
     requesting use of, 6-6              arguments, 4-6
     sharing, 6-1, 6-17                SKPIR% JSYS, 4-14


                                  Index-8
                                        


   SMAP% JSYS, 3-28, 8-12              Strings (Cont.)
     arguments, 3-29, 8-13, 8-14,        text, 2-1
         8-15                            transferring, 3-22
     flag bits, 3-29                       example, 3-23
   Software interrupt, 1-6, 4-10,      Structure
       5-19                              process, 1-6
     channel assignments, 4-4          Superior process, 1-6, 5-1
     channels and priorities, 4-4        communicating with inferior,
     disabling, 4-16                         5-10
     dismissing, 4-11                  <SYSTEM>INFO, 7-1, 7-5, 7-6, 7-7,
     example, 4-18                         7-9, 7-12
     panic channel, 4-5, 4-10, 4-11      functions and arguments, 7-13
     priority level, 4-11                requests, 7-12
     priority levels, 4-4                  format, 7-13
     process communication, 5-4          responses, 7-14
     processing, 4-10                  <SYSTEM>INFO responses, 7-15
     service routines, 4-6
     tables, 4-6                                   -T-
   Software interrupt system, 1-6,
       4-1, 5-16                       Table
     enabling, 4-9                       channel (CHNTAB), 4-7
     operational sequence, 4-2           priority level (LEVTAB), 4-8
     summary, 4-17                       software interrupt, 4-6
   Source designator, 3-20             Terminal
   SOUT% JSYS, 3-22, 3-23                input, 2-1
     arguments, 3-23                     output, 2-1
   SPJFN% JSYS, 2-2                    Terminal codes
   SSAVE% JSYS, 5-11                     deassigning, 4-17
   Stack                               Terminal interrupts, 4-12
     address, 8-10                       codes, 4-12
     global, 8-10                        deferred mode, 4-14
     pointer, 8-10                       generating, 4-13
     register, 8-10                      immediate mode, 4-14
   Stack instructions, 8-10            Terminating inferior process,
     ADJSP, 8-10                           5-16
     POP, 8-10                         Text strings, 2-1
     POPJ, 8-10                        TMSG macro, 2-4
     PUSH, 8-10                          example, 2-7
     PUSHJ, 8-10                       Transferring bytes, 3-21
   Standard file specification, 3-3    Transferring data, 3-19
   Starting a process, 8-16            Transferring strings, 3-22
   Starting inferior process, 5-15       example, 3-23
   Status word                         Trap
     process, 5-17                       illegal instruction, 1-4
   Status-return block, 5-18           Two-word global byte pointer, 2-2,
   STIW% JSYS, 4-14                        8-10
   String
     printing a, 2-3                               -U-
     reading a, 2-9
   Strings                             Universal device designator, 8-11
     ASCII, 2-1, 3-21                  Unmapping
     ASCIZ, 2-1, 3-21                    process page, 3-28


                                  Index-9
                                        


   Unmapping (Cont.)                   XCT instruction, 8-9
     process section, 8-15             XGTPW% JSYS, 8-19
                                         arguments, 8-19
               -V-                     XGVEC% JSYS, 8-19
                                       XHLLI instruction, 8-8, 8-9
   Vector                              XJEN instruction, 8-9
     entry, 8-16                       XJRST instruction, 8-2
   Virtual address space, 8-1          XJRSTF instruction, 8-2, 8-9
   Virtual space, 1-6                  XMOVEI instruction, 8-8, 8-20
                                       XPCW instruction, 8-9
               -W-                     XRIR% JSYS, 4-15, 8-12
                                         arguments, 4-15
   WFORK% JSYS, 5-4, 5-16              XRMAP% JSYS, 8-18
   Writing a byte, 2-8                   arguments, 8-18
   Writing a number, 2-5               XSFRK% JSYS, 5-16, 8-16
   Writing to a file                     arguments, 8-16
     summary, 3-40                     XSIR% JSYS, 4-6, 4-11, 4-17, 8-12
                                         arguments, 4-7
               -X-                     XSVEC% JSYS, 8-16
                                         arguments, 8-16
   XBLT instruction, 8-9

































                                  Index-10