TITLE 'TELEFILE ASSEMBLY PROGRAM - APCCI'
         PCC      0
         SPACE    6
*   %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
*   %%%%%     MODULE NAME:     APCCI                   %%%%%
*   %%%%%     LAST UPDATED:    MAR 07, 1984            %%%%%
*   %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
         SPACE    2
         SPACE    12
*        T E L E F I L E    P R O P R I E T A R Y    P R O D U C T
         SPACE    2
*        THIS DOCUMENT INCLUDES DATA AND INFORMATION WHICH IS CONSIDERED
*        PROPRIETARY TO TELEFILE COMPUTER PRODUCTS, INC. REPRODUCTION,
*        DUPLICATION, DISCLOSURE OR DISSEMINATION, IN WHOLE OR IN PART,
*        TO OTHERS THAN REPRESENTATIVES OF THE UNITED STATES GOVERNMENT
*        SHALL NOT BE MADE WITHOUT PRIOR WRITTEN AUTHORIZATION OF TELEFILE
*        COMPUTER PRODUCTS, INC. NOTWITHSTANDING THE FOREGOING, USE OF
*        THE DATA OR INFORMATION IN WHOLE OR IN PART FOR DESIGN,
*        PROCUREMENT OR MANUFACTURE IS STRICTLY FORBIDDEN.
         PAGE
         SPACE    12
*        T E L E F I L E    P R O P R I E T A R Y    P R O D U C T
         SPACE    2
*        THIS DOCUMENT INCLUDES DATA AND INFORMATION WHICH IS CONSIDERED
*        PROPRIETARY TO TELEFILE COMPUTER PRODUCTS, INC. REPRODUCTION,
*        DUPLICATION, DISCLOSURE OR DISSEMINATION, IN WHOLE OR IN PART,
*        TO OTHERS THAN REPRESENTATIVES OF THE UNITED STATES GOVERNMENT
*        SHALL NOT BE MADE WITHOUT PRIOR WRITTEN AUTHORIZATION OF TELEFILE
*        COMPUTER PRODUCTS, INC. NOTWITHSTANDING THE FOREGOING, USE OF
*        THE DATA OR INFORMATION IN WHOLE OR IN PART FOR DESIGN,
*        PROCUREMENT OR MANUFACTURE IS STRICTLY FORBIDDEN.
         PAGE
BPMUTS   EQU      2
RBM      EQU      3
SYS      EQU      BPMUTS
XAPDATA  DSECT    0                 OVERLAY DATA AREA
XAPD1    DSECT    0                 OVERLAY DATA AREA
CCI1     CSECT    1                 CODE SECTION
         DO       SYS=BPMUTS
         SYSTEM   BPM
         M:PT     1                 GENERATE FPT'S IN PROTECT. TYPE 1
         FIN
         DO       SYS=RBM
         SYSTEM   RBM
         FIN
*
         SYSTEM   AP%IL
*
*        XEROX ASSEMBLY PROGRAM CONTROL CARD INTERPRETER.
*
         REF      AC%FLAG
         REF      PD%FLAG
*
         DEF      CTL%CARD%INTERPRETER     (ENTRY POINT.)
         DEF      STDERROR
         DEF      AP%ABORT          (ENTRY POINT)
*
         REF      CO%SIZE           BYTE SIZE OF CO RECORD
         REF      M:C
         REF      ERR%%X1,ERR%%X3
         REF      ERR%%X2,ERR%%X4
         REF      ABN%%X1,ABN%%X3
         REF      ABN%%X2,ABN%%X4
         REF      ABN%%STD
         REF      ABORT
         REF      ACCOUNTS
         REF      #ACCTS
         REF      CORRESWD          FLAGS INDIC. IDEN. DCB ASSIGNMENTS
         REF      ERR%%STD                                            *D-CCI
         REF      LOWCORE
         REF      ENDCORE
         REF      MAJLINE,SUBLINE   ASSEMBLY LINE NUMBER
         REF      SEGMENT#          AP OVERLAY SEGMENT
*
         DO       SYS=BPMUTS
         REF      INIT%TUNITS
         REF      PAGETBL
         REF      SO%ADJ%FPT
         REF      SO%ADJ%NAME
         REF      SO%KEY
         FIN
*
         REF      SYSLEVEL
         REF      MPX1
         REF      SYSNAME
         REF      CLOSE%FILES
         REF      ROOTRTN
         REF      SAVAREA
         REF      XAPCODE
         REF      X3BUF,WDX3SIZE
         REF      WRITEDO,WRITELO
         REF      LSTBF
         REF      CLRLSTBF
         REF      OPTION%FLAGS
         REF      PGLINES
         REF      SDFCON
         REF      SDFSYS
         REF      SDFSYS%SIZE
         REF      LINE%TYPE
         REF      ASSEMBLE%FLAG
         REF      NUM%PAGE%LINES
         REF      ERR%%BO,ERR%%CI,ERR%%CO,ERR%%DO
         REF      ERR%%GO,ERR%%LO,ERR%%SI,ERR%%SO
         REF      BYX1SIZE,BYX3SIZE
         REF      BO%IDWDS,CO%IDWDS
         DO       SYS=BPMUTS
         REF      DO%ONLINE
         REF      LO%ONLINE
         REF      M:UC
         REF      F:X1,F:X2,F:X3,F:X2KF,F:X5
         FIN
         REF      F:STD,F:SYS
         REF      TRAPLOC
        REF      M:SI,M:SO,M:CI,M:CO
         REF      M:BO,M:DO,M:GO,M:LO
*
         DO       SYS=BPMUTS
         SREF     J:JIT,JOPT
         SREF     TPEXT
         SREF     TPOVT
         SREF     TUEXT
         SREF     TUOVT
         FIN
*
         DO       SYS=RBM
         REF      M:X1,M:X2,M:X3,M:X4,M:X5
         FIN
*
         DEF      CCI1
*
*   EQUATES FOR ABORT
*
ABORT9   EQU      9
ABORT10  EQU      10
ABORT11  EQU      11
ABORT12  EQU      12
*
*        REGISTERS.
*
R0       EQU      0
X1       EQU      1                 TEMP INDEX.
X2       EQU      2                 INDEX TO CURRENT CHARACTER.
X3       EQU      3
X4       EQU      4
X5       EQU      5
X6       EQU      6
X7       EQU      7                 INTERNAL LINK REGISTER.
R8       EQU      8                 OPTION-NAME ACCUMULATOR.
R9       EQU      9                 CURRENT CHARACTER.
R10      EQU      10                TEMP.
R11      EQU      11                TEMP.
R12      EQU      12                TEMP.
R13      EQU      13                TEMP.
R14      EQU      14
R15      EQU      15                EXTERNAL LINK REGISTER.
IOADD    EQU      8
IOSIZE   EQU      9
IORL     EQU      10
SR1      EQU      8
SR2      EQU      9
SR3      EQU      10
SR4      EQU      11
AR       EQU      0                 ABORT REGISTER
AM       EQU      1                 ABORT MESSAGE REGISTER
XW       EQU      2
XT       EQU      4                 TEMP (EVEN)
XT1      EQU      XT+1              TEMP (ODD)
XT2      EQU      XT+2              TEMP
RL       EQU      7                 SUBROUTINE LINK REGISTER
*                                                                     *D-CCI
*  MISCELLANEOUS                                                      *D-CCI
*                                                                     *D-CCI
ADDRFLD  EQU      X'1FFFF'          WORD ADDRESS FIELD MASK           *D-CCI
EADRFLD  EQU      X'1FFFE'          (EVEN) WORD ADDRESS FIELD MASK    *D-CCI
*
*  SALUTE MESSAGE
*
SALUTE%START      TEXT ' TELEFILE ASSEMBLY PROGRAM '
                  DATA,1 X'0D',X'40',C'O',C'P'
                  TEXT 'TIONS '
SALUTE%END        DATA   X'16000000'
*
*  EQUATES FOR LOCATIONS WITHIN RBM
*
CPRABNEO EQU      4                 DCB ABN FIELD OFFSET (CP-R)       *D-CCI
CPRERREO EQU      3                 CPR ERR FIELD OFFSET (CP-R)       *D-CCI
D1       EQU      6                 TYPE CODE FOR 'D1' AREA ON DISK
K:BPEND  EQU      X'153'            FWA OF USABLE BACKGROUND
K:BCKEND EQU      X'141'            LWA OF USABLE BACKGROUND
K:PAGE   EQU      X'174'            BYTE 0 HAS NO. LINES ON PRINT PAGE
K:CCBUF  EQU      X'144'            CONTAINS LOCATION OF CONTROL CARD
* UTS JIT OPTION BITS.  MASKS FOR BITS WITHIN JOPT WORD
LOBIT    EQU      1                 BIT 31. SET BY TEL 'LIST'
GOBIT    EQU      X'80'             BIT 24. SET BY TEL 'OUTPUT'
DOBIT    EQU      X'100'            BIT 23. SET BY TEL 'COMMENT'
*
*        SIMPLE OPTIONS - THOSE REQUIRING ONLY A PRESENCE FLAG.
*        TO ADD A SIMPLE OPTION USE THE 'OPTION' COMMAND WITH LF(1) =
*        FLAG NAME & AF(1) = OPTION-STRING (<= 4 CHARACTERS).  DON'T
*        FORGET TO ADD CORRESPONDING ENTRY TO OPTION%FLAGS TABLE (ROOT).
*
#SIMPLE%OPTIONS   SET 0
*
OPTION   CNAME
         PROC
         REF      LF                (THESE ARE IN THE ROOT)
         DATA     AF(1)
#SIMPLE%OPTIONS   SET #SIMPLE%OPTIONS+1
         PEND
         USECT    CCI1
OPTION%NAMES   RES 0
*
BA%FLAG  OPTION   'BA'
BO%FLAG  OPTION   'BO'
CI%FLAG  OPTION   'CI'
CO%FLAG  OPTION   'CO'
DC%FLAG  OPTION   'DC'
GO%FLAG  OPTION   'GO'
LO%FLAG  OPTION   'LO'
LS%FLAG  OPTION   'LS'
LU%FLAG  OPTION   'LU'
ND%FLAG  OPTION   'ND'
NS%FLAG  OPTION   'NS'
SD%FLAG  OPTION   'SD'              SYMBOLIC DEBUGGING OUTPUT
SI%FLAG  OPTION   'SI'
SO%FLAG  OPTION   'SO'
SU%FLAG  OPTION   'SU'
         PAGE
         LOCAL    %05,%10,%20,%30
CTL%CARD%INTERPRETER EQU %
         STW,R15  ROOTRTN           SAVE RETURN ADDRESS
*
*   SET UP CURRENT TIMER UNIT COUNT FOR STATUS
*        REPORTING BY ON-LINE BREAK RECEIVER.
*
         DO       SYS=BPMUTS
         LW,XT    J:JIT+TPEXT       GET CURRENT CHARGEABLE
         AW,XT    J:JIT+TPOVT         TIME UNITS AND SAVE
         AW,XT    J:JIT+TUEXT         FOR LATER STATUS.
         AW,XT    J:JIT+TUOVT
         STW,XT   INIT%TUNITS
         LI,XT    0
         STW,XT   SO%KEY
         FIN
*
         LW,X1    ='    '
         STW,X1   BLANKS
         STW,X1   BLANKS+1
         LI,X1    0
         STW,X1   LINE%TYPE
         STW,X1   SDFCON            INITIAL SYSTEM NAME TABLE LENGTH
         STW,X1   SYSLEVEL
         STW,X1   #ACCTS
         STW,X1   BLANK%SWITCH      SET TO IGNORE BLANKS
         STW,X1   PRINT%SWITCH
         STW,X1   PGLINES
         STW,X1   SEGMENT#
         BAL,IORL OPENC
         BAL,IORL OPENDO
         BAL,IORL OPENLO
         M:DEVICE M:LO,(VFC)
         DO       SYS=BPMUTS
         MTW,0    *X'4F'            ARE WE ONLINE?
         BGEZ     %05               BRANCH IF NO.
         LW,X1    J:JIT+JOPT
         CI,X1    LOBIT             SET LO%FLAG IF 'LIST' BIT IS ON
         BAZ      %+2               IT'S OFF
         MTW,+1   LO%FLAG
         CI,X1    GOBIT             SET GO%FLAG IF 'OUTPUT' IS ON
         BAZ      %+2               IT'S OFF
         MTW,+1   GO%FLAG
         CAL1,1   =X'2C00006E'      SET '>' AS PROMPT CHARACTER
         M:WRITE  M:UC,(BUF,SALUTE%START),(SIZE,38)
         BAL,X7   READ%CTL%CARD     READ CONTROL CARD.
         B        %20
         ELSE
         LI,X1    0
         LV,XT    D1
         STB,XT   ACCOUNTS          PRESET DEFAULT ACCOUNT AREA
         MTW,+1   #ACCTS            SET DEFAULT # ACCTS TO 1
%30      RES      0
         LW,R8    *K:CCBUF,X1       MOVE CONTROL CARD
         STW,R8   CTL%CARD,X1       TO CTL%CARD AREA
         AI,X1    1
         CI,X1    20
         BL       %30
         B        %10
         FIN
%05      RES      0
         BAL,X7   READ%CTL%CARD     READ CONTROL CARD
%10      RES      0
         LI,X2    0
         BAL,X7   GET%NEXT%NONBLANK SKIP LEADING BLANKS
%12      RES      0
         BAL,X7   GET%NEXT%CHAR     SKIP TO THE
         CI,R9    ' '                 TERMINATOR AFTER
         BE       %20                 THE PROCESSOR NAME
         CI,R9    ','
         BNE      %12
%20      BAL,X7   GET%NEXT%NONBLANK GET 1ST OPTION CHARACTER.
         CI,R9    '.'               IS IT PERIOD?
         BE       SET%DEFAULTS      BRANCH IF YES.
         AI,X2    -1                BACK UP FOR RESCAN OF 1ST CHAR.
         B        COLLECT%OPTION    GO GET OPTIONS.
         PAGE
         LOCAL    %10
NEXT%OPTION       EQU %
         CI,R9    ','               IS CURRENT CHAR A COMMA?
         BE       COLLECT%OPTION    BRANCH IF YES.
         CI,R9    '.'               IS IT A PERIOD?
         BE       OPTIONS%DONE      BRANCH IF YES.  (ALL DONE.)
         B        BAD%SYNTAX        IT'S STRANGE; REPORT ERROR.
COLLECT%OPTION    EQU %
         LI,R8    0                 CLEAR OPTION-NAME ACCUMULATOR.
%10      BAL,X7   GET%NEXT%NONBLANK GET A CHARACTER.
         CI,R9    'A'               IS IT LETTER OR DIGIT?
         BL       SEARCH%OPTIONS    BRANCH IF NO.
         SLS,R8   +8                SHIFT PREVIOUS CHARS OVER.
         OR,R8    R9                MERGE IN NEWEST.
         B        %10               GO GET ANOTHER.
         PAGE
         LOCAL    %10,%20,%30,%40,%50,%60,%70,%80,%90
         LOCAL    %100,%110,%120
         LOCAL    %130,%140,%150,%160,%170,%180
         LOCAL    %200,%210,%220,%125
SEARCH%OPTIONS    EQU %
         LI,X1    #SIMPLE%OPTIONS   SEARCH ALL SIMPLE OPTIONS.
%10      CW,R8    OPTION%NAMES-1,X1 IS IT THIS ONE?
         IF,EQ
         MTW,+1   OPTION%FLAGS-1,X1
         B        NEXT%OPTION
*
         FI
         BDR,X1   %10               TRY ANOTHER.
*
*   NOT A SIMPLE OPTION - IS IT ONE OF THE SPECIAL OR
*      AUGMENTED OPTIONS?
*
         CI,R8    'CN'
         IF,EQ
         MTH,+1   DC%FLAG
         B        NEXT%OPTION
*
         FI
         CI,R8    'PD'
         BE       %40               BRANCH IF YES.
         CI,R8    'AC'              IS IT 'AC'?
         BE       %90               BRANCH IF YES.
         CI,R8    'SB'              IS IT 'SB'?
         BE       %130              BRANCH IF YES.
         CI,R8    'SC'              IS IT 'SC'?
         BE       %140              BRANCH IF YES.
         B        ILLEGAL%OPTION    NOT FOUND; REPORT ERROR.
%40      MTW,+1   PD%FLAG           SET FLAG.
         CI,R9    '('               ARE THERE SYSTEM NAMES?
         BNE      NEXT%OPTION       BRANCH IF NO.
         LI,X6    0                 INITIALIZE NAME-TABLE INDEX.
         STW,X6   SDFCON            CLEAR SDFSYS SIZE & NO. OF ENTRIES
%50      LW,X5    X6                SAVE INDEX FOR STORING LENGTH.
%60      BAL,X7   GET%NEXT%CHAR     GET CHARACTER.
         CI,R9    ')'               ARE WE FINISHED WITH ALL NAMES?
         BE       %70               BRANCH IF YES.
         CI,R9    ','               ARE WE FINISHED WITH THIS NAME?
         BE       %70               BRANCH IF YES.
         AI,X6    +1                BUMP INDEX.
         CI,X6    SDFSYS%SIZE       HAVE WE EXCEEDED TABLE SIZE?
         BG       BAD%SYNTAX        BRANCH IF YES.
         STB,R9   SDFSYS,X6         STORE CHAR IN TABLE.
         B        %60               GO GET ANOTHER CHAR.
%70      MTW,+1   SDFCON            BUMP NAME COUNT.
         LW,R8    X6                CALCULATE NAME
         SW,R8    X5                LENGTH.
         BEZ      BAD%SYNTAX        ZERO LENGTH = ERROR.
         STB,R8   SDFSYS,X5         STORE LENGTH.
         CI,R9    ')'               ARE ALL NAMES FINISHED?
         BE       %80               BRANCH IF YES.
         AI,X6    +1                BUMP INDEX.
         B        %50               GO GET NEXT NAME.
*
%80      RES      0
         AI,X6    +4                CONVERT BYTES
         SAS,X6   -2                TO WORDS.
         STH,X6   SDFCON            STORE COUNT OF BYTES.
         BAL,X7   GET%NEXT%NONBLANK GET CHAR.  (SHOULD BE ',' IF MORE.)
         B        NEXT%OPTION       GO PROCESS NEXT OPTION.
%90      MTW,+1   AC%FLAG           INDICATE OPTION.
         DO       SYS=RBM
         MTW,-1   #ACCTS            DELETE LAST ACCOUNT  (SP AREA)
         FIN
         CI,R9    '('               IF NOT '('
         BNE      BAD%SYNTAX        THEN ERROR.
%100     LD,R12   8BLANKS           INITIALIZE ACCT-NAME ACCUMULATOR.
         LI,X5    0                 INITIALIZE ACCUM. INDEX.
%110     BAL,X7   GET%NEXT%CHAR     GET NEXT CHAR.
         CI,R9    ','               IS IT COMMA?
         BE       %120              BRANCH IF YES.
         CI,R9    ')'               IS IT ')'?
         BE       %120              BRANCH IF YES.
         STB,R9   R12,X5            STORE INTO ACCUM.
         AI,X5    +1                BUMP INDEX.
         CI,X5    +8                MORE THAN 8
         BG       BAD%SYNTAX        CHARS IS ERROR.
         B        %110              GO GET NEXT CHAR.
         DO       SYS=BPMUTS
%120     LW,X5    #ACCTS            GET ACCT-NAME COUNT.
         MTW,+1   #ACCTS            INCREMENT COUNT (IN MEMORY).
         STD,R12  ACCOUNTS,X5       USE FORMER COUNT AS STORE INDEX.
         CI,X5    8
         BL       ACCT%OK
         FIN
         DO       SYS=RBM
%120     RES      0
         CI,X5    2                 ACCOUNTS MUST BE TWO CHARS
         BNE      BAD%SYNTAX
         LI,X5    16                TOTAL NUMBER OF ACCOUNTS
NEXT%AC  RES      0
         CW,R12   AC%TABLE-1,X5     FIND THE ACCOUNT NAME
         BE       AC%FND
         BDR,X5   NEXT%AC
         B        BAD%SYNTAX
AC%FND   RES      0
         LW,X1    #ACCTS
         CI,X1    15                TEST FOR TOO MANY
         BL       ACCT%OK
         FIN
         ABORT    ABORT9            TOO MANY ACCOUNT AREAS SPECIFIED
ACCT%OK  RES      0
         DO       SYS=RBM
         AI,X5    -1
         LB,X7    AC%CODE,X5        ACCOUNT CODE
         STB,X7   ACCOUNTS,X1
         MTW,+1   #ACCTS            BUMP NUMBER OF ACCTS
         FIN
         CI,R9    ','               IS THERE ANOTHER NAME?
         BE       %100              BRANCH IF YES.
         DO       SYS=RBM
         LI,X7    D1                ADD D1 AREA AS LAST ACCT.  /27062/*D-CCI
         AI,X1    1
         STB,X7   ACCOUNTS,X1
         MTW,+1   #ACCTS            AND BUMP # OF ACCTS
         FIN
%125     RES      0
         BAL,X7   GET%NEXT%NONBLANK GET CHAR.  (SHOULD BE '.' OR ',')
         B        NEXT%OPTION       GO PROCESS NEXT OPTION.
%130     RES      0
         LI,R14   BO%FLAG
         LI,X3    BO%IDWDS
         B        %150
%140     RES      0
         LI,R14   CO%FLAG
         LI,X3    CO%IDWDS
%150     RES      0
         LI,X7    8                 SET NO. OF DIGITS TO 8
         STB,X7   *R14
         MTH,1    *R14              SET SB OR SC FLAG
         LI,X7    0
         STW,X7   0,X3              CLEAR THE 3 ID/SEQ-NO
         STW,X7   1,X3                WORDS
         STW,X7   2,X3
         STW,X7   3,X3              CLEAR THE INITIAL SEQNO. WORD
         STW,X3   SAVEREGS          SAVE FOR ADDRESS OF SEQUENCE NO.
         CI,R9    '('               IS THERE AN IDENT STRING
         BNE      NEXT%OPTION       NO. GO GET NEXT OPTION
         SLS,X3   1                 CONVERT TO HALFWORD ADDRESS
%160     RES      0
         BAL,X7   GET%NEXT%CHAR     NEXT IDENT CHARACTER
         CI,R9    ')'
         BE       %125              END OF IDENT. GO READ TRAILING ','
         CI,R9    '('               IS THERE AN INITIAL SEQUENCE NUMBER
         BE       GETSEQ            YES. GO CONVERT IT
         MTB,-1   *R14              SUBT. 1 FROM BYTE COUNT
         BLZ      BAD%SYNTAX        MORE THAN 8 IDENT. CHARACTERS
         LI,X7    X'3F'             TRIM IDENT CHAR TO 6 BITS
         AND,X7   R9
         LH,R9    IDENTBL,X7        TRANSLATE TO A 12-BIT COLUMN CODE
         LB,X7    SFTBL,X1          GET NEXT SHIFT AMOUNT
         SLS,R9   0,X7              SHIFT 12-BIT CODE TO NEXT FIELD
         CI,X1    3                 IS THIS 1ST OR 5TH CHARACTER
         BAZ      %180                YES, DON'T BUMP HALFWORD ADDRESS
         LH,X7    R9                STORE HIGH ORDER
         AH,X7    0,X3                BITS IN
         STH,X7   0,X3                CURRENT HALFWORD
         AI,X3    1                 BUMP HALFWORD ADDRESS
%180     RES      0
         AH,R9    0,X3              STORE LOW ORDER BITS
         STH,R9   0,X3
         AI,X1    1                 BUMP INDEX TO SHIFT TABLE
         B        %160
GETSEQ   RES      0
         LW,X3    SAVEREGS          GET ADDR (-3) OF SEQUENCE NO.
GETSEQ1  RES      0
         BAL,X7   GET%NEXT%CHAR     NEXT SEQUENCE CHARACTER
         AI,R9    -'0'              IS IT NUMERIC
         BL       SEQEND              NO, TEST FOR RT PAREN
         CI,R9    9                 ERROR IF GREATER THAN 9
         BG       BAD%SYNTAX
         LW,X7    3,X3              PARTIAL SEQUENCE WORD
         MI,X7    10
         AW,X7    R9
         STW,X7   3,X3
         B        GETSEQ1
SEQEND   RES      0
         CI,R9    ')'-'0'           TERMINATOR MUST BE RT PAREN
         BNE      BAD%SYNTAX
         BAL,X7   GET%NEXT%CHAR     GET TERMINATOR FOR IDENT
         CI,R9    ')'               IT MUST ALSO BE RT PAREN
         BE       %125
         B        BAD%SYNTAX
SFTBL    DATA,1   4,8,12,16,4,8,12,16
         BOUND    4
ILLEGAL%OPTION    EQU %
         AI,R8    0                 IGNORE
         BEZ      NEXT%OPTION       NULL OPTION.
         OR,R8    ='    '           INSERT LEADING BLANKS.
         LI,X7    MSGS              SIZE OF MESSAGE
         LW,R10   OPTION%IGNORED-1,X7
         STW,R10  BUF%PRINT-1,X7    MOVE MESSAGE TO PRINT AREA
         BDR,X7   %-2
         STW,R8   BUF%PRINT-1+MSGS  STORE UNKNOWN OPTION
         M:PRINT  (MESS,BUF%PRINT)
         B        NEXT%OPTION       GO GET NEXT OPTION.
         PAGE
         LOCAL    %10
BAD%SYNTAX        EQU %
*        PRINT CONTROL CARD IN ERROR, PRINT ERROR POINTER,
*        PRINT ERROR MESSAGE, EXIT TO MONITOR.
         M:WRITE  M:LL,(BUF,CTL%CARD%DISPLAY),(SIZE,88)
         LD,R12   8BLANKS
         LI,X1    +10
%10      STD,R12  CTL%CARD%DISPLAY,X1
         BDR,X1   %10
         LI,R8    ':'
         STB,R8   CTL%CARD,X2
         M:WRITE  M:LL,(BUF,CTL%CARD%DISPLAY),(SIZE,88)
         ABORT    ABORT10           CONTROL CARD ERROR
         PAGE
         LOCAL    %05,%10,%15,%20
GET%NEXT%CHAR     EQU %
         MTW,+1   BLANK%SWITCH      DON'T IGNORE BLANKS.
GET%NEXT%NONBLANK EQU %
         STW,X7   GET%NEXT%RETURN   SAVE RETURN.
%05      CI,X2    +79               ARE WE AT END OF RECORD?
         BGE      %15               BRANCH IF YES.
         AI,X2    +1                BUMP INDEX TO NEXT CHAR.
         LB,R9    CTL%CARD,X2       GET CHARACTER.
         CI,R9    X'15'             IS IT LINE-FEED?
         BE       %10               BRANCH IF YES.
         CI,R9    X'0D'             IS IT CARRIAGE-RETURN?
         BE       %10               BRANCH IF YES.
         MTW,0    BLANK%SWITCH      SHALL WE IGNORE BLANKS?
         BNEZ     %20               BRANCH IF NO.
         CI,R9    ' '               IS IT A BLANK?
         BE       %05               BRANCH IF YES.
         CI,R9    ';'               IS IT SEMICOLON?
         BNE      %20               BRANCH IF NO.
         BAL,X7   READ%CTL%CARD     READ CONTINUATION RECORD.
         B        %05               GO GET CHARACTER.
%10      LI,R9    ' '               REPLACE LF OR
         STB,R9   CTL%CARD,X2       CR WITH BLANK.
%15      LI,R9    '.'               RETURN FAKE PERIOD.
         LI,X2    +80
%20      LI,X7    0                 INSURE
         STW,X7   BLANK%SWITCH      SWITCH OFF.
         B        *GET%NEXT%RETURN  RETURN.
         PAGE
         LOCAL    %10,%20
READ%CTL%CARD     EQU %
         LI,X1    +10                   CLEAR
         LD,R12   8BLANKS               BUFFER
%10      STD,R12  CTL%CARD%DISPLAY,X1   TO
         BDR,X1   %10                   BLANKS.
         M:READ   M:C,(BUF,CTL%CARD),(SIZE,80)
         LI,X2    -1                INITIALIZE BUFFER INDEX.
         DO       SYS=BPMUTS
         MTW,0    *X'4F'            ARE WE ONLINE?
         BLZ      0,X7              RETURN IF YES.
         MTW,0    PRINT%SWITCH      IS THIS 1ST CTL CARD?
         BEZ      %20
         FIN
         M:WRITE  M:LL,(BUF,CTL%CARD),(SIZE,80)
%20      MTW,+1   PRINT%SWITCH      SET TO PRINT CONTINUATIONS.
         B        0,X7              RETURN.
         PAGE
* EQUATES FOR COLUMN NUMBERS USED IN IDENTBL
#12      EQU      X'800'            COLUMN 12
#11      EQU      X'400'            COLUMN 11
#0       EQU      X'200'            COLUMN 0
#1       EQU      X'100'            COLUMN 1
#2       EQU      X'080'            COLUMN 2
#3       EQU      X'040'            COLUMN 3
#4       EQU      X'020'            COLUMN 4
#5       EQU      X'010'            COLUMN 5
#6       EQU      X'008'            COLUMN 6
#7       EQU      X'004'            COLUMN 7
#8       EQU      X'002'            COLUMN 8
#9       EQU      X'001'            COLUMN 9
IDENTBL  RES      0
         DATA,2   0                 BLANK
         DATA,2   #12+#1            A        12-1
         DATA,2   #12+#2            B        12-2
         DATA,2   #12+#3            C        12-3
         DATA,2   #12+#4            D        12-4
         DATA,2   #12+#5            E        12-5
         DATA,2   #12+#6            F        12-6
         DATA,2   #12+#7            G        12-7
         DATA,2   #12+#8            H        12-8
         DATA,2   #12+#9            I        12-9
         DATA,2   #12+#8+#2         CENT     12-8-2
         DATA,2   #12+#8+#3         DEC PT   12-8-3
         DATA,2   #12+#8+#4         LESS     12-8-4
         DATA,2   0                 LT PAREN
         DATA,2   #12+#8+#6         PLUS     12-8-6
         DATA,2   #12+#8+#7         OR       12-8-7
         DATA,2   #12               AND      12
         DATA,2   #11+#1            J        11-1
         DATA,2   #11+#2            K        11-2
         DATA,2   #11+#3            L        11-3
         DATA,2   #11+#4            M        11-4
         DATA,2   #11+#5            N        11-5
         DATA,2   #11+#6            O        11-6
         DATA,2   #11+#7            P        11-7
         DATA,2   #11+#8            Q        11-8
         DATA,2   #11+#9            R        11-9
         DATA,2   #11+#8+#2         EXCLAM   11-8-2
         DATA,2   #11+#8+#3         DOLLAR   11-8-3
         DATA,2   #11+#8+#4         ASTERISK 11-8-4
         DATA,2   0                 RT PAREN
         DATA,2   #11+#8+#6         SEMICLN  11-8-6
         DATA,2   #11+#8+#7         NOT      11-8-7
         DATA,2   #11               MINUS    11
         DATA,2   #0+#1             SLASH    0-1
         DATA,2   #0+#2             S        0-2
         DATA,2   #0+#3             T        0-3
         DATA,2   #0+#4             U        0-4
         DATA,2   #0+#5             V        0-5
         DATA,2   #0+#6             W        0-6
         DATA,2   #0+#7             X        0-7
         DATA,2   #0+#8             Y        0-8
         DATA,2   #0+#9             Z        0-9
         DATA,2   #12+#11                    12-11
         DATA,2   #0+#8+#3          COMMA    0-8-3
         DATA,2   #0+#8+#4          PERCENT  0-8-4
         DATA,2   #0+#8+#5          UNDSCORE 0-8-5
         DATA,2   #0+#8+#6          GREATER  0-8-6
         DATA,2   #0+#8+#7          QUESTION 0-8-7
         DATA,2   #0                0        0
         DATA,2   #1                1        1
         DATA,2   #2                2        2
         DATA,2   #3                3        3
         DATA,2   #4                4        4
         DATA,2   #5                5        5
         DATA,2   #6                6        6
         DATA,2   #7                7        7
         DATA,2   #8                8        8
         DATA,2   #9                9        9
         DATA,2   #8+#2             COLON    8-2
         DATA,2   #8+#3             NUMBER   8-3
         DATA,2   #8+#4             AT       8-4
         DATA,2   #8+#5             PRIME    8-5
         DATA,2   #8+#6             EQUAL    8-6
         DATA,2   #8+#7             QUOTES   8-7
         BOUND    4
         PAGE
         LOCAL    %05,%10,%20,%30
SET%DEFAULTS      EQU %
         MTW,+1   SI%FLAG           SET
         MTW,+1   LO%FLAG           DEFAULT
         MTW,+1   GO%FLAG           OPTIONS.
OPTIONS%DONE      EQU %
         BAL,RL   IGNORE%TRAPS
*
*   'DC' OVERRIDES 'CN' IF BOTH WERE SPECIFIED
*
         LH,R8    DC%FLAG
         IF,NZ
         LW,R8    DC%FLAG
         CI,R8    X'FFFF'
         IF,ANZ
         LI,R8    1
         STW,R8   DC%FLAG
         FI
         FI
         MTW,0    PD%FLAG           FORCE NO STD DEF FILE READ
         BEZ      %+2                 IF WE'RE PRODUCING ONE
         MTW,1    ND%FLAG
*  SET ASSEMBLE%FLAG TO REFLECT WHETHER THE DEFGEN PASS IS REQUIRED
         LW,R8    GO%FLAG
         OR,R8    LO%FLAG
         OR,R8    BO%FLAG
         STW,R8   ASSEMBLE%FLAG
         DO       SYS=BPMUTS
         BNEZ     %05               IT'S REQUIRED
*  IF ON-LINE, DEFGEN IS REQ'D IF 'LIST','OUTPUT',OR 'COMMENT' IS ON
         LW,R8    *X'4F'
         BGEZ     %05               BRANCH IF NOT ON LINE
         LI,R8    LOBIT+GOBIT+DOBIT
         AND,R8   J:JIT+JOPT
         STW,R8   ASSEMBLE%FLAG
         FIN
%05      RES      0
         DO       SYS=BPMUTS
         MTW,0    *X'4F'            IF ON-LINE, SET SI AS DEFAULT
         BGEZ     %06               BRANCH IF NOT ON-LINE
         LW,R8    CI%FLAG
         BNEZ     %06
         MTW,+1   SI%FLAG
         FIN
%06      RES      0
         MTW,0    SI%FLAG           IS THERE SI?
         BEZ      %10               BRANCH IF NO.
         MTW,+1   LINE%TYPE         INDICATE SI.
%10      MTW,0    CI%FLAG           IS THERE CI?
         BEZ      TEST%SO           BRANCH IF NO.
         MTW,2    LINE%TYPE
TEST%SO  RES      0
         MTW,0    SO%FLAG
         BEZ      TEST%CO
         BAL,IORL OPENSO
TEST%CO  RES      0
         MTW,0    CO%FLAG
         BEZ      TEST%BO
         BAL,IORL OPENCO
TEST%BO  RES      0
         MTW,0    BO%FLAG
         BEZ      TEST%GO
         BAL,IORL OPENBO
TEST%GO  RES      0
         MTW,0    GO%FLAG
         BEZ      TEST%TEMPS
         BAL,IORL OPENGO
TEST%TEMPS  RES   0
         LW,R8    LINE%TYPE
         CI,R8    3
         BNE      OPEN%TEMPS
         BAL,IORL OPENX2KF
         BAL,IORL OPENX2
OPEN%TEMPS  RES   0
         BAL,IORL OPENX1
         BAL,IORL OPENX3
         LW,IORL  LO%FLAG           TURN OFF DO-LO CORRESPONDANCE
         BNEZ     TEST%STD            IF 'LO' IS NOT REQUESTED
*
         STB,IORL CORRESWD
TEST%STD RES      0
         LI,X1    0
         MTW,0    ND%FLAG
         BNEZ     TEST%PD
         BAL,IORL OPENSTD           OPEN F:STD IN USER'S ACCOUNT
         B        TEST%SI           IT'S OPEN
TEST%PD  RES      0
         MTW,0    PD%FLAG
         BEZ      TEST%SI
         BAL,IORL OPENSTDOUT        OPEN F:STD FOR OUTPUT
TEST%SI  RES      0
* DON'T OPEN SI OR CI UNTIL ALL OUTPUT FILES HAVE BEEN OPENED
         MTW,0    SI%FLAG
         BEZ      TEST%CI
         BAL,IORL OPENSI
TEST%CI  RES      0
         MTW,0    CI%FLAG
         BEZ      OPEN%SYS
         BAL,IORL OPENCI
OPEN%SYS RES      0
%20      MTW,0    LINE%TYPE         IS THERE ANYTHING INDICATED?
         BEZ      %30               BRANCH IF NO.
         DO       SYS=BPMUTS
         LW,X7    #ACCTS
         MTW,2    #ACCTS
         LI,X1    1                 INSERT USER'S ACCOUNT
         LW,R8    *X'4F',X1
         AI,X1    1
         LW,R9    *X'4F',X1
         STD,R8   ACCOUNTS,X7
         LD,R8    COLON%SYS         INSERT :SYS ACCOUNT
         STD,R8   ACCOUNTS+2,X7
         M:SETDCB F:STD,;           CHANGE TO ROOT-RESIDENT ROUTINES
                  (ERR,ERR%%STD),;
                  (ABN,ABN%%STD)
         ELSE
         LV,R9    ADDRFLD
         LI,R8    ERR%%STD
         STS,R8   F:STD+CPRERREO
         LI,R8    ABN%%STD
         STS,R8   F:STD+CPRABNEO
         FIN
         B        *ROOTRTN          RETURN TO THE ROOT
%30      RES      0
         ABORT    ABORT11           NO INPUT SPECIFIED
STDERROR RES      0
         LB,R8    SR3               ERROR CODE
         CI,R8    3
         BNE      ABN%%STD
         DO       SYS=BPMUTS
         CI,X1    0                 WAS OPEN IN :SYS ACCOUNT
         BNE      STDERR5             YES
         FIN
*  ABORT IF F:STD WAS RE-ASSIGNED
         LI,R8    X'F'
         AND,R8   F:STD
         CI,R8    1
         BNE      SDFNOTHR
         DO       SYS=BPMUTS
         LW,R8    F:STD+X'17'
         CW,R8    =X'085B7AE2'      COMPARE FOR '%:STDDEF'
         BNE      SDFNOTHR
         LW,R8    F:STD+X'18'
         CW,R8    ='TDDE'
         BNE      SDFNOTHR
         LI,X1    1                 SET FLAG FOR :SYS ACCT
         BAL,IORL OPENSTD%SYS       TRY OPEN IN :SYS ACCOUNT
         B        TEST%SI           IT'S OPEN
         FIN
         DO       SYS=RBM
         LW,XT    F:STD+1
         AND,XT   L(X'3F'**8)
         CV,XT    D1**8
         BNE      SDFNOTHR          REASSIGNED IF NOT IN DEFAULT AREA
*
         LW,R8    F:STD+5           IF NAME ISN'T '%:STDDEF',
         CW,R8    ='%:ST'
         BNE      SDFNOTHR
         LW,R8    F:STD+6
         CW,R8    ='DDEF'
         BNE      SDFNOTHR
         LI,X1    1
         FIN
STDERR5  RES      0
         STW,X1   ND%FLAG
         B        TEST%SI
SDFNOTHR RES      0
         ABORT    ABORT12           STD DEF FILE DOES NOT EXIST
        PAGE
*
*  O P E N X 1
*        OPEN THE X1 (ENCODED TEXT) FILE
*
OPENX1   RES      0
         DO       SYS=BPMUTS
         LI,IOADD  F:X1
         LW,IOSIZE  =X'05C6E7F1'    'FX1'
         B        OPNJOIN
         FIN
         DO       SYS=RBM
         M:OPEN   M:X1,(ERR,ERR%%X1),(ABN,ABN%%X1)
         M:DEVICE M:X1,;
                  (SIZE,BYX1SIZE),;
                  (ORG,UNBLOCK)
         B        *IORL
         FIN
*
*  O P E N X 2
*        OPEN THE X2 FILE
*
OPENX2   RES      0
         DO       SYS=BPMUTS
         LI,IOADD  F:X2
         LW,IOSIZE  =X'05C6E7F2'    'FX2'
         B        OPNJOIN
         FIN
         DO       SYS=RBM
         M:OPEN   M:X2,(ERR,ERR%%X2),(ABN,ABN%%X2)
         M:DEVICE M:X2,;
                  (SIZE,80),;
                  (ORG,BLOCK)
         B        *IORL
         FIN
*
*  O P E N X 3
*        OPEN THE X3 (COMPRESSED SOURCE) FILE
*
OPENX3   RES      0
         DO       SYS=BPMUTS
         LI,IOADD  F:X3
         LW,IOSIZE  =X'05C6E7F3'    'FX3'
         B        OPNJOIN
         FIN
         DO       SYS=RBM
         M:OPEN   M:X3,(ERR,ERR%%X3),(ABN,ABN%%X3)
         M:DEVICE M:X3,;
                  (SIZE,BYX3SIZE),;
                  (ORG,UNBLOCK)
         B        *IORL
         FIN
*
*  O P E N X 2 K F
*        OPEN THE X2KF FILE
*
OPENX2KF RES      0
         DO       SYS=BPMUTS
         LI,IOADD  F:X2KF
         LW,IOSIZE  =X'05F2D2C6'    '2KF'
OPNJOIN  RES      0
         LI,X1    OPENEND-OPENFPT   SIZE OF FPT TO MOVE
OPNJN1   RES      0
         LW,X2    OPENFPT-1,X1      MOVE AN FPT WORD TO TEMP
         STW,X2   SAVAREA-1,X1
         BDR,X1   OPNJN1
         STW,IOSIZE  SAVAREA+4      STORE FILE NAME
         LW,IOSIZE  *X'4F'
         STH,IOSIZE  SAVAREA+5      UNIQUE ACCOUNT I.D.
         M:OPEN,E SAVAREA           OPEN THE TEMP FILE
         B        *IORL
OPENFPT  M:OPEN,L *IOADD,(FILE,'2KF  '),(OUTIN)
OPENEND  RES      0
         FIN
         DO       SYS=RBM
         M:OPEN   M:X4,(ERR,ERR%%X4),(ABN,ABN%%X4)
         M:DEVICE M:X4,;
                  (SIZE,12),;
                  (ORG,BLOCK)
         B        *IORL
         FIN
*
*  O P E N L O
*        OPEN THE LISTING OUTPUT FILE
*
OPENLO   RES      0
         M:OPEN   M:LO,(OUT),(ERR,ERR%%LO),(ABN,ERR%%LO)
         LI,SR1   0
         DO1      SYS=BPMUTS
         STW,SR1  LO%ONLINE
         STW,SR1  NUM%PAGE%LINES
         M:DEVICE M:LO,(CORRES,M:C)
         LI,XT    1                 TO BYTE 1
         STB,SR1  CORRESWD,XT
         M:DEVICE  M:LO,(CORRES,M:DO)
         STB,SR1  CORRESWD          TO BYTE 0
         DO       SYS=BPMUTS
         LW,SR1   M:LO              CHECK FOR
         AND,SR1  =X'F'               DEVICE
         CI,SR1   3                   TYPE ASSIGNMENT
         BNE      OPENLO2           NO,  SET PAGE SIZE VERY LARGE
         LW,SR1   *X'4F'
         BGEZ     *IORL             EXIT IF NOT ON-LINE
         LW,SR1   M:LO+1            CHECK IF NOT OP LABEL
         CI,SR1   X'8000'
         BAZ      *IORL             EXIT IF AN OP LABEL
         SLS,SR1  -8                RT JUSTIFY 'TYPE' ITEM
         AND,SR1  =X'3F'            TEST FOR TYPEWRITER CODE
         CI,SR1   1
         BE       OPENLO3           TYPEWRITER
         CI,SR1   X'10'             TEST FOR USER CONSOLE DEVICE
         BNE      *IORL             NO
OPENLO3  RES      0
         MTW,+1   LO%ONLINE         SET LO-IS-ONLINE FLAG
OPENLO2  RES      0
         LI,SR1   X'7FFFF'          LARGE NUMBER TO PAGE SIZE
         STW,SR1  NUM%PAGE%LINES
         FIN
         DO       SYS=RBM
         LB,SR1   K:PAGE
         AI,SR1   -2
         STW,SR1  NUM%PAGE%LINES
         FIN
         B        *IORL             EXIT
*
*  O P E N B O
*        OPEN THE BINARY OUTPUT FILE
*
OPENBO   RES      0
         M:OPEN   M:BO,(OUT),(ERR,ERR%%BO),(ABN,ERR%%BO)
         M:DEVICE  M:BO,(BIN)
         EXIT     IORL
*
*  O P E N C
*        OPEN THE CONTROL DEVICE
*
OPENC    RES      0
         M:OPEN   M:C,(IN)
         EXIT     IORL
*
*  O P E N D O
*        OPEN THE DO (DIAGNOSTIC OUTPUT) FILE
*
OPENDO   RES      0
         M:OPEN   M:DO,(OUT),(ERR,ERR%%DO),(ABN,ERR%%DO)
         DO       SYS=BPMUTS
         LI,SR1   0
         STW,SR1  DO%ONLINE
         LW,SR1   M:DO
         AND,SR1  =X'F'
         CI,SR1   3
         BNE      *IORL             EXIT IF NOT A DEVICE TYPE ASSIGNMENT
         LW,SR1   *X'4F'
         BGEZ     *IORL             EXIT IF NOT ON-LINE
         LW,SR1   M:DO+1
         CI,SR1   X'8000'
         BAZ      *IORL             EXIT IF AN OP LABEL
         SLS,SR1  -8                RIGHT JUSTIFY 'TYPE' ITEM
         AND,SR1  =X'3F'
         CI,SR1   1
         BE       OPENDO1           BRANCH IF DEVICE IS TYPEWRITER
         CI,SR1   X'10'
         BNE      *IORL             EXIT IF NOT USER CONSOLE DEVICE
OPENDO1  RES      0
         MTW,1    DO%ONLINE         SET DO-IS-ON-LINE FLAG
         FIN
         B        *IORL             EXIT
*
*  O P E N G O
*        OPEN THE GO FILE
*
OPENGO   RES      0
         M:OPEN   M:GO,(OUT),(ERR,ERR%%GO),(ABN,ERR%%GO)
         DO       SYS=RBM
         M:PFIL   M:GO
         FIN
         M:DEVICE  M:GO,(BIN)
         B        *IORL             EXIT
*
*  O P E N S T D
*        OPEN THE F:STD FILE IN THE USER ACCOUNT
*
OPENSTD  RES      0
         M:OPEN   F:STD,(IN)
         B        *IORL
*
*  O P E N S T D % S Y S
*        OPEN THE F:STD FILE IN THE :SYS ACCOUNT
*
         DO       SYS=BPMUTS
OPENSTD%SYS  RES  0
         M:OPEN   F:STD,(FILE,'%:STDDEF',':SYS'),(IN)
         B        *IORL
         FIN
*
*  O P E N S T D O U T
*        OPEN THE F:STD FILE FOR OUTPUT
*
OPENSTDOUT  RES   0
         M:OPEN   F:STD,(OUT)
         DO       SYS=RBM                                      /27493/*D-CCI
         M:DEVICE F:STD,;                                      /27493/*D-CCI
                  (SIZE,BYX1SIZE),;                            /27493/*D-CCI
                  (ORG,UNBLOCK)                                /27493/*D-CCI
         FIN                                                   /27493/*D-CCI
         B        *IORL
*
*  O P E N S I
*        OPEN THE SYMBOLIC INPUT FILE
*
OPENSI   RES      0
         M:OPEN   M:SI,(IN),(ERR,ERR%%SI),(ABN,ERR%%SI)
         M:DEVICE M:SI,(CORRES,M:C)
         LI,XT    2                 TO BYTE 2
         STB,SR1  CORRESWD,XT
         B        *IORL             EXIT
*
*  O P E N C I
*        OPEN THE COMPRESSED INPUT FILE
*
OPENCI   RES      0
         M:OPEN   M:CI,(IN),(ERR,ERR%%CI),(ABN,ERR%%CI)
         B        *IORL             EXIT
*
*  O P E N S O
*        OPEN THE SYMBOLIC OUTPUT FILE
*
         LOCAL    %10
*
OPENSO   RES      0
*
         DO       SYS=BPMUTS
*
*  IF M:SO IS CURRENTLY ASSIGNED TO A FILE, ADJUST ITS DCB
*     FOR KEYED OUTPUT.
*
         LI,XT    M:SO
         LI,XT2   1                 WANT FILE NAME
         CALL     FIND%VARP         RETURNS PTR TO NAME IN XT1 IF FILE
         CI,XT1   0
         IF,NE                 -00- DOIF ASN=FILE
*
*        MOVE THE FILE NAME INTO THE ADJUST FPT.  THIS MESSING ABOUT
*        SHOULD NOT BE NECESSARY WITH CP-V E00, BUT FOR NOW, M:SO
*        IS SUBJECT TO FILE EXTENSION, EVEN THOUGH IT IS A KEYED
*        FILE.  CHANGING THE NAME (SAME NAME, BUT...) DEFEATS FILE
*        EXTENSION, AND THUS THE INOUT MODE WHICH WOULD CAUSE A
*        1600 ABNORMAL (MAYBE) WHEN WE WENT TO WRITE THE KEYED
*        RECORDS.
*
         LI,XT2   2
         LB,XT    *XT1,XT2          JUST MOVE THE WORDS IN USE
         STB,XT   SO%ADJ%NAME,XT2
%10      RES      0
         LW,XT2   *XT1,XT
         STW,XT2  SO%ADJ%NAME,XT
         BDR,XT   %10
*
         CAL1,1   SO%ADJ%FPT
         LI,XT    3
         STB,XT   SO%KEY            SET FLAG (SKELETON KEY)
         FI                    -00-
         FIN
*
         M:OPEN   M:SO,(OUT),(ERR,ERR%%SO),(ABN,ERR%%SO)
         B        *IORL             EXIT
*
*  O P E N C O
*        OPEN THE COMPRESSED OUTPUT FILE
*
OPENCO   RES      0
         M:OPEN   M:CO,(OUT),(ERR,ERR%%CO),(ABN,ERR%%CO)
         M:DEVICE  M:CO,(BIN)
         LI,XT    120               STANDARD RECORD LENGTH
*
         DO       SYS=BPMUTS
         MTH,0    CO%FLAG
         IF,EQ                      DOIF 'SC' NOT SPECIFIED
         LI,XT    108               'SHORT' BINARY RECORDS
         FI
         FIN
*
         STW,XT   CO%SIZE           BYTE SIZE OF CO RECORD
         EXIT     IORL
IGNORE%TRAPS  RES  0
         M:TRAP   TRAPLOC,(IGNORE,FX),(TRAP,NAO)
         DO       SYS=BPMUTS
         M:GDDL                     GET DYNAMIC DATA LIMITS
         STW,SR1  LOWCORE
         CI,SR3   128
         BLE      %+2               BRANCH IF LESS THAN 128 PAGES
         LI,SR3   128               USE 128 PAGES AS MAXIMUM
         SLS,SR3  9                 # PAGES * 512 = AMT OF CORE
         AW,SR3   SR1               ADD AMT OF CORE TO LOWCORE
         STW,SR3  ENDCORE
         FIN
         DO       SYS=RBM
         LW,SR1   K:BPEND           MOVE LOWEST ADDRESS
         AI,SR1   1                 FORCE TO DOUBLEWORD BOUND  /26685/*D-CCI
         AND,SR1  L(EADRFLD)                                   /26685/*D-CCI
         STW,SR1  LOWCORE           USABLE BY THE ASSEMBLER
         LW,SR1   K:BCKEND
         AI,SR1   1
         SW,SR1   LOWCORE           MAKE SURE THAT
         CI,SR1   65536               ENDCORE IS NOT
         BLE      %+2                 MORE THAN 65536
         LI,SR1   65536               WORDS BEYOND
         AW,SR1   LOWCORE             LOWCORE
         STW,SR1  ENDCORE
         FIN
         EXIT     RL
         PAGE
*
*  F I N D % V A R P
*        TESTS A DCB FOR HAVING BEEN ASSIGNED TO A FILE, AND RETURNS
*        A POINTER TO THE VARIABLE PARAMETER OF INTEREST.
*
*        INPUT:   XT IS ADDRESS OF DCB
*                 XT2 IS VARIABLE PARAMETER CODE (1 = NAME, ETC.)
*
*        OUTPUT:  XT  PRESERVED
*                 XT1 IS 0 IF NOT A FILE, OR IS ADDRESS OF
*                     VARIABLE PARAMETER CONTROL WORD.
*
*        USES:    R12
*
         LOCAL    %10
*
FIND%VARP   RES   0
*
         LW,XT1   0,XT              WORD 0 OF DCB TO XT1
         AND,XT1  L(X'F')           ASN FIELD
         CI,XT1   1                 TEST FOR ASSIGNMENT TO FILE
         IF,EQ                 -20-
         LW,XT1   6,XT
         AND,XT1  L(X'1FFFF')       FLP
*
*        SEARCH THE VARP LIST FOR THE DESIRED CONTROL.  IF NOT
*        FOUND, RETURN A 0, AS IF NOT A FILE.
*
%10      RES      0
         CB,XT2   *XT1              TEST TYPE BYTE AGAINST DESIRED
         EXIT,EQ                    GET OUT IF FOUND (XT1 IS SET)
*
*        ADVANCE TO NEXT PARAMETER
*
         LW,R12   0,XT1
         CV,R12   X'00010000'       WAS THIS THE LAST ONE?
         IF,AZ                 -10- DOIF NOT LAST
         AND,R12  L(X'FF')
         AW,XT1   R12               SIZE
         BIR,XT1  %10               ADVANCE TO NEXT CONTROL
*
         FI                    -10-
         FI                    -20-
         LI,XT1   0                 FAIL RETURN
         EXIT
         PAGE
*        DATA AREA.
*
         USECT    XAPDATA
PATCH    RES      32                ***** PATCH AREA *****
GET%NEXT%RETURN   RES 1
ABORT%CODE  RES   1                 SAVED CODE FOR ABORT TYPE
BLANK%SWITCH  RES  1                0=IGNORE BLANKS; 1=DON'T
PRINT%SWITCH  RES  1
         USECT    CCI1
         DO       SYS=RBM
AC%TABLE RES      0
         TEXT     'SP  '
         TEXT     'D1  '
         TEXT     'D2  '
         TEXT     'D3  '
         TEXT     'D4  '
         TEXT     'D5  '
         TEXT     'D6  '
         TEXT     'D7  '
         TEXT     'D8  '
         TEXT     'D9  '
         TEXT     'DA  '
         TEXT     'DB  '
         TEXT     'DC  '
         TEXT     'DD  '
         TEXT     'DE  '
         TEXT     'DF  '
AC%CODE  RES      0
         DATA,1   0,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20
         BOUND    4
         FIN
OPTION%IGNORED    TEXTC 'ILLEGAL OPTION IGNORED:    '
MSGS     EQU      %-OPTION%IGNORED
         BOUND    8
         DO       SYS=BPMUTS
COLON%SYS   RES   0
         TEXT     ':SYS    '
         FIN
         USECT    XAPDATA
         RES      ABSVAL(%)&1       BOUND 8 WITH NO ZERO'S GENERATED
BLANKS   EQU      %
8BLANKS  EQU      %
CTL%CARD%DISPLAY  EQU %
         RES      2
CTL%CARD EQU      %
         RES      20
BUF%PRINT  RES    20                TEMP PRINT AREA
SAVEREGS EQU      X3BUF+WDX3SIZE-16  SAVE AREA FOR REGISTERS 0-15
         USECT    CCI1
         PAGE
*
*   A P % A B O R T
*        THIS ROUTINE PROCESSES ABORT CONDITIONS.
*
*        INPUT:   REGISTER AR CONTAINS AN ABORT NUMBER
*
*        OUTPUT:  AN ABORT MESSAGE IS OUTPUT ON THE 'LO' AND 'DO'
*                   DEVICES; ALL FILES ARE CLOSED; AND, A RETURN TO
*                   MONITOR IS PERFORMED VIA AN M:ERR CALL.
*
AP%ABORT RES      0
         LCI      0
         STM,0    SAVEREGS          SAVE REGISTERS 0-15
         STW,AR   ABORT%CODE        SAVE CODE FOR ABORT TYPE
*
         DO       SYS=BPMUTS
         M:SETDCB M:LO,;            LET MOTHER DIAGNOSE               *D-CCI
                  (ERR,0),;                                           *D-CCI
                  (ABN,0)                                             *D-CCI
         M:SETDCB M:DO,;                                              *D-CCI
                  (ERR,0),;                                           *D-CCI
                  (ABN,0)                                             *D-CCI
         FIN
*
         DO       SYS=RBM
         M:CLOSE  M:LO,SAVE
         M:CLOSE  M:DO,SAVE
         M:OPEN   M:LO,;            LET MOTHER DIAGNOSE               *D-CCI
                  (ERR,0),;                                           *D-CCI
                  (ABN,0)                                             *D-CCI
         M:OPEN   M:DO,;                                              *D-CCI
                  (ERR,0),;                                           *D-CCI
                  (ABN,0)                                             *D-CCI
         FIN
*
         M:DEVICE M:LO,(CORRES,M:DO)   CHANGE DOLOSAME TO IGNORE
         STB,SR1  CORRESWD
         CI,AR    ABSIZE-1
         BG       ABORT%9           ABORT NUMBER IS OUT OF RANGE
         LW,XT    AR
         BLZ      ABORT%9           ABORT NUMBER IS OUT OF RANGE
         LH,XT    ABRTTBL,XT        LOAD INDEX TO ABORT PROCESSOR
         B        ABRTBASE,XT       BRANCH TO SPECIFIED ROUTINE
*
AB       COM,16   AF(1)-ABRTBASE
*
ABRTTBL  RES      0                 TABLE OF INDEXES TO ABORT ROUTINES
         AB       AB%0              SYSTEM                 DG
         AB       AB%1              HILIMIT                DG
         AB       AB%2              SCAN                   DG
         AB       AB%3              OVERFLOW               NCDR
         AB       AB%4              RDSDF                  NCDR
         AB       AB%5              IO%ABORT               ROOT
         AB       AB%6              TRAPLOC                ROOT
         AB       AB%7              CANTHAVE               ROOT
         AB       AB%8              BADTRAP                ROOT
         AB       AB%9              AC%FND                 CCI
         AB       AB%10             BAD%SYNTAX             CCI
         AB       AB%11             OPEN%SYS               CCI
         AB       AB%12             SDFNOTHR               CCI
         AB       AB%13             ERR%ABN2               CD
         AB       AB%14             ABNSI5                 CD
         AB       AB%15             SYSOPNR                CD
         AB       AB%16             2MANYSYS               CD
         AB       AB%17             ABNX2KF                CD
         AB       AB%18             VALIDATE               CD
         AB       AB%19             VALID%2                CD
         AB       AB%20             BADCTRL                CD
         AB       AB%21             WDOUT                  NCD /27493/*D-CCI
         AB       DELETED
         AB       AB%23             PRINT%ER1              CD
         AB       AB%24             PRINT%ER2              CD
         AB       AB%25             LECTURE%MAJ            INIT
         AB       DELETED
         AB       AB%27             ABNSI5                 INIT
ABSIZE   EQU      HA(%)-HA(ABRTTBL) NUMBER OF AB ENTRIES
*
         BOUND    4
*
ABORT%1  RES      0
         BAL,RL   CLR%MOVE          MOVE MESSAGE TO LIST BUFFER
ABORT%2  RES      0
         BAL,RL   PRINT             OUTPUT MESSAGE
ABORT%3  MTW,0    SYSLEVEL
         BLEZ     ABORT%4           NOT WITHIN A SYSTEM FILE
         LI,AM    BA(ABORTSYS)      ADDRESS OF 'PROCESSING SYSTEM- '
         BAL,RL   CLR%MOVE          MOVE MESSAGE TO LIST BUFFER
         LI,AM    BA(SYSNAME)       ADDRESS OF SYSTEM NAME
         BAL,RL   MOVE              APPEND SYSNAME TO MESSAGE IN BUFFER
         BAL,RL   PRINT             OUTPUT MESSAGE
ABORT%4  RES      0
         LI,AM    BA(ABORTAP)       ADDRESS OF 'AP ABORT ERROR'
         BAL,RL   CLR%MOVE          MOVE MESSAGE TO LIST BUFFER
         LW,RL    SEGMENT#
         LW,AM    SEG%MSG,RL
         CALL     MOVE
         LW,XT    SEGMENT#
         IF,NE                 -20- DOIF NOT CCI
         CI,XT    4
         IF,NE                 -21- DOIF NOT END
         LI,AM    BA(LINE#MSG)
         CALL     MOVE
         LW,X3    MAJLINE
         CALL     DECEDIT
         LW,X3    SUBLINE
         IF,NE                 -22- DOIF NO SUB-LINE #
         LI,XT    '.'
         STB,XT   LSTBF,XT1
         AI,XT1   1
         CALL     DECEDIT
         FI                    -22-
         FI                    -21-
         FI                    -20-
         BAL,RL   PRINT             OUTPUT MESSAGE
ABORT%5  RES      0
         LI,AM    BA(D%1)
         BAL,RL   CLR%MOVE
         BAL,RL   SNAPRINT          PRINT A BLANK LINE
         LI,AM    BA(APDATA)
         BAL,RL   CLR%MOVE
         LI,X3    XAPDATA
         SLS,X3   12
         LI,AM    5
         BAL,RL   HEXEDIT
         BAL,RL   SNAPRINT          'XAPDATA = XXXXX'
         LI,AM    BA(APD1)
         BAL,RL   CLR%MOVE
         LI,X3    XAPD1
         SLS,X3   12
         LI,AM    5
         BAL,RL   HEXEDIT
         BAL,RL   SNAPRINT          'XAPD1 = XXXXX'
         LI,AM    BA(APOPTFLG)
         BAL,RL   CLR%MOVE
         LI,X3    OPTION%FLAGS
         SLS,X3   12
         LI,AM    5
         BAL,RL   HEXEDIT
         BAL,RL   SNAPRINT          'OPTION%FLAGS = XXXXX'
         LI,AM    BA(APCODE)
         BAL,RL   CLR%MOVE
         LI,X3    XAPCODE
         SLS,X3   12
         LI,AM    5
         BAL,RL   HEXEDIT
         BAL,RL   SNAPRINT          'XAPCODE = XXXXX'
         LI,AM    BA(APMODULE)
         BAL,RL   CLR%MOVE
         LI,X3    CCI1
         SLS,X3   12
         LI,AM    5
         BAL,RL   HEXEDIT
         BAL,RL   SNAPRINT          'AP OVERLAY MODULE = XXXXX'
         LI,AM    BA(D%1)
         BAL,RL   CLR%MOVE
         BAL,RL   SNAPRINT          PRINT A BLANK LINE
         LI,AM    BA(RO%R7)
         BAL,RL   CLR%MOVE
         LI,X6    SAVEREGS
         STW,X6   R13
         BAL,R15  HEXDUMP1          DUMP REGS 0-7 IN HEX FORMAT
         LI,AM    BA(R8%R15)
         BAL,RL   CLR%MOVE
         LI,X6    SAVEREGS+8
         BAL,R15  HEXDUMP1          DUMP REGS 8-15 IN HEX FORMAT
         LW,XT    ABORT%CODE        GET SAVED CODE
         LB,XT1   DUMP%SW,XT
         BEZ      ABORT%7           BRIF MINI-DUMP REQUIRED
*
         LI,AM    BA(D%1)
         BAL,RL   CLR%MOVE
         BAL,RL   SNAPRINT          PRINT A BLANK LINE
         LI,X6    XAPDATA           START ADDRESS FOR DUMP
         LI,R13   ROOTRTN           END ADDRESS FOR DUMP
         BAL,R15  HEXDUMP           DUMP MEMORY IN HEX FORMAT
         LW,XT    ABORT%CODE        GET SAVED CODE
         LB,XT1   DUMP%SW,XT        GET DUMP FLAG
         CI,XT1   1
         BE       ABORT%7           BRIF MIDI-DUMP IS REQUIRED
*
         DO       SYS=BPMUTS
         LI,X1    -5                INDEX TO PAGETBL
         LI,X2    1                 # BITS REMAINING (+1) IN LAST WORD
         LW,X6    LOWCORE           INITIAL DUMP ADDRESS
FIND%1ST RES      0                 LOOK FOR INIT. DUMP ADDRESS
         CW,X6    ENDCORE
         BGE      ABORT%7           BRIF END-OF-CORE
*
         CALL     NEXT%PG
         B        ABORT%7           END-OF-PAGETBL EXIT
         BNEZ     FIND%LAST         BRIF PAGE USED
*
FIND%L1  RES      0
         AI,X6    512               BUMP TO NEXT CORE PAGE
         B        FIND%1ST
*
FIND%LAST   RES   0                 LOOK FOR END ADDRESS FOR DUMP
         LW,R13   X6                INIT -> FINAL DUMP ADDRESS
FIND%L2  RES      0
         AI,R13   512               BUMP END ADDRESS
         CW,R13   ENDCORE
         BGE      NEXT%PRT          BRIF END OF CORE
*
         CALL     NEXT%PG           GET NEXT 'PAGE-USED' BIT
         B        NEXT%PRT          END-OF-PAGETBL
         BNEZ     FIND%L2           BRIF LAST ADDR. NOT FOUND
*
NEXT%PRT RES      0
         CW,R13   ENDCORE           DECREASE END ADDRESS IF REQ'D
         BLE      %+2
         LW,R13   ENDCORE
         LCI      15
         STM,0    SAVAREA           SAVE REGS
         AI,R13   -1                ADJUST LAST ADDRESS
         BAL,R15  HEXDUMP
         LCI      15
         LM,0     SAVAREA
         LW,X6    R13               LAST ADDRESS -> FIRST
         B        FIND%L1
*
         FIN
*
         DO       SYS=RBM
         LW,X6    LOWCORE
         LW,R13   ENDCORE
         AI,R13   -1
         BAL,R15  HEXDUMP
         FIN
*
ABORT%7  RES      0
         LI,IORL  1                 ABNORMAL CLOSE
         BAL,RL   CLOSE%FILES
         LCI      0
         LM,0     SAVEREGS          RESTORE REGISTERS 0-15
         M:ERR                      RETURN TO MONITOR
*
*   HERE IF ABORT NUMBER IS OUT OF RANGE
ABORT%9  RES      0
DELETED  RES      0
         LI,AM    BA(ABORT%10)
         B        ABORT%1
ABORT%10 TEXTC    'ABORT CALLED WITH ILLEGAL ARGUMENT'
*
SEG%MSG  RES      0
         DATA     BA(CCI%SEG)
         DATA     BA(NCDR%SEG)
         DATA     BA(DEF%SEG)
         DATA     BA(GEN%SEG)
         DATA     BA(END%SEG)
         DATA     BA(CONC%SEG)
CCI%SEG  TEXTC    'CONTROL CARD PROCESSOR'
NCDR%SEG TEXTC    'ENCODER'
DEF%SEG  TEXTC    'ASSEMBLY PASS 1'
GEN%SEG  TEXTC    'ASSEMBLY PASS 2'
END%SEG  TEXTC    'END SUMMARIES'
CONC%SEG TEXTC    'CONCORDANCE'
LINE#MSG TEXTC    '  PROCESSING LINE '
ABORTSYS TEXTC    'PROCESSING SYSTEM- '
ABORTAP  TEXTC    'AP ABORT ERROR IN '
APDATA   TEXTC    'XAPDATA = '
APD1     TEXTC    'XAPD1 = '
APOPTFLG TEXTC    'OPTION%FLAGS = '
APCODE   TEXTC    'XAPCODE = '
APMODULE TEXTC    'AP OVERLAY MODULE = '
RO%R7    TEXTC    ' R0-R7'
R8%R15   TEXTC    ' R8-RF'
*
*  DUMP SWITCHES TABLE.  INDEXED BY ERROR CODE.
*
*        0=MINI DUMP.  1=MIDI DUMP.  2=MAXI DUMP.
*
DUMP%SW  RES      0
         DATA,1   0,2,2,2,1,1,2,2,2,0     CODES 0 THRU 9
         DATA,1   0,0,0,0,0,0,1,1,1,1     CODES 10 THRU 19
         DATA,1   0,1,2,1,1,1,2,0   CODES 20 THRU 27           /27493/*D-CCI
         BOUND    4
         PAGE
*
ABRTBASE RES      0
*   HERE FOR ABORT FROM SYSTEM DIRECTIVE IN AP-DG
*        XT CONTAINS BASE ADDRESS OF ENCODED TEXT AT WORD RESOLUTION
*        XW POINTS TO HALFWORD PRECEEDING SYSTEM NAME
AB%0     RES      0
         LW,XT    SAVEREGS+XT       GET BASE ADDRESS OF ENCODED TEXT
         SLS,XT   2                 CONVERT WORD ADDRESS TO BYTE
         AI,XW    1                 SKIP MULTI-INTEGER HALFWORD
         SLS,XW   1                 CONVERT HALFWORD OFFSET TO BYTE
         AW,XW    XT                SAVE ADDRESS OF SYSTEM NAME
         LI,AM    BA(AB%00)         ADDRESS OF 'UNABLE TO FIND SYSTEM-'
         BAL,RL   CLR%MOVE          MOVE MESSAGE TO LIST BUFFER
         LW,AM    XW                ADDRESS OF SYSTEM NAME
         BAL,RL   MOVE              APPEND NAME TO MESSAGE IN BUFFER
         B        ABORT%2
AB%00    TEXTC    'UNABLE TO FIND SYSTEM- '
*   HERE FOR ABORT FROM HILIMIT ROUTINE IN AP-DG
AB%1     RES      0
         LI,AM    BA(AB%01)         ADDRESS OF 'SPACE OVERFLOW'
         B        ABORT%1
AB%01    TEXTC    'DEF/GEN SPACE OVERFLOW'
*   HERE FOR ABORT FROM SCAN ROUTINE IN AP-DG
AB%2     RES      0
         LI,AM    BA(AB%02)         ADDRESS OF 'BAD ENCODED TEXT'
         B        ABORT%1
AB%02    TEXTC    'BAD ENCODED TEXT'
*   HERE FOR ABORT FROM OVERFLOW IN AP-NCDR
AB%3     RES      0
         LI,AM    BA(AB%03)         ADDRESS OF 'ENCODER SPACE OVERFLOW'
         B        ABORT%1
AB%03    TEXTC    'ENCODER SPACE OVERFLOW'
*   HERE FOR ABORT FROM RDSDF IN AP-NCDR
AB%4     RES      0
         LI,AM    BA(AB%04)         ADDRESS OF MESSAGE
         B        ABORT%1
AB%04    TEXTC    'STD DEF FILE INCOMPATIBLE'
*   HERE FOR ABORT FROM IO%ABORT IN AP-ROOT
*        REGISTER SR3 CONTAINS ERRORCODE (BITS 0-14) AND DCB
*          ADDRESS (BITS 15-31)
AB%5     RES      0
         LI,AM    BA(AB%05)         ADDRESS OF 'ERR OR ABN ON FILE'
         BAL,RL   CLR%MOVE          MOVE MESSAGE TO LIST BUFFER
         LI,SR4   X'1FFFF'          MASK FOR ADDRESS FIELD
         LI,XT    DCBSIZE-1         NUMBER OF DCBT ENTRIES TO SEARCH
         LW,SR3   SAVEREGS+SR3      GET ERRORCODE & DCB ADDRESS
AB%%51   RES      0
         CS,SR3   DCBTABLE,XT       FIND DCB WHICH GAVE
         BE       %+2                 ERROR OR ABNORMAL
         BDR,XT   AB%%51              RETURN
*   XT CONTAINS INDEX TO DCB NAME
         LW,XT    DCBTABLE,XT
         LB,AM    XT                LOAD INDEX TO DCB NAME
         AI,AM    BA(DCBMSG)        AM NOW CONTAINS ADDRESS OF DCB NAME
         BAL,RL   MOVE              MOVE DCB NAME TO LIST BUFFER
         LI,AM    BA(D%1)
         BAL,RL   MOVE              MOVE A BLANK TO LIST BUFFER
         SLD,SR3  -24               RIGHT ADJUST HIGH ORDER 8 BITS
         SLS,SR4  -1                INSERT A ZERO
         SLD,SR3  -8                NOW 16 BITS ARE CONTIGUOUS
         LI,AM    4
         LW,X3    SR4
         BAL,RL   HEXEDIT           EDIT ERROR CODE INTO LIST BUFFER
         B        ABORT%2
AB%05    TEXTC    'ERR OR ABN ON FILE '
*
DCBT     COM,8,24 BA(AF(1))-BA(DCBMSG),AF(2)
*
DCBTABLE RES      0
         DCBT     D%1,0
         DCBT     D%2,M:SI
         DCBT     D%3,M:CI
         DCBT     D%4,M:BO
         DCBT     D%5,M:CO
         DCBT     D%6,M:DO
         DCBT     D%7,M:GO
         DCBT     D%8,M:LO
         DCBT     D%9,M:SO
         DCBT     D%10,F:STD
         DCBT     D%11,F:SYS
         DO       SYS=RBM
         DCBT     D%12,M:X1
         DCBT     D%13,M:X2
         DCBT     D%14,M:X3
         DCBT     D%15,M:X4
         DCBT     D%16,M:X5
         FIN
         DO       SYS=BPMUTS
         DCBT     D%12,F:X1
         DCBT     D%13,F:X2
         DCBT     D%14,F:X3
         DCBT     D%17,F:X2KF
         DCBT     D%16,F:X5
         FIN
DCBSIZE  EQU      %-DCBTABLE        NUMBER OF DCBT ENTRIES
*
DCBMSG   RES      0
D%1      TEXTC    ' '
D%2      TEXTC    'SI'
D%3      TEXTC    'CI'
D%4      TEXTC    'BO'
D%5      TEXTC    'CO'
D%6      TEXTC    'DO'
D%7      TEXTC    'GO'
D%8      TEXTC    'LO'
D%9      TEXTC    'SO'
D%10     TEXTC    'STD'
D%11     TEXTC    'SYS'
D%12     TEXTC    'X1'
D%13     TEXTC    'X2'
D%14     TEXTC    'X3'
D%15     TEXTC    'X4'
D%16     TEXTC    'X5'
D%17     TEXTC    'X2KF'
*
*   HERE FOR ABORT FROM TRAPLOC IN AP-ROOT (RBM VERSION)
*        X1 CONTAINS A POINTER TO A 19 WORD AREA CONTAINING THE
*          PSD, REGS 0-15, AND THE TRAP LOCATION
AB%6     RES      0
         STW,X1   MPX1              SAVE POINTER TO PSD-REG BLOCK
         LI,AM    BA(AB%06)         ADDRESS OF MESSAGE
AB%%61   RES      0
         BAL,RL   CLR%MOVE          MOVE MESSAGE TO LIST BUFFER
         LW,X3    *MPX1             GET PSW1
         LI,AM    8
         BAL,RL   HEXEDIT           HEX OF PSW1 TO LIST BUFFER
         LI,AM    BA(D%1)
         BAL,RL   MOVE              MOVE A BLANK TO LIST BUFFER
         LI,X1    1
         LW,X3    *MPX1,X1          GET PSW2
         LI,AM    8
         BAL,RL   HEXEDIT           HEX OF PSW2 TO LIST BUFFER
         BAL,RL   PRINT             PRINT THE LIST BUFFER
         LW,X1    MPX1
         LCI      0                 MOVE RESIGTES 0-15
         LM,0     2,X1                FROM TRAP ROUTINE'S SAVE AREA
         LCI      0                   TO ABORT ROUTINE'S SAVE AREA
         STM,0    SAVEREGS
         B        ABORT%3
AB%06    TEXTC    'MONITOR TRAP, PSD = '
*   HERE FOR ABORT FROM CANTHAVE IN AP-ROOT (UTS VERSION)
*        MPX1 CONTAINS A POINTER TO A 19 WORD AREA CONTAINING THE
*          PSD, REGS 0-15, AND THE TRAP LOCATION
AB%7     RES      0
         LI,AM    BA(AB%07)         ADDRESS OF MESSAGE
AB%%71   RES      0
         MTW,-2   MPX1              POINTER TO PSD-REG BLOCK
         B        AB%%61
AB%07    TEXTC    'MEMORY PROTECTION TRAP, PSD = '
*   HERE FOR ABORT FROM BADTRAP IN AP-ROOT (UTS VERSION)
AB%8     RES      0
         LI,AM    BA(AB%08)         ADDRESS OF MESSAGE
         B        AB%%71
AB%08    TEXTC    'BAD INSTRUCTION TRAP, PSD = '
*   HERE FOR ABORT FROM AC%FND IN AP-CCI
AB%9     RES      0
         LI,AM    BA(AB%09)         ADDRESS OF MESSAGE
         B        ABORT%1
AB%09    TEXTC    'TOO MANY ACCOUNT AREAS SPECIFIED'
*   HERE FOR ABORT FROM BAD%SYNTAX IN AP-CCI
AB%10    RES      0
         LI,AM    BA(AB%010)        ADDRESS OF MESSAGE
         B        ABORT%1
AB%010   TEXTC    'CONTROL CARD ERROR'
*   HERE FOR ABORT FROM OPEN%SYS IN AP-CCI
AB%11    RES      0
         LI,AM    BA(AB%011)        ADDRESS OF MESSAGE
         B        ABORT%1
AB%011   TEXTC    'NO INPUT SPECIFIED'
*   HERE FOR ABORT FROM SDFNOTHR IN AP-CCI
AB%12    RES      0
         LI,AM    BA(AB%012)        ADDRESS OF MESSAGE
         B        ABORT%1
AB%012   TEXTC    'STD DEF FILE DOES NOT EXIST'
*   HERE FOR ABORT FROM ERR%ABN2 IN AP-CD
AB%13    RES      0
         LI,AM    BA(AB%013)        ADDRESS OF MESSAGE
         B        ABORT%1
AB%013   TEXTC    'EXPECTED CI MISSING'
*   HERE FOR ABORT FROM ABNSIS IN AP-CD
AB%14    RES      0
         LI,AM    BA(AB%014)        ADDRESS OF MESSAGE
         B        ABORT%1
AB%014   TEXTC    'EXPECTED SI MISSING'
*   HERE FOR ABORT FROM SYSOPNR IN AP-CD
AB%15    RES      0
         LI,AM    BA(AB%015)        ADDRESS OF MESSAGE
         B        ABORT%1
AB%015   TEXTC    'ERR OR ABN WHEN OPENING F:SYS'
*   HERE FOR ABORT FROM 2MANYSYS IN AP-CD
AB%16    RES      0
         LI,AM    BA(AB%016)        ADDRESS OF MESSAGE
         B        ABORT%1
AB%016   TEXTC    'SYSTEMS NESTED TOO DEEPLY'
*   HERE FOR ABORT FROM ABNX2KF IN AP-CD
AB%17    EQU      AB%5
*
*   HERE FOR ABORT FROM VALIDATE IN AP-CD
*        X1 CONTAINS THE CONTROL WORD OF THE CURRENT COMPRESSED RECORD
*        XT1 CONTAINS THE EXPECTED RECORD NUMBER
AB%18    RES      0
         STH,XT1  X3                SAVE RECORD NUMBER LEFT ADJUSTED
         LI,AM    BA(AB%018)        ADDRESS OF MESSAGE
AB%18A   BAL,RL   CLR%MOVE          MOVE MESSAGE TO LIST BUFFER
         LI,AM    4
         BAL,RL   HEXEDIT           EDIT RECORD NUMBER INTO LIST BUFFER
         BAL,RL   PRINT             PRINT THE LIST BUFFER
         LI,AM    BA(AB%018A)       ADDRESS OF NEXT MESSAGE
         BAL,RL   CLR%MOVE          MOVE MESSAGE TO LIST BUFFER
         BAL,RL   PRINT             PRINT LIST BUFFER
         LI,AM    BA(AB%018B)       ADDRESS OF NEXT MESSAGE
         BAL,RL   CLR%MOVE          MOVE MESSAGE TO LIST BUFFER
         LI,IOADD 4
         LW,X3    SAVEREGS+X1       GET COMPRESSED RECORD CONTROL WORD
AB%18C   RES      0
         LI,AM    2                 EDIT NEXT 2 DIGITS OF CONTROL WORD
         BAL,RL   HEXEDIT             INTO LIST BUFFER
         LI,AM    '/'
         STB,AM   LSTBF,XT1         STORE A SLASH IN LIST BUFFER
         AI,XT1   1                 INCREMENT LIST BUFFER INDEX
         BDR,IOADD AB%18C           CONTINUE UNTIL CONTROL WORD EDITED
         AI,XT1   -1                REMOVE LAST SLASH
         B        ABORT%2
AB%018   TEXTC    'SEQUENCE ERROR ON CI RECORD # '
AB%018A  TEXTC    'COMPRESSED RECORD  ID/SEQUENCE/CHECKSUM/BYTE COUNT'
AB%018B  TEXTC    '               IS  '
*   HERE FOR ABORT FROM VALID%2 IN AP-CD
*        X1 CONTAINS THE CONTROL WORD OF THE CURRENT COMPRESSED RECORD
*        X3 CONTAINS THE RECORD NUMBER+1
AB%19    RES      0
         AI,X3    -1                DECREMENT RECORD NUMBER
         SLS,X3   16                LEFT ADJUST RECORD NUMBER
         LI,AM    BA(AB%019)        ADDRESS OF MESSAGE
         B        AB%18A
AB%019   TEXTC    'CHECKSUM ERROR ON CI RECORD # '
*   HERE FOR ABORT FROM ENDFILE OR BADCTRL IN AP-CD
*        X3 CONTAINS RECORD NUMBER+1
AB%20    RES      0
         LI,AM    BA(AB%020)        ADDRESS OF MESSAGE
         BAL,RL   CLR%MOVE          MOVE MESSAGE TO LIST BUFFER
         AI,X3    -1                DECREMENT RECORD NUMBER
         SLS,X3   16                LEFT ADJUST RECORD NUMBER
         LI,AM    4
         BAL,RL   HEXEDIT           EDIT RECORD NUMBER INTO LIST BUFFER
         B        ABORT%2
AB%020   TEXTC    'CI CODE ERROR ON RECORD # '
*                                                              /27493/*D-CCI
*   HERE FROM WDOUT IN AP-NCD WHEN STATEMENT CANNOT BE ENCODED /27493/*D-CCI
*        INTO A SINGLE BUFFER.                                 /27493/*D-CCI
AB%21    RES      0                                            /27493/*D-CCI
         LI,AM    BA(AB%021)        ADDRESS OF MESSAGE         /27493/*D-CCI
         B        ABORT%1                                      /27493/*D-CCI
*                                                              /27493/*D-CCI
AB%021   TEXTC    'STATEMENT TOO LONG TO ENCODE'               /27493/*D-CCI
*
*   HERE FOR ABORT FROM PRINT%ER1 IN AP-CD
*        X1 CONTAINS THE CONTROL WORD OF THE CURRENT COMPRESSED RECORD
*        X3 CONTAINS THE RECORD NUMBER
AB%23    RES      0
         SLS,X3   16                LEFT ADJUST RECORD NUMBER
         LI,AM    BA(AB%023)        ADDRESS OF MESSAGE
         B        AB%18A
AB%023   TEXTC    'ID ERROR ON CI RECORD # '
*   HERE FOR ABORT FROM PRINT%ER2 IN AP-CD
AB%24    RES      0
         LI,AM    BA(AB%024)        ADDRESS OF MESSAGE
         B        ABORT%1
AB%024   TEXTC    'COMPRESSED OR BINARY RECORD FOUND IN SI FILE'
*   HERE FOR ABORT FROM LECTURE%MAJ IN AP-INIT
AB%25    RES      0
         LI,AM    BA(AB%025)        ADDRESS OF MESSAGE
         B        ABORT%1
AB%025   TEXTC    'UPDATE FILE IS IN COMPRESSED OR BINARY FORMAT'
*
*   HERE FOR ABORT FROM ABNSI5 IN AP-INIT
AB%27    EQU      AB%14
*
         PAGE
*
*   C L R % M O V E
*        THIS ROUTINE CLEARS THE LIST BUFFER AND THEN STORES A
*          CHARACTER STRING INTO IT.
*
*   M O V E
*        THIS IS AN ALTERNATE ENTRY POINT WHICH STORES A CHARACTER
*          STRING INTO THE LIST BUFFER WITHOUT FIRST CLEARING IT.
*
*        INPUT:   REGISTER AM CONTAINS THE BYTE ADDRESS OF A 'TEXTC'
*                   CHARACTER STRING
*                 REGISTER XT1 CONTAINS THE FIRST CHARACTER POSITION
*                   IN LIST BUFFER TO STORE INTO. (INITIALIZED TO ONE
*                   IF CLR%MOVE IS CALLED)
*
*        OUTPUT:  REGISTER XT1 CONTAINS THE NEXT CHARACTER POSITION
*                   IN LIST BUFFER TO STORE INTO
*
*        USES REGISTER
*                 AM
*                 XT
*                 XT1
*                 XT2
*                 IORL
*
CLR%MOVE RES      0
         STW,RL   IORL
         BAL,RL   CLRLSTBF          CLEAR LIST BUFFER
         LI,XT1   1                 INITIALIZE LIST BUFFER INDEX
         LW,RL    IORL
MOVE     RES      0
         LB,XT2   0,AM              LOAD CHARACTER COUNT
MOVE1    RES      0
         AI,AM    1                 INCREMENT 'FROM' ADDRESS
         LB,XT    0,AM              MOVE NEXT CHARACTER FROM MESSAGE TO
         STB,XT   LSTBF,XT1           NEXT POSITION IN LIST BUFFER
         AI,XT1   1                 INCREMENT 'TO' INDEX
         BDR,XT2  MOVE1             CONTINUE UNTIL ALL CHARS MOVED
         EXIT     RL
         PAGE
*
*   H E X D U M P
*        DUMP A SPECIFIED AREA OF MEMORY IN HEXADECIMAL FORMAT
*
*        INPUT:   REGISTER X6 CONTAINS THE ADDRESS OF THE FIRST
*                   WORD TO BE DUMPED
*                 REGISTER R13 CONTAINS THE ADDRESS OF THE LAST
*                   WORD TO BE DUMPED
*
*        USES REGISTER
*                 X1, X2, X3, X6
*
HEXDUMP  RES      0
         AND,X6   =X'FFFFFFF8'      TRUNCATE START & END ADDRESSES TO
         AND,R13  =X'FFFFFFF8'        AN 8 WORD BOUNDARY
         AI,R13   7
         LI,X2    '  '
NXTLOC   RES      0
         STH,X2   LSTBF             1ST 2 BYTES OF LIST BUFFER
         LW,X3    X6                ADDRESS OF 1ST WORD OF THIS LINE
         SLS,X3   12                LEFT ADJUST ADDRESS
         LI,AM    5                 NUMBER OF HEX DIGITS
         LI,XT1   2                 NEXT POSITION IN LIST BUFFER
         BAL,RL   HEXEDIT           EDIT ADDRESS INTO LIST BUFFER
HEXDUMP1 RES      0                 ENTRY POINT FOR REGISTER DUMP
         LI,R14   8
NXTWORD  RES      0
         LI,X2    ' '
         STB,X2   LSTBF,XT1         STORE A BLANK IN LIST BUFFER
         AI,XT1   1                 INCREMENT INDEX TO LIST BUFFER
         LW,X3    0,X6              LOAD NEXT WORD TO BE CONVERTED
         LI,AM    8                 NUMBER OF HEX DIGITS
         BAL,RL   HEXEDIT           EDIT WORD INTO LIST BUFFER
         AI,X6    1                 ADDRESS OF NEXT WORD TO CONVERT
         BDR,R14  NXTWORD           CONTINUE UNTIL EIGHT WORDS EDITED
         BAL,RL   SNAPRINT          PRINT THE LIST BUFFER
         CW,X6    R13               EXIT WHEN ALL WORDS
         BG       *R15                HAVE BEEN CONVERTED
         LW,X3    X6
         LI,X2    '  '
NXTCMP   RES      0
         LW,AM    0,X3              BRANCH IF THIS WORD DIFFERS FROM
         CW,AM    -8,X3               CORRESPONDING WORD OF LAST LINE
         BNE      NXTLOC              DUMPED
         AI,X3    1
         CI,X3    7                 CONTINUE UNTIL ALL EIGHT WORDS
         BANZ     NXTCMP              HAVE BEEN EXAMINED
         CW,X3    R13
         BG       NXTLOC            FORCE LAST LINE OUT
         STW,X3   X6
         LI,X2    ' *'
         B        NXTCMP
         PAGE
*
*  D E C E D I T
*        CONVERT A BINARY NUMBER TO DECIMAL DIGITS AND STORE
*
*        INPUT:   NUMBER IS IN X3
*                 XT1 HAS BYTE INDEX TO OUTPUT AREA  (LSTBF)
*
DECEDIT  RES      0
         LI,X6    4                 INDEX TO TENS TABLE
DECED1   RES      0                 FIND NUMBER OF SIGNIF. DIGITS
         CW,X3    TENS,X6
         BGE      DECED2            1ST DIGIT FOUND
*
         BDR,X6   DECED1
*
DECED2   RES      0
         LI,X2    0
         DW,X2    TENS,X6           CONVERT AND
         AI,X3    '0'                 STORE NEXT
         STB,X3   LSTBF,XT1           DIGIT
         AI,XT1   1                 BUMP OUTPUT INDEX
         LW,X3    X2                REMAINDER -> DIVIDEND
         AI,X6    -1                BUMP TO NEXT TENS ENTRY
         BGEZ     DECED2            BRIF NOT DONE
*
         EXIT     RL
*
TENS     DATA     1,10,100,1000,10000
         PAGE
*
*  N E X T % P G
*        GET NEXT PAGETBL BIT
*
*        INPUT:   X2 HAS # BITS REMAINING IN CURRENT PAGETBL WORD
*                 X1 HAS INDEX TO CURRENT PAGETBL WORD
*                 X4 HAS PARTIAL PAGETBL WORD
*
*        OUTPUT:  X4 AND COMPARITOR HAVE NEXT PAGETBL BIT
*                 RETURN TO CALL+1 IF END-OF-PAGETBL;  ELSE TO CALL+2
*
         DO       SYS=BPMUTS
NEXT%PG  RES      0
         BDR,X2   NXT%PG1           DEC. PG COUNT.  BRIF MORE PAGES
*
         BIR,X1   NXT%PG2           BUMP PAGETBL INDEX AND BRANCH
*
         EXIT     RL                END-OF-PAGETBL EXIT
*
NXT%PG2  RES      0
         LW,X5    PAGETBL+4,X1      NEXT PAGETBL WORD
         LI,X2    32                PAGE COUNT FOR THIS WORD
NXT%PG1  RES      0
         SLD,X4   1                 NEXT PAGE-USED BIT -> X4
         AND,X4   =1                SET COMPARITOR
         B        1,RL              NORMAL EXIT
*
         FIN
         PAGE
*
*   H E X E D I T
*        THIS ROUTINE CONVERTS A NUMBER TO HEXADECIMAL AND STORES IT
*          IN THE LIST BUFFER
*
*        INPUT:   NUMBER OF DIGITS TO STORE IS IN REGISTER AM
*                 INDEX TO LEFT-MOST CHAR POSITION OF LIST BUFFER IS
*                   IN REGISTER XT1
*                 NUMBER TO CONVERT IS LEFT-ADJUSTED IN REGISTER X3
*
*        OUTPUT:  REGISTER AM IS ZERO
*                 REGISTER XT1 IS INDEX TO NEXT CHAR POSITION OF LIST
*                   BUFFER TO BE STORED
*
HEXEDIT  RES      0
         LI,X2    0                 SHIFT HIGH ORDER HEX DIGIT
         SLD,X2   4                   TO LOW ORDER OF REGISTER X2
         LB,X2    HEXTABLE,X2       CONVERT IT TO A HEX CHARACTER
         STB,X2   LSTBF,XT1           AND STORE IT IN LIST BUFFER
         AI,XT1   1                 INCREMENT INDEX TO LIST BUFFER
         BDR,AM   HEXEDIT           CONTINUE UNTIL ALL DIGITS CONVERTED
         EXIT     RL
*
HEXTABLE TEXT     '0123456789ABCDEF'  TABLE OF HEX CHARACTERS
         PAGE
*
*
*   P R I N T
*        PRINT THE CONTENTS OF LIST BUFFER ON 'LO' AND 'DO' FILES
*
*        INPUT:   REGISTER XT1 CONTAINS THE NUMBER OF BYTES IN LIST
*                   BUFFER
*
*        USES REGISTER
*                 AM, IOADD, IOSIZE, IORL.
*
PRINT    RES      0
         STW,RL   AM
         LI,IOADD LSTBF             ADDRESS OF LIST BUFFER
         LW,IOSIZE XT1              NUMBER OF BYTES TO OUTPUT
         BAL,IORL WRITELO           WRITE ON 'LO' FILE
         BAL,IORL WRITEDO           WRITE ON 'DO' FILE
         EXIT     AM
         PAGE
*
*   S N A P R I N T
*        PRINT THE CONTENTS OF LIST BUFFER ON 'LO' AND/OR 'DO'
*          IF THEY ARE NOT ASSIGNED TO A TERMINAL
*
*        INPUT:   REGISTER XT1 CONTAINS THE NUMBER OF BYTES IN LIST
*                   BUFFER
*
*        USES REGISTER
*                 IOADD, IOSIZE, IORL
*
SNAPRINT RES      0
         LI,IOADD LSTBF             ADDRESS OF LIST BUFFER
         LW,IOSIZE XT1              NUMBER OF BYTES TO OUTPUT
         DO       SYS=BPMUTS
         MTW,0    LO%ONLINE         BRANCH IF 'LO' IS ASSIGNED TO A
         BNEZ     SNAPRT1             TERMINAL
         FIN
         STD,X6   X2
         BAL,IORL WRITELO           WRITE ON 'LO'
         LD,X6    X2
SNAPRT1  RES      0
         DO       SYS=BPMUTS
         MTW,0    DO%ONLINE         EXIT IF 'DO' IS ASSIGNED TO A
         EXIT,NE  RL                  TERMINAL
         FIN
         BAL,IORL WRITEDO           WRITE ON 'DO'
         EXIT     RL
         END