XEDIT 
          IDENT  XEDIT,111B,XEDIT,0,0 
          ABS 
          ENTRY  XEDIT
          ENTRY  RFL= 
          SST    IR 
          SYSCOM B1 
          LIST   F
          TITLE  XEDIT - EXTENDED INTERACTIVE TEXT EDITOR.
*COMMENT  XEDIT - EXTENDED INTERACTIVE TEXT EDITOR. 
          COMMENT  COPYRIGHT CONTROL DATA SYSTEMS INC.  1992. 
 XEDIT    SPACE  4,10 
*****     XEDIT - EXTENDED INTERACTIVE TEXT EDITOR. 
*         D. W. MEARS        72/08/01.
*         W. C. WELLS        76/04/29.
*         REVISED            77/04/01.
*         B.C. ANTIN         79/03/09.
* 
*         XEDIT IS AN INTERACTIVE TEXT EDITOR CAPABLE OF CREATING 
*         AND MODIFYING A TEXT FILE QUICKLY, EASILY, AND ACCURATELY.
          SPACE  4,10 
***       XEDIT IS AN INTERACTIVE TEXT EDITOR CAPABLE OF CREATING 
*         AND MODIFYING A TEXT FILE QUICKLY EASILY AND ACCURATELY.
          SPACE  4,10 
***       XEDIT COMMAND CALL. 
* 
*         XEDIT,EDITFIL,OPTIONS.
* 
*         WHERE EDITFIL IS THE FILE TO BE EDITED. IF THE EDITFIL IS 
*         NOT SPECIFIED, THE PRIMARY FILE IS USED. IF NO PRIMARY IS 
*         FOUND, XEDIT WILL USE *TAPE1*.
* 
*         THE OPTIONS ARE - 
* 
*         OPTION   DESCRIPTION/ACTION 
*         ------   ------------------ 
* 
*           AS     TURNS ON ASCII PROCESSING.  ASCII IS DEFAULT IF THE
*                  TERMINAL IS IN ASCII MODE. IF IT IS NOT IN ASCII,
*                  THIS PARAMETER WILL TURN ON ASCII FOR XEDIT ONLY.
* 
*           B      DENOTES BATCH PROCESSING. THIS PARAMETER IS ASSUMED
*                  FOR NON-TELEX ORIGIN JOBS. 
* 
*           C      DENOTES CREATION MODE. THE USER, IN THIS MODE, CAN 
*                  CREATE A TEXT FILE FROM AN EMPTY FILE. 
* 
*           DB     DEBUG. INHIBITS INTERRUPT CONTROL. 
* 
*           FR     INSTRUCTS XEDIT TO SCAN THE FIRST LINE OF THE XEDIT
*                  EDIT FILE FOR THE INITIAL COMMAND. XEDIT ASSUMES 
*                  THAT THE COMMAND BEGINS WITH THE FIRST NON-BLANK 
*                  CHARACTER WHICH OCCURS AFTER 2 CONSECUTIVE BLANKS. 
*                  THIS FEATURE ALLOWS THE COMMAND TO BE PLACED INTO A
*                  COMMENT STRING IN MOST LANGUAGES.
*                  NOTE- ONLY ONE COMMAND IS ALLOWED. MULTIPLE COMMANDS 
*                  ARE ALLOWED VIA THE Y/Z COMMANDS. ALSO, THIS COMMAND 
*                  IS EXECUTED BEFORE ANY COMMANDS FOLLOWING THE
*                  TERMINATOR ON THE *XEDIT* COMMAND. 
* 
*           LK     DENOTES LOOK MODE.  IN LOOK MODE, THE EDIT 
*                  FILE CAN BE EXAMINED, BUT NOT MODIFIED.
* 
*           NH     NO HEADER, CANCELS THE ISSUEING OF THE XEDIT VERSION 
*                  MESSAGE. 
* 
*           P      CAUSES EDITFIL TO BE RETRIEVED FROM THE PERMANENT
*                  FILE CATALOG.
* 
*          I=IFN   CAUSES XEDIT TO READ INPUT DIRECTIVES FROM FILE IFN. 
* 
*          L=LFN   CAUSES NORMAL XEDIT PRINTOUT TO BE PLACED ON FILE
*                  LFN INSTEAD OF BEING PRINTED AT THE TERMINAL.
* 
*         DEFAULTS FOR THE PARAMETERS DEPEND ON ORIGIN TYPE.
*         FOR TELEX ORIGIN, XEDIT ASSUMES THE FOLLOWING:  
*                *AS* PARAMETER IS SET (DEPENDING ON CHARACTER SET).
*         FOR BATCH ORIGIN
*                *B* PARAMETER IS SET. TO PROCESS ASCII FILES, USE THE
*                    *AS* PARAMETER.
* 
*         THE SPECIAL INPUT PROMPT OF A DOUBLE QUESTION MARK WILL BE
*         ISSUED ONLY IF BOTH THE INPUT AND OUTPUT FILES ARE ASSIGNED 
*         AS TYPE *TT*. 
* 
*         THE FIRST LINES OF INPUT TO XEDIT MAY BE SPECIFIED ON 
*         THE XEDIT COMMAND. TO DO THIS, FOLLOW THE TERMINATOR OF THE 
*         COMMAND WITH A DELIMITER AND THE LINES OF INPUT SEPARATED BY
*         THE SAME DELIMITER CHARACTER. 
          SPACE  4
**        CONDITIONAL ASSEMBLY OPTIONS. 
* 
*         SYMBOL    FUNCTION
*         ------    --------
* 
*         CYBRNET   ASSEMBLES A MODIFIED XEDIT FOR USE BY CYBERNET. 
* 
*         DEBUG     IF = 1, ASSEMBLE VARIOUS PIECES OF DEBUGGING CODE.
*                   IF = 0, DO NOT ASSEMBLE DEBUG CODE. 
* 
*         FILEOV    DETERMINES WHERE THE OVERLAYS WILL BE LOADED FROM.
*                   IF = 0, THEN LOAD OVERLAYS FROM LOCAL FILE.  FILE 
*                   NAME IS CONTAINED IN *ACTR*.
*                   IF = 1, THEN LOAD OVERLAYS FROM THE SYSTEM. 
* 
*         TIMES     ASSEMBLES TIMING CODE. THIS CODE ISSUES THE 
*                   ELSAPED TIME BETWEEN ENTRIES INTO THE COMMAND 
*                   PARSER.  THE IS GIVEN IN THOUSANDTHS OF SECONDS 
*                   AND SHOULD BE ASSEMBLED ONLY WITH KRONOS LEVEL 10+
*                   OR NOS. 
  
  
 DEBUG    SET    0           NO DEBUG 
 FILEOV   SET    1           LOAD OVERLAYS FROM SYSTEM
 CYBRNET  SET    0           CYBERNET VERSION 
*                END OF CONDITIONAL ASSEMBLY OPTIONS. 
          SPACE  4,10 
**        REGISTER CONVENTIONS. 
* 
*         IN GENERAL, THE FOLLOWING REGISTERS CAN BE ASSUMED TO 
*         CONTAIN SPECIFIC INFORMATION, OR ARE AVAILABLE UNDER THE
*         DESCRIBED CIRCUMSTANCES.
* 
*         A5, X5 = DURING THE PARSING OF THE CURRENT COMMAND, THESE 
*                  REGISTERS POINT/CONTAIN THE CURRENT CHARACTER UNDER
*                  INVESTIGATION. A NEGATIVE WORD INDICATES AN END
*                  OF COMMAND. THIS CONVENTION FORCES ALL ROUTINES
*                  CALLED BY THE PARSER TO AVOID USING THESE
*                  REGISTERS. A PARTIAL LIST OF THE SUBROUTINES 
*                  AFFECTED ARE - 
*                  *TOP*, *RDF*, *WTF*, *UPL*, *RTOA*.
*                  ANY ROUTINE WHOSE PARAMETERS ARE COMPLETELY PARSED 
*                  WITHIN THE COMMAND ROUTINE CAN USE THESE REGISTERS.
*                  THEY SHOULD NOT BE USED BY ANY SUBROUTINES.
* 
*         A0     = SCRATCH REGISTER. ANY COMMAND PROCESSOR CAN USE THIS 
*                  FOR SCRATCH PURPOSES. SUBROUTINES ARE NOT
*                  TO USE A0. 
* 
*         B1     = 1. 
          SPACE  4,10 
**        FLAG CONVENTIONS. 
* 
*        -A FLAG OR TOGGLE IS *ON* IF THE FLAG/TOGGLE IS NEGATIVE.
* 
*        -A FLAG OR TOGGLE IS *TRUE* IF THE FLAG/TOGGLE IS NEGATIVE.
* 
*        -THE FOLLOWING MATRIX HOLDS FOR THE VARIOUS COMBINATIONS OF
*         E.CMODE AND E.LMOD WITH REGARD TO E.LINE AND E.STR. 
* 
*          .    E.CMODE = 0              .    E.CMODE = 1 
*          *----------------------------*----------------------------*
* E.LMOD=0 . E.LINE = CORRECT LINE IMAGE. E.LINE = CORRECT LINE IMAGE.
*          . E.STR  = GARBAGE           . E.STR  = CORRECT LINE IMAGE.
*          .                            . (EITHER CAN BE USED SAFELY).
*          *----------------------------*----------------------------*
* E.LMOD=1 . THIS CONDITION IS UNDEFINED. E.LINE = GARBAGE           .
*          .    --NEVER-- DEFINE IT     . E.STR  = CORRECT LINE IMAGE.
*          .                            .                            .
*          *----------------------------*----------------------------*
* 
*         THUS, IF E.LMOD = 0, THE CODED LINE CAN BE WRITTEN. 
*         IF E.CMODE = 1, THE LINE IS UNPACKED TO THE STRING BUFFER.
*         IF E.CMODE = 1 AND E.LMOD = 1 THEN THE LINE *MUST* BE 
*         REPACKED BEFORE USING (E.LMOD IS THEN SET TO 0).
          SPACE  4,10 
**        END OF LINE/STRING CONVENTIONS. 
* 
*         WITHIN XEDIT, THERE ARE SEVERAL NOTATIONS USED TO DENOTE THE
*         END OF A LINE, STRING, ETC.. TO AVOID CONFUSION, THE
*         FOLLOWING IS THE DIFFERENCES BETWEEN THE REPRESENTATIONS. 
* 
*         A TRUE END OF LINE CONSISTS OF A MASK OF 2 BITS (ALWAYS)
* 
*         AN END OF STRING IS DENOTED BY THE CHARACTER ORED WITH A
*         MASK OF 1 BIT.
* 
*         THIS METHOD ALLOWS THE USER TO ALWAYS SET BIT 59 IF HE WANTS
*         AN END OF LINE, AND YET TELL THE TWO FORMS APART WHEN ONE 
*         HAS TO RESET THE PSEUDO END OF LINE.
          SPACE  4,10 
***      ASSEMBLY CONSTANTS.
  
  
 BUFAL    EQU    1401B       SCRATCH FILE BUFFER LENGTH 
 BUFBL    EQU    1401B       SECOND SCRATCH BUFFER LENGTH 
 BUFCL    EQU    201B        ALTERNATE INPUT BUFFER LENGTH
 BUFDL    EQU    201B        COPY BUFFER LENGTH 
 BUFIL    EQU    101B        INPUT BUFFER LENGTH
 BUFOL    EQU    301B        OUTPUT BUFFER LENGTH 
 BUFRL    EQU    501B        READ BUFFER LENGTH (LOCAL TO OVL2) 
 MINWD    EQU    10D         MINIMUM LINE WIDTH 
 MAXWD    EQU    160D        MAXIMUM LINE WIDTH 
 M.ASCII  EQU    1           ASCII MODE SETTING 
 M.CODED  EQU    0           CODED MODE SETTING 
 NTABS    EQU    8           NUMBER OF AVAILABLE TAB STOPS
 VERSION  MICRO  1,,$XEDIT 3.1.00$
          ORG    111B 
          TITLE  MACROS AND COMMON DECKS. 
  
*         COMMON DECKS. 
  
*CALL     COMCMAC 
*CALL     COMSPFM 
*CALL     COMSLFD 
  
 CHAR     SPACE  4,15 
**        CHAR - SET UP CALL TO *CHAR=* MACRO TO PRESET CHARACTERS. 
* 
*         CHAR   A,B
* 
*         ENTRY  *A* = INSTRUCTION IN WHICH SUBSTITUTION WILL OCCUR.
*                *B* = CHARACTER MNEMONIC TO SUBSTITUTE.
*                THE REPLACEMENT IS DONE WITH BOOLEAN OR, THUS THE
*                INVERSE CHARACTER VALUE CAN BE OBTAINED BY SETTING UP
*                A NEGATIVE FIELD.
* 
*         EXIT   INSTRUCTION *A* IS ENTERED.
*                AN ENTRY IS MADE IN THE CHARACTER REPLACEMENT TABLE. 
  
          NOREF  .CH1,.CH2
          PURGMAC CHAR
  
 CHAR     MACRO  A,B
  A 
 .CH1 SET *P
  IFGT .CH1,59,3
 .CH1 SET 0 
 .CH2 SET *-1 
  SKIP 1
 .CH2 SET * 
  CHAR= .CH1,.CH2,B 
          ENDM   CHAR 
 CHAR=    SPACE  4,10 
**        CHAR= - FORM ENTRY INTO CHARACTER REPLACEMENT TABLE.
* 
* 
*         CHAR=  A,B,C
*         ENTRY  *A* = LEFT SHIFT COUNT TO POSITION CHARACTER.
*                *B* = WORD TO REPLACE INTO.
*                *C* = ADDRESS OF DESIRED CHARACTER REPLACEMENT WORD. 
* 
*         EXIT   AN ENTRY IS MADE IN CHARACTER REPLACEMENT TABLE. 
  
  
          PURGMAC CHAR= 
  
 CHAR=    MACRO  A,B,C
          USE    SETCHAR
  VFD     12/A+2000B,30/B,18/C
          USE    *
          ENDM   CHAR=
  
*         INITIALIZE SETCHAR USE BLOCK. 
  
          USE    SETCHAR
 CHARSET  BSS    0
          USE    *
 COMMAND  SPACE  4,20 
**        COMMAND - DEFINE AN XEDIT COMMAND TABLE ENTRY.
* 
* ID      COMMAND  LONG,SHORT,PARMS,MOD,ADDR,SPECIAL,OVRL 
* 
*         ENTRY  *ID* = XEDIT COMMAND IDENTIFIER. 
*                *LONG* = LONG FORM OF COMMAND. 
*                *SHORT* = SHORT FORM OF COMMAND. 
*                *PARMS* = SPECIFIED PARAMETER CRACKING.
*                *ADDR* = JUMP ADDRESS FOR ROUTINE. 
*                *MOD* = OPTIONAL MODIFIER FIELD. 
*                *OVL* = OVERLAY NEEDED TO EXECUTE COMMAND, IF NEEDED.
*                *SPECIAL* = REPEATING PARAMETER WHOSE ARGUMENTS ARE -
*                            *CR* = COMMAND VALID IN CREATION MODE. 
*                            *F0* = NUMBER PARAMETER MUST BE FORCED 
*                            ZERO, IF COMMAND IS EXECUTED IN *INPUT 
*                            MODE.
*                            *LK* = COMMAND VALID ON LOOK MODE. 
*                            *IN* = COMMAND VALID IN INPUT MODE.
* 
*         EXIT   COMMAND TABLE ENTRY IS DEFINED.
  
 MXOVL    SET    0           SET NUMBER OF OVERLAYS 
  
          PURGMAC COMMAND 
  
  MACRO COMMAND,NM,LONG,SHORT,PARMS,MOD,ADDR,SPL,OVRL 
  IFC NE,$SHORT$$,1 
          IRP    SHORT
          DATA   0L_SHORT 
          IRP 
  IFC NE,$LONG$$,2
  DATA 0L_LONG
  MHELP LONG,SHORT
 C.A SET PARMS 0
  IRP SPL 
  POS /OPTS/SPL+1 
  VFD 1/1 
  IRP 
  POS 60
 .. IFC NE,$OVRL$$
 C.D MICRO 4,4,$_OVRL_$ 
  VFD 2/2,10/-OVL 
  POS 36
  VFD 18/NM-1,18/"C.D"
 CMD_"C.D" RMT
  QUAL
 NM BSS 0 
  QUAL *
  COMMAND  (),(),PARMS,MOD,ADDR,(_SPL_) 
  RMT 
 . IFGT "C.D",MXOVL,1 
 MXOVL SET "C.D"
 .. ELSE
 NM  VFD 2/2,10/-C.A
  POS 36
  VFD 18/MOD,18/ADDR
 .. ENDIF 
          ENDM   COMMAND
 DEVICE   SPACE  4,20 
**        DEVICE - DEFINE INPUT DEVICE. 
* 
* 
*N        DEVICE FET,ACTIVE,CMDPOP
* 
*         ENTRY  *N* = 1 CHARACTER SYMBOL FOR NAME OF DEVICE. 
*                *FET* = ADDRESS OF FET ASSOCIATED WITH DEVICE, 
*                        IF ONE EXISTS. 
*                *ACTIVE* = DEVICE IS ACTIVE (SET ONLY ON *I* DEVICE).
*                *CMDPOP* = POP STACK IF READ REQUIRED FOR NEXT 
*                          COMMAND, ELSE READ LINE IF FOR DATA. 
* 
*         EXIT   N.LINE = FWA OF CODED LINE BUFFER FOR DEVICE.
*                N.DEV = ADDRESS OF DEVICE DEFINITION FOR 
*                        ROUTINE, *STK*.
*                A DEVICE DEFINITION BLOCK IS GENERATED.
  
          PURGMAC DEVICE
  
          MACRO  DEVICE,N,FET,ACTIVE,CMDPOP 
 N_.LINE BSSZ 33D 
  IFC NE,$CMDPOP$$,1
  VFD 1/1 
  VFD *P/FET
 N_.DEV BSS 0 
  IFC EQ,$ACTIVE$$,2
  CON -1
  SKIP 1
  CON 0 
  VFD 1/0,11/0,30/,18/-1
          ENDM   DEVICE 
 ERRMSG   SPACE  4,25 
**        ERRMSG - DEFINE XEDIT ERROR MESSAGES. 
* 
* 
*NAME     ERRMSG BELLS,TEXT 
* 
*         ENTRY  *NAME* = THE NAME OF THE ERROR MESSAGE.
*                *BELLS* = THE NUMBER OF BELLS TO ISSUE BEFORE
*                THE MESSAGE. 
*                *TEXT* = THE TEXT OF THE MESSAGE.
* 
*         THIS MACRO GENERATES A TABLE OF POINTERS TO THE ERROR 
*         MESSAGES (FOR USE BY *EXPLAIN*). THE TEXT OF THE MESSAGES 
*         IS PUT INTO REMOTE BLOCK *ERRMSG*. THIS BLOCK IS ASSUMED TO 
*         BE ASSEMBLED IMMEDIATELY AFTER THE MACRO CALLS. A SIMILIAR
*         BLOCK IS MADE FOR USE BY THE *NOBELLS* COMMAND. THIS BLOCK
*         CONTAINS THE ERROR MESSAGES BUT WITHOUT THE BELLS IN THEM.
*         (THIS TABLE IS IN REMOTE BLOCK *ERROVL*)
*         IN ADDITION, THE *NO BELLS* TABLE IS ALSO DUPLICATED IN 
*         ANOTHER REMOTE BLOCK CALLED *ERRPRS*. THIS BLOCK IS 
*         DESIGNED TO BE ASSEMBLED IN THE PRESET CODE. THIS ALLOWS
*         BATCH ORIGIN OUTPUT TO LOOK NICE BY REMOVING ALL THE
*         BELL SYMBOLS AND CONTROL BYTES. A LEADING BLANK IS ADDED. 
  
          PURGMAC ERRMSG
  
          MACRO  ERRMSG,NAME,BELLS,TEXT 
          LOCAL  Y
 ... IFC NE,^_TEXT_^^ 
 .. IFC NE,$NAME$$,1
 NAME BSS 0 
  CON Y 
 ERRMSG RMT 
 .C MICRO 1,,^_TEXT_^ 
 .F MICCNT .C 
 .B SET BELLS*2 
 .B SET .A-.B 
 .C MICRO 1,.B,^_TEXT_^ 
 .D MICRO .B+1,,^_TEXT_^
 Y BSS 0
 . IFC NE,$NAME$$,1 
  VFD 12/0011B
  DUP BELLS,1 
  CHAR (VFD 12/0),BL. 
 .. IFLE .F+2,.B,4
 .E DECMIC .F 
 .F SET .F*6
  VFD .F/_".E"_H_".C"_,*P/
 .. SKIP 3
 .E DECMIC .B 
  VFD *P/_".E"_H_".C" 
  DATA C^_".D"_^
  RMT 
 .. IFC NE,$NAME$$,6
 ERROVL RMT 
  ERRMSG 0,(_TEXT_) 
  RMT 
 ERRPRS RMT 
  ERRMSG 0,( TEXT_) 
  RMT 
 ... ELSE 
 .. IFC NE,^NAME^^,10 
 ERROVL RMT 
  LOC ERRBASE 
  ERRMSG
  LOC *O
  RMT 
 ERRPRS RMT 
  LOC ERRBASE 
  ERRMSG
  LOC *O
  RMT 
 ERRMSG HERE
 ... ENDIF
          ENDM   ERRMSG 
  
*         PRESET REMOTE BLOCKS. 
  
 ERRMSG   RMT 
 .A       SET    8
          RMT 
 ERROVL   RMT 
 .A       SET    10 
          CON    ERR         KLUDGE FOR PFM 
          RMT 
 ERRPRS   RMT 
 .A       SET    10 
          CON    ERR         KLUDGE FOR PFM 
          RMT 
 ERROR    SPACE  4,15 
**        ERROR - ISSUE ERROR MESSAGE.
* 
* 
*         ERROR  PRIMARY,SECONDARY
* 
*         ENTRY  *PRIMARY* = PRIMARY MESSAGE ORDINAL. 
*                *SECONDARY* = SECONDARY MESSAGE ORDINAL. 
* 
*         EXIT   THE SPECIFIED ERROR MESSAGE IS ISSUED. 
*                (EXPLAIN) = NEW EXPLAIN ENTRY. 
* 
*         USES   B - 2. 
* 
*         CALLS  IEM. 
  
          PURGMAC ERROR 
  
 ERROR    MACRO  PRI,SEC
  IFC EQ,$SEC$$,2 
  R= B2,PRI 
  SKIP 1
  R= B2,PRI*100B+SEC
  RJ IEM
          ENDM   ERROR
 FERROR   SPACE  4,20 
**        FERROR - ISSUE FILE ERROR MESSAGE.
* 
* 
*         FERROR NAME,PRIMARY,SECONDARY 
* 
*         ENTRY  *NAME* = FILE NAME.
*                *PRIMARY* = PRIMARY MESSAGE ORDINAL. 
*                *SECONDARY* = SECONDARY MESSAGE ORDINAL. 
*                FILE MESSAGES CANNOT CONTAIN BELLS.
* 
*         EXIT   SPECIFIED ERROR MESSAGE IS ISSUED. 
*                (EXPLAIN) = NEW EXPLAIN ENTRY. 
* 
*         USES   A - 1. 
*                X - 1. 
*                B - 2. 
* 
*         CALLS  IFM. 
  
          PURGMAC FERROR
  
 FERROR   MACRO  NAME,PRI,SEC 
  IFC EQ,$SEC$$,2 
  R= B2,PRI 
  SKIP 1
  R= B2,PRI*100B+SEC
  R= A1,NAME
  RJ IFM
          ENDM   FERROR 
 HEREL    SPACE  4,10 
**        HEREL - ASSEMBLE AND LIST REMOTE TEXT.
* 
* 
*         HEREL 
* 
*         EXIT   REMOTE TEXT IS ASSEMBLED AND LISTED. 
  
          PURGMAC HEREL 
  
          MACRO  HEREL,NAME 
          LIST   G
 ;A HERE
          LIST   *
          ENDM   HEREL
 MHELP    SPACE  4,15 
**        MHELP - ASSEMBLE HELP COMMAND DIRECTORY.
* 
* 
*         MHELP  A,B. 
* 
*         ENTRY  *A* = LONG FORM OF THE COMMAND.
*                *B* = SHORT FORM OF THE COMMAND. IF NULL, NO 
*                      ENTRY IS MADE. 
* 
*         NOTES  MHELP ASSEMBLES THE HELP COMMAND DIRECTORY USED BY 
*                THE HELP COMMAND. THIS MACRO PLACES THE INFORMATION
*                IN THE REMOTE BLOCK, *HELP*, FOR ASSEMBLY IN THE HELP
*                OVERLAY. 
  
          PURGMAC MHELP 
  
 MHELP    MACRO  A,B
          LOCAL  MH5
  IFEQ MH2,3,6
 MH5 MICRO 1,,$"MH1"$ 
 HELP RMT 
  DATA C$"MH5"$ 
  RMT 
 MH1 MICRO 1,2,$ $
 MH2 SET 0
  
 . IFNE MH2,2 
 MH3 MICRO 1,12,$_A_             $
 MH4 MICRO 1,9,$          $ 
  IFC NE,$B$$,1 
 MH4 MICRO 1,9,$[_B_]          $
 . ELSE 
  IFC NE,$B$$,3 
 MH3 MICRO 1,12,$_A_             $
 MH4 MICRO 1,,$[_B_]$ 
  SKIP 2
 MH3 MICRO 1,,$_A_$ 
 MH4 MICRO 1,1,$ $
 . ENDIF
 MH1 MICRO 1,,$"MH1"_"MH3"_"MH4"_$
 MH2 SET MH2+1
          ENDM   MHELP
  
          NOREF  MH2
 MH1      MICRO  1,1,$ $
 MH2      SET    0
 OVERLAY  SPACE  4,15 
***       OVERLAY - LOAD OVERLAY. 
* 
* 
*         OVERLAY NAME,LEVEL,SYSTEM,FWA 
*         ENTRY  *NAME* = ADDRESS OF FILE NAME IN *L* FORMAT. 
*                *LEVEL* = OVERLAY LEVEL. 
*                *SYSTEM* IF SPECIFIED, OVERLAY WILL BE LOADED FROM 
*                            SYSTEM LIBRARY, AND (NAME) = NAME OF 
*                            OVERLAY. 
*                *FWA* IF SPECIFIED = ADDRESS AT WHICH OVERLAY WILL 
*                            BE LOADED. 
*         EXIT   (X1) = OVERLAY ENTRY ADDRESS.
*         CALLS  OVL=.
  
  
          PURGMAC OVERLAY 
  
 OVERLAY  MACRO  N,L,S,F
  LOCAL A 
A SET 0 
  IFC NE,$S$$,1 
A SET 1 
  IFC NE,$L$$ 
  SX6 L 
  LX6 6 
  SX6 X6+A
  ELSE 1
  SX6 A 
  R= X2,F 
  IFC NE,$N$X1$,1 
  SA1 N 
  RJ =XOVL= 
  ENDM OVERLAY
 OVLDEF  SPACE  4 
**        OVLDEF - DEFINE XEDIT OVERLAY 
* 
*ADDR     OVLDEF   LEVEL,ADDR 
* 
*         ADDR  = LOAD ADDRESS IF NOT FWAOVL
*         LEVEL = LEVEL OF OVERLAY
*         TITLE = TITLE OF OVERLAY
*         PRESET= SET IF THIS OVERLAY HAS SPECIAL PRESET CODE.
*                 IF SO, PRESET CODE SHOULD BE A SUBROUTINE ENTITLED
*                 *PRS* (WILL BE RETURNED JUMPED TO). 
  
  
          PURGMAC OVLDEF
          MACRO  OVLDEF,ADDR,LVL,TEXT,PRESET
  QUAL XEDIT_LVL
  TTL XEDIT_LVL - TEXT
  TITLE 
  IFC EQ,$ADDR$$,2
  IDENT XEDIT_LVL,FWAOVL,XEDIT_LVL,LVL,0
  SKIP 1
  IDENT XEDIT_LVL,ADDR,XEDIT_LVL,LVL,0
*COMMENT  XEDIT - TEXT
  IFC EQ,$ADDR$$,2
  ORG FWAOVL
  SKIP 1
  ORG ADDR
  NOREF .A,.B,.F,C.A,C.B,C.C,MH2
 CMD_LVL HERE 
  QUAL
 XEDIT_LVL BSS 0   DEFINE PRESET ENTRY POINT
  QUAL *
  SA1 CHARSET 
  RJ ICH
  IFC NE,$PRESET$$,1
  RJ PRS
  EQ PRM39
  USE SETCHAR 
 CHARSET BSS 0
  USE * 
          ENDM   OVLDEF 
 PARAM    SPACE  4,10 
**        PARAM - DEFINE PARAMETER SYMBOL FOR COMMAND MACRO.
* 
* 
*LABEL    PARAM  NAME 
* 
*         ENTRY  *LABEL* = REGULAR LABEL FIELD. 
*                *NAME* = NAME FOR COMMAND MACRO.  THIS BECOMES 
*                *LABEL-PRM*. 
  
          PURGMAC PARAM 
  
          MACRO  PARAM,LABEL,NAME 
  
 ;A BSS 0 
 ;B EQU ;A-PRM. 
          ENDM   PARAM
 PREFIX   SPACE  4,15 
**        PREFIX - DEFINE PREFIX CHARACTERS.
* 
* 
*         PREFIX CHARS
* 
*         ENTRY  *CHARS* = PREFIX CHARACTER TO BE DEFINED.
*                IF ALPHABETIC, MACRO WILL GENERATE BOTH AN 
*                   UPPER AND LOWER CASE ENTRY. 
*                IF THE PARAMETER CONTAINS MORE THAT 1 CHARACTERS, THE
*                   MACRO WILL ASSUME THAT THE CHARACTER NEEDS TO BE
*                   PRESET AND WILL GENERATE THE PROPER CODE. 
* 
*         EXIT   PREFIX TABLE IS PUT IN REMOTE BLOCK *PREFIX*.
  
          PURGMAC PREFIX
  
 PREFIX   MACRO  CHARS
          LOCAL  A,B
 A BSS 0
 B MICRO 1,,Z_CHARS_Z 
 C MICCNT B 
 . IFPL C-2 
 PREFIX RMT 
  VFD 42/A
  CHAR (VFD 18/0),CHARS 
  RMT 
 HELPSP   RMT 
  CHAR (VFD 6/0),CHARS
  VFD 30/5H*****
  CHAR  (VFD 18/0),(//_CHARS) 
  VFD 6/0 
  RMT 
 . ELSE 
 PREFIX RMT 
  VFD     42/A,18/1R_CHARS
  IFLE    1R_CHARS,26D,1
  VFD     42/A,12/76B,6/1R_CHARS
  RMT 
 HELPSP   RMT 
  VFD 6/1R_CHARS,30/5H*****,18/1R_CHARS,6/0 
  VFD 6/1R_CHARS,30/5H*****,12/76B,6/1R_CHARS,6/0 
  RMT 
 . ENDIF
          ENDM   PREFIX 
 SPECIAL  SPACE  4,10 
**        SPECIAL - DEFINE SPECIAL COMMANDS (1 CHARACTER).
* 
* 
*         SPECIAL  CHARS
* 
*         ENTRY  *CHARS* = SPECIAL COMMAND CHARACTER. 
*                IF THE PARAMETER CONTAINS MORE THAN 1 CHARACTER, THE 
*                 MACRO WILL ASSUME THAT THE CHARACTER NEEDS TO BE
*                 PRESET AND WILL GENERATE THE PROPER PRESET CODE.
*                A SPECIAL COMMAND CANNOT BE ALPHABETIC.
  
          PURGMAC SPECIAL 
  
 SPECIAL  MACRO  CHARS
          LOCAL  A,B
 A BSS 0
 B MICRO 1,,Z_CHARS_Z 
 C MICCNT B 
 . IFPL C-2 
 SPECIAL RMT
  VFD 42/A
  CHAR (VFD 18/0),CHARS 
  RMT 
 HELPSP RMT 
  CHAR (VFD 6/0),CHARS
  CHAR (VFD 48/0),(//_CHARS)
  VFD 6/0 
  RMT 
 . ELSE 
 SPECIAL RMT
  VFD 42/A,18/1R_CHARS
  IFLE 1R_CHARS,26D,1 
 1 ERR INCORRECT TO HAVE SPECIAL COMMAND BE ALPHABETIC. 
  RMT 
 HELPSP RMT 
  VFD 6/1R_CHARS,48/1R_CHARS,6/0
  RMT 
 . ENDIF
          ENDM   SPECIAL
          SPACE  4
**        INITIALIZE -HELPSP- REMOTE BLOCK. 
* 
  
  
 HELPSP   RMT 
          VFD    36/6H*****A,18/1RA,6/0  A POSTFIX
          VFD    36/6H*****W,18/1RW,6/0  W POSTFIX
          RMT 
          TITLE  FETS AND BUFFERS (CODED AND STRING). 
*         FETS
  
 CFET     BSS    0           COPY FET FOR *CFF* 
 SFET     BSS    0           SCRATCH FET FOR STATUS MACRO 
 PFET     BSS    0           SCRATCH FET FOR PFM ROUTINES 
 FT       BSS    0           SCRATCH FET FOR PFM ROUTINES 
          CON    1
          VFD    12/,6/4,18/50,6/7,18/BUFB
          CON    BUFB        FET USED BY *CFF* FOR FAST COPIES
          CON    BUFB           OUT 
          CON    BUFB+BUFBL  MUST AGREE WITH INCOMING EDIT FILE 
          VFD    60/
          VFD    60/
          VFD    60/
          VFD    60/         PFN
          VFD    60/         USER NAME
          VFD    42/         PASSWORD 
          VFD    18/ERR      ERROR ADDRESS
          VFD    60/         CONTROL WORD 
  
 FFET     BSS    0           ADDRESS OF FIRST ACTUAL FET
*                            ALL FETS UNTIL LFET MUST BE 7 WORDS LONG 
  
 FTI      BSS    0
 INPUT    FILEC  BUFI,BUFIL,FET=7  INPUT FET
  
 FTO      BSS    0
 OUTPUT   FILEC  BUFO,BUFOL,FET=7  OUTPUT FET 
  
 FTD      BSS    0
 SCRD     FILEC  BUFD,BUFDL,FET=7  COPY FET 
  
* RFET    FILEC  RBUF,BUFRL,ERP,FET=7  FET IN OVERLAY (OVL2)
  
 E.IN     BSS    0
 FTB      BSS    0
 SCRB     FILEC  BUFB,BUFBL,FET=7,EPR  INCOMING EDIT FILE 
  
 E.OUT    BSS    0
 FTA      BSS    0
 SCRA     FILEC  BUFA,BUFAL,FET=7,EPR  OUTGOING EDIT FILE 
  
 LFET     BSS    0           ADDRESS OF LAST FET + 7
  
*         INPUT DEVICE DEFINITIONS. 
  
 I        DEVICE INPUT,ON    MAIN INPUT DEVICE
  
 P        DEVICE             PREVIOUS COMMAND BUFFER
  
 S        DEVICE INPUT,,POP  SPECIAL INPUT MODE ESCAPE
  
 Y        DEVICE             Y/Z COMMAND BUFFER 
  
          PURGMAC  DEVICE    VOID USAGE OF MACRO
  
*         OTHER CODED BUFFERS.
  
 D.LINE   BSSZ   33D         DATA LINE BUFFER 
  
 E.LINE   BSSZ   33D         EDIT LINE BUFFER 
  
*         BUFFERS (STRING)
  
          VFD    12/2000B,30/0,18/-1  CHAR POINTER AND DELIMITER
 C.STR    VFD    2/3,*P/     END OF LINE MARKER 
          BSSZ   MAXWD-1     COMMAND STRING BUFFER
          VFD    2/3,*P/     END OF LINE MARKER 
  
          DATA   0           LINE WIDTH 
 D.STR    BSSZ   MAXWD       DATA STRING BUFFER 
 D.STRL   EQU    *-D.STR     DATA STRING BUFFER LENGTH
          VFD    2/3,*P/     END OF LINE MARKER 
  
          DATA   0           LINE WIDTH 
 E.STR    BSSZ   MAXWD       EDIT LINE BUFFER 
          VFD    2/3,*P/     END OF LINE MARKER 
          BSSZ   1           SCRATCH CELL FOR LOCATES 
  
*         NOTE- THIS ARRAY CONTAINS PART OF XEDIT PRESET CODE.
*         CURRENT LINE WIDTH ENDS AT THE LAST NON-BLANK CHARACTER.
  
          DATA   0           CURRENT LINE WIDTH 
 E.SCR    BSSZ   MAXWD       SCRATCH BUFFER (MUST BE AFTER E.STR) 
          VFD    2/3,*P/     END OF LINE MARKER 
          BSSZ   1           SCRATCH CELL FOR LOCATE
          TITLE  STORAGE ALLOCATION.
  
*         STRING FIELD POINTERS - MAINTAIN ORDER. 
  
 P1LP     DATA   0           STRING FIELD PARAMETERS
 P1RP     DATA   0           PLEASE MAINTAIN ORDER
 P2LP     DATA   0
 P2RP     DATA   0
 P3LP     DATA   0
 P3RP     DATA   0
  
*         EDIT LINE MODE CONTROL - PLEASE MAINTAIN ORDER. 
  
 E.NMODE  DATA   0           EDIT - NEEDED MODE FOR LINE
 E.CMODE  DATA   0           EDIT - CURRENT MODE
 E.LMOD   DATA   0           EDIT - LINE MODIFICATION FLAG
  
*         FILE NAME CELLS.
  
 COPY     DATA   0           NAME OF LAST COPY FILE 
 IFN      DATA   0           CURRENT FILE NAME PARAMETER
 IRFN     DATA   0           FILE TO READ FROM IF FS = .FALSE.
 ISFN     DATA   0           STARTING FILE NAME (EDITFIL) 
 LFN      DATA   0           LOGICAL FILE NAME
  
*         MARGIN CONTROLS.
  
 IW       BSS    0
 RMARG    CON    160         DEFAULT RIGHT MARGIN 
 LMW      CON    E.STR-1     * MAINTAIN ORDER OF NEXT 2 
 RMW      CON    E.STR+160   * WINDOW MARGINS 
 RTWD     DATA   0           VALUE OF RIGHT WINDOW MARGIN 
  
*         MISCELLANEOUS CELLS.
  
 AS       CON    0           0 = NO ASCII, IF *ASC* THEN RESTORE AT END 
 BATCH    DATA   0           .LT. 0 IF USER IS *BCOT* 
                             .EQ. 0 IF USER IS *TXOT* 
                             .GT. 0 IF USER SELECTED *B* OPTION 
 CHARSFT  BSSZ   1           SHIFT FOR ICH. SET IN PRESET 
 COMMAND  DATA   0           COMMAND DESCRIPTOR WORD
 C.ON     CON    I.DEV       POINTER TO CURRENT INPUT DEVICE
 DF       CON    0           * MAINTAIN ORDER OF *DF* AND *DR*
 DR       CON    0           * (DELETE EOF/EOR COUNTERS)
 ERR      BSSZ   5           PFM ERROR MESSAGES 
 EXPLAIN  VFD    12/2000B,*P/EXPLAIN ERROR MESSAGE POINTERS 
 EXTA     DATA   0           EXIT MODE FLAG 
 FS       CON    0           .TRUE. (NEG.) IF READING OFF SCRATCH FILES 
 GLOBAL   DATA   -1          GLOBAL CHARACTER FOR STRING SEARCHES 
 LNFLAG   DATA   -1          NEG. - LINE NUMBER MODE, POS - WHERE MODE
 INDEX    DATA   0           ADDRESS OF COMMAND DESCRIPTOR WORD 
 INITZ    DATA   0           NON-ZERO WHEN PRESET IS COMPLETE 
 INPCHAR  CON    -1          INPUT MODE ESCAPE CHARACTER
 INPMODE  CON    1           -1 IF IN INPUT MODE
 ITOGGLF  DATA   -1          * MAINTAIN ORDER OF *ITOGGLF/ITOGGLR*
 ITOGGLR  DATA   -1          * (PRINT EOR/EOR MESSAGE FLAGS)
 IWHERE   CON    1           LINE COUNTER 
 MCOUNT   DATA   0           COUNT OF SUCCESSFUL LOCATES (PER CMD)
 NOMOD    DATA   -1          .TRUE. (NEG) IF NO FILE MODS THIS PASS 
 NUMS     BSSZ   NTABS+1     STORAGE FOR PARAMETERS 
 NXTLINE  CON    0           OPTIONAL LINE NUMBER VALUE (IN CMDS) 
 PREFIX   CON    1BS1        COMMAND MODIFIER BITS (SEE BELOW)
 PROMPT   CHAR   (VFD 6/0),QM.  TTY SPECIAL INPUT PROMPT
          CHAR   (VFD 6/0),QM.
          VFD    6/55B,18/0001B,24/0  SET NO <CR> CONTROL BYTE
 RC       DATA   -1          .TRUE. (NEG) IF NO DATA READ (RDF/WTF) 
 SCOUNT   DATA   0           SLASH PREFIX COUNT 
 SKPCNT   DATA   0           SKIP COUNT FOR *-* COMMAND 
  
**        SPCP   - SPECIFIED PARAMETERS.
*T        1/  W, 1/  P, 1/  A, 57/  UNUSED
* 
*         W = 1 - WINDOW WAS SPECIFIED (ON A COMMAND).
*         P = 1 - *P* OPTION SPECIFIED (ON *XEDIT* COMMAND).
*         A = 1 - FILE IS DIRECT ACCESS (ONLY VALID IF *P*
*                 OPTION SPECIFIED).
 SPCP     DATA   0
  
 TABCHAR  DATA   -1          * MAINTAIN ORDER OF TABCHAR/TABS 
 TABS     CON    11D,18,30D  * (TABCHAR AND INITIAL TAB SETTINGS) 
          BSSZ   NTABS-2     * ZERO REST OF TABS + 1 END MARKER 
 TLX      CON    0           TELEX INTERRUPT FLAG 
 TRIM     DATA   0           .LT. 0 IF TRIM OPTION SET
 TTYIN    CON    0           .NZ. IF NOT *TTY* INPUT FILE 
 TSTATUS  BSSZ   2           DATA RETURN FROM *TSTATUS* 
 UPDATE   DATA   -1          NEG. IF UPDATING EDIT FILE 
 VERIFY   DATA   -1          * MAINTAIN ORDER OF VERIFY FLAGS 
 XVERIFY  DATA   -1          * .TRUE. (NEGATIVE) IF VERIFYING 
          IF     DEF,TIMES,1
 TIMING   BSSZ   3
          SPACE  4
*         MISCELLANEOUS MICROS. 
  
 PTFT     DECMIC PTFT        PRIMARY FILE TYPE
          SPACE  4
**        DEFINITION OF COMMAND MODIFIER BITS (PREFIX WORD).
* 
*         NOTE-  THIS WORD IS ZEROED BEFORE CRACKING ANY COMMAND. 
  
          QUAL   PREFIX 
 PLUS     EQU    1           + PREFIX CHARACTER 
 PLUS     DECMIC PLUS 
 A        EQU    2           A POSTFIX CHARACTER
 A        DECMIC A
 W        EQU    3           W POSTFIX CHARACTER
 W        DECMIC W
          QUAL   *
          SPACE  4
**        DEFINITION OF SPECIAL BITS USED IN COMMAND DESCRIPTOR.
* 
  
  
          QUAL   OPTS 
 CR       EQU    47D         COMMAND LEGAL IN CREATION MODE 
 F0       EQU    44D         NUMBER FIELD FORCE 0 IN INPUT MODE 
 LK       EQU    46D         COMMAND LEGAL IN LOOK MODE 
 IN       EQU    45D         COMMAND LEGAL IN INPUT MODE
          QUAL   *
          TITLE  TABLES AND MESSAGES. 
**        CHARACTER SET REPLACEMENT TABLE.
*T        24/AS,  18/64 C,  18/63 C 
* 
*         AS   = ASCII 6/12 CHARACTER SET.
*         64 C = 64 CHARACTER SET.
*         63 C = 63 CHARACTER SET.
* 
  
 AM.      VFD    24/67B,18/67B,18/67B            AMPERSAND
 BL.      VFD    24/7647B,18/7647B,18/7647B      BELL (EXTENDED MODE) 
 QM.      VFD    24/71B,18/71B,18/71B            QUESTION MARK
 SH.      VFD    24/60B,18/60B,18/60B            SHARP
 UA.      VFD    24/7402B,18/76B,18/76B          UP ARROW 
  
*         XEDIT MESSAGE TABLE.
* 
*         NOTE-  ANY SECONDARY MESSAGES DEFINED WITHIN XEDIT
*         ARE ASSUMED TO BE IN OCTAL. 
*         TOTAL NUMBER OF PRIMARY ERROR MESSAGES MUST BE LESS 
*         THAN 40B. 
  
 MESSAGE  EQU    *-1         BASE ADDR OF MESSAGE TABLE 
          LOC    1
 PFM.     CON    ERR         KLUDGE FOR PFM ERRORS
 ARG.     ERRMSG 1,(ARGUMENT ERROR) 
                             1 = INPUT MODE - COMMAND HAS COUNT (F0)
 BFN.     ERRMSG 1,(BAD FILE NAME)
                             1 = BAD FILE NAME
                             2 = NO FILE NAME 
                             3 = SPECIAL/RESERVED NAME
 BTL.     ERRMSG 1,(BAD TEXT LINE ENCOUNTERED)
 CNV.     ERRMSG 1,(COMMAND NOT VALID)
                             1 = IN CREATION MODE 
                             2 = IN LOOK MODE 
                             3 = IN INPUT MODE
 DEL.     ERRMSG 1,(DELIMITER)
 EMI.     ERRMSG 1,(FILE FUNCTION INCORRECT)
                             1 = NOT ALLOWED TO CHANGE FILE 
                             2 = *L* INCORRECT ON DA/MT FILES 
*                PLEASE MAINTAIN ORDER OF NEXT TWO
 EOF.     ERRMSG 0,(--EOF--)
 EOR.     ERRMSG 0,(--EOR--)
 EOI.     ERRMSG 2,(END OF FILE)
 FCP.     ERRMSG 0,(FILENAM REWRITTEN)
 FCR.     ERRMSG 0,(FILENAM CANNOT BE ACCESSED) 
                             1 = FILE IS EXECUTE OR APPEND ONLY FILE
                             2 = FILE IS NOT LOCAL TO JOB 
                             3 = FILE NOT IN PERM. FILE AREA
 FLC.     ERRMSG 0,(FILENAM IS A LOCAL FILE)
 FRP.     ERRMSG 0,(FILENAM REPLACED) 
 FSV.     ERRMSG 0,(FILENAM SAVED)
 ILL.     ERRMSG 1,(INCORRECT PARAMETER)
 LFM.     ERRMSG 0,(LOCAL FILE ERROR) 
 LNNF.    ERRMSG 1,(LINE NUMBER NOT FOUND, COMMAND NOT EXECUTED)
 LNTL.    ERRMSG 1,(LINE NUMBER TOO LARGE)
 NSC.     ERRMSG 1,(NO SUCH COMMAND)
 SNF.     ERRMSG 1,(STRING NOT FOUND) 
 STK.     ERRMSG 1,(COMMAND STACKING ERROR) 
 TRUNC.   ERRMSG 1,(TRUNCATION AT       LINE) 
          LOC    *O 
 ERRBASE  BSS    0           SET MESSAGE BASE ADDRESS 
          ERRMSG             NOTE END OF TABLE
          TITLE  COMMAND PARSER - MAIN LOOP.
 NCM      SPACE  4,20 
**        NCM - GET NEXT COMMAND. 
* 
*         ENTRY  NONE.
* 
*         EXIT   TO COMMAND PROCESSING ROUTINE AFTER PARSING
*                PARAMETERS AND HANDLING ERRORS.
*                (X1) = COMMAND DESCRIPTOR WORD.
* 
*         USES   A - 1, 2, 3, 4, 5, 6, 7. 
*                X - ALL. 
*                B - 2, 3, 4, 5, 6, 7.
* 
*         CALLS  CDD, SCD, VIS. 
* 
*         MACROS GETJA, WRITEO. 
  
 NCM      BSS    0           ENTRY
          RJ     SCD         ASSURE CODED MODE AT START OF COMMAND
          IF     DEF,TIMES
          SA4    TIMING+1 
          GETJA  TIMING      GET ELAPSED TIME 
          SA1    A4 
          IX1    X1-X4       ELAPSED TIME 
          RJ     CDD         CONVERT
          WRITEO OUTPUT 
          MX6    0           LINE FEED
          WRITEO X2 
          ENDIF 
  
          SA1    C.STR-1     COMMAND LINE CONTROL WORD
          SA4    EXPLAIN     UPDATE EXPLAIN WORD
          R=     X6,M.CODED 
          UX1    B7,X1       B7 = CHARACTER POINTER 
          SA6    E.NMODE     SET MODE NEEDED TO CODED 
          LE     B7,NCL      IF READ REQUIRED 
          SA5    A1+B7
          BX6    X6-X6
          SA6    PREFIX      RESET PREFIX WORD
          SA2    XVERIFY
          AX4    12 
          SB6    X1          B6 = DELIMITER CHARACTER 
          BX7    X2 
          PX6    B0,X4
          NG     X5,NCM22    IF AT END OF LINE (NO SUCH CMD)
          SA6    A4          REPLACE EXPLAIN WORD 
          SA2    A5          GET FIRST CHARACTER OF NEW CMD 
          SA7    VERIFY      SET VERIFY FLAG
          BX7    X7-X7
          SA7    SCOUNT      INITIALIZE SLASH COUNT 
          NG     B6,NCM2     IF NO DELIMETER CHARACTER
 NCM1     NG     X2,NCM2     IF END OF LINE REACHED 
          SB5    X2 
          SA2    A2+B1
          NE     B5,B6,NCM1  IF NOT DELIMITER CHARACTER 
          SX6    B5+
          MX7    1           SET PSEUDO END OF LINE 
          BX6    X6+X7
          SA6    A2-1 
  
*         PARSE PREFIX CHARACTERS.
  
 NCM2     SA3    PREFIXT-1
          BX6    X5 
          SB6    X5          B6 = DELIMITER CHARACTER 
          SA6    PREFIXU
          SA7    INDEX       CLEAR INDEX (TOPNULL 'P4 BUG)
 NCM3     SA3    A3+B1
          SB3    X3 
          NE     B3,B6,NCM3  IF NOT THIS PREFIX CHARACTER 
          AX3    18 
          SB6    X3 
          ZR     B6,NCM4     IF NOT REALLY PREFIX CHARACTER 
          SA5    A5+B1       PREPARE FOR NEXT CHARACTER 
          JP     B6          PROCESS PREFIX CHARACTER 
  
*         CLOSE PREFIX PARSING. 
  
 NCM4     SB3    2
          SX7    0           CLEAR ASSEMBLY 
  
*         BEGIN PARSING FOR LINE NUMBER.
  
 NCM5     SX0    X5-1R9-1 
          SX2    X5-1R0 
          BX0    -X2*X0 
          PL     X0,NCM6     IF NOT A NUMBER
          LX0    B3,X7       *2 
          IX7    X0+X7       *5 
          SA5    A5+B1
          LX7    1           *10
          IX7    X7+X2
          EQ     NCM5        CHECK NEXT CHARACTER 
  
*         SAVE LINE NUMBER AND PARSE COMMAND. 
  
 NCM6     MX6    1
          SA7    NXTLINE     SAVE NEXT LINE 
          MX4    26 
          MX3    -6 
          NG     X5,NCM9     IF AT END OF LINE
          LX4    -5          POSITION MASK
 NCM7     BX0    -X3*X5 
          SB3    X0+4 
          LX1    B3,X4
          PL     X1,NCM9     IF NO A-Z
          BX1    X3*X5       CHECK TO SEE IF ASCII
          ZR     X1,NCM8     IF UPPER CASE LETTER 
          SX1    X1-7600B 
          NZ     X1,NCM9     IF NOT LOWER CASE LETTER 
 NCM8     LX6    6
          BX6    X6+X0
          SA5    A5+1 
          PL     X5,NCM7     IF NOT AT END OF LINE
  
*         DETERMINE IF *W* POSTFIX, LEFT JUSTIFY COMMAND. 
  
 NCM9     BX1    -X3*X6      GET LAST CHARACTER 
          MX0    1
          SX7    1BS"W" 
          SX4    X1-1RW 
          ZR     X4,NCM10    IF W POSTFIX (W HAS JUSTIFICATION BIT) 
          SB3    X1+
          SX7    1BS"A" 
          NE     B3,B1,NCM11 IF NOT *A* POSTFIX 
 NCM10    SA4    PREFIX 
          BX6    X3*X6       REMOVE POSTFIX 
          BX7    X7+X4
          SA7    A4          REPLACE PREFIX WORD
 NCM11    LX6    6           LEFT JUSTIFY 
          PL     X6,NCM11    IF NOT LEFT JUSTIFIED
          BX6    -X0*X6      REMOVE JUSTIFICATION BIT 
  
*         SKIP BLANKS AND FIRST COMMA. STOPS ON FIRST NON-BLANK 
*         CHARACTER OR ON SECOND COMMA. 
*         ASSUMES X0 IS NEGATIVE AT ENTRY.
  
 NCM12    NG     X5,NCM14    IF END OF LINE 
          SB3    X5-1R       0 = BLANK, 1 = COMMA 
          ZR     B3,NCM13    IF BLANK 
          NE     B3,B1,NCM14 IF NOT COMMA 
          PL     X0,NCM14    IF SECOND COMMA
          SX0    0           SET COMMA ENCOUNTERED
 NCM13    SA5    A5+B1
          EQ     NCM12       CHECK NEXT CHARACTER 
  
*         LOOK UP COMMAND IN COMMAND TABLE. 
  
 NCM14    ZR     X6,NCM24    IF NO COMMAND
          SA4    JUMP-1 
          SA6    JUMPX       PRESET COMMAND TABLE 
 NCM14.1  SA4    A4+B1       GET NEXT COMMAND 
          IX3    X4-X6
          NG     X4,NCM14.1  IF DATA WORD 
          NZ     X3,NCM14.1  IF NOT THIS ENTRY
 NCM15    SA4    A4+B1
          PL     X4,NCM15    IF NOT DATA CELL ASSOCIATED WITH COMMA 
          SX0    X4 
  
*         CODE IS REPLACE AFTER CREATION MODE IS EXITED 
  
 NCMA     SA3    IWHERE 
          EQ     NCM16       JUMP TO PRESET TEST
  
 NCM      RMT 
          ZR     X0,NCM23    IF NO JUMP ADDRESS (NO SUCH COMMAND) 
          SA3    UPDATE 
          RMT 
  
          SX6    A4          SAVE INSTRUCTION INDEX 
          BX3    X3+X4       CHECK LOOK COMMAND PERMISSION NECESSARY
          SA1    INPMODE
          BX7    X4          SAVE COPY OF COMMAND DATA WORD 
          LX3    59-/OPTS/LK
          SA6    INDEX
          BX1    -X4*X1      NEG. IF IN INPUT AND COMMAND NOT OK
          LX1    59-/OPTS/IN
          SA7    COMMAND
          NG     X1,NCM20    IF NOT LEGAL IN INPUT MODE 
          PL     X3,NCM21    IF NOT VALID IN LOOK MODE
          UX4    B6,X4       GET ARGUMENT DESCRIPTOR ADDRESS
          ZR     B6,PST      IF NO ARGUMENTS
          JP     B6+PRM.     PARSE PARAMETERS 
  
*         CREATION MODE CODE. 
*         ENTRY   (X3) = IWHERE.
  
 NCM16    NG     X3,NCM18    IF IN CREATION MODE
          SA3    NCM17       GET INSTRUCTION REPLACEMENT WORD 
          NO
          BX6    X3 
          SA6    NCMA 
          RJ     VIS         VOID INSTRUCTION STACK 
 NCM17    BSS    0
 NCM      HEREL 
          EQ     NCMA+1      JUMP INTO REQULAR CODE 
  
 NCM18    ZR     X0,NCM23    IF NO SUCH COMMAND 
          BX3    -X4*X3 
          LX3    59-/OPTS/CR POSITION CREATION LEGAL STATUS 
          NG     X3,NCM19    IF COMMAND NOT ALLOWED IN CREATION MODE
          SA3    UPDATE 
          EQ     NCMA+1      PROCESS COMMAND
  
*         ERROR PROCESSING ROUTINES.
  
 NCM19    SB2    CNV.*100B+1 SET *NOT VALID* IN CREATION MODE 
          EQ     NER         PROCESS ERROR
  
 NCM20    SB2    CNV.*100B+3 SET *NOT VALID* IN INPUT MODE
          EQ     NER         PROCESS ERROR
  
 NCM21    SB2    CNV.*100B+2 SET *NOT VALID* IN LOOK MODE 
          EQ     NER         PROCESS ERROR
  
 NCM22    SA1    C.STR-1     SET READ REQUIRED
          PX6    B0,X1
          SA6    A1 
  
 NCM23    SB2    NSC.        NO SUCH COMMAND
          EQ     NER         PROCESS ERROR
  
*         IF NO COMMAND IS FOUND, CHECK FOR SPECIAL COMMANDS. 
  
 NCM24    NG     X5,NCM28    IF END OF LINE (POSSIBLY FINDLN) 
          SA4    SPCMDT-1 
          BX6    X5 
          SA6    SPCMDU 
          SB3    X5 
 NCM25    SA4    A4+B1
          SB4    X4 
          NE     B4,B3,NCM25 IF NO MATCH
          AX4    18 
          SB4    X4 
          ZR     X4,NCM23    IF NO SUCH COMMAND (NULL)
  
*         SKIP BLANKS AND ONE COMMA.
  
 NCM26    SA5    A5+1        STEP OVER SPECIAL CHARACTER
          NG     X5,NCM27    IF END OF LINE 
          SB2    X5-1R
          ZR     B2,NCM26    IF BLANK 
          NE     B2,B1,NCM27 IF NOT COMMA 
          ZR     X4,NCM27    IF SECOND COMMA
          MX4    0
          EQ     NCM26       CHECK NEXT CHARACTER 
  
 NCM27    JP     B4          PROCESS SPECIAL COMMAND
  
*         CHECK FOR FINDLN COMMAND, ELSE NO SUCH COMMAND. 
  
 NCM28    SA1    NXTLINE
          SA2    IWHERE 
          ZR     X1,NCM23    IF NOT TO FIND LINE NUMBER 
          SA3    INPMODE
          NG     X2,NCM19    IF IN CREATION MODE
          BX6    X1 
          MX7    0
          NG     X3,NCM20    IF IN INPUT MODE (CANNOT MOVE PTR) 
          SA6    NUMS        MOVE PARAMETER 
          SX6    FLN
          SA7    NXTLINE     CLEAR NXTLINE OPTION 
          SA6    COMMAND
          EQ     PRM.+NONE   PROCESS COMMAND
  
PRM       SPACE  4,20 
**        PRM - COMMAND PARAMETER CRACKER.
* 
*         ENTRY  (A5) = ADDRESS OF CURRENT CHARACTER. 
*                (X5) = CURRENT CHARACTER.
*                (X7) = COMMAND DESCRIPTOR WORD.
* 
*         EXIT   IF NO ERROR, TO *PST* OR *PST7*. 
*                IF ERROR, TO *NER* TO PROCESS ERROR. 
* 
*         USES   A - ALL. 
*                X - ALL. 
*                B - 2, 3, 4, 5, 6, 7.
* 
*         CALLS  GFN, VAL.
* 
*         MACROS ERROR, GET, MEMORY, PARAM, RETURN, WRITEC. 
* 
*         NOTES  THIS ROUTINE INITIALIZES PARAMETERS FOR THE VARIOUS
*                ROUTINES AND IS ENTERED AT SEVERAL PLACES LABELED
*                AS SUCH. 
  
  
 PRMA     VFD    27/0,10/-0,2/0,1/1,*P/  NUMBER * MASK
 PRMB     BSSZ   1           SCRATCH CELL AVAILABLE FOR USE BY PARSER 
 PRMC     BSS    0
          LOC    0
          DATA   1RL         LOCAL FILE 
          DATA   1RR         REPLACE FILE 
          DATA   1RS         SAVE FILE
          DATA   1RC         COPYBACK FILE
          LOC    *O 
 PRMCL    EQU    *-PRMC 
  
 PRM.     EQU    *-1         BASE ADDRESS 
  
**        STRING PARAMETERS.
* 
*         CAN BE ONE OF SEVERAL FORMS WHICH ARE-
*         1.  /STRING...STRING/COUNT   (COUNT OPTIONAL) 
*         2.  /STRING/COUNT            (COUNT OPTIONAL) 
*         3.  /STRING/STRING/COUNT     (COUNT OPTIONAL) 
*         4.  COUNT                    (COUNT OPTIONAL) 
* 
*         THE OPTIONS ARE SELECTED BY USING THE MODIFIER FIELD IN THE 
*         COMMAND DESCRIPTOR WORD. FOR MOST COMMANDS, THE 18 BIT
*         FIELD CONTAINS ANY DATA NEEDED BY EITHER THE  COMMAND 
*         PARSER OR THE COMMAND ROUTINE. HOWEVER- IN THE CASE 
*         OF ANY COMMAND USING THE STRING AND/OR FILE PARAMETER 
*         SPECIFICATION, THE MODIFIER FIELD INFORMATION IS FIXED
*         AND CONTAINS THE FOLLOWING INFORMATION. 
* 
*         BIT 16 = FIRST STRING NECESSARY (CAN BE NULL) 
*         BIT 15 = SECOND STRING NEEDED (CAN BE NULL) 
*         BIT 14 = CHECK FOR SPECIAL ... OR --- IN FIRST STRING 
*         BIT 13 = --- OPTION LEGAL 
*         BIT 12 = UNUSED (BUT ONCE WAS- CLEAR COMMANDS IF USED)
*         BITS 11-5 = UNUSED. 
*         BIT 4 = NO FILE NAME LEGAL. 
*         BIT 3 = SPECIAL FILE NAMES LEGAL. 
*         BITS 2-0 = POST FILE NAME PARAMETER OPTION. 
* 
*         NOTE- ALL STRING PARSES CALL SUBROUTINE *ASF* TO PRESET 
*         THE CELLS NEEDED BY *LOC*.
  
  
 PRM1     PARAM  STRING 
          SA1    COMMAND     OBTAIN DESCRIPTOR
          BX6    X6-X6       CLEAR CELLS
          SA6    P3RP        CLEAR STRING POINTERS
          SA6    A6-B1
          SA6    A6-B1       P2RP 
          SA6    A6-B1
          BX7    X1 
          SA6    A6-B1       P1RP 
          SA6    A6-B1
          SA6    NUMS        CLEAR COUNT FIELD
          SA6    PRMB        SET POSITIVE LOGIC 
          LX7    59-34       MODIFIER BIT 16 AT SIGN BIT
          SA0    B0          SET NO DELIMITER MESSAGE NEEDED
          SB6    X5-1R, 
          NG     X5,PRM9     IF END OF LINE (NO STRING) 
          SA4    PRMA 
          ZR     B6,PRM9     IF NULL PARAMETER (IE. *,,*) 
          SB3    X5          DELIMITER CHARACTER
          SX6    A5+B1       SAVE POINTER TO FIRST CHARACTER
          LX4    B3 
          SB5    X6          ADDRESS OF FIRST CHARACTER 
          NG     X4,PRM9     IF CHARACTER IS 0-9 OR * 
          SA6    P1LP 
  
*         PARSE FIRST STRING FIELD. 
  
 PRM2     SA5    A5+B1       SEARCH FOR CLOSING DELIMITER 
          NG     X5,PRM3     IF END OF LINE FOUND 
          SB4    X5 
          NE     B3,B4,PRM2  IF NOT DELIMITER 
          SX6    A5          SET LWA+1 FOR FIELD
          SA5    A5+B1       STEP PAST DELIMITER
          SA6    A6+B1       CLOSING PARAMETER
          SB6    X6 
          SA1    COMMAND
          LX4    B1,X7       BIT 15 
          SX6    A5          POINTER FOR POSSIBLE SECOND FIELD
          PL     X4,PRM6     IF NOT SUPPOSED TO HAVE 2 STRING 
          SA6    P3LP        SAVE POINTER TO SECOND FIELD 
          EQ     PRM4        PARSE SECOND STRING
  
 PRM3     SX6    A5          SAVE POINTER 
          SA0    B1          SET DELIMITER MESSAGE NECESSARY
          SA6    A6+B1
          LX4    B1,X7       SHIFT MODIFIER BIT 15 (2 STRINGS)
          NG     X4,PRM13    IF 2 STRINGS NEEDED (ARG ERROR)
          EQ     PRM6        ONE STRING FIELD PRESENT 
  
 PRM4     SX6    A5 
          SA0    B1          SET DELIMITER (JUST IN CASE) 
          NG     X5,PRM5     IF END OF LINE 
          SB4    X5 
          SA5    A5+B1
          NE     B4,B3,PRM4  IF NOT AT DELIMITER
          SA0    B0          CLEAR DELIMITER MESSAGE REQUIRED 
 PRM5     SA6    P3RP 
 PRM6     SA1    COMMAND     CHECK FOR SPECIAL FIELDS 
          SA2    P1LP 
          LX1    59-32       MODIFIER BIT 14
          PL     X1,PRM9     IF SPECIAL FIELDS NOT USED 
          SA3    A2+B1       P1RP 
          SX4    1R.
          SB2    X2          LEFT MOST CHARACTER
          LX1    1
          SB3    X3          RIGHT MOST CHARACTER 
          PL     X1,PRM7     IF *---* FORM NOT ALLOWED
          SX4    1R-
 PRM7     GE     B2,B3,PRM8  IF ALL POSITIONS TRIED 
          SA1    B2 
          SB2    B2+B1
          BX1    X1-X4
          NZ     X1,PRM7     IF NOT CHARACTER 
          SA1    B2 
          SB2    B2+B1
          BX1    X1-X4
          NZ     X1,PRM7     IF NOT CHARACTER 
          SA1    B2 
          SB2    B2+B1
          BX1    X1-X4
          NZ     X1,PRM7     IF NOT CHARACTER 
          GT     B2,B3,PRM8    IF PAST LAST CHARACTER IN STRING 
          SA1    P1RP        SET UP POINTERS
          SX7    B2-3 
          SX6    B2 
          SA7    A1          PUT NEW P1RP 
          SA6    A1+B1       PUT P2LP 
          BX7    X1 
          SX6    X4-1R. 
          SA7    A6+B1       PUT P2RP 
          SA6    PRMB        SET ... OR --- FLAG
          EQ     PRM9        PARSE NUMBER 
  
 PRM8     SX3    X4-1R- 
          NZ     X3,PRM9     IF TRIED ... FORM
          SB2    X2          RESET FIRST CHARACTER
          SX4    1R.
          EQ     PRM7        TRY ... FORM 
  
*         SKIP BLANKS AND FIRST COMMA AND EXIT TO OBTAIN ONE NUMBER 
  
 PRM9     SX1    A0 
          ZR     X1,PRM10    IF DELIMITER MESSAGE NOT NEEDED
          ERROR  DEL. 
  
 PRM10    RJ     ASF         ANALYZE STRING FIELDS
          NZ     B2,NER      IF ERROR ENCOUNTERED 
 PRM11    NG     X5,PRM.+NUMBER1  IF END OF LINE REACHED
          SB3    X5-1R
          ZR     B3,PRM12    IF BLANK 
          NE     B3,B1,PRM.+NUMBER1  IF NOT COMMA 
          NZ     B2,PRM.+NUMBER1  IF SECOND COMMA 
          SB2    1           SET COMMA ENCOUNTERED
 PRM12    SA5    A5+B1       NEXT CHARACTER 
          EQ     PRM11       CHECK NEXT CHARACTER 
  
 PRM13    SB2    ARG.        SET ARGUMENT ERROR 
          EQ     NER         PROCESS ERROR
  
**        NEXT PARAMETER. 
* 
*         THIS ROUTINE CHECKS FOR A MINUS SIGN. IF MINUS, IT SETS 
*         *NUMS*+1 EQUAL TO -0, ELSE IT SETS *NUMS*+1 = +0, AND THEN
*         EXITS TO OBTAIN ONE NUMBER. 
  
  
 PRM14    PARAM  NEXT 
          MX6    0
          SX4    X5-1R- 
          SB5    B1          SET ONE NUMBER PARAMETER 
          NZ     X4,PRM15    IF NOT - SIGN
          SA5    A5+B1       STEP OVER - SIGN 
          MX6    60          SET -0 
 PRM15    SA6    NUMS+1 
          EQ     PRM17       OBTAIN NUMBER
  
**        NUMERIC PARAMETERS. 
* 
*         BITS 17-35 CONTAIN NUMBER OF FIELDS TO PARSE. 
  
  
 PRM16    PARAM  NUMBER 
          SA1    COMMAND     GET DESCRIPTOR WORD
          AX1    18 
          SB5    X1          PARAMETER COUNT
  
*         ENTRY POINT  (B5) = NUMBER OF FIELDS. 
  
 PRM17    SB6    1           SET COUNTER
 PRM18    RJ     VAL
          SA6    NUMS-1+B6
          SB6    B6+1 
          LE     B6,B5,PRM18 IF MORE TO GO
          EQ     PST7        END OF PARSE 
  
**        NUMBER1.
* 
*         CRACKS OFF 1 NUMBER. ALLOWS MODIFIER FIELD TO BE USED FOR 
*         OTHER FUNCTIONS.
  
  
 PRM19    PARAM  NUMBER1
          RJ     VAL         PARSE NUMBER 
          SA6    NUMS 
          SA1    INPMODE
          PL     X1,PST7     IF NOT IN INPUT MODE 
          SA2    COMMAND
          MX7    60          PREPARE -0 
          LX2    59-/OPTS/F0
          PL     X2,PST7     IF NOT TO FORCE 0
          SB2    ARG.*100B+1 SET PARAMETER NOT ALLOWED IN INPUT MODE
          NZ     X6,NER      IF USER SPECIFIED A PARAMETER
          SA7    A6          FORCE -0 PARAMETER 
          EQ     PST7        EXIT TO POST COMMAND PROCESSOR 
  
          EQ     PRM17       NOTHING
  
**        NUMBER2.
* 
*         CRACKS OFF 2 NUMBERS. ALLOWS MODIFIER FIELD TO BE USED FOR
*         OTHER FUNCTIONS.
  
  
 PRM20    PARAM  NUMBER2
          SB5    B1+B1       PARAMETER COUNT
          EQ     PRM17       PARSE NUMBERS
  
**        FILE PARAMETER. 
* 
*         PARSES ONE FILE NAME (WITH OPTIONS).
*         EXITS TO SPECIFIED OPTIONAL PARAMETERS. 
  
  
 PRM21    PARAM  ONEFILE
          BX0    X7          COMMAND DESCRIPTOR 
          LX0    59-21       SPECIAL NAMES OK BIT 
          RJ     GFN         PARSE FILE NAME
          SA6    IFN
          ZR     X1,PRM23    IF NAME LEGAL
          SB2    B6          KLUDGE FOR NOW 
          NZ     X6,PRM22    IF NAME IS SPECIAL 
          SX7    B6-BFN.*100B-2  SEE IF NO FILE NAME
          LX0    -1          *NFN* BIT
          NZ     X7,NER      IF NOT *NO FILE NAME*
 PRM22    PL     X0,NER      IF NOT VALID 
 PRM23    SA1    COMMAND
          MX2    -3          OBTAIN POST-FILE OPTIONS 
          AX1    18 
          BX2    -X2*X1 
          LX2    -1 
          SB3    X2+
          JP     PRM24+B3    JUMP TO POST PROCESSING OPTION 
  
 PRM24    PL     X2,PST7     IF NOTHING TO FOLLOW 
          EQ     STRING+PRM. PROCESS STRING FIELD 
  
          EQ     PFMTYPE+PRM.  PROCESS PFM SPECIFICATIONS 
  
**        PFMTYPE.
* 
*         PFMTYPE CRACKS OFF THE LEGAL PFM CODES FOR
*         USE IN THE *END*, *FILE*, AND *QUIT* COMMANDS.
* 
*         THE DATA IS PLACED IN NUMS, WITH THE FOLLOWING
*         CONVENTION- 
* 
*         BIT 0 = LOCAL OR L USED.
*         BIT 1 = REPLACE OR R USED.
*         BIT 2 = DIRECT OR D USED. 
*         BIT 3 = COPY OR C USED. 
* 
*         ANY COMBINATION OF ABOVE ARE LEGAL PROVIDING THAT 
*         ONLY ONE LETTER MNENOMICS ARE USED. (HOWEVER, NOT 
*         ALL COMBINATIONS MADE SENSE). 
  
  
 PRM25    PARAM  PFMTYPE
          BX6    X6-X6       CLEAR ASSEMBLY 
          SB3    PRMC        GET BASE OF MNEMONICS
          SX4    B1 
 PRM26    SB2    PRMCL
          SX0    X5-7600B 
          NG     X0,PRM27    IF NOT ASCII CHARACTER 
          SX5    X5-7600B 
 PRM27    SB2    B2-B1
          LT     B2,PRM28    IF END OF LIST (END OF PARSE)
          SA1    B3+B2
          BX1    X1-X5
          NZ     X1,PRM27    IF NOT THIS ENTRY
          LX0    B2,X4       SHIFT CODE 
          SA5    A5+B1       NEXT CHARACTER 
          BX6    X6+X0
          PL     X5,PRM26    IF MORE TO GO
 PRM28    SA6    NUMS        SET CODES
          NG     X5,PST      IF END OF LINE 
 PRM28.1  SA5    A5+1 
          PL     X5,PRM28.1  IF NOT END OF COMMAND
          EQ     PST         EXIT 
  
**        TOGGLE/SET PARAMETERS.
* 
*         VALID CHARACTERS ARE +,-  OR NULL.
*         + = NUMS IS EQUAL TO +1.
*         - = NUMS IS EQUAL TO -1.
*         NULL =      EQUAL TO +0.
  
 PRM29    PARAM  TOGGLE 
          NG     X5,PRM30    IF END OF LINE 
          SB3    X5-1R+ 
          ZR     B3,PRM32    IF + SIGN
          EQ     B3,B1,PRM33 IF - SIGN
  
 PRM30    SX6    0
 PRM31    SA6    NUMS 
          EQ     PST7        EXIT 
  
 PRM32    SA5    A5+B1       + SIGN PROCESSING
          SX6    B1 
          EQ     PRM31       SET UP EXIT
  
 PRM33    SA5    A5+B1       - SIGN PROCESSING
          SX6    -B1
          EQ     PRM31       SET UP EXIT
  
**        CHARACTER PARAMETERS. 
* 
*         ROUTINE ALLOWS ONE CHARACTER PARAMETER. 
*         IF BIT 18 IS SET IN DESCRIPTOR WORD, THE CHARACTER CANNOT 
*         BE AN ALPHABETIC. 
* 
*         THE CHARACTER IS PLACED IN *NUMS*.
* 
*         NOTE- LOWER CASE LETTERS (IF LEGAL) ARE NOT CONVERTED TO
*               UPPER CASE. XEDIT VIEWS UPPER/LOWER AS DIFFERENT. 
* 
*         IF THERE IS NO PARAMETER, *NUMS* IS SET TO -1.
  
  
 PRM34    PARAM  CHAR 
          MX6    -1          SET NO CHARACTER 
          NG     X5,PRM35    IF NO CHARACTER
          BX6    X5 
          LX7    59-18
          SA5    A5+B1       SET TO NEXT CHARACTER
          SB2    ILL.        INCORRECT PARAMETER (PRESET) 
          PL     X7,PRM35    IF ANY CHARACTER IS LEGAL
          ZR     X6,PRM35    IF COLON 
          SX4    X6-1RZ-1 
          NG     X4,NER      IF A-Z (UPPER CASE)
          SX4    X6-7601B 
          NG     X4,PRM35    IF NOT LOWER CASE (.LT. 7601B) 
          SX4    X4-1RZ 
          NG     X4,NER      IF LOWER CASE
 PRM35    SA6    NUMS        SET CHARACTER
          EQ     PRM40       CHECK FOR NO TRAILING CHARACTERS 
  
**        NULL PARAMETER. 
* 
*         ROUTINE WILL HANDLE OWN PARAMETER CRACKING, HOWEVER, THIS 
*         ROUTINE WILL GIVE THE FIRST CHARACTER ADDRESS AND LAST
*         CHARACTER ADDRESS (+1) IN *NUMS* AND *NUMS+1*.
*         IF *NUMS* IS ZERO, THEN THERE IS NO PARAMETER.
  
  
 PRM36    PARAM  NULL 
          SX6    A5          GET FWA OF PARAMETER 
          SA6    NUMS 
          NG     X5,PRM37    IF NO PARAMETER
 PRM36.1  SA5    A5+B1
          PL     X5,PRM36.1  IF NOT AT END OF PARAMETER 
          SX6    A5 
          SA6    A6+B1       SAVE LWA+1 
          EQ     PRM.+NONE   PROCESS NO PARAMETERS
  
 PRM37    MX6    0
          SA6    A6          REPLACE POINTER
          EQ     PRM.+NONE   PROCESS NO PARAMETERS
  
**        LOAD OVERLAY AND RE-GET PARAMETER CRACKING SPECIFICATIONS.
*         OVERLAY TO LOAD IS IN THE ROUTINE ADDRESS FIELD.
*         ENTRY  (X4) = LOWER 18 BITS CONTAINS OVERLAY NUMBER TO LOAD.
  
  
 PRM38    PARAM  OVL
          SA2    LOVE        LAST OVERLAY LOADED
          SX7    X4+1R0 
          BX3    X7-X2
          ZR     X3,PRM39    IF OVERLAY ALREADY LOADED
          SX0    X4 
          SA7    A2 
 .D       IFNE   DEBUG+FILEOV,0  IF DEBUG MODE OR OVERLAYS FROM SYSTEM
          SA3    LOVA        FORM OVERLAY NAME
          BX6    X3+X7
          LX6    24          LEFT JUSTIFY 
          SA6    LOVC 
 .D       ENDIF 
 .E       IFEQ   DEBUG,1     IF DEBUG ON
          WRITEC OUTPUT,LOVC-1
 .E       ENDIF 
          MEMORY CM,LOVB+X0,R  OBTAIN NECESSARY FIELD LENGTH
 .G       IFEQ   FILEOV,0    IF LOAD FROM LOCAL FILE
          SA1    ACTR        FILE NAME CONTAINING OVERLAY 
          MX2    42 
          BX1    X1*X2
          LX0    6
          OVERLAY X1,X0 
 .G       ELSE               LOAD FROM SYSTEM 
          OVERLAY LOVC,X0,S 
 .G       ENDIF 
          SB7    X1          GET ENTRY POINT (PRESET OVERLAY) 
          JP     B7          ENTER OVERLAY
  
 PRM39    SA1    COMMAND     GET DESCRIPTOR WORD
          AX1    18 
          SA4    X1          OBTAIN COMMAND DESCRIPTOR WORD ADDR-1
          EQ     NCM15       PROCESS COMMAND
  
**        NO PARAMETERS (NONE). 
* 
*         THIS ROUTINE ASSURES THAT THE CHARACTER POINTER IS POSITIONED 
*         AT AN END OF LINE (PSEUDO OR REAL). 
  
  
 PRM40    PARAM  NONE 
*         GO TO *PST7*. 
 PST      SPACE  4,20 
**        PST - POST COMMAND PROCESSOR. 
* 
*         ENTRY  (A1) = C.STR-1.
*                (A5) = ADDRESS OF CURRENT CHARACTER. 
*                (X5) = CURRENT CHARACTER.
*                (PREFIX) = PREFIX OPTIONS. 
*                (COMMAND) = COMMAND DESCRIPTOR.
* 
*         EXIT   TO PROCESS COMMAND, OR TO ERROR ROUTINE. 
* 
*         USES   A - 1, 2, 3, 5, 6. 
*                X - 1, 2, 3, 4, 5, 6.
*                B - 2, 4, 6, 7.
* 
*         CALLS  ETL, GLN, MPR, RTDA, VRY.
* 
*         MACROS ERROR. 
  
  
 PST7     NG     X5,PST      IF END OF LINE 
          SB4    X5-1R
          SA5    A5+1 
          ZR     B4,PST7     IF BLANK 
          SB2    ILL.        INCORRECT PARAMETER
          EQ     NER         PROCESS ERROR, EXIT. 
  
 PST      SA3    C.STR-1     PACK UP LAST COMMAND (PUT INTO LASTCMD)
          UX3    B6,X3
          SB6    A3+B6       FWA OF COMMAND 
          SB7    P.LINE      SET LAST PARAMETER 
          RJ     RTOA        PACK LAST COMMAND
  
*         ENTRY FROM SOME SPECIAL COMMAND PROCESSORS. 
  
 PST1     SB6    B0          PRESET TO *READ REQUIRED*
          LX4    B1,X5       NEG. IF TRUE END OF LINE 
          NG     X4,PST2     IF ABOVE 
          SB6    A5+2-C.STR  SET CHARACTER POINTER
          SX6    X5          REMOVE SPECIAL END OF LINE 
          SA6    A5 
 PST2     SA3    C.STR-1     RESET FOR ENTRY FROM *PST1*
          SA1    COMMAND
          PX6    B6,X3
          SB7    X1          ROUTINE ADDRESS
          SA6    C.STR-1     SAVE POINTER/DELIMITER 
          PL     X3,PST3     IF NOT TO ECHO LINE
          SA1    P.LINE 
          SA3    ETLB        SET COMMAND LINE HEADER
          RJ     ETL
 PST3     SA1    SCOUNT 
          ZR     X1,PST4     IF SLASH COUNT ZERO
          RJ     MPR         ADVANCE POINTER
 PST4     SA1    NXTLINE
          SA2    COMMAND
          ZR     X1,PST5     IF NO ADVANCE TO LINE NUMBER 
          SA3    INPMODE
          NG     X3,NCM20    IF POINTER MOVEMENT NOT ALLOWED, EXIT
          SA3    IWHERE 
          NG     X3,NCM19    IF IN CREATION MODE, EXIT
          RJ     GLN
          NZ     X6,PST6     IF LINE NUMBER NOT FOUND 
          SA2    COMMAND
 PST5     SB7    X2          (X2) = COMMAND DESCRIPTOR WORD 
          BX1    X2 
          JP     B7          PROCESS COMMAND, EXIT
  
*         PROCESS LINE NUMBER NOT FOUND.
  
 PST6     ERROR  LNNF.       ISSUE MESSAGE
          RJ     VRY
          EQ     CER1        RETURN TO ERROR CLEANUP
  
 NER      SPACE  4,15 
**        NER - COMMAND PARSER ERROR PROCESSOR. 
* 
*         ENTRY  (B2) = ORDINAL OF MESSAGE TO PRINT.
* 
*         EXIT   (B2) = ORDINAL OF MESSAGE PRINTED. 
* 
*         USES   A - 0, 5, 6, 7.
*                X - 5, 6, 7. 
*                B - NONE.
* 
*         CALLS  PST. 
  
  
 NER      SX6    NER2        RE-ENTRY ADDRESS 
          NG     X5,NER1     IF AT END OF LINE
 NER0     SA5    A5+1 
          PL     X5,NER0     IF NOT END OF LINE 
 NER1     MX7    0           CLEAR NXTLINE FLAG 
          SA6    COMMAND     SAVE RE-ENTRY
          SA0    B2          SAVE ERROR MESSAGE 
          SA7    NXTLINE
          EQ     PST         FOR PARTIAL PROCESSING, RETURN TO *NER1* 
  
 NER2     SB2    A0          RE-SET ERROR MESSAGE 
          EQ     CER         EXIT 
  
          TITLE  PREFIX CHARACTER ROUTINES. 
**        PREFIX CHARACTERS.
* 
*         THE FOLLOWING ROUTINES ARE CALLED TO PROCESS
*         COMMAND PREFIX CHARACTERS.
 X        SPACE  4,10 
**        X  - TOGGLE VERIFICATION. 
*         ^X - ALTERNATE FORM.
* 
*         ENTRY  NONE.
* 
*         EXIT   TO *NCM*.
* 
*         USES   A - 4, 6.
*                B - 4, 6.
  
  
          PREFIX X
          SA4    XVERIFY     TOGGLE MODE
          BX6    -X4
          SA6    A4-B1
          EQ     NCM2        EXIT 
 PLUS     SPACE  4,10 
**        + - GET DATA INPUT FROM NEW INPUT LINES.
* 
*         ENTRY  NONE.
* 
*         EXIT   TO *NCM*.
* 
*         USES   A - 1, 7.
*                X - 1, 7.
  
  
          PREFIX +
          SA1    PREFIX 
          SX7    1BS"PLUS"
          BX1    X1+X7
          SA7    A1 
          EQ     NCM2        EXIT 
 SLASH    SPACE  4,15 
**        / - SKIP TO A NEW LINE. 
*         ENTRY  NONE.
* 
*         EXIT   (SCOUNT) = (SCOUNT) + 1. 
*                TO *NCM2* IF NO ERRORS.
*                TO *NCM19* OR *NER* IF ERRORS. 
* 
*         USES   A - 1, 7.
*                X - 1, 7.
*                B - 2. 
*         NOTES  SLASH PREFIX PROCESSED IN *PST*. 
* 
  
  
          PREFIX /
          SB2    ARG.*100B+1
          SA1    INPMODE
          NG     X1,NER      IF IN INPUT MODE (POINTER MOTION ILLEGAL)
          SA1    IWHERE 
          NG     X1,NCM19    IF IN CREATION MODE
          SA1    SCOUNT 
          SX7    X1+B1       INCREMENT SLASH COUNT
          SA7    A1 
          EQ     NCM2        EXIT 
 UPARROW  SPACE  4,15 
**         UP ARROW - GO TO TOP OF FILE BEFORE PROCESSING.
* 
*         ENTRY  NONE.
* 
*         EXIT   (SCOUNT) = 0.
*                TO *NCM2* IF NO ERRORS.
*                TO *NCM19* OR *NER* IF ERRORS. 
* 
*         USES   A - 1, 7.
*                X - 1, 7.
*                B - 2. 
  
  
          PREFIX UA.
          SB2    ARG.*100B+1
          SA1    INPMODE
          NG     X1,NER      IF IN INPUT MODE (POINTER MOTION ILLEGAL)
          SA1    IWHERE 
          NG     X1,NCM19    IF IN CREATION MODE
          BX7    X7-X7
          SA7    SCOUNT      ZERO SLASH PREFIX COUNT
          RJ     TOP
          EQ     NCM2        EXIT 
 PREFIXT  SPACE  4,10 
 PREFIXT  BSS    0
 PREFIX   HERE               ASSEMBLE PREFIX TABLE
 PREFIXU  DATA   0           END MARKER 
          PURGMAC  PREFIX    VOID USE OF THIS MACRO 
          TITLE  SPECIAL COMMAND FORMS. 
**        SPECIAL COMMANDS- 
* 
*         THE FOLLOWING COMMANDS PROCESS SPECIAL COMMANDS.
 -        SPACE  4,15 
**        - - EXECUTE LAST Y OR Z COMMAND.
* 
*         ENTRY  AT *DSH1* TO PROCESS *.* COMMAND.
* 
*         EXIT   TO *PST1* IF NO ERRORS.
*                TO *CER* OR *NER* IF ERROR.
* 
*         USES   X - 0, 1, 3, 6, 7. 
*                A - 0, 1, 3, 6, 7. 
*                B - 2. 
* 
*         CALLS  MPR, STK, STL, VAL.
  
  
          SPECIAL  (-)
          SA0    Y.DEV       SET ADDRESS OF DEVICE TO STACK 
  
*         ENTRY  (A0) = ADDRESS OF DEVICE TO STACK. 
  
 DSH1     RJ     VAL
          SB2    ILL. 
          PL     X5,NER      IF ARGUMENT AFTER LINE COUNT 
          SX7    DSH3 
          NG     X6,DSH2     IF USED PARAMETER 0
          NZ     X6,DSH2     IF SPECIFIED A NUMBER
          SX6    1           SET DEFAULT
  
 DSH2     SA6    SKPCNT 
          SA7    COMMAND     SET COMMAND ADDRESS (RE-ENTER) 
          EQ     PST1        CLOSE COMMAND PROCESSING 
  
 DSH3     SA1    SKPCNT 
          RJ     STL         PROCESS INTERRUPT
          ZR     X1,DSH4     IF NOT TO ADVANCE POINTER
          SA3    INPMODE
          SB2    ARG.*100B+1
          NG     X3,CER      IF NOT VALID IN INPUT MODE 
          SA3    IWHERE 
          SB2    CNV.*100B+1
          NG     X3,CER      IF NOT VALID IN CREATION MODE
          RJ     MPR
  
 DSH4     SA1    A0          SET ADDRESS OF DEVICE TO STACK 
          RJ     STK         STACK DEVICES
          SB2    STK. 
          EQ     CER         IF DEVICE IS NOT STACKABLE 
 .        SPACE  4,10 
**        . - EXECUTE LAST COMMAND. 
* 
*         ENTRY  NONE.
* 
*         EXIT   TO *DSH1*. 
* 
*         USES   A - 0. 
  
  
          SPECIAL  (.)
          SA0    P.DEV       SET ADDRESS OF DEVICE TO STACK 
          EQ     DSH1        EXIT, EXECUTE LAST COMMAND 
 SPCMDT   SPACE  4,10 
 SPCMDT   BSS    0
 SPECIAL  HERE               ASSEMBLE SPECIAL COMMAND TABLE 
 SPCMDU   DATA   0           END MARKER 
          PURGMAC  SPECIAL   VOID USAGE OF MACRO
 NCL      SPACE  4,40 
**        NCL - OBTAIN NEXT COMMAND LINE AND PUT INTO *C.STR*.
* 
*         NCL READS THE NEXT LINE FROM THE CURRENT INPUT FILE 
*         AND PLACES IT INTO C.STR (C.STR-1 IS UPDATED ALSO). 
*         IF THERE IS NO FET (IE. THE *.* AND *-* COMMANDS), THE
*         INPUT STACK IS POP-ED AND THE LAST INPUT LINE IS
*         RE-INSTATED AT ITS PREVIOUS POSITION. IF THERE IS A 
*         FET, *READC* IS CALLED TO READ IN THE NEXT LINE. IF 
*         POSITIONED AT AN EOR,EOF,EOI, THE STACK IS POP-ED IF
*         NOT THE PRIMARY INPUT SOURCE. 
* 
*         NDL - OBTAIN NEXT DATA LINE FROM COMMAND LINE AND PUT INTO
*               C.STR.
* 
*         THIS IS A SECOND ENTRY POINT TO *NCL*. SINCE XEDIT ALLOWS 
*         THE USER TO INTERMIX COMMANDS AND DATA, EVERY SO OFTEN
*         XEDIT NEEDS MORE DATA (WHICH EXISTS ON THE NEXT COMMAND 
*         LINE. THIS ENTRY POINT HANDLES THIS CASE. (DESIGNED TO BE 
*         USED WITH *RDL*.) 
* 
*         ENTRY  NONE.
* 
*         EXIT   (X1) = 0 IF DATA HAS BEEN READ.
*                     .NE. 0 IF AN EMPTY CR WAS ENCOUNTERED.
*                RETURNS TO CALLER IF ENTERED VIA *NDL*,
*                ELSE RETURNS TO *NCM*, UNLESS IN *INPUT* MODE, THEN
*                RETURNS TO *INP2*. 
*                IF END OF INPUT AND NOT TTY INPUT FILE, TO *ABT*.
* 
*         USES   A - 1, 2, 3, 4, 5, 6, 7. 
*                X - 1, 2, 3, 4, 5, 6, 7. 
*                B - 6, 7.
* 
*         CALLS  STL, UPL.
* 
*         MACROS PROMPT, READ, READC, WRITEO. 
  
  
 NDL      DATA   0           NEW DATA LINE ENTRY. THIS WORD IS A FLAG.
  
*         IF (NDL) = 0, THEN ENTERED VIA *NCL*, ELSE VIA *NDL*. 
  
 NCL      SA5    C.ON        OBTAIN CURRENT INPUT DEVICE
          SA3    X5-1        GET FET ADDRESS
          ZR     X3,NCL5     IF NO FET (POP STACK)
          SA1    PROMPT 
          SX2    X3          SET FET ADDRESS
          BX6    X1 
          SA4    NDL
          SX7    X2-INPUT 
          NZ     X4,NCL1     IF REQUESTING DATA 
          NG     X3,NCL5     IF POP IF ASKING FOR COMMAND 
          NZ     X7,NCL1     IF NOT PRIMARY INPUT 
          ZR     X6,NCL1     IF NOT TO ISSUE PROMPT 
          WRITEO OUTPUT 
 NCL1     SA1    TTYIN
          SA3    NCLA 
          SA2    BATCH
          BX6    X1+X3
          SA6    A3 
          NZ     X3,NCL2     IF READ NOT NEEDED 
          SA4    NDL
          NG     X2,NCL1.1   IF IN BATCH MODE 
          NZ     X4,NCL1.1   IF ENTERED VIA *NDL* 
          PROMPT OFF         TURN OFF PROMPT
 NCL1.1   READ   INPUT,RECALL 
          SA2    BATCH
          NG     X2,NCL2     IF IN BATCH MODE 
          PROMPT ON          TURN ON PROMPT 
 NCL2     READC  INPUT,X5-34D,33D  READ NEW LINE
          SA3    C.STR-1     RESET CHARACTER INDEX
          NZ     X1,NCL6     IF HIT END OF SOMETHING
          PX6    B1,X3       RESET CHARACTER INDEX
          SA6    A3 
 NCL3     SA1    X5-34D      FWA OF STRING
          SB6    C.STR       FWA OF STRING
          RJ     UPL
          SX1    0           SET SUCCESSFUL READ
 NCL4     SA2    NDL
          ZR     X2,NCL8     IF ENTERED VIA NCL 
          AX2    30 
          BX7    X7-X7
          SA7    TLX         IGNORE INTERRUPT IF DATA LINE
          SB7    X2          OBTAIN RETURN ADDRESS
          SA7    A2          CLEAR *NDL* FLAG 
          JP     B7          RETURN TO CALLER 
  
*         POP INPUT STACK 
  
 NCL5     MX6    1           SET DEVICE IN-ACTIVE 
          SA5    X5          GET NEW DEVICE 
          SA6    A5          IDLE OLD DEVICE
          SA2    X5+B1       GET OLD C.STR-1 WORD 
          BX7    X5 
          LX6    X2 
          SA7    C.ON        CHANGE CURRENT DEVICE POINTER
          SA6    C.STR-1
          EQ     NCL3        UNPACK AND EXIT
  
*         END OF SOMETHING ENCOUNTERED ON INPUT FILE. 
  
 NCL6     SA2    X5-1        GET FET ADDRESS
          SX2    X2-INPUT    PRIMARY INPUT FOR CMD OR DATA
          NZ     X2,NCL5     IF NOT PRIMARY INPUT FILE
          SA4    TTYIN
          NZ     X4,NCL7     IF NOT *TTY* INPUT FILE (ABORT)
          RJ     STL         EVENTUALLY RETURNS TO *NCL* IF INTERRUPT 
          MX6    0           SET READ REQUIRED
          SA6    NCLA        (X1) .NE. 0
          EQ     NCL4        READ INPUT FILE
  
 NCL7     SB6    =C* END OF INPUT ENCOUNTERED - ABORTED.* 
          EQ     ABT         ABORT XEDIT
  
 NCL8     SA2    INPMODE
          NG     X2,INP2     IF IN INPUT MODE 
          ZR     X1,NCM      IF NOT EMPTY CARRIAGE RETURN 
          SA1    UPDATE 
          PL     X1,NCM21    IF IN LOOK MODE
          EQ     INP1        BEGIN INPUT MODE 
  
 NCLA     DATA   0           READ REQ,D FROM INPUT IF ZERO
          TITLE  COMMAND TABLE. 
 JUMP     BSS    0           START OF COMMAND TABLE 
 .ADD     COMMAND  ADD,A,NUMBER1,,ADD,(IN,F0) 
 .ALN     COMMAND  ADDLN,ALN,NUMBER2,-1,PLN,,OVL2 
 .ALNS    COMMAND  ADDLNS,ALNS,NUMBER2,-2,PLN,,OVL2 
 .BOTTOM  COMMAND  BOTTOM,B,NONE,,BTR,(LK)
 .BRIEF   COMMAND  BRIEF,BR,TOGGLE,(XVERIFY*2+0),SFG,(CR,LK,IN) 
 .CHANGE  COMMAND  CHANGE,C,STRING,340000B,CNG,(IN,F0)
 .CS      COMMAND  CHANGES,CS,STRING,340000B,CGS,(IN,F0)
 .COPY    COMMAND  COPY,,ONEFILE,070011B,CPY,(LK,IN,F0),OVL2
 .COPYD   COMMAND  COPYD,,ONEFILE,070011B,CPY11,,OVL2 
 .DBADL   COMMAND  DBADL,DBL,NUMBER1,-1,PBL,,OVL2 
 .DEFTAB  COMMAND  DEFTAB,DT,CHAR,(TABCHAR*2+0),SCH,(CR,IN,LK)
 .DELETE  COMMAND  DELETE,D,STRING,070000B,DLT
 .DEL     COMMAND  DELIMIT,DEL,CHAR,1,DEL,(CR,LK,IN)
 .DEOF    COMMAND  DEOF,DF,NUMBER1,DF,DRF 
 .DEOR    COMMAND  DEOR,DR,NUMBER1,DR,DRF 
 .DLN     COMMAND  DELETELN,DLN,NONE,0,PLN,,OVL2
 .DLB     COMMAND  DLBLANKS,DLB,NUMBER1,,DLB,,OVL2
 .EDIT    COMMAND  EDIT,,NONE,,PEC,(IN) 
 .END     COMMAND  END,E,ONEFILE,000022B,EFQ
 .EXPLAI  COMMAND  EXPLAIN,,NONE,,EXP,(CR,IN,LK),OVL1 
 .FBADL   COMMAND  FBADL,FBL,NUMBER1,1,PBL,(LK),OVL2
 .FILE    COMMAND  FILE,F,ONEFILE,000022B,EFQ 
 .FINDLL  COMMAND  FINDLL,FLL,NUMBER1,,FLL,(LK) 
 .HELP    COMMAND  HELP,H,NULL,,HELP,(CR,LK,IN),OVL1
 .INPUT   COMMAND  INPUT,,CHAR,0,INP,(CR) 
 .INSERT  COMMAND  INSERT,I,NUMBER1,IIB4,IIB,(CR) 
 .IB      COMMAND  INSERTB,IB,NUMBER1,IIB3,IIB,(IN) 
 .LISTAB  COMMAND  LISTAB,LT,NONE,,LTB,(CR,LK,IN),OVL2
 .LOCATE  COMMAND  LOCATE,L,STRING,260000B,LCT,(LK) 
          IF     DEF,TIMES,1
 .LOC     COMMAND  LOC,,STRING,260000B,LCTA,(LK)
 .MODIFY  COMMAND  MODIFY,M,NONE,0,MOD,(IN) 
 .NEXT    COMMAND  NEXT,N,NEXT,,NXT,(LK)
 .NOBELL  COMMAND  NOBELLS,NB,NONE,,NBL,(CR,IN,LK),OVL2 
 .OCTCHA  COMMAND  OCTCHANGE,OC,NULL,300000B,OCT,(IN,F0),OVL2 
 .PRINT   COMMAND  PRINT,P,NUMBER1,,PNT,(CR,IN,LK,F0) 
 .QMOD    COMMAND  QMOD,QM,NUMBER1,0,MOD1,(IN,F0) 
 .QUIT    COMMAND  QUIT,Q,ONEFILE,000022B,EFQ 
 .READ    COMMAND  READ,,NULL,,RDP,,OVL2
 .READP   COMMAND  READP,,NULL,,RDP,,OVL2 
 .REPLACE COMMAND  REPLACE,R,NUMBER1,,RLP,(IN,F0) 
 .RLN     COMMAND  REPLACELN,RLN,NUMBER2,1,PLN,,OVL2
 .RESTOR  COMMAND  RESTORE,REST,NONE,,RST 
 .RM      COMMAND  RMARGIN,RM,NUMBER1,,RMA,(CR,IN,LK) 
 .STOP    COMMAND  STOP,,NONE,,ABO,(CR,LK)
 .TABS    COMMAND  TABS,TAB,NUMBER,NTABS,STB,(CR,LK,IN) 
 .TEOF    COMMAND  TEOF,,TOGGLE,ITOGGLF,TGL,(CR,LK,IN)
 .TEOR    COMMAND  TEOR,,TOGGLE,ITOGGLR,TGL,(CR,LK,IN)
 .TRIM    COMMAND  TRIM,,TOGGLE,TRIM,TGL,(CR,LK,IN) 
 .TRUNC   COMMAND  TRUNCATE,TRUNC,NUMBER1,,TRN,(IN,F0)
 .TOP     COMMAND  TOP,T,NONE,,TTN,(LK) 
 .TOPNUL  COMMAND  TOPNULL,TN,NONE,,TTN 
 .VERIFY  COMMAND  VERIFY,V,TOGGLE,(XVERIFY*2+1),SFG,(CR,LK,IN) 
 .WEOF    COMMAND  WEOF,WF,NONE,34B,WRM,(IN)
 .WEOR    COMMAND  WEOR,WR,NONE,24B,WRM,(IN)
 .WHERE   COMMAND  WHERE,W,NONE,,WHR,(CR,IN,LK) 
 .WM      COMMAND  WMARGIN,WM,NUMBER2,,SWN,(CR,IN,LK) 
 .Y       COMMAND  Y,,NULL,,YZP,(CR,LK,IN)
 .YQMOD   COMMAND  YQMOD,YQM,NUMBER1,0,MOD2,(IN,F0) 
 .Z       COMMAND  Z,,NULL,,YZP,(CR,IN,LK)
 JUMPX    DATA   0
          VFD    2/3,58/0    INCORRECT COMMAND MARKER 
          SPACE  4
**        ASSEMBLE DATA NEEDED FOR OVERLAYS.
*         THIS CODE NEEDS TO BE AFTER THE COMMAND DEFINITIONS.
  
  
 LOVA     VFD    24/0,30/0LXEDIT,6/0   OVERLAY BASE NAME
 LOVB     VFD    30/MINFL,30/0  MINIMUM BASE FIELD LENGTH 
 C.A      SET    1           PREPARE TABLE OF FIELD LENGTHS 
          DUP    MXOVL,3
 C.D      DECMIC C.A
          VFD    30//XEDIT_"C.D"_/LWA,30/0
 C.A      SET    C.A+1
 .H       IFEQ   DEBUG,1     IF DEBUG ON
          DATA   10H LOADING
 .H       ENDIF 
 LOVC     BSSZ   1           OVERLAY NAME 
 LOVD     VFD    6/1,6/,5/,1/1,24/,*P/
 LOVE     CON    0           LAST OVERLAY LOADED
          IFEQ   FILEOV,3,6 
 LOVF     CON    0           .NE.0 IF OVERLAY LOADED FROM LIBRARY 
 LOVG     BSS    0
 .I       IFEQ   DEBUG,1     IF DEBUG ON
 SCRG     FILEC  E.SCR,150D,(FET=13D),EPR 
 .I       ELSE
 SCRG     FILEC  E.SCR,150D,(FET=13D),(USN=LIBRARY),EPR 
 .I       ENDIF 
  
          TITLE  COMMAND PROCESSORS.
**        ENTRY CONDITIONS TO ALL COMMAND PROCESSORS -
* 
*         (X1) = (DECA) - INSTRUCTION DESCRIPTER WORD.
*         (INDEX) = ADDRESS OF INSTRUCTION DESCRIPTER WORD. 
 ABO      SPACE  4,10 
**        ABO - PROCESS ABORT COMMAND.
* 
*         ENTRY  NONE.
* 
*         EXIT   TO *ABT*.
* 
*         USES   A - 2. 
*                X - 2. 
*                B - 6. 
* 
*         MACROS RETURN.
  
  
 ABO      SA2    SPCP 
          LX2    59-58
          PL     X2,ABO1     IF *P* NOT SPECIFIED 
          RECALL SFET 
          SA1    ISFN        GET EDIT FILE NAME 
          SX6    B1          SET COMPLETE BIT 
          BX6    X6+X1
          SA6    X2 
          RETURN X2,R        RETURN EDIT FILE 
 ABO1     SB6    =C* ABORTED* 
          EQ     ABT         ABORT XEDIT
 ADD      SPACE  4,15 
**        ADD - ADD TEXT TO END OF LINE(S). 
* 
*         ENTRY  (NUMS) = NUMBER OF LINES TO ADD. 
* 
*         EXIT   TO NCM.
* 
*         USES   A - 1, 2, 6, 7.
*                X - 1, 2, 3, 4, 6, 7.
*                B - 4, 6, 7. 
* 
*         CALLS  ITM, RDF, RDL, SAC, SAL, VFY, VRY, WTF.
* 
*         ROUTINE REQUESTS ONE LINE OF DATA, AND ADDS IT TO 
*         THE END OF N LINES. THE TRUNCATION MESSAGE IS ISSUED
*         IF THE RESULTANT LENGTH IS GREATER THAN 160 CHARACTERS. 
  
  
 ADD      SA1    NUMS 
          SX6    B1 
          IX6    X1-X6       DECREMENT TO MAKE TESTING EASIER 
          SA6    A1 
          RJ     SAC         SET ASCII PROCESSING 
          RJ     RDL
          NZ     X1,NCM      IF NOTHING ON LINE (RETURN)
          EQ     ADD2        PROCESS ADD
  
 ADD1     SA6    A1          REPLACE COUNT
          RJ     WTF
          RJ     RDF
 ADD2     SA1    E.STR-1
          SA2    D.STR-1
          SX3    X1-160D
          BX3    -X3         NUMBER OF AVAILABLE CHARACTERS 
          IX4    X3-X2
          SB7    A1 
          PL     X4,ADD3     IF NO TRUNCATION 
          BX2    X3          TRUNCATE DATA LINE 
 ADD3     IX7    X1+X2       GET NEW LENGTH 
          SB6    B7+X1       ADDR OF LAST CHAR IN EDIT LINE 
          MX6    2           SET END OF LINE
          SB4    X2+B1       INCLUDE END OF LINE
 ADD4     SA6    B6+B4
          SB4    B4-B1
          SA1    A2+B4
          BX6    X1 
          NZ     B4,ADD4     IF NOT ALL MOVED 
          SA7    E.STR-1
          PL     X4,ADD5     IF NO TRUNCATION 
          RJ     ITM         ISSUE TRUNCATION MESSAGE 
 ADD5     SX7    B1 
          SA7    E.LMOD      SET MODIFICATIONS MADE 
          SA7    NOMOD       SET FILE MODIFICATIONS MADE
          RJ     VRY         VERIFY LINE
          SA1    NUMS 
          SX6    B1 
          IX6    X1-X6
          NG     X6,NCM      IF FINISHED
          EQ     ADD1        PROCESS NEXT LINE
 BTR      SPACE  4,25 
**        BTR - ADVANCE TO BOTTOM OF CURRENT RECORD.
* 
*         ENTRY  NONE.
* 
*         EXIT   TO VRT.
* 
*         USES   A - 1, 2, 3. 
*                X - 1, 2, 3. 
* 
*         CALLS  RDF, WTF.
* 
*         MACROS RECALL.
* 
*         THIS ROUTINE TAKES ASSUMES THAT THE END OF RECORD HAS BEEN
*         ENCOUNTERED WHEN THE FOLLOWING CONDITIONS ARE TRUE. 
*         1. THE FET IS NOT BUSY
*         2. *IN* IS EQUAL TO *OUT* 
*         DUE TO XEDIT,S HABIT OF PASSING OVER NULL RECORD/FILES THESE
*         CONDITIONS WILL LOCATE THE BOTTOM.
*         NOTE- XEDIT WILL TREAT AN EOF AS AN EOR IF THERE IS TEXT
*         IMMEDIATELY BEFORE THE EOF. THIS WAS ASSUMED WITHIN THE 
*         OF THE DESIRED FUNCTION OF BOTTOM.
  
  
 BTR1     RJ     WTF         ADVANCE TO NEXT LINE 
          RJ     RDF
 BTR      SA1    E.IN+2      *IN* 
          SA2    A1+B1       *OUT*
          IX2    X2-X1
          NZ     X2,BTR1     IF *IN* NOT EQUAL TO *OUT* (NOT AT END)
          SA3    E.IN 
          LX3    59-0 
          NG     X3,VRT      IF FET IS COMPLETE 
          RECALL A3          WAIT FET COMPLETION
          EQ     BTR         FIND BOTTOM
 CNG/CNS  SPACE  4,15 
**        CNG/CNS - PROCESS CHANGE AND CHANGES COMMANDS.
* 
*         ENTRY  (NUMS) = IF VIA *CNG*, NUMBER OF LINES.
*                         IF VIA *CNS*, NUMBER OF STRINGS.
* 
*         EXIT   TO *NCM*.
*                IF STRING NOT FOUND, TO *LCT4* 
* 
*         USES   A - 0, 1, 4, 6, 7. 
*                X - 0, 1, 4, 5, 6, 7.
*                B - 6. 
* 
*         CALLS CHS, ITM, RDF, TSL, VRY, WTF. 
  
  
 CNG      SX0    E.SCR+160D  SET LWA+1 OF SCRATCH, ENTRY
          EQ     CNG1        PROCESS CHANGE 
  
 CGS      SX0    E.SCR+160D  SET LWA+1 OF SCRATCH, ENTRY
          MX7    1
          BX0    X0+X7       SET STRING MODE
 CNG1     SA0    E.SCR       SET FWA OF BUFFER
          RJ     CHS         CHANGE STRING(S) 
          ZR     B5,CNG5     IF STRING NOT FOUND
          NZ     X5,CNG2     IF NO TRUNCATION 
          SA1    P1RP        CHECK IF STRING LENGTHS ARE EQUAL
          SA4    P1LP 
          IX6    X1-X4
          SA1    P3RP 
          SA4    P3LP 
          IX1    X1-X4
          IX6    X6-X1
          ZR     X6,CNG2     IF STRING LENGTHS ARE EQUAL
          RJ     ITM         ISSUE TRUNCATION MESSAGE 
 CNG2     SA1    E.SCR
          SB6    E.STR-1
          SX7    B1 
  
*         COPY LINE BACK FROM SCRATCH AREA. 
  
 CNG3     BX6    X1 
          SB6    B6+B1
          SA1    A1+B1
          SA6    B6 
          PL     X6,CNG3     IF NOT END OF LINE 
          SB6    E.STR-1
          RJ     TSL         TRIM SPACES OFF LINE 
          SA7    NOMOD
          SA7    E.LMOD 
          RJ     VRY         VERIFY THE CHANGE
          BX6    X0 
          AX6    59-1        =0 IF REGULAR, =-1 IF STRING MODE
          SA1    NUMS 
          IX6    X1-X6       IF STRING, INCREMENT 
          SX1    B1 
          IX7    X6-X1
          IX6    X7-X1
          NG     X6,NCM      IF FINISHED
          SA7    A1+
  
*         ADVANCE POINTER AND CONTINUE. 
  
 CNG4     BX5    X0          SAVE (X0)
          RJ     WTF
          RJ     RDF
          BX0    X5          RESTORE (X0) 
          EQ     CNG1        CONTINUE CHANGE
  
*         PROCESS STRING NOT FOUND. 
  
 CNG5     SA1    NUMS 
          PL     X1,CNG4     IF NOT 0 OPTION
          EQ     LCT4        ISSUE * STRING NOT FOUND.* 
 DEL      SPACE  4,10 
**        DEL - SET DELIMITER CHARACTER.
* 
*         ENTRY  (NUMS) = NEW DELIMITER CHARACTER.
* 
*         EXIT   TO *NCM*.
* 
*         USES   A - 1, 2, 4, 6.
*                X - 1, 2, 3, 4, 6. 
  
  
 DEL      SA2    NUMS 
          MX3    -18
          BX2    -X3*X2      REMOVE EXCESS CHARACTERS (IF -1) 
          SA4    C.ON 
          SX4    X4-Y.DEV 
          ZR     X4,DEL1     IF NOT CURRENTLY *Y/Z* LINE
  
*         NOTE- Y/Z DELIMIT COMMAND TAKES EFFECT
*         OUTSIDE OF *Y/Z* COMMAND STRING.
  
          SA1    C.STR-1
          BX1    X3*X1
          IX6    X1+X2
          SA6    A1 
 DEL1     SA1    I.DEV+1
          BX1    X3*X1
          IX6    X1+X2
          SA6    A1 
          SA1    S.DEV+1
          BX1    X3*X1
          IX6    X1+X2
          SA6    A1 
          EQ     NCM         EXIT 
 DLT      SPACE  4,15 
**        DLT - DELETE LINE(S). 
* 
*         ENTRY  (NUMS) = COUNT (-0 = NO ADVANCE).
*                STRING FIELDS PARSED AND INITIALIZED.
* 
*         EXIT   TO *NCM*.
* 
*         USES   A - 1, 6, 7. 
*                X - 1, 5, 6, 7.
*                B - 4. 
* 
*         CALLS  LOC, RDF, VRY, WTF.
  
  
 DLT1     SA1    NUMS 
          NG     X1,LCT4     IF -0 OPTION. (STRING NOT FOUND) 
          RJ     WTF
 DLT2     RJ     RDF
 DLT      SB4    E.STR-1     SET FWA SEARCH -1
          RJ     LOC
          ZR     B5,DLT1     IF STRING NOT IN LINE
          SA1    NUMS 
          SX7    B1 
          IX6    X1-X7       DECREMENT COUNT
          AX5    X1,B1
          SA6    A1 
          SA7    NOMOD       SET MODIFICATIONS MADE TO FILE 
          RJ     VRY         VERIFY DELETED LINE
          NZ     X5,DLT2     IF MORE TO DELETE
          RJ     RDF         CREAM EXISTING LINE
          EQ     NCM         EXIT 
 DRF      SPACE  4,10 
**        DRF - DELETE RECORD/FILE MARKS. 
* 
*         ENTRY  (NUMS) = NUMBER TO DELETE. 
*                (X1) = ADDRESS OF DELETION COUNT CELL. 
* 
*         USES   A - 0, 1, 2, 6.
*                X - 1, 2, 6. 
* 
*         CALLS  RDF, WTF.
  
  
 DRF      SA2    NUMS 
          AX1    18          GET CELL ADDRESS 
          SA0    X1          SAVE CELL
          NZ     X2,DRF0     IF NOT ZERO
          SX2    1
 DRF0     BX6    X2 
          SA6    A0          SET DELETION COUNT 
 DRF1     RJ     WTF         WRITE CURRENT LINE 
          RJ     RDF         READ NEXT
          SA1    A0 
          NZ     X1,DRF1     IF NOT DELETED 
          MX6    0
          SA6    NOMOD       SET MODIFICATIONS MADE 
          EQ     NCM         EXIT 
 PEC      SPACE  4,15 
**        PEC - PROCESS EDIT COMMAND. 
* 
*         ENTRY  NONE.
* 
*         EXIT   (INPMODE) = 1. 
*                TO *NCM*.
* 
*         USES   A - 6. 
*                X - 6. 
* 
*         MACROS WRITEC.
  
  
 PEC      SX6    B1 
          SA6    INPMODE     CLEAR INPUT MODE FLAG
          WRITEC OUTPUT,(=C* EDIT*) 
          EQ     NCM         EXIT 
 EFQ      SPACE  4,20 
**        EFQ - END, FILE, AND QUIT PROCESSOR.
* 
*         ENTRY  (IFN) = FILE NAME PARAMETER. 
*                (NUMS) = OPTIONS.
* 
*         EXIT   IF TO TERMINATE XEDIT, TO *EXT*. 
*                IF ERRORS, TO *CER* OR *NCM*.
* 
*         USES   A - ALL. 
*                X - ALL. 
*                B - 2, 6, 7. 
* 
*         CALLS  CFF, PFM=, RDF, TOP. 
* 
*         MACROS ERROR, FERROR, READ, RECALL, RENAME, 
*                REWIND, STATUS.
  
  
 EFQ      SA5    IFN         GET SPECIFIED NAME 
          SX6    B1 
          MX7    0
          NZ     X5,EFQ0     IF FILE NAME SPECIFIED 
          SA5    ISFN        USE *EDITFIL*
 EFQ0     SA7    SFET+5      CLEAR FNT/FST INFORMATION
          BX6    X6+X5
          SA7    A7+B1
          SA6    SFET 
          RECALL E.IN        WAIT ALL QUIET 
          STATUS SFET,P      OBTAIN INFORMATION 
          SA4    SFET+5      GET FNT ENTRY
          SA1    SFET+1 
          MX7    -6          SAVE FILE STATUS 
          BX7    -X7*X4 
          SA7    EFQB 
          MX6    -8          ISOLATE PFM ERROR CODE 
          MX7    1
          SA3    NUMS        GET OPTIONS
          BX1    -X7*X1      CLEAR BIT 59 
          LX4    -6          POSITION TO FILE TYPE
          BX6    -X6*X4      OBTAIN FILE TYPE 
          AX1    -12         SHIFT DEVICE TYPE
          SX0    X6-PMFT     =0 IF D.A. FILE
          ZR     X0,EFQ1     IF DIRECT ACCESS FILE
          SX0    X6-QFFT
          ZR     X0,EFQ1     IF QUEUE FILE
          SX0    X1-2RMT
          ZR     X0,EFQ1     IF *MT* TYPE FILE
          SX0    X1-2RNT
  
*         (X0) = 0, IF FILE IS D.A., QUEUE, MT OR NT (NEED COPYBACK). 
*         (X5) = FILE NAME. 
*         (X3) = OPTIONS. 
*         (X4) = FNT ENTRY SHIFTED LEFT -6. 
  
 EFQ1     NZ     X3,EFQ2     IF HAVE EXIT TYPE
          SX3    1BS0        SET DEFAULT OF LOCAL 
          NZ     X0,EFQ2     IF NOT DEFAULT OF COPYBACK 
          SX3    1BS3        SET DEFAULT OF COPYBACK
  
*         CLEAR *L* FLAG IF *C* FLAG USED.
  
 EFQ2     BX6    X3 
          SX7    B1 
          LX6    0-3
          BX6    X7*X6       GET *C* FLAG 
          BX3    -X6*X3      CONDITIONALLY CLEAR *L*
          LX1    X3 
  
*         CHECK MODIFICATIONS ALLOWED TO FILE.
  
          SX7    50000B/100B
          SB2    EMI.*100B+1
          BX7    X7*X4
          NZ     X7,CER      IF NOT ALLOWED TO MODIFY FILE, EXIT
 EFQ3     NZ     X0,EFQ4     IF NOT DA/MT/NT
  
*         IF DA/MT/NT MAKE SURE *L* NOT USED. 
  
          SB2    EMI.*100B+2
          LX1    59-0 
          NG     X1,CER      IF *L* USED, EXIT
  
*         (X3) = EXIT BITS (LOCAL,REPLACE,SAVE,COPYBACK). 
*         (X5) = FINAL FILE NAME. 
  
 EFQ4     SA2    NOMOD       SET NOMOD TO NOMOD .OR. FS 
          SA1    FS          IF NOT ON SCRATCH FILE, COPY TO ONE
          SA0    X3          MOVE EXIT BITS TO A0 
          BX6    X1*X2       UPDATE NOMOD 
          MX7    0
          SA6    A2 
          SA7    IWHERE      SET =0 TO FORCE COPY IF AT LINE 1
          RJ     TOP         COPY FILE TO SCRATCH FILE
          SX0    A0          SET STATUS BITS TO X0
          SA4    EFQA-1 
 EFQ5     SA4    A4+B1       GET NEXT OPTION
          ZR     X4,EFQ10    IF END OF OPTIONS
          UX3,B7 X4 
          SB6    X4 
          LX1    B7,X0
          PL     X1,EFQ5     IF OPTION NOT SPECIFIED
          JP     B6          PROCESS OPTION 
  
*         PROCESS PFM OPTIONS.
  
 EFQ6     SA1    E.IN        GET LOCAL NAME 
          LX3    18          GET PFM CODE 
          SX7    B1 
          ERRNZ  PTRD-1 
          BX6    X5+X7
          BX7    X7+X1       SET COMPLETE 
          SA7    PFET        SET LOCAL NAME 
          SX7    X3 
          SA6    PFET+8      SET PERMANENT NAME 
          SA0    A6          SAVE FILE NAME ADDRESS 
          SX2    A7          SET FET ADDRESS
          RJ     PFM=        MAKE REQUEST 
          SA1    X2 
          MX6    -8 
          AX1    10 
          BX6    -X6*X1      GET PFM ERROR
          ZR     X6,EFQ9     IF VERIFY ACTION 
          ERROR  PFM.,X6     ISSUE PFM ERROR MESSAGE
          EQ     EFQ11       END OF COMMAND 
  
*         PROCESS LFM RENAME OPTION.
  
 EFQ7     SA1    EFQB 
          ZR     X1,EFQ7.1   IF *AUTO DROP* STATUS
          SX1    X1-NDST
          NZ     X1,EFQ8     IF STATUS OTHER THAN *NO AUTO DROP*
 EFQ7.1   SA0    E.IN+6 
          BX6    X5 
          SA6    A0          SET NEW NAME INTO FET
          RENAME E.IN        RENAME SCRATCH FILE
          SA1    X2 
          SX7    17BS10 
          BX7    X7*X1
          SA7    FS          INDICATE NOT READING SCRATCH FILE
          NZ     X7,EFQ7.2   IF ERROR IN *RENAME* 
          SA1    EFQB        GET FILE STATUS
          ZR     X1,EFQ9     IF *AUTO DROP* STATUS
          SETFS  E.IN,NAD    RESTORE *NO AUTO DROP* STATUS
          SA1    X2          CHECK FOR ERRORS 
          SX4    17BS10 
          BX7    X4*X1
          ZR     X7,EFQ9     IF NO ERRORS IN *SETFS*
 EFQ7.2   ERROR  LFM. 
          EQ     EFQ11       END OF COMMAND 
  
 EFQ8     READ   E.IN        START READ (ASSUMES NAME IN FET) 
          SX6    B1 
          BX6    X5+X6       SET COMPLETE 
          SA6    CFET 
          REWIND A6,RECALL   RESET COPY FILE
          MX6    0
          SA6    CFET+5      CLEAR JUNK LEFT VIA STATUS 
          SA6    A6+B1
          RJ     CFF         COPY FILE
          REWIND E.IN        RESET EDIT FILE
          REWIND CFET,RECALL REWIND COPY FILE 
          RECALL E.IN 
          SA0    CFET        SET FILE NAME POINTER
  
*         VERIFY ACTION.
  
 EFQ9     SA1    VERIFY 
          SA4    A4          RESTORE THE *EFQ* OPTION WORD
          SX2    A0          SET FET ADDRESS
          PL     X1,EFQ5     IF NOT TO VERIFY 
          AX4    18 
          SA0    A4          SAVE VALUE OF A4 
          FERROR X2,X4
          SA4    A0          RESET A4 
          EQ     EFQ5        GET NEXT OPTION
  
*         PROCESS END OF COMMAND. 
  
 EFQ10    SA1    INDEX
          SX1    X1-.FILE 
          NZ     X1,EXT      IF EXIT XEDIT
 EFQ11    READ   E.IN,RECALL
          RJ     RDF
          EQ     NCM         PROCESS END OF COMMAND 
  
*         TABLE OF *EFQ* OPTIONS. 
*         FORMAT IS-
*         12/2000B+59-BIT NUMBER,6/PFM CODE,24/VERIFY ADDR,18/ROUTINE 
  
 EFQA     VFD    12/2000B+59-2,6/1,24/FSV.,18/EFQ6    SAVE
          VFD    12/2000B+59-1,6/6,24/FRP.,18/EFQ6    REPLACE 
          VFD    12/2000B+59-0,6/0,24/FLC.,18/EFQ7    LOCAL 
          VFD    12/2000B+59-3,6/0,24/FCP.,18/EFQ8    COPYBACK
          DATA   0
 EFQB     BSS    1           STORAGE FOR EDIT FILE STATUS 
 FLL      SPACE  4,15 
**        FLL - FIND LONG LINE PROCESSOR. 
* 
*         ENTRY  (NUMS) = NUMBER OF LONG LINES TO FIND. 
*                (IW) = WIDTH. IGNORE LINES OF LENGTH .LE. WIDTH. 
* 
*         EXIT   TO *NCM*.
* 
*         USES   A - 1, 2, 6. 
*                X - 1, 2, 6. 
* 
*         CALLS  SAC, VFY.
  
  
 FLL      RJ     SAC         SET ASCII PROCESSING 
 FLL1     SA1    E.STR-1     GET CHARS IN CURRENT LINE
          SA2    IW 
          IX1    X2-X1
          PL     X1,FLL2     IF LINE TOO SHORT
          RJ     VRY         VERIFY LONG LINE 
          SA1    NUMS 
          SX6    B1 
          IX6    X1-X6
          AX1    1
          ZR     X1,NCM      IF COUNT FINISHED, EXIT
          SA6    A1 
 FLL2     RJ     WTF         ADVANCE TO NEXT LINE 
          RJ     RDF
          EQ     FLL1        CHECK NEXT LINE
 FLN      SPACE  4,15 
**        FLN - ADVANCE TO SPECIFIED LINE NUMBER. 
* 
*         ENTRY  (NUMS) = LINE NUMBER.
* 
*         EXIT   TO *VRT*.
* 
*         USES   A - 1. 
*                X - 1, 6.
* 
*         CALLS  GLN. 
  
  
 FLN      SA1    NUMS 
          SX6    B1 
          IX6    X1-X6
          PL     X6,FLN1     IF LINE NUMBER SPECIFIED 
          SX1    B1+
 FLN1     RJ     GLN         GET LINE NUMBER
          EQ     VRT         EXIT, VERIFY LINE
 IIB      SPACE  4,15 
**        IIB - *INSERT* AND *INSERT BEFORE* PROCESSOR. 
* 
*         ENTRY  (NUMS) = NUMBER OF LINES TO INSERT.
*                (X1)   = PROCESSOR ADDRESS.
* 
*         EXIT   TO *NCM*.
* 
*         USES   X - 1, 2, 6, 7.
*                A - 0, 1, 2, 6, 7. 
*                B - 7. 
* 
*         CALLS  RDL, TCD, TLB, WTF.
* 
*         MACROS WRITEC.
* 
*         NOTES  A NULL LINE WILL OVERRIDE THE LINE COUNT.
  
  
 IIB      BSS    0           ENTRY
          AX1    18          GET ROUTINE JUMP ADDRESS 
          SA2    NUMS 
          SA0    X1          SET JUMP ADDRESS 
          SX6    B1 
          IX6    X2-X6
          SA6    A2+
 IIB1     RJ     RDL         GET DATA LINE
          NZ     X1,NCM      IF A NULL LINE ENCOUNTERED 
          RJ     TCD         TAB CODED DATA LINE
 IIB2     SB7    A0 
          JP     B7          EXECUTE PROCESSOR
  
*         *INSERT BEFORE* PROCESSOR.
  
 IIB3     WRITEC E.OUT,D.LINE  PUT LINE JUST RECEIVED 
          SA1    IWHERE      UPDATE *IWHERE*
          SX6    B1 
          IX6    X1+X6
          SA6    A1+
          EQ     IIB5        PROCESS NEXT LINE
  
*         *INSERT* PROCESSOR. 
  
 IIB4     RJ     WTF         WRITE EXISTING LINE
  
*         MOVE NEW LINE TO *E.LINE*.
  
          RJ     TLB         TRANSFER LINE TO BUFFER
 IIB5     SA1    NUMS 
          SX6    B1 
          IX6    X1-X6
          BX7    X7-X7
          SA6    A1          DECREMENT LINES LEFT 
          SA7    NOMOD       SET MODIFICATIONS MADE 
          PL     X6,IIB1     IF MORE LINES
          EQ     NCM         EXIT 
 INP      SPACE  4,15 
**        INP - ENTRY INPUT MODE REQUEST. 
* 
*         ENTRY  (NUMS) = ESCAPE CHARACTER. 
* 
*         EXIT   IF ERROR, TO *ABT* OR *CER*. 
*                ELSE, TO *PEC*.
* 
*         USES   A - 1, 2, 6, 7.
*                X - 1, 2, 6, 7.
*                B - 6, 7.
* 
*         CALLS  RDL, RTA, STK, TAB, UPL, WTF.
* 
*         MACROS WRITEC.
  
  
 INP      SA1    NUMS        MOVE INPUT ESCAPE CHARACTER
          SA2    BATCH
          BX6    X1 
          SB6    =C+ *INPUT* ESCAPE CHAR. REQUIRED - BATCH MODE.+ 
          PL     X1,INP0     IF CHARACTER SPECIFIED 
          NZ     X2,ABT      IF BATCH MODE, EXIT
 INP0     SA6    INPCHAR     SET ESCAPE CHARACTER 
  
 INP1     MX7    59          SET INPUT MODE 
          SA7    INPMODE
          WRITEC OUTPUT,(=C* INPUT*)
 INP2     SA1    PREFIX 
          SX6    1BS"PLUS"
 .CYB     IF     DEF,CYBRNET
          BX6    -X6*X1      CLEAR PLUS PREFIX
 .CYB     ELSE
          BX6    X6+X1       SET + PREFIX 
 .CYB     ENDIF 
          SA6    A1 
          RJ     RDL         READ DATA LINE 
          NZ     X1,PEC      IF <CR> (RETURN TO EDIT MODE)
          SA1    D.LINE 
          SB6    D.STR
          RJ     UPL         UNPACK TEXT LINE 
          SA1    D.STR
          SA2    INPCHAR
          IX2    X2-X1
          SB6    A1-B1
          ZR     X2,INP3     IF INPUT MODE ESCAPE CHAR
          MX6    0
          SA6    NOMOD       SET MODIFICATIONS MADE 
          RJ     TAB         TAB TEXT LINE
          RJ     WTF
          SB7    E.LINE      SET DESTINATION
          SB6    D.STR
          RJ     RTA         PACK LINE INTO EDIT LINE BUFFER
          EQ     INP2        PROCESS NEXT LINE
  
 INP3     SB7    S.LINE      PACK COMMAND LINE INTO SPECIAL BUFFER
          SB6    D.STR+1     AND SKIP ESCAPE CHARACTER
          RJ     RTA
          SA1    S.DEV
          RJ     STK         PROCESS ESCAPED COMMANDS 
          SB2    STK. 
          EQ     CER         COMMAND STACKING ERROR, EXIT 
 LCT      SPACE  4,20 
**        LCT - LOCATE SPECIFIED STRING.
* 
*         ENTRY  (X5) .NE. 0. 
*                (NUMS) = NUMBER OF MATCHES TO FIND.
*                         IF -0, THEN DO NOT ADVANCE POINTER. 
*                (MCOUNT) = 0.
*                STRING POINTERS ARE INITIALIZED PROPERLY.
* 
*         EXIT   TO *NCM*.
* 
*         USES   A - 1, 2, 3, 6, 7. 
*                X - 1, 2, 3, 5, 6, 7.
*                B - 4. 
* 
*         CALLS  LOC, RDF, VRY, WTF.
* 
*         MACROS ERROR. 
  
  
          IF     DEF,TIMES
 LCTA     BSS    0           TIMING ENTRY 
          SX5    0           SET NOT TO CALL LOC
          ENDIF 
  
 LCT      BSS    0           NORMAL ENTRY 
          SA1    NUMS 
          NZ     X1,LCT1     IF COUNT IS .NE. 0 
          NG     X1,LCT1     IF *0* COUNT WAS SPECIFIED 
          SX6    B1          RESET COUNT TO 1 
          SA6    A1 
 LCT1     SB4    E.STR-1     SET FWA-1 FOR SEARCH 
  
          IF     DEF,TIMES,1
          ZR     X5,LCT1.1   IF IN DEBUGGING MODE 
  
          RJ     LOC         SEARCH EXISTING LINE FOR STRING
  
          IF     DEF,TIMES,1
 LCT1.1   BSS    0
  
          ZR     B5,LCT3     IF STRING NOT FOUND
          RJ     VRY
          SA2    MCOUNT 
          SA1    NUMS 
          SX6    B1 
          IX7    X2+X6       INCREMENT NUMBER OF MATCHES
          IX6    X1-X6       DECREMENT NUMBER OF LINES
          SA7    A2 
          AX1    1
          ZR     X1,NCM      IF FINISHED, EXIT
          SA6    A1 
 LCT2     RJ     WTF         ADVANCE TO NEXT LINE 
          RJ     RDF
          EQ     LCT1        SEARCH NEXT LINE 
  
*         STRING NOT IN LINE. CHECK FOR *0* OPTION. 
  
 LCT3     SA1    NUMS 
          NZ     X1,LCT2     IF NOT *0* OPTION
 LCT4     ERROR  SNF.        ENTRY FOR * STRING NOT FOUND.* 
          SA3    C.STR-1     SET TO *READ* FOR NEXT CMD 
          PX6    B0,X3
          SA6    A3 
          EQ     NCM         EXIT 
 MOD      SPACE  4,10 
**        MOD - MODIFY LINE(S). 
* 
*         ENTRY  AT *MOD* FOR *MODIFY* COMMAND. 
*                AT *MOD1* FOR *QMOD* COMMAND.
*                AT *MOD2* FOR *YQMOD* COMMAND. 
* 
*         USES   A - 1, 3, 6, 7.
*                X - 1, 3, 6, 7.
* 
*         CALLS  ETL, ITM, MDY, PCN, RDF, RDL, SAC, SCD, VRY, WTF.
  
  
*         ENTRY TO PROCESS *MODIFY* COMMAND.
  
 MOD      RJ     SCD         SET CODED FOR SHIFT
          SX6    1
          SA1    E.LINE 
          SA6    NUMS        FORCE COUNT TO 1 
          SA3    MODA        SET SHIFT WORD 
          RJ     ETL         ECHO TEXT LINE 
          EQ     MOD2        PERFORM MODIFICATION 
  
*         ENTRY FOR *QMOD* COMMAND. 
  
 MOD1     RJ     PCN         PRINT COLUMN NUMBERS 
  
*         ENTRY FOR *YQMOD* COMMAND.
  
 MOD2     RJ     SAC         SET ASCII PROCESSING 
          RJ     RDL         READ DATA LINE 
          NZ     X1,NCM      IF NOTHING THERE, EXIT 
 MOD3     RJ     MDY         MODIFY LINE
          PL     B3,MOD4     IF NO TRUNCATION 
          RJ     ITM
 MOD4     SX7    1
          SA7    NOMOD       SET MODIFICATIONS MADE 
          SA7    E.LMOD      SET LINE MODIFICATIONS MADE
          RJ     VRY         AND THEN VERIFY IT 
          SA1    NUMS 
          SX6    B1 
          IX6    X1-X6
          AX1    1
          ZR     X1,NCM      IF FINISHED
          SA6    A1 
          RJ     WTF
          RJ     RDF
          EQ     MOD3        PROCESS NEXT LINE
  
 MODA     CON    2L  +11     PARAMETER FOR *ETL*
  
 MOD      RMT                BATCH PARAMETER DEFINITION 
          CON    3L   +17 
          RMT 
  
 NXT      SPACE  4,10 
**        NXT - PROCESS NEXT COMMAND. 
* 
*         ENTRY  (NUMS) = NUMBER OF LINES TO MOVE.
*                (NUMS+1) = DIRECTION OF MOVE (-0 = BACKWARDS,
*                           +0 = FORWARDS). 
* 
*         USES   A - 1, 2, 6. 
*                X - 1, 2, 6. 
* 
*         CALLS  MPR, VRT.
  
  
 NXT      SA1    NUMS 
          MX6    0           SET E.NMODE TO CODED 
          SA2    A1+B1
          BX1    X1-X2       OBTAIN PROPER DISPLACEMENT 
          NZ     X1,NXT1     IF NOT ZERO DISPLACEMENT (ASSUME 1)
          SX1    B1          SET *NEXT-1* COMMAND 
 NXT1     SA6    E.NMODE
          RJ     MPR         MOVE THE POINTER 
          EQ     VRT         VERIFY AND RETURN
 PNT      SPACE  4,15 
**        PNT - PRINT COMMAND PROCESSOR.
* 
*         ENTRY  (NUMS) = NUMBER OF LINES TO PRINT. 
* 
*         EXIT   TO *NCM*.
* 
*         USES   A - 1, 2, 4, 6.
*                X - 1, 2, 4, 6.
* 
*         CALLS  RDF, SCD, WTF. 
* 
*         MACROS WRITEC.
  
  
 PNT      SA1    NUMS 
          SA2    IWHERE 
          SX6    B1 
          IX6    X1-X6       DECREMENT BY ONE (MAKE TESTING EASIER) 
          NG     X2,PNT2     IF IN CREATION MODE
          SA6    NUMS 
          RJ     SCD         SET CODED LINE FORMAT
 PNT1     SA4    IW          PRINT LINE 
          WRITEC OUTPUT,E.LINE
          SA1    NUMS 
          SX6    B1 
          IX6    X1-X6       DECREMENT COUNT
          NG     X6,NCM      IF DONE, EXIT
          SA6    NUMS 
          RJ     WTF
          RJ     RDF
          EQ     PNT1        PRINT NEXT LINE
  
 PNT2     WRITEC OUTPUT,(=C* NULL LINE - IN CREATION MODE*) 
          EQ     NCM         EXIT 
 RLP      SPACE  4,15 
**        RLP - *REPLACE* PROCESSOR.
* 
*         ENTRY  (NUMS) = NUMBER OF LINES TO REPLACE. 
* 
*         EXIT   TO *NCM*.
* 
*         USES   X - 2, 6, 7. 
*                A - 2, 6, 7. 
* 
*         CALLS  RDF, RDL, TCD, TLB, WTF. 
* 
*         NOTES  A NULL LINE WILL OVERRIDE THE LINE COUNT.
  
  
 RLP1     RJ     WTF         COPY DATA LINE TO EDIT FILE
  
*         READ EDIT FILE.  IF EOI, EXIT TO *NCM*. 
  
          RJ     RDF
  
 RLP      BSS    0           ENTRY
          RJ     RDL         GET DATA LINE
          NZ     X1,NCM      IF EMPTY <CR> WAS ENCOUNTERED
          RJ     TCD         TAB CODED DATA LINE
          RJ     TLB         TRANSFER LINE TO *E.LINE*
          SA2    NUMS        DECREMENT LINE COUNT 
          SX7    B1 
          IX6    X2-X7
          IX2    X6-X7
          BX7    X7-X7
          SA7    NOMOD       SET MODIFICATIONS MADE 
          SA6    A2+
          PL     X2,RLP1     IF LINE COUNT NOT EXHAUSTED
          EQ     NCM         EXIT 
 RMA      SPACE  4,15 
**        RMA - PROCESS RIGHT MARGIN COMMAND. 
* 
*         ENTRY  (NUMS) = NEW VALUE OF MARGIN (0 = RESET TO MAXIMUM). 
* 
*         EXIT   (IW) = THE VALUE OF THE RIGHT MARGIN.
*                       IF NO PARAMETER GIVEN, *MAXWD*. 
*                IF WIDTH IS NOT IN RANGE, TO *CER*, ELSE TO *NCM*. 
* 
*         USES   A - 1, 6.
*                X - 1, 2, 3, 6.
*                B - 2. 
  
  
 RMA      SA1    NUMS 
          SX3    X1-MAXWD-1 
          NZ     X1,RMA1     IF WIDTH SPECIFIED (ELSE DEFAULT TO 160) 
          SX1    160D 
 RMA1     SX2    X1-MINWD 
          BX3    -X3+X2 
          LX6    X1 
          SB2    ILL. 
          NG     X3,CER      IF WIDTH NOT IN RANGE
          SA6    IW 
          EQ     NCM         EXIT 
 SWN      SPACE  4,15 
**        SWN - SET WINDOWS.
* 
*         ENTRY  (NUMS) = LEFT WINDOW.
*                (NUMS+1) = RIGHT MARGIN. 
* 
*         EXIT   (LMW) = LEFT WINDOW. 
*                (RMW) = RIGHT WINDOW.
*                (RTWD) = RIGHT WINDOW MARGIN.
*                IF ERROR, TO *CER*, ELSE TO *NCM*. 
* 
*         USES   A - 1, 2, 6, 7.
*                X - 1, 2, 3, 4, 5, 6, 7. 
*                B - 2. 
  
  
 SWN      SA1    NUMS 
          SA2    A1+B1
          IX3    X2-X1       POSITIVE, IF LEFT .LE. RIGHT 
          SX4    X1-1        POSITIVE IF 0 .LT. LEFT
          SX5    X2-161      NEGATIVE IF RIGHT .LE. 160 
          BX3    X3+X4
          BX3    -X5+X3 
  
*          (X3) = POSITIVE, IF 0 .LT. LEFT .LE. RIGHT .LE. 160. 
  
          SB2    ARG. 
          NG     X3,CER      IF ARGUMENTS NOT PROPER
          SX7    X2+
          SA7    RTWD 
          SX6    X1+E.STR-2  SET FWA -1 OF START
          SX7    X2+E.STR    SET LWA+1 FOR SEARCH 
          SA6    LMW
          SA7    A6+B1
          EQ     NCM         EXIT 
 RST      SPACE  4,15 
**        RST - RESTORE FILE TO PREVIOUS CONDITION. 
* 
*         ENTRY  NONE.
* 
*         EXIT   TO *NCM*.
*                (IWHERE) = 0.
*                (NOMOD) = 73B, INDICATES NO MODIFICATIONS. 
* 
*         USES   A - 6, 7.
*                X - 6, 7.
* 
*         CALLS  TOP. 
  
  
 RST      BX7    X7-X7       SET IWHERE TO 0 (FORCE REWIND) 
          MX6    73B         SET *NOMOD* TO INDICATE NO MODIFICATIONS 
          SA7    IWHERE 
          SA6    NOMOD
          RJ     TOP         RESET FILES
          EQ     NCM         EXIT 
 SCH      SPACE  4,10 
**        SCH - SET CHARACTER IN WORD.
* 
*         ENTRY  (NUMS) = CHARACTER FOR PLACEMENT.
*                (X1) = ADDRESS TO PLACE CHARACTER. 
* 
*         EXIT   TO *NCM* 
*                ((X1)) = (NUMS). 
* 
*         USES   A - 2, 6.
*                X - 1, 2, 6. 
  
  
 SCH      AX1    18          SHIFT MODIFIER WORD
          SA2    NUMS 
          SX1    X1          REMOVE EXCESS CHARACTERS 
          LX1    -1 
          BX6    X2 
          SA6    X1+         PUT CHARACTER
          EQ     NCM         EXIT 
 SFG      SPACE  4,20 
**        SFG - SET FLAG. 
* 
*         ENTRY  (X1) = COMMAND DESCRIPTOR WORD, FORM IS -
*                       24/,17/ADDR,1/MODE,18/
*                       ADDR = ADDRESS OF THE FLAG TO SET.
*                       MODE = SET, IF *VERIFY* MODE. 
*                              CLEAR, IF *BRIEF* MODE.
*                (NUMS) = +- PARAMETER, 
*                         IF NEGATIVE, SET FLAG TO CONDITION OPPOSITE 
*                         THAT INDICATED BY *MODE*. 
*                         IF POSITIVE, SET FLAG TO CONDITION INDICATED
*                         BY *MODE*.
* 
*         EXIT   TO *NCM*.
* 
*         USES   A - 3, 6.
*                X - 1, 3, 6. 
  
  
 SFG      AX1    18 
          SX1    X1          ISOLATE PARAMETER
          SA3    NUMS        GET +- MODE
          LX1    -1 
          BX6    X1-X3       OBTAIN PROPER CONDITION
          SA6    X1          SAVE NEW VALUE 
          EQ     NCM         EXIT 
 STB      SPACE  4,10 
**        STB - SET TABS. 
* 
*         ENTRY  (NUMS TO NUMS+NTABS) = TAB SETTINGS DESIRED. 
* 
*         EXIT   (TABS - TABS+NTABS-1) = IF ALL PARAMETERS ARE VALID
*                NEW TAB SETTINGS.
*                IF PARAMETERS ARE VALID, TO *NCM*, ELSE TO *CER*.
* 
*         USES   A - 1, 2, 6, 7.
*                X - 1, 2, 6, 7.
*                B - 2, 5, 6, 7.
  
  
 STB      SA1    IW 
          SB7    160         DEFAULT LINE WIDTH 
          ZR     X1,STB0     IF USING DEFAULT 
          SB7    X1 
 STB0     SB6    B0          SET VALUE OF LAST TAB
          SA1    NUMS-1 
          MX6    0
          SA6    NUMS+NTABS  ASSURE ZERO MARKER 
          SB2    ILL.        ERROR MESSAGE
 STB1     SA1    A1+B1
          ZR     X1,STB2     IF END OF LINE (ALL OK)
          SB5    X1 
          GT     B5,B7,CER   IF TAB IS PAST LINE WIDTH
          LE     B5,B6,CER   IF TABS IS .LE. LAST TAB 
          SB6    B5 
          EQ     STB1        CHECK NEXT TAB 
  
 STB2     SA2    NUMS-1 
          SA6    TABS        CLEAR FIRST TAB
 STB3     SA2    A2+B1       GET NEXT TAB 
          SA6    A6+B1       ZERO NEXT TAB
          BX7    X2 
          SA7    A6-B1       PUT CURRENT TAB
          NZ     X2,STB3     IF NOT FINISHED
          EQ     NCM         TABS SET, EXIT 
 TGL      SPACE  4,15 
**        TGL - PROCESS TOGGLES.
* 
*         ENTRY  (X1) = (DECA), ADDRESS OF WORD TO PROCESS. 
*                (NUMS) = *+* PARAMETER.
*                IF (NUMS) .GT. 0, SET FLAG TO ON.
*                IF (NUMS) .LT. 0, SET FLAG TO OFF. 
*                IF (NUMS) .EQ. 0, TOGGLE STATE OF FLAG.
* 
*         EXIT   TO *NCM*.
* 
*         USES   A - 2, 3, 6. 
*                X - 1, 2, 3, 6.
  
  
 TGL      AX1    18          OBTAIN ADDRESS 
          SA3    NUMS 
          SA2    X1          FLAG TO PROCESS
          NZ     X3,TGL1     IF +- SPECIFIED
          LX3    X2          MOVE TOGGLE UP 
 TGL1     BX6    -X3         TOGGLE FLAG
          SA6    A2 
          EQ     NCM         EXIT 
 TRN      SPACE  4,10 
**        TRN - TRUNCATE COMMAND. 
* 
*         ENTRY  (NUMS) = NUMBER OF LINES TO PROCESS. 
* 
*         USES   A - 1, 5, 6, 7.
*                X - 1, 2, 5, 6, 7. 
*                B - 2, 6.
* 
*         CALLS  RDF, SAC, TSL, VRY, WTF. 
  
  
 TRN      BSS    0           ENTRY
          SA5    IW          GET DESIRED WIDTH
          RJ     SAC         SET ASCII MODE 
 TRN1     SA1    E.STR-1     GET EXISTING LINE WIDTH
          IX2    X5-X1
          SX7    B1 
          PL     X2,TRN2     IF LINE ALREADY SHORT
          SB2    X5+1 
          MX6    2
          SA7    E.LMOD      SET LINE MODIFICATION
          SA6    A1+B2       SET NEW END OF LINE
          SA7    NOMOD       SET MODIFICATION MADE TO FILE
          SB6    E.STR-1     SET LINE WIDTH CELL
          RJ     TSL         TRIM SPACES OFF LINE 
 TRN2     RJ     VRY         VERIFY LINE
          SA1    NUMS 
          SX6    B1+
          IX6    X1-X6       DECREMENT COUNT
          AX1    1
          ZR     X1,NCM      IF FINISHED, EXIT
          SA6    A1+
          RJ     WTF
          RJ     RDF
          EQ     TRN1        RETURN TO PROCESS NEXT LINE
 TTN      SPACE  4,10 
**        TTN - TOP AND TOPNULL PROCESSOR.
* 
*         ENTRY  (INDEX) = COMMAND TABLE INDEX FOR CURRENT COMMAND. 
* 
*         USES   A - 1, 2, 6. 
*                X - 1, 2, 6. 
* 
*         CALLS  TOP. 
  
  
*         REWIND FILES, IF *TN*, *TOP* WILL INSERT A BLANK LINE.
  
 TTN      RJ     TOP
          SA1    INDEX
          SA2    NOMOD
          SX1    X1-.TOPNUL  POSITIVE, IF *TOPNULL*, MINUS, IF *TOP*
  
*         HANDLE CASE WHERE (IWHERE) = 1, AND COMMAND IS *TOP*, 
*         AND (NOMOD) = FALSE.
  
          BX6    X1*X2
          SA6    A2 
          EQ     NCM         EXIT 
 WHR      SPACE  4,15 
**        WHR - PROCESS WHERE COMMAND.
* 
*         ENTRY  (IWHERE) = CURRENT LINE COUNT. 
* 
*         EXIT   TO *NCM*.
* 
*         USES   A - 1. 
*                X - 1, 6.
* 
*         CALLS  CDD. 
* 
*         MACROS WRITEC, WRITEO.
  
  
 WHR      SA1    IWHERE 
          NG     X1,WHR1     IF IN CREATION MODE
          RJ     CDD
          MX1    12 
          BX6    -X1*X6 
          LX6    12          MOVE END OF LINE BYTE
          WRITEO OUTPUT 
          EQ     NCM         EXIT 
  
 WHR1     WRITEC OUTPUT,(=C*       0 - IN CREATION MODE.*)
          EQ     NCM         EXIT 
 WRM      SPACE  4,10 
**        WRM - WRITE RECORD MARK.
* 
*         ENTRY  (X1) = BITS 18 - 35 CONTAIN DESIRED *CIO* FUNCTION.
* 
*         EXIT   TO *NCM*.
* 
*         USES   A - 6. 
*                X - 1, 2, 6, 7.
* 
*         CALLS  =XCIO=.
  
  
 WRM      SX2    FTA         SELECT FET 
          AX1    18 
          SX7    X1 
          MX6    0
          BX7    -X7         SPECIFY AUTO RECALL
          SA6    NOMOD       SET MODIFICATION 
          RJ     =XCIO= 
          EQ     NCM         EXIT 
  
 YZP      SPACE  4,15 
**        YZP - Y/Z COMMAND PROCESSOR.
* 
*         ENTRY  (NUMS) = IF NO PARAMETER, 0
*                         ELSE, FWA OF PARAMETERS.
*                (NUMS+1) = LWA OF PARAMETER. 
* 
*         EXIT   IF ERROR, TO *CER*, ELSE TO *STK*. 
* 
*         USES   A - 1, 2, 3, 4, 5, 6, 7. 
*                X - 1, 2, 3, 4, 5, 6, 7. 
*                B - 6, 7.
* 
*         CALLS  RTA, STK.
  
  
 YZP      SA1    NUMS        GET FWA OF PARAMETER 
          SA2    A1+B1       GET LWA+1
          SA3    X1          DELIMITER CHARACTER
          ZR     X1,YZP2     IF NO PARAMETER
          SA5    INDEX
          SA4    X2          LAST CHARACTER 
          SB6    X1+B1       SET FWA OF STRING TO PACK
          SX5    X5-.Z       0 IF *Z* COMMAND 
          MX7    1
          NZ     X5,YZP1     IF NOT *Z* COMMAND 
          BX3    X3+X7       SET TO ECHO COMMANDS 
 YZP1     LX6    X3          MOVE DELIMITER/ECHO FLAG 
          SB7    Y.LINE 
          SA6    Y.DEV+1     SET DELIMITER CHARACTER
          BX7    X7+X4       SET PSEUDO END OF LINE 
          SA7    A4 
          RJ     RTA         PACK LINE
          SA1    NUMS+1 
          SA1    X1+         GET PSEUDO END OF LINE 
          MX7    1
          BX6    -X7*X1      REMOVE PSEUDO END OF LINE
          LX1    1
          NG     X1,YZP1.1   IF TRUE END OF LINE
          SA6    A1+         REPLACE ENTRY
 YZP1.1   SA1    Y.DEV
          RJ     STK         STACK ENTRY. IF NO ERRORS, EXIT. 
          SB2    STK. 
          EQ     CER         IF STACKING ERROR, EXIT
  
 YZP2     SB2    ARG. 
          EQ     CER         PARAMETER ERROR, EXIT
          TITLE  SUBROUTINES. 
 ABT      SPACE  4,15 
**        ABT - ABORT XEDIT.
* 
*         ENTRY  (B6) = ADDRESS OF ABORT MESSAGE. 
* 
*         EXIT   TO *EXT*.
*                (EXTA) = -1, INDICATES ABORT.
* 
*         USES   A - 6. 
*                X - 6. 
* 
*         MACROS WRITEC.
* 
*         NOTES  DO NOT *RJ* TO THIS SUBROUTINE.
  
  
 ABT      SX6    -1          CHANGE EXIT MODE 
          SA6    EXTA 
          WRITEC OUTPUT,B6   ISSUE MESSAGE
          EQ     EXT         EXIT XEDIT 
 ASF      SPACE  4,20 
**        ASF - ANALYZE STRING FIELDS.
* 
*         ENTRY  (P1LP - P3RP) = POINTERS TO STRINGS. 
* 
*         EXIT   STRING DEFINITIONS CHECKED AGAINST BITS IN COMMAND 
*                MODIFIER WORD. 
*                (LOCA - LOCC) = INITIALIZED FOR USE BY *LOC*.
*                (SPCP) = NEGATIVE IF WINDOW WAS SPECIFIED. 
*                (B2) = 0 IF NO ERROR ENCOUNTERED,
*                       ELSE, ORDINAL OF ERROR MESSAGE. 
*                IF ERROR, TO *NER*.
* 
*         USES   A - 1, 2, 3, 4, 6, 7.
*                X - 0, 1, 2, 3, 4, 6, 7. 
*                B - 2, 3, 4, 5, 6, 7.
* 
*         CALLS  SAC, VIS.
* 
*         NOTES  ROUTINE IS DESIGNED TO BE CALLED IMMEDIATELY AFTER 
*                THE STRINGS ARE PARSED VIA *PRM*.
  
  
 ASF11    SA1    COMMAND
          SA2    P3RP 
          LX1    59-33       MODIFIER 15, 2 STRINGS NEEDED
          PL     X1,ASF      IF NOT ABOVE 
          ZR     X2,ASF10    IF NOT 2 STRINGS (ARG ERROR) 
  
 ASF      PS                 ENTRY/EXIT 
          SA3    P1LP 
          SA2    PREFIX 
          ZR     X3,ASF9     IF NO STRINGS
          SA1    GLOBAL 
          MX6    -18
          LX2    59-/PREFIX/W  (NEXT BIT IS -A-)
          BX7    -X6*X1      SET GLOBAL 
          LX6    B1,X2
          SX4    B0 
          PL     X6,ASF1     IF NOT ANCHOR
          MX4    1
 ASF1     LX7    18 
          SX1    E.STR-1     SET MINIMUM STARTING-1 
          BX6    X6+X2
          PL     X6,ASF2     IF NOT WINDOW/ANCHOR 
          SA1    LMW         GET WINDOW LEFT MARGIN 
 ASF2     IX7    X7+X4
          BX7    X1+X7
          SA7    LOCA        SAVE FIRST LOCATE PARAMETER WORD 
  
*         INITIALIZE *LOCB* AND *LOCC*. 
* 
*         NOTE-  LWA+1 FOR SCAN IS SET VERY HIGH. THIS IS DONE FOR
*         TWO REASONS. THE FIRST, THIS ROUTINE IS ALSO CALLED BY
*         *OCTCHANGE*, WHICH MAY USE DOUBLE SIZE BUFFERS, AND THE 
*         SECOND IS THAT IT DOES NOT MAKE MUCH DIFFERENCE AS THE
*         LOCATE SUBROUTINE, *LOC*, WILL FORCE LWA+1 TO BECOMES THE 
*         EOL CHARACTER OF THE STRING BEING SEARCHED. 
  
          SA1    P1LP 
          SB2    E.STR+3*MAXWD   1.SET LWA+1 AVAIL FOR SCAN 
          SA3    P2LP 
          SB3    B2          2. SET LWA+1 AVAIL FOR SCAN
          MX0    1
          SA4    RMW         OBTAIN WINDOW RIGHT MARGIN+1 
          SB5    18 
          SB6    B0          1. STRING LENGTH 
          SB4    X4 
          LX6    X1,B5       1. FWA COMPARE 
          SB7    B7-B7       2. STRING LENGTH 
          LX7    X3,B5       2. FWA COMPARE 
          SA4    SPCP        RESET WINDOW PARAMETER 
          BX1    X7 
          BX7    -X0*X4 
          SA7    SPCP 
          BX7    X1 
          SA1    P1LP 
          SA4    TRIM 
          BX4    X4+X2       NEG. IF WINDOW OR TRIM 
          PL     X4,ASF3     IF NOT ABOVE 
          BX6    X0+X6       1. SET TRIM
          BX7    X0+X7       2. SET TRIM
 ASF3     PL     X2,ASF4     IF NOT WINDOW PROCESSING 
          SA4    SPCP        SET WINDOW PARAMETER 
          BX4    X4+X0
          BX2    X7 
          BX7    X4 
          SA7    SPCP 
          BX7    X2 
          SB2    B4 
          SB3    B4 
 ASF4     LX2    /PREFIX/W-/PREFIX/A
          SA4    PRMB        GET AND/NOT LOGIC FLAG 
          ZR     X3,ASF5     IF ONLY ONE STRING 
          NZ     X4,ASF5     IF *---* LOGIC 
          BX6    X0+X6       1. SET TRIM (ALL CHARS SIGNIFICANT)
 ASF5     BX0    X0*X4
          LX0    36-59       POSITION FLAG
          PL     X2,ASF6     IF NOT ANCHOR
          SB2    B4          1. RESET RIGHT MARGIN
 ASF6     BX7    X7+X0       2. SET POS/NEG LOGIC FLAG
          SA2    A1+B1
          SA4    A3+B1
          IX1    X2-X1
          IX3    X4-X3
          SB6    X1 
          SB7    X3 
          SX1    B2 
          SX3    B3 
          BX6    X6+X1
          BX7    X7+X3
          PX6    B6 
          PX7    B7 
          SA6    LOCB 
          SA7    A6+B1
          SA1    LOCE        SET NORMAL SEARCH
          GT     B6,ASF7     IF FIRST STRING NOT NULL 
          NZ     X4,ASF8     IF THERE IS A SECOND STRING
          SA1    LOCF        SET NULL SEARCH
 ASF7     BX6    X1 
          SA6    LOC+1       CHANGE ENTRY POINT TO *LOC*
*         RJ     VIS         VOID INSTRUCTION STACK 
          RJ     SAC         SET ASCII PROCESSING 
          SB2    B0          SET NO ERROR 
          EQ     ASF         RETURN 
  
 ASF8     GT     B7,ASF7     IF SECOND STRING NOT NULL
          EQ     ASF10       SET *ARG* ERROR
  
 ASF9     SA1    LOCD        SET FOUND STRING (NO FIELDS) 
          SA2    COMMAND
          SB2    B0          SET *ASF* SUCCESSFUL 
          BX6    X1 
          SA6    LOC+1
          RJ     VIS         VOID INSTRUCTION STACK 
          LX2    59-34       MODIFIER BIT 16, 1 STRING NEEDED 
          PL     X2,ASF11    IF NOT ABOVE 
 ASF10    SB2    ARG.        SET ERROR
          EQ     ASF         RETURN 
 BTL      SPACE  4,10 
**        BTL - ISSUE *BAD TEXT LINE ENCOUNTERED* MESSAGE.
* 
*         ENTRY  NONE.
* 
*         EXIT   TO *NCM*.
* 
*         USES   B - 2. 
* 
*         CALLS  IEM. 
  
  
 BTL      SB2    BTL.        SET UP ERROR MESSAGE 
          RJ     IEM         ISSUE ERROR MESSAGE
          EQ     NCM         EXIT 
 CER      SPACE  4,15 
**        CER - COMMAND ERROR PROCESSOR.
* 
*         ENTRY  (B2) = ERROR MESSAGE ORDINAL.
* 
*         EXIT   TO *NCM* AFTER POPPING STACK TO MAIN DEVICE AND
*                READING NEXT COMMAND LINE (VIA *NCL*). 
*                IF BATCH MODE, TO *ABT*. 
* 
*         USES   A - 1, 2, 5, 6, 7. 
*                X - 1, 2, 5, 6, 7. 
*                B - 2, 6, 7. 
* 
*         CALLS  IEM. 
  
  
 CER      ERROR  B2          ISSUE ERROR MESSAGE
  
*         ENTRY POINT FOR COMMAND ERROR, BUT ISSUED OWN MESSAGE.
  
 CER1     SA2    BATCH       ABORT/ELSE RETURN TO MAIN INPUT
          SB6    =C* BATCH ABORT - COMMAND ERROR.*
          NZ     X2,ABT      IF BATCH MODE
          SA1    INPMODE
          SB7    -I.DEV      SET DEVICE TO CHECK AGAINST
          PL     X1,CER2     IF NOT IN INPUT MODE 
          SA5    C.ON        GET CURRENT DEVICE 
          SB7    -Y.DEV 
          SB2    X5+B7
          ZR     B2,NCL      IF *Y/Z* COMMAND DEVICE
          SB7    -S.DEV      SET SPECIAL INPUT DEVICE LINE
 CER2     SA5    C.ON        POP STACK AND GET NEXT COMMAND LINE
          SB2    X5+B7       COMPARE DEVICES
          MX6    1           PREPARE TO IDLE DEVICE 
          ZR     B2,NCL      IF POPPED TO PROPER DEVICE, EXIT 
          SA5    X5          GET NEW DEVICE 
          SA6    A5          IDLE OLD DEVICE
          SA2    X5+B1       GET OLD C.STR-1 WORD 
          BX7    X5 
          LX6    X2 
          SA7    C.ON        POP STACK
          SA6    C.STR-1
          EQ     CER2        CHECK TO SEE IF AT PRIMARY 
 CFF      SPACE  4,20 
**        CFF - COPY FAST FILE. 
* 
*         ENTRY  (CFET) LOADED WITH FILE NAME.
*                AT LEAST ONE READ STARTED ON *E.IN*. 
* 
*         EXIT   FILE COPIED. 
*                BOTH FILES *NOT BUSY*. 
* 
*         USES   A - 1, 2, 3, 6, 7. 
*                X - 1, 2, 3, 6, 7. 
* 
*         MACROS READ, RECALL, WRITE, WRITEF, WRITER. 
* 
*         COPIES INCOMING EDIT FILE STARTING AT CURRENT BUFFER
*         POSITION, TO THE FILE NAME WHICH IS IN *CFET*.
*         NEITHER FILE IS REWOUND BEFORE COPYING. 
*         WARNING, THIS ROUTINE ASSUMES THAT THE BUFFER POINTERS
*         FOR THE TWO FILES ARE IDENTICAL - THUS USE ONLY ON *E.IN* 
*         AND *CFET*. 
  
  
 CFF      PS                 ENTRY/EXIT 
          SA1    E.IN+2      INITIALIZE OUTPUT FET TO AGREE WITH
          SA2    A1+B1       THE INPUT FET
          BX6    X1 
          SA3    A1-B1       GET *FIRST*
          LX7    X2 
          SX3    X3          MASK OUT ADDRESS FIELD OF *FIRST*
          SA1    A2+B1       GET *LIMIT*
          SA6    CFET+2 
          SX1    X1          MASK OUT ADDRESS FIELD OF *LIMIT*
          SA7    A6+B1
          IX6    X1-X3       BUFFER SIZE (LIMIT-FIRST)
          SA6    CFFA        SAVE CALCULATED BUFFER SIZE
          SA3    E.IN        CHECK READ FET STATUS
          EQ     CFF3        CHECK FOR EOR/EOF/EOI AT ENTRY 
  
 CFF1     SA1    CFET+3      GET WRITE FET OUTPUT POINTER 
          BX6    X1 
          SA6    E.IN+3      REFLECT WRITE PROCESSING IN READ FET 
          READ   E.IN        RESTART READ FET 
          RECALL CFET        WAIT FOR *WRITE* TO COMPLETE 
 CFF2     SA3    E.IN        SET READ FET STATUS
          SA1    E.IN+2 
          SA2    CFET+3      INFORM THE TWO FETS ABOUT ACTIVITY 
          BX6    X1          IN THE OTHER FET 
          LX7    X2 
          SA6    A2-B1
          SA7    A1+B1
 CFF3     LX3    59-0 
          PL     X3,CFF4     IF READ FET BUSY 
          LX3    59-4-59+0
          NG     X3,CFF6     IF AT EOR/EOF/EOI
  
*         CALL *CIO* FOR *READ* IF SUFFICIENT SPACE IS IN THE BUFFER. 
  
          IX6    X2-X1       OUT - IN 
          ZR     X6,CFF3.1   IF BUFFER IS EMPTY 
          BX3    X6 
          SA1    CFFA        GET BUFFER SIZE
          AX3    60          SIGN OF (OUT-IN) 
          BX2    X3*X1       BUFFER SIZE IF (OUT.LT.IN), ELSE 0 
          IX7    X2+X6       SPACE IN BUFFER
          AX7    7           0 IF .LT. 200B WORDS OF SPACE
          ZR     X7,CFF4     IF NOT ENOUGH SPACE
 CFF3.1   READ   A3          RESTART THE READ FET 
 CFF4     SA3    CFET 
          LX3    59-0 
          PL     X3,CFF5     IF WRITE FET BUSY
  
*         CALL *CIO* FOR *WRITE* IF SUFFICIENT DATA IS IN THE BUFFER. 
  
          SA1    CFET+2      GET *IN* 
          SA2    A1+B1       GET *OUT*
          IX6    X1-X2       IN - OUT 
          BX3    X6 
          SA1    CFFA        GET CALCULATED BUFFER SIZE 
          AX3    60          SIGN OF (IN-OUT) 
          BX2    X3*X1       BUFFER SIZE IF (IN.LT.OUT), ELSE 0 
          IX7    X2+X6       AVAILABLE DATA IN BUFFER 
          AX7    7           0 IF .LT. 200B WORDS OF DATA 
          ZR     X7,CFF5     IF NOT ENOUGH DATA AVAILABLE 
          WRITE  CFET        RESTART THE WRITE FET
 CFF5     RECALL             WAIT FOR SOMETHING TO HAPPEN 
          EQ     CFF2        CONTINUE COPY
  
*         CHECK EOR/EOF/EOI AND PROCESS ACCORDINGLY 
  
 CFF6     SA1    E.IN+2      UPDATE OUTPUT BUFFER POINTER 
          LX3    59-3-59+4
          BX6    X1 
          SA6    CFET+2 
          NG     X3,CFF7     IF NOT EOR 
          WRITER CFET 
          EQ     CFF1        CONTINUE COPY
  
 CFF7     LX3    59-9-59+3
          NG     X3,CFF8     IF EOI 
          WRITEF CFET 
          EQ     CFF1        CONTINUE COPY
  
 CFF8     RECALL CFET          WAIT FOR OUTPUT TO SETTLE
          EQ     CFF         RETURN 
  
 CFFA     CON    0           TEMPORARY STORAGE FOR BUFFER SIZE
 CHS      SPACE  4,20 
**        CHS - CHANGE STRING(S). 
* 
*         ENTRY  (A0) = FWA OF SCRATCH BUFFER.
*                (X0) = LWA+1 OF SCRATCH BUFFER.
*                (SIGN BIT OF X0 = 1 IF *STRING* MODE). 
* 
*         EXIT   (B5) = 0, IF STRING NOT FOUND. 
*                (X5) = 0, IF TRUNCATION OCCURED. 
*                NEW CHANGED LINE (IF STRING FOUND) IN SCRATCH BUFFER.
*                THE NEW LINE SHOULD BE RUN THROUGH *TSL*.
*                B5 SHOULD BE TESTED BEFORE X5. 
* 
*         USES   A - 0, 1, 2, 5, 6. 
*                X - 1, 2, 4, 5, 6. 
*                B - 2, 3, 4, 5, 6, 7.
* 
*         CALLS  LOC. 
  
  
 CHS15    SX5    0           SET TRUNCATION OCCURED 
 CHS16    MX6    2           SET END OF LINE IN SCRATCH BUFFER
          SB5    1           SET STRING FOUND 
          SA6    B6 
  
 CHS      PS                 ENTRY/EXIT 
          MX6    0
          SB4    E.STR-1     SET FIRST SEARCH ADDR
          SA5    B4+B1
          SA6    CHSB        COUNT COUNTER (VOID INFINITE LENGTH) 
          RJ     LOC         SEARCH FOR STRING
          SB6    A0 
          SB3    X0 
          SA1    LOC+1
          ZR     B5,CHS      IF STRING NOT FOUND, RETURN
          SB7    X1+         IF C//STR/ FORM, 0 
  
*         COPY TO SCRATCH THAT PORTION OF LINE BEFORE MATCH.
  
 CHS1     SB2    A5 
          SX4    B1 
          GE     B2,B4,CHS5  IF ALREADY AT START OF MATCH 
 CHS2     PL     X5,CHS3     IF NOT AT END OF EDIT LINE 
          SA5    CHSA        SET TO BLANK(SPECIAL CASE) 
 CHS3     LT     B6,B3,CHS4  IF NOT FULL SCRATCH BUFFER 
          SX4    X5-1R
          NZ     X4,CHS15    IF TRUNCATION
 CHS4     BX6    X5 
          SB2    B2+B1       STEP A5 VALUE
          SA6    B6 
          SA5    A5+B1
          SB6    B6+X4       CONDITIONALLY INCREMENT SCRATCH POINTER
          LT     B2,B4,CHS2  IF MORE TO COPY
  
*         COPY TO SCRATCH THE NEW STRING, PREPARE FOR NEXT SEARCH.
  
 CHS5     SB4    B5-B1       SET TO SKIP MATCHED STRING 
          NG     X5,CHS6     IF AT END OF EDIT LINE (REMAIN THERE)
          NG     X5,CHS14    IF AT END OF LINE
  
*         RESET TO AFTER MATCHED STRING, NEVER PAST EOL CHARACTER.
  
          SA5    B5 
 CHS6     SA2    P3RP 
          SA1    A2-B1       P3LP 
          ZR     X2,CHS9     IF NO STRING FOR REPLACEMENT 
          SB2    X1 
          SB5    X2 
          GE     B2,B5,CHS9  IF NO STRING (NULL)
          SA1    B2 
 CHS7     BX6    X1 
          SB2    B2+B1
          LT     B6,B3,CHS8  IF END OF SCRATCH BUFFER 
          SX4    X1-1R
          NZ     X4,CHS15    IF TRUNCATION
 CHS8     SA6    B6+
          SB6    B6+X4       CONDITIONALLY INCREMENT SCRATCH POINTER
          SA1    B2 
          LT     B2,B5,CHS7  IF MORE TO TRANSFER
  
*         READY TO LOOK FOR NEXT STRING.
  
 CHS9     SA0    B6          UPDATE A0
          NG     X0,CHS13    IF STRING MODE 
 CHS10    ZR     B7,CHS11    IF C//STR/ OPTION
          RJ     LOC         CHECK FOR NEXT MATCH 
          SB6    A0 
          SB3    X0 
          SA1    CHSB 
          SB7    B1          SET NOT C//STR/ OPTION 
          SX6    X1+B1
          AX1    9
          SA6    A1 
          NZ     X1,CHS10.1  IF IN INFINITE LOOP
          NZ     B5,CHS1     IF MATCH FOUND 
 CHS10.1  SX4    1           RESET (X4) 
  
*         COPY REMAINDER OF LINE TO SCRATCH.
  
 CHS11    NG     X5,CHS16    IF FINISHED
          LT     B6,B3,CHS12 IF END OF SCRATCH BUFFER 
          SX4    X5-1R
          NZ     X4,CHS15    IF TRUNCATION
 CHS12    BX6    X5 
          SA6    B6 
          SA5    A5+B1
          SB6    B6+X4
          EQ     CHS11       CONTINUE COPY
  
*         STRING MODE - CHECK TO SEE IF FINISHED. 
  
 CHS13    SA1    NUMS 
          SX6    B1 
          IX6    X1-X6
          AX1    1
          SA6    A1 
          NZ     X1,CHS10    IF MORE STRINGS
          EQ     CHS11       COPY REST OF LINE
  
*         CHECK FOR ANY INFINITE LOOPS
  
 CHS14    SA1    CHSB 
          SX6    X1+B1
          SA6    A1 
          AX1    9
          ZR     X1,CHS6     IF NOT INFINITE
          EQ     CHS         RETURN 
  
 CHSA     DATA   1R          SPECIAL CASE HANDLING
          VFD    2/-0,*P/ 
 CHSB     BSS    1           INFINITE LOOP KLUDGE 
 ETL      SPACE  4,20 
**        ETL - ECHO TEXT LINE. 
* 
*         ENTRY  (A1) = FWA OF TEXT LINE. 
*                (X1) = TEXT. 
*                (X3) = PREFIX DEFINITIONS (SEE ETLA FOR EXAMPLE).
* 
*         EXIT   DESIRED TEXT LINE ECHOED AFTER INSERTING UP
*                TO NINE LEADING CHARACTERS.
* 
*         USES   A - 1, 6, 7. 
*                X - 1, 2, 3, 4, 6 ,7.
*                B - 2. 
*                E.SCR. 
* 
*         MACROS WRITEC.
  
  
 ETL1     BX6    -X4*X1      GET END OF LINE BYTE 
          LX1    B2          SHIFT WORD 
          BX7    -X2*X1 
          IX7    X7+X3
          BX3    X2*X1
          SA7    A7+1        SAVE NEXT WORD 
          SA1    A1+B1       READ AHEAD TO NEXT 
          NZ     X6,ETL1     IF NOT END OF LINE 
          BX7    X3 
          SA7    A7+B1
          SA6    A7+B1       INSURE PROPER END OF LINE BYTE 
          WRITEC OUTPUT,E.SCR+1 
  
 ETL      PS                 ENTRY/EXIT 
          MX2    1
          SB2    X3          GET SHIFT COUNT-1
          SA7    E.SCR
          AX2    B2          EXTEND MASK
          SB2    B2-59
          BX3    X2*X3       CLEAR SHIFT COUNT
          MX4    -12
          SB2    -B2
          EQ     ETL1        WRITE TEXT 
  
 ETLA     CHAR   (VFD 6/0),QM.  DATA LINE PROMPT
          VFD    6/1R ,*P/11
 ETLB     CHAR   (VFD 6/0),QM.  COMMAND LINE PROMPT 
          CHAR   (VFD 6/0),QM.
          VFD    6/1R ,*P/17
  
 ETL      RMT                REMOTE FOR BATCH ORIGIN
          CHAR   (VFD 12/1L ),QM. 
          VFD    6/1R ,*P/17
          CHAR   (VFD 12/1L ),QM. 
          CHAR   (VFD 6/0),QM.
          VFD    6/1R ,*P/23D 
          RMT 
 EXT      SPACE  4,15 
**        EXT - EXIT XEDIT. 
* 
*         ENTRY  (EXTA) = EXIT CODE.
* 
*         EXIT   PROGRAM TERMINATED.
* 
*         USES   A - 0, 1, 2, 4, 5. 
*                X - 0, 1, 2, 3, 4, 5, 6. 
* 
*         MACROS CSET, DISTC, MESSAGE, RETURN, REWIND, WRITEO, WRITER.
* 
*         NOTES  ROUTINE RETURNS SCRATCH FILES (SCRA-SCRG), 
*                TURNS OFF ASCII MODE (IF *AS* PARAMETER USED)
*                AND DOES OTHER HOUSEKEEPING. 
  
  
 EXT      SA1    COPY 
          ZR     X1,EXT1     IF NO COPY FILE
          WRITER FTD,RECALL  CLOSE COPY FILE
          REWIND X2 
 EXT1     MX0    3
          SA0    FTD         SET FIRST FET TO LOOK AT 
          LX0    -21D        POSITION A-G MASK
          SA5    =0LSCR 
 EXT2     SA4    A0          GET FILE NAME
          BX2    X4-X5       COMPARE NAMES
          BX1    -X0*X4      CLEAR A-G BITS 
          AX2    18 
          ZR     X2,EXT3     IF NAME IS *SCR* (NOT ONE OF XEDIT,S)
          BX1    X1-X5
          AX1    18 
          NZ     X1,EXT3     IF NOT SRCA-SRCG 
          RETURN A0 
 EXT3     SA0    A0+7        STEP TO NEXT FET 
          SX3    A0-LFET
          NG     X3,EXT2     IF SCAN NEXT FET 
  
*         CLEAN UP TELEX SPECIAL STATUS.
  
          SA2    PROMPT 
          ZR     X2,EXT4     IF DISTC NOT ON
          SX6    B1 
          LX6    48          0001 BYTE
          WRITEO OUTPUT 
          DISTC  OFF
 EXT4     SA1    OUTPUT+2 
          SA2    A1+B1
          IX2    X2-X1       COMPARE *IN* AND *OUT* 
          ZR     X2,EXT5     IF NOTHING IN BUFFER TO FLUSH
          WRITER OUTPUT,R    FLUSH BUFFER (WITH RECALL) 
 EXT5     SA2    AS 
          SX2    X2-3RASC 
          NZ     X2,EXT6     IF NOT SPECIAL ASCII MODE
          CSET   RESTORE     RESTORE INITIAL MODE 
 EXT6     RJ     FNL         ISSUE DAYFILE MESSAGE
          MESSAGE  (=0),1    CLEAR MESSAGE BUFFER 
          SA1    EXTA 
          NG     X1,EXT7     IF ABORT XEDIT 
          ENDRUN             END XEDIT
  
 EXT7     ABORT              ABORT     XEDIT
  
 GFN      SPACE  4,20 
**        GFN - GET FILE NAME.
* 
*         ENTRY  (A5) = ADDRESS OF PRESET CHARACTER.
*                (X5) = PRESET CHARACTER. 
* 
*         EXIT   (X6) = FILE NAME IF .NE. 0.
*                     = 0, IF RESERVED OR BAD (NOT INCLUDING SPECIAL).
*                (A1) = ADDRESS OF SPECIAL NAME ENTRY (IF SPECIAL). 
*                       0, THEN NULL. 
*                       1, THEN OUTPUT. 
*                (X1) = NON-ZERO IF SPECIAL, RESERVED OR BAD NAME.
*                (B4) = 0, IF TOO MANY CHARACTERS IN THE FILE NAME. 
*                     = 1, IF SPECIAL CHARACTERS IN THE FILE NAME.
*                (B6) = ERROR MESSAGE ORDINAL (IF ERROR). 
*                (A5) = ADDRESS OF NEXT NON-BLANK OR SECOND COMMA.
*                (X5) = NEXT NON-BLANK CHARACTER OR SECOND COMMA. 
* 
*         USES   A - 1, 5.
*                X - 1, 3, 4, 5, 6, 7.
*                B - 4, 6.
  
  
 GFN7     NG     X5,GFN8     IF AT END OF LINE
          SB4    X5-1R
          ZR     B4,GFN8     IF BLANK 
          NE     B4,B1,GFN3.1  IF SPECIAL CHARACTER 
 GFN8     LX6    6
          PL     X6,GFN8     IF NOT LEFT JUSTIFIED
          BX7    X7-X7       SET NO COMMA FOUND 
 GFN9     SX4    X5-1R
          ZR     X4,GFN10    IF BLANK CHARACTER 
          SX4    X5-1R, 
          NZ     X4,GFN11    IF NOT COMMA 
          NZ     X7,GFN11    IF 2ND COMMA 
          SX7    1           SET COMMA ENCOUNTERED
 GFN10    SA5    A5+1 
          PL     X5,GFN9     IF NOT END OF LINE 
 GFN11    MX7    1           REMOVE POSITION BIT
          BX6    -X7*X6 
          SB6    B0          INDICATE NO ERROR
          LX6    12          LEFT JUSTIFY NAME
          SA1    GFNA-1      PRESET TO LIST OF RESERVED NAMES 
          ZR     X6,GFN6     IF NO FILE NAME
 GFN12    SA1    A1+B1
          ZR     X1,GFN      IF END OF LIST 
          BX3    X6-X1
          AX4    B1,X3
          NZ     X4,GFN12    IF NOT THIS FILE NAME
          LX3    -1 
          AX3    59 
          BX6    X3*X6       IF BAD, WILL ZERO - ELSE LEAVE IT ALONE
          SB6    BFN.*100B+3 SET -RESERVED FILE NAME- 
  
 GFN      PS                 ENTRY/EXIT 
          BX6    X6-X6       CLEAR ASSEMBLY 
          SB6    B0          SET NO ERROR (END OF LINE) 
          NG     X5,GFN6     IF END OF LINE 
          SX6    4000B       SET POSITION INDICATOR 
 GFN1     ZR     X5,GFN4     IF BAD FILE NAME 
          SX4    X5-1R9-1 
 GFN2     PL     X4,GFN3     IF NOT ALPHANUMERIC
          LX6    6
          BX6    X6+X5
          NG     X6,GFN3.2   IF TOO MANY CHARACTERS 
          SA5    A5+1 
          PL     X5,GFN1     IF NOT END OF LINE 
          EQ     GFN7        GET FILE NAME
  
 GFN3     SX3    X5-7601B 
          NG     X3,GFN7     IF LESS THAN 7601B 
          SX4    X3-1RZ 
          PL     X4,GFN7     IF .GT. LOWER CASE Z 
          SX5    X3+B1       GET LOWER CASE LETTER
          EQ     GFN2        TEST CHARACTER 
  
*         BAD FILE NAME PROCESSING. 
  
 GFN3.1   SB4    B1+
          EQ     GFN4        PROCESS BAD FILE ERROR 
  
 GFN3.2   SB4    B0+
 GFN4     SB6    BFN.*100B+1 SET -BAD FILE NAME-
 GFN5     SX6    B0          CLEAR FILE NAME
          MX1    1           SET ERROR FLAG 
          EQ     GFN         RETURN 
  
 GFN6     SB6    BFN.*100B+2 SET -NO FILE NAME- 
          EQ     GFN5        CLEAR FILE NAME
  
*         RESERVED FILE NAMES.
  
 GFNA     DATA   0LSCRA,0LSCRB,0LSCRC,0LSCRD,5LINPUT
          DATA   0LSCRE,0LSCRF,0LSCRG 
  
*         FILES REQUIRING SPECIAL HANDLING. 
  
 GFNB     CON    4LNULL+1 
          CON    6LOUTPUT+1 
 GFNBL    EQU    *-GFNB      NUMBER OF SPECIAL NAMES
          DATA   0           END MARKER 
 GLN      SPACE  4,30 
**        GLN - GET LINE NUMBER (ADVANCE TO IT).
* 
*         ENTRY  (X1) = LINE NUMBER TO FIND.
*                       IF SIGN BIT SET, THEN ASSUMED CALLED FROM *MPR* 
*                       WHICH IMPLIES-
*                       1. THAT THE VERIFY FLAG IS ALREADY SET UP.
*                       2. THAT X1 CONTAINS THE ABSOLUTE LINE POSITION. 
*                       3. THAT THE FILE IS ALREADY REWOUND IF NEEDED.
* 
*         EXIT   (X6) = 0 IF LINE NUMBER FOUND. 
* 
*         USES   A - 1, 2, 6, 7.
*                X - 1, 2, 3, 6, 7. 
* 
*         CALLS  RDF, TOP, WTF. 
* 
*         ROUTINE WILL REWIND THE FILE IF THE LINE NUMBER LIES
*         BEFORE THE CURRENT POINTER POSITION. IF THE USER
*         IS IN *WHERE* MODE, THIS ROUTINE WILL POSITION
*         THE FILE TO THE SPECIFIED LINE. 
* 
*         NOTES  UNLESS CALLED FROM *MPR*, THIS ROUTINE WILL
*         AUTOMATICALLY CANCEL THE VERIFICATION OF EOR/EOF,S
*         IF THE FILE NEEDS TO BE RESET. THIS IS DONE BY
*         SHIFTING *VERIFY* RIGHT AND THEN CLEARING THE SIGN
*         BIT (VERIFY OFF) - WHEN EXITING *GLN*, BIT 58 IS
*         SHIFTED TO BIT 59 (RESTORING PREVIOUS VERIFICATION).
* 
  
  
 GLN9     SA1    VERIFY      RESTORE OLD VERIFICATION STATUS
          LX7    B1,X1
          SA7    A1 
  
  
 GLN      PS                 ENTRY/EXIT 
          MX6    1
          BX6    -X6*X1      STRIP OFF SIGN BIT 
          MX7    0
          SA6    GLNA        SAVE LINE TO FIND
          SA7    GLNB        SAVE *NOT REWOUND* FLAG
          ZR     X6,GLN      IF NO LINE NUMBER TO FIND
          NG     X1,GLN7     IF CALLED FROM *MPR* 
          SA2    VERIFY 
          AX2    60          EXTEND FLAG STATUS 
          BX6    X2 
          SA6    A2+
          SA1    LNFLAG 
          PL     X1,GLN7     IF PROCESSING AS IWHERE. 
 GLN1     SA1    E.LMOD 
          NZ     X1,GLN3     IF LINE IS UNPACKED
          SA1    E.LINE      GET LINE NUMBER
          BX6    X6-X6       CLEAR ASSEMBLY 
          MX7    -6          CHARACTER MASK 
  
*         ASSEMBLE LINE NUMBER FROM PACKED WORD.
  
 GLN2     LX1    6
          BX2    -X7*X1      GET CHARACTER
          ZR     X2,GLN5     IF END OF NUMBER 
          SX3    X2-1R9-1    NEGATIVE IF OK 
          SX2    X2-1R0      POSITIVE IF OK 
          BX1    X7*X1       REMOVE PRESENT CHARACTER 
          BX3    -X2*X3 
          PL     X3,GLN5     IF CHARACTER IS NOT NUMBER 
          BX3    X6 
          LX6    2           *4 
          IX6    X6+X3       *5 
          LX6    1           *10
          IX6    X6+X2       ADD NEW CHARACTER
          EQ     GLN2        ASSEMBLE NEXT CHARACTER
  
*         ASSEMBLE LINE FROM STRING.
  
 GLN3     SA1    E.STR
          BX6    X6-X6       CLEAR ASSEMBLY 
          MX7    -10         CHARACTER COUNT
 GLN4     NG     X1,GLN5     IF END OF LINE 
          SX3    X2-1R9-1 
          SX2    X2-1R0 
          AX7    1           DECREMENT CHARACTER COUNT
          BX3    -X2*X3      NEGATIVE IF NUMBER 
          PL     X3,GLN5     IF NOT A NUMBER
          BX3    X6 
          LX6    2           *4 
          IX6    X6+X3       *5 
          SA1    A1+B1       NEXT CHAR. 
          LX6    1
          IX6    X6+X2       ADD NEXT NUMBER
          NZ     X7,GLN4     IF NOT 10 CHARACTERS 
  
*         CHECK TO SEE IF GOT LINE NUMBER.
  
 GLN5     SA1    GLNA 
          IX6    X6-X1
          PL     X6,GLN6     IF ON OR PAST NUMBER 
          RJ     WTF
          RJ     RDF
          EQ     GLN1        CHECK NEXT LINE
  
 GLN6     ZR     X6,GLN9     IF FOUND LINE NUMBER 
          SA2    GLNB 
          NZ     X2,GLN9     IF RESET FILE AT LEAST ONCE
          MX6    -1 
          SA6    A2 
          RJ     TOP
          SA1    VERIFY 
          MX6    1
          BX6    -X6*X1      CLEAR EOR/EOF VERIFICATION 
          SA6    A1 
          EQ     GLN1        SEARCH FROM TOP OF FILE
  
*         IF REALLY IN *IWHERE* MODE. 
  
 GLN7     SA1    GLNA 
          SA2    IWHERE 
          IX6    X2-X1
          PL     X6,GLN8     IF AT OR PAST POSITION 
          RJ     WTF
          RJ     RDF
          EQ     GLN7        GET NEXT LINE
  
 GLN8     ZR     X6,GLN9     IF FOUND 
          RJ     TOP         RESET AND RE-TRY 
          SA1    VERIFY 
          MX6    1
          BX6    -X6*X1      CLEAR AUTO VERIFICATION
          SA6    A1 
          EQ     GLN7        GET NEXT LINE
  
 GLNA     DATA   0           LINE NUMBER TO FIND
 GLNB     DATA   0           RESET FILE FLAG
 ICH      SPACE  4,10 
**        ICH - INITIALIZE CHARACTERS.
* 
*         ENTRY  (A1) = FWA OF PARAMETER LIST.
*                (X1) = FIRST WORD OF PARAMETERS. 
* 
*         EXIT   CHARACTERS LOADED INTO PROPER CELLS. 
* 
*         USES   A - 1, 2, 3, 6.
*                X - 1, 2, 3, 6.
*                B - 6, 7.
  
  
 ICH1     SA2    CHARSFT     OBTAIN SHIFT VALUE 
          SB6    X2 
 ICH2     SA2    X1          GET REPLACEMENT CHARACTER
          UX1,B7 X1          GET SHIFT COUNT
          AX2    B6 
          AX1    18 
          SX2    X2          REMOVE EXCESS CHARACTER
          SA3    X1          WORD TO MODIFY 
          LX2    B7          SHIFT INTO POSITION
          SA1    A1+B1
          BX6    X3-X2       ADD CHARACTERS 
          SA6    A3 
          NZ     X1,ICH2     IF MORE TO LIST
  
 ICH      PS                 ENTRY/EXIT 
          NZ     X1,ICH1     IF THERE IS A TABLE
          EQ     ICH         RETURN 
  
 IEM      SPACE  4,15 
**        IEM - ISSUE EXPLAIN ERROR MESSAGE.
* 
*         ENTRY  (B2) = ERROR MESSAGE ORDINAL IN THE FOLLOWING FORMS -
*                     FORM 1 - 18/PRIMARY ORDINAL.
*                     FORM 2 - 13/PRIMARY ORDINAL,5/SECONDARY ORDINAL.
* 
*         EXIT   (EXPLAIN) = UPDATED ERROR MESSAGE ENTRIES. 
*                MESSAGE ISSUED.
* 
*         USES   A - 1, 4, 6. 
*                X - 1, 4, 6. 
*                B - 2. 
* 
*         MACROS WRITEC.
  
  
 IEM      PS                 ENTRY/EXIT 
          SA1    EXPLAIN
          SX4    B2 
          AX4    6
          LX1    -12         SHIFT EXPLAIN WORD 
          NZ     X4,IEM1     IF GOTTEN PRIMARY
          SX4    B2 
 IEM1     PX6    B2,X1       PUT NEW EXPLAIN ENTRY
          SA6    A1 
          SA4    MESSAGE+X4  GET MESSAGE STARTING ADDR
          WRITEC OUTPUT,X4   ISSUE MESSAGE
          EQ     IEM         RETURN 
  
 IFM      SPACE  4,15 
**        IFM - ISSUE FILE MESSAGE. 
* 
*         ENTRY  (X1) = FILE NAME TO USE (LOWER 18 CAN BE GARBAGE). 
*                (B2) = ERROR MESSAGE (SEE *IEM* FOR FORMATS).
* 
*         EXIT   (EXPLAIN) = UPDATED EXPLAIN ERROR MESSAGE ENTRIES. 
*                MESSAGE ISSUED.
* 
*         USES   A - 2, 3, 4, 6.
*                X - 1, 2, 3, 4, 6, 7.
*                B - 3. 
* 
*         MACROS WRITEC.
  
  
 IFM      PS                 ENTRY/EXIT 
          SX4    B2 
          AX4    6
          SA2    EXPLAIN
          LX2    -12
          NZ     X4,IFM1     IF NOT LONGER FORM 
          SX4    B2 
 IFM1     SA3    MESSAGE+X4  GET MESSAGE POINTER
          PX6    B2,X2
          SA3    X3          GET FIRST WORD OF MESSAGE
          MX7    6
          BX7    X7*X3       GET UPPER CHARACTER
          MX2    42 
          SA6    A2 
          SB3    60-12
          ZR     X7,IFM2     IF CHARACTER IS 00B (FIRST PART OF 0007B)
          BX6    X7 
          LX7    2
          SB3    60-6 
          BX7    X7*X6       NEGATIVE IF UPPER CHARACTER = 55B (BLANK)
          NG     X7,IFM2     IF BATCH STYLE MESSAGE 
          SB3    B0 
 IFM2     BX1    X2*X1       REMOVE LOWER 18 BITS 
          SX6    B1 
          SA4    =01010101010101010101B 
          IX6    X1-X6       SPACE FILL FILE NAME 
          BX6    X6-X1
          AX6    6
          BX6    X4*X6
          BX7    X6 
          SA4    =10H 
          LX6    5
          IX7    X6-X7
          BX6    X6+X7
          BX4    X6*X4       MASK BLANKS FOR LOWER BITS 
          LX7    B3,X2
          BX3    -X7*X3      REMOVE EXISTING FILE NAME
          BX4    X4*X2       REMOVE LOWER 18 BITS OF BLANKS 
          IX4    X4+X1       MERGE BLANKS WITH FILENAME 
          LX4    B3          POSITION NAME
          BX6    X4+X3       MERGE INTO MESSAGE 
          SA6    A3 
          WRITEC OUTPUT,A6   ISSUE MESSAGE
          EQ     IFM         RETURN 
  
 ITM      SPACE  4,15 
**        ITM - ISSUE TRUNCATION MESSAGE. 
* 
*         ENTRY  (IWHERE) = LINE POSITION.
* 
*         EXIT   MESSAGE ISSUED.
* 
*         USES   A - 1, 6.
*                X - 1, 6.
*                B - 2. 
* 
*         CALLS  CDD, IEM.
  
  
 ITM      PS                 ENTRY/EXIT 
          SA1    IWHERE 
          RJ     CDD
          SA1    MESSAGE+TRUNC. 
          MX6    -12
          BX6    X6*X4       SET EOL BYTE 
          SB2    TRUNC. 
          SA6    X1+2        PLACE POSITION (CHANGE MESSAGE)
          RJ     IEM
          EQ     ITM         RETURN 
  
 PCN      SPACE  4,10 
**        PCN - PRINT COLUMN NUMBERS. 
* 
*         ENTRY  NONE.
* 
*         EXIT   COLUMN NUMBERS PRINTED.
* 
*         MACROS WRITEC.
  
  
 PCN      PS                 ENTRY/EXIT 
          WRITEC OUTPUT,PCNA
          WRITEC X2,PCNB
          EQ     PCN         RETURN 
  
 PCNA     CON    3H  0,2H 1,2H 2,2H 3,2H 4,2H 5,2L 6
 PCNB     BSS    0
          DATA   H*  12345678901234567890123456789012345678*
          DATA   C*90123456789012345678901234567890*
 PCNAL    EQU    *-PCNA 
 ERD      SPACE  4,15 
**        ERD - PROCESS END OF FILE READ. 
* 
*         ENTRY  AT *ERD*.
*                AT *ERD1*. 
*                AT *ERD5*. 
* 
*         EXIT   TO *TOP*.
*                TO *TOP1.1* IF IN LOOK MODE. 
* 
*         USES   A - 1, 2, 4, 6, 7. 
*                X - 2, 4, 6, 7.
*                B - 6. 
* 
*         CALLS  RDF. 
* 
*         MACROS  READ, RECALL, REWIND, WRITER. 
  
  
 ERD      PS                 ENTRY
          SA1    *-1
          MX7    0
          BX6    X1          COPY ENTRY WORD TO EXIT WORD 
          SA7    DF          NO MORE DELETES OF EOF-S 
          SA6    TOP         EXIT WORD
          SA7    DR          NO MORE DELETES OF EOR-S 
          SA4    UPDATE 
          PL     X4,TOP1.1   IF IN LOOK MODE
  
*         ENTRY FROM *TOP*. 
  
 ERD1     SA2    RC 
          NZ     X2,ERD2     IF NO DATA READ
          WRITER E.OUT
 ERD2     SA4    E.IN 
          LX4    59-9 
          PL     X4,ERD9     IF EOI NOT SET 
          REWIND E.OUT
          REWIND E.IN,RECALL
          RECALL E.OUT
          SA1    FS          CHECK READ FILE NAME STATUS
          NG     X1,ERD4     IF NAME TOP1 
          SA4    E.OUT
          SA1    ERDA 
          MX2    42 
          BX6    X4-X1
          BX6    X2*X6       REMOVE UNWANTED
          NZ     X6,ERD3     IF NOT A MATCH 
          SA1    A1+1        GET OTHER SCRATCH NAME 
 ERD3     BX6    X1 
          MX7    60 
          SA6    E.IN 
          SA7    FS 
          REWIND A6,RECALL   REWIND FILE TO BE WRITTEN ON 
 ERD4     SA1    E.OUT       SWITCH FILE NAMES IN FETS
          SA2    E.IN 
          BX6    X1 
          BX7    X2 
          SA6    A2 
          SA7    A1 
  
*         ENTRY FROM *TOP*. 
  
 ERD5     SA1    INDEX
          SX6    B1          RESET *IWHERE* 
          MX7    60 
          SA6    IWHERE 
          SA7    NOMOD       SET NO MODIFICATIONS 
          SX1    X1-.QUIT 
          ZR     X1,ERD6     IF QUIT COMMAND
          SX1    X1+.QUIT-.END
          ZR     X1,ERD6     IF END COMMAND 
          SX1    X1+.END-.FILE
          NZ     X1,ERD7     IF NOT FILE COMMAND
 ERD6     RECALL E.IN 
          EQ     TOP         EXIT 
  
 ERD7     READ   E.IN 
          MX6    1
          SA6    RC          SET *NO DATA READ* FLAG
          SA1    INDEX
          SB6    X1-.TOPNUL 
          ZR     B6,ERD8     IF TOPNULL COMMAND 
          RJ     RDF
          EQ     TOP         EXIT 
  
 ERD8     SX6    2R 
          BX7    X7-X7
          LX6    -12
          SA7    E.LMOD      SET NO LINE MODIFICATION 
          SA6    E.LINE      SET BLANK LINE AS EXISTING 
          SA7    E.CMODE     SET CURRENT MODE 
          EQ     TOP         EXIT 
  
*         XEDIT SHOULD NEVER JUMP TO HERE.
  
 ERD9     SB6    =C* XEDIT INTERNAL ERROR (ERD). NOTIFY CONSULTANT.*
          EQ     ABT         ABORT, EXIT
  
 ERDA     CON    0LSCRA+1 
          CON    0LSCRB+1 
 ERDB     BSS    1
 LOC      SPACE  4,15 
**        LOC - LOCATE STRING SPECIFIED.
* 
*         ENTRY  (X3) = NUMBER OF CHARACTERS IN LINE. 
*                (X4) = EDIT LINE STARTING ADDRESS - 1. 
*                (X5) = FIRST CHARACTER OF EDIT LINE. 
*                (B4) = DESIRED STARTING ADDRESS - 1 FOR SEARCH 
*                       (E.STR).
*                (LOCA - LOCC) = PARAMETERS.
*                (SPCP) = NEGATIVE IF WINDOW WAS SPECIFIED. 
* 
*         EXIT   (B4) = FWA OF MATCH (IN E.STR).
*                (B5) = LWA +1 OF MATCH (IN E.STR). 
*                       0, IF STRING NOT FOUND. 
* 
*         USES   A- 1, 2, 3, 4, 7.
*                X- 1, 2, 3, 4, 6, 7. 
*                B- 2, 3, 4, 5, 6, 7. 
* 
*         CALLS  LST. 
  
  
 LOC9     SB5    0           SET STRING NOT FOUND 
  
 LOC      PS                 ENTRY/EXIT 
  
*         THERE ARE THREE OPTIONS, EACH SET BY CODE MODIFICATION. 
*         THE THREE WORDS ARE GIVEN BELOW.
  
 LOC      RMT 
  
 LOCD     SB5    1           THERE ARE NO STRINGS 
          EQ     LOC         EXIT 
  
 LOCE     SA4    LOCA        NORMAL STRING SEARCH REQUIRED
          SA3    E.STR-1
 LOCF     EQ     LOC8        NULL STRING ROUTINE
-         VFD    *P/0        SPECIAL FLAG (SEE CHS) 
          RMT 
  
          BSSZ   1           ALLOCATE SPACE FOR WORD
          SB7    X4+         LEFTMOST STARTING ADDRESS - 1
          SB2    X3+E.STR    ADDRESS OF END OF LINE 
          SA1    TRIM 
          SA2    SPCP 
          NG     X1,LOC1.1   IF *TRIM* FLAG SET 
          PL     X2,LOC1.1   IF WINDOW NOT SPECIFIED
  
*         BLANK FILL LINE OUT TO THE SPECIFIED WINDOW.
  
          SA2    RTWD        SET TO RIGHT WINDOW MARGIN 
          ZR     X2,LOC1.1   IF WINDOW NOT SPECIFIED
          SB3    X3          SET TO LENGTH OF LINE
          SB6    X2 
          GE     B3,B6,LOC1.1  IF LINE IS LONGER THAN WINDOW
          SB3    B6-B3
          SB3    B2+B3
          SX6    1R          SET TO BLANK 
 LOC1     SA6    B2 
          SB2    B2+B1
          NE     B2,B3,LOC1  IF NOT FILLED TO RIGHT WINDOW
          MX6    2           SET END OF LINE INDICATOR
          SA6    B2 
 LOC1.1   SA2    A4+B1       1/TRIM,11/LENGTH,12/,18/COMPARE,18/R.MAR 
          AX4    18 
          GE     B7,B4,LOC1.2  IF LEFT START = MAX(DESIRED,WINDOW)
          SB7    B4 
 LOC1.2   UX6,B6 X2          STRING LENGTH, X6 = TRIM FLAG
          SA1    B7          SET STARTING CHARACTER-1 (E.STR) 
          AX2    18 
          SB3    X6          RIGHT MARGIN (VIA WINDOW/ANCHOR) 
          PL     X4,LOC2     IF NOT ANCHOR MODE 
          SB3    B3+B6       ADD LENGTH OF STRING 
          SB3    B3-B1       COMPENSATE FOR EXTRA WORD IN ADDITION
 LOC2     SA2    X2          GET STARTING ADDR OF COMPARE STRING
          GE     B2,B3,LOC3  IF RIGHT MARGIN NOT PAST LINE WIDTH
          SB3    B2          RESET TO LINE WIDTH
 LOC3     LX7    X2 
          SA7    B2+B1       SET COMPARE (IMMEDIATELY AFTER EOL)
          SB5    B5-B5       SET FAILURE
          SX7    X4          PUT GLOBAL CHARACTER 
          ZR     B6,LOC4     IF NO STRING 
          RJ     LST         LOCATE STRING
          NZ     B7,LOC      IF STRING NOT FOUND (FAILURE)
          SB4    A1          SET FIRST CHARACTER OF MATCH 
          SB5    A1+B6       SET LWA+1
          SB7    B5-1 
          SX4    0           SET NO ANCHOR
 LOC4     SA3    LOCC        1/TRIM,11/LENGTH,30/STARTING,18/MARGIN 
          UX6,B6 X3          (X3) = TRIM, (B6) = LENGTH 
          AX6    18 
          NG     X4,LOC5     IF ANCHOR (AND NULL FIRST STRING)
          SB3    X3+         RESET RIGHT MARGIN 
 LOC5     SA2    X6 
          GE     B2,B3,LOC6  IF TO SET TO MINIMUM (MARGIN,LINE WIDTH) 
          SB3    B2 
 LOC6     ZR     B6,LOC      IF NO SECOND STRING
          SX4    X7 
          LX7    X2 
          SA7    B2+B1       SET COMPARE AFTER END OF STRING
          SX7    X4          RESTORE GLOBAL CHARACTER 
          SA1    B7+         SET POINTER FOR SECOND STRING
          RJ     LST
          LX6    59-18
          SB5    A1+B6       SET ENDING CHARACTER 
          NG     X6,LOC7     IF NEGATIVE LOGIC
          ZR     B7,LOC      IF POSITIVE AND FOUND IT 
          EQ     LOC9        SET FAILURE
  
 LOC7     NZ     B7,LOC      IF NEGATIVE AND NOT FOUND
          EQ     LOC9        STRING NOT FOUND 
  
*         SEARCHING FOR NULL STRING. FOUND ONLY WHEN AT 
*         THE BEGINNING OF A LINE/WINDOW (DEPENDING ON TRIM SET). 
  
 LOC8     SA4    LOCA 
          SB7    X4 
          SB5    X4+B1       SET LWA+1 OF SEARCH
          SA2    TRIM 
          GT     B4,B7,LOC9  IF STARTING PAST MINIMUM (FAIL)
          SB4    X4+1        SET FWA OF MATCH 
          PL     X2,LOC      IF NOT TRIM (SUCCESSFUL) 
          MX2    2           CHECK FOR EOL
          BX2    X2-X5
          ZR     X2,LOC9     IF NOT EOL 
          SA1    E.STR-1     GET LINE WIDTH 
          SB3    X1+E.STR 
          GE     B7,B3,LOC9  IF PAST LAST NON-BLANK (FAIL)
          EQ     LOC         RETURN 
  
 LOC      HEREL              ASSEMBLE ENTRY OPTIONS 
  
**        LOCA - LOCC - LOCATE DEFINITION CELLS.
* 
*         FORMAT FOR THE THREE WORDS IS-
* 
*         1/A,11/ ,12/,18,GLOBAL  ,18/L.MARGIN. 
*         1,T,11/L,12/,18,COMPARE ,18/R.MARGIN. 
*         1/T,11/L,12/,18,COMPARE ,18/R.MARGIN. 
* 
*         WHERE-
*         *A* = 1 IF ANCHOR IS SET. 
*         *T* = 1 IF TRIM SET (ALL CHARS IN STRING SIGNIFICANT).
*         *L* = LENGTH OF ASSOCIATED STRING.
*         *GLOBAL* = THE CHARACTER THAT MATCHES ALL.
*         *COMPARE* = FWA IF ASSOCIATED STRING (IN COMMAND).
*         *RMARGIN* = ADDRESS OF LEFTMOST POSSIBLE STARTING 
*         CHARACTER-1.
*         *L.MARGIN* = ADDRESS OF RIGHTMOST POSSIBLE ENDING 
*         CHARACTER+1.
  
 LOCA     BSSZ   1           LOCATE ENVIRONMENT WORD
 LOCB     BSSZ   1           FIELD ONE DEFINITION 
 LOCC     BSSZ   1           FIELD TWO DEFINITION 
 LST      SPACE  4,20 
**        LST - LOCATE STRING IN EDIT LINE. 
* 
*         ENTRY  (A1) = FWA-1 OF START OF SCAN IN EDIT LINE.
*                (A2) = FWA OF COMPARE STRING IN COMMAND LINE.
*                (X2) = FIRST WORD OF STRING IN COMMAND LINE. 
*                (X6) = NEGATIVE IF TRAILING GLOBAL/BLANKS ARE
*                       IMPORTANT.
*                (X7) = GLOBAL CHARACTER (MUST NOT BE MASK OF 2). 
*                (B3) = LWA+1 AVAILABLE FOR SCANNING (USUALLY EOL). 
*                (B6) = LENGTH OF COMPARE STRING. 
*                ASSUMES THAT THE FIRST CHARACTER OF THE COMPARE
*                STRING HAS BEEN PLACED AT EOL+1. 
* 
*         EXIT   (A1) = FWA OF POSSIBLE MATCH.
*                (B6) = LENGTH-1 OF POSSIBLE MATCH. 
*                (B7) = 0, IF MATCH.
*                IF (A1)+1 .GE. (B3) AT ENTRY, THEN IF THE COMPARE
*                STRING IS BLANK/GLOBAL AND TRIM IS OFF, THEN THE 
*                RESPONSE IS -
*                (B7) = 0 (SUCCESSFUL MATCH). 
*                (A1) = (A1) AT ENTRY.
*                (B6) = 0.
* 
*         USES   A - 1, 3, 4. 
*                X - 1, 3, 4. 
*                B - 6, 7.
  
  
 LST4     SA1    A1+B1       MOVE START OF STRING POINTER 
          BX3    X1-X2
          ZR     X3,LST6     IF MATCH 
          IX3    X2-X7
          ZR     X3,LST6     IF FIRST COMPARE IS GLOBAL 
 LST5     SA1    A1+B1       MOVE START OF STRING POINTER 
          IX3    X1-X2
          NZ     X3,LST5     IF NOT A MATCH 
 LST6     SB7    A1-B3       DETERMINE LENGTH OF EDIT LEFT
          SB7    -B7
          LT     B7,B6,LST8  IF NOT ENOUGH SPACE LEFT FOR MATCH 
          SB7    B6-1 
 LST7     ZR     B7,LST      IF END OF STRING (MATCH) 
          SA3    A1+B7
          SA4    A2+B7
          SB7    B7-B1
          IX3    X3-X4
          ZR     X3,LST7     IF MATCH (TRY NEXT)
          NG     X7,LST4     IF GLOBAL NOT USED (IN STACK)
          IX4    X4-X7
          ZR     X4,LST7     IF COMPARE IS GLOBAL 
          EQ     LST4        CONTINUE 
  
 LST8     NG     X6,LST2     IF TRAILING CHARACTERS SIGNIFICANT 
          SX4    B7-1 
          NG     X4,LST3     IF PAST LWA AVAILABLE
          SB6    B6-B1       DECREASE COMPARE STRING
          SA4    A2+B6
          SX3    X4-1R
          ZR     X3,LST6     IF LAST COMPARE IS BLANK (REMOVE IT) 
          IX3    X4-X7
          ZR     X3,LST6     IF LAST COMPARE IS GLOBAL (REMOVE IT)
 LST      PS                 ENTRY/EXIT 
  
          SB7    A1-B3       CHECK A1 VS B3 
          SB7    B7+B1
          LT     B7,LST4     IF STARTING NOT PAST LAST CHARACTER
          NG     X6,LST2     IF TRIM (FAILURE)
          SA1    A1+B1       CHANGE POINTER 
          SB7    B0          SET SUCCESSFUL 
 LST1     LE     B6,LST      IF COMPARE IS ALL BLANKS/GLOBAL
          SB6    B6-B1
          SA4    A2+B6
          SX3    X4-1R
          ZR     X3,LST1     IF COMPARE IS BLANK
          IX3    X4-X7
          ZR     X3,LST1     IF COMPARE IS GLOBAL 
 LST2     SB7    B1          SET STRING NOT FOUND 
          EQ     LST         BEGIN SCANNING 
  
 LST3     SA1    B3-B1
          EQ     LST+1       RESTART SCAN AT END OF LINE
  
 MDY      SPACE  4,15 
**        MDY - PROCESS MODIFY DIRECTIVES.
* 
*         ENTRY  (E.STR) = ORIGINAL LINE (UNPACKED).
*                (D.STR) = DIRECTIVES LINE (UNPACKED).
* 
*         EXIT   (B3) = NEGATIVE, IF TRUNCATION ENCOUNTERED.
*                (E.STR) = NEW TEXT LINE. 
* 
*         USES   A - 1, 2, 6. 
*                X - 1, 2, 6, 7.
*                B - 2, 3, 4, 6.
*                E.SCR. 
* 
*         CALLS  TSL. 
  
  
 MDY5     SX6    1R          SET BLANK CHARACTER
 MDY6     GT     B3,B4,MDY1  IF AT END OF BUFFER
          SA6    B3 
          SB3    B3+B1       SET TO NEXT PLACE TO SAVE
 MDY7     SA2    A2+B2       GET NEXT *E.STR* CHARACTER 
          NO
          PL     X2,MDY8     IF NOT AT END OF LINE
          SX6    1R 
          SB2    B0          SET TO NOT ESCAPE END OF LIE 
          BX2    X2+X6       GET END LINE (WITH BLANK)
 MDY8     SA1    A1+B1       GET NEXT DIRECTIVES CHARACTER
          SX6    X2          MOVE CURRENT TEXT CHAR 
          SX7    X1-1R
          ZR     X7,MDY6     IF SPACE DIRECTIVE 
          NG     X1,MDY16    IF END OF DIRECTIVE LINE 
          CHAR   (SX7 X1-0),SH. 
          ZR     X7,MDY7     IF SHARP (DELETE TEXT CHAR)
          CHAR   (SX7 X1-0),AM. 
          ZR     X7,MDY5     IF AMPERSAND (SET TEXT TO BLANK) 
          BX6    X1 
          SB6    X1+B5       B5 = -UP ARROW 
          NZ     B6,MDY6     IF CHARACTER (REPLACE TEXT)
 MDY9     SA1    A1+B1       GET NEXT DIRECTIVES
          CHAR   (SX3 X1-0),SH. 
          BX6    X1 
          SX7    B6+B1       SET NUMBER OF CHARACTERS SCANNED 
          NG     X1,MDY10    IF END OF DIRECTIVES 
          SB6    B6+B1       INCREMENT COUNT OF CHARACTERS SCANNED
          ZR     X3,MDY11    IF SHARP 
          GT     B3,B4,MDY2  IF PAST 160 CHARACTERS 
          SA6    B3 
          SB3    B3+B1
          EQ     MDY9        LOOP 
  
 MDY10    SX6    1R 
          NZ     B6,MDY14    IF SOMETHING WAS AFTER THE UPARROW 
          SX7    X7+B1       INCREMENT CHARACTER COUNT
          SA2    A2-B2       RESET CHARACTER POINTER
          EQ     MDY12       ELSE INSERT ONE SPACE
  
 MDY11    SX7    B6+B1
          NE     B6,B1,MDY14 IF NOT (UP ARROW)(SHARP) 
          SX7    B1          RESET COPY COUNTER 
 MDY12    GT     B3,B4,MDY4  IF POSSIBLE TRUNCATION 
          SA6    B3 
          SB3    B3+B1
 MDY13    SA2    A2+B2       GET NEXT E.STR CHARACTER 
          PL     X2,MDY14    IF NOT END OF LINE 
          SB2    B0 
          SX6    1R 
          BX2    X2+X6
 MDY14    SX6    X2 
          SX7    X7-1 
 MDY15    PL     X7,MDY12    IF MORE TO MOVE
          PL     X1,MDY8     IF MORE DIRECTIVES 
  
*         END OF DIRECTIVES, COPY REST OF TEXT. 
  
 MDY16    NG     X2,MDY19    IF END OF TEXT 
          GT     B3,B4,MDY3  IF END OF BUFFER 
          SX6    X2+
          SA6    B3 
          SB3    B3+B1
 MDY17    SA2    A2+B1       GET NEXT TEXT
          SX6    X2 
          EQ     MDY16       CONTINUE COPY
  
*         SET TRUNCATION FLAG AND CLEANUP.
  
 MDY18    SB2    -1 
  
*         SET END OF LINE AND COPY BACK TO *E.STR*. 
  
 MDY19    MX6    2
          NO
          SA6    B3+         SA6/SA1 *MUST* BE IN THIS ORDER
          SB6    E.STR
          SA1    E.SCR
 MDY20    BX6    X1 
          SB6    B6+B1
          SA1    A1+B1
          SA6    B6-B1
          PL     X6,MDY20    IF NOT FINISHED
          SB6    E.STR-1     SET LINE WIDTH CELL
          SB3    B2          MOVE TRUNCATION FLAG 
          RJ     TSL         TRIM ANY TRAILING SPACES 
 MDY      PS                 ENTRY/EXIT 
  
          CHAR   (SB5 -0),UA. 
          SB2    B1          SET NOT AT END OF TEXT LINE
          SB3    E.SCR       SET NEXT SAVE CHAR ADDR
          SB4    E.SCR+159   SET LWA
          SA1    D.STR-1
          SA2    E.STR-1
          EQ     MDY7        BEGIN LOOP 
  
*         HANDLE SPECIAL CASES OF FULL BUFFER, ADDING CHARACTERS. 
  
 MDY1     SX7    X6-1R
          ZR     X7,MDY7     IF SPACE (NO TRUNCATION) 
          EQ     MDY18       TRUNCATE 
  
  
 MDY2     SX7    X6-1R
          ZR     X7,MDY9     IF SPACE (NO TRUNCATION) 
          EQ     MDY18       TRUNCATE 
  
 MDY3     SX7    X6-1R
          ZR     X7,MDY17    IF SPACE (NO TRUNCATION) 
          EQ     MDY18       TRUNCATE 
  
 MDY4     SX7    X6-1R
          ZR     X7,MDY13    IF SPACE (NO TRUNCATION) 
          EQ     MDY18       TRUNCATE 
  
 MPR      SPACE  4,15 
**        MPR - MOVE POINTER. 
* 
*         ENTRY  (X1) = NUMBER OF LINES TO MOVE.
* 
*         EXIT   IF (X1) IS NEGATIVE AT ENTRY, THE FILE IS REWOUND. 
* 
*         USES   A - 1, 3, 4, 6, 7. 
*                X - 1, 2, 3, 4, 6, 7.
* 
*         CALLS  GLN, TOP.
* 
*         NOTES  IF (X1) = -0 AT ENTRY, THIS ROUTINE WILL FORCE A COPY
*                TO THE NEXT SCRATCH FILE AND RETURN THE POINTER
*                TO THE CURRENT POINTER POSITION. 
  
  
 MPR1     SA1    GLNA        RETRIEVE DESIRED LINE FROM HOLDING 
          RJ     GLN         ADVANCE TO LINE
 MPR      PS                 ENTRY/EXIT 
  
          SA3    IWHERE 
          SA4    VERIFY 
          MX2    1
          IX6    X3+X1       GET DESIRED *IWHERE* VALUE 
          BX7    X2*X1       GET DIRECTION OF MOVE
          SX3    B1 
          IX3    X6-X3
          PL     X3,MPR0     IF MOVING TO A LEGAL POSITION
          SX6    B1          SET DESIRED TO 1 
 MPR0     IX6    X6+X2       SET SIGN BIT (*MPR* FLAG)
          AX4    60          EXTEND STATUS OF VERIFY
          SA6    GLNA        HOLD DESIRED POSITION
          BX7    -X7*X4      SET TEMPORARY VERIFICATION STATUS
          SA7    A4          RESET VERIFICATION FLAG
          PL     X1,MPR1     IF FORWARD MOTION
          RJ     TOP
          EQ     MPR1        MOVE TO DESIRED POSITION 
 RDF      SPACE  4,30 
**        RDF - READ EDIT FILE LINE.
* 
*         ENTRY  LINE CONTROL (*E.NMODE*, ETC) SET. 
* 
*         EXIT   LINE READ INTO *E,LINE*. 
*                IF *E.NMODE* = ASCII, THEN THE LINE IS UNPACKED
*                TO *E.STR*.
*                THIS ROUTINE USUALLY EXITS NORMALLY. IF THE ROUTINE
*                ENCOUNTERS THE END OF INFORMATION, THE ROUTINE EXITS 
*                TO *NCM*, UNLESS PRESETTING, THEN TO *RDF2*. 
*                IF IN CREATION MODE, THIS ROUTINE RETURNS WITHOUT
*                READING. 
* 
*         USES   A - 1, 2, 3, 4, 6, 7.
*                X - 1, 2, 3, 4, 6, 7.
*                B - 2, 4, 6, 7.
* 
*         CALLS  CIO=, ERO, RTB, STL, UPL, VIS. 
* 
*         MACROS READ, READC, WRITEC. 
* 
*         NOTES  FILE MARKS WILL BE RETAINED ACROSS THE FILE UNLESS 
*                THE CORRESPONDING COUNTER IS SET (DF/DR).
*                IN ADDITION, IF IN VERIFY MODE (AND TOGGLE SET), THE 
*                MESSAGE --EOR--/--EOF-- WILL BE PRINTED. 
*                AFTER EACH TEXT LINE IS READ, *TLX* (TELEX INTERRUPT)
*                IS CHECKED. IF SET, ROUTINE EXITS TO *NCM*.
  
  
 RDF11    SA1    TLX
          ZR     X1,RDF      IF NO INTERRUPT
          RJ     STL         PROCESS INTERRUPT
 RDF      PS                 ENTRY/EXIT 
  
*         FIRST WORD OF ROUTINE IS REPLACED WHEN OUT
*         OF CREATION MODE. 
  
          SA1    IWHERE      PREPARE FOR CREATION MODE CHECK
          EQ     RDF1        CHECK CREATION MODE
  
 RDF      RMT                NORMAL CODE FOLLOWS
          SB0    0           TEMPORARY
          SB0    0
          RMT 
  
          READC  E.IN,E.LINE,33D
          SB4    X1+B1
          NG     B4,RDF9     IF AT EOI
  
*         WORD IS REPLACED IF TO VERIFY EOR/EOF.
  
 RDFA     NE     B4,B1,RDF3  IF EOR/EOF 
          SB7    E.LINE 
          RJ     RTB         TRIM OFF TRAILING BLANKS 
          SA1    E.NMODE     GET NEEDED MODE
          MX6    0
          SA3    IW 
          SA6    A1+B1       SET CURRENT MODE TO CODED
          SA6    A6+B1       SET NO MODIFICATIONS 
          SA6    RC          SET DATA READ
          ZR     X1,RDF11    IF CODED MODE DESIRED
          SA1    E.LINE      CONVERT TO ASCII 
          SB6    E.STR
          RJ     UPL
          SA6    E.STR-1     SET NUMBER OF CHARS IN LINE
          SX7    B1          SET CURRENT MODE TO ASCII
          SA7    E.CMODE     SET CURRENT MODE OF LINE 
          EQ     RDF11       CHECK FOR INTERRUPT
  
*         CREATION MODE CHECK.
  
 RDF1     NG     X1,RDF      IF IN CREATION MODE
          SA2    INITZ
          ZR     X2,RDF2     IF INITIALIZING (CREATION MODE POSSIBLE) 
          SA1    RDFG        CHANGE INSTRUCTIONS
          BX6    X1 
          SA6    RDF+1       CHANGE CREATION MODE CHECKER 
          RJ     VIS         VOID INSTRUCTION STACK 
 RDF2     BSS    0
 RDFG     BSS    0
 RDF      HEREL 
          JP     RDF+2       CONTINUE PROCESSING
  
*         EOF/EOR ENCOUNTERED.
  
 RDF3     SB7    B6-E.LINE
          NZ     B7,BTL      IF ENCOUNTERED NON-TEXT LINE 
          ZR     B4,RDF3.1   IF EOF 
          SB4    B1+         SET (B4) = EOR TYPE
 RDF3.1   SA1    ITOGGLF+B4 
          SA2    VERIFY 
          BX6    X1*X2
          PL     X6,RDF4     IF NO VERIFICATION 
          SA3    RDFE 
          SX6    B4 
          BX7    X3 
          SA7    RDFA        RESET CODE AT RDFA 
          SA6    RDFB 
          RJ     VIS         VOID INSTRUCTION STACK 
 RDF4     SA4    UPDATE 
          PL     X4,RDF6     IF IN LOOK MODE
          SA3    DF+B4       DELETION COUNT 
          SA4    RDFC+B4
          ZR     X3,RDF5     IF NOT DELETING RECORD MARK
          SX6    B1+
          IX6    X3-X6
          SA6    A3          REPLACE COUNTER
          EQ     RDF6        READ, DELETE RECORD MARK 
  
 RDF5     SX2    E.OUT
          MX6    1
          BX7    -X4         SET FUNCTION AND AUTO-RECALL 
          SA6    RC          SET NO DATA READ 
          RJ     CIO= 
 RDF6     READ   E.IN 
          EQ     RDF2        RESTART ROUTINE
  
*         VERIFY EOR/EOF. 
  
 RDF7     SA1    RDFB 
          MX6    1
          SX7    B4 
          PX7    B6,X7
          SA7    RDFD        SAVE B4
          NG     X1,RDF8     IF NOTHING TO VERIFY 
          SB4    EOF.+X1
          SA3    EXPLAIN
          SA4    MESSAGE+B4  GET MESSAGE POINTER
          AX3    12 
          SA6    A1          CLEAR MESSAGE FLAG 
          PX7    B4,X3
          SA7    A3          REPLACE EXPLAIN WORD 
          WRITEC OUTPUT,X4
 RDF8     SA1    RDFF        RESET INSTRUCTION WORD 
          SA2    RDFD        RETRIEVE STATUS OF B4
          BX6    X1 
          SB4    X2 
          UX2,B6 X2          RETRIEVE *B6*
          SA6    RDFA 
          RJ     VIS         VOID INSTRUCTION STACK 
          JP     RDFA        CONTINUE AND VOID STACK
  
*         EOI ENCOUNTERED.
  
 RDF9     BX6    X6-X6
          MX7    1
          SA6    DF          DELETE NO MORE EOF,S 
          SA7    RDFB        SET NO VERIFICATION NECESSARY
          SA6    DR          DELETE NO MORE EOR,S 
          SA1    INITZ
          ZR     X1,/PRESET/PRF1  IF PRESETTING XEDIT 
          SA4    EXPLAIN
          SB2    EOI. 
          AX4    12 
          SA3    MESSAGE+B2 
          PX6    B2,X4
          SA6    A4 
          WRITEC OUTPUT,X3   ISSUE *END OF FILE* MESSAGE
          SA1    IWHERE 
          AX1    1           ZERO IF CREATION MODE OR IWHERE = 1
          ZR     X1,RDF10    IF NO FILE 
          RJ     ERD         PROCESS END OF FILE
          EQ     NCM         EXIT 
  
*         EOI AND NOTHING IN FILE.
  
 RDF10    SB6    =C* YOU DELETED THE ENTIRE FILE.*
          EQ     ABT         ABORT XEDIT
  
 RDFB     DATA   -1          EOF/EOR ENCOUNTERED (LEVEL NUMBER) 
 RDFC     CON    34B,24B     CIO CODES FOR WRITEF/WRITER
 RDFD     BSSZ   1           STORAGE FOR B4 WHEN VERIFYING
 RDFE     EQ     RDF7        CODE TO CAUSE EOR/EOF MESSAGE ON RE-ENTRY
 RDFF     NE     B4,B1,RDF3  IF EOR/EOF (EXACT IMAGE OF *RDFA*) 
          SB7    E.LINE 
 RDL      SPACE  4,30 
*         RDL - READ DATA LINE INTO *D.LINE*. 
* 
*         ENTRY  NONE.
* 
*         EXIT   (X1) = READC X1 REGESTER CONVENTION AS FOLLOWS - 
*                (X1) = 0 FOR TRANSFER COMPLETE.
*                (X1) = -1 IF EOF DETECTED ON FILE. 
*                (X1) = -2 IF EOI DETECTED ON FILE. 
*                (X1) = ADDRESS PLUS ONE OF LAST WORD TRANSFERED TO 
*                       WORKING BUFFER, IF EOR WAS DETECTED ON FILE 
*                       BEFORE TRANSFER WAS COMPLETE. 
*                IF (X1) .NE. 0, THEN *D.LINE* IS NOT CHANGED.
*                TO *ABT* IF FATAL ERROR. 
*                IF (X1) = 0, THEN THE FOLLOWING IS ALSO DONE - 
*                IF *E.NMODE* = 1 (ASCII), THEN THE DATA LINE IS
*                UNPACKED TO *D.STR*, AND THE DATA LINE WIDTH IS
*                ENTERED INTO *D.STR*.
* 
*         USES   A - 1, 2, 3, 4, 6, 7.
*                X - 1, 2, 3, 4, 6, 7.
*                B - 2, 3, 5, 6, 7. 
* 
*         CALLS  NDL, RTB, RTOA, UPL. 
* 
*         MACROS READ, READC. 
  
  
 RDL8     SX7    2R          SET BLANK LINE AS LINE 
          LX7    -12
          SA7    D.LINE 
 RDL9     SA2    A2 
          PX6    B0,X2
          SA6    A2          *C.STR*-1
          MX1    0           SET SUCCESSFUL READ
  
*         CHECK DESIRED MODE OF LINE. 
  
 RDL10    SA2    E.NMODE
          ZR     X2,RDL      IF CODED 
          SA1    D.LINE 
          SB6    D.STR
          RJ     UPL         UNPACK DATA LINE 
          MX1    0           SET SUCCESSFUL READ
          SA6    D.STR-1     SET LENGTH 
  
 RDL      PS                 ENTRY/EXIT 
          SA1    PREFIX 
          SA2    C.STR-1
          LX1    59-/PREFIX/PLUS
          UX3    B3,X2
 .CYB     IF     DEF,CYBRNET
          PL     X1,RDL4     IF + PREFIX GET DATA FROM COMMAND
 .CYB     ELSE
          NG     X1,RDL4     IF + PREFIX (READ REQUIRED)
 .CYB     ENDIF 
          LE     B3,RDL3     IF POINTER FLAG IS READ
          SA4    A2+B3       GET NEXT CHARACTER FROM COMMAND LINE 
          SB4    X2          DELIMITER
          NG     X4,RDL8     IF AT END OF LINE
          SB6    A2+B3       GET FIRST CHARACTER
          SB7    D.LINE      SET DESTINATION FOR RTOA 
 RDL1     SB5    X4 
          EQ     B5,B4,RDL2  IF FOUND DELIMITER 
          SB3    B3+B1
          SA4    A2+B3       GET NEXT CHARACTER 
          PL     X4,RDL1     IF NOT AT END OF LINE
          SB3    -B1         SET POSITION 
 RDL2     MX6    1
          SB2    A4          SET END OF DATA LINE ADDRESS 
          BX6    X6+X4
          SB3    B3+B1       SET NEXT AVAILABLE CHARACTER 
          SA6    A4          SET PSEUDO END OF LINE 
          PX7    B3,X2
          SA7    A2          REPLACE CHARACTER POINTER
          RJ     RTOA        PACK DATA LINE TO D.LINE 
          ZR     B3,RDL9     IF AT REAL END OF LINE 
          SA2    B2 
          MX1    0           SET READ SUCCESSFUL
          SX6    X2          CLEAR PSEUDO END LINE
          SA6    A2 
          EQ     RDL10       CHECK MODE OF LINE 
  
*         READ REQUIRED FROM COMMAND LINE SOURCE. 
  
 RDL3     RJ     NDL
          ZR     X1,RDL+1    IF NOT <CR>, RETRY READ
          EQ     RDL         ELSE RETURN
  
*         READ REQUIRED FROM PRIMARY INPUT SOURCE.
  
 RDL4     SA1    NCLA 
          SA3    TTYIN
          BX6    X1+X3
          SA6    A1          REPLACE READ REQ,D FLAG
          NZ     X1,RDL6     IF READ NOT NEEDED 
 RDL5     READ   INPUT,RECALL 
 RDL6     READC  INPUT,D.LINE,33D  READ DATA
          ZR     X1,RDL7     IF SUCCESSFUL
          SA2    TTYIN
          SB6    =C* BATCH MODE ABORT. END OF RECORD ENCOUNTERED.*
          SA3    TLX
          MX6    0
          SA6    A3          CLEAR INTERRUPT STATUS 
          NZ     X2,ABT      IF NOT *TTY* INPUT FILE
          NZ     X3,RDL5     IF INTERRUPTED 
          EQ     RDL         RETURN 
  
 RDL7     SB7    D.LINE 
          RJ     RTB         TRIM TRAILING BLANKS 
          BX7    X7-X7
          MX1    0           SET SUCCESSFUL READ
          SA7    TLX         IGNORE INTERRUPTS
          EQ     RDL10       CHECK MODE OF LINE 
  
 RTA      SPACE  4,10 
**        RTA - CONVERT 160K1 TO C FORMAT (MAX 33 WORDS). 
* 
*         ENTRY  (B6) = INCOMING STRING ADDRESS.
*                (B7) = OUTGOING STRING ADDRESS.
* 
*         EXIT   STRING IS CONVERTED. 
* 
*         USES   A - 1, 6.
*                X - 1, 2, 6, 7.
*                B - 4, 6, 7. 
  
  
 RTA      PS                 ENTRY/EXIT 
 RTOA     EQU    RTA
          SB4    6           SHIFT VALUE
          BX6    X6-X6       CLEAR ASSEMBLY 
          MX7    1           POSITION INDICATOR 
          SX1    B0+         INITIALIZE FOR POSSIBLE BLANK LINE 
          EQ     RTA2        BEGIN CONVERSION 
  
 RTA1     LX7    6           SHIFT POSITION 
          BX6    X6+X1       MERGE CHARACTERS 
          PL     X7,RTA2     IF NOT FULL WORD 
          SA6    B7 
          SB7    B7+1 
          BX6    X6-X6       CLEAR ASSEMBLY 
 RTA2     BX2    X1 
          SA1    B6          GET NEXT CHARACTER 
          NG     X1,RTA4     IF END OF BUFFER REACHED 
 RTA3     LX6    6
          SB6    B6+1 
          AX2    B4,X1
          ZR     X2,RTA1     IF NO ASCII ESCAPE CHARACTER 
          LX7    6
          LX6    6
          PL     X7,RTA1     IF ASCII CAN FIT INTO THIS WORD
          LX6    -6          SHIFT ASSEMBLY BACK
          LX1    -7 
          BX6    X6+X2
          LX7    6
          AX1    60-7        REMOVE ASCII ESCAPE
          SA6    B7          SAVE WORD
          SB7    B7+B1
          BX6    X1 
          EQ     RTA2        LOOP, PROCESS NEXT WORD
  
 RTA4     SB6    B6-1        RESET CHARACTER POINTER
          ZR     X2,RTA6     IF LAST CHARACTER WAS A COLON
 RTA5     SA1    =40004000400040004000B 
          SA6    B7 
          BX2    X1*X7
          NZ     X2,RTA7     IF ON BYTE BOUNDRY 
  
 RTA6     SX1    1R 
          EQ     RTA3        BLANK FILL TO BYTE BOUNDARY
  
 RTA7     NG     X7,RTA      IF WORD IS FULL, RETURN
 RTA8     LX7    12 
          LX6    12 
          PL     X7,RTA8     IF NOT LEFT JUSTIFIED
          SA6    B7 
          ZR     X6,RTA      IF ASSURE A ZERO WORD, RETURN
          BX6    X6-X6
          SA6    A6+B1
          EQ     RTA         RETURN 
 RTB      SPACE  4,15 
**        RTB - REMOVE TRAILING BLANKS FROM A CODED LINE. 
* 
*         ENTRY  (B6) = LWA+1 OF CODED LINE.
*                (B7) = FWA OF CODED LINE.
* 
*         EXIT   UNSIGNIFICANT BLANKS REMOVED FROM LINE.
* 
*         USES   A - 1, 2, 3, 6, 7. 
*                X - 1, 2, 3, 4, 6, 7.
*                B - 3, 5, 6. 
* 
*         CALLS  RTA, UPL.
* 
*         NOTES  THIS ROUTINE IS DESIGNED TO BE CALLED IMMEDIATELY
*                FOLLOWING A CALL TO *RDC*. THE ONLY PRESET NEEDED
*                IN THAT CASE IS TO SET B7. B6 IS SET VIA *RDC*.
  
  
 RTB7     SA1    B6-B1       GET NEXT WORD
          SB6    A1 
          LT     B6,B7,RTB5  IF BEGINNING OF LINE 
 RTB8     BSS    0
          BX6    -X2-X1      111111 WHERE BLANK 
          BX4    X3*X6       100000 WHERE POSSIBLE BLANK
          BX6    -X3*X6      011111 WHERE POSSIBLE BLANK
          LX4    -5          000001 WHERE POSSIBLE BLANK
          IX6    X4+X6       100000 WHERE BLANK 
          BX6    X3*X6       100000 ONLY WHERE BLANK
          ZR     X6,RTB5     IF NO BLANKS 
          SX4    B3 
          IX4    X1-X4       FIND LEFT MOST BIT 
          BX4    X1-X4       REMOVE EXCESS UPPER BITS 
          AX4    1           POSITION MASK
          BX4    X3*X4       100000 ONLY WHERE RIGHT 00B
          BX6    X6+X4       MERGE BLANKS AND 00B 
          BX4    X6-X3       40 WHERE NOT (BLANK.OR.RIGHT 00) 
          LX4    -1 
          IX6    X4-X7       FIND LEFT MOST BIT 
          BX4    X4-X6       REMOVE EXCESS UPPER BITS 
          AX4    5           POSITION MASK
          BX6    -X4*X1      REMOVE CHARACTERS FROM WORD
          IX1    X6-X1       COMPARE INITIAL AND FINAL
          ZR     X1,RTB4     IF NO CHANGE 
          SA6    A1          REPLACE WORD 
          SB3    B0          SET ZERO SEARCH OFF
          NG     X4,RTB7     IF THIS WORD ENTIRELY ZEROED 
          BX7    X4          CHECK LAST CHARACTER FOR 00B 
          AX7    6
          BX4    X7-X4       77 AT LAST CHAR REMOVED
          SA3    =00770077007700770077B 
          BX7    X4*X3
          NZ     X7,RTB9     IF LAST CHAR REMOVED IS ODD-ADD BLANK
          LX4    6
          BX7    X6*X4       =0 IF LAST CHARACTER IS 00B
          NZ     X7,RTB      IF NEXT TO LAST NOT 00B
          BX3    X4          ADD 2 BLANKS 
          LX4    -6 
          LX3    -12
          BX4    X4+X3
 RTB9     BX2    X4*X2       ADD 1 OR 2 BLANKS
          IX6    X6+X2
          SA6    A1 
  
 RTB      PS                 ENTRY/EXIT 
          SA1    B6-B1
          NZ     X1,RTB0     IF WORD CONTAINS DATA
          SB6    B6-B1
  
*         CHECK FOR AUTOMATIC TRUNCATION TO 160 CHARACTERS. 
  
 RTB0     SX7    B6-B7
          SB3    B1          SET CHECK FOR TRAILING 00,S
          SX7    X7-16D 
          NG     X7,RTB3     IF .LT. 16 WORDS SIGNIFICANT NO TRUNCATE 
          SA2    AS 
          SX6    2R          PREPARE BLANKS 
          ZR     X2,RTB2     IF NOT IN ASCII MODE (TRUNCATE)
          SA2    =74747474747474747474B 
          SA3    =01010101010101010101B 
          SB5    B6-1 
  
*         SEARCH FOR 74/76 CODES. 
  
 RTB1     SA1    B5          GET CURRENT WORD 
          BX4    -X1*X3      ISOLATE COMPLEMENT OF LOWER BIT
          BX7    X2*X1       GET UPPER 4 BITS 
          LX4    2
          SB5    B5-B1
          IX4    X4+X7
          BX4    X4*X3
          NZ     X4,RTB6     IF WORD CONTAINS ASCII 
          GE     B5,B7,RTB1  IF MORE TO CHECK 
 RTB2     LX6    -12         ASSURE TRUNCATION BUT HANDLE COLON 
          SA6    B7+16D 
          SB6    A6+B1       RESET LWA+1 POINTER
 RTB3     SA2    =10H 
          SA3    =40404040404040404040B 
          SX7    B1 
          EQ     RTB7        REMOVE TRAILING BLANKS 
  
 RTB4     NZ     X4,RTB      IF TRAILING ZEROS LOOKED FOR AND FOUND 
  
*         HERE IF NO BLANKS FOUND IN WORD.
  
 RTB5     NZ     B3,RTB      IF NO CHANGES MADE 
          SX6    2R          PLACE BLANK IN LAST WORD. JUST IN CASE 
          LX6    -12         OF POSSIBLE 00B CHARACTER IN CURRENT WORD
          SA6    A1+B1
          EQ     RTB         RETURN 
  
*         PROCESS TRUNCATION WHEN UNPACK NECESSARY. 
  
 RTB6     SA1    B7          SET FIRST WORD 
          SB6    E.SCR       SET TO SCRATCH AREA
          SB3    B7          SAVE FWA OF CODED BUFFER 
          RJ     UPL
          SB6    E.SCR
          SB7    B3 
          RJ     RTA         RE-PACK TRUNCATED LINE 
          EQ     RTB         RETURN 
 SAC      SPACE  4,15 
**        SAC - SET ASCII MODE LINE AND READS.
* 
*         ENTRY  NONE.
* 
*         EXIT   LINE IN *E.STR* BUFFER,
*                *E.NMODE* SET TO ASCII.
* 
*         USES   A - 1, 6, 7. 
*                X - 1, 6, 7. 
*                B - 6. 
* 
*         CALLS  UPL. 
  
  
 SAC      PS                 ENTRY/EXIT 
          SA1    E.CMODE
          SX6    B1 
          BX1    X1-X6
          SA6    A1-B1       SET E.NMODE TO ASCII 
          ZR     X1,SAC      IF LINE ALREADY UNPACKED 
          MX7    0
          SA6    A1          SET CURRENT MODE TO ASCII
          SA7    A1+B1       SET NO LINE MODIFICATIONS
  
*         UNPACK LINE.
  
          SA1    E.LINE 
          SB6    E.STR
          RJ     UPL         UNPACK LINE
          SA6    E.STR-1     SET NUMBER OF CHARACTERS IN LINE 
          EQ     SAC         RETURN 
 SCD      SPACE  4,10 
**        SCD - SET CODED LINE. 
* 
*         ENTRY  NONE.
* 
*         EXIT   CURRENT LINE IN *E.LINE*.
*                *E.CMODE* SET TO CODED.
* 
*         USES   A - 1, 2, 6. 
*                X - 1, 2, 6. 
*                B - 6, 7.
* 
*         CALLS  RTA. 
  
  
 SCD      PS                 ENTRY/EXIT 
          SA1    E.CMODE
          MX6    0
          SA2    A1+B1       GET E.LMOD 
          SA6    A1-B1       SET E.NMODE TO CODED 
          SA6    A1          SET CURRENT MODE TO CODED
          ZR     X2,SCD      IF NO LINE MODIFICATIONS 
          SA6    A1+B1       SET NO MODIFICATIONS 
          SB6    E.STR
          SB7    E.LINE 
          RJ     RTA         PACK LINE
          EQ     SCD         RETURN 
 STL      SPACE  4,15 
**        STL - PROCESS TLX INTERRUPTS. 
* 
*         ENTRY  NONE.
* 
*         EXIT   RETURNS TO CALLER IF NO TLX INTERRUPT SENSED,
*                ELSE REWINDS THE OUTPUT BUFFER AND EXITS TO *CER1* TO
*                POP THE INPUT STACK. 
* 
*         USES   A - 1, 2, 6. 
*                X - 1, 2, 6. 
* 
*         MACROS DISTC, RECALL. 
  
  
 STL      PS                 ENTRY/EXIT 
          MX6    0
          SA2    TLX
          ZR     X2,STL      IF NO INTERRUPT, RETURN
          SA6    A2 
          DISTC  ON,TLX 
          RECALL OUTPUT 
          SA1    =XOUTPUT+1 
          MX6    -18
          BX6    -X6*X1 
          SA6    A1+1        IN=OUT=FIRST 
          SA6    A6+1 
          EQ     CER1        GET NEXT INPUT LINE, EXIT
 STK      SPACE  4,15 
**        STK - STACK INPUT DEVICES.
* 
*         ENTRY  (A1) = NEW DEVICE ADDRESS (EG. *I.DEV*). 
* 
*         EXIT   RETURNS IF DEVICE IS NOT AVAILABLE (USUALLY BUSY), 
*                ELSE, ROUTINE EXITS TO NCM TO PROCESS THE NEW DEVICE.
* 
*         USES   A - 1, 3, 4, 6, 7. 
*                X - 1, 3, 4, 6, 7. 
*                B- 7.
* 
*         CALLS  UPL. 
* 
*         NOTES  THIS ROUTINE ASSUMES THAT .LINE FOR THE DEVICE HAS 
*         BEEN PRE-LOADED WITH THE SPECIFIED COMMAND LINE.
  
  
 STK      PS                 ENTRY/EXIT 
          SA3    C.STR-1     MOVE TO DEVICE WORD
          SA4    C.ON        GET POINTER TO CURRENT DEVICE
          BX6    X3 
          SA6    X4+1 
  
*         UNSTACK ANYTHING THAT CAN BE SAFELY REMOVED.
  
 STK1     SA3    X4+B1       GET CHARACTER POINTER WORD 
          SX6    X4-I.DEV 
          UX7,B7 X3          B7 .LE. 0, IF READY TO READ NEXT LINE
          ZR     X6,STK2     IF ON PRIMARY INPUT DEVICE 
          GT     B7,STK2     IF DEVICE NOT AT END OF LINE 
          SA3    X4-1        OBTAIN FET POINTER FOR DEVICE
          BX6    X3 
          AX3    60          EXTEND *CMDPOP* FLAG 
          BX6    -X3*X6      0, IF OK TO POP DEVICE 
          NZ     X6,STK2     IF (FET) .AND. (.NOT. *CMDPOP*)
  
*         POP STACK AND RE-TEST.
  
          MX6    1
          SA4    X4          GET NEW DEVICE 
          SA6    A4          IDLE OLD DEVICE
          SA2    X4+B1       GET NEW C.STR-1 WORD 
          BX7    X4 
          LX6    X2 
          SA7    C.ON        RESET ACTIVE DEVICE POINTER
          SA6    C.STR-1     RESET CHARACTER POINTER
          EQ     STK1        UNSTACK
  
*         PUSH NEW ENTRY ONTO STACK.
  
 STK2     SA1    A1 
          SX6    A1 
          BX7    X4 
          SA4    A1+B1       NEW DELIMITER WORD 
          PL     X1,STK      IF REQUESTED DEVICE IS STILL ACTIVE
          SA6    C.ON        RESET C.ON 
          SA7    A1          PUT STACK ENTRY
          PX6    B1,X4       RESET CHARACTER POINTER
          SA6    C.STR-1
          SA1    A1-34D      SET FWA OF CODED LINE
          SB6    C.STR
          RJ     UPL         UNPACK LINE
          EQ     NCM         PROCESS NEW LINE, EXIT 
 TAB      SPACE  4,20 
**        TAB - TAB INPUT LINE ACCORDING TO TAB SETTINGS. 
* 
*         ENTRY  (B6) = FWA-1 OF TEXT LINE. 
* 
*         EXIT   LINE TABBED. 
*                TRAILING SPACES ARE NOT DELETED. 
*                (X7) = 0 IF NO TRUNCATION. 
* 
*         USES   A - 1, 3, 4, 6, 7. 
*                X - 1, 2, 3, 4, 6, 7.
*                B - 3, 4, 5, 7.
*                E.SCR. 
* 
*         CALLS  TSL. 
  
  
 TAB1     SA1    A1+1        GET NEXT 
          SA6    B3 
          SB3    B3+B1
          LT     B3,B4,TAB2  IF NOT 160 CHARACTERS WORTH
          SX7    X6-1R
          NZ     X5,TAB5     IF NOT BLANK (TRUNCATE)
          SB3    B4+
 TAB2     BX6    X1 
          IX2    X1-X3
          NZ     X2,TAB1     IF NOT TAB CHARACTER 
 TAB3     ZR     X4,TAB1     IF END OF TABS 
          SB5    X4+E.SCR-1 
          SA4    A4+B1
          LT     B5,B3,TAB3  IF PAST EXISTING TAB 
          SA1    A1+B1
          LE     B5,B3,TAB2  IF CURRENTLY POINTING AT TAB 
 TAB4     SA7    B3          BLANK TO TAB POSITION
          SB3    B3+B1
          LT     B3,B5,TAB4  IF NOT AT TAB POSITION 
          PL     X1,TAB2     IF MORE DATA 
          SX7    0           SET NO TRUNCATION
 TAB5     MX6    2
          SA1    E.SCR       PREPARE TO COPY BACK 
          SA6    B3 
 TAB6     BX6    X1 
          SB7    B7+B1
          SA1    A1+B1
          SA6    B7-B1
          PL     X6,TAB6     IF MORE
          RJ     TSL         TRIM TRAILING SPACES 
 TAB      PS                 ENTRY/EXIT 
  
          SA3    TABCHAR
          SX7    B0          SET NO TRUNCATION
          SB7    B6+B1
          NG     X3,TAB      IF NO TAB CHARACTER IS DEFINED 
          SA4    A3+B1
          SA1    B6+B1       SET FIRST CHARACTER IN LINE
          SB3    E.SCR
          SX7    1R 
          SB4    E.SCR+160D 
          EQ     TAB2        PROCESS TABS 
 TCD      SPACE  4,15 
**        TCD - TABULATE CODED DATA LINE. 
* 
*         ENTRY  (D.LINE) = DATA LINE.
* 
*         EXIT   (C.LINE) = TABBED LINE.
* 
*         USES   A - 1, 3.
*                X - 1, 3.
*                B - 6, 7.
*                E.SCR. 
* 
*         CALLS  RTA, TAB, UPL. 
  
  
 TCD      PS                 ENTRY/EXIT 
          SA3    TABCHAR
          NG     X3,TCD      IF NO TAB CHARACTER
          SA1    D.LINE 
          SB6    D.STR
          RJ     UPL
          SB6    D.STR-1
          RJ     TAB         TABULATE 
          SB7    D.LINE 
          SB6    D.STR
          RJ     RTA         REPACK LINE
          EQ     TCD         RETURN 
 TLB      SPACE  4,10 
**        TLB - TRANSFER DATA LINE TO *E.LINE* BUFFER.
* 
*         EXIT   LINE TRANSFERRED FROM *D.LINE* TO *E.LINE*.
* 
*         USES   X - 1, 2, 6, 7.
*                A - 1, 6, 7. 
*                B - 5, 6.
  
  
 TLB      SUBR               ENTRY/EXIT 
          SB5    B0 
          SB6    D.LINE 
          MX2    -12
          SB7    E.LINE 
 TLB1     SA1    B6+B5
          LX7    X1 
          BX6    -X2*X1 
          SA7    B7+B5
          SB5    B5+B1
          NZ     X6,TLB1     IF NOT END OF LINE 
          SA6    E.CMODE     SET CURRENT MODE TO CODED
          SA6    A6+1        SET NO LINE MODIFICATIONS
          EQ     TLBX        RETURN 
 TOP      SPACE  4,15 
**        TOP - MOVE POINTER TO TOP OF FILE.
* 
*         ENTRY  AT *TOP*.
*                AT *TOP1.1* FROM *ERD*.
* 
*         EXIT   TO *ERD1* IF EOI ENCOUNTERED.
*                TO *ERD5* IF END OF FILE.
* 
*         USES   A - 1, 2, 3, 4, 6, 7.
*                X - 0, 1, 2, 3, 4, 6, 7. 
*                B - 6, 7.
* 
*         CALLS  CFF, ERD, WTF. 
* 
*         MACROS READ, RECALL, REWIND, WRITEF, WRITER, WRITEW.
  
  
 TOP      PS                 ENTRY/EXIT 
          SA2    IWHERE      LINE COUNT 
          SA3    INDEX       SUBSCRIPT OF LAST CONNAND
          SX3    X3-.TOPNUL 
          ZR     X3,TOP1     IF TOPNULL COMMAND 
          SX6    B1 
          IX2    X2-X6
          ZR     X2,TOP      IF ALREADY AT TOP, RETURN
 TOP1     SA1    NOMOD
          PL     X1,TOP2     IF THERE WERE MODS. READ REST OF FILE
  
*         ENTRY FROM *ERD*. 
  
 TOP1.1   REWIND FTA,RECALL 
          REWIND FTB,RECALL 
          EQ     ERD5        PROCESS END OF FILE
  
 TOP2     RECALL E.IN 
          RECALL E.OUT
          RJ     WTF         WRITE CURRENT LINE 
          EQ     TOP6        TRANSFER FILE
  
 TOP3     READ   E.IN        RESTART READ 
 TOP4     RECALL             WAIT FOR CIO TO DO SOMETHING 
          EQ     TOP6        TRANSFER FILE
  
 TOP5     WRITEW E.OUT,B6,B7 WRITE BUFFER 
          SX7    X0          MOVE E.IN(OUT) POINTER 
          MX6    0
          SA7    E.IN+3      UPDATE OUT 
          SA6    RC          SET DATA READ
 TOP6     SA1    E.IN+2      IN 
          SA2    A1+B1       OUT
          SX0    X1 
          IX6    X1-X2       IN-OUT (CONSECUTIVE WORDS IN BUFFER) 
          PL     X6,TOP7     IF (IN-OUT) IS LARGEST BLOCK 
          SA3    A2+B1       LIMIT
          SA4    A1-B1       FIRST
          IX6    X3-X2       LIMIT-OUT
          SX0    X4 
 TOP7     SB6    X2          SET STARTING ADDRESS 
          SB7    X6          SET WORD COUNT 
          NZ     B7,TOP5     IF WORDS TO TRANSFER 
          SA4    E.IN 
          LX4    59-0 
          PL     X4,TOP4     IF FILE BUSY 
          SA1    E.IN+2 
          SA2    A1+B1       RECHECK POINTERS 
          BX1    X1-X2
          NZ     X1,TOP6     IF CIO JUST FINISHED 
          LX4    0-3
          NG     X4,TOP8     IF EOF OR EOI
          WRITER E.OUT       FLUSH BUFFER 
          EQ     TOP9        READ FILE
  
 TOP8     LX4    3-4
          PL     X4,TOP3     IF FULL BUFFER 
          LX4    4-9
          NG     X4,ERD1     IF AT EOI
          WRITEF E.OUT       FLUSH BUFFER 
 TOP9     READ   E.IN        BEGIN READ OF NEXT SECTION OF FILE 
          RECALL E.OUT       WAIT FOR WRITE FET TO SETTLE 
          SA1    X2 
          MX7    1
          SA7    RC          SET NO DATA READ 
          BX6    X1          MOVE FILE NAME TO *CFET* 
          SA6    CFET 
          RJ     CFF         COPY REMAINDER OF FILE 
          EQ     ERD1        PROCESS EOI ENCOUNTERED
 TSL      SPACE  4,15 
**        TSL - TRIM SPACES OFF LINE (STRING BUFFER). 
* 
*         ENTRY  (A6) = FWA OF END OF LINE CHARACTER. 
*                (X6) = MASK OF 2.
* 
*         EXIT   LINE TRIMMED.
*                (E.STR-1) = NEW LINE LENGTH. 
* 
*         USES   A - 1, 6.
*                X - 1, 6.
*                B - 2. 
  
  
 TSL1     SB2    B2-B1       POSITION BACK TO NEXT CHARACTER
          LE     B2,B6,TSL2  IF AT START OF LINE -1 
          SA1    B2 
          SX1    X1-1R
          ZR     X1,TSL1     IF CHARACTER WAS A BLANK 
 TSL2     SA6    B2+B1       PUT NEW END CHARACTER
          SX6    B2-B6       GET NEW LENGTH 
          SA6    B6+         SET NEW LENGTH 
  
 TSL      PS                 ENTRY/EXIT 
          SB2    A6 
          EQ     TSL1        PROCESS TRIM 
  
 UPL      SPACE  4,30 
**        UPL - UNPACK LINE TO ASCII BUFFER.
* 
*         ENTRY  (A1) = FWA OF CODED LINE.
*                (X1) = FIRST WORD OF CODED LINE. 
*                (B6) = FWA STRING BUFFER.
* 
*         EXIT   (X6) = COUNT OF SIGNIFICANT CHARACTERS.
*                (B5) = FWA OF BUFFER (NULL LINE IF (B5) = (B6)). 
*                (B6) = ADDRESS OF END OF LINE MARKER.
*                (B7) = IF .GT. 0, THEN LWA OF BUFFER.
*                IF (B7) = (B6), THEN BUFFER IS FULL. 
*                IF (B7) = 0 AND (B2) .LT. 0, THEN 3 OR MORE TRAILING 
*                BLANKS WERE REMOVED. 
*                LINE UNPACKED WITH ASCII ESCAPE CHARACTERS INCLUDED
*                IN WORDS WHERE NEEDED. 
*                END OF LINE TERMINATOR (MASK OF 1) AFTER LAST
*                NON-BLANK CHARACTER (OR AT END OF BUFFER - (B7)).
* 
*         USES   A - 1, 2, 6. 
*                X - 0, 1, 2, 3, 4, 6, 7. 
*                B - 2, 5, 6, 7.
* 
*         NOTES  LINES ARE ASSUMED TO BE 160 CHARACTERS LONG. 
*                ASCII MODE WILL BE USED IF (UPLA) = 2B,
*                NORMAL MODE IS USED IF (UPLA) = 100B.
*                TRAILING SPACES ARE NOT CONSIDERED SIGNIFICANT.
*                TRAILING 00B CHARACTERS (COLON/64 CHARACTER SET) ARE 
*                SIGNIFICANT ONLY IF THERE IS A NON-00B CHARACTER 
*                FOLLOWING THEM IN THE CODED LINE. THIS AGREES WITH 
*                THE DEFINITION OF THE END OF LINE BYTE.
  
  
 UPL1     SX7    X7-76B      TEST FOR ASCII 
          ZR     X7,UPL6     IF ASCII 
 UPL2     SA6    B6          SAVE ASSEMBLY
          SB6    B6+B1
          GE     B6,B7,UPL8  IF SAVED LAST CHARACTER
 UPL3     LX1    6           GET NEXT CHARACTER 
          BX6    -X2*X1 
          SB2    B2-B1       DECREMENT COUNT
          BX7    X6+X0       IF ESCAPE = 76B
 UPL4     PL     B2,UPL1     IF NOT LAST CHARACTER OF WORD
          ZR     X4,UPL10    IF END OF LINE REACHED 
 UPL5     SA1    A1+B1       GET NEXT WORD
          SB2    9           RESET CHARACTER POSITION 
          BX4    -X3*X1      0, IF END OF LINE
          NZ     X7,UPL1     IF NOT PROCESSING ASCII
          EQ     UPL2        IF ON SECOND PART OF ASCII 
  
*         PROCESS ASCII CHARACTER.
  
 UPL6     LX1    6           GET NEXT CHARACTER 
          SB2    B2-B1       DECREMENT COUNT
          BX7    -X2*X1 
          LX6    6           SHIFT ESCAPE OVER
          IX6    X6+X7       FORM ASCII WORD
          MX7    0           SET ON SECOND PART OF ASCII
          PL     B2,UPL2     IF NEW WORD NOT NEEDED 
          EQ     UPL4        GET NEXT WORD
  
*         END OF BUFFER REACHED.
*         DETERMINE SIGNIFICANCE OF LAST CHARACTER. 
  
 UPL7     MX6    2
          SA6    B6          SET LAST CHARACTER 
          EQ     UPL13       FINISH UNPACK OPERATION
  
 UPL8     NZ     X6,UPL10    IF LAST CHARACTER .NE. 0 
          NZ     X4,UPL7     IF MORE FOLLOWS, LAST 0 IS COLON 
 UPL9     LX1    6           SEE IF MORE CHARACTERS FOLLOW
          BX6    -X2*X1 
          SB2    B2-1 
          NZ     X6,UPL7     IF CHARACTER FOLLOWS, 0 IS COLON 
          PL     B2,UPL9     IF MORE IN WORD, ELSE LAST IS NOT COLON
  
*         END OF LINE REACHED.  TRIM 00B AND BLANKS.
  
 UPL10    SB6    B6-B1       SKIP TRAILING ZEROS
          SA1    B6          GET LAST CHARACTER 
          LT     B6,B5,UPL12 IF PAST START OF BUFFER
          ZR     X1,UPL10    IF 00B CHARACTER 
          SB7    B0          SET POSSIBLE BLANKS TRIMMED
          SB2    B6-B1
 UPL11    SX1    X1-1R       SKIP TRAILING BLANKS 
          NZ     X1,UPL12    IF NOT BLANK 
          SB6    B6-B1
          SA1    B6 
          GE     B6,B5,UPL11 IF NOT PAST START OF BUFFER
 UPL12    SB6    B6+1        PUT MARK AFTER LAST NON-BLANK
          MX6    2
          SA6    B6 
 UPL13    SX6    B6-B5       GET CHARACTER COUNT
          NZ     B7,UPL      IF NOT CHECKING TRAILING BLANKS
          SB2    B6-B2
  
 UPL      PS                 ENTRY/EXIT 
          SA2    UPLA 
          MX3    -12         END OF LINE MASK 
          SB5    B6          MARK FIRST CHARACTER POSITION
          SX0    X2          SET MODE OF UNPACK 
          MX2    -6          CHARACTER MASK 
          BX4    -X3*X1      TEST FOR END OF LINE 
          SB2    9           SET CHARACTER POSITION 
          SB7    B6+MAXWD    SET LWA+1
          EQ     UPL3        PROCESS UNPACK 
  
 UPLA     CON    100B        SET NO ASCII (RESET IN PRESET IF NEEDED) 
 VAL      SPACE  4,15 
**        VAL - EVALUATE NUMERIC STRING.
* 
*         ENTRY  (A5) = FWA OF NUMERIC STRING.
*                (X5) = FIRST WORD OF NUMERIC STRING. 
* 
*         EXIT   (A5) = LWA+1 OF NUMERIC STRING.
*                (X5) = ((A5)). 
*                (X6) = NUMBER EVALUATED. 
*                     = -0, IF NUMBER 0 WAS SPECIFIED.
* 
*         USES   A - 5. 
*                X - 3, 4, 5, 6, 7. 
*                B - 2, 3, 4. 
* 
*         NOTES THIS ROUTINE CONVERTS AN ASTERISK (*) TO 2**30 - 1. 
* 
  
  
 VAL1     SX4    X5-1R9-1 
          SX3    X5-1R0 
          BX4    -X3*X4 
          PL     X4,VAL2     IF NOT A NUMBER
          LX4    B2,X6       *4 
          IX4    X6+X4       *5 
          SA5    A5+B1       NEXT CHARACTER 
          LX4    1           *10
          SX7    X7+B1       SET CHARACTER ENCOUNTERED FLAG 
          IX6    X4+X3
          PL     X5,VAL1     IF NOT END OF LINE 
  
 VAL2     ZR     X7,VAL3     IF NO NUMBERS ENCOUNTERED
          NZ     X6,VAL4     IF NOT JUST 0 USED 
          MX6    60          SET -0 FLAG
          EQ     VAL4        END OF NUMBERS 
  
 VAL3     SX7    X5-1R* 
          NZ     X7,VAL4     IF NOT * 
          SA5    A5+1        STEP OVER *
          MX6    -30
          BX6    -X6         SET * EQUIVALENT 
 VAL4     SB4    X5-1R
          ZR     B4,VAL5     IF BLANK 
          NE     B4,B1,VAL   IF NOT COMMA 
          NZ     B3,VAL      IF SECOND COMMA
 VAL5     SA5    A5+B1
          SB3    B3+B4       SET COMMA FLAG 
          PL     X5,VAL4     IF NOT END OF LINE 
  
 VAL      PS                 ENTRY/EXIT 
          BX6    X6-X6       CLEAR ASSEMBLY 
          SB2    B1+B1
          MX7    0           CLEAR CHARACTER ENCOUNTERED
          SB3    B0          SET NO COMMA 
          PL     X5,VAL1     IF NOT END OF LINE 
          EQ     VAL         RETURN 
 VIS      SPACE  4,10 
**        VIS - VOID INSTRUCTION STACK. 
* 
*         *VIS* SHOULD BE CALLED IMMEDIATELY AFTER ALL INSTRUCTION
*         MODIFICATIONS TO VOID THE INSTRUCTION STACK.
  
  
 VIS      SUBR               ENTRY/EXIT 
          EQ     VIS         RETURN 
 VRT      SPACE  4,10 
**        VRT - VERIFY LINE AND RETURN TO *NCM*.
* 
*         ENTRY  NONE.
* 
*         EXIT   TO *NCM*.
* 
*         CALLS  VRY. 
* 
*         NOTES  DO NOT RETURN JUMP TO THIS ROUTINE.
  
  
 VRT      RJ     VRY         VERIFY LINE
          EQ     NCM         EXIT 
 VRY      SPACE  4,15 
**        VRY - VERIFY XEDIT OPERATIONS.
* 
*         ENTRY  NONE.
* 
*         EXIT   CURRENT LINE WRITTEN OF *VERIFY* TRUE. 
*                THE LINE IS PACKED IF NEEDED AND HOUSEKEEPING DONE.
* 
*         USES   A - 1, 4, 6. 
*                X - 1, 4, 6. 
*                B - 6, 7.
* 
*         CALLS  RTA. 
* 
*         MACROS WRITEC.
  
 VRY1     WRITEC OUTPUT,E.LINE
  
 VRY      PS                 ENTRY/EXIT 
          SA4    VERIFY 
          PL     X4,VRY      IF NOT IN *VERIFY* MODE
          SA1    E.LMOD 
          ZR     X1,VRY1     IF NO MODIFICATIONS OR PACKED
          SA1    A1-1 
          ZR     X1,VRY1     IF CODED FORMAT
          SB6    E.STR       RE-PACK LINE 
          SB7    E.LINE 
          MX6    0           SET LMOD TO NO LINE MOD
          SA6    A1+B1       E.LMOD 
          RJ     RTOA 
          EQ     VRY1        WRITE LINE 
 WTF      SPACE  4,15 
**        WTF - WRITE EDIT LINE.
* 
*         ENTRY  (IWHERE) = IF CREATION MODE, .LE. ZERO.
*                           ELSE, LINE COUNT. 
* 
*         EXIT   (IWHERE) = IF CREATION MODE, 1.
*                           IF UPDATING, (IWHERE) + 1.
* 
*         USES   A - 1, 2, 3, 6, 7. 
*                X - 1, 2, 3, 6, 7. 
*                B - 6, 7.
* 
*         CALLS  RTOA, VIS. 
* 
*         MACROS WRITEC 
  
  
 WTF2     WRITEC E.OUT,E.LINE 
 WTF3     SA3    IWHERE      BUMP IWHERE
          SX7    B1 
          IX7    X3+X7
          SA7    A3 
  
 WTF      PS                 ENTRY/EXIT 
          SA1    UPDATE 
          PL     X1,WTF3     IF NOT UPDATING FILE.
  
*         WORD IS REPLACED AFTER FIRST ENTRY. 
  
 WTFA     SA1    WTFB 
          EQ     WTF1        PRESET CODE
  
*         NORMAL CODE FOLLOWS.
  
 WTF      RMT 
          SA1    E.LMOD 
          ZR     X1,WTF2     IF NO MODIFICATION 
          RMT 
  
          SA1    A1-B1
          ZR     X1,WTF2     IF IN CODED MODE 
          SB6    E.STR
          SB7    E.LINE 
          RJ     RTOA        RE-PACK LINE 
          MX6    0
          SA6    E.LMOD      SET NO MODIFICATIONS 
          EQ     WTF2        WRITE LINE 
  
*         PRESET CODE.
  
 WTF1     SA2    IWHERE 
          BX6    X1 
          SX7    B1 
          SA6    WTFA        REPLACE PRESET JUMP
          RJ     VIS         VOID INSTRUCTION STACK 
          PL     X2,WTF+1    IF NOT CREATION MODE 
          SA7    A2          SET IWHERE = 1 
          MX6    0
          SA7    NOMOD       SET MODIFICATIONS MADE 
          SA6    RC          SET DATA READ
          EQ     WTF         RETURN (NO LINE TO WRITE OUT)
  
 WTFB     BSS    0
 WTF      HEREL 
          TITLE  SPECIAL PURPOSE SUBROUTINES. 
 LCB      SPACE  4,25 
**        LCB - LOAD CIRCULAR BUFFER. 
* 
*         ENTRY  (A2) = ADDRESS OF OUT. 
*                (A3) = ADDRESS OF FIRST. 
*                (A4) = RETURN ADDRESS. 
*                (B4) = OUT.
* 
*         EXIT   TO RETURN ADDRESS -1 IF CONTINUATION READ. 
*                TO RETURN ADDRESS IF EOR/EOF.
*                (X1) = LAST WORD ADDRESS OF WORKING BUFFER.
*                     = -1 IF EOF.
*                     = -2 IF EOI.
* 
*         MACROS READ, RECALL.
* 
*         NOTES  ROUTINE IS COPIED FROM COMCRDW.
*                REQUEST READ IF BUFFER IS EMPTY, NOT BUSY AND NOT
*                EOR/EOF. IF BUFFER IS BUSY, RECALL AND RETURN. 
*                MODIFIED TO RETURN EOI STATUS IF FET UNDER 
*                INVESTIGATION HAS A ZERO FILENAME. (ASSUMES OPTIONS
*                SUCH AS I=0 USED). 
  
  
 LCB=     SA1    A3-B1       CHECK BUFFER STATUS
          SX6    B4          STORE OUT
          LX1    59-0 
          SA6    A2 
          NG     X1,LCB2     IF BUFFER NOT BUSY 
          SX6    -2          PREPARE EOI STATUS 
          ZR     X1,LCB8     IF NO FILE NAME (EG. L=0 USED) 
          RECALL
 LCB1     SB2    A4-B1       CONTINUE READ
          JP     B2          RETURN 
  
 LCB2     SA1    A2-B1       RE-READ IN 
          SB3    X1 
          NE     B3,B4,LCB1  IF BUFFER NOT EMPTY
          SA1    A3-B1       CHECK BUFFER STATUS
          LX1    59-4 
          NG     X1,LCB3     IF EOR/EOF/EOI 
          READ   A3-B1       XEDIT ONLY USES READ FUNCTION
          SB2    A4-B1
          JP     B2          RETURN 
  
 LCB3     LX6    B1,X1
          SA1    A3          SET IN = OUT = FIRST 
          SX7    X1 
          SA7    A1+B1
          SX1    -B1         SET EOF RESPONCE 
          SB2    A4          SET RETURN ADDRESS 
          NG     X6,LCB4     IF EOF 
          MX2    -4 
          SX1    B6 
          LX6    -14+4
          BX2    -X2*X6 
          SB3    X2+
          EQ     B3,B1,LCB6  IF LEVEL 1 
  
 LCB4     SX2    A3-B1       RESET (X2) 
          SA7    A7+B1
          NG     X1,LCB7     IF EOF/EOI 
 LCB5     JP     B2          RETURN 
  
 LCB6     SA7    A7+B1       STORE OUT
          READ   A3-B1,R     RESTART TELETYPE READ
          SB2    A4-B1
          JP     B2          RETURN 
  
 LCB7     LX6    3-9
          PL     X6,LCB5     IF NOT EOI 
          LX1    1           SET -2 RESPONSE
          JP     B2          RETURN 
  
 LCB8     SB2    A4 
          BX1    X6          MOVE EOI STATUS
          JP     B2          RETURN 
  
 RDX      SPACE  4,20 
**        RDX - READ EXIT.
* 
*         ENTRY  (A2) = ADDRESS OF OUT. 
*                (A3) = ADDRESS OF FIRST. 
*                (A4) = RETURN ADDRESS. 
*                (X3) = FIRST.
*                (B3) = IN. 
*                (B4) = OUT.
*                (B5) = LIMIT.
* 
*         EXIT   TO RETURN ADDRESS. 
* 
*         MACROS READ.
* 
*         NOTES  ROUTINE COPIED FROM COMCRDW. 
*                EXIT FROM READ SUBROUTINE TO CALLER. 
*                IF CIRCULAR BUFFER IS BUSY, OR EOR/EOF IS SENSED, NO 
*                ACTION IS TAKEN. OTHERWISE, THE WORD COUNT REMAINING 
*                IN THE BUFFER IS CHECKED AND A READ FUNCTION ISSUED. 
*                IF NECESSARY.
  
  
 RDX=     SA1    A3-B1       CHECK BUFFER STATUS
          SX6    B4 
          LX1    59 
          SA6    A2          STORE OUT
          SX2    A3-B1       RESET (X2) 
          PL     X1,RDX1     IF BUFFER BUSY 
          LX1    -4 
          NG     X1,RDX1     IF EOR/EOF/EOI SET 
          SA1    A2-B1       REREAD IN
          SB3    X1 
  
*         IF BUFFER IS NOT BUSY, CHECK SIZE AND ISSUE READ. 
  
          SX6    B3-B4       (IN-OUT) 
          SB2    X3          (LIMIT-FIRST)
          LX3    X6,B1       2*(IN-OUT) 
          SX7    B5-B2
          AX6    60          SIGN OF (IN-OUT) 
          BX4    X6-X7       INVERT BUFFER IF OUT >= IN 
          IX6    X4-X3       BUFFER SIZE - 2*(IN-OUT) 
          AX7    9
          NG     X6,RDX1     IF BUFFER THRESHOLD NOT REACHED
          ZR     X7,RDX1     IF BUFFER NOT BIG ENOUGH TO READ AHEAD 
          READ   X2          READ FILE
  
 RDX1     SX1    B0          RESPONSE =0
          SB2    A4 
          JP     B2          RETURN 
          SPACE  4
*         COMMON DECKS NEEDED GLOBALLY. 
  
*CALL     COMCCDD 
*CALL     COMCCFD 
*CALL     COMCCIO 
*CALL     COMCCPM 
*CALL     COMCCUA 
*CALL     COMCEDT 
*CALL     COMCLFM 
*CALL     COMCOVL 
*CALL     COMCPFM 
*CALL     COMCRDC 
*CALL     COMCSYS 
*CALL     COMCWTC 
*CALL     COMCWTO 
*CALL     COMCWTW 
*CALL     COMCZTB 
          SPACE  4
          IF     -DEF,ACCTE,3 
          TITLE  PRESET AND BUFFER ALLOCATION.
 QUAL$    BSS    0           COMMON DECK QUAL DONE BY XEDIT 
          QUAL   PRESET 
  
  
**        NOTE-  PRESET RESIDES IN TWO LOCATIONS. THE MAJOR AREA
*         RESIDES IN THE OUTGOING EDIT FILE BUFFER. THE OTHER 
*         SECTION DEALS ONLY WITH THE LAST MINUTE DETAILS WHICH 
*         COULD BE WIPED OUT BY USING THE EDIT FILES. THIS CODE 
*         RESIDES IN THE D.STR ARRAY. 
 PRF      SPACE  4,20 
**        PRF - PRESET EDIT FILE. 
* 
*         ENTRY  AT *PRF*, IF FILE IS LOCAL.
*                AT *PRF3*, IF *C* PARAMETER USED.
*                AT *PRF4*, IF *P* PARAMETER USED.
*                (D.STR) = EDIT FILE NAME.
* 
*         EXIT   TO *NCM* TO PROCESS COMMANDS.
*                TO *ABT* IF FATAL ERROR. 
* 
*         USES   A - 1, 2, 3, 4, 5, 6, 7. 
*                X - 1, 2, 3, 4, 5, 6, 7. 
*                B - 3, 6, 7. 
* 
*         CALLS  GFN, RDF, RDL, RTA, SFN, STF STK, UPL. 
* 
*         MACROS ATTACH, DISTC, GET, READ, RECALL, RENAME,
*                REWIND, STATUS, WRITEC.
  
  
          ORG    D.STR       FILE PRESET
 PRF      EQ     PRF8        PROCESS LOCAL FILE 
  
*         BAD FILE READ.
  
 PRF1     REWIND E.IN,RECALL
          READ   X2,RECALL
          READ   X2,RECALL
          SA1    X2 
          LX1    59-9        POSITION EOI BIT 
          SX4    PRFB        * FILE NOT XEDIT-ABLE. 
          PL     X1,PRF6     IF ABOVE 
          SA1    E.IN+2      CHECK IN POINTER 
          SX1    X1-BUFB
          NZ     X1,PRF6     IF DATA ON FILE
 PRF2     BSS    0
          IF     DEF,CYBRNET,2
          WRITEC OUTPUT,PRFC * EMPTY FILE/CREATION MODE ASSUMED 
          SKIP   2
          SX4    PRFC        * EMPTY OR FILE NOT FOUND. 
          EQ     PRF6        CREATE FILE
  
*         ENTER IF *C* PARAMETER SPECIFIED (CREATION MODE). 
  
 PRF3     SA1    UPDATE 
          SB6    PRFE        * UPDATE/CREATION MODE CONFLICT.*
          PL     X1,ABT      IF ABOVE 
          REWIND E.IN,RECALL
          REWIND E.OUT,RECALL REWIND SCRATCH FILES
          SA1    PRFA        PUT NAME INTO FET
          SX7    1031B       NOT BUSY, EOI ENCOUNTERED
          SX6    -B1
          BX7    X7+X1
          SA6    IWHERE      SET CREATION MODE FLAG 
          SA7    E.IN 
          SA6    RC          SET NO DATA READ 
          SA6    FS          SET NOT READING OFF EDIT FILE
          EQ     PRF10       COMPLETE INITIALIZATION
  
*         ENTER IF *P* PARAMETER SPECIFIED. 
  
 PRF4     SA1    PRFA        OLSCRB 
          SA2    IFN
          MX7    59 
          BX7    -X7+X1      SET *NOT BUSY* 
          SA7    FS          SET READING OFF SCRATCH FILE 
          LX6    X2 
          SA7    FT 
          SA6    FT+8 
          GET    FT 
          SA3    X2 
          SX1    36000B      LOAD MASK
          BX6    X1*X3
          ZR     X6,PRF5     IF FILE GOTTEN 
          SA1    UPDATE 
          PL     X1,PRF4.1   IF IN LOOK MODE
          ATTACH X2,,,,W
          EQ     PRF4.2      CHECK FOR ERROR
  
 PRF4.1   ATTACH X2,,,,R
 PRF4.2   SA3    X2 
          SX1    36000B 
          BX6    X1*X3
          SX4    ERR         SET ERROR MESSAGE TO PFM 
          NZ     X6,PRF6     IF ABOVE 
          MX7    1           SET *ATTACH* BIT 
          LX7    57-59
          SA7    SPCP 
          SA1    FT+8 
          MX6    42          RENAME FOR D.A. EXIT PROBLEMS
          SX7    B0 
          BX1    X6*X1
          SA7    FS          SET READING OFF PRIMARY FILE 
          RENAME FT,X1
 PRF5     SA1    FT          GET NAME 
          MX6    42 
          SX7    B1 
          BX2    X6*X1       CLEAR LOWER BITS 
          IX7    X2+X7       SET COMPLETE 
          RECALL E.IN 
          SA7    E.IN        PUT NEW FILENAM INTO FET 
          SA1    SPCP        SET *P* AS SPECIFIED PARAMETER 
          MX7    1
          LX7    58-59
          BX7    X1+X7
          SA7    A1 
          EQ     PRF9        SET UP FILE FOR EDITING
  
*         PROCESS EDITFIL ERROR.
*         (X4) = ADDRESS OF ERROR MESSAGE.
  
 PRF6     WRITEC OUTPUT,X4   ISSUE MESSAGE
          SA1    PRFF 
          SX6    X1-1        DECREMENT RETRY COUNT
          SA6    A1+
          ZR     X1,PRF13    IF EXCEEDED RETRY LIMIT
  
 PRF7     WRITEC OUTPUT,PRFH * NAME EDIT FILE 
          RJ     RDL         READ A LINE (NOTE- PRELIX + INITIALLY SET) 
          NZ     X1,PRF7     IF HIT A CARRIAGE RETURN 
          SA1    D.LINE 
          SB6    E.STR       *E.STR* USED AS SCRATCH
          RJ     UPL
          SA5    E.STR
          RJ     GFN         GET SPECIFIED EDITFIL NAME 
          SX4    =C* RESERVED FILE NAME.* 
          SB6    B6-303B
          ZR     B6,PRF7.1   IF RESERVED FILE NAME
          SX4    PRFL 
          NZ     B4,PRF7.1   IF SPECIAL CHARACTERS
          SX4    PRFM 
 PRF7.1   NZ     X1,PRF6     IF FILE NAME ERROR 
          SA6    IFN
          NG     X5,PRF8     IF END OF LINE 
          MX3    -6          EXTRACT LOWER CASE PART OF CHARACTER 
          BX5    -X3*X5 
          SX4    X5-1RC 
          ZR     X4,PRF3     IF *C* USED
          SX4    X5-1RP 
          ZR     X4,PRF4     IF *P* USED
  
*         NO PARAMETER USED 
  
 PRF8     SA1    IFN         PUT EDIT NAME INTO FET 
          MX7    59D
          BX7    -X7+X1      SET FET *NOT BUSY* 
          RECALL E.IN 
          MX6    0
          SA7    E.IN        SET NAME INTO FET
          SA6    FS          SET READING OFF EDIT FILE
          RJ     STF         SET TERMINAL FILE
          NZ     X6,PRF9     IF EDITFIL NOT TYPE *TT* 
          SA1    E.IN 
          MX6    42 
          BX1    X6*X1
          RJ     SFN         SPACE FILE NAME
          SX4    =C* FILENAM  CANNOT BE ASSIGNED TO THE TERMINAL.*
          LX6    -6 
          SA6    X4          INSERT FILE NAME INTO MESSAGE
          EQ     PRF6        PROCESS EDITFIL ERROR
  
 PRF9     REWIND E.IN,RECALL REWIND BOTH SCRATCH FILES
          REWIND E.OUT,RECALL 
          BX7    X7-X7
          SA7    E.IN+5      INITIALIZE STATUS RESPONCE CELLS 
          SA7    A7+B1
          STATUS E.IN,P 
          SA1    E.IN+5      GET FNT ENTRY OF EDITFIL 
          ZR     X1,PRF2     IF FILE NOT THERE
          BX6    X1 
          LX1    59-14D      EXECUTE ONLY FLAG
          SX4    PRFJ        * CANNOT EDIT EXECUTE ONLY FILES 
          NG     X1,PRF6     IF ABOVE 
          READ   E.IN 
          MX6    1
          SA6    RC          SET DAT READ 
          RJ     RDF         READ INITIAL LINE
 PRF10    SA1    IFN         MOVE FILE NAME 
          BX7    X1 
          SA7    IRFN 
          SA7    ISFN 
          SA7    INITZ       SET INITIALIZATION COMPLETE
 PRF10.1  SA1    JOPR 
*         EQ     PRF11       (DB PARAMETER SPECIFIED) 
          MX2    -12
          LX1    0-24 
          BX1    -X2*X1      ISOLATE ORIGIN TYPE
          SX1    X1-TXOT
          NZ     X1,PRF11    IF NOT TELEX ORIGIN
          DISTC  ON,TLX 
  
*         PROCESS *FR* PARAMETER. 
  
 PRF11    SA1    PRFG 
          ZR     X1,NCM      IF *FR* NOT USED 
          SA1    E.LINE 
          SB6    E.STR
          RJ     UPL
          SA1    E.STR-1
          SB6    A1+1 
  
*         LOCATE FIRST CHARACTER AFTER 2 CONSECUTIVE BLANKS.
  
 PRF12    SA1    A1+B1
          SB3    A1-B6
          NG     X1,NCM      IF END OF LINE REACHED, EXIT 
          SX2    X1-1R
          ZR     X2,PRF12    IF CHARACTER WAS A BLANK 
          SB6    A1+B1
          LE     B3,B1,PRF12 IF NOT AT LEAST 2 CONSECUTIVE BLANKS 
          SB6    B6-B1       SET TO FIRST CHARACTER 
          SB7    P.LINE 
          RJ     RTA         PACK COMMAND LINE
          SA1    P.DEV       SET COMMAND TO PREVIOUS COMMAND
          RJ     STK         STACK DEVICES AND EXIT TO NCM
 .J       IFEQ   DEBUG,1     IF DEBUG ON
          WRITEC OUTPUT,PRFK
 .J       ENDIF 
          EQ     NCM         EXIT, PROCESS COMMANDS 
  
*         BATCH MODE - RETRY COUNT ABORT. 
  
 PRF13    SB6    PRFI        * BATCH MODE - RETRY COUNT EXCEEDED. 
          EQ     ABT         ABORT XEDIT
  
 PRFA     DATA   0LSCRB 
 PRFB     DATA   C* FILE NOT XEDIT-ABLE.* 
          IF     DEF,CYBRNET,2
 PRFC     DATA   C* EMPTY FILE/ CREATION MODE ASSUMED.* 
          SKIP   1
 PRFC     DATA   C* EMPTY OR FILE NOT FOUND.* 
 PRFE     DATA   C* LOOK/CREATION MODE CONFLICT.* 
 PRFF     CON    -1          RETRY COUNT. STOP WHEN 0 (SET IN PRESET) 
 PRFG     DATA   0           .NE. 0 IF *FR* USED
 PRFH     DATA   10HNAME EDIT 
          VFD    24/4HFILE,12/0001B,24/ 
 PRFI     DATA   C* BATCH ABORT - RETRY COUNT EXCEEDED.*
 PRFJ     DATA   C* CANNOT EDIT EXECUTE ONLY FILES.*
 PRFK     DATA   C+ *FR* COMMAND STACKING ERROR.+ 
 PRFL     DATA   C* INCORRECT CHARACTERS IN FILE NAME.* 
 PRFM     DATA   C* TOO MANY CHARACTERS IN FILE NAME.*
  
          ERRPL  *-D.STR-D.STRL-1 IF PRF OVERFLOWS SCRATCH ARRAY
          ORG    *           RESET ORIGIN 
          QUAL   *
          SPACE  4
*         XEDIT BUFFERS.
  
          USE    BUFFERS     FLUSH LITERALS 
  
 BUFA     EQU    *           OUTGOING EDIT FILE 
 BUFB     EQU    BUFA+BUFAL  INCOMING EDIT FILE 
 BUFI     EQU    BUFB+BUFBL  PRIMARY INPUT FILE 
 BUFO     EQU    BUFI+BUFIL  OUTPUT FILE
 MINFL    EQU    BUFO+BUFOL+1 MINIMUM FL FOR XEDIT
 BUFC     EQU    MINFL       ALTERNATE INPUT FILE 
 BUFD     EQU    BUFC+BUFCL  COPY/READ FILE 
 MAXFL    EQU    BUFD+BUFDL  MAX FL FOR MAIN PROGRAM
 RFL=     EQU    MINFL+1     INITIAL FIELD LENGTH 
 FWAOVL   EQU    MAXFL+2     MINIMUM OVERLAY FIELD LENGTH 
 PRS      SPACE  4,15 
**        PRS - PRESET XEDIT AND BEGIN EXECUTION. 
* 
*         ENTRY  NONE.
* 
*         EXIT   TO *PRF*.
* 
*         USES   A - ALL. 
*                X - ALL. 
*                B - 1, 2, 3, 4, 5, 6.
* 
*         CALLS  ARG, ICH, UPL, VIS.
* 
*         MACROS ABORT, CSET, GETFNT, GETJA, MEMORY, MESSAGE, 
*                MOVE, OPEN, TSTATUS, WRITE, WRITEC.
  
  
 XEDIT    SB1    1           ENTRY
          QUAL   PRESET 
          IF     DEF,TIMING,1 
          GETJA  TIMING 
          MEMORY CM,,RECALL,RFL=
          SA1    PRSS        GET TOOLNAME FOR *FNL* CALL
          RJ     INT         STORE INITIAL *CUA* VARIABLES
  
          BX6    X6-X6       CLEAR BUFFER CONTROL WORD
          SA6    PRSI 
          SA1    B1+B1
          MX0    42 
          BX2    X0*X1
          NZ     X2,PRS2     IF FILE NAME PRESENT 
 PRS1     GETFNT PRSA 
          SA1    PRSI+1      GET FILE NAME
          BX2    X0*X1
          NZ     X2,PRS2     IF FILE FOUND
          SA3    PRSI 
          NG     X3,PRS1     IF FILE NOT FOUND
          SA2    PRSB        =0LTAPE1 
 PRS2     SX7    B1 
          SA3    ACTR 
          BX7    X2 
          SB4    X3-1        SET NUMBER OF PARAMETERS 
          SA7    IFN         PUT INCOMING NAME
          LE     B4,PRS4     IF 1 PARAMETER OR LESS 
          SA4    3
          SB5    PRSC 
          RJ     ARG         PROCESS ARGUMENT TABLE 
          RJ     VIS         VOID INSTRUCTION STACK 
          ZR     X1,PRS4     IF NO ERRORS 
          SA0    PRSD        C* ERROR IN XEDIT ARGUMENTS.*
  
*         PRESET ERROR ROUTINE - (A0) = ADDRESS OF MESSAGE. 
  
 PRS3     RJ     FNL         ISSUE ACCOUNTING MESSAGE 
          MESSAGE  A0        ISSUE MESSAGE TO DAYFILE 
  
          ABORT 
  
*         IF *NH* PARAMETER, (PRS4) = EQ     PRS5.
* 
 PRS4     WRITEC OUTPUT,PRSN XEDIT HEADER MESSAGE 
  
*         CHECK FOR FILE NAME CONFLICTS 
  
 PRS5     SA0    PRSF        * FILE NAME CONFLICT.* 
          SB2    FFET-7 
          SB3    LFET-7 
 PRS6     SB2    B2+7        STEP TO NEXT OUTSIDE FET ADDRESS 
          GE     B2,B3,PRS8  IF LOOPED THROUGH ALL FILES
          SA1    B2+
          SB4    B2+7 
 PRS7     SA2    B4          GET INNER LOOP FET NAME
          BX3    X1-X2
          SB4    B4+7 
          ZR     X2,PRS7.1   IF NO FILE THERE (L=0) 
          ZR     X3,PRS3     IF FILE NAMES COMPARE (ERROR)
 PRS7.1   LE     B4,B3,PRS7  IF NOT FINISHED WITH INNER LOOP FET
          EQ     PRS6        CHECK NEXT FILE NAME FROM FET-S
  
*         PRESET INPUT AND OUTPUT FETS. 
  
 PRS8     SA1    OUTPUT      SET UP RA+2 WITH FILE TO BE FLUSHED
          MX2    42 
          SX6    A1 
          BX2    X1*X2
          BX6    X2+X6
          MX7    0
          SA6    B1+B1
          SA7    A6+B1
          OPEN   INPUT,READNR,RECALL
          SA1    OUTPUT 
          ZR     X1,PRS9     IF NO NAME PRESENT 
          OPEN   OUTPUT,ALTERNR,RECALL
          WRITE  OUTPUT,*    HANDLE OPEN BUG
  
*         DETERMINE ASCII/CHARACTER SET/ORIGIN CODES. 
  
 PRS9     GETJO  PRSR 
          SA2    BATCH
          SA1    PRSR 
          SX6    X1-TXOT
          BX6    X6+X2       0, IF *TXOT*, ELSE BATCH 
          SA6    A2 
          SA1    CSMR        CHARACTER SET MODE 
          SB2    18D         64 CHARACTER SET OFFSET
          NG     X1,PRS10    IF 64 CHARACTER SET
          SB2    B0          63 CHARACTER SET OFFSET
 PRS10    SA5    AS 
          ZR     X6,PRS11    IF TXOT AND *B* PARAMETER NOT USED 
          BX6    X6-X6       SET NO ASCII 
          ZR     X5,PRS14    IF NO ASCII DESIRED
          MX6    1           SET ASCII FLAG FOR *PRS14* 
          SB2    36D         SET 64/ASCII 
          EQ     PRS14       PRESET CHARACTERS
  
 PRS11    TSTATUS  TSTATUS
          SA1    TSTATUS
          MX3    -6 
          AX1    3*6
 PRS11.1  BX6    -X3*X1      DETERMINE IF TERM TYPE HAS A *D* 
          LX1    -6 
          ZR     X6,PRS11.1  IF NOT CHARACTER 
+         SX4    X6-1RD 
          NZ     X4,PRS12    IF NOT ...D TERMINAL TYPE
          SB2    B0          SET OLD CHARACTER SET
          SA6    A5          TURN ON ASCII FLAG (NON ZERO)
          EQ     PRS14       PRESET CHARACTERS
  
 PRS12    SA1    A1+B1
          SX2    4
          BX6    X2*X1
          NZ     X6,PRS13    IF ASCII FLAG SET
          ZR     X5,PRS14    IF ASCII NOT REQUIRED
          CSET   ASCII
          SX6    3RASC       SET SPECIAL ASCII FLAG 
  
 PRS13    SA6    A5          SET ASCII FLAG 
          SB2    36          SET 64/ASCII 
  
*         PRESET CHARACTERS DEPENDENT ON CHARACTER SET. 
  
 PRS14    SX7    B1+B1
          SA1    CHARSET
          ZR     X6,PRS14.1  IF ASCII NOT ON
          SA7    UPLA        SET UNPACKS TO ASCII MODE
 PRS14.1  SX6    B2          SAVE SHIFT VALUE 
          MX7    0
          SA6    CHARSFT
          SA7    CCDR+8      PLACE END OF LINE
          RJ     ICH         INITIALIZE CHARACTERS
  
*         MOVE COMMAND IMAGE TO *C.STR* AND ANALYZE.
  
          SA1    CCDR 
          SB6    C.STR       SET STRING DESTINATION 
          RJ     UPL
          MOVE   9,CCDR,I.LINE  MOVE COMMAND IMAGE
          SA1    C.STR-1
          MX7    1
          SB2    B1          SET CHARACTER POINTER
          SA7    C.STR       SET DEFAULT END OF LINE
          SA7    C.STR+80    ALLOW ONLY 80 CHAR ON COMMAND
  
 PRS15    SB2    B2+B1       INCREMENT POINTER
          SA2    A1+B2
          NG     X2,PRS20    IF END OF LINE 
          SX3    X2-1R. 
          ZR     X3,PRS16    IF . 
          SX3    X2-1R) 
          NZ     X3,PRS15    IF NOT ) 
 PRS16    SA2    A2+B1       GET DELIMITER CHARACTER
          SB2    B2+2        SET POINTER TO CHARACTER AFTER DELIMITER 
          BX4    X2 
          NG     X2,PRS20    IF END OF LINE 
          SX3    X2-1R
          ZR     X3,PRS20    IF BLANK (ASSUME IGNORE REST OF COMMAND) 
          SX6    B1 
          AX4    6
 .CYB     IF     DEF,CYBRNET
 +        SX7    1R^         UP ARROW INVALID DELIMITER CHARACTER 
          ZR     X4,PRS16.1  IF CHARACTER NOT ASCII 
          SX7    7402B       SET FOR ASCII UP ARROW 
          SX6    7601B       SET LOWER CASE A 
 .CYB     ELSE
          ZR     X4,PRS16.1  IF CHARACTER IS NOT ASCII
          SX6    7601B       SET LOWER CASE A 
 .CYB     ENDIF 
 PRS16.1  IX3    X2-X6       NEGATIVE IF NOT ALPHABETIC 
          SX6    X6+26D 
          IX4    X2-X6       POSITIVE IF NOT ALPHABETIC 
          BX3    -X3*X4      NEGATIVE IF DELIMITER IS ALPHABETIC
 .CYB     IF     DEF,CYBRNET
          NG     X3,PRS17    IF DELIMITER IS ALPHA USE ;
          IX6    X7-X2       UP ARROW CHECK 
          ZR     X6,PRS17    IF YES THEN USE ;
          SX7    X2-1R/-1    POSITIVE IF DELIMITER ABOVE /
          SX6    X2-1R0      NEGATIVE IF BELOW 0
          BX6    X7-X6       POSITIVE IFF BOTH SIGNS SAME 
          PL     X6,PRS18    IF NOT +,-,*, OR / USE DELIMITER 
 PRS17    SX2    1R;         USE SEMI-COLON 
          SB2    B2-1        MOVE POINTER BACK
 PRS18    PX6    B2,X2       FORM C.STR WORD
 .CYB     ELSE
          NG     X3,PRS19    IF INCORRECT DELIMITER CHARACTER 
          PX6    B2,X2       FORM C.STR WORD
 .CYB     ENDIF 
          SA6    A1          PUT C.STR-1
          MX2    -18
          ECHO   4,P=(I.DEV,S.DEV)
          SA1    P+1         SET DELIMITERS IN OTHER DEVICES
          BX1    X2*X1
          IX7    X1+X6
          SA7    A1 
          EQ     PRS20       CHECK INPUT AND OUTPUT FILES 
  
*         INCORRECT DELIMITER CHARACTER.
  
 PRS19    SA1    BATCH
          SA0    PRSG        * INCORRECT DELIMITER CHARACTER.*
          NZ     X1,PRS3     IF BATCH MODE
          WRITEC OUTPUT,A0   ISSUE MESSAGE TO TERMINAL
 PRS20    SA1    INPUT+1     CHECK INPUT/OUTPUT = *TT*
          SA2    OUTPUT+1 
          MX6    1
          BX1    -X6*X1 
          BX2    -X6*X2 
          AX1    48 
          AX2    48 
          SX7    X1-2RTT
          SX2    X2-2RTT
          IX2    X2+X7
          MX6    0
          ZR     X2,PRS21    IF BOTH ARE *TT* 
          SA6    PROMPT      CLEAR ISSUING OF SPECIAL PROMPT
          SA7    TTYIN       SET STATUS OF INPUT FET
          MOVE   2,PRSM,PRFH CHANGE *NAME EDIT FILE* MESSAGE
          SX7    B1          IF EITHER NOT *TT*, ALLOW ONE RETRY
          SA7    PRFF 
 PRS21    SA1    BATCH
          ZR     X1,PRS22    IF TELEX ORIGIN
          MOVE   PRSHL,PRSH,MESSAGE+1  MOVE BATCH ERROR MESSAGES
          MOVE   2,PRSO,ETLA CHANGE BATCH ECHO STATUS 
          MOVE   1,PRSP,MODA CHANGE BATCH MODIFY SHIFT
 PRS22    EQ     PRF         PRESET FILE
  
 PRSA     VFD    38/0LDUMMY,1/1,3/,18/1  DUMMY GETFNT FET 
          VFD    36/,6/10B,18/PRSI
          BSS    6
          VFD    12/1+2*1+1,6/,18/1S"PTFT",2/,1/1,1/,1/,1/,18/PRSI
          BSS    4
 PRSB     DATA   0LTAPE1
 PRSC     BSS    0           ARGUMENT TABLE 
 AS       ARG    -ACTR,AS 
 B        ARG    -PRSR,BATCH
 C        ARG    -PRSJ,PRF
 DB       ARG    -PRSL,PRF10.1
 FR       ARG    -ACTR,PRFG 
 I        ARG    INPUT,INPUT
 L        ARG    OUTPUT,OUTPUT
 LK       ARG    -PRSZ,UPDATE 
 NH       ARG    -PRSQ,PRS4 
 P        ARG    -PRSK,PRF
          ARG 
 PRSD     DATA   C* ERROR IN XEDIT ARGUMENTS.*
 PRSF     DATA   C* FILE NAME CONFLICT.*
 PRSG     DATA   C* INCORRECT DELIMITER CHARACTER.* 
 PRSH     BSS    0           BATCH ERROR MESSAGE TABLE
 ERRPRS   HERE
 PRSHL    EQU    *-PRSH 
 PRSI     BSS    1+2*1+1
 PRSJ     EQ     PRF3        *C* PARAMETER
 PRSK     EQ     PRF4        *P* PARAMETER
 PRSL     EQ     PRF11       *DB* PARAMETER 
 PRSM     DATA   C* NAME EDIT FILE* 
 PRSN     DATA   C* "VERSION"*
 PRSO     BSS    0
 ETL      HEREL              ECHO HEADER WORDS
 PRSP     BSS    0
 MOD      HEREL              ECHO MODIFY WORD 
 PRSQ     EQ     PRS5        *NH* PARAMETER 
 PRSR     DATA   100B        PSEUDO BATCH 
 PRSZ     DATA   0           SET LOOK MODE
 PRSS     VFD    60/PRST     ADDRESS OF TOOLNAME
 PRST     VFD    60/0HXEDIT  TOOLNAME FOR *CUA* MESSAGE 
  
          USE    SETCHAR
          DATA   0           SET END MARKER 
          USE    *
          SPACE  4
*         COMMON DECKS NEEDED IN PRESET.
  
*CALL     COMCARG 
*CALL     COMCDXB 
*CALL     COMCMVE 
          QUAL   *
*CALL     COMCSFN 
*CALL     COMCSTF 
          SPACE  4
 .MH2     EQU    MH2
          OVLDEF   1,(USER INFORMATION ROUTINES)
          SPACE  4
**        DEFINE ALTERNATE CHARACTER REPLACEMENTS.
*T        24/AS,  18/64 C,  18/63 C 
* 
*         AS   = ASCII 6/12 CHARACTER SET.
*         64 C = 64 CHARACTER SET.
*         63 C = 63 CHARACTER SET.
  
 AM.      VFD    24/67B,18/67B,18/67B      AMPERSAND
 FN.      VFD    24/2RTH,18/2RTH,18/2RTH   END OF HELP FILE NAME
 QM.      VFD    24/71B,18/71B,18/71B      QUESTION MARK
 SH.      VFD    24/60B,18/60B,18/60B      SHARP
 UA.      VFD    24/7402B,18/76B,18/76B    UP ARROW 
          SPACE  4
 MH2      SET    .MH2 
          TITLE  MACROS LOCAL TO OVERLAY. 
 ENDHELP  SPACE  4,10 
**        ENDHELP - CLOSE EXPLAIN ENTRY.
* 
* 
*         ENDHELP 
* 
*         ENTRY  (A) = A MICRO CONTAINING THE NAME OF THE 
*                      EXPLAIN ENTRY. 
* 
*         EXIT   A SYMBOL IS EQUATED TO THE LENGTH OF THE MESSAGE.
* 
*         NOTES  THIS MACRO IS TO BE USED END AN EXPLAIN ENTRY. 
  
          PURGMAC ENDHELP 
  
 ENDHELP  MACRO 
 "A"_L EQU *-"A"_A
          ENDM   ENDHELP
 EXPP     SPACE  4,15 
**        EXPP - DEFINE PRIMARY EXPLAIN ENTRY.
* 
* 
*         EXPP   NAME 
* 
*         ENTRY  *NAME* = NAME OF ERROR MESSAGE.
* 
*         NOTES  MACRO INITIALIZES THE DEFINITION FOR THE MESSAGE 
*         TEXT. THE *ENDHELP* MACRO IS USED TO CLOSE THE
*         DEFINITION. THE TABLE FORMATS ARE PLACED IN AN
*         UNLABELED REMOTE BLOCK. 
  
          PURGMAC EXPP
  
 EXPP     MACRO  NAME 
 NAME_A BSS 0 
 A MICRO 1,, NAME 
  RMT 
  ORG TMSG+NAME-1 
  VFD 12/2000B+NAME_L 
  IF DEF,NAME_S,1 
  VFD 30/NAME_S 
  VFD *P/NAME_A 
          ORG    *
  RMT 
          ENDM   EXPP 
 EXPS     SPACE  4,10 
**        EXPS - DEFINE SECONDARY EXPLAIN ENTRY TEXT. 
* 
* 
*         EXPS   NAME,LEVEL 
* 
*         ENTRY  *NAME* = NAME OF ERROR MESSAGE.
*                *LEVEL* = LEVEL FOR MESSAGE (1-31).
* 
*         NOTES  MACRO SERVES SAME PURPOSE AS *EXPP*. 
  
          PURGMAC EXPS
  
 EXPS     MACRO  NAME,LEVEL 
  IF -DEF,NAME_S,1
 NAME_S BSS 32D 
 NAME_LEVEL_A BSS 0 
 A MICRO 1,, NAME_LEVEL 
  RMT 
  ORG NAME_S+LEVEL_B
  VFD 12/2000B+NAME_LEVEL_L,*P/NAME_LEVEL_A 
  ORG * 
  RMT 
          ENDM   EXPS 
 EXPLAIN  SPACE  4,20 
**        EXP - PROCESS EXPLAIN COMMAND.
* 
*         ENTRY  (EXPLAIN) = EXPLAIN ERROR MESSAGE POINTERS.
* 
*         EXIT   TO *NCM*.
* 
*         USES   A - 0, 1, 4, 6.
*                X - 0, 1, 2, 4, 5, 6, 7. 
*                B - 2, 3, 7. 
* 
*         MACROS WRITEC, WRITEO, WRITEW.
* 
*         NOTES  EXPLAIN ISSUES A MORE DETAILED STATEMENT CONCERNING
*                THE LAST 4 XEDIT MESSAGES. EACH TIME THE EXPLAIN 
*                COMMAND IS USED, XEDIT WILL GIVE THE LAST ENTRY, AND 
*                REMOVE IT FROM THE STACK (THUS THE NEXT EXPLAIN WILL 
*                ISSUE THE ENTRY FOR THE PREVIOUS MESSAGE.) THIS
*                COMMAND WILL WORK ONLY FOR THE LAST NON-EXPLAIN
*                COMMAND. 
  
  
 EXP      SA1    EXPLAIN     ENTRY
          LX1    12          POSITION LAST ENTRY
          UX1    B7,X1       (B7) = EXPLAIN ENTRY 
          MX7    -24
          LX1    12 
          BX6    X7*X1       REMOVE THIS EXPLAIN ENTRY
          SA6    A1          REPLACE STACK
          LE     B7,NCM      IF NO ENTRY ON STACK, EXIT 
          SX0    B7          ........PS/.........P
          LX0    -6          S........P/P.........
          SX2    X0          = PRIMARY IF THERE IS A SECONDARY
          NZ     X2,EXP0     IF THERE IS A SECONDARY
          SX0    B7                    /.........P
 EXP0     BX2    X7*X0       S........./..........
          LX2    6           .........S/..........
          SA1    TMSG-1+X0   GET PRIMARY MESSAGE INDEX
          ZR     X1,EXP2     IF NO ENTRY FOR THIS ERROR 
          SA0    X1          SET MESSAGE ADDRESS
          UX3,B2 X1          GET MESSAGE LENGTH 
          ZR     X2,EXP1     IF NO SUB-INDEX
          AX1    18 
          ZR     X1,EXP1     IF NO SUB-TABLE
          SB3    X1 
          SA1    X2+B3       GET SUB-INDEX MESSAGE TABLE ENTRY
          ZR     X1,EXP1     IF NO ENTRY
          UX3    B2,X1       SET LENGTH 
          SA0    X1          SET ADDRESS
 EXP1     SX5    B2          SAVE LENGTH
          MX6    0
          WRITEO OUTPUT      ISSUES LINE FEED 
          WRITEC X2,EXPA     * EXPLANATION OF-
          SA4    MESSAGE+X0 
          WRITEC X2,X4       ECHO OFFENDING ERROR MESSAGE 
          WRITEW X2,A0,X5    ISSUE EXPLANATION
          EQ     NCM         EXIT 
  
*         NO EXPLAIN ENTRY FOUND. 
  
 EXP2     WRITEC OUTPUT,EXPB
          SA4    MESSAGE+X0 
          WRITEC X2,X4
          EQ     NCM         EXIT 
  
 EXPA     DATA   C* EXPLANATION OF-*
 EXPB     DATA   C* NO ENTRY FOUND FOR* 
  
 TMSG     BSSZ   40B
          SPACE  4
**        EXPLAIN ENTRY DEFINITIONS.
  
          EXPP   ARG. 
          DATA   C* USUALLY MEANS THE USE OF AN EMPTY STRING IN THE*
          DATA   C* FIRST STRING OF A CHANGE OR LOCATE COMMAND.*
          ENDHELP 
  
          EXPP   BFN. 
          DATA   C* FILE NAME WAS NOT OF PROPER FORM OR IT WAS A* 
          DATA   C* FILE NAME WHICH IS RESERVED BY XEDIT.*
          ENDHELP 
  
          EXPP   BTL. 
          DATA   C* THE EDIT FILE CONTAINS AT LEAST ONE LINE OF * 
          DATA   C* DATA THAT IS NOT IN A FORM XEDIT CAN UNDERSTAND.* 
          ENDHELP 
  
          EXPP   CNV. 
          DATA   C* DURING CERTAIN MODES WITHIN XEDIT, SOME COMMANDS* 
          DATA   C* ARE DISABLED.*
          ENDHELP 
  
          EXPP   DEL. 
          DATA   C* MISSING STRING DELIMITER IN THE STRING FIELD OF*
          DATA   C* A COMMAND. A DELIMITER IS ASSUMED AFTER THE LAST* 
          DATA   C* NONBLANK CHARACTER OF THE COMMAND LINE.*
          ENDHELP 
  
          EXPP   EMI. 
          DATA   C* SPECIFIED IF DEFAULT FILE FUNCTION IS INCORRECT*
          DATA   C* ON SPECIFIED OR DEFAULT FILE.*
          ENDHELP 
  
          EXPP   EOF. 
          DATA   C* AN END OF FILE MARK HAS BEEN READ FROM THE EDIT*
          DATA   C* FILE, AND, UNLESS A DEOF COMMAND WAS BEING* 
          DATA   C* PROCESSED, IT HAS BEEN RETAINED.* 
          ENDHELP 
  
          EXPP   EOR. 
          DATA   C* AN END OF RECORD MARK HAS BEEN READ FROM THE EDIT*
          DATA   C* FILE, AND, UNLESS A DEOR COMMAND WAS BEING* 
          DATA   C* PROCESSED, IT HAS BEEN RETAINED.* 
          ENDHELP 
  
          EXPP   EOI. 
          DATA   C* THE EDITOR HAS GONE PAST THE LAST LINE OF THE FILE* 
          DATA   C* WHILE TRYING TO COMPLETE PROCESSING OF THE LAST*
          DATA   C* COMMAND. PROCESSING OF THAT COMMAND IS STOPPED AND* 
          DATA   C* THE POINTER IS MOVED TO THE TOP OF THE FILE.* 
          ENDHELP 
  
          EXPP   FCP. 
          DATA   C* THE SPECIFIED FILE HAS BEEN REWOUND AND RE-COPIED.* 
          DATA   C* THIS IS THE DEFAULT ACTION FOR THE END, FILE, AND*
          DATA   C* QUIT COMMANDS IF THE FILE IS EITHER DIRECT ACCESS*
          DATA   C* OR A MAGNETIC TAPE FILE.* 
          ENDHELP 
  
          EXPP   FCR. 
          DATA   C* THE SPECIFIED FILE IS EITHER AN EXECUTE OR APPEND*
          DATA   C* ONLY FILE; OR IS EITHER NOT A LOCAL FILE, OR A* 
          DATA   C* PERMANENT FILE DEPENDING ON THE SPECIFIED COMMAND*
          DATA   C* OPTION.*
          ENDHELP 
  
          EXPP   FLC. 
          DATA   C* THE SPECIFIED FILE HAS BEEN MADE A LOCAL FILE.* 
          DATA   C* FOR THE END, FILE, AND QUIT COMMANDS, THIS* 
          DATA   C* FUNCTION IS DEFAULT FOR INDIRECT ACCESS FILES.* 
          ENDHELP 
  
          EXPP   FRP. 
          DATA   C* THE PERMANENT FILE COPY HAS BEEN REPLACED.* 
          ENDHELP 
  
          EXPP   FSV. 
          DATA   C* A PERMANENT FILE COPY HAS BEEN SAVED.*
          ENDHELP 
  
          EXPP   ILL. 
          DATA   C* USUALLY MEANS A NONNUMERIC CHARACTER IN A NUMERIC*
          DATA   C* FIELD OR EXTRA INFORMATION IN A COMMAND.* 
          ENDHELP 
  
          EXPP   LFM. 
          DATA   C+ THE SYSTEM LOCAL FILE PROCESSOR HAS DETECTED AN+
          DATA   C* ERROR. PLEASE REPORT THE PROBLEM, ALONG WITH AS*
          DATA   C* MUCH INFORMATION AS POSSIBLE REGARDING THIS XEDIT*
          DATA   C* RUN, TO A CONSULTANT.*
          ENDHELP 
  
          EXPP   LNNF.
          DATA   C* THE SPECIFIED LINE NUMBER COULD NOT BE LOCATED.*
          ENDHELP 
  
          EXPP   LNTL.
          DATA   C* IN THE ALN, ALNS, OR RLN COMMAND, THE LINE* 
          DATA   C* NUMBER BECAME GREATER THAN 99999.*
          ENDHELP 
  
          EXPP   NSC. 
          DATA   C* THE COMMAND IS INCORRECT OR AN IMPROPER SEPARATOR*
          DATA   C* WAS USED AFTER THE COMMAND.*
          ENDHELP 
  
          EXPP   PFM. 
          DATA   C* ERROR IN PERMANENT FILE OPERATION.* 
          ENDHELP 
  
          EXPP   SNF. 
          DATA   C* IF A 0 IS USED FOR THE REPEAT COUNT ON ANY STRING*
          DATA   C* SEARCH COMMAND, AND THE STRING IS NOT IN THE* 
          DATA   C* CURRENT LINE, XEDIT ISSUES THE ABOVE MESSAGE* 
          DATA   C* AND DOES NOT ADVANCE THE POINTER. (ALSO, ANY* 
          DATA   C* REMAINING COMMANDS ON A DELIMITED COMMAND*
          DATA   C* LINE ARE IGNORED. IN ADDITION, THE 0 IS USED* 
          DATA   C* IF USING THE INPUT MODE ECSAPE CHARACTER.*
          ENDHELP 
  
          EXPP   STK. 
          DATA   C* AN ATTEMPT WAS MADE TO RECURRSIVELY USE AN INPUT* 
          DATA   C* SOURCE. AN EXAMPLE OF THIS IS-* 
          DATA   C*    Y/PRINT/Y-WHERE-*
          DATA   C* IN THE EXAMPLE, THE Y/Z COMMAND ATTEMPTS TO CALL* 
          DATA   C* ANOTHER Y/Z COMMAND, WHICH IS INCORRECT.* 
          ENDHELP 
  
          EXPP   TRUNC. 
          DATA   C* AS A RESULT OF A COMMAND, THE LINE WHOSE POSITION*
          DATA   C* IS GIVEN HAS BEEN TRUNCATED TO 160 CHARACTERS.* 
          DATA   C* THIS ACTION OCCURS AUTOMATICALLY WHENEVER A LINE* 
          DATA   C* IS EXTENDED WITHIN XEDIT TO INCLUDE MORE THAN*
          DATA   C* 160 CHARACTERS.*
          ENDHELP 
          SPACE  4
**        ARGUMENT ERROR SECONDARY EXPLANATIONS.
  
          EXPS   ARG.,1      F0 CONFLICT IN INPUT MODE
          DATA   C+ WHILE USING THE COMMAND ESCAPE CHARACTER OF+
          DATA   C+ *INPUT* MODE TO ENTER COMMANDS, THE MOVEMENT OF+
          DATA   C* THE POINTER IS DISALLOWED. FOR THIS REASON, XEDIT*
          DATA   C* FORBIDS USERS FROM ENTERING ANY REPEAT COUNT ON*
          DATA   C+ ANY COMMANDS (FOR EXAMPLE - THE *LOCATE* OR + 
          DATA   C+ *CHANGE* COMMANDS).  ALSO VOIDED ARE ANY PREFIX+
          DATA   C* CHARACTERS WHICH POSITION THE POINTER.* 
          ENDHELP 
          SPACE  4
**        BAD FILE NAME SECONDARY EXPLANATIONS. 
  
          EXPS   BFN.,1      BAD FILE NAME
          DATA   C* THE FILE NAME ENTERED CONTAINS EITHER INCORRECT*
          DATA   C* CHARACTERS, OR IS TOO LONG.*
          ENDHELP 
  
          EXPS   BFN.,2      NO FILE NAME 
          DATA   C* THE COMMAND IS MISSING A REQUIRED FILE NAME.* 
          ENDHELP 
  
          EXPS   BFN.,3      RESERVED FILE NAME 
          DATA   C* THE FILE NAME ENTERED IS ONE WHICH IS RESERVED BY*
          DATA   C* XEDIT. A PARTIAL LIST INCLUDES- INPUT, OUTPUT,* 
          DATA   C* SCRA, SCRB, ... SCRF, SCRG  AND (FOR COPY AND*
          DATA   C* COPYD COMMANDS) THE EDIT FILE NAME.*
          ENDHELP 
          SPACE  4
**        COMMAND NOT VALID SECONDARY EXPLANATIONS. 
  
          EXPS   CNV.,1 
          DATA   C* WHILE CREATING A FILE UNDER XEDIT, VARIOUS COM-*
          DATA   C* MANDS ARE DISABLED AS THEY ATTEMPT TO REFERENCE*
          DATA   C* OR MODIFY PARTS OF THE FILE WHICH DO NOT EXIST.*
          DATA   C* CREATION MODE IS AUTOMATICALLY EXITED UPON ENTRY* 
          DATA   C* OF THE FIRST TEXT LINE (USE THE INSERT OR INPUT*
          DATA   C* COMMANDS).* 
          ENDHELP 
  
          EXPS   CNV.,3 
          DATA   C* WHILE USING THE INPUT MODE COMMAND ESCAPE OPTION,*
          DATA   C* ANY COMMAND WHICH MOVES THE POINTER IS NOT ALLOWED.*
          DATA   C* THE COMMAND SPECIFIED IS THUS INCORRECT.* 
          ENDHELP 
          SPACE  4
**        EMI - FILE FUNCTION INCORRECT SECONDARY EXPLANATIONS. 
  
          EXPS   EMI.,1 
          DATA   C* THE SPECIFIED FILE CANNOT BE UPDATED. THIS CAN* 
          DATA   C* RESULT IF THE FILE IS LOCK OR NOT IN WRITE MODE.* 
          ENDHELP 
  
          EXPS   EMI.,2 
          DATA   C+ THE *L* PARAMETER IS INCORRECT ON DIRECT ACCESS+
          DATA   C* OR MAGNETIC TAPE FILES.*
          ENDHELP 
          SPACE  4
**        FILE CANNOT BE ACCESSED SECONDARY EXPLANATIONS. 
* 
  
  
          EXPS   FCR.,1 
          DATA   C* THE FILE IS AN EXECUTE OR APPEND ONLY FILE THUS*
          DATA   C* IS NOT ACCESSABLE.* 
          ENDHELP 
  
          EXPS   FCR.,2 
          DATA   C* THE FILE IS NOT PRESENTLY LOCAL TO THE JOB. ALSO,*
          DATA   C* WHEN IF THE FILE IS DIRECT ACCESS (AND CURRENTLY* 
          DATA   C* ATTACHED) THE FILE CANNOT BE ACCESS FROM THE* 
          DATA   C* PERMANENT FILE AREA.* 
          ENDHELP 
  
          EXPS   FCR.,3 
          DATA   C* THE FILE IS NOT OBTAINABLE FROM THE PERMANENT*
          DATA   C* FILE AREA.* 
          ENDHELP 
          SPACE  4
**        PFM SECONDARY EXPLANATIONS. 
          EXPS   PFM.,1      (FILE) BUSY. 
          DATA   C* DIRECT ACCESS FILE IS ATTACHED ELSEWHERE IN WRITE*
          DATA   C* MODE.*
          ENDHELP 
  
          EXPS   PFM.,2      (FILE) NOT FOUND.
          DATA   C* SPECIFIED FILE COULD NOT BE FOUND.* 
          ENDHELP 
  
          EXPS   PFM.,4      (FILE) NOT ON MASS STORAGE.
          DATA   C* SPECIFIED FILE DOES NOT RESIDE ON A MASS STORAGE* 
          DATA   C* DEVICE.*
          ENDHELP 
  
          EXPS   PFM.,5      (FILE) ALREADY PERMANENT.
          DATA   C* THERE IS ALREADY A FILE EITHER SAVED OR DEFINED*
          DATA   C* UNDER THE DESIRED NAME. TRY USING THE RENAME* 
          DATA   C* PARAMETER.* 
          ENDHELP 
  
          EXPS   PFM.,10     USER ACCESS NOT VALID
          DATA   C* USER IN NOT VALIDATED TO SAVE FILES AND/OR TO*
          DATA   C* ACCESS A REMOVABLE DEVICE.* 
          ENDHELP 
  
          EXPS   PFM.,12     FILE TOO LONG. 
          DATA   C* THE SPECIFIED FILE IS TOO LONG TO BE SAVED OR*
          DATA   C* REPLACED.*
          ENDHELP 
  
          EXPS   PFM.,16     PF UTILITY ACTIVE. 
          DATA   C* DUE TO ACTIVITY WITHIN THE SYSTEM, THE SPECIFIED* 
          DATA   C* PERMANENT FILE OPERATION CANNOT BE DONE AT THE* 
          DATA   C* PRESENT TIME. THE OPERATION SHOULD BE RETRIED*
          ENDHELP 
  
          EXPS   PFM.,20     CATALOG OVERFLOW - FILES.
          DATA   C* YOU HAVE EXCEEDED YOUR VALIDATED LIMIT FOR THE* 
          DATA   C* MAXIMUM NUMBER OF PERMANENT FILES.* 
          ENDHELP 
  
          EXPS   PFM.,21     CATALOG OVERFLOW - SIZE. 
          DATA   C* THE CUMULATIVE SIZE OF THE INDIRECT ACCESS FILES* 
          DATA   C* IN YOUR CATALOG HAVE EXCEEDED YOUR VALIDATION*
          DATA   C* LIMIT.* 
          ENDHELP 
  
          EXPS   PFM.,23     I/O SEQUENCE ERROR.
          DATA   C* PLEASE NOTIFY A CONSULTANT OF THIS ERROR,*
          DATA   C* ENCLOSING (IF POSSIBLE) A HARD COPY OF YOUR*
          DATA   C* SESSION.  PLEASE RETRY YOUR COMMAND.* 
          ENDHELP 
  
          EXPS   PFM.,30     TRACK LIMIT
          DATA   C* PERMANET FILE DEVICE HAS RUN OUT OF TRACKS. PLEASE* 
          DATA   C* NOTIFY CONSULTANT AS SOON AS POSSIBLE.* 
          ENDHELP 
  
          EXPS   PFM.,31     FILE LENGTH ERROR
          DATA   C* ERROR IN PERMANENT FILE. NOTIFY CONSULTANT AS SOON* 
          DATA   C* AS POSSIBLE. PLEASE DO NOT USE THE SPECIFIED FILE.* 
          ENDHELP 
  
          EXPS   PFM.,33     DIRECT ACCESS FILE ERROR 
          DATA   C* ERROR IN SYSTEM DIRECT ACCESS FILE DEFINITION.* 
          DATA   C* PLEASE NOTIFY CONSULTANT AS SOON AS POSSIBLE.*
          ENDHELP 
  
          EXPS   PFM.,34     REPLACE ERROR
          DATA   C* NOTIFY CONSULTANT.* 
          ENDHELP 
  
          EXPS   PFM.,35     PFM ABORTED
          DATA   C* PERMANENT FILE MANAGER ABORTED. RETRY OPERATION.* 
          ENDHELP 
 HELP     SPACE  4,30 
**        HELP - PROCESS XEDIT HELP COMMAND.
* 
*         ENTRY  (IN - IN+80) = COMMAND LINE. 
*                (LSEP) = SUBSCRIPT OF SEPARATOR. 
* 
*         EXIT   HELP ENTRY LISTED. 
* 
*         USES   A - 1, 2, 3, 5, 6, 7.
*                X - ALL. 
*                B - 2, 3.
* 
*         CALLS  HTI. 
* 
*         MACROS CSET, GET, OPEN, READ, READW, RECALL, REWIND,
*                STATUS, WRITEC, WRITER, WRITEW.
* 
*         NOTES  HELP PICKS THE COMMAND OFF THE ARGUMENT OF THE HELP
*         COMMAND.  IF NO COMMAND IS SPECIFIED, A LISTING OF ALL XEDIT
*         COMMANDS AND COMMAND ABBREVIATIONS AND PREFIX CHARACTERS IS 
*         GIVEN.  IF A COMMAND OR PREFIX CHARACTER IS SPECIFIED ON THE
*         HELP COMMAND, IT IS COMPARED WITH THOSE IN THE XEDIT COMMAND
*         TABLE AND THE UNABBREVIATED FORM IS SELECTED. XEDITI FILE 
*         IS THEN GOTTEN FROM THE LIBRARY IF IT IS NOT ALREADY LOCAL. 
*         THE FILE IS THEN SEARCHED FOR A MATCHING COMMAND AND THE
*         COMMAND ENTRY IS PRINTED OUT.  NOTE - PAGEINATION LINES ARE 
*         FLAGGED WITH A *>*.  THE LINE BEFORE EACH COMMAND ENTRY IS
*         FLAGGED WITH A *-* IN COLUMN 35.
  
  
 HELP     SA1    NUMS        RESTORE A5 POINTER 
          SA2    A1+B1
          MX7    1
          ZR     X1,HLP21    IF NO PARAMETER
          SA2    X2 
          SA5    X1 
          NG     X5,HLP21    IF NO PARAMETER
          BX6    X7+X2
          SA6    A2 
          SA1    A5+B1       CHECK NEXT CHARACTER 
          PL     X1,HLP0     IF NOT END OF LINE 
          MX1    0           CLEAR CHARACTER
 HLP0     SX4    X5-1R0 
          SX3    X5-1R+ 
          SX2    X5          MOVE CHARACTER 
          LX2    6
          BX2    X2+X1
          SB2    X2 
          BX3    -X4*X3      NEG. IF NUMBER 
          SA2    HLPA 
          NG     X3,HLP11    IF A NUMBER
          SB3    X2 
 HLP1     EQ     B3,B2,HLP12 IF SPECIAL CHARACTER 
          SA2    A2+B1
          SB3    X2 
          NZ     X2,HLP1     IF NOT END OF LIST 
          MX6    1           PREPARE TO PARSE COMMAND 
          MX4    26 
          MX3    -6 
          LX4    -5          PREPARE CHARACTER MASK 
 HLP2     BX0    -X3*X5      REMOVE ASCII 
          SB3    X0+4 
          LX1    B3,X4       SHIFT MASK 
          PL     X1,HLP4     IF NOT A-Z 
          BX1    X3*X5
          ZR     X1,HLP3     IF NOT ASCII CHARACTER 
          SX1    X1-7600B 
          NZ     X1,HLP4     IF NOT LOWER CASE A-Z
  
*         MERGE CHARACTERS. 
  
 HLP3     LX6    6
          BX6    X6+X0
          SA5    A5+1 
          PL     X5,HLP2     IF MORE CHARACTERS 
  
*         CHECK FOR LEGAL PARAMETER.
  
 HLP4     BX1    -X3*X6      ISOLATE LAST CHARACTER OF COMMAND
          MX0    1
          SX4    X1-1RW 
          ZR     X4,HLP5     IF *W* POSTFIX 
          SX4    X1-1RA 
          NZ     X4,HLP6     IF NOT *A* POSTFIX 
 HLP5     BX6    X3*X6       REMOVE POSTFIX 
 HLP6     LX6    6
          PL     X6,HLP6     IF NOT LEFT JUSTIFIED
          BX6    -X0*X6      REMOVE POSITION BIT
          SA1    JUMP        SEARCH COMMAND TABLE 
          SA6    JUMPX       SET NAME AT END
 HLP7     BX3    X1-X6
          SA1    A1+B1
          NZ     X3,HLP7     IF NOT A MATCH 
          NG     X3,HLP7     IF COMPARED A INFORMATION WORD 
          NG     X1,HLP9     IF PRESENTLY ON AN INFORMATION WORD
 HLP8     BX6    X1 
          SA1    A1+B1
          PL     X1,HLP8     IF NOT AT AN INFORMATION WORD
 HLP9     SX1    X1 
          ZR     X1,HLP10    IF COMMAND NOT IN TABLE
          EQ     HLP13       PROCESS COMMAND
  
 HLP10    SA6    HLPF 
          WRITEC OUTPUT,HLPE
          EQ     NCM         CONTINUE 
  
*         PROCESS NUMERIC PARAMETER.
  
 HLP11    SX6    1R$
          LX6    -6 
          EQ     HLP13       PROCESS COMMAND
  
*         PROCESS SPECIAL COMMAND.
  
 HLP12    MX3    42 
          BX6    X2*X3       ISOLATE SEARCH PATTERN:  
          EQ     HLP13       PROCESS COMMAND. 
 HLP13    SA1    NUMS+1 
          SA2    X1 
          SX7    X2 
          LX2    1
          NG     X2,HLP13.1  IF REAL EOL
          SA7    A2 
 HLP13.1  SA2    HLPK 
          SA6    HLPH       COMMAND TO SEARCH FOR 
          SA6    A2 
          NZ     X2,HLP14    IF XEDITI ALREADY GOTTEN 
          STATUS XEDITI 
          SA1    XEDITI 
          SX3    7776B
          BX3    X3*X1
          NZ     X3,HLP14    IF FILE GOTTEN 
          GET    XEDITI,,,,,,IP 
 HLP14    OPEN   XEDITI,READNR,RECALL 
          REWIND XEDITI,R 
          READ   XEDITI 
          SA5    HLPH        COMMAND TO SEARCH FOR
          LX6    X5,B1
          SB2    B1+B1
          BX7    X6+X5
          LX4    X7,B2
          SA3    HLPI        =10HHHHHHHHHHH 
          BX6    X4+X7
          LX7    -2 
          BX4    X6+X7
          BX3    X3*X4       BIT 3 OF CHAR SET IF CHAR NOT ZERO 
          AX7    X3,B1
          BX0    X5          MASK 
          BX4    X7+X3
          LX7    X4,B2
          BX6    X4+X7
          AX7    X4,B2
          BX0    X6+X7       COMMAND MASK 
 HLP15    MX6    0
          SA6    E.SCR+3
          READC  XEDITI,E.SCR,8 
          ZR     X1,HLP16    IF NO EOF/EOR
          RECALL X2 
          WRITEC OUTPUT,HLPG
          EQ     NCM         EXIT 
  
 HLP16    SA1    HLPJ 
          ZR     X1,HLP17    IF HELP ENTRY EXPECTED 
          SA1    E.SCR+3
          SA3    =6L    - 
          BX6    X1-X3
          LX6    6*6         SHIFT CHARACTER AFTER - TO CHARACTER 9 
          AX6    6           PROCESS CBR/CCR DIFFERENCE 
          SA6    HLPJ        SET HELP ENTRY EXPECTED IF - IN COL 35 
          EQ     HLP15       READ NEXT LINE 
  
 HLP17    SA1    E.SCR
          ZR     X1,HLP15    IF BLANK LINE
          BX2    X1 
          LX2    2*6
          SX2    X2-2R
          ZR     X2,HLP15    IF LINE BEGINS WITH 2 BLANKS 
          AX1    54 
          SX6    X1-1R>-777700B 
          ZR     X6,HLP15    IF PAGINATION
          SA6    HLPJ        CLEAR HELP ENTRY EXPECTED FLAG 
          SA1    A1 
          BX3    X1-X5       CHECK FOR COMMAND MATCH
          BX6    X0*X3
          NZ     X6,HLP15    IF NO MATCH
          BX7    X0 
          AX7    6
          BX7    -X0*X7      MASK FOR NEXT CHARACTER
  
*         NO COMMAND IS .GE. 9 CHARACTERS IN LENGTH.
  
          SA2    =10H 
          BX2    X1-X2       COMPARE WITH BLANK 
          BX3    X7*X1
          BX2    X7*X2
          ZR     X3,HLP17.1  IF NEXT CHARACTER IS 00B 
          NZ     X2,HLP15    IF NEXT CHARACTOR IS NOT BLANK (55B) 
 HLP17.1  SA1    CSMR 
          PL     X1,HLP18    IF 63 CHARACTER SET
          SA2    BATCH
          NZ     X2,HLP18    IF BATCH MODE
          SA1    AS 
          ZR     X1,HLP18    IF ALREADY IN NORMAL CHARACTER SET MODE
          CSET   NORMAL 
  
*         A MATCH IS FOUND IN THE XEDIT HELP FILE.  LIST ENTRY. 
  
 HLP18    WRITEC OUTPUT,E.SCR 
          RJ     HTI         CHECK FOR INTERRUPT
 HLP19    READC  XEDITI,E.SCR 
          NZ     X1,HLP20    IF EOF/EOR 
          SA1    E.SCR+3
          SA2    =6L    - 
          BX3    X1-X2
          LX3    6*6
          AX3    6           REMOVE CHARACTOR 36
          ZR     X3,HLP20    IF END OF ENTRY
          SA1    E.SCR
          AX1    54 
          SB2    X1-1R>-777700B 
          ZR     B2,HLP19    IF PAGEINATION 
          EQ     HLP18       WRITE NEXT LINE
  
 HLP20    RECALL XEDITI 
          EQ     HLP23       EXIT 
  
 HLP21    SA1    CSMR 
          PL     X1,HLP22    IF 63 CHARACTER SET
          SA2    BATCH
          NZ     X2,HLP22    IF BATCH MODE
          SA1    AS 
          ZR     X1,HLP22    IF ALREADY IN NORMAL MODE
          CSET   NORMAL 
 HLP22    BSS    0
          WRITEW OUTPUT,HLPC,HLPD 
 HLP23    RJ     HTI         CHECK FOR INTERRUPT
          SA1    CSMR 
          PL     X1,NCM      IF 63 CHARACTER SET, EXIT
          SA2    BATCH
          NZ     X2,NCM      IF IN BATCH MODE 
          SA1    AS 
          ZR     X1,NCM      IF TERMINAL WAS IN NORMAL MODE 
          WRITER OUTPUT,RECALL
          CSET   ASCII
          EQ     NCM         RETURN 
  
 HLPA     BSS    0
 HELPSP   HERE               ASSEMBLY SPECIAL FORMS 
          DATA   0
  
 D        OPSYN  DATA 
 HLPC     BSS    0
  D C*THE FOLLOWING IS A LIST OF ALL XEDIT COMMANDS AND IN BRACKETS,* 
  D C*THEIR ABBREVIATIONS.* 
  D C*  * 
          MHELP  (.)
          MHELP  (-)
 HELP     HERE
          DATA   C$"MH1"$    ASSEMBLE LAST LINE 
  D C*  * 
  D C*ANY COMMAND MAY BE PREFIXED BY ANY NUMBER OR COMBINATION OF * 
  D 30HTHE PREFIX CHARACTERS - *X*, * 
  VFD  30/5H/*, * 
  CHAR (VFD 6/0),UA.
  VFD  24/4H*, O
  DATA C-R *+*.-
  D C*  * 
  D C*A COMPLETE WRITEUP ON XEDIT IS AVAILABLE ON THE LIBRARY FILE* 
  VFD  30/5H#XEDI 
  CHAR (VFD 12/0),FN. 
  VFD  18/3H.#
  D C*  * 
  D C*INFORMATION FOR A SPECIFIC COMMAND OR PREFIX CHARACTER MAY BE*
  D C*OBTAINED BY ENTERING THE COMMAND -* 
  VFD  24/4H
  CHAR (VFD 6/0),QM.
  CHAR (VFD 6/0),QM.
  VFD  24/4H HEL
  DATA 10HP,CMD    -
  VFD  42/7HOR- 
  CHAR (VFD 6/0),QM.
  CHAR (VFD 6/0),QM.
  VFD  6/1R 
  DATA C*H,CMD* 
  D C*WHERE CMD IS THE PREFIX OR POSTFIX CHARACTER OR THE COMMAND*
  D C*TO BE EXPLAINED.* 
 HLPD     EQU    *-HLPC 
  
 HLPE     DATA   H*COMMAND NOT FOUND -* 
 HLPF     DATA   C*COMMAND   *
 HLPG     DATA   H*NO HELP ENTRY FOUND FOR  -*
 HLPH     DATA   C*COMMAND   *
 HLPI     DATA   10HHHHHHHHHHH
 HLPJ     DATA   0           HELP ENTRY EXPECTED FLAG 
 HLPK     DATA   0           IF ZERO, GET XEDITI FILE 
          SPACE 4,20
**        HTI - *HELP* COMMAND TELEX INTERRUPT PROCESSOR. 
* 
*         ENTRY  NONE.
* 
*         EXIT   RETURNS TO CALLER IF NO TLX INTERRUPT SENSED,
*                ELSE REWINDS THE OUTPUT BUFFER, RESETS THE 
*                CHARACTER SET AND EXITS TO *CER1* TO POP THE 
*                INPUT STACK. 
* 
*         USES   A - 1, 2, 6. 
*                X - 1, 2, 6. 
* 
*         MACROS CSET, DISTC, RECALL. 
  
 HTI      PS                 ENTRY/EXIT.
          MX6    0
          SA2    TLX
          ZR     X2,HTI      IF NO INTERRUPT, RETURN
          SA6    A2 
          DISTC  ON,A2
          RECALL OUTPUT 
          SA1    =XOUTPUT+1 
          MX6    -18
          BX6    -X6*X1 
          SA6    A1+B1       IN=OUT=FIRST 
          SA6    A6+B1
          SA2    BATCH
          NZ     X2,CER1     IF IN BATCH
          SA2    AS 
          ZR     X2,CER1     IF ALREADY IN NORMAL CHAR SET MODE 
          CSET   RESTORE
          EQ     CER1        EXIT, POP INPUT STACK
  
 XEDITI   BSS    0
          CHAR=  24D,XEDI,FN.   -TI- OR -64-
 XEDI     FILEB  XBUF,1001B,FET=12,USN=LIBRARY,EPR
  
          USE    BUFFERS
 XBUFL    EQU    1001B
 XBUF     EQU    *           XEDITI BUFFER
 LWA      EQU    XBUF+XBUFL+17B 
  
          USE    SETCHAR
          DATA   0           SET END OF CHARACTER PRESET
          USE    *
          HERE               ASSEMBLE THE DEFERRED EXPLAIN ENTRY DATA 
          OVLDEF   2,(LOW USAGE COMMANDS) 
          TITLE  LOCAL FETS AND STORAGE.
**        FETS. 
  
 RFET     FILEC  RBUF,BUFRL,EPR,FET=7 
          TITLE  COMMAND PROCESSORS.
 CPY      SPACE  4,15 
**        CPY - COPY/COPYD PROCESSORS.
* 
*         ENTRY  (COPY) = NAME OF LAST COPY FILE. 
* 
*         EXIT   TO *NCM*, COPY COMPLETE. 
* 
*         USES   A - 0, 1, 2, 3, 4, 5, 6. 
*                X - ALL. 
* 
*         CALLS  LOC, RDF, VFY, WTF.
* 
*         MACROS REWIND, WRITEC, WRITER.
  
  
 CPY11    MX6    0           SET NOMOD WHEN USING COPYD 
          SA6    NOMOD
 CPY      SA5    IFN
          SA3    ISFN 
          SB2    BFN.*100B+3 * RESERVED FILE NAME * 
          SA2    COPY 
          BX3    X5-X3
          ZR     X3,CER      IF COPY TO EDIT FILE 
          BX0    X2-X5       =0 IF COPY TO SAME FILE
          LX6    X5 
          SX7    B1 
          SA6    A2          SAVE COPY FILE NAME
          BX5    X5+X7       MERGE COMPLETE BIT 
          ZR     X0,CPY1     IF CONSECUTIVE COPIES
          ZR     X2,CPY1     IF NO PREVIOUS COPY FILE 
          WRITER FTD,RECALL 
          REWIND FTD,RECALL 
 CPY1     SA0    FTD         SET FET ADDRESS
          SA1    GFNB 
  
*         DETERMINE IF THE FILE NAME IS A SPECIAL ONE.
  
 CPY2     BX2    X1-X5
          AX2    17 
          ZR     X2,CPY10    IF SPECIAL NAME
          SA1    A1+B1
          NZ     X1,CPY2     IF MORE IN LIST
          BX6    X5 
          ZR     X0,CPY3     IF CONSECUTIVE COPIES
          SA6    FTD         PUT NAME INTO FET
          REWIND A6,RECALL
  
*         PREPARE FOR A COPY OPERATION. 
  
 CPY3     SA1    INDEX
          SX5    X1-.COPY    =0 IF NOT TO DELETE
 CPY4     RJ     LOC         ATTEMPT TO LOCATE LINE 
          ZR     B5,CPY8     IF NOT FOUND 
          SX1    A0-OUTPUT
          ZR     X1,CPY5     IF OUTPUT (IF VERIFY = DUPLICATE LINES)
          RJ     VRY         VERIFY LOCATE
 CPY5     WRITEC A0,E.LINE   PLACE LINE 
          SA1    NUMS 
          SX6    B1 
          IX6    X1-X6
          AX1    1
          ZR     X1,CPY9     IF COUNT FINISHED
          SA6    A1 
 CPY6     NZ     X5,CPY7     IF *COPYD* COMMAND 
          RJ     WTF
 CPY7     RJ     RDF
          EQ     CPY4        PROCESS NEXT LINE
  
*         LINE IS NOT FOUND.
  
 CPY8     SA1    NUMS 
          NG     X1,LCT4     IF STRING NOT FOUND
          WRITEC A0,E.LINE
          EQ     CPY6        COPY LINE
  
*         CLEANUP FROM COMMAND. 
  
 CPY9     ZR     X5,NCM      IF NOT COPYD 
          RJ     RDF         CREAM EXISTING LINE
          EQ     NCM         EXIT 
  
*         PROCESS SPECIAL FILES.
  
 CPY10    SA3    A1+CPYA-GFNB 
          SA4    X3          GET ACTUAL NAME TO USE 
          AX3    18 
          BX6    X4 
          SA0    X3          SET FET TO USE 
          SA6    FTD
          EQ     CPY3        PERFORM COPY 
  
*         TABLE OF SPECIAL FILE OPERATIONS. 
*         VFD    42/FET ADDR,18/FILE NAME 
  
 CPYA     VFD    42/FTD,18/=0    *NULL* FILE
          VFD    42/OUTPUT,18/=0    *OUTPUT* FILE 
 A        SET *-CPYA
          BSSZ   GFNBL-A     SCRATCH REST (WILL EXPLODE IF USED)
 DLB      SPACE  4,10 
**        DLB - DELETE LEADING BLANKS.
* 
*         ENTRY  (NUMS) = NUMBER OF LINES TO PROCESS. 
* 
*         EXIT   TO *NCM*.
* 
*         USES   A - 1, 6, 7. 
*                X - 1, 5, 6, 7.
*                B - 2, 3.
* 
*         CALLS  RDF, SAC, WTF. 
  
  
 DLB      SA1    NUMS 
          SX6    B1 
          IX6    X1-X6
+         SA6    A1 
          MX5    -0          SET NO MODIFICATIONS 
          RJ     SAC         SET ASCII PROCESSING 
 DLB1     SA1    E.STR-1
          SB3    -1R
          SX7    -1          RESET CHARACTER COUNTER
  
 DLB2     SA1    A1+B1       SEARCH FOR FIRST NON-BLANK 
          SB2    B3+X1
          NG     X1,DLB6     IF END OF LINE (ALL BLANKS)
          ZR     B2,DLB2     IF CHARACTER IS A BLANK
          SX6    A1-E.STR 
          ZR     X6,DLB4     IF NO LEADING BLANKS 
 DLB3     BX6    X1          REPACK CHARACTERS
          SX7    X7+B1       INCREMENT CHARACTER COUNT
          SA6    E.STR+X7 
          SA1    A1+B1
          PL     X6,DLB3     IF NOT AT END OF LINE
          SX6    B1 
          MX5    0           SET MODIFICATIONS MADE TO FILE 
          SA7    E.STR-1     SET NUMBER OF CHARACTERS IN LINE 
          SA6    E.LMOD      SET MODIFICATION MADE TO LINE
  
*         CHECK FOR MORE LINES TO PROCESS.
  
 DLB4     SA1    NUMS 
          SX6    B1+
          IX6    X1-X6
          SA6    A1 
          NG     X6,DLB5     IF FINISHED
          RJ     WTF
          RJ     RDF
          EQ     DLB1        PROCESS NEXT LINE
 DLB5     SA1    NOMOD       UPDATE MODIFICATION STATUS 
          BX6    X5*X1
          SA6    A1 
          EQ     NCM         EXIT 
  
*         PROCESS TOTALLY BLANK LINE. 
  
 DLB6     MX5    0           SET MODIFICATION TO FILE 
          RJ     RDF         READ NEXT LINE 
          SA1    NUMS 
          SX6    B1+
          IX6    X1-X6
          NG     X6,DLB5     IF FINISHED
          SA6    A1 
          EQ     DLB1        PROCESS NEXT LINE
  
 LTB      SPACE  4,15 
**        LTB - LIST TAB SETTINGS.
* 
*         ENTRY  (TABS) = TAB SETTINGS. 
* 
*         EXIT   TO *NCM*.
* 
*         USES   A - 1, 2, 5, 6, 7. 
*                X - 1, 2, 3, 4, 5, 6, 7. 
*                B - 4, 5, 6, 7.
* 
*         CALLS  CDD. 
* 
*         MACROS WRITEC.
  
  
 LTB      BSS    0
          SB1    1
          SA5    TABS 
          SB6    LTBA+1 
          SB7    B0 
 LTB1     SA1    A5+B7       PUT CURRENT TABS INTO MESSAGE
          MX5    0
          ZR     X1,LTB2     IF END OF TABS 
          RJ     CDD         CONSTRUCT MESSAGE
          LX4    60-6 
          BX5    X4 
          SB7    B7+B1
          SA1    A5+B7
          ZR     X1,LTB2     IF END OF TABS 
          RJ     CDD
          SB4    6*4
          SB4    B4-B2
          LX6    B4,X6
          MX7    6*6
          BX5    X7*X5
          BX6    -X7*X6 
          BX6    X6+X5
          SA6    B6 
          SB6    B6+B1
          SB5    8
          SB7    B7+B1
          LT     B7,B5,LTB1  IF NOT FINISHED WITH TABS
          MX5    0
 LTB2     BX7    X5 
          SA7    B6 
          MX7    0
          SA7    B6+B1       PUT EOL AFTER LAST TAB 
          SA1    TABCHAR     PUT CURRENT TAB CHARACTER INTO MESSAGE 
          PL     X1,LTB3     IF TAB CHARACTER IS DEFINED
          SX1    1R 
 LTB3     LX1    7*6
          MX6    6
          SA2    LTBA 
          LX6    7*6+6
          BX7    -X6*X2      PUT LOWER PART OF CHARACTER
          BX7    X7+X1
          LX6    6
          BX3    X6*X1
          NZ     X3,LTB4     IF NOT ASCII CHARACTER 
          SX1    1R 
          LX1    8*6         POSITION 
 LTB4     BX7    -X6*X7 
          BX7    X7+X1
          SA7    A2 
          WRITEC OUTPUT,LTBA
          EQ     NCM         EXIT 
  
 LTBA     DATA   10H    TABS
          BSSZ   NTABS/2+2
 NBL      SPACE  4
**        NBL - CHANGE ERROR MESSAGES TO CONTAIN NO BELLS.
* 
*         ENTRY  NONE.
* 
*         EXIT   TO *NCM*.
* 
*         USES   A - 1. 
*                X - 1. 
* 
*         MACROS MOVE.
* 
*         NOTES  THIS COMMAND SWITCHES THE ERROR MESSAGES ISSUED TO A 
*                TIME SHARING TERMINAL TO THOSE CONTAINING NO BELLS.
*                THIS COMMAND FROM A BATCH JOB FUNCTIONS AS A NO-OP.
  
  
 NBL      SA1    BATCH
          NZ     X1,NCM      IF BATCH ORIGIN
          MOVE   NBLAL,NBLA,MESSAGE+1  SWITCH MESSAGES
          EQ     NCM         EXIT 
  
 NBLA     BSS    0           TABLE OF ERROR MESSAGES
 ERROVL   HERE
 NBLAL    EQU    *-NBLA 
 OCT      SPACE  4,20 
**        OCT - PROCESS OCTCHANGE COMMAND.
* 
*         ENTRY  (NUMS) = FWA OF PARAMETERS.
*                (NUMS+1) = LWA OF PARAMETERS.
* 
*         EXIT   TO *NCM*, IF CHANGE COMPLETE.
*                TO *CER*, IF ARGUMENT ERROR. 
*                TO *LCT4*, IF STRING NOT FOUND.
* 
*         USES   A - 0, 1, 5, 6, 7. 
*                X - ALL. 
*                B - 4, 6, 7. 
* 
*         CALLS  ASF, CHS, RCP, RDF, RTA, RTR, SCP, VAL,
*                VRY, WTF.
* 
*         MACROS MOVE.
* 
*         NOTES  *OCT* PROCESSES ONLY A SUBSET OF CHANGE OPTIONS. 
  
  
 OCT      BX7    X7-X7       CLEAR CELLS
          MX6    0
          SA6    P1LP 
          SA7    P2RP 
          SA6    A6+B1
          SA7    A7+B1
          SA6    A6+B1
          SA7    A7+B1
          RJ     SCP         SET COMMAND PAREMETERS 
          ZR     X1,OCT12    IF NO PARAMETERS 
          SX6    D.STR+1
          SB6    B0          SET FIRST PASS 
          MX1    1           SET POSITION 
          SA7    D.STR       SET FWA OF CREATED STRING -1 
          SA6    P1LP        SET FIRST STRING POINTER 
          BX7    X7-X7       CLEAR ASSEMBLY 
  
*         CONVERT OCTAL DIGITS. 
  
 OCT1     NG     X5,OCT2     IF END OF PARAMETERS/LINE
          SX4    X5-1R0 
          SX3    X5-1R7-1 
          LX7    3
          BX3    -X4*X3      NEGATIVE IF OCTAL NUMBER 
          PL     X3,OCT2     IF NOT A NUMBER
          BX7    X7+X4       MERGE
          SA5    A5+B1
          LX1    30          UPDATE POSITION
          PL     X1,OCT1     IF ON FIRST POSITION 
          SA7    A7+B1       SAVE ASSEMBLY
          BX7    X7-X7
          EQ     OCT1        LOOP 
  
 OCT2     PL     X1,OCT12    IF ON SECOND HALF (ERROR)
          SX6    A7+B1       GET LWA+1 FOR STRING 
          SA6    A6+B1       SAVE ADDRESS 
  
*         SKIP TRAILING BLANKS/ONE COMMA. 
  
 OCT3     SB4    X5-1R
          ZR     B4,OCT4     IF BLANK 
          NE     B4,B1,OCT5  IF NOT COMMA 
          NZ     X7,OCT5     IF NOT FIRST COMMA 
  
 OCT4     SX7    B4+X7       UPDATE COMMA STATUS
          SA5    A5+B1
          EQ     OCT3        PROCESS NEXT CHARACTER 
  
*         CHECK WHICH FIELD.
  
 OCT5     BX7    X7-X7       RESET ASSEMBLY 
          SB6    B6+B1
          NE     B6,B1,OCT6  IF ON SECOND FIELD 
          SX6    A7+B1
          SA6    P3LP        SET SECOND POINTER 
          EQ     OCT1        PARSE SECOND STRING
  
 OCT6     RJ     VAL         GET REPETITION COUNT 
          SA6    NUMS        SAVE COUNT 
          PL     X5,OCT12    IF NOT END OF COMMAND
          RJ     ASF         GET STRING PARAMETERS
          NZ     B2,OCT12    IF ERROR IN ANALYSIS 
          RJ     RCP         RESET COMMAND PARAMETERS 
          SX6    M.CODED
          SA6    E.NMODE     SET BACK TO CODED
  
*         BEGIN TO OCTCHANGE. 
  
 OCT7     SB7    9
          SA1    E.LINE      BREAK LINE INTO 6 BIT PARTS
          MX3    -12
          SX6    B1          SET SOMETHING IN X6
          MX2    -6 
          BX4    -X3*X1      GET END OF LINE BYTE 
          SA6    E.STR-1
          SA0    OCBUF       SET FWA OF SCRATCH BUFFER
 OCT8     LX1    6
          BX6    -X2*X1 
          SB7    B7-B1
          SA6    A6+B1
          PL     B7,OCT8     IF MORE IN WORD
          ZR     X4,OCT9     IF END OF LINE 
          SB7    9           RESET CHARACTER COUNT
          SA1    A1+B1
          BX4    -X3*X1 
          EQ     OCT8        BREAK UP NEXT WORD 
  
 OCT9     SA1    A6-B1
          MX6    2
 OCT9.1   SA1    A1-B1
          ZR     X1,OCT9.1   IF LAST NON-BLANK NOT FOUND
          SA6    A1+B1
          SX7    A6-E.STR    SET NUMBER OF CHARACTERS IN LINE 
          SA7    E.STR-1
          SX0    OCBUF+320D  SET LWA+1 OF BUFFER
          RJ     CHS         CHANGE STRING(S) 
          ZR     B5,OCT13    IF STRING NOT FOUND
  
*         COPY NEW LINE BACK INTO *E.STR*.
  
          SA1    OCBUF
          MX7    0
          SA6    E.STR-1
          SA7    NOMOD       SET MODIFICATIONS MADE 
 OCT10    BX6    X1 
          SA1    A1+B1
          SA6    A6+1 
          PL     X6,OCT10    IF MORE
          SB6    E.STR
          SB7    E.STR       REPACK TO SAME (RTA DOES NOT CHECK LENGTH) 
          RJ     RTA         REPACK LINE
          SB7    E.STR
          RJ     RTB         TRIM LINE
          MOVE   33D,E.STR,E.LINE 
          RJ     VRY
          SA1    NUMS 
          SX6    B1 
          IX6    X1-X6
          AX1    1
          ZR     X1,NCM      IF CHANGE COMPLETE, EXIT 
          SA6    A1 
 OCT11    RJ     WTF
          RJ     RDF         ADVANCE TO NEXT
          EQ     OCT7        PROCESS NEXT OCTCHANGE 
  
 OCT12    SB2    ARG. 
          RJ     RCP         RESET END OF LINE
          EQ     CER         PROCESS ERROR
  
*         PROCESS STRING NOT FOUND. 
  
 OCT13    SA1    NUMS 
          PL     X1,OCT11    IF NOT 0 OPTION
          EQ     LCT4        EXIT, STRING NOT FOUND 
 PBL      SPACE  4,15 
**        PBL - PROCESS BAD LINE COMMANDS.
* 
*         ENTRY  (X1) = COMMAND DESCRIPTOR WORD. MODIFIER FIELD IS -
*                       -1 FOR DELETE BAD LINE (DBADL). 
*                       +1 FOR FIND BAD LINE (FBADL). 
*                (NUMS) = NUMBER OF LINES TO PROCESS. 
* 
*         USES   A - 1, 2, 6. 
*                X - 1, 2, 3, 4, 5, 6.
* 
*         CALLS   RDF, SCD, VRY, WTF. 
* 
  
  
 PBL      AX1    18 
          SX5    X1          X5 = COMMAND TYPE
          RJ     SCD         SET CODED LINE 
 PBL1     SA1    E.LINE 
          MX2    -6 
          LX1    6
          BX3    -X2*X1      GET FIRST CHARACTER
          SX4    X3-1R9-1    NEGATIVE, IF OK
          SX3    X3-1R0      POSITIVE, IF OK
          BX3    -X3*X4      NEGATIVE, IF OK
          NG     X3,PBL3     IF LINE NUMBER AT START
          RJ     VRY
          PL     X5,PBL2     IF FBADL COMMAND 
          RJ     RDF         CREAM EXISTING LINE
          MX6    0           SET MODIFICATIONS MADE 
          SA6    NOMOD
 PBL2     SA1    NUMS 
          SX6    B1+
          IX6    X1-X6
          AX1    1
          ZR     X1,NCM      IF FINISHED, EXIT
          SA6    A1+
          NG     X5,PBL1     IF DBADL COMMAND 
 PBL3     RJ     WTF
          RJ     RDF
          EQ     PBL1        PROCESS FBADL
 PLN      SPACE  4,20 
**        PLN - PROCESS LINE NUMBER COMMANDS. 
* 
*         ENTRY  (X1) = COMMAND DESCRIPTOR WORD.
*                COMMAND MODIFIER  (BITS 35-18) CONTAINS THE FUNCTION.
*                =-2, ADDLNS. 
*                =-1, ADDLN.
*                = 0, DELETELN. 
*                = 1, REPLACELN.
*         EXIT   TO *CER*, IF ERROR.
* 
*         USES   A - 1, 2, 3, 6, 7. 
*                X - ALL. 
*                B - 2, 5, 6, 7.
* 
*         CALLS  CDD, RDF, TOP, WTF.
  
  
 PLN      AX1    18 
          SX5    X1 
          SX7    30          DEFAULT BIT COUNT
          SA7    PLNB 
          MX6    30          DEFAULT CHARACTER SIZE 
          SB2    X1+B1
          PL     B2,PLN0     IF NOT ADDLNS
          MX6    36          LENGTHEN CHARACTER MASK
 PLN0     SA6    PLNA 
          RJ     TOP         REWIND FILES 
          SA1    NUMS 
          MX7    0
          BX6    X1 
          SA2    A1+B1
          NZ     X6,PLN0.1   IF STARTING LINE NUMBER NOT ZERO 
          SX6    B1          SET TO DEFAULT 
 PLN0.1   SA7    NOMOD       SET MODIFICATIONS FLAG 
          SA6    A1+
          BX7    X2 
          NZ     X7,PLN0.2   IF STEP IS NOT ZERO
          SX7    B1 
 PLN0.2   SA7    A2 
          NG     X5,PLN6     IF NOT TO DELETE LINE NUMBER 
  
*         REMOVE LINE NUMBER. 
  
 PLN1     SA1    E.LINE      REMOVE LINE NUMBERS
          SA2    =40404040404040404040B 
          BX3    X2*X1       4X IF BIT 5 IS SET 
          SB5    60-5 
          LX4    B5,X3       000001 IF BIT 5 WAS SET
          IX4    X3-X4       011111 IF BIT 5 WAS SET
          BX4    X4+X3       111111 IF BIT 5 WAS SET
          SA3    =05050505050505050505B 
          BX6    X4-X1       COMPLEMENT CHARS .GE. 40B
          IX6    X6+X3       1XXXXX IF A NUMBER 
          BX3    X2*X6       100000 IF A NUMBER 
          LX4    B5,X3       000001 IF A NUMBER 
          IX4    X3-X4       011111 IF A NUMBER 
          BX4    X4+X3       111111 IF A NUMBER 
          MX6    1
          PL     X4,PLN9     IF NO LINE NUMBER
 PLN2     AX6    6           EXTEND MASK
          BX7    -X4*X6 
          ZR     X6,PLN3     IF ALL WORD IS NUMBERS 
          ZR     X7,PLN2     IF NOT FINISHED WITH MASK
 PLN3     LX4    B1,X6       MASK OFF EXTRA BIT 
          BX4    X6*X4
          CX0    X4 
          SB7    X0          SHIFT TO LEFT JUSTIFY WORD 
          MX3    -12         END OF LINE CHECKER
          BX0    -X3*X1      0, IF THIS IS LAST WORD IN LINE
          BX6    -X4*X1      REMOVE LINE NUMBER 
          LX6    B7          LEFT JUSTIFY REMAINING 
          LX4    B7          POSITION MASK
 PLN4     ZR     X0,PLN5     IF LAST WORD OF LINE 
          SA1    A1+B1
          BX0    -X3*X1 
          LX1    B7 
          BX2    X4*X1
          IX7    X2+X6
          BX6    -X4*X1 
          SA7    A1-B1
          EQ     PLN4        PROCESS NEXT WORD IN LINE
  
 PLN5     SA6    A1+
 PLN6     ZR     X5,PLN9     IF NOT ADDING LINE NUMBERS 
          SA1    NUMS        GET BASE 
          SA2    A1+B1       INCREMENT
          IX6    X1+X2
          SA6    A1+
          RJ     CDD
          SA3    PLNB 
          SA2    PLNA 
          SB7    X3+
          GE     B7,B2,PLN6.2  IF LINE NUMBER FITS WITHIN FIELD 
 PLN6.1   ZR     X2,PLN10    IF MASK ALREADY MAXIMUM SIZE 
          SB7    B7+6        INCREMENT FIELD SIZE 
          SX7    B7 
          SA7    A3 
          AX2    6           EXTEND MASK
          BX7    X2 
          SA7    A2+
          LT     B7,B2,PLN6.1  IF STILL LARGER THAN FIELD 
 PLN6.2   SA3    =66666666B  BLANK .EOR. 0000 
          BX3    -X2*X3      TRIM MASK TO FIELD SIZE
          LX3    B2          JUSTIFY MASK 
          CX4    X2          DETERMINE SIZE 
          SB6    E.LINE      SET FWA
          BX6    X6-X3
          SB5    B7-60D 
          SB7    X4-60D 
          SA1    B6+         GET FIRST WORD 
          AX6    B5 
          SB5    B6+33D      SET LWA+1
          MX3    -12         END OF LINE BYTE MASK
          BX6    X2*X6       REMOVE EXCESS
  
 PLN7     BX4    -X3*X1 
          AX1    B7 
          BX7    -X2*X1 
          IX7    X7+X6
          BX6    X2*X1
          SA1    B6+B1
          SA7    B6 
          SB6    B6+B1
          ZR     X4,PLN8     IF END OF LINE FOUND 
          LT     B6,B5,PLN7  IF NOT END OF BUFFER 
 PLN8     SA6    B6+
 PLN9     RJ     WTF         STEP TO NEXT LINE
          RJ     RDF
          PL     X5,PLN1     IF TO DELETE LINE NUMBERS
          EQ     PLN6        ADD NEW LINE NUMBERS 
  
 PLN10    BX7    X7-X7       RESTORE FILE 
          MX6    -1          SET NO MODS
          SA7    IWHERE 
          SA6    NOMOD
          RJ     TOP
          SB2    LNTL.       LINE NUMBER TOO LARGE
          EQ     CER         EXIT 
  
 PLNA     DATA   0           MASK STORAGE 
 PLNB     DATA   0           FIELD SIZE STORAGE 
 RDP      SPACE  4,20 
**        RDP - READ/READP PROCESSOR. 
* 
*         ENTRY  (NUMS) = FWA OF PARAMETERS.
*                (NUMS+1) = LWA OF PARAMETERS.
* 
*         EXIT   TO *NCM*.
* 
*         USES   A - 0, 1, 2, 3, 4, 6, 7. 
*                X - 0, 1, 2, 3, 4, 6, 7. 
*                B - 2, 5, 6, 7.
* 
*         CALLS  GAF, GFN, MPR, RCP, RTB, SCP, WTF. 
* 
*         MACROS FERROR, READ, READC, RECALL, RETURN, REWIND, 
*                STATUS, WRITER.
* 
*         NOTES  READ/READP READS ALTERNATE FILES INTO EDIT FILE. 
  
  
 RDP      SA4    INDEX
          SA0    X4-.READP
          RJ     SCP         SET COMMAND PARAMETERS 
          SB2    BFN.*100B+2 NO FILE NAME 
          ZR     X1,CER      IF NO PARAMETERS 
          MX6    0
          SA6    NOMOD       SET MODIFICATIONS MADE 
  
*         GET NEXT FILE NAME AND CONTINUE.
  
 RDP1     RJ     GFN
          SB5    B6-BFN.*100B-2 
          SA3    COPY 
          ZR     B5,RDP12    IF ENCOUNTERED END OF LIST 
          BX7    X3-X6       =7 IF USING COPY FILE
          BX4    X6 
          NZ     X1,RDP11    IF ERROR IN FILE NAME
          SA6    IFN         SAVE NAME
          SA2    E.IN 
          BX2    X2-X6
          AX2    18 
          ZR     X2,RDP13    IF WANT TO READ CURRENT EDIT FILE
          NZ     X7,RDP2     IF NOT READING COPY FILE 
          SA7    A3          CLEAR COPY FILE NAME 
          WRITER FTD,RECALL 
  
 RDP2     SB2    A0 
          NZ     B2,RDP3     IF FILES ARE LOCAL 
          SA4    =0LSCRF
          RJ     GAF         GET OR ATTACH FILE 
          NZ     X6,RDP10    IF FILE NOT OBTAINED 
          SA4    =0LSCRF
  
*         FILE OBTAINED, CHECK READ ACCESS. 
*         (X4) = LOCAL FILE NAME. 
  
 RDP3     MX6    0
          SX7    B1 
          SA6    SFET+5      CLEAR FNT/FST INFORMATION
          BX7    X7+X4
          SA6    A6+B1
          SA7    RFET 
          SA7    SFET 
          STATUS A7,P 
          SB6    FCR.*100B+2
          SA1    SFET+5 
          ZR     X1,RDP10    IF FILE NOT FOUND
          SX2    240000B
          SB6    FCR.*100B+1
          BX2    X2*X1
          NZ     X2,RDP10    IF NOT ALLOWED TO READ FILE
          REWIND RFET,RECALL
 RDP4     READ   RFET 
 RDP5     RECALL RFET 
 RDP6     SA1    RFET+2      SEE IF ANY MORE DATA ON FILE 
          SA2    A1+B1
          BX1    X1-X2
          NZ     X1,RDP7     IF THERE IS DATA ON FILE 
          SA1    RFET 
          LX1    59-0 
          PL     X1,RDP5     IF FET BUSY
          LX1    0-4
          PL     X1,RDP4     IF NOT END OF SOMETHING
          LX1    4-3
          NG     X1,RDP9     IF NOT EOR ON FILE 
          READ   RFET,RECALL
          SA1    RFET+2      LOOK AHEAD FOR NEXT NON-NULL RECORD
          SA2    A1+B1
          BX1    X1-X2
          ZR     X1,RDP9     IF EMPTY RECORD/FILE OR EOI FOUND
          RJ     WTF
          WRITER E.OUT,RECALL 
          EQ     RDP8        READ LINE
  
 RDP7     RJ     WTF
 RDP8     READC  RFET,E.LINE,33D  READ NEXT LINE
          NZ     X1,BTL      IF BAD TEXT LINE FOUND 
          SB7    E.LINE 
          RJ     RTB         CLEAN UP LINE JUST READ
          EQ     RDP6        PROCESS LINE 
  
*         PROCESS END OF FILE READ. 
  
 RDP9     REWIND RFET,RECALL
          SB2    A0 
          NZ     B2,RDP1     IF NOT *READP* 
          RETURN RFET,RECALL
          EQ     RDP1        PROCESS NEXT FILE
  
*         PROCESS ERROR AND PROPER TERMINATION. 
  
 RDP10    FERROR IFN,B6 
          EQ     RDP12       FINISH PROCESS 
  
 RDP11    ERROR  B6 
 RDP12    RJ     RCP         RESET LINE PARAMETERS
          EQ     NCM         EXIT 
  
*         PROCESS READ REQUEST ON CURRENT EDIT FILE.
  
 RDP13    MX1    60          SET -0 
          RJ     MPR         COPY EDIT FILE TO SCRATCH
          SA4    IFN         RELOAD FILE NAME 
          EQ     RDP2        PROCESS COPY 
          TITLE  SUBROUTINE LOCAL TO OVERLAY. 
 GAF      SPACE  4,15 
**        GAF - GET/ATTACH FILE.
* 
*         ENTRY  (X4) = SCRATCH NAME. 
*                (X6) = PERMANENT FILE NAME.
* 
*         EXIT   (X6) = 0, IF FILE OBTAINED.
*                (B6) = ERROR ORDINAL IF (X6) .NE. 0. 
* 
*         USES   A - 3, 6, 7. 
*                X - 1, 3, 6, 7.
*                B - 6. 
* 
*         MACROS ATTACH, GET. 
  
  
 GAF      PS                 ENTRY/EXIT 
          SA6    PFET+8      SET PERM. NAME 
          MX7    -1 
          BX7    -X7+X4 
          SA7    PFET        SET LOCAL NAME 
          GET    A7 
          SA3    X2 
          SX1    36000B 
          BX6    X1*X3
          ZR     X6,GAF      IF GOTTEN, RETURN
          ATTACH X2,,,,R     ATTACH IN READ MODE
          SA3    X2 
          SX1    36000B 
          BX6    X1*X3
          SB6    FCR.*100B+3  SET ERROR ORDINAL 
          EQ     GAF         RETURN 
 RCP      SPACE  4,15 
**        RCP - RESET COMMAND PARAMETERS. 
* 
*         ENTRY  (NUMS+1) = ADDRESS OF WORD CONTAINING LWA+1
*                           OF COMMAND LINE.
* 
*         EXIT   END OF COMMAND FLAG RESET IF NEEDED. 
* 
*         USES   A - 1, 2, 6. 
*                X - 1, 2, 6. 
* 
*         NOTES  SINCE *SCP* SETS (NUMS+1) = 0 IF THERE 
*         ARE NO PARAMETERS, THIS ROUTINE CAN BE CALLED 
*         IF THIS IS TRUE (WILL LOSE UPPER BITS OF WORD 0). 
  
  
 RCP      PS                 ENTRY/EXIT 
          SA1    NUMS+1 
          SA2    X1 
          SX6    X2 
          LX2    1
          NG     X2,RCP      IF REAL EOL, RETURN
          SA6    A2 
          EQ     RCP         RETURN 
 SCP      SPACE  4,15 
**        SCP - SET COMMAND PARAMETERS. 
* 
*         ENTRY  (NUMS) = FWA OF PARAMETERS.
*                (NUMS+1) = LWA+1 OF PARAMETERS.
* 
*         EXIT   (A5) = IF PARAMETERS ARE PRESENT, FWA OF PARAMETERS. 
*                (X5) = FIRST WORD OF PARAMETERS. 
*                (X1) = IF NO PARAMETERS, 0.
*                END OF PARAMETERS SET IN LAST WORD OF PARAMETERS.
* 
*         USES   A - 1, 2, 5, 6.
*                X - 1, 2, 5, 6, 7. 
  
  
 SCP1     SX6    0
          SA6    NUMS+1 
  
 SCP      PS                 ENTRY/EXIT 
          SA1    NUMS 
          SA2    A1+B1
          MX7    1
          ZR     X1,SCP1     IF NO PARAMETERS 
          SA2    X2 
          SA5    X1 
          BX6    X7+X2       SET END OF STRING
          SA6    A2 
          EQ     SCP         RETURN 
          TITLE  LOCAL COMMON DECKS AND BUFFERS.
**        COMMON DECKS. 
* 
  
  
*CALL COMCMVE 
  
          USE    SETCHAR
          DATA   0           SET END OF CHARACTER PRESET
          USE    *
 BUFFERS  SPACE  4
**        BUFFERS.
* 
  
  
          USE    BUFFERS
 .A       MAX    MAXWD*2+1,BUFRL
 OCBUF    BSS    0
 RBUF     BSS    0
          BSSZ   .A+1 
 LWA      EQU    *+17B       SET OVERLAY LWA
          END 
